include a migration for multi-network state directories

This commit is contained in:
Brian Picciano 2024-09-10 21:02:07 +02:00
parent 6d99fb5368
commit c022c97b19
2 changed files with 98 additions and 1 deletions

View File

@ -78,11 +78,23 @@ func New(
) ( ) (
*Daemon, error, *Daemon, error,
) { ) {
opts = opts.withDefaults()
if err := migrateToMultiNetworkStateDirectory(
ctx,
logger.WithNamespace("migration-multi-network-state-dir"),
opts.EnvVars,
); err != nil {
return nil, fmt.Errorf(
"migrating to multi-network state directory: %w", err,
)
}
d := &Daemon{ d := &Daemon{
logger: logger, logger: logger,
daemonConfig: daemonConfig, daemonConfig: daemonConfig,
envBinDirPath: envBinDirPath, envBinDirPath: envBinDirPath,
opts: opts.withDefaults(), opts: opts,
} }
{ {

85
go/daemon/migrations.go Normal file
View File

@ -0,0 +1,85 @@
package daemon
import (
"context"
"errors"
"fmt"
"io/fs"
"isle/daemon/daecommon"
"isle/jsonutil"
"os"
"path/filepath"
"dev.mediocregopher.com/mediocre-go-lib.git/mctx"
"dev.mediocregopher.com/mediocre-go-lib.git/mlog"
)
func migrateToMultiNetworkStateDirectory(
ctx context.Context, logger *mlog.Logger, envVars daecommon.EnvVars,
) error {
var (
legacyBootstrapPath = filepath.Join(
envVars.StateDir.Path, "bootstrap.json",
)
legacySecretsPath = filepath.Join(envVars.StateDir.Path, "secrets")
)
if _, err := os.Stat(legacyBootstrapPath); errors.Is(err, fs.ErrNotExist) {
return nil // no bootstrap in the legacy path
} else if err != nil {
return fmt.Errorf("checking file %q: %w", legacyBootstrapPath, err)
}
var bootstrapBody struct {
NetworkCreationParams struct {
ID string
}
}
if err := jsonutil.LoadFile(
&bootstrapBody, legacyBootstrapPath,
); err != nil {
return fmt.Errorf(
"loading bootstrap from %q: %w", legacyBootstrapPath, err,
)
}
var (
networkStateDirPath = filepath.Join(
envVars.StateDir.Path,
"networks",
bootstrapBody.NetworkCreationParams.ID,
)
newBootstrapPath = filepath.Join(networkStateDirPath, "bootstrap.json")
newSecretsPath = filepath.Join(networkStateDirPath, "secrets")
)
ctx = mctx.Annotate(
ctx,
"legacyBootstrapPath", legacyBootstrapPath,
"legacySecretsPath", legacySecretsPath,
"newBootstrapPath", newBootstrapPath,
"newSecretsPath", newSecretsPath,
)
logger.Info(ctx, "Migrating to multi-network state directory layout")
if err := os.MkdirAll(networkStateDirPath, 0700); err != nil {
return fmt.Errorf("creating %q: %w", networkStateDirPath, err)
}
if err := os.Rename(legacyBootstrapPath, newBootstrapPath); err != nil {
return fmt.Errorf(
"renaming %q to %q: %w", legacyBootstrapPath, newBootstrapPath, err,
)
}
if err := os.Rename(legacySecretsPath, newSecretsPath); err != nil {
return fmt.Errorf(
"renaming %q to %q: %w", legacySecretsPath, newSecretsPath, err,
)
}
return nil
}