automation-tests/cmd/podman/system/reset.go

107 lines
3.0 KiB
Go

//go:build !remote
package system
import (
"bufio"
"fmt"
"os"
"strings"
"github.com/containers/buildah/pkg/volumes"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v5/cmd/podman/registry"
"github.com/containers/podman/v5/cmd/podman/validate"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var (
systemResetDescription = `Reset podman storage back to default state
All containers will be stopped and removed, and all images, volumes, networks and container content will be removed.
This command does not restart podman.service and podman.socket systemd units. You may need to manually restart it after running this command.
`
systemResetCommand = &cobra.Command{
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
Use: "reset [options]",
Args: validate.NoArgs,
Short: "Reset podman storage",
Long: systemResetDescription,
Run: reset,
ValidArgsFunction: completion.AutocompleteNone,
}
forceFlag bool
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: systemResetCommand,
Parent: systemCmd,
})
flags := systemResetCommand.Flags()
flags.BoolVarP(&forceFlag, "force", "f", false, "Do not prompt for confirmation")
}
func reset(cmd *cobra.Command, args []string) {
// Get all the external containers in use
listCtn, err := registry.ContainerEngine().ContainerListExternal(registry.Context())
if err != nil {
logrus.Error(err)
}
// Prompt for confirmation if --force is not set
if !forceFlag {
reader := bufio.NewReader(os.Stdin)
fmt.Println(`WARNING! This will remove:
- all containers
- all pods
- all images
- all networks
- all build cache
- all machines
- all volumes`)
info, _ := registry.ContainerEngine().Info(registry.Context())
// lets not hard fail in case of an error
if info != nil {
fmt.Printf(" - the graphRoot directory: %q\n", info.Store.GraphRoot)
fmt.Printf(" - the runRoot directory: %q\n", info.Store.RunRoot)
}
if len(listCtn) > 0 {
fmt.Println(`WARNING! The following external containers will be purged:`)
// print first 12 characters of ID and first configured name alias
for _, externalCtn := range listCtn {
fmt.Printf(" - %s (%s)\n", externalCtn.ID[0:12], externalCtn.Names[0])
}
}
fmt.Print(`Are you sure you want to continue? [y/N] `)
answer, err := reader.ReadString('\n')
if err != nil {
logrus.Error(err)
os.Exit(1)
}
if strings.ToLower(answer)[0] != 'y' {
os.Exit(0)
}
}
// Clean build cache if any
if err := volumes.CleanCacheMount(); err != nil {
logrus.Error(err)
}
// ContainerEngine() is unusable and shut down after this.
if err := registry.ContainerEngine().Reset(registry.Context()); err != nil {
logrus.Error(err)
}
// Shutdown podman-machine and delete all machine files
if err := resetMachine(); err != nil {
logrus.Error(err)
}
os.Exit(0)
}