spiegel_podman/cmd/podman/system/migrate.go
Paul Holzinger 51fbf3da9e
enable gocritic linter
The linter ensures a common code style.
- use switch/case instead of else if
- use if instead of switch/case for single case statement
- add space between comment and text
- detect the use of defer with os.Exit()
- use short form var += "..." instead of var = var + "..."
- detect problems with append()
```
newSlice := append(orgSlice, val)
```
  This could lead to nasty bugs because the orgSlice will be changed in
  place if it has enough capacity too hold the new elements. Thus we
  newSlice might not be a copy.

Of course most of the changes are just cosmetic and do not cause any
logic errors but I think it is a good idea to enforce a common style.
This should help maintainability.

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
2022-04-26 18:12:22 +02:00

79 lines
2.1 KiB
Go

//go:build !remote
// +build !remote
package system
import (
"fmt"
"os"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v4/cmd/podman/registry"
"github.com/containers/podman/v4/cmd/podman/validate"
"github.com/containers/podman/v4/libpod/define"
"github.com/containers/podman/v4/pkg/domain/entities"
"github.com/containers/podman/v4/pkg/domain/infra"
"github.com/spf13/cobra"
)
var (
migrateDescription = `
podman system migrate
Migrate existing containers to a new version of Podman.
`
migrateCommand = &cobra.Command{
Annotations: map[string]string{
registry.EngineMode: registry.ABIMode,
registry.NoMoveProcess: registry.NoMoveProcess,
},
Use: "migrate [options]",
Args: validate.NoArgs,
Short: "Migrate containers",
Long: migrateDescription,
Run: migrate,
ValidArgsFunction: completion.AutocompleteNone,
}
)
var (
migrateOptions entities.SystemMigrateOptions
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: migrateCommand,
Parent: systemCmd,
})
flags := migrateCommand.Flags()
newRuntimeFlagName := "new-runtime"
flags.StringVar(&migrateOptions.NewRuntime, newRuntimeFlagName, "", "Specify a new runtime for all containers")
_ = migrateCommand.RegisterFlagCompletionFunc(newRuntimeFlagName, completion.AutocompleteNone)
}
func migrate(cmd *cobra.Command, args []string) {
// Shutdown all running engines, `renumber` will hijack repository
registry.ContainerEngine().Shutdown(registry.Context())
registry.ImageEngine().Shutdown(registry.Context())
engine, err := infra.NewSystemEngine(entities.MigrateMode, registry.PodmanConfig())
if err != nil {
fmt.Println(err)
os.Exit(define.ExecErrorCodeGeneric)
}
defer engine.Shutdown(registry.Context())
err = engine.Migrate(registry.Context(), cmd.Flags(), registry.PodmanConfig(), migrateOptions)
if err != nil {
fmt.Println(err)
// FIXME change this to return the error like other commands
// defer will never run on os.Exit()
//nolint:gocritic
os.Exit(define.ExecErrorCodeGeneric)
}
os.Exit(0)
}