diff options
Diffstat (limited to 'pkg/adapter/runtime.go')
-rw-r--r-- | pkg/adapter/runtime.go | 477 |
1 files changed, 0 insertions, 477 deletions
diff --git a/pkg/adapter/runtime.go b/pkg/adapter/runtime.go deleted file mode 100644 index 7a181e7e5..000000000 --- a/pkg/adapter/runtime.go +++ /dev/null @@ -1,477 +0,0 @@ -// +build !remoteclient - -package adapter - -import ( - "bufio" - "context" - "io" - "io/ioutil" - "os" - "text/template" - - "github.com/containers/buildah" - "github.com/containers/buildah/imagebuildah" - "github.com/containers/buildah/pkg/formats" - "github.com/containers/image/v5/docker/reference" - "github.com/containers/image/v5/types" - "github.com/containers/libpod/cmd/podman/cliconfig" - "github.com/containers/libpod/cmd/podman/libpodruntime" - "github.com/containers/libpod/cmd/podman/shared" - "github.com/containers/libpod/libpod" - "github.com/containers/libpod/libpod/define" - "github.com/containers/libpod/libpod/events" - "github.com/containers/libpod/libpod/image" - "github.com/containers/libpod/pkg/rootless" - "github.com/containers/libpod/pkg/util" - "github.com/containers/storage/pkg/archive" - "github.com/pkg/errors" - v1 "k8s.io/api/core/v1" -) - -// LocalRuntime describes a typical libpod runtime -type LocalRuntime struct { - *libpod.Runtime - Remote bool -} - -// ContainerImage ... -type ContainerImage struct { - *image.Image -} - -// Container ... -type Container struct { - *libpod.Container -} - -// Pod encapsulates the libpod.Pod structure, helps with remote vs. local -type Pod struct { - *libpod.Pod -} - -// Volume ... -type Volume struct { - *libpod.Volume -} - -// VolumeFilter is for filtering volumes on the client -type VolumeFilter func(*Volume) bool - -// GetRuntimeNoStore returns a localruntime struct with an embedded runtime but -// without a configured storage. -func GetRuntimeNoStore(ctx context.Context, c *cliconfig.PodmanCommand) (*LocalRuntime, error) { - runtime, err := libpodruntime.GetRuntimeNoStore(ctx, c) - if err != nil { - return nil, err - } - return getRuntime(runtime) -} - -// GetRuntime returns a LocalRuntime struct with the actual runtime embedded in it -func GetRuntime(ctx context.Context, c *cliconfig.PodmanCommand) (*LocalRuntime, error) { - runtime, err := libpodruntime.GetRuntime(ctx, c) - if err != nil { - return nil, err - } - return getRuntime(runtime) -} - -func getRuntime(runtime *libpod.Runtime) (*LocalRuntime, error) { - return &LocalRuntime{ - Runtime: runtime, - }, nil -} - -// GetFilteredImages returns a slice of images in containerimages that are "filtered" -func (r *LocalRuntime) GetFilteredImages(filters []string, rwOnly bool) ([]*ContainerImage, error) { - images, err := r.ImageRuntime().GetImagesWithFilters(filters) - if err != nil { - return nil, err - } - return r.ImagestoContainerImages(images, rwOnly) -} - -// GetImages returns a slice of images in containerimages -func (r *LocalRuntime) GetImages() ([]*ContainerImage, error) { - return r.getImages(false) -} - -// GetRWImages returns a slice of read/write images in containerimages -func (r *LocalRuntime) GetRWImages() ([]*ContainerImage, error) { - return r.getImages(true) -} - -func (r *LocalRuntime) getImages(rwOnly bool) ([]*ContainerImage, error) { - images, err := r.Runtime.ImageRuntime().GetImages() - if err != nil { - return nil, err - } - return r.ImagestoContainerImages(images, rwOnly) -} - -// ImagestoContainerImages converts the slice of *image.Image to a slice of -// *ContainerImage. ReadOnly images are skipped when rwOnly is set. -func (r *LocalRuntime) ImagestoContainerImages(images []*image.Image, rwOnly bool) ([]*ContainerImage, error) { - var containerImages []*ContainerImage - for _, i := range images { - if rwOnly && i.IsReadOnly() { - continue - } - containerImages = append(containerImages, &ContainerImage{i}) - } - return containerImages, nil -} - -// NewImageFromLocal returns a containerimage representation of a image from local storage -func (r *LocalRuntime) NewImageFromLocal(name string) (*ContainerImage, error) { - img, err := r.Runtime.ImageRuntime().NewFromLocal(name) - if err != nil { - return nil, err - } - return &ContainerImage{img}, nil -} - -// ImageTree reutnrs an new image.Tree for the provided `imageOrID` and `whatrequires` flag -func (r *LocalRuntime) ImageTree(imageOrID string, whatRequires bool) (string, error) { - img, err := r.Runtime.ImageRuntime().NewFromLocal(imageOrID) - if err != nil { - return "", err - } - return img.GenerateTree(whatRequires) -} - -// LoadFromArchiveReference calls into local storage to load an image from an archive -func (r *LocalRuntime) LoadFromArchiveReference(ctx context.Context, srcRef types.ImageReference, signaturePolicyPath string, writer io.Writer) ([]*ContainerImage, error) { - var containerImages []*ContainerImage - imgs, err := r.Runtime.ImageRuntime().LoadFromArchiveReference(ctx, srcRef, signaturePolicyPath, writer) - if err != nil { - return nil, err - } - for _, i := range imgs { - ci := ContainerImage{i} - containerImages = append(containerImages, &ci) - } - return containerImages, nil -} - -// New calls into local storage to look for an image in local storage or to pull it -func (r *LocalRuntime) New(ctx context.Context, name, signaturePolicyPath, authfile string, writer io.Writer, dockeroptions *image.DockerRegistryOptions, signingoptions image.SigningOptions, label *string, pullType util.PullType) (*ContainerImage, error) { - img, err := r.Runtime.ImageRuntime().New(ctx, name, signaturePolicyPath, authfile, writer, dockeroptions, signingoptions, label, pullType) - if err != nil { - return nil, err - } - return &ContainerImage{img}, nil -} - -// RemoveImage calls into local storage and removes an image -func (r *LocalRuntime) RemoveImage(ctx context.Context, img *ContainerImage, force bool) (*image.ImageDeleteResponse, error) { - return r.Runtime.RemoveImage(ctx, img.Image, force) -} - -// PruneImages is wrapper into PruneImages within the image pkg -func (r *LocalRuntime) PruneImages(ctx context.Context, all bool, filter []string) ([]string, error) { - return r.ImageRuntime().PruneImages(ctx, all, filter) -} - -// Export is a wrapper to container export to a tarfile -func (r *LocalRuntime) Export(name string, path string) error { - ctr, err := r.Runtime.LookupContainer(name) - if err != nil { - return errors.Wrapf(err, "error looking up container %q", name) - } - return ctr.Export(path) -} - -// Import is a wrapper to import a container image -func (r *LocalRuntime) Import(ctx context.Context, source, reference string, changes []string, history string, quiet bool) (string, error) { - return r.Runtime.Import(ctx, source, reference, changes, history, quiet) -} - -// CreateVolume is a wrapper to create volumes -func (r *LocalRuntime) CreateVolume(ctx context.Context, c *cliconfig.VolumeCreateValues, labels, opts map[string]string) (string, error) { - var ( - options []libpod.VolumeCreateOption - volName string - ) - - if len(c.InputArgs) > 0 { - volName = c.InputArgs[0] - options = append(options, libpod.WithVolumeName(volName)) - } - - if c.Flag("driver").Changed { - options = append(options, libpod.WithVolumeDriver(c.Driver)) - } - - if len(labels) != 0 { - options = append(options, libpod.WithVolumeLabels(labels)) - } - - if len(opts) != 0 { - // We need to process -o for uid, gid - parsedOptions, err := shared.ParseVolumeOptions(opts) - if err != nil { - return "", err - } - options = append(options, parsedOptions...) - } - newVolume, err := r.NewVolume(ctx, options...) - if err != nil { - return "", err - } - return newVolume.Name(), nil -} - -// RemoveVolumes is a wrapper to remove volumes -func (r *LocalRuntime) RemoveVolumes(ctx context.Context, c *cliconfig.VolumeRmValues) ([]string, map[string]error, error) { - return shared.SharedRemoveVolumes(ctx, r.Runtime, c.InputArgs, c.All, c.Force) -} - -// Push is a wrapper to push an image to a registry -func (r *LocalRuntime) Push(ctx context.Context, srcName, destination, manifestMIMEType, authfile, digestfile, signaturePolicyPath string, writer io.Writer, forceCompress bool, signingOptions image.SigningOptions, dockerRegistryOptions *image.DockerRegistryOptions, additionalDockerArchiveTags []reference.NamedTagged) error { - newImage, err := r.ImageRuntime().NewFromLocal(srcName) - if err != nil { - return err - } - return newImage.PushImageToHeuristicDestination(ctx, destination, manifestMIMEType, authfile, digestfile, signaturePolicyPath, writer, forceCompress, signingOptions, dockerRegistryOptions, nil) -} - -// InspectVolumes returns a slice of volumes based on an arg list or --all -func (r *LocalRuntime) InspectVolumes(ctx context.Context, c *cliconfig.VolumeInspectValues) ([]*libpod.InspectVolumeData, error) { - var ( - volumes []*libpod.Volume - err error - ) - - if c.All { - volumes, err = r.GetAllVolumes() - } else { - for _, v := range c.InputArgs { - vol, err := r.LookupVolume(v) - if err != nil { - return nil, err - } - volumes = append(volumes, vol) - } - } - if err != nil { - return nil, err - } - - inspectVols := make([]*libpod.InspectVolumeData, 0, len(volumes)) - for _, vol := range volumes { - inspectOut, err := vol.Inspect() - if err != nil { - return nil, errors.Wrapf(err, "error inspecting volume %s", vol.Name()) - } - inspectVols = append(inspectVols, inspectOut) - } - - return inspectVols, nil -} - -// Volumes returns a slice of localruntime volumes -func (r *LocalRuntime) Volumes(ctx context.Context) ([]*Volume, error) { - vols, err := r.GetAllVolumes() - if err != nil { - return nil, err - } - return libpodVolumeToVolume(vols), nil -} - -// libpodVolumeToVolume converts a slice of libpod volumes to a slice -// of localruntime volumes (same as libpod) -func libpodVolumeToVolume(volumes []*libpod.Volume) []*Volume { - var vols []*Volume - for _, v := range volumes { - newVol := Volume{ - v, - } - vols = append(vols, &newVol) - } - return vols -} - -// Build is the wrapper to build images -func (r *LocalRuntime) Build(ctx context.Context, c *cliconfig.BuildValues, options imagebuildah.BuildOptions, dockerfiles []string) (string, reference.Canonical, error) { - - authfile := c.Authfile - if len(c.Authfile) == 0 { - authfile = os.Getenv("REGISTRY_AUTH_FILE") - } - - options.SystemContext.AuthFilePath = authfile - - if c.GlobalFlags.Runtime != "" { - options.Runtime = c.GlobalFlags.Runtime - } else { - options.Runtime = r.GetOCIRuntimePath() - } - - if c.Quiet { - options.ReportWriter = ioutil.Discard - } - - if rootless.IsRootless() { - options.Isolation = buildah.IsolationOCIRootless - } - - return r.Runtime.Build(ctx, options, dockerfiles...) -} - -// PruneVolumes is a wrapper function for libpod PruneVolumes -func (r *LocalRuntime) PruneVolumes(ctx context.Context) ([]string, []error) { - var ( - vids []string - errs []error - ) - reports, err := r.Runtime.PruneVolumes(ctx) - if err != nil { - errs = append(errs, err) - return vids, errs - } - for k, v := range reports { - if v == nil { - vids = append(vids, k) - } else { - errs = append(errs, v) - } - } - return vids, errs -} - -// SaveImage is a wrapper function for saving an image to the local filesystem -func (r *LocalRuntime) SaveImage(ctx context.Context, c *cliconfig.SaveValues) error { - source := c.InputArgs[0] - additionalTags := c.InputArgs[1:] - - newImage, err := r.Runtime.ImageRuntime().NewFromLocal(source) - if err != nil { - return err - } - return newImage.Save(ctx, source, c.Format, c.Output, additionalTags, c.Quiet, c.Compress) -} - -// LoadImage is a wrapper function for libpod LoadImage -func (r *LocalRuntime) LoadImage(ctx context.Context, name string, cli *cliconfig.LoadValues) (string, error) { - var ( - writer io.Writer - ) - if !cli.Quiet { - writer = os.Stderr - } - return r.Runtime.LoadImage(ctx, name, cli.Input, writer, cli.SignaturePolicy) -} - -// IsImageNotFound checks if the error indicates that no image was found. -func IsImageNotFound(err error) bool { - return errors.Cause(err) == image.ErrNoSuchImage -} - -// HealthCheck is a wrapper to same named function in libpod -func (r *LocalRuntime) HealthCheck(c *cliconfig.HealthCheckValues) (string, error) { - output := "unhealthy" - status, err := r.Runtime.HealthCheck(c.InputArgs[0]) - if status == libpod.HealthCheckSuccess { - output = "healthy" - } - return output, err -} - -// Events is a wrapper to libpod to obtain libpod/podman events -func (r *LocalRuntime) Events(c *cliconfig.EventValues) error { - var ( - fromStart bool - eventsError error - ) - var tmpl *template.Template - if c.Format != formats.JSONString { - template, err := template.New("events").Parse(c.Format) - if err != nil { - return err - } - tmpl = template - } - if len(c.Since) > 0 || len(c.Until) > 0 { - fromStart = true - } - eventChannel := make(chan *events.Event) - go func() { - readOpts := events.ReadOptions{FromStart: fromStart, Stream: c.Stream, Filters: c.Filter, EventChannel: eventChannel, Since: c.Since, Until: c.Until} - eventsError = r.Runtime.Events(readOpts) - }() - - if eventsError != nil { - return eventsError - } - w := bufio.NewWriter(os.Stdout) - for event := range eventChannel { - switch { - case c.Format == formats.JSONString: - jsonStr, err := event.ToJSONString() - if err != nil { - return errors.Wrapf(err, "unable to format json") - } - if _, err := w.Write([]byte(jsonStr)); err != nil { - return err - } - case len(c.Format) > 0: - if err := tmpl.Execute(w, event); err != nil { - return err - } - default: - if _, err := w.Write([]byte(event.ToHumanReadable())); err != nil { - return err - } - } - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - if err := w.Flush(); err != nil { - return err - } - } - return nil -} - -// Diff shows the difference in two objects -func (r *LocalRuntime) Diff(c *cliconfig.DiffValues, to string) ([]archive.Change, error) { - return r.Runtime.GetDiff("", to) -} - -// GenerateKube creates kubernetes email from containers and pods -func (r *LocalRuntime) GenerateKube(c *cliconfig.GenerateKubeValues) (*v1.Pod, *v1.Service, error) { - return shared.GenerateKube(c.InputArgs[0], c.Service, r.Runtime) -} - -// GetPodsByStatus returns a slice of pods filtered by a libpod status -func (r *LocalRuntime) GetPodsByStatus(statuses []string) ([]*libpod.Pod, error) { - - filterFunc := func(p *libpod.Pod) bool { - state, _ := shared.GetPodStatus(p) - for _, status := range statuses { - if state == status { - return true - } - } - return false - } - - pods, err := r.Runtime.Pods(filterFunc) - if err != nil { - return nil, err - } - - return pods, nil -} - -// GetVersion is an alias to satisfy interface{} -func (r *LocalRuntime) GetVersion() (define.Version, error) { - return define.GetVersion() -} - -// RemoteEndpoint resolve interface requirement -func (r *LocalRuntime) RemoteEndpoint() (*Endpoint, error) { - return nil, errors.New("RemoteEndpoint() not implemented for local connection") -} |