mirror of
https://github.com/containers/podman.git
synced 2025-06-28 06:18:57 +08:00
podman system reset removed machines incorrectly
podman system reset did not clean up machines fully, leaving some config files, and breaking machines. Now it removes all machines files fully. Signed-off-by: Ashley Cui <acui@redhat.com>
This commit is contained in:
@ -117,7 +117,7 @@ func initMachine(cmd *cobra.Command, args []string) error {
|
|||||||
vm machine.VM
|
vm machine.VM
|
||||||
)
|
)
|
||||||
|
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
initOpts.Name = defaultMachineName
|
initOpts.Name = defaultMachineName
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
if len(args[0]) > maxMachineNameSize {
|
if len(args[0]) > maxMachineNameSize {
|
||||||
|
@ -52,7 +52,7 @@ func inspect(cmd *cobra.Command, args []string) error {
|
|||||||
args = append(args, defaultMachineName)
|
args = append(args, defaultMachineName)
|
||||||
}
|
}
|
||||||
vms := make([]machine.InspectInfo, 0, len(args))
|
vms := make([]machine.InspectInfo, 0, len(args))
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
for _, vmName := range args {
|
for _, vmName := range args {
|
||||||
vm, err := provider.LoadVMByName(vmName)
|
vm, err := provider.LoadVMByName(vmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -85,7 +85,7 @@ func list(cmd *cobra.Command, args []string) error {
|
|||||||
listFlag.format = "{{.Name}}\n"
|
listFlag.format = "{{.Name}}\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
listResponse, err = provider.List(opts)
|
listResponse, err = provider.List(opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error listing vms")
|
return errors.Wrap(err, "error listing vms")
|
||||||
|
@ -51,7 +51,7 @@ func autocompleteMachine(cmd *cobra.Command, args []string, toComplete string) (
|
|||||||
|
|
||||||
func getMachines(toComplete string) ([]string, cobra.ShellCompDirective) {
|
func getMachines(toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||||
suggestions := []string{}
|
suggestions := []string{}
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
machines, err := provider.List(machine.ListOptions{})
|
machines, err := provider.List(machine.ListOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cobra.CompErrorln(err.Error())
|
cobra.CompErrorln(err.Error())
|
||||||
|
@ -8,6 +8,6 @@ import (
|
|||||||
"github.com/containers/podman/v4/pkg/machine/qemu"
|
"github.com/containers/podman/v4/pkg/machine/qemu"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getSystemDefaultProvider() machine.Provider {
|
func GetSystemDefaultProvider() machine.Provider {
|
||||||
return qemu.GetQemuProvider()
|
return qemu.GetQemuProvider()
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,6 @@ import (
|
|||||||
"github.com/containers/podman/v4/pkg/machine/wsl"
|
"github.com/containers/podman/v4/pkg/machine/wsl"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getSystemDefaultProvider() machine.Provider {
|
func GetSystemDefaultProvider() machine.Provider {
|
||||||
return wsl.GetWSLProvider()
|
return wsl.GetWSLProvider()
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ func rm(cmd *cobra.Command, args []string) error {
|
|||||||
vmName = args[0]
|
vmName = args[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
vm, err = provider.LoadVMByName(vmName)
|
vm, err = provider.LoadVMByName(vmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -83,7 +83,7 @@ func setMachine(cmd *cobra.Command, args []string) error {
|
|||||||
if len(args) > 0 && len(args[0]) > 0 {
|
if len(args) > 0 && len(args[0]) > 0 {
|
||||||
vmName = args[0]
|
vmName = args[0]
|
||||||
}
|
}
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
vm, err = provider.LoadVMByName(vmName)
|
vm, err = provider.LoadVMByName(vmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -51,7 +51,7 @@ func ssh(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
// Set the VM to default
|
// Set the VM to default
|
||||||
vmName := defaultMachineName
|
vmName := defaultMachineName
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
|
|
||||||
// If len is greater than 0, it means we may have been
|
// If len is greater than 0, it means we may have been
|
||||||
// provided the VM name. If so, we check. The VM name,
|
// provided the VM name. If so, we check. The VM name,
|
||||||
|
@ -41,7 +41,7 @@ func start(cmd *cobra.Command, args []string) error {
|
|||||||
vmName = args[0]
|
vmName = args[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
vm, err = provider.LoadVMByName(vmName)
|
vm, err = provider.LoadVMByName(vmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -40,7 +40,7 @@ func stop(cmd *cobra.Command, args []string) error {
|
|||||||
if len(args) > 0 && len(args[0]) > 0 {
|
if len(args) > 0 && len(args[0]) > 0 {
|
||||||
vmName = args[0]
|
vmName = args[0]
|
||||||
}
|
}
|
||||||
provider := getSystemDefaultProvider()
|
provider := GetSystemDefaultProvider()
|
||||||
vm, err = provider.LoadVMByName(vmName)
|
vm, err = provider.LoadVMByName(vmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -61,7 +61,9 @@ func reset(cmd *cobra.Command, args []string) {
|
|||||||
- all pods
|
- all pods
|
||||||
- all images
|
- all images
|
||||||
- all networks
|
- all networks
|
||||||
- all build cache`)
|
- all build cache
|
||||||
|
- all machines`)
|
||||||
|
|
||||||
if len(listCtn) > 0 {
|
if len(listCtn) > 0 {
|
||||||
fmt.Println(`WARNING! The following external containers will be purged:`)
|
fmt.Println(`WARNING! The following external containers will be purged:`)
|
||||||
// print first 12 characters of ID and first configured name alias
|
// print first 12 characters of ID and first configured name alias
|
||||||
@ -103,5 +105,11 @@ func reset(cmd *cobra.Command, args []string) {
|
|||||||
//nolint:gocritic
|
//nolint:gocritic
|
||||||
os.Exit(define.ExecErrorCodeGeneric)
|
os.Exit(define.ExecErrorCodeGeneric)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shutdown podman-machine and delete all machine files
|
||||||
|
if err := resetMachine(); err != nil {
|
||||||
|
logrus.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
13
cmd/podman/system/reset_machine.go
Normal file
13
cmd/podman/system/reset_machine.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
//go:build (amd64 && !remote) || (arm64 && !remote)
|
||||||
|
// +build amd64,!remote arm64,!remote
|
||||||
|
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
cmdMach "github.com/containers/podman/v4/cmd/podman/machine"
|
||||||
|
)
|
||||||
|
|
||||||
|
func resetMachine() error {
|
||||||
|
provider := cmdMach.GetSystemDefaultProvider()
|
||||||
|
return provider.RemoveAndCleanMachines()
|
||||||
|
}
|
8
cmd/podman/system/reset_machine_unsupported.go
Normal file
8
cmd/podman/system/reset_machine_unsupported.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//go:build !amd64 && !arm64
|
||||||
|
// +build !amd64,!arm64
|
||||||
|
|
||||||
|
package system
|
||||||
|
|
||||||
|
func resetMachine() error {
|
||||||
|
return nil
|
||||||
|
}
|
@ -7,7 +7,7 @@ podman\-system\-reset - Reset storage back to initial state
|
|||||||
**podman system reset** [*options*]
|
**podman system reset** [*options*]
|
||||||
|
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
**podman system reset** removes all pods, containers, images, networks and volumes.
|
**podman system reset** removes all pods, containers, images, networks and volumes, and machines.
|
||||||
|
|
||||||
This command must be run **before** changing any of the following fields in the
|
This command must be run **before** changing any of the following fields in the
|
||||||
`containers.conf` or `storage.conf` files: `driver`, `static_dir`, `tmp_dir`
|
`containers.conf` or `storage.conf` files: `driver`, `static_dir`, `tmp_dir`
|
||||||
@ -36,6 +36,7 @@ WARNING! This will remove:
|
|||||||
- all images
|
- all images
|
||||||
- all networks
|
- all networks
|
||||||
- all build cache
|
- all build cache
|
||||||
|
- all machines
|
||||||
Are you sure you want to continue? [y/N] y
|
Are you sure you want to continue? [y/N] y
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ type Provider interface {
|
|||||||
List(opts ListOptions) ([]*ListResponse, error)
|
List(opts ListOptions) ([]*ListResponse, error)
|
||||||
IsValidVMName(name string) (bool, error)
|
IsValidVMName(name string) (bool, error)
|
||||||
CheckExclusiveActiveVM() (bool, string, error)
|
CheckExclusiveActiveVM() (bool, string, error)
|
||||||
|
RemoveAndCleanMachines() error
|
||||||
}
|
}
|
||||||
|
|
||||||
type RemoteConnectionType string
|
type RemoteConnectionType string
|
||||||
@ -170,11 +171,11 @@ func (rc RemoteConnectionType) MakeSSHURL(host, path, port, userName string) url
|
|||||||
// GetDataDir returns the filepath where vm images should
|
// GetDataDir returns the filepath where vm images should
|
||||||
// live for podman-machine.
|
// live for podman-machine.
|
||||||
func GetDataDir(vmType string) (string, error) {
|
func GetDataDir(vmType string) (string, error) {
|
||||||
data, err := homedir.GetDataHome()
|
dataDirPrefix, err := DataDirPrefix()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
dataDir := filepath.Join(data, "containers", "podman", "machine", vmType)
|
dataDir := filepath.Join(dataDirPrefix, vmType)
|
||||||
if _, err := os.Stat(dataDir); !os.IsNotExist(err) {
|
if _, err := os.Stat(dataDir); !os.IsNotExist(err) {
|
||||||
return dataDir, nil
|
return dataDir, nil
|
||||||
}
|
}
|
||||||
@ -182,14 +183,24 @@ func GetDataDir(vmType string) (string, error) {
|
|||||||
return dataDir, mkdirErr
|
return dataDir, mkdirErr
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetConfigDir returns the filepath to where configuration
|
// DataDirPrefix returns the path prefix for all machine data files
|
||||||
// files for podman-machine should live
|
func DataDirPrefix() (string, error) {
|
||||||
func GetConfDir(vmType string) (string, error) {
|
data, err := homedir.GetDataHome()
|
||||||
conf, err := homedir.GetConfigHome()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
confDir := filepath.Join(conf, "containers", "podman", "machine", vmType)
|
dataDir := filepath.Join(data, "containers", "podman", "machine")
|
||||||
|
return dataDir, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetConfigDir returns the filepath to where configuration
|
||||||
|
// files for podman-machine should live
|
||||||
|
func GetConfDir(vmType string) (string, error) {
|
||||||
|
confDirPrefix, err := ConfDirPrefix()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
confDir := filepath.Join(confDirPrefix, vmType)
|
||||||
if _, err := os.Stat(confDir); !os.IsNotExist(err) {
|
if _, err := os.Stat(confDir); !os.IsNotExist(err) {
|
||||||
return confDir, nil
|
return confDir, nil
|
||||||
}
|
}
|
||||||
@ -197,6 +208,16 @@ func GetConfDir(vmType string) (string, error) {
|
|||||||
return confDir, mkdirErr
|
return confDir, mkdirErr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConfDirPrefix returns the path prefix for all machine config files
|
||||||
|
func ConfDirPrefix() (string, error) {
|
||||||
|
conf, err := homedir.GetConfigHome()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
confDir := filepath.Join(conf, "containers", "podman", "machine")
|
||||||
|
return confDir, nil
|
||||||
|
}
|
||||||
|
|
||||||
// ResourceConfig describes physical attributes of the machine
|
// ResourceConfig describes physical attributes of the machine
|
||||||
type ResourceConfig struct {
|
type ResourceConfig struct {
|
||||||
// CPUs to be assigned to the VM
|
// CPUs to be assigned to the VM
|
||||||
|
@ -1543,3 +1543,79 @@ func (v *MachineVM) editCmdLine(flag string, value string) {
|
|||||||
v.CmdLine = append(v.CmdLine, []string{flag, value}...)
|
v.CmdLine = append(v.CmdLine, []string{flag, value}...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveAndCleanMachines removes all machine and cleans up any other files associatied with podman machine
|
||||||
|
func (p *Provider) RemoveAndCleanMachines() error {
|
||||||
|
var (
|
||||||
|
vm machine.VM
|
||||||
|
listResponse []*machine.ListResponse
|
||||||
|
opts machine.ListOptions
|
||||||
|
destroyOptions machine.RemoveOptions
|
||||||
|
)
|
||||||
|
destroyOptions.Force = true
|
||||||
|
var prevErr error
|
||||||
|
|
||||||
|
listResponse, err := p.List(opts)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, mach := range listResponse {
|
||||||
|
vm, err = p.LoadVMByName(mach.Name)
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
}
|
||||||
|
_, remove, err := vm.Remove(mach.Name, destroyOptions)
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
} else {
|
||||||
|
if err := remove(); err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean leftover files in data dir
|
||||||
|
dataDir, err := machine.DataDirPrefix()
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
} else {
|
||||||
|
err := os.RemoveAll(dataDir)
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean leftover files in conf dir
|
||||||
|
confDir, err := machine.ConfDirPrefix()
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
} else {
|
||||||
|
err := os.RemoveAll(confDir)
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return prevErr
|
||||||
|
}
|
||||||
|
@ -1442,3 +1442,79 @@ func (v *MachineVM) getResources() (resources machine.ResourceConfig) {
|
|||||||
resources.DiskSize = getDiskSize(v)
|
resources.DiskSize = getDiskSize(v)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveAndCleanMachines removes all machine and cleans up any other files associatied with podman machine
|
||||||
|
func (p *Provider) RemoveAndCleanMachines() error {
|
||||||
|
var (
|
||||||
|
vm machine.VM
|
||||||
|
listResponse []*machine.ListResponse
|
||||||
|
opts machine.ListOptions
|
||||||
|
destroyOptions machine.RemoveOptions
|
||||||
|
)
|
||||||
|
destroyOptions.Force = true
|
||||||
|
var prevErr error
|
||||||
|
|
||||||
|
listResponse, err := p.List(opts)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, mach := range listResponse {
|
||||||
|
vm, err = p.LoadVMByName(mach.Name)
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
}
|
||||||
|
_, remove, err := vm.Remove(mach.Name, destroyOptions)
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
} else {
|
||||||
|
if err := remove(); err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean leftover files in data dir
|
||||||
|
dataDir, err := machine.DataDirPrefix()
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
} else {
|
||||||
|
err := os.RemoveAll(dataDir)
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean leftover files in conf dir
|
||||||
|
confDir, err := machine.ConfDirPrefix()
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
} else {
|
||||||
|
err := os.RemoveAll(confDir)
|
||||||
|
if err != nil {
|
||||||
|
if prevErr != nil {
|
||||||
|
logrus.Error(prevErr)
|
||||||
|
}
|
||||||
|
prevErr = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return prevErr
|
||||||
|
}
|
||||||
|
@ -89,5 +89,12 @@ var _ = Describe("podman system reset", func() {
|
|||||||
Expect(session).Should(Exit(0))
|
Expect(session).Should(Exit(0))
|
||||||
// default network should exists
|
// default network should exists
|
||||||
Expect(session.OutputToStringArray()).To(HaveLen(1))
|
Expect(session.OutputToStringArray()).To(HaveLen(1))
|
||||||
|
|
||||||
|
// TODO: machine tests currently don't run outside of the machine test pkg
|
||||||
|
// no machines are created here to cleanup
|
||||||
|
session = podmanTest.Podman([]string{"machine", "list", "-q"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session).Should(Exit(0))
|
||||||
|
Expect(session.OutputToStringArray()).To(BeEmpty())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user