Export: support stopping exports (#51769)

This commit is contained in:
Ryan McKinley
2022-07-07 11:02:01 -07:00
committed by GitHub
parent 8deb17fdc4
commit 5cb8010440
16 changed files with 385 additions and 139 deletions
+35 -16
View File
@@ -29,6 +29,7 @@ type gitExportJob struct {
status ExportStatus
cfg ExportConfig
broadcaster statusBroadcaster
helper *commitHelper
}
type simpleExporter = func(helper *commitHelper, job *gitExportJob) error
@@ -69,6 +70,10 @@ func (e *gitExportJob) getConfig() ExportConfig {
return e.cfg
}
func (e *gitExportJob) requestStop() {
e.helper.stopRequested = true // will error on the next write
}
// Utility function to export dashboards
func (e *gitExportJob) start() {
defer func() {
@@ -119,16 +124,21 @@ func (e *gitExportJob) doExportWithHistory() error {
if err != nil {
return err
}
helper := &commitHelper{
e.helper = &commitHelper{
repo: r,
work: w,
ctx: context.Background(),
workDir: e.rootDir,
orgDir: e.rootDir,
broadcast: func(p string) {
e.status.Last = p[len(e.rootDir):]
e.status.Changed = time.Now().UnixMilli()
e.broadcaster(e.status)
},
}
cmd := &models.SearchOrgsQuery{}
err = e.sql.SearchOrgs(helper.ctx, cmd)
err = e.sql.SearchOrgs(e.helper.ctx, cmd)
if err != nil {
return err
}
@@ -136,14 +146,14 @@ func (e *gitExportJob) doExportWithHistory() error {
// Export each org
for _, org := range cmd.Result {
if len(cmd.Result) > 1 {
helper.orgDir = path.Join(e.rootDir, fmt.Sprintf("org_%d", org.Id))
e.helper.orgDir = path.Join(e.rootDir, fmt.Sprintf("org_%d", org.Id))
}
err = helper.initOrg(e.sql, org.Id)
err = e.helper.initOrg(e.sql, org.Id)
if err != nil {
return err
}
err = e.doOrgExportWithHistory(helper)
err = e.doOrgExportWithHistory(e.helper)
if err != nil {
return err
}
@@ -161,29 +171,38 @@ func (e *gitExportJob) doExportWithHistory() error {
}
func (e *gitExportJob) doOrgExportWithHistory(helper *commitHelper) error {
lookup, err := exportDataSources(helper, e)
include := e.cfg.Include
lookup, err := exportDataSources(helper, e, include.DS)
if err != nil {
return err
}
if true {
if include.Dash {
err = exportDashboards(helper, e, lookup)
if err != nil {
return err
}
}
// Run all the simple exporters
exporters := []simpleExporter{
dumpAuthTables,
exportSystemPreferences,
exportSystemStars,
exportSystemPlaylists,
exportAnnotations,
exporters := []simpleExporter{}
if include.Auth {
exporters = append(exporters, dumpAuthTables)
}
// This needs a real admin user to use the interfaces (and decrypt)
if false {
if include.Services {
exporters = append(exporters, exportFiles,
exportSystemPreferences,
exportSystemStars,
exportSystemPlaylists,
exportKVStore,
exportLive)
}
if include.Anno {
exporters = append(exporters, exportAnnotations)
}
if include.Snapshots {
exporters = append(exporters, exportSnapshots)
}