summaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
authorMatthew Heon <matthew.heon@pm.me>2020-10-27 15:50:03 -0400
committerMatthew Heon <matthew.heon@pm.me>2020-10-27 15:50:03 -0400
commit63efde15f14b18f5af385e89936b4ab0868cb357 (patch)
treee40c8b71e2e24cb3b375e2c2cfd15a835d946fed /libpod
parent6af7e544636ae66ce237489ce6948123e1b3249d (diff)
downloadpodman-63efde15f14b18f5af385e89936b4ab0868cb357.tar.gz
podman-63efde15f14b18f5af385e89936b4ab0868cb357.tar.bz2
podman-63efde15f14b18f5af385e89936b4ab0868cb357.zip
Add a way to retrieve all network aliases for a ctr
The original interface only allowed retrieving aliases for a specific network, not for all networks. This will allow aliases to be retrieved for every network the container is present in, in a single DB operation. Signed-off-by: Matthew Heon <matthew.heon@pm.me>
Diffstat (limited to 'libpod')
-rw-r--r--libpod/boltdb_state.go85
-rw-r--r--libpod/in_memory_state.go19
-rw-r--r--libpod/state.go2
3 files changed, 105 insertions, 1 deletions
diff --git a/libpod/boltdb_state.go b/libpod/boltdb_state.go
index e0db92082..4a94d9090 100644
--- a/libpod/boltdb_state.go
+++ b/libpod/boltdb_state.go
@@ -1013,9 +1013,21 @@ func (s *BoltState) GetNetworkAliases(ctr *Container, network string) ([]string,
return errors.Wrapf(define.ErrNoSuchCtr, "container %s does not exist in database", ctr.ID())
}
+ ctrNetworkBkt := dbCtr.Bucket(networksBkt)
+ if ctrNetworkBkt == nil {
+ // No networks joined, so no aliases
+ return nil
+ }
+
+ inNetwork := ctrNetworkBkt.Get([]byte(network))
+ if inNetwork == nil {
+ return errors.Wrapf(define.ErrNoAliases, "container %s is not part of network %s, no aliases found")
+ }
+
ctrAliasesBkt := dbCtr.Bucket(aliasesBkt)
if ctrAliasesBkt == nil {
- return errors.Wrapf(define.ErrNoAliases, "container %s has no network aliases", ctr.ID())
+ // No aliases
+ return nil
}
netAliasesBkt := ctrAliasesBkt.Bucket([]byte(network))
@@ -1035,6 +1047,77 @@ func (s *BoltState) GetNetworkAliases(ctr *Container, network string) ([]string,
return aliases, nil
}
+// GetAllNetworkAliases retrieves the network aliases for the given container in
+// all CNI networks.
+func (s *BoltState) GetAllNetworkAliases(ctr *Container) (map[string][]string, error) {
+ if !s.valid {
+ return nil, define.ErrDBClosed
+ }
+
+ if !ctr.valid {
+ return nil, define.ErrCtrRemoved
+ }
+
+ if s.namespace != "" && s.namespace != ctr.config.Namespace {
+ return nil, errors.Wrapf(define.ErrNSMismatch, "container %s is in namespace %q, does not match our namespace %q", ctr.ID(), ctr.config.Namespace, s.namespace)
+ }
+
+ ctrID := []byte(ctr.ID())
+
+ db, err := s.getDBCon()
+ if err != nil {
+ return nil, err
+ }
+ defer s.deferredCloseDBCon(db)
+
+ aliases := make(map[string][]string)
+
+ err = db.View(func(tx *bolt.Tx) error {
+ ctrBucket, err := getCtrBucket(tx)
+ if err != nil {
+ return err
+ }
+
+ dbCtr := ctrBucket.Bucket(ctrID)
+ if dbCtr == nil {
+ ctr.valid = false
+ return errors.Wrapf(define.ErrNoSuchCtr, "container %s does not exist in database", ctr.ID())
+ }
+
+ ctrAliasesBkt := dbCtr.Bucket(aliasesBkt)
+ if ctrAliasesBkt == nil {
+ // No aliases present
+ return nil
+ }
+
+ ctrNetworkBkt := dbCtr.Bucket(networksBkt)
+ if ctrNetworkBkt == nil {
+ // No networks joined, so no aliases
+ return nil
+ }
+
+ return ctrNetworkBkt.ForEach(func(network, v []byte) error {
+ netAliasesBkt := ctrAliasesBkt.Bucket(network)
+ if netAliasesBkt == nil {
+ return nil
+ }
+
+ netAliases := []string{}
+ aliases[string(network)] = netAliases
+
+ return netAliasesBkt.ForEach(func(alias, v []byte) error {
+ netAliases = append(netAliases, string(alias))
+ return nil
+ })
+ })
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ return aliases, nil
+}
+
// SetNetworkAliases sets network aliases for the given container in the given
// network. All existing aliases for that network (if any exist) will be removed,
// to be replaced by the new aliases given.
diff --git a/libpod/in_memory_state.go b/libpod/in_memory_state.go
index 66c2a5cbd..3b88c9664 100644
--- a/libpod/in_memory_state.go
+++ b/libpod/in_memory_state.go
@@ -568,6 +568,25 @@ func (s *InMemoryState) GetNetworkAliases(ctr *Container, network string) ([]str
return netAliases, nil
}
+// GetAllNetworkAliases gets all network aliases for the given container.
+func (s *InMemoryState) GetAllNetworkAliases(ctr *Container) (map[string][]string, error) {
+ if !ctr.valid {
+ return nil, define.ErrCtrRemoved
+ }
+
+ ctr, ok := s.containers[ctr.ID()]
+ if !ok {
+ return nil, define.ErrNoSuchCtr
+ }
+
+ ctrAliases, ok := s.ctrNetworkAliases[ctr.ID()]
+ if !ok {
+ return map[string][]string{}, nil
+ }
+
+ return ctrAliases, nil
+}
+
// SetNetworkAliases sets network aliases for the given container in the given
// network.
func (s *InMemoryState) SetNetworkAliases(ctr *Container, network string, aliases []string) error {
diff --git a/libpod/state.go b/libpod/state.go
index fca0548c4..6b178ec58 100644
--- a/libpod/state.go
+++ b/libpod/state.go
@@ -100,6 +100,8 @@ type State interface {
// Get network aliases for the given container in the given network.
GetNetworkAliases(ctr *Container, network string) ([]string, error)
+ // Get all network aliases for the given container.
+ GetAllNetworkAliases(ctr *Container) (map[string][]string, error)
// Set network aliases for the given container in the given network.
SetNetworkAliases(ctr *Container, network string, aliases []string) error
// Remove network aliases for the given container in the given network.