diff options
Diffstat (limited to 'server/inspect.go')
-rw-r--r-- | server/inspect.go | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/server/inspect.go b/server/inspect.go new file mode 100644 index 000000000..6e3e813cc --- /dev/null +++ b/server/inspect.go @@ -0,0 +1,105 @@ +package server + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + + "github.com/go-zoo/bone" + "github.com/kubernetes-incubator/cri-o/libkpod/sandbox" + "github.com/kubernetes-incubator/cri-o/oci" + "github.com/kubernetes-incubator/cri-o/types" + "github.com/sirupsen/logrus" +) + +func (s *Server) getInfo() types.CrioInfo { + return types.CrioInfo{ + StorageDriver: s.config.Config.Storage, + StorageRoot: s.config.Config.Root, + CgroupDriver: s.config.Config.CgroupManager, + } +} + +var ( + errCtrNotFound = errors.New("container not found") + errCtrStateNil = errors.New("container state is nil") + errSandboxNotFound = errors.New("sandbox for container not found") +) + +func (s *Server) getContainerInfo(id string, getContainerFunc func(id string) *oci.Container, getInfraContainerFunc func(id string) *oci.Container, getSandboxFunc func(id string) *sandbox.Sandbox) (types.ContainerInfo, error) { + ctr := getContainerFunc(id) + if ctr == nil { + ctr = getInfraContainerFunc(id) + if ctr == nil { + return types.ContainerInfo{}, errCtrNotFound + } + } + // TODO(mrunalp): should we call UpdateStatus()? + ctrState := ctr.State() + if ctrState == nil { + return types.ContainerInfo{}, errCtrStateNil + } + sb := getSandboxFunc(ctr.Sandbox()) + if sb == nil { + logrus.Debugf("can't find sandbox %s for container %s", ctr.Sandbox(), id) + return types.ContainerInfo{}, errSandboxNotFound + } + return types.ContainerInfo{ + Name: ctr.Name(), + Pid: ctrState.Pid, + Image: ctr.Image(), + CreatedTime: ctrState.Created.UnixNano(), + Labels: ctr.Labels(), + Annotations: ctr.Annotations(), + CrioAnnotations: ctr.CrioAnnotations(), + Root: ctr.MountPoint(), + LogPath: ctr.LogPath(), + Sandbox: ctr.Sandbox(), + IP: sb.IP(), + }, nil + +} + +// GetInfoMux returns the mux used to serve info requests +func (s *Server) GetInfoMux() *bone.Mux { + mux := bone.New() + + mux.Get("/info", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + ci := s.getInfo() + js, err := json.Marshal(ci) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(js) + })) + + mux.Get("/containers/:id", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + containerID := bone.GetValue(req, "id") + ci, err := s.getContainerInfo(containerID, s.GetContainer, s.getInfraContainer, s.getSandbox) + if err != nil { + switch err { + case errCtrNotFound: + http.Error(w, fmt.Sprintf("can't find the container with id %s", containerID), http.StatusNotFound) + case errCtrStateNil: + http.Error(w, fmt.Sprintf("can't find container state for container with id %s", containerID), http.StatusInternalServerError) + case errSandboxNotFound: + http.Error(w, fmt.Sprintf("can't find the sandbox for container id %s", containerID), http.StatusNotFound) + default: + http.Error(w, err.Error(), http.StatusInternalServerError) + } + return + } + js, err := json.Marshal(ci) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(js) + })) + + return mux +} |