From 3af66d98ab45b804b5c03084a322328bb2abe66a Mon Sep 17 00:00:00 2001 From: Michael Desa Date: Tue, 7 Nov 2017 17:25:44 -0500 Subject: [PATCH] Migrate all orphaned resources to DefaultOrg When users upgrade, all of their bolt resources will not belong to any organization. This PR introduces a migration path where any orphaned, resources without an organization, will become owned by the default organization. --- bolt/client.go | 13 +++++++++++-- bolt/dashboards.go | 23 ++++++++++++++++++++++- bolt/layouts.go | 26 ++++++++++++++++++++++++++ bolt/servers.go | 26 ++++++++++++++++++++++++++ bolt/sources.go | 26 ++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 3 deletions(-) diff --git a/bolt/client.go b/bolt/client.go index 43eb06d100..8ae39cfd09 100644 --- a/bolt/client.go +++ b/bolt/client.go @@ -83,10 +83,19 @@ func (c *Client) Open(ctx context.Context) error { } // Runtime migrations - if err := c.DashboardsStore.Migrate(ctx); err != nil { + if err := c.OrganizationsStore.Migrate(ctx); err != nil { return err } - if err := c.OrganizationsStore.Migrate(ctx); err != nil { + if err := c.SourcesStore.Migrate(ctx); err != nil { + return err + } + if err := c.ServersStore.Migrate(ctx); err != nil { + return err + } + if err := c.LayoutsStore.Migrate(ctx); err != nil { + return err + } + if err := c.DashboardsStore.Migrate(ctx); err != nil { return err } diff --git a/bolt/dashboards.go b/bolt/dashboards.go index 43db3d0e07..bf756dad94 100644 --- a/bolt/dashboards.go +++ b/bolt/dashboards.go @@ -2,6 +2,7 @@ package bolt import ( "context" + "fmt" "strconv" "github.com/boltdb/bolt" @@ -54,7 +55,27 @@ func (d *DashboardsStore) Migrate(ctx context.Context) error { if err != nil { return err } - return d.AddIDs(ctx, boards) + if err := d.AddIDs(ctx, boards); err != nil { + return nil + } + + defaultOrg, err := d.client.OrganizationsStore.DefaultOrganization(ctx) + if err != nil { + return err + } + + defaultOrgID := fmt.Sprintf("%d", defaultOrg.ID) + + for _, board := range boards { + if board.Organization == "" { + board.Organization = defaultOrgID + if err := d.Update(ctx, board); err != nil { + return nil + } + } + } + + return nil } // All returns all known dashboards diff --git a/bolt/layouts.go b/bolt/layouts.go index 536b133745..e25197e632 100644 --- a/bolt/layouts.go +++ b/bolt/layouts.go @@ -2,6 +2,7 @@ package bolt import ( "context" + "fmt" "github.com/boltdb/bolt" "github.com/influxdata/chronograf" @@ -20,6 +21,31 @@ type LayoutsStore struct { IDs chronograf.ID } +func (s *LayoutsStore) Migrate(ctx context.Context) error { + layouts, err := s.All(ctx) + if err != nil { + return err + } + + defaultOrg, err := s.client.OrganizationsStore.DefaultOrganization(ctx) + if err != nil { + return err + } + + defaultOrgID := fmt.Sprintf("%d", defaultOrg.ID) + + for _, layout := range layouts { + if layout.Organization == "" { + layout.Organization = defaultOrgID + if err := s.Update(ctx, layout); err != nil { + return nil + } + } + } + + return nil +} + // All returns all known layouts func (s *LayoutsStore) All(ctx context.Context) ([]chronograf.Layout, error) { var srcs []chronograf.Layout diff --git a/bolt/servers.go b/bolt/servers.go index 3521c294fa..aef86045cc 100644 --- a/bolt/servers.go +++ b/bolt/servers.go @@ -2,6 +2,7 @@ package bolt import ( "context" + "fmt" "github.com/boltdb/bolt" "github.com/influxdata/chronograf" @@ -20,6 +21,31 @@ type ServersStore struct { client *Client } +func (s *ServersStore) Migrate(ctx context.Context) error { + servers, err := s.All(ctx) + if err != nil { + return err + } + + defaultOrg, err := s.client.OrganizationsStore.DefaultOrganization(ctx) + if err != nil { + return err + } + + defaultOrgID := fmt.Sprintf("%d", defaultOrg.ID) + + for _, server := range servers { + if server.Organization == "" { + server.Organization = defaultOrgID + if err := s.Update(ctx, server); err != nil { + return nil + } + } + } + + return nil +} + // All returns all known servers func (s *ServersStore) All(ctx context.Context) ([]chronograf.Server, error) { var srcs []chronograf.Server diff --git a/bolt/sources.go b/bolt/sources.go index a2809ff23d..72c5cf8d74 100644 --- a/bolt/sources.go +++ b/bolt/sources.go @@ -2,6 +2,7 @@ package bolt import ( "context" + "fmt" "github.com/boltdb/bolt" "github.com/influxdata/chronograf" @@ -19,6 +20,31 @@ type SourcesStore struct { client *Client } +func (s *SourcesStore) Migrate(ctx context.Context) error { + sources, err := s.All(ctx) + if err != nil { + return err + } + + defaultOrg, err := s.client.OrganizationsStore.DefaultOrganization(ctx) + if err != nil { + return err + } + + defaultOrgID := fmt.Sprintf("%d", defaultOrg.ID) + + for _, source := range sources { + if source.Organization == "" { + source.Organization = defaultOrgID + if err := s.Update(ctx, source); err != nil { + return nil + } + } + } + + return nil +} + // All returns all known sources func (s *SourcesStore) All(ctx context.Context) ([]chronograf.Source, error) { var srcs []chronograf.Source