// ContainerInspect returns low-level information about a // container. Returns an error if the container cannot be found, or if // there is an error getting the data. func (c *Container) ContainerInspect(name string, size bool, version version.Version) (interface{}, error) { // Ignore version. We're supporting post-1.20 version. defer trace.End(trace.Begin(name)) // Look up the container name in the metadata cache to get long ID vc := cache.ContainerCache().GetContainer(name) if vc == nil { return nil, NotFoundError(name) } id := vc.ContainerID log.Debugf("Found %q in cache as %q", id, vc.ContainerID) client := c.containerProxy.Client() results, err := client.Containers.GetContainerInfo(containers.NewGetContainerInfoParamsWithContext(ctx).WithID(id)) if err != nil { switch err := err.(type) { case *containers.GetContainerInfoNotFound: cache.ContainerCache().DeleteContainer(id) return nil, NotFoundError(name) case *containers.GetContainerInfoInternalServerError: return nil, InternalServerError(err.Payload.Message) default: return nil, InternalServerError(err.Error()) } } var started time.Time var stopped time.Time if results.Payload.ProcessConfig.StartTime != nil && *results.Payload.ProcessConfig.StartTime > 0 { started = time.Unix(*results.Payload.ProcessConfig.StartTime, 0) } if results.Payload.ProcessConfig.StopTime != nil && *results.Payload.ProcessConfig.StopTime > 0 { stopped = time.Unix(*results.Payload.ProcessConfig.StopTime, 0) } // call to the dockerStatus function to retrieve the docker friendly exitCode exitCode, status := dockerStatus(int(*results.Payload.ProcessConfig.ExitCode), *results.Payload.ProcessConfig.Status, *results.Payload.ContainerConfig.State, started, stopped) // set the payload values exit := int32(exitCode) results.Payload.ProcessConfig.ExitCode = &exit results.Payload.ProcessConfig.Status = &status inspectJSON, err := ContainerInfoToDockerContainerInspect(vc, results.Payload, PortLayerName()) if err != nil { log.Errorf("containerInfoToDockerContainerInspect failed with %s", err) return nil, err } log.Debugf("ContainerInspect json config = %+v\n", inspectJSON.Config) if inspectJSON.NetworkSettings != nil { log.Debugf("Docker inspect - network settings = %#v", inspectJSON.NetworkSettings) } else { log.Debugf("Docker inspect - network settings = null") } return inspectJSON, nil }
// ContainerRunning returns true if the given container is running func (c *ContainerProxy) ContainerRunning(vc *viccontainer.VicContainer) (bool, error) { defer trace.End(trace.Begin("")) if c.client == nil { return false, derr.NewErrorWithStatusCode(fmt.Errorf("ContainerProxy.CommitContainerHandle failed to create a portlayer client"), http.StatusInternalServerError) } results, err := c.client.Containers.GetContainerInfo(containers.NewGetContainerInfoParamsWithContext(ctx).WithID(vc.ContainerID)) if err != nil { switch err := err.(type) { case *containers.GetContainerInfoNotFound: return false, derr.NewRequestNotFoundError(fmt.Errorf("No such container: %s", vc.ContainerID)) case *containers.GetContainerInfoInternalServerError: return false, derr.NewErrorWithStatusCode(fmt.Errorf("Error from portlayer: %#v", err.Payload), http.StatusInternalServerError) default: return false, derr.NewErrorWithStatusCode(fmt.Errorf("Unknown error from the container portlayer"), http.StatusInternalServerError) } } inspectJSON, err := ContainerInfoToDockerContainerInspect(vc, results.Payload, c.portlayerName) if err != nil { log.Errorf("containerInfoToDockerContainerInspect failed with %s", err) return false, err } return inspectJSON.State.Running, nil }