From fa1b92a12ba3780f6e3de49e974ab2ce6ef70cdd Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Wed, 14 Feb 2018 15:28:30 +0100 Subject: [PATCH] provisioning: uses unix epoch timestamps. (#10907) * provisioning: uses unix epoch timestamps. --- pkg/models/dashboards.go | 2 +- .../provisioning/dashboards/file_reader.go | 4 +-- .../sqlstore/dashboard_provisioning.go | 4 +-- .../sqlstore/dashboard_provisioning_test.go | 4 +-- pkg/services/sqlstore/migrations/common.go | 20 ++++++++++++++ .../sqlstore/migrations/dashboard_mig.go | 26 ++++++++++++++++++- 6 files changed, 52 insertions(+), 8 deletions(-) diff --git a/pkg/models/dashboards.go b/pkg/models/dashboards.go index 9809fdab9eb..f5c06fc3432 100644 --- a/pkg/models/dashboards.go +++ b/pkg/models/dashboards.go @@ -229,7 +229,7 @@ type DashboardProvisioning struct { DashboardId int64 Name string ExternalId string - Updated time.Time + Updated int64 } type SaveProvisionedDashboardCommand struct { diff --git a/pkg/services/provisioning/dashboards/file_reader.go b/pkg/services/provisioning/dashboards/file_reader.go index c909878999e..8244b0ae411 100644 --- a/pkg/services/provisioning/dashboards/file_reader.go +++ b/pkg/services/provisioning/dashboards/file_reader.go @@ -147,7 +147,7 @@ func (fr *fileReader) saveDashboard(path string, folderId int64, fileInfo os.Fil } provisionedData, alreadyProvisioned := provisionedDashboardRefs[path] - upToDate := alreadyProvisioned && provisionedData.Updated.Unix() == resolvedFileInfo.ModTime().Unix() + upToDate := alreadyProvisioned && provisionedData.Updated == resolvedFileInfo.ModTime().Unix() dash, err := fr.readDashboardFromFile(path, resolvedFileInfo.ModTime(), folderId) if err != nil { @@ -173,7 +173,7 @@ func (fr *fileReader) saveDashboard(path string, folderId int64, fileInfo os.Fil } fr.log.Debug("saving new dashboard", "file", path) - dp := &models.DashboardProvisioning{ExternalId: path, Name: fr.Cfg.Name, Updated: resolvedFileInfo.ModTime()} + dp := &models.DashboardProvisioning{ExternalId: path, Name: fr.Cfg.Name, Updated: resolvedFileInfo.ModTime().Unix()} _, err = fr.dashboardRepo.SaveProvisionedDashboard(dash, dp) return provisioningMetadata, err } diff --git a/pkg/services/sqlstore/dashboard_provisioning.go b/pkg/services/sqlstore/dashboard_provisioning.go index 54068334b4b..69409c3b873 100644 --- a/pkg/services/sqlstore/dashboard_provisioning.go +++ b/pkg/services/sqlstore/dashboard_provisioning.go @@ -26,8 +26,8 @@ func SaveProvisionedDashboard(cmd *models.SaveProvisionedDashboardCommand) error } cmd.Result = cmd.DashboardCmd.Result - if cmd.DashboardProvisioning.Updated.IsZero() { - cmd.DashboardProvisioning.Updated = cmd.Result.Updated + if cmd.DashboardProvisioning.Updated == 0 { + cmd.DashboardProvisioning.Updated = cmd.Result.Updated.Unix() } return saveProvionedData(sess, cmd.DashboardProvisioning, cmd.Result) diff --git a/pkg/services/sqlstore/dashboard_provisioning_test.go b/pkg/services/sqlstore/dashboard_provisioning_test.go index 8b2ed7ff061..b752173b67d 100644 --- a/pkg/services/sqlstore/dashboard_provisioning_test.go +++ b/pkg/services/sqlstore/dashboard_provisioning_test.go @@ -31,7 +31,7 @@ func TestDashboardProvisioningTest(t *testing.T) { DashboardProvisioning: &models.DashboardProvisioning{ Name: "default", ExternalId: "/var/grafana.json", - Updated: now, + Updated: now.Unix(), }, } @@ -48,7 +48,7 @@ func TestDashboardProvisioningTest(t *testing.T) { So(len(query.Result), ShouldEqual, 1) So(query.Result[0].DashboardId, ShouldEqual, dashId) - So(query.Result[0].Updated.Unix(), ShouldEqual, now.Unix()) + So(query.Result[0].Updated, ShouldEqual, now.Unix()) }) }) }) diff --git a/pkg/services/sqlstore/migrations/common.go b/pkg/services/sqlstore/migrations/common.go index cf0b39f1a35..bafb8292fd9 100644 --- a/pkg/services/sqlstore/migrations/common.go +++ b/pkg/services/sqlstore/migrations/common.go @@ -24,3 +24,23 @@ func addTableRenameMigration(mg *Migrator, oldName string, newName string, versi migrationId := fmt.Sprintf("Rename table %s to %s - %s", oldName, newName, versionSuffix) mg.AddMigration(migrationId, NewRenameTableMigration(oldName, newName)) } + +func addTableReplaceMigrations(mg *Migrator, from Table, to Table, migrationVersion int64, tableDataMigration map[string]string) { + fromV := version(migrationVersion - 1) + toV := version(migrationVersion) + tmpTableName := to.Name + "_tmp_qwerty" + + createTable := fmt.Sprintf("create %v %v", to.Name, toV) + copyTableData := fmt.Sprintf("copy %v %v to %v", to.Name, fromV, toV) + dropTable := fmt.Sprintf("drop %v", tmpTableName) + + addTableRenameMigration(mg, from.Name, tmpTableName, fromV) + mg.AddMigration(createTable, NewAddTableMigration(to)) + addTableIndicesMigrations(mg, toV, to) + mg.AddMigration(copyTableData, NewCopyTableDataMigration(to.Name, tmpTableName, tableDataMigration)) + mg.AddMigration(dropTable, NewDropTableMigration(tmpTableName)) +} + +func version(v int64) string { + return fmt.Sprintf("v%v", v) +} diff --git a/pkg/services/sqlstore/migrations/dashboard_mig.go b/pkg/services/sqlstore/migrations/dashboard_mig.go index 1c40e241e15..df561041b7c 100644 --- a/pkg/services/sqlstore/migrations/dashboard_mig.go +++ b/pkg/services/sqlstore/migrations/dashboard_mig.go @@ -1,6 +1,8 @@ package migrations -import . "github.com/grafana/grafana/pkg/services/sqlstore/migrator" +import ( + . "github.com/grafana/grafana/pkg/services/sqlstore/migrator" +) func addDashboardMigration(mg *Migrator) { var dashboardV1 = Table{ @@ -192,4 +194,26 @@ func addDashboardMigration(mg *Migrator) { } mg.AddMigration("create dashboard_provisioning", NewAddTableMigration(dashboardExtrasTable)) + + dashboardExtrasTableV2 := Table{ + Name: "dashboard_provisioning", + Columns: []*Column{ + {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, + {Name: "dashboard_id", Type: DB_BigInt, Nullable: true}, + {Name: "name", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "external_id", Type: DB_Text, Nullable: false}, + {Name: "updated", Type: DB_Int, Default: "0", Nullable: false}, + }, + Indices: []*Index{ + {Cols: []string{"dashboard_id"}}, + {Cols: []string{"dashboard_id", "name"}, Type: IndexType}, + }, + } + + addTableReplaceMigrations(mg, dashboardExtrasTable, dashboardExtrasTableV2, 2, map[string]string{ + "id": "id", + "dashboard_id": "dashboard_id", + "name": "name", + "external_id": "external_id", + }) }