podmanv2 container exists|wait

enable container exists and wait for podmanv2

Signed-off-by: Brent Baude <bbaude@redhat.com>
This commit is contained in:
Brent Baude 2020-03-19 16:50:15 -05:00
parent ccc30c606e
commit 87293028e6
22 changed files with 284 additions and 110 deletions

1
.gitignore vendored
View file

@ -29,3 +29,4 @@ podman*.tar.gz
contrib/spec/podman.spec contrib/spec/podman.spec
*.rpm *.rpm
*.coverprofile *.coverprofile
/cmd/podmanV2/podmanV2

View file

@ -0,0 +1,40 @@
package containers
import (
"context"
"os"
"github.com/containers/libpod/cmd/podmanV2/registry"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
var (
containerExistsCommand = &cobra.Command{
Use: "exists CONTAINER",
Short: "Check if a container exists in local storage",
Long: containerExistsDescription,
Example: `podman container exists containerID
podman container exists myctr || podman run --name myctr [etc...]`,
RunE: exists,
}
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: containerExistsCommand,
Parent: containerCmd,
})
}
func exists(cmd *cobra.Command, args []string) error {
exists, err := registry.ContainerEngine().ContainerExists(context.Background(), args[0])
if err != nil {
return err
}
if !exists {
os.Exit(1)
}
return nil
}

View file

