Refactor; simplify function responsibilities
parent
3518074d7d
commit
2184aecf86
|
@ -50,15 +50,23 @@ func (s *BuildStore) Update(ctx context.Context, build chronograf.BuildInfo) err
|
|||
return nil
|
||||
}
|
||||
|
||||
// Migrate simply stores the current version in the database
|
||||
func (s *BuildStore) Migrate(ctx context.Context, build chronograf.BuildInfo) error {
|
||||
return s.Update(ctx, build)
|
||||
}
|
||||
|
||||
// get retrieves the current build, falling back to a default when missing
|
||||
func (s *BuildStore) get(ctx context.Context, tx *bolt.Tx) (chronograf.BuildInfo, error) {
|
||||
var build chronograf.BuildInfo
|
||||
if v := tx.Bucket(BuildBucket).Get(BuildKey); v == nil {
|
||||
build = chronograf.BuildInfo{
|
||||
Version: "pre-1.4.0.0",
|
||||
Commit: "",
|
||||
}
|
||||
return build, nil
|
||||
defaultBuild := chronograf.BuildInfo{
|
||||
Version: "pre-1.4.0.0",
|
||||
Commit: "",
|
||||
}
|
||||
|
||||
if bucket := tx.Bucket(BuildBucket); bucket == nil {
|
||||
return defaultBuild, nil
|
||||
} else if v := bucket.Get(BuildKey); v == nil {
|
||||
return defaultBuild, nil
|
||||
} else if err := internal.UnmarshalBuild(v, &build); err != nil {
|
||||
return build, err
|
||||
}
|
||||
|
|
|
@ -65,6 +65,10 @@ func (c *Client) Open(ctx context.Context) error {
|
|||
}
|
||||
c.db = db
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) Initialize(ctx context.Context) error {
|
||||
if err := c.db.Update(func(tx *bolt.Tx) error {
|
||||
// Always create Organizations bucket.
|
||||
if _, err := tx.CreateBucketIfNotExists(OrganizationsBucket); err != nil {
|
||||
|
@ -107,7 +111,7 @@ func (c *Client) Open(ctx context.Context) error {
|
|||
}
|
||||
|
||||
// Migrate moves data from an old schema to a new schema in each Store
|
||||
func (c *Client) Migrate(ctx context.Context) error {
|
||||
func (c *Client) Migrate(ctx context.Context, build chronograf.BuildInfo) error {
|
||||
if c.db != nil {
|
||||
// Runtime migrations
|
||||
if err := c.OrganizationsStore.Migrate(ctx); err != nil {
|
||||
|
@ -128,6 +132,9 @@ func (c *Client) Migrate(ctx context.Context) error {
|
|||
if err := c.ConfigStore.Migrate(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := c.BuildStore.Migrate(ctx, build); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -140,6 +147,34 @@ func (c *Client) Close() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) Copy(ctx context.Context, version string) error {
|
||||
fromFile, err := os.Open(c.Path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer fromFile.Close()
|
||||
|
||||
backupDir := path.Join(path.Dir(c.Path), "backup")
|
||||
_ = os.Mkdir(backupDir, 0700)
|
||||
|
||||
toName := fmt.Sprintf("%s.%s", path.Base(c.Path), version)
|
||||
toPath := path.Join(backupDir, toName)
|
||||
toFile, err := os.OpenFile(toPath, os.O_RDWR|os.O_CREATE, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer toFile.Close()
|
||||
|
||||
_, err = io.Copy(toFile, fromFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("Successfully created %s", toPath)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Makes a copy of the database to the backup/ directory, if necessary:
|
||||
// - If this is a fresh install, don't create a backup and store the current version
|
||||
// - If we are on the same version, don't create a backup
|
||||
|
@ -149,46 +184,22 @@ func (c *Client) Backup(ctx context.Context, build chronograf.BuildInfo) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if c.isNew {
|
||||
if err = c.BuildStore.Update(ctx, build); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if lastBuild.Version == build.Version {
|
||||
return nil
|
||||
}
|
||||
if c.isNew {
|
||||
return nil
|
||||
}
|
||||
|
||||
// The database was pre-existing, and the version has changed
|
||||
// and so create a backup
|
||||
|
||||
log.Printf("Moving from version " + lastBuild.Version)
|
||||
log.Printf("Moving to version " + build.Version)
|
||||
|
||||
from, err := os.Open(c.Path)
|
||||
if err != nil {
|
||||
if err = c.Copy(ctx, lastBuild.Version); err != nil {
|
||||
return err
|
||||
}
|
||||
defer from.Close()
|
||||
|
||||
backupDir := path.Join(path.Dir(c.Path), "backup")
|
||||
_ = os.Mkdir(backupDir, 0700)
|
||||
|
||||
toName := fmt.Sprintf("%s.%s", path.Base(c.Path), lastBuild.Version)
|
||||
toPath := path.Join(backupDir, toName)
|
||||
to, err := os.OpenFile(toPath, os.O_RDWR|os.O_CREATE, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer to.Close()
|
||||
|
||||
_, err = io.Copy(to, from)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = c.BuildStore.Update(ctx, build); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("Successfully created %s", toPath)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -408,7 +408,14 @@ func openService(ctx context.Context, s *Server, lBuilder LayoutBuilder, sBuilde
|
|||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err := db.Migrate(ctx); err != nil {
|
||||
if err := db.Initialize(ctx); err != nil {
|
||||
logger.
|
||||
WithField("component", "boltstore").
|
||||
Error("Unable to boot boltdb: ", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err := db.Migrate(ctx, s.BuildInfo); err != nil {
|
||||
logger.
|
||||
WithField("component", "boltstore").
|
||||
Error("Unable to migrate data in boltdb: ", err)
|
||||
|
|
Loading…
Reference in New Issue