mirror of
https://github.com/k8snetworkplumbingwg/multus-cni.git
synced 2025-09-02 09:29:36 +00:00
Code refactoring and including conf dir in the CNI Conf file option
Change-Id: I2b35377356f2144fd3889bf5de7ac430a19edf89 Co-authored-by: Doug Smith <dougbtv@users.noreply.github.com> Co-authored-by: Tomofumi Hayashi <s1061123@users.noreply.github.com> Co-authored-by: Dan Williams <dcbw@users.noreply.github.com>
This commit is contained in:
committed by
Kuralamudhan Ramakrishnan
parent
f0794119ba
commit
fd79ef6505
@@ -18,8 +18,8 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
@@ -31,10 +31,6 @@ import (
|
|||||||
cnitypes "github.com/containernetworking/cni/pkg/types"
|
cnitypes "github.com/containernetworking/cni/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
DefaultConfDir = "/etc/cni/net.d"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NoK8sNetworkError indicates error, no network in kubernetes
|
// NoK8sNetworkError indicates error, no network in kubernetes
|
||||||
type NoK8sNetworkError struct {
|
type NoK8sNetworkError struct {
|
||||||
message string
|
message string
|
||||||
@@ -97,7 +93,7 @@ func parsePodNetworkObjectName(podnetwork string) (string, string, string, error
|
|||||||
allItems := []string{netNsName, networkName, netIfName}
|
allItems := []string{netNsName, networkName, netIfName}
|
||||||
for i := range allItems {
|
for i := range allItems {
|
||||||
matched, _ := regexp.MatchString("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", allItems[i])
|
matched, _ := regexp.MatchString("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", allItems[i])
|
||||||
if (!matched && len([]rune(allItems[i]))>0) {
|
if !matched && len([]rune(allItems[i])) > 0 {
|
||||||
return "", "", "", fmt.Errorf(fmt.Sprintf("Failed to parse: one or more items did not match comma-delimited format (must consist of lower case alphanumeric characters). Must start and end with an alphanumeric character), mismatch @ '%v'", allItems[i]))
|
return "", "", "", fmt.Errorf(fmt.Sprintf("Failed to parse: one or more items did not match comma-delimited format (must consist of lower case alphanumeric characters). Must start and end with an alphanumeric character), mismatch @ '%v'", allItems[i]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -145,7 +141,7 @@ func parsePodNetworkObject(podnetwork string) ([]map[string]interface{}, error)
|
|||||||
return podNet, nil
|
return podNet, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCNIConfig(name string, primary bool, ifname string) (string, error) {
|
func getCNIConfig(name string, primary bool, ifname string, confdir string) (string, error) {
|
||||||
|
|
||||||
// In the absence of valid keys in a Spec, the runtime (or
|
// In the absence of valid keys in a Spec, the runtime (or
|
||||||
// meta-plugin) should load and execute a CNI .configlist
|
// meta-plugin) should load and execute a CNI .configlist
|
||||||
@@ -155,13 +151,12 @@ func getCNIConfig(name string, primary bool, ifname string) (string, error) {
|
|||||||
//Todo
|
//Todo
|
||||||
// support conflist for chaining mechanism
|
// support conflist for chaining mechanism
|
||||||
// In part, adapted from K8s pkg/kubelet/dockershim/network/cni/cni.go#getDefaultCNINetwork
|
// In part, adapted from K8s pkg/kubelet/dockershim/network/cni/cni.go#getDefaultCNINetwork
|
||||||
confDir := DefaultConfDir
|
files, err := libcni.ConfFiles(confdir, []string{".conf", ".json"})
|
||||||
files, err := libcni.ConfFiles(confDir, []string{".conf", ".json"})
|
|
||||||
switch {
|
switch {
|
||||||
case err != nil:
|
case err != nil:
|
||||||
fmt.Errorf("No networks found in %s", confDir)
|
fmt.Errorf("No networks found in %s", confdir)
|
||||||
case len(files) == 0:
|
case len(files) == 0:
|
||||||
fmt.Errorf("No networks found in %s", confDir)
|
fmt.Errorf("No networks found in %s", confdir)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, confFile := range files {
|
for _, confFile := range files {
|
||||||
@@ -182,7 +177,7 @@ func getCNIConfig(name string, primary bool, ifname string) (string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", fmt.Errorf("no network available in the name %s in cni dir %s", name, confDir)
|
return "", fmt.Errorf("no network available in the name %s in cni dir %s", name, confdir)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPlugin(plugin string, name string, primary bool, ifname string) string {
|
func getPlugin(plugin string, name string, primary bool, ifname string) string {
|
||||||
@@ -254,12 +249,12 @@ func getNetSpec(ns types.NetworkSpec, name string, primary bool, ifname string)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNetObject(net types.Network, primary bool, ifname string) (string, error) {
|
func getNetObject(net types.Network, primary bool, ifname string, confdir string) (string, error) {
|
||||||
var config string
|
var config string
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if (types.NetworkSpec{}) == net.Spec {
|
if (types.NetworkSpec{}) == net.Spec {
|
||||||
config, err = getCNIConfig(net.Metadata.Name, primary, ifname)
|
config, err = getCNIConfig(net.Metadata.Name, primary, ifname, confdir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("getNetObject: err in getCNIConfig: %v", err)
|
return "", fmt.Errorf("getNetObject: err in getCNIConfig: %v", err)
|
||||||
}
|
}
|
||||||
@@ -273,7 +268,7 @@ func getNetObject(net types.Network, primary bool, ifname string) (string, error
|
|||||||
return config, nil
|
return config, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getnetplugin(client *kubernetes.Clientset, networkinfo map[string]interface{}, primary bool) (string, error) {
|
func getnetplugin(client *kubernetes.Clientset, networkinfo map[string]interface{}, primary bool, confdir string) (string, error) {
|
||||||
networkname := networkinfo["name"].(string)
|
networkname := networkinfo["name"].(string)
|
||||||
if networkname == "" {
|
if networkname == "" {
|
||||||
return "", fmt.Errorf("getnetplugin: network name can't be empty")
|
return "", fmt.Errorf("getnetplugin: network name can't be empty")
|
||||||
@@ -301,7 +296,7 @@ func getnetplugin(client *kubernetes.Clientset, networkinfo map[string]interface
|
|||||||
ifnameRequest = networkinfo["interfaceRequest"].(string)
|
ifnameRequest = networkinfo["interfaceRequest"].(string)
|
||||||
}
|
}
|
||||||
|
|
||||||
netargs, err := getNetObject(netobj, primary, ifnameRequest)
|
netargs, err := getNetObject(netobj, primary, ifnameRequest, confdir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -309,7 +304,7 @@ func getnetplugin(client *kubernetes.Clientset, networkinfo map[string]interface
|
|||||||
return netargs, nil
|
return netargs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPodNetworkObj(client *kubernetes.Clientset, netObjs []map[string]interface{}) (string, error) {
|
func getPodNetworkObj(client *kubernetes.Clientset, netObjs []map[string]interface{}, confdir string) (string, error) {
|
||||||
|
|
||||||
var np string
|
var np string
|
||||||
var err error
|
var err error
|
||||||
@@ -324,7 +319,7 @@ func getPodNetworkObj(client *kubernetes.Clientset, netObjs []map[string]interfa
|
|||||||
primary = true
|
primary = true
|
||||||
}
|
}
|
||||||
|
|
||||||
np, err = getnetplugin(client, net, primary)
|
np, err = getnetplugin(client, net, primary, confdir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("getPodNetworkObj: failed in getting the netplugin: %v", err)
|
return "", fmt.Errorf("getPodNetworkObj: failed in getting the netplugin: %v", err)
|
||||||
}
|
}
|
||||||
@@ -359,7 +354,7 @@ func getMultusDelegates(delegate string) ([]map[string]interface{}, error) {
|
|||||||
return tmpNetconf.Delegates, nil
|
return tmpNetconf.Delegates, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetK8sNetwork(args *skel.CmdArgs, kubeconfig string) ([]map[string]interface{}, error) {
|
func GetK8sNetwork(args *skel.CmdArgs, kubeconfig string, confdir string) ([]map[string]interface{}, error) {
|
||||||
k8sArgs := types.K8sArgs{}
|
k8sArgs := types.K8sArgs{}
|
||||||
var podNet []map[string]interface{}
|
var podNet []map[string]interface{}
|
||||||
|
|
||||||
@@ -387,7 +382,7 @@ func GetK8sNetwork(args *skel.CmdArgs, kubeconfig string) ([]map[string]interfac
|
|||||||
return podNet, err
|
return podNet, err
|
||||||
}
|
}
|
||||||
|
|
||||||
multusDelegates, err := getPodNetworkObj(k8sclient, netObjs)
|
multusDelegates, err := getPodNetworkObj(k8sclient, netObjs, confdir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return podNet, err
|
return podNet, err
|
||||||
}
|
}
|
||||||
|
@@ -34,7 +34,10 @@ import (
|
|||||||
"github.com/vishvananda/netlink"
|
"github.com/vishvananda/netlink"
|
||||||
)
|
)
|
||||||
|
|
||||||
const defaultCNIDir = "/var/lib/cni/multus"
|
const (
|
||||||
|
defaultCNIDir = "/var/lib/cni/multus"
|
||||||
|
defaultConfDir = "/etc/cni/multus/net.d"
|
||||||
|
)
|
||||||
|
|
||||||
var masterpluginEnabled bool
|
var masterpluginEnabled bool
|
||||||
var defaultcninetwork bool
|
var defaultcninetwork bool
|
||||||
@@ -64,6 +67,10 @@ func loadNetConf(bytes []byte) (*types.NetConf, error) {
|
|||||||
netconf.CNIDir = defaultCNIDir
|
netconf.CNIDir = defaultCNIDir
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if netconf.ConfDir == "" {
|
||||||
|
netconf.ConfDir = defaultConfDir
|
||||||
|
}
|
||||||
|
|
||||||
if netconf.UseDefault {
|
if netconf.UseDefault {
|
||||||
if netconf.Kubeconfig == "" || !defaultcninetwork {
|
if netconf.Kubeconfig == "" || !defaultcninetwork {
|
||||||
return nil, fmt.Errorf(`If you have set always_use_default, you must also set the delegates & the kubeconfig, refer to the README`)
|
return nil, fmt.Errorf(`If you have set always_use_default, you must also set the delegates & the kubeconfig, refer to the README`)
|
||||||
@@ -283,7 +290,7 @@ func cmdAdd(args *skel.CmdArgs) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if n.Kubeconfig != "" {
|
if n.Kubeconfig != "" {
|
||||||
podDelegate, err := k8s.GetK8sNetwork(args, n.Kubeconfig)
|
podDelegate, err := k8s.GetK8sNetwork(args, n.Kubeconfig, n.ConfDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if _, ok := err.(*k8s.NoK8sNetworkError); ok {
|
if _, ok := err.(*k8s.NoK8sNetworkError); ok {
|
||||||
nopodnet = true
|
nopodnet = true
|
||||||
@@ -362,7 +369,7 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if in.Kubeconfig != "" {
|
if in.Kubeconfig != "" {
|
||||||
podDelegate, r := k8s.GetK8sNetwork(args, in.Kubeconfig)
|
podDelegate, r := k8s.GetK8sNetwork(args, in.Kubeconfig, in.ConfDir)
|
||||||
if r != nil {
|
if r != nil {
|
||||||
if _, ok := r.(*k8s.NoK8sNetworkError); ok {
|
if _, ok := r.(*k8s.NoK8sNetworkError); ok {
|
||||||
nopodnet = true
|
nopodnet = true
|
||||||
|
@@ -25,6 +25,7 @@ import (
|
|||||||
// NetConf for cni config file written in json
|
// NetConf for cni config file written in json
|
||||||
type NetConf struct {
|
type NetConf struct {
|
||||||
types.NetConf
|
types.NetConf
|
||||||
|
ConfDir string `json:"confDir"`
|
||||||
CNIDir string `json:"cniDir"`
|
CNIDir string `json:"cniDir"`
|
||||||
Delegates []map[string]interface{} `json:"delegates"`
|
Delegates []map[string]interface{} `json:"delegates"`
|
||||||
Kubeconfig string `json:"kubeconfig"`
|
Kubeconfig string `json:"kubeconfig"`
|
||||||
|
Reference in New Issue
Block a user