From 341f91da480bbf337dfb13107389307835b1f0c3 Mon Sep 17 00:00:00 2001 From: baude Date: Tue, 15 Jan 2019 14:31:03 -0600 Subject: Collaberative podman-remote container exists Began frameout of container super structs for adapted methods. This allows for the use of container exists. Signed-off-by: baude --- cmd/podman/exists.go | 8 ++-- cmd/podman/images.go | 5 ++- cmd/podman/varlink/io.podman.varlink | 2 +- libpod/adapter/runtime.go | 14 +++++++ libpod/adapter/runtime_remote.go | 74 ++++++++++++++++++++++++++++++++++-- 5 files changed, 92 insertions(+), 11 deletions(-) diff --git a/cmd/podman/exists.go b/cmd/podman/exists.go index e6d2c8a11..a957e1ef7 100644 --- a/cmd/podman/exists.go +++ b/cmd/podman/exists.go @@ -88,13 +88,13 @@ func containerExistsCmd(c *cli.Context) error { if len(args) > 1 || len(args) < 1 { return errors.New("you may only check for the existence of one container at a time") } - runtime, err := libpodruntime.GetRuntime(c) + runtime, err := adapter.GetRuntime(c) if err != nil { return errors.Wrapf(err, "could not get runtime") } - defer runtime.Shutdown(false) - if _, err := runtime.LookupContainer(args[0]); err != nil { - if errors.Cause(err) == libpod.ErrNoSuchCtr { + defer runtime.Runtime.Shutdown(false) + if _, err := runtime.Runtime.LookupContainer(args[0]); err != nil { + if errors.Cause(err) == libpod.ErrNoSuchCtr || err.Error() == "io.podman.ContainerNotFound" { os.Exit(1) } return err diff --git a/cmd/podman/images.go b/cmd/podman/images.go index 2b4187a9a..7f2fb7ae0 100644 --- a/cmd/podman/images.go +++ b/cmd/podman/images.go @@ -2,14 +2,15 @@ package main import ( "context" - "github.com/containers/libpod/cmd/podman/imagefilters" - "github.com/containers/libpod/libpod/adapter" "reflect" "sort" "strings" "time" "unicode" + "github.com/containers/libpod/cmd/podman/imagefilters" + "github.com/containers/libpod/libpod/adapter" + "github.com/containers/libpod/cmd/podman/formats" "github.com/containers/libpod/libpod/image" "github.com/docker/go-units" diff --git a/cmd/podman/varlink/io.podman.varlink b/cmd/podman/varlink/io.podman.varlink index a3e8c050e..c6f1d3f1b 100644 --- a/cmd/podman/varlink/io.podman.varlink +++ b/cmd/podman/varlink/io.podman.varlink @@ -61,7 +61,7 @@ type ImageSearch ( star_count: int ) -# ListContainer is the returned struct for an individual container +# ListContainerData is the returned struct for an individual container type ListContainerData ( id: string, image: string, diff --git a/libpod/adapter/runtime.go b/libpod/adapter/runtime.go index 883ae2c76..b49c91403 100644 --- a/libpod/adapter/runtime.go +++ b/libpod/adapter/runtime.go @@ -24,6 +24,11 @@ type ContainerImage struct { *image.Image } +// Container ... +type Container struct { + *libpod.Container +} + // GetRuntime returns a LocalRuntime struct with the actual runtime embedded in it func GetRuntime(c *cli.Context) (*LocalRuntime, error) { runtime, err := libpodruntime.GetRuntime(c) @@ -85,3 +90,12 @@ func (r *LocalRuntime) New(ctx context.Context, name, signaturePolicyPath, authf func (r *LocalRuntime) RemoveImage(ctx context.Context, img *ContainerImage, force bool) (string, error) { return r.Runtime.RemoveImage(ctx, img.Image, force) } + +// LookupContainer ... +func (r *LocalRuntime) LookupContainer(idOrName string) (*Container, error) { + ctr, err := r.Runtime.LookupContainer(idOrName) + if err != nil { + return nil, err + } + return &Container{ctr}, nil +} diff --git a/libpod/adapter/runtime_remote.go b/libpod/adapter/runtime_remote.go index 5413385d2..48dcf76a9 100644 --- a/libpod/adapter/runtime_remote.go +++ b/libpod/adapter/runtime_remote.go @@ -22,8 +22,12 @@ type RemoteImageRuntime struct{} // RemoteRuntime describes a wrapper runtime struct type RemoteRuntime struct { + Conn *varlink.Connection } +//func (r *LocalRuntime) LookupContainer(idOrName string) (*Container, error) { +// if _, err := runtime.Runtime.LookupContainer(args[0]); err != nil { + // LocalRuntime describes a typical libpod runtime type LocalRuntime struct { Runtime *RemoteRuntime @@ -38,6 +42,7 @@ func GetRuntime(c *cli.Context) (*LocalRuntime, error) { if err != nil { return nil, err } + runtime.Conn = conn return &LocalRuntime{ Runtime: &runtime, Remote: true, @@ -70,6 +75,30 @@ type remoteImage struct { Runtime *LocalRuntime } +// Container ... +type Container struct { + remoteContainer +} + +// remoteContainer .... +type remoteContainer struct { + ID string + Image string + ImageID string + Command []string + Created time.Time + RunningFor string + Status string + //Ports []ocicni.PortMapping + RootFsSize int64 + RWSize int64 + Names string + Labels []map[string]string + // Mounts []string + // ContainerRunning bool + //Namespaces []LinuxNameSpace +} + // GetImages returns a slice of containerimages over a varlink connection func (r *LocalRuntime) GetImages() ([]*ContainerImage, error) { var newImages []*ContainerImage @@ -213,10 +242,6 @@ func (ci *ContainerImage) TagImage(tag string) error { return err } -func (r RemoteRuntime) RemoveImage(force bool) error { - return nil -} - // RemoveImage calls varlink to remove an image func (r *LocalRuntime) RemoveImage(ctx context.Context, img *ContainerImage, force bool) (string, error) { return iopodman.RemoveImage().Call(r.Conn, img.InputName, force) @@ -246,3 +271,44 @@ func (ci *ContainerImage) History(ctx context.Context) ([]*image.History, error) } return imageHistories, nil } + +// LookupContainer ... +func (r *RemoteRuntime) LookupContainer(idOrName string) (*Container, error) { + container, err := iopodman.GetContainer().Call(r.Conn, idOrName) + if err != nil { + return nil, err + } + + ctr, err := listContainerDataToContainer(container) + if err != nil { + return nil, err + } + return ctr, nil +} + +// listContainerDataToContainer takes a varlink listcontainerData struct and makes +// an "adapted" Container +func listContainerDataToContainer(listData iopodman.ListContainerData) (*Container, error) { + created, err := splitStringDate(listData.Createdat) + if err != nil { + return nil, err + } + rc := remoteContainer{ + ID: listData.Id, + Image: listData.Image, + ImageID: listData.Imageid, + Command: listData.Command, + Created: created, + RunningFor: listData.Runningfor, + Status: listData.Status, + //ports: //map[ocicni.portmapping] + RootFsSize: listData.Rootfssize, + RWSize: listData.Rwsize, + Names: listData.Names, + //Labels: + //Mounts + //ContainerRunning: listData.r + //namespaces: + } + return &Container{rc}, nil +} -- cgit v1.2.3-54-g00ecf From e68f03ae45adbaa539c7470aa5f99dc870c185dc Mon Sep 17 00:00:00 2001 From: baude Date: Tue, 15 Jan 2019 14:44:46 -0600 Subject: Embed runtime struct in super localRuntime We clean up the code by eliminating stuttering references when we embed the runtime struct into localRuntime. Makes for less change in the future as well. ++ jhonce Signed-off-by: baude --- cmd/podman/exists.go | 6 +++--- cmd/podman/history.go | 4 ++-- cmd/podman/images.go | 5 ++--- cmd/podman/info.go | 6 +++--- cmd/podman/pull.go | 4 ++-- cmd/podman/rmi.go | 2 +- cmd/podman/tag.go | 2 +- libpod/adapter/runtime.go | 4 ++-- libpod/adapter/runtime_remote.go | 40 ++++++++++++++++++---------------------- 9 files changed, 34 insertions(+), 39 deletions(-) diff --git a/cmd/podman/exists.go b/cmd/podman/exists.go index a957e1ef7..a7601aaa2 100644 --- a/cmd/podman/exists.go +++ b/cmd/podman/exists.go @@ -71,7 +71,7 @@ func imageExistsCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get runtime") } - defer runtime.Runtime.Shutdown(false) + defer runtime.Shutdown(false) if _, err := runtime.NewImageFromLocal(args[0]); err != nil { //TODO we need to ask about having varlink defined errors exposed //so we can reuse them @@ -92,8 +92,8 @@ func containerExistsCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get runtime") } - defer runtime.Runtime.Shutdown(false) - if _, err := runtime.Runtime.LookupContainer(args[0]); err != nil { + defer runtime.Shutdown(false) + if _, err := runtime.LookupContainer(args[0]); err != nil { if errors.Cause(err) == libpod.ErrNoSuchCtr || err.Error() == "io.podman.ContainerNotFound" { os.Exit(1) } diff --git a/cmd/podman/history.go b/cmd/podman/history.go index 802047071..8a9b6cd94 100644 --- a/cmd/podman/history.go +++ b/cmd/podman/history.go @@ -1,13 +1,13 @@ package main import ( - "github.com/containers/libpod/libpod/adapter" "reflect" "strconv" "strings" "time" "github.com/containers/libpod/cmd/podman/formats" + "github.com/containers/libpod/libpod/adapter" "github.com/containers/libpod/libpod/image" "github.com/docker/go-units" "github.com/pkg/errors" @@ -76,7 +76,7 @@ func historyCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get runtime") } - defer runtime.Runtime.Shutdown(false) + defer runtime.Shutdown(false) format := genHistoryFormat(c.String("format"), c.Bool("quiet")) diff --git a/cmd/podman/images.go b/cmd/podman/images.go index 7f2fb7ae0..031f06618 100644 --- a/cmd/podman/images.go +++ b/cmd/podman/images.go @@ -8,10 +8,9 @@ import ( "time" "unicode" + "github.com/containers/libpod/cmd/podman/formats" "github.com/containers/libpod/cmd/podman/imagefilters" "github.com/containers/libpod/libpod/adapter" - - "github.com/containers/libpod/cmd/podman/formats" "github.com/containers/libpod/libpod/image" "github.com/docker/go-units" "github.com/opencontainers/go-digest" @@ -157,7 +156,7 @@ func imagesCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "Could not get runtime") } - defer runtime.Runtime.Shutdown(false) + defer runtime.Shutdown(false) if len(c.Args()) == 1 { newImage, err = runtime.NewImageFromLocal(c.Args().Get(0)) if err != nil { diff --git a/cmd/podman/info.go b/cmd/podman/info.go index 1ec4011da..c33ede548 100644 --- a/cmd/podman/info.go +++ b/cmd/podman/info.go @@ -1,11 +1,11 @@ package main import ( - "github.com/containers/libpod/libpod/adapter" "runtime" "github.com/containers/libpod/cmd/podman/formats" "github.com/containers/libpod/libpod" + "github.com/containers/libpod/libpod/adapter" "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -43,9 +43,9 @@ func infoCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get runtime") } - defer runtime.Runtime.Shutdown(false) + defer runtime.Shutdown(false) - infoArr, err := runtime.Runtime.Info() + infoArr, err := runtime.Info() if err != nil { return errors.Wrapf(err, "error getting info") } diff --git a/cmd/podman/pull.go b/cmd/podman/pull.go index d81457c67..2a78d0c54 100644 --- a/cmd/podman/pull.go +++ b/cmd/podman/pull.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "github.com/containers/libpod/libpod/adapter" "io" "os" "strings" @@ -10,6 +9,7 @@ import ( dockerarchive "github.com/containers/image/docker/archive" "github.com/containers/image/transports/alltransports" "github.com/containers/image/types" + "github.com/containers/libpod/libpod/adapter" image2 "github.com/containers/libpod/libpod/image" "github.com/containers/libpod/pkg/util" "github.com/pkg/errors" @@ -68,7 +68,7 @@ func pullCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get runtime") } - defer runtime.Runtime.Shutdown(false) + defer runtime.Shutdown(false) args := c.Args() if len(args) == 0 { diff --git a/cmd/podman/rmi.go b/cmd/podman/rmi.go index 58a78a924..fbf860eb2 100644 --- a/cmd/podman/rmi.go +++ b/cmd/podman/rmi.go @@ -61,7 +61,7 @@ func rmiCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get runtime") } - defer runtime.Runtime.Shutdown(false) + defer runtime.Shutdown(false) args := c.Args() if len(args) == 0 && !removeAll { diff --git a/cmd/podman/tag.go b/cmd/podman/tag.go index 8e92ca2fa..d19cf69a2 100644 --- a/cmd/podman/tag.go +++ b/cmd/podman/tag.go @@ -27,7 +27,7 @@ func tagCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not create runtime") } - defer runtime.Runtime.Shutdown(false) + defer runtime.Shutdown(false) newImage, err := runtime.NewImageFromLocal(args[0]) if err != nil { diff --git a/libpod/adapter/runtime.go b/libpod/adapter/runtime.go index b49c91403..1f3599082 100644 --- a/libpod/adapter/runtime.go +++ b/libpod/adapter/runtime.go @@ -15,8 +15,8 @@ import ( // LocalRuntime describes a typical libpod runtime type LocalRuntime struct { - Runtime *libpod.Runtime - Remote bool + *libpod.Runtime + Remote bool } // ContainerImage ... diff --git a/libpod/adapter/runtime_remote.go b/libpod/adapter/runtime_remote.go index 48dcf76a9..8ef8fe167 100644 --- a/libpod/adapter/runtime_remote.go +++ b/libpod/adapter/runtime_remote.go @@ -22,17 +22,13 @@ type RemoteImageRuntime struct{} // RemoteRuntime describes a wrapper runtime struct type RemoteRuntime struct { - Conn *varlink.Connection + Conn *varlink.Connection + Remote bool } -//func (r *LocalRuntime) LookupContainer(idOrName string) (*Container, error) { -// if _, err := runtime.Runtime.LookupContainer(args[0]); err != nil { - // LocalRuntime describes a typical libpod runtime type LocalRuntime struct { - Runtime *RemoteRuntime - Remote bool - Conn *varlink.Connection + *RemoteRuntime } // GetRuntime returns a LocalRuntime struct with the actual runtime embedded in it @@ -42,12 +38,14 @@ func GetRuntime(c *cli.Context) (*LocalRuntime, error) { if err != nil { return nil, err } - runtime.Conn = conn - return &LocalRuntime{ - Runtime: &runtime, - Remote: true, - Conn: conn, - }, nil + rr := RemoteRuntime{ + Conn: conn, + Remote: true, + } + foo := LocalRuntime{ + &rr, + } + return &foo, nil } // Shutdown is a bogus wrapper for compat with the libpod runtime @@ -272,18 +270,14 @@ func (ci *ContainerImage) History(ctx context.Context) ([]*image.History, error) return imageHistories, nil } -// LookupContainer ... +// LookupContainer gets basic information about container over a varlink +// connection and then translates it to a *Container func (r *RemoteRuntime) LookupContainer(idOrName string) (*Container, error) { container, err := iopodman.GetContainer().Call(r.Conn, idOrName) if err != nil { return nil, err } - - ctr, err := listContainerDataToContainer(container) - if err != nil { - return nil, err - } - return ctr, nil + return listContainerDataToContainer(container) } // listContainerDataToContainer takes a varlink listcontainerData struct and makes @@ -294,6 +288,8 @@ func listContainerDataToContainer(listData iopodman.ListContainerData) (*Contain return nil, err } rc := remoteContainer{ + // TODO commented out attributes will be populated when podman-remote ps + // is implemented. They are not needed yet for basic container operations. ID: listData.Id, Image: listData.Image, ImageID: listData.Imageid, @@ -301,13 +297,13 @@ func listContainerDataToContainer(listData iopodman.ListContainerData) (*Contain Created: created, RunningFor: listData.Runningfor, Status: listData.Status, - //ports: //map[ocicni.portmapping] + //ports: RootFsSize: listData.Rootfssize, RWSize: listData.Rwsize, Names: listData.Names, //Labels: //Mounts - //ContainerRunning: listData.r + //ContainerRunning: //namespaces: } return &Container{rc}, nil -- cgit v1.2.3-54-g00ecf