diff options
author | Matthew Heon <matthew.heon@pm.me> | 2020-10-27 15:50:03 -0400 |
---|---|---|
committer | Matthew Heon <matthew.heon@pm.me> | 2020-10-27 15:50:03 -0400 |
commit | 63efde15f14b18f5af385e89936b4ab0868cb357 (patch) | |
tree | e40c8b71e2e24cb3b375e2c2cfd15a835d946fed /libpod | |
parent | 6af7e544636ae66ce237489ce6948123e1b3249d (diff) | |
download | podman-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.go | 85 | ||||
-rw-r--r-- | libpod/in_memory_state.go | 19 | ||||
-rw-r--r-- | libpod/state.go | 2 |
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. |