Use the libpod.conf cni_config_dir option for inspect and delete

The pkg/network/files.go methods currently use the constant '/etc/cni/net.d'
for network handling. This results in the unability of podman-network-inspect
and podman-network-rm to locate the cni network configuration files.
This commit propagates the libpod.Runtime through the networking methods and
finally makes use of its configuration (config.Network.NetworkConfigDir).
Closes #6212

Signed-off-by: Maximilian Müller <maxm123@techie.com>
This commit is contained in:
Maximilian Müller
2020-05-13 18:52:58 +02:00
parent 0d9625152b
commit 48d83482db
4 changed files with 66 additions and 54 deletions

View File

@ -15,26 +15,15 @@ import (
"github.com/pkg/errors"
)
func getCNIConfDir(r *libpod.Runtime) (string, error) {
config, err := r.GetConfig()
if err != nil {
return "", err
}
configPath := config.Network.NetworkConfigDir
if len(config.Network.NetworkConfigDir) < 1 {
configPath = network.CNIConfigDir
}
return configPath, nil
}
func (ic *ContainerEngine) NetworkList(ctx context.Context, options entities.NetworkListOptions) ([]*entities.NetworkListReport, error) {
var reports []*entities.NetworkListReport
cniConfigPath, err := getCNIConfDir(ic.Libpod)
config, err := ic.Libpod.GetConfig()
if err != nil {
return nil, err
}
networks, err := network.LoadCNIConfsFromDir(cniConfigPath)
networks, err := network.LoadCNIConfsFromDir(network.GetCNIConfDir(config))
if err != nil {
return nil, err
}
@ -49,8 +38,14 @@ func (ic *ContainerEngine) NetworkInspect(ctx context.Context, namesOrIds []stri
var (
rawCNINetworks []entities.NetworkInspectReport
)
config, err := ic.Libpod.GetConfig()
if err != nil {
return nil, err
}
for _, name := range namesOrIds {
rawList, err := network.InspectNetwork(name)
rawList, err := network.InspectNetwork(config, name)
if err != nil {
return nil, err
}
@ -61,6 +56,12 @@ func (ic *ContainerEngine) NetworkInspect(ctx context.Context, namesOrIds []stri
func (ic *ContainerEngine) NetworkRm(ctx context.Context, namesOrIds []string, options entities.NetworkRmOptions) ([]*entities.NetworkRmReport, error) {
var reports []*entities.NetworkRmReport
config, err := ic.Libpod.GetConfig()
if err != nil {
return nil, err
}
for _, name := range namesOrIds {
report := entities.NetworkRmReport{Name: name}
containers, err := ic.Libpod.GetAllContainers()
@ -80,7 +81,7 @@ func (ic *ContainerEngine) NetworkRm(ctx context.Context, namesOrIds []string, o
}
}
}
if err := network.RemoveNetwork(name); err != nil {
if err := network.RemoveNetwork(config, name); err != nil {
report.Err = err
}
reports = append(reports, &report)
@ -117,10 +118,10 @@ func createBridge(r *libpod.Runtime, name string, options entities.NetworkCreate
// if range is provided, make sure it is "in" network
if subnet.IP != nil {
// if network is provided, does it conflict with existing CNI or live networks
err = network.ValidateUserNetworkIsAvailable(subnet)
err = network.ValidateUserNetworkIsAvailable(runtimeConfig, subnet)
} else {
// if no network is provided, figure out network
subnet, err = network.GetFreeNetwork()
subnet, err = network.GetFreeNetwork(runtimeConfig)
}
if err != nil {
return "", err
@ -158,13 +159,13 @@ func createBridge(r *libpod.Runtime, name string, options entities.NetworkCreate
return "", errors.Errorf("the ip range %s does not fall within the subnet range %s", options.Range.String(), subnet.String())
}
}
bridgeDeviceName, err := network.GetFreeDeviceName()
bridgeDeviceName, err := network.GetFreeDeviceName(runtimeConfig)
if err != nil {
return "", err
}
if len(name) > 0 {
netNames, err := network.GetNetworkNamesFromFileSystem()
netNames, err := network.GetNetworkNamesFromFileSystem(runtimeConfig)
if err != nil {
return "", err
}
@ -205,11 +206,7 @@ func createBridge(r *libpod.Runtime, name string, options entities.NetworkCreate
if err != nil {
return "", err
}
cniConfigPath, err := getCNIConfDir(r)
if err != nil {
return "", err
}
cniPathName := filepath.Join(cniConfigPath, fmt.Sprintf("%s.conflist", name))
cniPathName := filepath.Join(network.GetCNIConfDir(runtimeConfig), fmt.Sprintf("%s.conflist", name))
err = ioutil.WriteFile(cniPathName, b, 0644)
return cniPathName, err
}
@ -222,12 +219,18 @@ func createMacVLAN(r *libpod.Runtime, name string, options entities.NetworkCreat
if err != nil {
return "", err
}
config, err := r.GetConfig()
if err != nil {
return "", err
}
// Make sure the host-device exists
if !util.StringInSlice(options.MacVLAN, liveNetNames) {
return "", errors.Errorf("failed to find network interface %q", options.MacVLAN)
}
if len(name) > 0 {
netNames, err := network.GetNetworkNamesFromFileSystem()
netNames, err := network.GetNetworkNamesFromFileSystem(config)
if err != nil {
return "", err
}
@ -235,7 +238,7 @@ func createMacVLAN(r *libpod.Runtime, name string, options entities.NetworkCreat
return "", errors.Errorf("the network name %s is already used", name)
}
} else {
name, err = network.GetFreeDeviceName()
name, err = network.GetFreeDeviceName(config)
if err != nil {
return "", err
}
@ -248,11 +251,7 @@ func createMacVLAN(r *libpod.Runtime, name string, options entities.NetworkCreat
if err != nil {
return "", err
}
cniConfigPath, err := getCNIConfDir(r)
if err != nil {
return "", err
}
cniPathName := filepath.Join(cniConfigPath, fmt.Sprintf("%s.conflist", name))
cniPathName := filepath.Join(network.GetCNIConfDir(config), fmt.Sprintf("%s.conflist", name))
err = ioutil.WriteFile(cniPathName, b, 0644)
return cniPathName, err
}

View File

@ -4,6 +4,7 @@ import (
"fmt"
"os/exec"
"github.com/containers/common/pkg/config"
"github.com/containers/libpod/pkg/util"
"github.com/containers/libpod/utils"
"github.com/sirupsen/logrus"
@ -11,12 +12,12 @@ import (
// GetFreeDeviceName returns a device name that is unused; used when no network
// name is provided by user
func GetFreeDeviceName() (string, error) {
func GetFreeDeviceName(config *config.Config) (string, error) {
var (
deviceNum uint
deviceName string
)
networkNames, err := GetNetworkNamesFromFileSystem()
networkNames, err := GetNetworkNamesFromFileSystem(config)
if err != nil {
return "", err
}
@ -24,7 +25,7 @@ func GetFreeDeviceName() (string, error) {
if err != nil {
return "", err
}
bridgeNames, err := GetBridgeNamesFromFileSystem()
bridgeNames, err := GetBridgeNamesFromFileSystem(config)
if err != nil {
return "", err
}

View File

@ -9,9 +9,17 @@ import (
"github.com/containernetworking/cni/libcni"
"github.com/containernetworking/plugins/plugins/ipam/host-local/backend/allocator"
"github.com/containers/common/pkg/config"
"github.com/pkg/errors"
)
func GetCNIConfDir(config *config.Config) string {
if len(config.Network.NetworkConfigDir) < 1 {
return CNIConfigDir
}
return config.Network.NetworkConfigDir
}
// LoadCNIConfsFromDir loads all the CNI configurations from a dir
func LoadCNIConfsFromDir(dir string) ([]*libcni.NetworkConfigList, error) {
var configs []*libcni.NetworkConfigList
@ -33,8 +41,8 @@ func LoadCNIConfsFromDir(dir string) ([]*libcni.NetworkConfigList, error) {
// GetCNIConfigPathByName finds a CNI network by name and
// returns its configuration file path
func GetCNIConfigPathByName(name string) (string, error) {
files, err := libcni.ConfFiles(CNIConfigDir, []string{".conflist"})
func GetCNIConfigPathByName(config *config.Config, name string) (string, error) {
files, err := libcni.ConfFiles(GetCNIConfDir(config), []string{".conflist"})
if err != nil {
return "", err
}
@ -52,8 +60,8 @@ func GetCNIConfigPathByName(name string) (string, error) {
// ReadRawCNIConfByName reads the raw CNI configuration for a CNI
// network by name
func ReadRawCNIConfByName(name string) ([]byte, error) {
confFile, err := GetCNIConfigPathByName(name)
func ReadRawCNIConfByName(config *config.Config, name string) ([]byte, error) {
confFile, err := GetCNIConfigPathByName(config, name)
if err != nil {
return nil, err
}
@ -73,9 +81,10 @@ func GetCNIPlugins(list *libcni.NetworkConfigList) string {
// GetNetworksFromFilesystem gets all the networks from the cni configuration
// files
func GetNetworksFromFilesystem() ([]*allocator.Net, error) {
func GetNetworksFromFilesystem(config *config.Config) ([]*allocator.Net, error) {
var cniNetworks []*allocator.Net
networks, err := LoadCNIConfsFromDir(CNIConfigDir)
networks, err := LoadCNIConfsFromDir(GetCNIConfDir(config))
if err != nil {
return nil, err
}
@ -96,9 +105,10 @@ func GetNetworksFromFilesystem() ([]*allocator.Net, error) {
// GetNetworkNamesFromFileSystem gets all the names from the cni network
// configuration files
func GetNetworkNamesFromFileSystem() ([]string, error) {
func GetNetworkNamesFromFileSystem(config *config.Config) ([]string, error) {
var networkNames []string
networks, err := LoadCNIConfsFromDir(CNIConfigDir)
networks, err := LoadCNIConfsFromDir(GetCNIConfDir(config))
if err != nil {
return nil, err
}
@ -133,9 +143,10 @@ func GetInterfaceNameFromConfig(path string) (string, error) {
// GetBridgeNamesFromFileSystem is a convenience function to get all the bridge
// names from the configured networks
func GetBridgeNamesFromFileSystem() ([]string, error) {
func GetBridgeNamesFromFileSystem(config *config.Config) ([]string, error) {
var bridgeNames []string
networks, err := LoadCNIConfsFromDir(CNIConfigDir)
networks, err := LoadCNIConfsFromDir(GetCNIConfDir(config))
if err != nil {
return nil, err
}

View File

@ -7,6 +7,7 @@ import (
"github.com/containernetworking/cni/pkg/types"
"github.com/containernetworking/plugins/plugins/ipam/host-local/backend/allocator"
"github.com/containers/common/pkg/config"
"github.com/containers/libpod/pkg/util"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
@ -56,8 +57,8 @@ func GetLiveNetworkNames() ([]string, error) {
// GetFreeNetwork looks for a free network according to existing cni configuration
// files and network interfaces.
func GetFreeNetwork() (*net.IPNet, error) {
networks, err := GetNetworksFromFilesystem()
func GetFreeNetwork(config *config.Config) (*net.IPNet, error) {
networks, err := GetNetworksFromFilesystem(config)
if err != nil {
return nil, err
}
@ -131,8 +132,8 @@ func networkIntersect(n1, n2 *net.IPNet) bool {
// ValidateUserNetworkIsAvailable returns via an error if a network is available
// to be used
func ValidateUserNetworkIsAvailable(userNet *net.IPNet) error {
networks, err := GetNetworksFromFilesystem()
func ValidateUserNetworkIsAvailable(config *config.Config, userNet *net.IPNet) error {
networks, err := GetNetworksFromFilesystem(config)
if err != nil {
return err
}
@ -153,8 +154,8 @@ func ValidateUserNetworkIsAvailable(userNet *net.IPNet) error {
// RemoveNetwork removes a given network by name. If the network has container associated with it, that
// must be handled outside the context of this.
func RemoveNetwork(name string) error {
cniPath, err := GetCNIConfigPathByName(name)
func RemoveNetwork(config *config.Config, name string) error {
cniPath, err := GetCNIConfigPathByName(config, name)
if err != nil {
return err
}
@ -181,8 +182,8 @@ func RemoveNetwork(name string) error {
}
// InspectNetwork reads a CNI config and returns its configuration
func InspectNetwork(name string) (map[string]interface{}, error) {
b, err := ReadRawCNIConfByName(name)
func InspectNetwork(config *config.Config, name string) (map[string]interface{}, error) {
b, err := ReadRawCNIConfByName(config, name)
if err != nil {
return nil, err
}