summaryrefslogtreecommitdiff
path: root/libpod/in_memory_state.go
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2019-10-04 07:30:27 -0700
committerGitHub <noreply@github.com>2019-10-04 07:30:27 -0700
commitc9e936a40796824422011515f2fe445f93451f31 (patch)
treefdab943f3efda62d030e42f7347cf02d7caa3943 /libpod/in_memory_state.go
parent1fe955600979f54ada204afa6c357fd094d6f549 (diff)
parentdacbc5beb2a8841e52cf8ea7f544b4d302469c1d (diff)
downloadpodman-c9e936a40796824422011515f2fe445f93451f31.tar.gz
podman-c9e936a40796824422011515f2fe445f93451f31.tar.bz2
podman-c9e936a40796824422011515f2fe445f93451f31.zip
Merge pull request #3549 from marcov/evict-container
Add ability to evict a container
Diffstat (limited to 'libpod/in_memory_state.go')
-rw-r--r--libpod/in_memory_state.go108
1 files changed, 66 insertions, 42 deletions
diff --git a/libpod/in_memory_state.go b/libpod/in_memory_state.go
index a008fcb39..5ab258772 100644
--- a/libpod/in_memory_state.go
+++ b/libpod/in_memory_state.go
@@ -115,15 +115,16 @@ func (s *InMemoryState) Container(id string) (*Container, error) {
return ctr, nil
}
-// LookupContainer retrieves a container by full ID, unique partial ID, or name
-func (s *InMemoryState) LookupContainer(idOrName string) (*Container, error) {
+// lookupID retrieves a container or pod ID by full ID, unique partial ID, or
+// name
+func (s *InMemoryState) lookupID(idOrName string) (string, error) {
var (
nameIndex *registrar.Registrar
idIndex *truncindex.TruncIndex
)
if idOrName == "" {
- return nil, define.ErrEmptyID
+ return "", define.ErrEmptyID
}
if s.namespace != "" {
@@ -131,7 +132,7 @@ func (s *InMemoryState) LookupContainer(idOrName string) (*Container, error) {
if !ok {
// We have no containers in the namespace
// Return false
- return nil, errors.Wrapf(define.ErrNoSuchCtr, "no container found with name or ID %s", idOrName)
+ return "", define.ErrNoSuchCtr
}
nameIndex = nsIndex.nameIndex
idIndex = nsIndex.idIndex
@@ -147,15 +148,55 @@ func (s *InMemoryState) LookupContainer(idOrName string) (*Container, error) {
fullID, err = idIndex.Get(idOrName)
if err != nil {
if err == truncindex.ErrNotExist {
- return nil, errors.Wrapf(define.ErrNoSuchCtr, "no container found with name or ID %s", idOrName)
+ return "", define.ErrNoSuchCtr
}
- return nil, errors.Wrapf(err, "error performing truncindex lookup for ID %s", idOrName)
+ return "", errors.Wrapf(err, "error performing truncindex lookup for ID %s", idOrName)
}
} else {
- return nil, errors.Wrapf(err, "error performing registry lookup for ID %s", idOrName)
+ return "", errors.Wrapf(err, "error performing registry lookup for ID %s", idOrName)
}
}
+ return fullID, nil
+}
+
+// LookupContainerID retrieves a container ID by full ID, unique partial ID, or
+// name
+func (s *InMemoryState) LookupContainerID(idOrName string) (string, error) {
+ fullID, err := s.lookupID(idOrName)
+
+ switch err {
+ case nil:
+ _, ok := s.containers[fullID]
+ if !ok {
+ // It's a pod, not a container
+ return "", errors.Wrapf(define.ErrNoSuchCtr, "name or ID %s is a pod, not a container", idOrName)
+ }
+
+ case define.ErrNoSuchCtr:
+ return "", errors.Wrapf(define.ErrNoSuchCtr, "no container found with name or ID %s", idOrName)
+
+ default:
+ return "", err
+ }
+
+ return fullID, nil
+}
+
+// LookupContainer retrieves a container by full ID, unique partial ID, or name
+func (s *InMemoryState) LookupContainer(idOrName string) (*Container, error) {
+ fullID, err := s.lookupID(idOrName)
+
+ switch err {
+ case nil:
+
+ case define.ErrNoSuchCtr:
+ return nil, errors.Wrapf(define.ErrNoSuchCtr, "no container found with name or ID %s", idOrName)
+
+ default:
+ return nil, err
+ }
+
ctr, ok := s.containers[fullID]
if !ok {
// It's a pod, not a container
@@ -385,6 +426,16 @@ func (s *InMemoryState) AllContainers() ([]*Container, error) {
return ctrs, nil
}
+// GetContainerConfig returns a container config from the database by full ID
+func (s *InMemoryState) GetContainerConfig(id string) (*ContainerConfig, error) {
+ ctr, err := s.LookupContainer(id)
+ if err != nil {
+ return nil, err
+ }
+
+ return ctr.Config(), nil
+}
+
// RewriteContainerConfig rewrites a container's configuration.
// This function is DANGEROUS, even with an in-memory state.
// Please read the full comment on it in state.go before using it.
@@ -623,49 +674,22 @@ func (s *InMemoryState) Pod(id string) (*Pod, error) {
// LookupPod retrieves a pod from the state from a full or unique partial ID or
// a full name
func (s *InMemoryState) LookupPod(idOrName string) (*Pod, error) {
- var (
- nameIndex *registrar.Registrar
- idIndex *truncindex.TruncIndex
- )
+ fullID, err := s.lookupID(idOrName)
- if idOrName == "" {
- return nil, define.ErrEmptyID
- }
+ switch err {
+ case nil:
- if s.namespace != "" {
- nsIndex, ok := s.namespaceIndexes[s.namespace]
- if !ok {
- // We have no containers in the namespace
- // Return false
- return nil, errors.Wrapf(define.ErrNoSuchCtr, "no container found with name or ID %s", idOrName)
- }
- nameIndex = nsIndex.nameIndex
- idIndex = nsIndex.idIndex
- } else {
- nameIndex = s.nameIndex
- idIndex = s.idIndex
- }
+ case define.ErrNoSuchCtr, define.ErrNoSuchPod:
+ return nil, errors.Wrapf(define.ErrNoSuchPod, "no pod found with name or ID %s", idOrName)
- fullID, err := nameIndex.Get(idOrName)
- if err != nil {
- if err == registrar.ErrNameNotReserved {
- // What was passed is not a name, assume it's an ID
- fullID, err = idIndex.Get(idOrName)
- if err != nil {
- if err == truncindex.ErrNotExist {
- return nil, errors.Wrapf(define.ErrNoSuchPod, "no pod found with name or ID %s", idOrName)
- }
- return nil, errors.Wrapf(err, "error performing truncindex lookup for ID %s", idOrName)
- }
- } else {
- return nil, errors.Wrapf(err, "error performing registry lookup for ID %s", idOrName)
- }
+ default:
+ return nil, err
}
pod, ok := s.pods[fullID]
if !ok {
// It's a container not a pod
- return nil, errors.Wrapf(define.ErrNoSuchPod, "id or name %s is a container not a pod", idOrName)
+ return nil, errors.Wrapf(define.ErrNoSuchPod, "id or name %s is a container, not a pod", idOrName)
}
return pod, nil