Separate container state from sandbox state in server

Move container state data to libkpod, separate from the sandbox
data in server.  However, the move was structured such that sandbox
data could easily be moved over into libkpod in the future

Signed-off-by: Ryan Cole <rcyoalne@gmail.com>
This commit is contained in:
Ryan Cole 2017-07-18 11:01:08 -04:00
parent 0eb5cd527f
commit bd540ac94c
4 changed files with 51 additions and 12 deletions

View file

@ -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()
}

View file

@ -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)
}

View file

@ -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 {

View file

@ -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
@ -588,7 +588,6 @@ func New(config *Config) (*Server, error) {
config: *config,
state: &serverState{
sandboxes: sandboxes,
containers: containers,
},
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
}
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()
}