/* Copyright (c) Edgeless Systems GmbH SPDX-License-Identifier: AGPL-3.0-only */ package cmd import ( "fmt" "github.com/edgelesssys/constellation/v2/internal/config" "github.com/edgelesssys/constellation/v2/internal/config/migration" "github.com/edgelesssys/constellation/v2/internal/constants" "github.com/edgelesssys/constellation/v2/internal/file" "github.com/spf13/afero" "github.com/spf13/cobra" ) func newConfigMigrateCmd() *cobra.Command { cmd := &cobra.Command{ Use: "migrate", Short: "Migrate a configuration file to a new version", Long: "Migrate a configuration file to a new version.", Args: cobra.NoArgs, RunE: runConfigMigrate, } return cmd } func runConfigMigrate(cmd *cobra.Command, _ []string) error { handler := file.NewHandler(afero.NewOsFs()) return configMigrate(cmd, handler) } func configMigrate(cmd *cobra.Command, handler file.Handler) error { // Make sure we are reading a v3 config var cfgVersion struct { Version string `yaml:"version"` } if err := handler.ReadYAML(constants.ConfigFilename, &cfgVersion); err != nil { return err } switch cfgVersion.Version { case config.Version4: cmd.Printf("Config already at version %s, nothing to do\n", config.Version4) return nil case migration.Version3: if err := migration.V3ToV4(constants.ConfigFilename, handler); err != nil { return fmt.Errorf("migrating config: %w", err) } cmd.Printf("Successfully migrated config to %s\n", config.Version4) return nil default: return fmt.Errorf("cannot convert config version %s to %s", cfgVersion.Version, config.Version4) } }