diff --git a/libkpod/containerserver.go b/libkpod/containerserver.go index 943e27cc..c9580b78 100644 --- a/libkpod/containerserver.go +++ b/libkpod/containerserver.go @@ -1,6 +1,8 @@ package libkpod import ( + "sync" + "github.com/containers/image/types" cstorage "github.com/containers/storage" "github.com/docker/docker/pkg/registrar" @@ -17,6 +19,8 @@ type ContainerServer struct { ctrNameIndex *registrar.Registrar ctrIDIndex *truncindex.TruncIndex imageContext *types.SystemContext + stateLock sync.Locker + state *containerServerState } // Runtime returns the oci runtime for the ContainerServer @@ -51,6 +55,7 @@ func (c *ContainerServer) ImageContext() *types.SystemContext { // New creates a new ContainerServer func New(runtime *oci.Runtime, store cstorage.Store, storageImageServer storage.ImageServer, ctrNameIndex *registrar.Registrar, ctrIDIndex *truncindex.TruncIndex, imageContext *types.SystemContext) *ContainerServer { + containers := oci.NewMemoryStore() return &ContainerServer{ runtime: runtime, store: store, @@ -58,5 +63,41 @@ func New(runtime *oci.Runtime, store cstorage.Store, storageImageServer storage. ctrNameIndex: ctrNameIndex, ctrIDIndex: ctrIDIndex, imageContext: imageContext, + stateLock: new(sync.Mutex), + state: &containerServerState{ + containers: containers, + }, } } + +type containerServerState struct { + containers oci.ContainerStorer +} + +// AddContainer adds a container to the container state store +func (c *ContainerServer) AddContainer(ctr *oci.Container) { + c.stateLock.Lock() + defer c.stateLock.Unlock() + c.state.containers.Add(ctr.ID(), ctr) +} + +// GetContainer returns a container by its ID +func (c *ContainerServer) GetContainer(id string) *oci.Container { + c.stateLock.Lock() + defer c.stateLock.Unlock() + return c.state.containers.Get(id) +} + +// RemoveContainer removes a container from the container state store +func (c *ContainerServer) RemoveContainer(ctr *oci.Container) { + c.stateLock.Lock() + defer c.stateLock.Unlock() + c.state.containers.Delete(ctr.ID()) +} + +// ListContainers returns a list of all containers stored by the server state +func (c *ContainerServer) ListContainers() []*oci.Container { + c.stateLock.Lock() + defer c.stateLock.Unlock() + return c.state.containers.List() +} diff --git a/server/container.go b/server/container.go index 36b05dc8..6a8f8957 100644 --- a/server/container.go +++ b/server/container.go @@ -16,7 +16,7 @@ func (s *Server) getContainerFromRequest(cid string) (*oci.Container, error) { return nil, fmt.Errorf("container with ID starting with %s not found: %v", cid, err) } - c := s.state.containers.Get(containerID) + c := s.ContainerServer.GetContainer(containerID) if c == nil { return nil, fmt.Errorf("specified container not found: %s", containerID) } diff --git a/server/container_list.go b/server/container_list.go index 0803c91a..10b93338 100644 --- a/server/container_list.go +++ b/server/container_list.go @@ -31,7 +31,7 @@ func (s *Server) ListContainers(ctx context.Context, req *pb.ListContainersReque logrus.Debugf("ListContainersRequest %+v", req) var ctrs []*pb.Container filter := req.Filter - ctrList := s.state.containers.List() + ctrList := s.ContainerServer.ListContainers() // Filter using container id and pod id first. if filter != nil { @@ -40,7 +40,7 @@ func (s *Server) ListContainers(ctx context.Context, req *pb.ListContainersReque if err != nil { return nil, err } - c := s.state.containers.Get(id) + c := s.ContainerServer.GetContainer(id) if c != nil { if filter.PodSandboxId != "" { if c.Sandbox() == filter.PodSandboxId { diff --git a/server/server.go b/server/server.go index c705a25d..d55564e9 100644 --- a/server/server.go +++ b/server/server.go @@ -568,8 +568,8 @@ func New(config *Config) (*Server, error) { if err != nil { return nil, err } + sandboxes := make(map[string]*Sandbox) - containers := oci.NewMemoryStore() netPlugin, err := ocicni.InitCNI(config.NetworkDir, config.PluginDir) if err != nil { return nil, err @@ -587,8 +587,7 @@ func New(config *Config) (*Server, error) { hostportManager: hostportManager, config: *config, state: &serverState{ - sandboxes: sandboxes, - containers: containers, + sandboxes: sandboxes, }, seccompEnabled: seccomp.IsEnabled(), appArmorEnabled: apparmor.IsEnabled(), @@ -646,13 +645,12 @@ func New(config *Config) (*Server, error) { }() logrus.Debugf("sandboxes: %v", s.state.sandboxes) - logrus.Debugf("containers: %v", s.state.containers) + logrus.Debugf("containers: %v", s.ContainerServer.ListContainers()) return s, nil } type serverState struct { - sandboxes map[string]*Sandbox - containers oci.ContainerStorer + sandboxes map[string]*Sandbox } func (s *Server) addSandbox(sb *Sandbox) { @@ -686,13 +684,13 @@ func (s *Server) addContainer(c *oci.Container) { sandbox := s.state.sandboxes[c.Sandbox()] // TODO(runcom): handle !ok above!!! otherwise it panics! sandbox.AddContainer(c) - s.state.containers.Add(c.ID(), c) + s.ContainerServer.AddContainer(c) s.stateLock.Unlock() } func (s *Server) getContainer(id string) *oci.Container { s.stateLock.Lock() - c := s.state.containers.Get(id) + c := s.ContainerServer.GetContainer(id) s.stateLock.Unlock() return c } @@ -712,6 +710,6 @@ func (s *Server) removeContainer(c *oci.Container) { s.stateLock.Lock() sandbox := s.state.sandboxes[c.Sandbox()] sandbox.RemoveContainer(c) - s.state.containers.Delete(c.ID()) + s.ContainerServer.RemoveContainer(c) s.stateLock.Unlock() }