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:
parent
0eb5cd527f
commit
bd540ac94c
4 changed files with 51 additions and 12 deletions
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue