Use the Linux version BoltState.getContainerFromDB on all platforms.

This just muves the Linux implementation, unchanged, to the
platform-agnostic file.  Should not change behavior on Linux.

On non-Linux platforms, reading containers from BoltDB now works
(and rejects containers with namespace data).  The checkRuntimeConfig
validation ensures that each BoltDB database is only used on one platform,
so network namespaces should never exist in non-Linux BoltDB files.

Signed-off-by: Miloslav Trmač <mitr@redhat.com>

Closes: #1115
Approved by: rhatdan
This commit is contained in:
Miloslav Trmač 2018-07-25 04:24:43 +02:00 committed by Atomic Bot
parent eba6bf0018
commit 2322f272c4
3 changed files with 52 additions and 64 deletions

View File

@ -237,6 +237,58 @@ func getRuntimeConfigBucket(tx *bolt.Tx) (*bolt.Bucket, error) {
return bkt, nil return bkt, nil
} }
func (s *BoltState) getContainerFromDB(id []byte, ctr *Container, ctrsBkt *bolt.Bucket) error {
valid := true
ctrBkt := ctrsBkt.Bucket(id)
if ctrBkt == nil {
return errors.Wrapf(ErrNoSuchCtr, "container %s not found in DB", string(id))
}
if s.namespaceBytes != nil {
ctrNamespaceBytes := ctrBkt.Get(namespaceKey)
if !bytes.Equal(s.namespaceBytes, ctrNamespaceBytes) {
return errors.Wrapf(ErrNSMismatch, "cannot retrieve container %s as it is part of namespace %q and we are in namespace %q", string(id), string(ctrNamespaceBytes), s.namespace)
}
}
configBytes := ctrBkt.Get(configKey)
if configBytes == nil {
return errors.Wrapf(ErrInternal, "container %s missing config key in DB", string(id))
}
stateBytes := ctrBkt.Get(stateKey)
if stateBytes == nil {
return errors.Wrapf(ErrInternal, "container %s missing state key in DB", string(id))
}
netNSBytes := ctrBkt.Get(netNSKey)
if err := json.Unmarshal(configBytes, ctr.config); err != nil {
return errors.Wrapf(err, "error unmarshalling container %s config", string(id))
}
if err := json.Unmarshal(stateBytes, ctr.state); err != nil {
return errors.Wrapf(err, "error unmarshalling container %s state", string(id))
}
if !parseNetNSBoltData(ctr, netNSBytes) {
valid = false
}
// Get the lock
lockPath := filepath.Join(s.lockDir, string(id))
lock, err := storage.GetLockfile(lockPath)
if err != nil {
return errors.Wrapf(err, "error retrieving lockfile for container %s", string(id))
}
ctr.lock = lock
ctr.runtime = s.runtime
ctr.valid = valid
return nil
}
func (s *BoltState) getPodFromDB(id []byte, pod *Pod, podBkt *bolt.Bucket) error { func (s *BoltState) getPodFromDB(id []byte, pod *Pod, podBkt *bolt.Bucket) error {
podDB := podBkt.Bucket(id) podDB := podBkt.Bucket(id)
if podDB == nil { if podDB == nil {

View File

@ -3,13 +3,6 @@
package libpod package libpod
import ( import (
"bytes"
"encoding/json"
"path/filepath"
"github.com/boltdb/bolt"
"github.com/containers/storage"
"github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -30,55 +23,3 @@ func parseNetNSBoltData(ctr *Container, netNSBytes []byte) bool {
} }
return true return true
} }
func (s *BoltState) getContainerFromDB(id []byte, ctr *Container, ctrsBkt *bolt.Bucket) error {
valid := true
ctrBkt := ctrsBkt.Bucket(id)
if ctrBkt == nil {
return errors.Wrapf(ErrNoSuchCtr, "container %s not found in DB", string(id))
}
if s.namespaceBytes != nil {
ctrNamespaceBytes := ctrBkt.Get(namespaceKey)
if !bytes.Equal(s.namespaceBytes, ctrNamespaceBytes) {
return errors.Wrapf(ErrNSMismatch, "cannot retrieve container %s as it is part of namespace %q and we are in namespace %q", string(id), string(ctrNamespaceBytes), s.namespace)
}
}
configBytes := ctrBkt.Get(configKey)
if configBytes == nil {
return errors.Wrapf(ErrInternal, "container %s missing config key in DB", string(id))
}
stateBytes := ctrBkt.Get(stateKey)
if stateBytes == nil {
return errors.Wrapf(ErrInternal, "container %s missing state key in DB", string(id))
}
netNSBytes := ctrBkt.Get(netNSKey)
if err := json.Unmarshal(configBytes, ctr.config); err != nil {
return errors.Wrapf(err, "error unmarshalling container %s config", string(id))
}
if err := json.Unmarshal(stateBytes, ctr.state); err != nil {
return errors.Wrapf(err, "error unmarshalling container %s state", string(id))
}
if !parseNetNSBoltData(ctr, netNSBytes) {
valid = false
}
// Get the lock
lockPath := filepath.Join(s.lockDir, string(id))
lock, err := storage.GetLockfile(lockPath)
if err != nil {
return errors.Wrapf(err, "error retrieving lockfile for container %s", string(id))
}
ctr.lock = lock
ctr.runtime = s.runtime
ctr.valid = valid
return nil
}

View File

@ -3,7 +3,6 @@
package libpod package libpod
import ( import (
"github.com/boltdb/bolt"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -16,7 +15,3 @@ func parseNetNSBoltData(ctr *Container, netNSBytes []byte) bool {
} }
return true return true
} }
func (s *BoltState) getContainerFromDB(id []byte, ctr *Container, ctrsBkt *bolt.Bucket) error {
return ErrNotImplemented
}