mirror of
				https://github.com/containers/podman.git
				synced 2025-10-31 18:08:51 +08:00 
			
		
		
		
	 0f7d54b026
			
		
	
	0f7d54b026
	
	
	
		
			
			Migrate the Podman code base over to `common/libimage` which replaces `libpod/image` and a lot of glue code entirely. Note that I tried to leave bread crumbs for changed tests. Miscellaneous changes: * Some errors yield different messages which required to alter some tests. * I fixed some pre-existing issues in the code. Others were marked as `//TODO`s to prevent the PR from exploding. * The `NamesHistory` of an image is returned as is from the storage. Previously, we did some filtering which I think is undesirable. Instead we should return the data as stored in the storage. * Touched handlers use the ABI interfaces where possible. * Local image resolution: previously Podman would match "foo" on "myfoo". This behaviour has been changed and Podman will now only match on repository boundaries such that "foo" would match "my/foo" but not "myfoo". I consider the old behaviour to be a bug, at the very least an exotic corner case. * Futhermore, "foo:none" does *not* resolve to a local image "foo" without tag anymore. It's a hill I am (almost) willing to die on. * `image prune` prints the IDs of pruned images. Previously, in some cases, the names were printed instead. The API clearly states ID, so we should stick to it. * Compat endpoint image removal with _force_ deletes the entire not only the specified tag. Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
		
			
				
	
	
		
			137 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package libpod
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 
 | |
| 	"github.com/containers/common/libimage"
 | |
| 	"github.com/containers/podman/v3/libpod/define"
 | |
| 	"github.com/containers/podman/v3/pkg/errorhandling"
 | |
| 	"github.com/containers/podman/v3/pkg/rootless"
 | |
| 	"github.com/containers/podman/v3/pkg/util"
 | |
| 	"github.com/containers/storage"
 | |
| 	"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 := r.stopPauseProcess(); err != nil {
 | |
| 		logrus.Errorf("Error stopping pause process: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	rmiOptions := &libimage.RemoveImagesOptions{Filters: []string{"readonly=false"}}
 | |
| 	if _, rmiErrors := r.LibimageRuntime().RemoveImages(ctx, nil, rmiOptions); rmiErrors != nil {
 | |
| 		return errorhandling.JoinErrors(rmiErrors)
 | |
| 	}
 | |
| 
 | |
| 	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)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	xdgRuntimeDir := filepath.Clean(os.Getenv("XDG_RUNTIME_DIR"))
 | |
| 	_, prevError := r.store.Shutdown(true)
 | |
| 	graphRoot := filepath.Clean(r.store.GraphRoot())
 | |
| 	if graphRoot == xdgRuntimeDir {
 | |
| 		if prevError != nil {
 | |
| 			logrus.Error(prevError)
 | |
| 		}
 | |
| 		prevError = errors.Errorf("failed to remove runtime graph root dir %s, since it is the same as XDG_RUNTIME_DIR", graphRoot)
 | |
| 	} else {
 | |
| 		if err := os.RemoveAll(graphRoot); err != nil {
 | |
| 			if prevError != nil {
 | |
| 				logrus.Error(prevError)
 | |
| 			}
 | |
| 			prevError = err
 | |
| 		}
 | |
| 	}
 | |
| 	runRoot := filepath.Clean(r.store.RunRoot())
 | |
| 	if runRoot == xdgRuntimeDir {
 | |
| 		if prevError != nil {
 | |
| 			logrus.Error(prevError)
 | |
| 		}
 | |
| 		prevError = errors.Errorf("failed to remove runtime root dir %s, since it is the same as XDG_RUNTIME_DIR", runRoot)
 | |
| 	} else {
 | |
| 		if err := os.RemoveAll(runRoot); err != nil {
 | |
| 			if prevError != nil {
 | |
| 				logrus.Error(prevError)
 | |
| 			}
 | |
| 			prevError = err
 | |
| 		}
 | |
| 	}
 | |
| 	runtimeDir, err := util.GetRuntimeDir()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	tempDir := r.config.Engine.TmpDir
 | |
| 	if tempDir == runtimeDir {
 | |
| 		tempDir = filepath.Join(tempDir, "containers")
 | |
| 	}
 | |
| 	if filepath.Clean(tempDir) == xdgRuntimeDir {
 | |
| 		if prevError != nil {
 | |
| 			logrus.Error(prevError)
 | |
| 		}
 | |
| 		prevError = errors.Errorf("failed to remove runtime tmpdir %s, since it is the same as XDG_RUNTIME_DIR", tempDir)
 | |
| 	} else {
 | |
| 		if err := os.RemoveAll(tempDir); err != nil {
 | |
| 			if prevError != nil {
 | |
| 				logrus.Error(prevError)
 | |
| 			}
 | |
| 			prevError = err
 | |
| 		}
 | |
| 	}
 | |
| 	if storageConfPath, err := storage.DefaultConfigFile(rootless.IsRootless()); err == nil {
 | |
| 		if _, err = os.Stat(storageConfPath); err == nil {
 | |
| 			fmt.Printf("A storage.conf file exists at %s\n", storageConfPath)
 | |
| 			fmt.Println("You should remove this file if you did not modified the configuration.")
 | |
| 		}
 | |
| 	} else {
 | |
| 		if prevError != nil {
 | |
| 			logrus.Error(prevError)
 | |
| 		}
 | |
| 		prevError = err
 | |
| 	}
 | |
| 
 | |
| 	return prevError
 | |
| }
 |