diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-05-12 03:32:20 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-12 03:32:20 -0700 |
commit | caf46abd3a4af1ff065400573f19e69109cbb647 (patch) | |
tree | 38865f10301708992186073fe5923fd3afef57a3 | |
parent | 171dd10125a4b4195409f05ea45fb505021f2ce8 (diff) | |
parent | 1c6ae73a898222a14b98526339d9985c51f88d35 (diff) | |
download | podman-caf46abd3a4af1ff065400573f19e69109cbb647.tar.gz podman-caf46abd3a4af1ff065400573f19e69109cbb647.tar.bz2 podman-caf46abd3a4af1ff065400573f19e69109cbb647.zip |
Merge pull request #6101 from sujil02/systemreset-v2
Adds tunnel routes for system reset.
-rw-r--r-- | cmd/podman/system/reset.go | 10 | ||||
-rw-r--r-- | pkg/api/handlers/libpod/system.go | 10 | ||||
-rw-r--r-- | pkg/api/server/register_system.go | 15 | ||||
-rw-r--r-- | pkg/bindings/system/system.go | 13 | ||||
-rw-r--r-- | pkg/bindings/test/system_test.go | 42 | ||||
-rw-r--r-- | pkg/domain/entities/engine_system.go | 2 | ||||
-rw-r--r-- | pkg/domain/infra/abi/system.go | 2 | ||||
-rw-r--r-- | pkg/domain/infra/tunnel/runtime.go | 5 | ||||
-rw-r--r-- | pkg/domain/infra/tunnel/system.go | 5 |
9 files changed, 95 insertions, 9 deletions
diff --git a/cmd/podman/system/reset.go b/cmd/podman/system/reset.go index 22ddc7529..6caa91690 100644 --- a/cmd/podman/system/reset.go +++ b/cmd/podman/system/reset.go @@ -26,10 +26,8 @@ var ( Long: systemResetDescription, Run: reset, } -) -var ( - systemResetOptions entities.SystemResetOptions + forceFlag bool ) func init() { @@ -39,12 +37,12 @@ func init() { Parent: systemCmd, }) flags := systemResetCommand.Flags() - flags.BoolVarP(&systemResetOptions.Force, "force", "f", false, "Do not prompt for confirmation") + flags.BoolVarP(&forceFlag, "force", "f", false, "Do not prompt for confirmation") } func reset(cmd *cobra.Command, args []string) { // Prompt for confirmation if --force is not set - if !systemResetOptions.Force { + if !forceFlag { reader := bufio.NewReader(os.Stdin) fmt.Print(` WARNING! This will remove: @@ -74,7 +72,7 @@ Are you sure you want to continue? [y/N] `) } defer engine.Shutdown(registry.Context()) - if err := engine.Reset(registry.Context(), systemResetOptions); err != nil { + if err := engine.Reset(registry.Context()); err != nil { fmt.Println(err) os.Exit(125) } diff --git a/pkg/api/handlers/libpod/system.go b/pkg/api/handlers/libpod/system.go index 98e33bf10..72a38db63 100644 --- a/pkg/api/handlers/libpod/system.go +++ b/pkg/api/handlers/libpod/system.go @@ -69,3 +69,13 @@ func SystemPrune(w http.ResponseWriter, r *http.Request) { } utils.WriteResponse(w, http.StatusOK, systemPruneReport) } + +// SystemReset Resets podman storage back to default state +func SystemReset(w http.ResponseWriter, r *http.Request) { + err := r.Context().Value("runtime").(*libpod.Runtime).Reset(r.Context()) + if err != nil { + utils.InternalServerError(w, err) + return + } + utils.WriteResponse(w, http.StatusOK, nil) +} diff --git a/pkg/api/server/register_system.go b/pkg/api/server/register_system.go index 7375a75c1..39990e6a6 100644 --- a/pkg/api/server/register_system.go +++ b/pkg/api/server/register_system.go @@ -27,6 +27,19 @@ func (s *APIServer) registerSystemHandlers(r *mux.Router) error { // 500: // $ref: "#/responses/InternalError" r.Handle(VersionedPath("/libpod/system/prune"), s.APIHandler(libpod.SystemPrune)).Methods(http.MethodPost) - + // swagger:operation POST /libpod/system/reset libpod resetSystem + // --- + // tags: + // - system + // summary: Reset podman storage + // description: All containers will be stopped and removed, and all images, volumes and container content will be removed. + // produces: + // - application/json + // responses: + // 200: + // description: no error + // 500: + // $ref: "#/responses/InternalError" + r.Handle(VersionedPath("/libpod/system/reset"), s.APIHandler(libpod.SystemReset)).Methods(http.MethodPost) return nil } diff --git a/pkg/bindings/system/system.go b/pkg/bindings/system/system.go index caef6af6f..f1c40cd75 100644 --- a/pkg/bindings/system/system.go +++ b/pkg/bindings/system/system.go @@ -121,3 +121,16 @@ func Version(ctx context.Context) (*entities.SystemVersionReport, error) { } return &report, err } + +// Reset removes all unused system data. +func Reset(ctx context.Context) error { + conn, err := bindings.GetClient(ctx) + if err != nil { + return err + } + response, err := conn.DoRequest(nil, http.MethodPost, "/system/reset", nil) + if err != nil { + return err + } + return response.Process(response) +} diff --git a/pkg/bindings/test/system_test.go b/pkg/bindings/test/system_test.go index 62ea32377..76f0b074b 100644 --- a/pkg/bindings/test/system_test.go +++ b/pkg/bindings/test/system_test.go @@ -5,6 +5,7 @@ import ( "github.com/containers/libpod/pkg/bindings" "github.com/containers/libpod/pkg/bindings/containers" + "github.com/containers/libpod/pkg/bindings/images" "github.com/containers/libpod/pkg/bindings/pods" "github.com/containers/libpod/pkg/bindings/system" "github.com/containers/libpod/pkg/bindings/volumes" @@ -149,4 +150,45 @@ var _ = Describe("Podman system", func() { // Volume should be pruned now as flag set true Expect(len(systemPruneResponse.VolumePruneReport)).To(Equal(1)) }) + + It("podman system reset", func() { + // Adding an unused volume should work + _, err := volumes.Create(bt.conn, entities.VolumeCreateOptions{}) + Expect(err).To(BeNil()) + + vols, err := volumes.List(bt.conn, nil) + Expect(err).To(BeNil()) + Expect(len(vols)).To(Equal(1)) + + // Start a pod and leave it running + _, err = pods.Start(bt.conn, newpod) + Expect(err).To(BeNil()) + + imageSummary, err := images.List(bt.conn, nil, nil) + Expect(err).To(BeNil()) + // Since in the begin context images are created + Expect(len(imageSummary)).To(Equal(3)) + + err = system.Reset(bt.conn) + Expect(err).To(BeNil()) + + // re-establish connection + s = bt.startAPIService() + time.Sleep(1 * time.Second) + + // No pods + podSummary, err := pods.List(bt.conn, nil) + Expect(err).To(BeNil()) + Expect(len(podSummary)).To(Equal(0)) + + // No images + imageSummary, err = images.List(bt.conn, &bindings.PTrue, nil) + Expect(err).To(BeNil()) + Expect(len(imageSummary)).To(Equal(0)) + + // no volumes + vols, err = volumes.List(bt.conn, nil) + Expect(err).To(BeNil()) + Expect(len(vols)).To(BeZero()) + }) }) diff --git a/pkg/domain/entities/engine_system.go b/pkg/domain/entities/engine_system.go index e2000f5cb..a0ecfe9ea 100644 --- a/pkg/domain/entities/engine_system.go +++ b/pkg/domain/entities/engine_system.go @@ -9,6 +9,6 @@ import ( type SystemEngine interface { Renumber(ctx context.Context, flags *pflag.FlagSet, config *PodmanConfig) error Migrate(ctx context.Context, flags *pflag.FlagSet, config *PodmanConfig, options SystemMigrateOptions) error - Reset(ctx context.Context, options SystemResetOptions) error + Reset(ctx context.Context) error Shutdown(ctx context.Context) } diff --git a/pkg/domain/infra/abi/system.go b/pkg/domain/infra/abi/system.go index d701d65de..af2ec5f7b 100644 --- a/pkg/domain/infra/abi/system.go +++ b/pkg/domain/infra/abi/system.go @@ -375,7 +375,7 @@ func sizeOfPath(path string) (int64, error) { return size, err } -func (se *SystemEngine) Reset(ctx context.Context, options entities.SystemResetOptions) error { +func (se *SystemEngine) Reset(ctx context.Context) error { return se.Libpod.Reset(ctx) } diff --git a/pkg/domain/infra/tunnel/runtime.go b/pkg/domain/infra/tunnel/runtime.go index c111f99e9..357e2c390 100644 --- a/pkg/domain/infra/tunnel/runtime.go +++ b/pkg/domain/infra/tunnel/runtime.go @@ -13,3 +13,8 @@ type ImageEngine struct { type ContainerEngine struct { ClientCxt context.Context } + +// Container-related runtime using an ssh-tunnel to utilize Podman service +type SystemEngine struct { + ClientCxt context.Context +} diff --git a/pkg/domain/infra/tunnel/system.go b/pkg/domain/infra/tunnel/system.go index dafada805..b1be28e04 100644 --- a/pkg/domain/infra/tunnel/system.go +++ b/pkg/domain/infra/tunnel/system.go @@ -27,6 +27,11 @@ func (ic *ContainerEngine) SystemPrune(ctx context.Context, options entities.Sys return system.Prune(ic.ClientCxt, &options.All, &options.Volume) } +// Reset removes all storage +func (ic *SystemEngine) Reset(ctx context.Context) error { + return system.Reset(ic.ClientCxt) +} + func (ic *ContainerEngine) SystemDf(ctx context.Context, options entities.SystemDfOptions) (*entities.SystemDfReport, error) { panic(errors.New("system df is not supported on remote clients")) } |