mirror of
https://github.com/containers/podman.git
synced 2025-10-25 10:16:43 +08:00
Add support for network ids
The network ID is not stored. It is just the sha256 hash from
the network name. There is a risk of a potential hash collision.
However it's very unlikely and even if we hit this it will
complain that more than network with this ID exists.
The main benefit is that the compat api can have proper
network ID support. Also this adds the support for
`podman network ls --format "{{.ID}}"` and `--filter id=<ID>`.
It also ensures that we can do network rm <ID> and network
inspect <ID>.
Since we use a hash this commit is backwards compatible even for
already existing networks.
Signed-off-by: Paul Holzinger <paul.holzinger@web.de>
This commit is contained in:
@ -50,13 +50,15 @@ func LoadCNIConfsFromDir(dir string) ([]*libcni.NetworkConfigList, error) {
|
||||
return configs, nil
|
||||
}
|
||||
|
||||
// GetCNIConfigPathByName finds a CNI network by name and
|
||||
// GetCNIConfigPathByNameOrID finds a CNI network by name and
|
||||
// returns its configuration file path
|
||||
func GetCNIConfigPathByName(config *config.Config, name string) (string, error) {
|
||||
func GetCNIConfigPathByNameOrID(config *config.Config, name string) (string, error) {
|
||||
files, err := libcni.ConfFiles(GetCNIConfDir(config), []string{".conflist"})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
idMatch := 0
|
||||
file := ""
|
||||
for _, confFile := range files {
|
||||
conf, err := libcni.ConfListFromFile(confFile)
|
||||
if err != nil {
|
||||
@ -65,6 +67,16 @@ func GetCNIConfigPathByName(config *config.Config, name string) (string, error)
|
||||
if conf.Name == name {
|
||||
return confFile, nil
|
||||
}
|
||||
if strings.HasPrefix(GetNetworkID(conf.Name), name) {
|
||||
idMatch++
|
||||
file = confFile
|
||||
}
|
||||
}
|
||||
if idMatch == 1 {
|
||||
return file, nil
|
||||
}
|
||||
if idMatch > 1 {
|
||||
return "", errors.Errorf("more than one result for network ID %s", name)
|
||||
}
|
||||
return "", errors.Wrap(define.ErrNoSuchNetwork, fmt.Sprintf("unable to find network configuration for %s", name))
|
||||
}
|
||||
@ -72,7 +84,7 @@ func GetCNIConfigPathByName(config *config.Config, name string) (string, error)
|
||||
// ReadRawCNIConfByName reads the raw CNI configuration for a CNI
|
||||
// network by name
|
||||
func ReadRawCNIConfByName(config *config.Config, name string) ([]byte, error) {
|
||||
confFile, err := GetCNIConfigPathByName(config, name)
|
||||
confFile, err := GetCNIConfigPathByNameOrID(config, name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -230,8 +230,16 @@ func IfPassesFilter(netconf *libcni.NetworkConfigList, filters map[string][]stri
|
||||
}
|
||||
}
|
||||
|
||||
case "id":
|
||||
// matches part of one id
|
||||
for _, filterValue := range filterValues {
|
||||
if strings.Contains(GetNetworkID(netconf.Name), filterValue) {
|
||||
result = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: add dangling filter
|
||||
// TODO TODO: add id filter if we support ids
|
||||
|
||||
default:
|
||||
return false, errors.Errorf("invalid filter %q", key)
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
package network
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"net"
|
||||
"os"
|
||||
@ -175,7 +177,7 @@ func RemoveNetwork(config *config.Config, name string) error {
|
||||
return err
|
||||
}
|
||||
defer l.releaseCNILock()
|
||||
cniPath, err := GetCNIConfigPathByName(config, name)
|
||||
cniPath, err := GetCNIConfigPathByNameOrID(config, name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -229,3 +231,10 @@ func Exists(config *config.Config, name string) (bool, error) {
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// GetNetworkID return the network ID for a given name.
|
||||
// It is just the sha256 hash but this should be good enough.
|
||||
func GetNetworkID(name string) string {
|
||||
hash := sha256.Sum256([]byte(name))
|
||||
return hex.EncodeToString(hash[:])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user