From 233ba5bd894aac77db1bb2e41b0ef464f865d2a0 Mon Sep 17 00:00:00 2001
From: Daniel J Walsh <dwalsh@redhat.com>
Date: Sat, 9 Feb 2019 05:33:14 -0700
Subject: Remove container from storage on --force

Currently we can get into a state where a container exists in
storage but does not exist in libpod.  If the user forces a
removal of this container, then we should remove it from storage
even if the container is owned by another tool.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
---
 libpod/errors.go      | 11 ++++++++---
 libpod/runtime_ctr.go | 15 +++++++++++++++
 2 files changed, 23 insertions(+), 3 deletions(-)

(limited to 'libpod')

diff --git a/libpod/errors.go b/libpod/errors.go
index d6614141c..30a19d30f 100644
--- a/libpod/errors.go
+++ b/libpod/errors.go
@@ -2,15 +2,20 @@ package libpod
 
 import (
 	"errors"
+
+	"github.com/containers/libpod/libpod/image"
 )
 
 var (
 	// ErrNoSuchCtr indicates the requested container does not exist
-	ErrNoSuchCtr = errors.New("no such container")
+	ErrNoSuchCtr = image.ErrNoSuchCtr
+
 	// ErrNoSuchPod indicates the requested pod does not exist
-	ErrNoSuchPod = errors.New("no such pod")
+	ErrNoSuchPod = image.ErrNoSuchPod
+
 	// ErrNoSuchImage indicates the requested image does not exist
-	ErrNoSuchImage = errors.New("no such image")
+	ErrNoSuchImage = image.ErrNoSuchImage
+
 	// ErrNoSuchVolume indicates the requested volume does not exist
 	ErrNoSuchVolume = errors.New("no such volume")
 
diff --git a/libpod/runtime_ctr.go b/libpod/runtime_ctr.go
index 9afdef7b6..4f8192198 100644
--- a/libpod/runtime_ctr.go
+++ b/libpod/runtime_ctr.go
@@ -10,7 +10,9 @@ import (
 	"strings"
 	"time"
 
+	"github.com/containers/libpod/libpod/image"
 	"github.com/containers/libpod/pkg/rootless"
+	"github.com/containers/storage"
 	"github.com/containers/storage/pkg/stringid"
 	spec "github.com/opencontainers/runtime-spec/specs-go"
 	"github.com/pkg/errors"
@@ -564,3 +566,16 @@ func (r *Runtime) Export(name string, path string) error {
 	return ctr.Export(path)
 
 }
+
+// RemoveContainersFromStorage attempt to remove containers from storage that do not exist in libpod database
+func (r *Runtime) RemoveContainersFromStorage(ctrs []string) {
+	for _, i := range ctrs {
+		// if the container does not exist in database, attempt to remove it from storage
+		if _, err := r.LookupContainer(i); err != nil && errors.Cause(err) == image.ErrNoSuchCtr {
+			r.storageService.UnmountContainerImage(i, true)
+			if err := r.storageService.DeleteContainer(i); err != nil && errors.Cause(err) != storage.ErrContainerUnknown {
+				logrus.Errorf("Failed to remove container %q from storage: %s", i, err)
+			}
+		}
+	}
+}
-- 
cgit v1.2.3-54-g00ecf