Skip to content

Commit

Permalink
Merge pull request #4558 from rhatdan/reset
Browse files Browse the repository at this point in the history
Add podman system reset command
  • Loading branch information
openshift-merge-robot authored Nov 29, 2019
2 parents 7b99ef0 + 79bf501 commit 39c705e
Show file tree
Hide file tree
Showing 16 changed files with 466 additions and 86 deletions.
8 changes: 8 additions & 0 deletions API.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in

[func RemovePod(name: string, force: bool) string](#RemovePod)

[func Reset() ](#Reset)

[func RestartContainer(name: string, timeout: int) string](#RestartContainer)

[func RestartPod(name: string) string](#RestartPod)
Expand Down Expand Up @@ -1059,6 +1061,12 @@ $ varlink call -m unix:/run/podman/io.podman/io.podman.RemovePod '{"name": "62f4
"pod": "62f4fd98cb57f529831e8f90610e54bba74bd6f02920ffb485e15376ed365c20"
}
~~~
### <a name="Reset"></a>func Reset
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">

method Reset() </div>
Reset resets Podman back to its initial state.
Removes all Pods, Containers, Images and Volumes
### <a name="RestartContainer"></a>func RestartContainer
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">

Expand Down
5 changes: 5 additions & 0 deletions cmd/podman/cliconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -658,6 +658,11 @@ type SystemPruneValues struct {
Volume bool
}

type SystemResetValues struct {
PodmanCommand
Force bool
}

type SystemRenumberValues struct {
PodmanCommand
}
Expand Down
71 changes: 71 additions & 0 deletions cmd/podman/reset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package main

import (
"bufio"
"fmt"
"os"
"strings"

"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/pkg/adapter"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)

var (
systemResetCommand cliconfig.SystemResetValues
systemResetDescription = `Reset podman storage back to default state"
All containers will be stopped and removed, and all images, volumes and container content will be removed.
`
_systemResetCommand = &cobra.Command{
Use: "reset",
Args: noSubArgs,
Short: "Reset podman storage",
Long: systemResetDescription,
RunE: func(cmd *cobra.Command, args []string) error {
systemResetCommand.InputArgs = args
systemResetCommand.GlobalFlags = MainGlobalOpts
systemResetCommand.Remote = remoteclient
return systemResetCmd(&systemResetCommand)
},
}
)

func init() {
systemResetCommand.Command = _systemResetCommand
flags := systemResetCommand.Flags()
flags.BoolVarP(&systemResetCommand.Force, "force", "f", false, "Do not prompt for confirmation")

systemResetCommand.SetHelpTemplate(HelpTemplate())
systemResetCommand.SetUsageTemplate(UsageTemplate())
}

func systemResetCmd(c *cliconfig.SystemResetValues) error {
// Prompt for confirmation if --force is not set
if !c.Force {
reader := bufio.NewReader(os.Stdin)
fmt.Print(`
WARNING! This will remove:
- all containers
- all pods
- all images
- all build cache
Are you sure you want to continue? [y/N] `)
ans, err := reader.ReadString('\n')
if err != nil {
return errors.Wrapf(err, "error reading input")
}
if strings.ToLower(ans)[0] != 'y' {
return nil
}
}

runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
// No shutdown, since storage will be destroyed when command completes

return runtime.Reset()
}
1 change: 1 addition & 0 deletions cmd/podman/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ var (
)

var systemCommands = []*cobra.Command{
_systemResetCommand,
_infoCommand,
_pruneSystemCommand,
}
Expand Down
4 changes: 4 additions & 0 deletions cmd/podman/varlink/io.podman.varlink
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,10 @@ method GetVersion() -> (
remote_api_version: int
)

# Reset resets Podman back to its initial state.
# Removes all Pods, Containers, Images and Volumes
method Reset() -> ()

# GetInfo returns a [PodmanInfo](#PodmanInfo) struct that describes podman and its host such as storage stats,
# build information of Podman, and system-wide registries.
method GetInfo() -> (info: PodmanInfo)
Expand Down
172 changes: 89 additions & 83 deletions commands.md

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions completions/bash/podman
Original file line number Diff line number Diff line change
Expand Up @@ -1142,6 +1142,21 @@ _podman_container() {
esac
}

_podman_system_reset() {
local options_with_args="
"
local boolean_options="
-h
--help
--force
"
case "$cur" in
-*)
COMPREPLY=($(compgen -W "$boolean_options $options_with_args" -- "$cur"))
;;
esac
}

_podman_system_df() {
local options_with_args="
--format
Expand Down Expand Up @@ -1193,6 +1208,7 @@ _podman_system() {
df
info
prune
reset
"
__podman_subcommands "$subcommands" && return

Expand Down
25 changes: 25 additions & 0 deletions docs/source/markdown/podman-system-reset.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
% podman-system-reset(1)

## NAME
podman\-system\-reset - Reset storage back to initial state

## SYNOPSIS
**podman system reset**

## DESCRIPTION
**podman system reset** removes all pods, containers, images and volumes.

## OPTIONS
**--force**, **-f**

Do not prompt for confirmation

**--help**, **-h**

Print usage statement

## SEE ALSO
`podman(1)`, `podman-system(1)`

## HISTORY
November 2019, Originally compiled by Dan Walsh (dwalsh at redhat dot com)
5 changes: 3 additions & 2 deletions docs/source/markdown/podman-system.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ The system command allows you to manage the podman systems
| ------- | --------------------------------------------------- | ---------------------------------------------------------------------------- |
| df | [podman-system-df(1)](podman-system-df.1.md) | Show podman disk usage. |
| info | [podman-system-info(1)](podman-info.1.md) | Displays Podman related system information. |
| prune | [podman-system-prune(1)](podman-system-prune.1.md) | Remove all unused container, image and volume data |
| renumber | [podman-system-renumber(1)](podman-system-renumber.1.md)| Migrate lock numbers to handle a change in maximum number of locks. |
| migrate | [podman-system-migrate(1)](podman-system-migrate.1.md)| Migrate existing containers to a new podman version. |
| prune | [podman-system-prune(1)](podman-system-prune.1.md) | Remove all unused container, image and volume data. |
| renumber | [podman-system-renumber(1)](podman-system-renumber.1.md)| Migrate lock numbers to handle a change in maximum number of locks. |
| reset | [podman-system-reset(1)](podman-system-reset.1.md) | Reset storage back to initial state. |

## SEE ALSO
podman(1)
107 changes: 107 additions & 0 deletions libpod/reset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package libpod

import (
"context"
"os"
"path/filepath"

"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/rootless"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)

// Reset removes all storage
func (r *Runtime) Reset(ctx context.Context) error {

pods, err := r.GetAllPods()
if err != nil {
return err
}
for _, p := range pods {
if err := r.RemovePod(ctx, p, true, true); err != nil {
if errors.Cause(err) == define.ErrNoSuchPod {
continue
}
logrus.Errorf("Error removing Pod %s: %v", p.ID(), err)
}
}

ctrs, err := r.GetAllContainers()
if err != nil {
return err
}

for _, c := range ctrs {
if err := r.RemoveContainer(ctx, c, true, true); err != nil {
if err := r.RemoveStorageContainer(c.ID(), true); err != nil {
if errors.Cause(err) == define.ErrNoSuchCtr {
continue
}
logrus.Errorf("Error removing container %s: %v", c.ID(), err)
}
}
}

if err := stopPauseProcess(); err != nil {
logrus.Errorf("Error stopping pause process: %v", err)
}

ir := r.ImageRuntime()
images, err := ir.GetImages()
if err != nil {
return err
}

for _, i := range images {
if err := i.Remove(ctx, true); err != nil {
if errors.Cause(err) == define.ErrNoSuchImage {
continue
}
logrus.Errorf("Error removing image %s: %v", i.ID(), err)
}
}
volumes, err := r.state.AllVolumes()
if err != nil {
return err
}
for _, v := range volumes {
if err := r.RemoveVolume(ctx, v, true); err != nil {
if errors.Cause(err) == define.ErrNoSuchVolume {
continue
}
logrus.Errorf("Error removing volume %s: %v", v.config.Name, err)
}
}

_, prevError := r.store.Shutdown(true)
if err := os.RemoveAll(r.store.GraphRoot()); err != nil {
if prevError != nil {
logrus.Error(prevError)
}
prevError = err
}
if err := os.RemoveAll(r.store.RunRoot()); err != nil {
if prevError != nil {
logrus.Error(prevError)
}
prevError = err
}
if err := os.RemoveAll(r.config.TmpDir); err != nil {
if prevError != nil {
logrus.Error(prevError)
}
prevError = err
}
if rootless.IsRootless() {
configPath := filepath.Join(os.Getenv("HOME"), ".config/containers")
if err := os.RemoveAll(configPath); err != nil {
if prevError != nil {
logrus.Error(prevError)
}
prevError = err
}
}

return prevError
}
4 changes: 4 additions & 0 deletions libpod/runtime_migrate_unsupported.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@ import (
func (r *Runtime) migrate(ctx context.Context) error {
return nil
}

func stopPauseProcess() error {
return nil
}
13 changes: 13 additions & 0 deletions pkg/adapter/reset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// +build !remoteclient

package adapter

import (
"context"
)

// Reset the container storage back to initial states.
// Removes all Pods, Containers, Images and Volumes.
func (r *LocalRuntime) Reset() error {
return r.Runtime.Reset(context.TODO())
}
12 changes: 12 additions & 0 deletions pkg/adapter/reset_remote.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// +build remoteclient

package adapter

import (
"github.com/containers/libpod/cmd/podman/varlink"
)

// Info returns information for the host system and its components
func (r RemoteRuntime) Reset() error {
return iopodman.Reset().Call(r.Conn)
}
22 changes: 21 additions & 1 deletion pkg/varlinkapi/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
package varlinkapi

import (
"context"
"fmt"
"github.com/containers/libpod/libpod/define"
"os"
goruntime "runtime"
"time"

"github.com/containers/libpod/cmd/podman/varlink"
"github.com/containers/libpod/libpod/define"
"github.com/sirupsen/logrus"
)

// GetVersion ...
Expand Down Expand Up @@ -105,3 +108,20 @@ func (i *LibpodAPI) GetInfo(call iopodman.VarlinkCall) error {
podmanInfo.Insecure_registries = insecureRegistries
return call.ReplyGetInfo(podmanInfo)
}

// GetVersion ...
func (i *LibpodAPI) Reset(call iopodman.VarlinkCall) error {
if err := i.Runtime.Reset(context.TODO()); err != nil {
logrus.Errorf("Reset Failed: %v", err)
if err := call.ReplyErrorOccurred(err.Error()); err != nil {
logrus.Errorf("Failed to send ReplyErrorOccurred: %v", err)
}
os.Exit(define.ExecErrorCodeGeneric)
}
if err := call.ReplyReset(); err != nil {
logrus.Errorf("Failed to send ReplyReset: %v", err)
os.Exit(define.ExecErrorCodeGeneric)
}
os.Exit(0)
return nil
}
4 changes: 4 additions & 0 deletions test/e2e/libpod_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,3 +135,7 @@ func removeCache() {
func (p *PodmanTestIntegration) SeedImages() error {
return nil
}

// We don't support running Varlink when local
func (p *PodmanTestIntegration) StartVarlink() {
}
Loading

0 comments on commit 39c705e

Please sign in to comment.