@ -7,6 +7,8 @@ import (
) )
var ( var (
containerExistsDescription = `If the named container exists in local storage, podman container exists exits with 0, otherwise the exit code will be 1.`
// podman container _inspect_ // podman container _inspect_
inspectCmd = &cobra.Command{ inspectCmd = &cobra.Command{
Use: "inspect [flags] CONTAINER", Use: "inspect [flags] CONTAINER",

View file

@ -0,0 +1,68 @@
package containers
import (
"context"
"fmt"
"time"
"github.com/containers/libpod/cmd/podmanV2/registry"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
var (
waitDescription = `Block until one or more containers stop and then print their exit codes.
`
waitCommand = &cobra.Command{
Use: "wait [flags] CONTAINER [CONTAINER...]",
Short: "Block on one or more containers",
Long: waitDescription,
RunE: wait,
Example: `podman wait --latest
podman wait --interval 5000 ctrID
podman wait ctrID1 ctrID2`,
}
)
var waitFlags = entities.WaitOptions{}
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: waitCommand,
Parent: containerCmd,
})
waitCommand.SetHelpTemplate(registry.HelpTemplate())
waitCommand.SetUsageTemplate(registry.UsageTemplate())
flags := waitCommand.Flags()
flags.DurationVarP(&waitFlags.Interval, "interval", "i", time.Duration(250), "Milliseconds to wait before polling for completion")
flags.BoolVarP(&waitFlags.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
flags.StringVar(&waitFlags.Condition, "condition", "stopped", "Condition to wait on")
}
func wait(cmd *cobra.Command, args []string) error {
if waitFlags.Latest && len(args) > 0 {
return errors.New("cannot combine latest flag and arguments")
}
if waitFlags.Interval == 0 {
return errors.New("interval must be greater then 0")
}
responses, err := registry.ContainerEngine().ContainerWait(context.Background(), args, waitFlags)
if err != nil {
return err
}
for _, r := range responses {
if r.Error == nil {
fmt.Println(r.Id)
}
}
for _, r := range responses {
if r.Error != nil {
fmt.Println(err)
}
}
return nil
}

View file

@ -52,7 +52,7 @@ func init() {
flags.BoolVarP(&inspectOpts.Size, "size", "s", false, "Display total file size") flags.BoolVarP(&inspectOpts.Size, "size", "s", false, "Display total file size")
flags.StringVarP(&inspectOpts.Format, "format", "f", "", "Change the output format to a Go template") flags.StringVarP(&inspectOpts.Format, "format", "f", "", "Change the output format to a Go template")
if registry.GlobalFlags.EngineMode == entities.ABIMode { if registry.EngineOpts.EngineMode == entities.ABIMode {
// TODO: This is the same as V1. We could skip creating the flag altogether in V2... // TODO: This is the same as V1. We could skip creating the flag altogether in V2...
_ = flags.MarkHidden("latest") _ = flags.MarkHidden("latest")
} }

View file

@ -5,6 +5,7 @@ import (
"os" "os"
"reflect" "reflect"
"runtime" "runtime"
"strings"
_ "github.com/containers/libpod/cmd/podmanV2/containers" _ "github.com/containers/libpod/cmd/podmanV2/containers"
_ "github.com/containers/libpod/cmd/podmanV2/images" _ "github.com/containers/libpod/cmd/podmanV2/images"
@ -31,17 +32,19 @@ func initCobra() {
case "darwin": case "darwin":
fallthrough fallthrough
case "windows": case "windows":
registry.GlobalFlags.EngineMode = entities.TunnelMode registry.EngineOpts.EngineMode = entities.TunnelMode
case "linux": case "linux":
registry.GlobalFlags.EngineMode = entities.ABIMode registry.EngineOpts.EngineMode = entities.ABIMode
default: default:
logrus.Errorf("%s is not a supported OS", runtime.GOOS) logrus.Errorf("%s is not a supported OS", runtime.GOOS)
os.Exit(1) os.Exit(1)
} }
// TODO: Is there a Cobra way to "peek" at os.Args? // TODO: Is there a Cobra way to "peek" at os.Args?
if ok := Contains("--remote", os.Args); ok { for _, v := range os.Args {
registry.GlobalFlags.EngineMode = entities.TunnelMode if strings.HasPrefix(v, "--remote") {
registry.EngineOpts.EngineMode = entities.TunnelMode
}
} }
cobra.OnInitialize(func() {}) cobra.OnInitialize(func() {})
@ -50,7 +53,7 @@ func initCobra() {
func main() { func main() {
fmt.Fprintf(os.Stderr, "Number of commands: %d\n", len(registry.Commands)) fmt.Fprintf(os.Stderr, "Number of commands: %d\n", len(registry.Commands))
for _, c := range registry.Commands { for _, c := range registry.Commands {
if Contains(registry.GlobalFlags.EngineMode, c.Mode) { if Contains(registry.EngineOpts.EngineMode, c.Mode) {
parent := rootCmd parent := rootCmd
if c.Parent != nil { if c.Parent != nil {
parent = c.Parent parent = c.Parent

View file

@ -14,11 +14,13 @@ type CliCommand struct {
} }
var ( var (
Commands []CliCommand Commands []CliCommand
GlobalFlags entities.EngineFlags
imageEngine entities.ImageEngine imageEngine entities.ImageEngine
containerEngine entities.ContainerEngine containerEngine entities.ContainerEngine
PodmanTunnel bool
EngineOpts entities.EngineOptions
GlobalFlags entities.EngineFlags
) )
// HelpTemplate returns the help template for podman commands // HelpTemplate returns the help template for podman commands
@ -63,7 +65,8 @@ func ImageEngine() entities.ImageEngine {
// NewImageEngine is a wrapper for building an ImageEngine to be used for PreRunE functions // NewImageEngine is a wrapper for building an ImageEngine to be used for PreRunE functions
func NewImageEngine(cmd *cobra.Command, args []string) (entities.ImageEngine, error) { func NewImageEngine(cmd *cobra.Command, args []string) (entities.ImageEngine, error) {
if imageEngine == nil { if imageEngine == nil {
engine, err := infra.NewImageEngine(GlobalFlags.EngineMode, entities.EngineOptions{}) EngineOpts.FlagSet = cmd.Flags()
engine, err := infra.NewImageEngine(EngineOpts)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -79,7 +82,8 @@ func ContainerEngine() entities.ContainerEngine {
// NewContainerEngine is a wrapper for building an ContainerEngine to be used for PreRunE functions // NewContainerEngine is a wrapper for building an ContainerEngine to be used for PreRunE functions
func NewContainerEngine(cmd *cobra.Command, args []string) (entities.ContainerEngine, error) { func NewContainerEngine(cmd *cobra.Command, args []string) (entities.ContainerEngine, error) {
if containerEngine == nil { if containerEngine == nil {
engine, err := infra.NewContainerEngine(GlobalFlags.EngineMode, entities.EngineOptions{}) EngineOpts.FlagSet = cmd.Flags()
engine, err := infra.NewContainerEngine(EngineOpts)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -24,7 +24,8 @@ func init() {
// Override default --help information of `--version` global flag} // Override default --help information of `--version` global flag}
var dummyVersion bool var dummyVersion bool
rootCmd.PersistentFlags().BoolVarP(&dummyVersion, "version", "v", false, "Version of podman") rootCmd.PersistentFlags().BoolVarP(&dummyVersion, "version", "v", false, "Version of podman")
rootCmd.PersistentFlags().BoolVarP(&registry.PodmanTunnel, "remote", "r", false, "Access service via SSH tunnel") rootCmd.PersistentFlags().StringVarP(&registry.EngineOpts.Uri, "remote", "r", "", "URL to access podman service")
rootCmd.PersistentFlags().StringSliceVarP(&registry.EngineOpts.Identities, "identity", "i", []string{}, "path to SSH identity file")
} }
func Execute() { func Execute() {

View file

@ -21,8 +21,12 @@ func ContainerExists(w http.ResponseWriter, r *http.Request) {
name := utils.GetName(r) name := utils.GetName(r)
_, err := runtime.LookupContainer(name) _, err := runtime.LookupContainer(name)
if err != nil { if err != nil {
utils.ContainerNotFound(w, name, err) if errors.Cause(err) == define.ErrNoSuchCtr {
utils.ContainerNotFound(w, name, err)
}
utils.InternalServerError(w, err)
return return
} }
utils.WriteResponse(w, http.StatusNoContent, "") utils.WriteResponse(w, http.StatusNoContent, "")
} }

View file

@ -165,8 +165,13 @@ func sshClient(_url *url.URL, identity string, secure bool) (*http.Client, error
} }
} }
port := _url.Port()
if port == "" {
port = "22"
}
bastion, err := ssh.Dial("tcp", bastion, err := ssh.Dial("tcp",
net.JoinHostPort(_url.Hostname(), _url.Port()), net.JoinHostPort(_url.Hostname(), port),
&ssh.ClientConfig{ &ssh.ClientConfig{
User: _url.User.Username(), User: _url.User.Username(),
Auth: []ssh.AuthMethod{auth}, Auth: []ssh.AuthMethod{auth},

View file

@ -1 +1,15 @@
package entities package entities
import "time"
type WaitOptions struct {
Condition string
Interval time.Duration
Latest bool
}
type WaitReport struct {
Id string
Error error
ExitCode int32
}

View file

@ -1,7 +1,6 @@
package entities package entities
import ( import (
"net/url"
"os/user" "os/user"
"path/filepath" "path/filepath"
@ -20,11 +19,13 @@ func (m EngineMode) String() string {
return string(m) return string(m)
} }
// FIXME: merge EngineOptions and EngineFlags
type EngineOptions struct { type EngineOptions struct {
Uri *url.URL Uri string
Identities []string Identities []string
FlagSet pflag.FlagSet FlagSet *pflag.FlagSet
Flags EngineFlags Flags EngineFlags
EngineMode EngineMode
} }
type EngineFlags struct { type EngineFlags struct {
@ -58,8 +59,6 @@ type EngineFlags struct {
Port int Port int
IdentityFile string IdentityFile string
IgnoreHosts bool IgnoreHosts bool
EngineMode EngineMode
} }
func NewEngineOptions() (EngineFlags, error) { func NewEngineOptions() (EngineFlags, error) {

View file

@ -5,22 +5,12 @@ import (
) )
type ContainerEngine interface { type ContainerEngine interface {
ContainerRuntime
PodRuntime
VolumeRuntime
}
type ContainerRuntime interface {
ContainerDelete(ctx context.Context, opts ContainerDeleteOptions) (*ContainerDeleteReport, error) ContainerDelete(ctx context.Context, opts ContainerDeleteOptions) (*ContainerDeleteReport, error)
ContainerPrune(ctx context.Context) (*ContainerPruneReport, error) ContainerPrune(ctx context.Context) (*ContainerPruneReport, error)
} ContainerExists(ctx context.Context, nameOrId string) (bool, error)
ContainerWait(ctx context.Context, namesOrIds []string, options WaitOptions) ([]WaitReport, error)
type PodRuntime interface {
PodDelete(ctx context.Context, opts PodPruneOptions) (*PodDeleteReport, error) PodDelete(ctx context.Context, opts PodPruneOptions) (*PodDeleteReport, error)
PodPrune(ctx context.Context) (*PodPruneReport, error) PodPrune(ctx context.Context) (*PodPruneReport, error)
}
type VolumeRuntime interface {
VolumeDelete(ctx context.Context, opts VolumeDeleteOptions) (*VolumeDeleteReport, error) VolumeDelete(ctx context.Context, opts VolumeDeleteOptions) (*VolumeDeleteReport, error)
VolumePrune(ctx context.Context) (*VolumePruneReport, error) VolumePrune(ctx context.Context) (*VolumePruneReport, error)
} }

View file

@ -0,0 +1,71 @@
// +build ABISupport
package abi
import (
"context"
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/adapter/shortcuts"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
)
// TODO: Should return *entities.ContainerExistsReport, error
func (ic *ContainerEngine) ContainerExists(ctx context.Context, nameOrId string) (bool, error) {
_, err := ic.Libpod.LookupContainer(nameOrId)
if err != nil && errors.Cause(err) != define.ErrNoSuchCtr {
return false, err
}
return err == nil, nil
}
func (ic *ContainerEngine) ContainerWait(ctx context.Context, namesOrIds []string, options entities.WaitOptions) ([]entities.WaitReport, error) {
var (
responses []entities.WaitReport
)
condition, err := define.StringToContainerStatus(options.Condition)
if err != nil {
return nil, err
}
ctrs, err := shortcuts.GetContainersByContext(false, options.Latest, namesOrIds, ic.Libpod)
if err != nil {
return nil, err
}
for _, c := range ctrs {
response := entities.WaitReport{Id: c.ID()}
exitCode, err := c.WaitForConditionWithInterval(options.Interval, condition)
if err != nil {
response.Error = err
} else {
response.ExitCode = exitCode
}
responses = append(responses, response)
}
return responses, nil
}
func (ic *ContainerEngine) ContainerDelete(ctx context.Context, opts entities.ContainerDeleteOptions) (*entities.ContainerDeleteReport, error) {
panic("implement me")
}
func (ic *ContainerEngine) ContainerPrune(ctx context.Context) (*entities.ContainerPruneReport, error) {
panic("implement me")
}
func (ic *ContainerEngine) PodDelete(ctx context.Context, opts entities.PodPruneOptions) (*entities.PodDeleteReport, error) {
panic("implement me")
}
func (ic *ContainerEngine) PodPrune(ctx context.Context) (*entities.PodPruneReport, error) {
panic("implement me")
}
func (ic *ContainerEngine) VolumeDelete(ctx context.Context, opts entities.VolumeDeleteOptions) (*entities.VolumeDeleteReport, error) {
panic("implement me")
}
func (ic *ContainerEngine) VolumePrune(ctx context.Context) (*entities.VolumePruneReport, error) {
panic("implement me")
}

View file

@ -4,7 +4,6 @@ package abi
import ( import (
"github.com/containers/libpod/libpod" "github.com/containers/libpod/libpod"
"github.com/containers/libpod/pkg/domain/entities"
) )
// Image-related runtime linked against libpod library // Image-related runtime linked against libpod library
@ -14,6 +13,5 @@ type ImageEngine struct {
// Container-related runtime linked against libpod library // Container-related runtime linked against libpod library
type ContainerEngine struct { type ContainerEngine struct {
entities.ContainerEngine
Libpod *libpod.Runtime Libpod *libpod.Runtime
} }

View file

@ -8,32 +8,31 @@ import (
"github.com/containers/libpod/pkg/bindings" "github.com/containers/libpod/pkg/bindings"
"github.com/containers/libpod/pkg/domain/entities" "github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/domain/infra/abi"
"github.com/containers/libpod/pkg/domain/infra/tunnel" "github.com/containers/libpod/pkg/domain/infra/tunnel"
) )
// NewContainerEngine factory provides a libpod runtime for container-related operations // NewContainerEngine factory provides a libpod runtime for container-related operations
func NewContainerEngine(mode entities.EngineMode, opts entities.EngineOptions) (entities.ContainerEngine, error) { func NewContainerEngine(opts entities.EngineOptions) (entities.ContainerEngine, error) {
switch mode { switch opts.EngineMode {
case entities.ABIMode: case entities.ABIMode:
r, err := NewLibpodRuntime(opts.FlagSet, opts.Flags) r, err := NewLibpodRuntime(opts.FlagSet, opts.Flags)
return &abi.ContainerEngine{ContainerEngine: r}, err return r, err
case entities.TunnelMode: case entities.TunnelMode:
ctx, err := bindings.NewConnection(context.Background(), opts.Uri.String(), opts.Identities...) ctx, err := bindings.NewConnection(context.Background(), opts.Uri, opts.Identities...)
return &tunnel.ContainerEngine{ClientCxt: ctx}, err return &tunnel.ContainerEngine{ClientCxt: ctx}, err
} }
return nil, fmt.Errorf("runtime mode '%v' is not supported", mode) return nil, fmt.Errorf("runtime mode '%v' is not supported", opts.EngineMode)
} }
// NewContainerEngine factory provides a libpod runtime for image-related operations // NewContainerEngine factory provides a libpod runtime for image-related operations
func NewImageEngine(mode entities.EngineMode, opts entities.EngineOptions) (entities.ImageEngine, error) { func NewImageEngine(opts entities.EngineOptions) (entities.ImageEngine, error) {
switch mode { switch opts.EngineMode {
case entities.ABIMode: case entities.ABIMode:
r, err := NewLibpodImageRuntime(opts.FlagSet, opts.Flags) r, err := NewLibpodImageRuntime(opts.FlagSet, opts.Flags)
return r, err return r, err
case entities.TunnelMode: case entities.TunnelMode:
ctx, err := bindings.NewConnection(context.Background(), opts.Uri.String(), opts.Identities...) ctx, err := bindings.NewConnection(context.Background(), opts.Uri, opts.Identities...)
return &tunnel.ImageEngine{ClientCxt: ctx}, err return &tunnel.ImageEngine{ClientCxt: ctx}, err
} }
return nil, fmt.Errorf("runtime mode '%v' is not supported", mode) return nil, fmt.Errorf("runtime mode '%v' is not supported", opts.EngineMode)
} }

View file

@ -12,14 +12,10 @@ import (
// ContainerEngine Image Proxy will be EOL'ed after podmanV2 is separated from libpod repo // ContainerEngine Image Proxy will be EOL'ed after podmanV2 is separated from libpod repo
func NewLibpodImageRuntime(flags pflag.FlagSet, opts entities.EngineFlags) (entities.ImageEngine, error) { func NewLibpodImageRuntime(flags *pflag.FlagSet, opts entities.EngineFlags) (entities.ImageEngine, error) {
r, err := GetRuntime(context.Background(), flags, opts) r, err := GetRuntime(context.Background(), flags, opts)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &abi.ImageEngine{Libpod: r}, nil return &abi.ImageEngine{Libpod: r}, nil
} }
func (ir *runtime) ShutdownImageRuntime(force bool) error {
return ir.Libpod.Shutdown(force)
}

View file

@ -26,7 +26,7 @@ type engineOpts struct {
} }
// GetRuntimeMigrate gets a libpod runtime that will perform a migration of existing containers // GetRuntimeMigrate gets a libpod runtime that will perform a migration of existing containers
func GetRuntimeMigrate(ctx context.Context, fs flag.FlagSet, ef entities.EngineFlags, newRuntime string) (*libpod.Runtime, error) { func GetRuntimeMigrate(ctx context.Context, fs *flag.FlagSet, ef entities.EngineFlags, newRuntime string) (*libpod.Runtime, error) {
return getRuntime(ctx, fs, &engineOpts{ return getRuntime(ctx, fs, &engineOpts{
name: newRuntime, name: newRuntime,
renumber: false, renumber: false,
@ -38,7 +38,7 @@ func GetRuntimeMigrate(ctx context.Context, fs flag.FlagSet, ef entities.EngineF
} }
// GetRuntimeDisableFDs gets a libpod runtime that will disable sd notify // GetRuntimeDisableFDs gets a libpod runtime that will disable sd notify
func GetRuntimeDisableFDs(ctx context.Context, fs flag.FlagSet, ef entities.EngineFlags) (*libpod.Runtime, error) { func GetRuntimeDisableFDs(ctx context.Context, fs *flag.FlagSet, ef entities.EngineFlags) (*libpod.Runtime, error) {
return getRuntime(ctx, fs, &engineOpts{ return getRuntime(ctx, fs, &engineOpts{
renumber: false, renumber: false,
migrate: false, migrate: false,
@ -49,7 +49,7 @@ func GetRuntimeDisableFDs(ctx context.Context, fs flag.FlagSet, ef entities.Engi
} }
// GetRuntimeRenumber gets a libpod runtime that will perform a lock renumber // GetRuntimeRenumber gets a libpod runtime that will perform a lock renumber
func GetRuntimeRenumber(ctx context.Context, fs flag.FlagSet, ef entities.EngineFlags) (*libpod.Runtime, error) { func GetRuntimeRenumber(ctx context.Context, fs *flag.FlagSet, ef entities.EngineFlags) (*libpod.Runtime, error) {
return getRuntime(ctx, fs, &engineOpts{ return getRuntime(ctx, fs, &engineOpts{
renumber: true, renumber: true,
migrate: false, migrate: false,
@ -60,7 +60,7 @@ func GetRuntimeRenumber(ctx context.Context, fs flag.FlagSet, ef entities.Engine
} }
// GetRuntime generates a new libpod runtime configured by command line options // GetRuntime generates a new libpod runtime configured by command line options
func GetRuntime(ctx context.Context, flags flag.FlagSet, ef entities.EngineFlags) (*libpod.Runtime, error) { func GetRuntime(ctx context.Context, flags *flag.FlagSet, ef entities.EngineFlags) (*libpod.Runtime, error) {
return getRuntime(ctx, flags, &engineOpts{ return getRuntime(ctx, flags, &engineOpts{
renumber: false, renumber: false,
migrate: false, migrate: false,
@ -71,7 +71,7 @@ func GetRuntime(ctx context.Context, flags flag.FlagSet, ef entities.EngineFlags
} }
// GetRuntimeNoStore generates a new libpod runtime configured by command line options // GetRuntimeNoStore generates a new libpod runtime configured by command line options
func GetRuntimeNoStore(ctx context.Context, fs flag.FlagSet, ef entities.EngineFlags) (*libpod.Runtime, error) { func GetRuntimeNoStore(ctx context.Context, fs *flag.FlagSet, ef entities.EngineFlags) (*libpod.Runtime, error) {
return getRuntime(ctx, fs, &engineOpts{ return getRuntime(ctx, fs, &engineOpts{
renumber: false, renumber: false,
migrate: false, migrate: false,
@ -81,7 +81,7 @@ func GetRuntimeNoStore(ctx context.Context, fs flag.FlagSet, ef entities.EngineF
}) })
} }
func getRuntime(ctx context.Context, fs flag.FlagSet, opts *engineOpts) (*libpod.Runtime, error) { func getRuntime(ctx context.Context, fs *flag.FlagSet, opts *engineOpts) (*libpod.Runtime, error) {
options := []libpod.RuntimeOption{} options := []libpod.RuntimeOption{}
storageOpts := storage.StoreOptions{} storageOpts := storage.StoreOptions{}
storageSet := false storageSet := false

View file

@ -5,50 +5,17 @@ package infra
import ( import (
"context" "context"
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/pkg/domain/entities" "github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/domain/infra/abi"
flag "github.com/spf13/pflag" flag "github.com/spf13/pflag"
) )
// ContainerEngine Proxy will be EOL'ed after podmanV2 is separated from libpod repo // ContainerEngine Proxy will be EOL'ed after podmanV2 is separated from libpod repo
type runtime struct { func NewLibpodRuntime(flags *flag.FlagSet, opts entities.EngineFlags) (entities.ContainerEngine, error) {
entities.ContainerEngine
Libpod *libpod.Runtime
}
func NewLibpodRuntime(flags flag.FlagSet, opts entities.EngineFlags) (entities.ContainerEngine, error) {
r, err := GetRuntime(context.Background(), flags, opts) r, err := GetRuntime(context.Background(), flags, opts)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &runtime{Libpod: r}, nil return &abi.ContainerEngine{Libpod: r}, nil
}
func (r *runtime) ShutdownRuntime(force bool) error {
return r.Libpod.Shutdown(force)
}
func (r *runtime) ContainerDelete(ctx context.Context, opts entities.ContainerDeleteOptions) (*entities.ContainerDeleteReport, error) {
panic("implement me")
}
func (r *runtime) ContainerPrune(ctx context.Context) (*entities.ContainerPruneReport, error) {
panic("implement me")
}
func (r *runtime) PodDelete(ctx context.Context, opts entities.PodPruneOptions) (*entities.PodDeleteReport, error) {
panic("implement me")
}
func (r *runtime) PodPrune(ctx context.Context) (*entities.PodPruneReport, error) {
panic("implement me")
}
func (r *runtime) VolumeDelete(ctx context.Context, opts entities.VolumeDeleteOptions) (*entities.VolumeDeleteReport, error) {
panic("implement me")
}
func (r *runtime) VolumePrune(ctx context.Context) (*entities.VolumePruneReport, error) {
panic("implement me")
} }

View file

@ -11,25 +11,25 @@ import (
"github.com/containers/libpod/pkg/domain/infra/tunnel" "github.com/containers/libpod/pkg/domain/infra/tunnel"
) )
func NewContainerEngine(mode entities.EngineMode, opts entities.EngineOptions) (entities.ContainerEngine, error) { func NewContainerEngine(opts entities.EngineOptions) (entities.ContainerEngine, error) {
switch mode { switch opts.EngineMode {
case entities.ABIMode: case entities.ABIMode:
return nil, fmt.Errorf("direct runtime not supported") return nil, fmt.Errorf("direct runtime not supported")
case entities.TunnelMode: case entities.TunnelMode:
ctx, err := bindings.NewConnection(context.Background(), opts.Uri.String(), opts.Identities...) ctx, err := bindings.NewConnection(context.Background(), opts.Uri, opts.Identities...)
return &tunnel.ContainerEngine{ClientCxt: ctx}, err return &tunnel.ContainerEngine{ClientCxt: ctx}, err
} }
return nil, fmt.Errorf("runtime mode '%v' is not supported", mode) return nil, fmt.Errorf("runtime mode '%v' is not supported", opts.EngineMode)
} }
// NewImageEngine factory provides a libpod runtime for image-related operations // NewImageEngine factory provides a libpod runtime for image-related operations
func NewImageEngine(mode entities.EngineMode, opts entities.EngineOptions) (entities.ImageEngine, error) { func NewImageEngine(opts entities.EngineOptions) (entities.ImageEngine, error) {
switch mode { switch opts.EngineMode {
case entities.ABIMode: case entities.ABIMode:
return nil, fmt.Errorf("direct image runtime not supported") return nil, fmt.Errorf("direct image runtime not supported")
case entities.TunnelMode: case entities.TunnelMode:
ctx, err := bindings.NewConnection(context.Background(), opts.Uri.String(), opts.Identities...) ctx, err := bindings.NewConnection(context.Background(), opts.Uri, opts.Identities...)
return &tunnel.ImageEngine{ClientCxt: ctx}, err return &tunnel.ImageEngine{ClientCxt: ctx}, err
} }
return nil, fmt.Errorf("runtime mode '%v' is not supported", mode) return nil, fmt.Errorf("runtime mode '%v' is not supported", opts.EngineMode)
} }

View file

@ -0,0 +1,24 @@
package tunnel
import (
"context"
"github.com/containers/libpod/pkg/bindings/containers"
"github.com/containers/libpod/pkg/domain/entities"
)
func (ic *ContainerEngine) ContainerExists(ctx context.Context, nameOrId string) (bool, error) {
return containers.Exists(ctx, nameOrId)
}
func (ic *ContainerEngine) ContainerWait(ctx context.Context, namesOrIds []string, options entities.WaitOptions) ([]entities.WaitReport, error) {
return nil, nil
}
func (r *ContainerEngine) ContainerDelete(ctx context.Context, opts entities.ContainerDeleteOptions) (*entities.ContainerDeleteReport, error) {
panic("implement me")
}
func (r *ContainerEngine) ContainerPrune(ctx context.Context) (*entities.ContainerPruneReport, error) {
panic("implement me")
}

View file

@ -16,18 +16,6 @@ type ContainerEngine struct {
ClientCxt context.Context ClientCxt context.Context
} }
func (r *ContainerEngine) Shutdown(force bool) error {
return nil
}
func (r *ContainerEngine) ContainerDelete(ctx context.Context, opts entities.ContainerDeleteOptions) (*entities.ContainerDeleteReport, error) {
panic("implement me")
}
func (r *ContainerEngine) ContainerPrune(ctx context.Context) (*entities.ContainerPruneReport, error) {
panic("implement me")
}
func (r *ContainerEngine) PodDelete(ctx context.Context, opts entities.PodPruneOptions) (*entities.PodDeleteReport, error) { func (r *ContainerEngine) PodDelete(ctx context.Context, opts entities.PodPruneOptions) (*entities.PodDeleteReport, error) {
panic("implement me") panic("implement me")
} }