mirror of
https://github.com/containers/podman.git
synced 2025-06-20 00:51:16 +08:00
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:
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user