diff options
author | umohnani8 <umohnani@redhat.com> | 2017-11-29 16:56:18 -0500 |
---|---|---|
committer | umohnani8 <umohnani@redhat.com> | 2017-12-12 09:46:23 -0500 |
commit | 74ee579375654c79fa710f13b7c2ee3810366f82 (patch) | |
tree | 36f1b98582875e497b7e76457cb969d85cef6426 /libkpod/container_data.go | |
parent | 88121e0747c03084c233d22fadfd3c227e73a885 (diff) | |
download | podman-74ee579375654c79fa710f13b7c2ee3810366f82.tar.gz podman-74ee579375654c79fa710f13b7c2ee3810366f82.tar.bz2 podman-74ee579375654c79fa710f13b7c2ee3810366f82.zip |
Update kpod inspect to use the new container state
kpod inspect now uses the new libpod container state
and closely matches the output of docker inspect
some aspects of it are still WIP as the libpod container state
is still being worked on
Signed-off-by: umohnani8 <umohnani@redhat.com>
Diffstat (limited to 'libkpod/container_data.go')
-rw-r--r-- | libkpod/container_data.go | 210 |
1 files changed, 0 insertions, 210 deletions
diff --git a/libkpod/container_data.go b/libkpod/container_data.go deleted file mode 100644 index eb84aa42d..000000000 --- a/libkpod/container_data.go +++ /dev/null @@ -1,210 +0,0 @@ -package libkpod - -import ( - "encoding/json" - "os" - "time" - - "k8s.io/apimachinery/pkg/fields" - pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime" - - "github.com/opencontainers/image-spec/specs-go/v1" - specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" - "github.com/projectatomic/libpod/libpod/driver" - "github.com/projectatomic/libpod/libpod/images" - "github.com/projectatomic/libpod/oci" -) - -// ContainerData handles the data used when inspecting a container -type ContainerData struct { - ID string - Name string - LogPath string - Labels fields.Set - Annotations fields.Set - State *ContainerState - Metadata *pb.ContainerMetadata - BundlePath string - StopSignal string - FromImage string `json:"Image,omitempty"` - FromImageID string `json:"ImageID"` - MountPoint string `json:"Mountpoint,omitempty"` - MountLabel string - Mounts []specs.Mount - AppArmorProfile string - ImageAnnotations map[string]string `json:"Annotations,omitempty"` - ImageCreatedBy string `json:"CreatedBy,omitempty"` - Config v1.ImageConfig `json:"Config,omitempty"` - SizeRw uint `json:"SizeRw,omitempty"` - SizeRootFs uint `json:"SizeRootFs,omitempty"` - Args []string - ResolvConfPath string - HostnamePath string - HostsPath string - GraphDriver driverData -} - -type driverData struct { - Name string - Data map[string]string -} - -// ContainerState represents the status of a container. -type ContainerState struct { - specs.State - Created time.Time `json:"created"` - Started time.Time `json:"started,omitempty"` - Finished time.Time `json:"finished,omitempty"` - ExitCode int32 `json:"exitCode"` - OOMKilled bool `json:"oomKilled,omitempty"` - Error string `json:"error,omitempty"` -} - -// GetContainerData gets the ContainerData for a container with the given name in the given store. -// If size is set to true, it will also determine the size of the container -func (c *ContainerServer) GetContainerData(name string, size bool) (*ContainerData, error) { - ctr, err := c.inspectContainer(name) - if err != nil { - return nil, errors.Wrapf(err, "error reading build container %q", name) - } - container, err := c.store.Container(name) - if err != nil { - return nil, errors.Wrapf(err, "error reading container data") - } - - // The runtime configuration won't exist if the container has never been started by cri-o or kpod, - // so treat a not-exist error as non-fatal. - m := getBlankSpec() - config, err := c.store.FromContainerDirectory(ctr.ID(), "config.json") - if err != nil && !os.IsNotExist(errors.Cause(err)) { - return nil, err - } - if len(config) > 0 { - if err = json.Unmarshal(config, &m); err != nil { - return nil, err - } - } - - if container.ImageID == "" { - return nil, errors.Errorf("error reading container image data: container is not based on an image") - } - imageData, err := images.GetData(c.store, container.ImageID) - if err != nil { - return nil, errors.Wrapf(err, "error reading container image data") - } - - driverName, err := driver.GetDriverName(c.store) - if err != nil { - return nil, err - } - topLayer, err := c.GetContainerTopLayerID(ctr.ID()) - if err != nil { - return nil, err - } - layer, err := c.store.Layer(topLayer) - if err != nil { - return nil, err - } - driverMetadata, err := driver.GetDriverMetadata(c.store, topLayer) - if err != nil { - return nil, err - } - imageName := "" - if len(imageData.Tags) > 0 { - imageName = imageData.Tags[0] - } else if len(imageData.Digests) > 0 { - imageName = imageData.Digests[0] - } - data := &ContainerData{ - ID: ctr.ID(), - Name: ctr.Name(), - LogPath: ctr.LogPath(), - Labels: ctr.Labels(), - Annotations: ctr.Annotations(), - State: c.State(ctr), - Metadata: ctr.Metadata(), - BundlePath: ctr.BundlePath(), - StopSignal: ctr.GetStopSignal(), - Args: m.Process.Args, - FromImage: imageName, - FromImageID: container.ImageID, - MountPoint: layer.MountPoint, - ImageAnnotations: imageData.Annotations, - ImageCreatedBy: imageData.CreatedBy, - Config: imageData.Config, - GraphDriver: driverData{ - Name: driverName, - Data: driverMetadata, - }, - MountLabel: m.Linux.MountLabel, - Mounts: m.Mounts, - AppArmorProfile: m.Process.ApparmorProfile, - ResolvConfPath: "", - HostnamePath: "", - HostsPath: "", - } - - if size { - sizeRootFs, err := c.GetContainerRootFsSize(data.ID) - if err != nil { - - return nil, errors.Wrapf(err, "error reading size for container %q", name) - } - data.SizeRootFs = uint(sizeRootFs) - sizeRw, err := c.GetContainerRwSize(data.ID) - if err != nil { - return nil, errors.Wrapf(err, "error reading RWSize for container %q", name) - } - data.SizeRw = uint(sizeRw) - } - - return data, nil -} - -// Get an oci.Container and update its status -func (c *ContainerServer) inspectContainer(container string) (*oci.Container, error) { - ociCtr, err := c.LookupContainer(container) - if err != nil { - return nil, err - } - // call runtime.UpdateStatus() - err = c.Runtime().UpdateStatus(ociCtr) - if err != nil { - return nil, err - } - return ociCtr, nil -} - -func getBlankSpec() specs.Spec { - return specs.Spec{ - Process: &specs.Process{}, - Root: &specs.Root{}, - Mounts: []specs.Mount{}, - Hooks: &specs.Hooks{}, - Annotations: make(map[string]string), - Linux: &specs.Linux{}, - Solaris: &specs.Solaris{}, - Windows: &specs.Windows{}, - } -} - -// State copies the crio container state to ContainerState type for kpod -func (c *ContainerServer) State(ctr *oci.Container) *ContainerState { - crioState := ctr.State() - specState := specs.State{ - Version: crioState.Version, - ID: crioState.ID, - Status: crioState.Status, - Pid: crioState.Pid, - Bundle: crioState.Bundle, - Annotations: crioState.Annotations, - } - cState := &ContainerState{ - Started: crioState.Started, - Created: crioState.Created, - Finished: crioState.Finished, - } - cState.State = specState - return cState -} |