Merge pull request #67 from s1061123/dev/add_verbose_info

Bug 1835033: Logging improvement (UID, net-attach-def) / Backport to 4.4
This commit is contained in:
OpenShift Merge Robot 2020-05-17 14:48:55 -07:00 committed by GitHub
commit 812441ce17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 78 additions and 55 deletions

View File

@ -454,22 +454,22 @@ func GetK8sArgs(args *skel.CmdArgs) (*types.K8sArgs, error) {
// TryLoadPodDelegates attempts to load Kubernetes-defined delegates and add them to the Multus config. // TryLoadPodDelegates attempts to load Kubernetes-defined delegates and add them to the Multus config.
// Returns the number of Kubernetes-defined delegates added or an error. // Returns the number of Kubernetes-defined delegates added or an error.
func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient KubeClient) (int, *ClientInfo, error) { func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient KubeClient) (int, *v1.Pod, *ClientInfo, error) {
var err error var err error
clientInfo := &ClientInfo{} clientInfo := &ClientInfo{}
logging.Debugf("TryLoadPodDelegates: %v, %v, %v", k8sArgs, conf, kubeClient) logging.Debugf("TryLoadPodDelegates: %v, %v, %v", k8sArgs, conf, kubeClient)
kubeClient, err = GetK8sClient(conf.Kubeconfig, kubeClient) kubeClient, err = GetK8sClient(conf.Kubeconfig, kubeClient)
if err != nil { if err != nil {
return 0, nil, err return 0, nil, nil, err
} }
if kubeClient == nil { if kubeClient == nil {
if len(conf.Delegates) == 0 { if len(conf.Delegates) == 0 {
// No available kube client and no delegates, we can't do anything // No available kube client and no delegates, we can't do anything
return 0, nil, logging.Errorf("TryLoadPodDelegates: must have either Kubernetes config or delegates") return 0, nil, nil, logging.Errorf("TryLoadPodDelegates: must have either Kubernetes config or delegates")
} }
return 0, nil, nil return 0, nil, nil, nil
} }
setKubeClientInfo(clientInfo, kubeClient, k8sArgs) setKubeClientInfo(clientInfo, kubeClient, k8sArgs)
@ -477,12 +477,12 @@ func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient
pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME))
if err != nil { if err != nil {
logging.Debugf("TryLoadPodDelegates: Err in loading K8s cluster default network from pod annotation: %v, use cached delegates", err) logging.Debugf("TryLoadPodDelegates: Err in loading K8s cluster default network from pod annotation: %v, use cached delegates", err)
return 0, nil, nil return 0, nil, nil, nil
} }
delegate, err := tryLoadK8sPodDefaultNetwork(kubeClient, pod, conf) delegate, err := tryLoadK8sPodDefaultNetwork(kubeClient, pod, conf)
if err != nil { if err != nil {
return 0, nil, logging.Errorf("TryLoadPodDelegates: error in loading K8s cluster default network from pod annotation: %v", err) return 0, nil, nil, logging.Errorf("TryLoadPodDelegates: error in loading K8s cluster default network from pod annotation: %v", err)
} }
if delegate != nil { if delegate != nil {
logging.Debugf("TryLoadPodDelegates: Overwrite the cluster default network with %v from pod annotations", delegate) logging.Debugf("TryLoadPodDelegates: Overwrite the cluster default network with %v from pod annotations", delegate)
@ -496,13 +496,13 @@ func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient
if err != nil { if err != nil {
if _, ok := err.(*NoK8sNetworkError); ok { if _, ok := err.(*NoK8sNetworkError); ok {
return 0, clientInfo, nil return 0, nil, clientInfo, nil
} }
return 0, nil, logging.Errorf("TryLoadPodDelegates: error in getting k8s network from pod: %v", err) return 0, nil, nil, logging.Errorf("TryLoadPodDelegates: error in getting k8s network from pod: %v", err)
} }
if err = conf.AddDelegates(delegates); err != nil { if err = conf.AddDelegates(delegates); err != nil {
return 0, nil, err return 0, nil, nil, err
} }
// Check gatewayRequest is configured in delegates // Check gatewayRequest is configured in delegates
@ -519,10 +519,10 @@ func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient
types.CheckGatewayConfig(conf.Delegates) types.CheckGatewayConfig(conf.Delegates)
} }
return len(delegates), clientInfo, nil return len(delegates), pod, clientInfo, nil
} }
return 0, clientInfo, nil return 0, pod, clientInfo, nil
} }
// GetK8sClient gets client info from kubeconfig // GetK8sClient gets client info from kubeconfig

View File

@ -580,7 +580,7 @@ var _ = Describe("k8sclient operations", func() {
Expect(netConf.Delegates[0].Conf.Name).To(Equal("net2")) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net2"))
Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet2")) Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet2"))
numK8sDelegates, _, err := TryLoadPodDelegates(k8sArgs, netConf, kubeClient) numK8sDelegates, _, _, err := TryLoadPodDelegates(k8sArgs, netConf, kubeClient)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(numK8sDelegates).To(Equal(0)) Expect(numK8sDelegates).To(Equal(0))
Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1"))
@ -617,7 +617,7 @@ var _ = Describe("k8sclient operations", func() {
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
netConf.ConfDir = "badfilepath" netConf.ConfDir = "badfilepath"
_, _, err = TryLoadPodDelegates(k8sArgs, netConf, kubeClient) _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, kubeClient)
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
}) })
@ -650,7 +650,7 @@ var _ = Describe("k8sclient operations", func() {
k8sArgs, err := GetK8sArgs(args) k8sArgs, err := GetK8sArgs(args)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
numK8sDelegates, _, err := TryLoadPodDelegates(k8sArgs, netConf, kubeClient) numK8sDelegates, _, _, err := TryLoadPodDelegates(k8sArgs, netConf, kubeClient)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(numK8sDelegates).To(Equal(0)) Expect(numK8sDelegates).To(Equal(0))
Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1"))
@ -685,7 +685,7 @@ var _ = Describe("k8sclient operations", func() {
k8sArgs, err := GetK8sArgs(args) k8sArgs, err := GetK8sArgs(args)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
_, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil) _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil)
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
}) })
@ -717,12 +717,12 @@ var _ = Describe("k8sclient operations", func() {
k8sArgs, err := GetK8sArgs(args) k8sArgs, err := GetK8sArgs(args)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
_, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil) _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// additionally, we expect the test to fail with no delegates, as at least one is always required. // additionally, we expect the test to fail with no delegates, as at least one is always required.
netConf.Delegates = nil netConf.Delegates = nil
_, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil) _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil)
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
}) })
@ -780,7 +780,7 @@ users:
k8sArgs, err := GetK8sArgs(args) k8sArgs, err := GetK8sArgs(args)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
_, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil) _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })

View File

@ -41,6 +41,7 @@ import (
"github.com/intel/multus-cni/netutils" "github.com/intel/multus-cni/netutils"
"github.com/intel/multus-cni/types" "github.com/intel/multus-cni/types"
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
) )
@ -221,7 +222,7 @@ func conflistDel(rt *libcni.RuntimeConf, rawnetconflist []byte, binDir string, e
return err return err
} }
func delegateAdd(exec invoke.Exec, ifName string, delegate *types.DelegateNetConf, rt *libcni.RuntimeConf, binDir string, cniArgs string) (cnitypes.Result, error) { func delegateAdd(exec invoke.Exec, pod *v1.Pod, ifName string, delegate *types.DelegateNetConf, rt *libcni.RuntimeConf, binDir string, cniArgs string) (cnitypes.Result, error) {
logging.Debugf("delegateAdd: %v, %s, %v, %v, %s", exec, ifName, delegate, rt, binDir) logging.Debugf("delegateAdd: %v, %s, %v, %v, %s", exec, ifName, delegate, rt, binDir)
if os.Setenv("CNI_IFNAME", ifName) != nil { if os.Setenv("CNI_IFNAME", ifName) != nil {
return nil, logging.Errorf("delegateAdd: error setting envionment variable CNI_IFNAME") return nil, logging.Errorf("delegateAdd: error setting envionment variable CNI_IFNAME")
@ -286,21 +287,25 @@ func delegateAdd(exec invoke.Exec, ifName string, delegate *types.DelegateNetCon
if logging.GetLoggingLevel() >= logging.VerboseLevel { if logging.GetLoggingLevel() >= logging.VerboseLevel {
data, _ := json.Marshal(result) data, _ := json.Marshal(result)
var confName string var cniConfName string
if delegate.ConfListPlugin { if delegate.ConfListPlugin {
confName = delegate.ConfList.Name cniConfName = delegate.ConfList.Name
} else { } else {
confName = delegate.Conf.Name cniConfName = delegate.Conf.Name
} }
logging.Verbosef("Add: %s:%s:%s:%s %s", rt.Args[1][1], rt.Args[2][1], confName, rt.IfName, string(data)) podUID := "unknownUID"
if pod != nil {
podUID = string(pod.ObjectMeta.UID)
}
logging.Verbosef("Add: %s:%s:%s:%s(%s):%s %s", rt.Args[1][1], rt.Args[2][1], podUID, delegate.Name, cniConfName, rt.IfName, string(data))
} }
return result, nil return result, nil
} }
func delegateDel(exec invoke.Exec, ifName string, delegateConf *types.DelegateNetConf, rt *libcni.RuntimeConf, binDir string) error { func delegateDel(exec invoke.Exec, pod *v1.Pod, ifName string, delegateConf *types.DelegateNetConf, rt *libcni.RuntimeConf, binDir string) error {
logging.Debugf("delegateDel: %v, %s, %v, %v, %s", exec, ifName, delegateConf, rt, binDir) logging.Debugf("delegateDel: %v, %v, %s, %v, %v, %s", exec, pod, ifName, delegateConf, rt, binDir)
if os.Setenv("CNI_IFNAME", ifName) != nil { if os.Setenv("CNI_IFNAME", ifName) != nil {
return logging.Errorf("delegateDel: error setting envionment variable CNI_IFNAME") return logging.Errorf("delegateDel: error setting envionment variable CNI_IFNAME")
} }
@ -312,7 +317,11 @@ func delegateDel(exec invoke.Exec, ifName string, delegateConf *types.DelegateNe
} else { } else {
confName = delegateConf.Conf.Name confName = delegateConf.Conf.Name
} }
logging.Verbosef("Del: %s:%s:%s:%s %s", rt.Args[1][1], rt.Args[2][1], confName, rt.IfName, string(delegateConf.Bytes)) podUID := "unknownUID"
if pod != nil {
podUID = string(pod.ObjectMeta.UID)
}
logging.Verbosef("Del: %s:%s:%s:%s:%s %s", rt.Args[1][1], rt.Args[2][1], podUID, confName, rt.IfName, string(delegateConf.Bytes))
} }
var err error var err error
@ -331,8 +340,8 @@ func delegateDel(exec invoke.Exec, ifName string, delegateConf *types.DelegateNe
return err return err
} }
func delPlugins(exec invoke.Exec, argIfname string, delegates []*types.DelegateNetConf, lastIdx int, rt *libcni.RuntimeConf, binDir string) error { func delPlugins(exec invoke.Exec, pod *v1.Pod, argIfname string, delegates []*types.DelegateNetConf, lastIdx int, rt *libcni.RuntimeConf, binDir string) error {
logging.Debugf("delPlugins: %v, %s, %v, %d, %v, %s", exec, argIfname, delegates, lastIdx, rt, binDir) logging.Debugf("delPlugins: %v, %v, %s, %v, %d, %v, %s", exec, pod, argIfname, delegates, lastIdx, rt, binDir)
if os.Setenv("CNI_COMMAND", "DEL") != nil { if os.Setenv("CNI_COMMAND", "DEL") != nil {
return logging.Errorf("delPlugins: error setting envionment variable CNI_COMMAND to a value of DEL") return logging.Errorf("delPlugins: error setting envionment variable CNI_COMMAND to a value of DEL")
} }
@ -342,7 +351,7 @@ func delPlugins(exec invoke.Exec, argIfname string, delegates []*types.DelegateN
ifName := getIfname(delegates[idx], argIfname, idx) ifName := getIfname(delegates[idx], argIfname, idx)
rt.IfName = ifName rt.IfName = ifName
// Attempt to delete all but do not error out, instead, collect all errors. // Attempt to delete all but do not error out, instead, collect all errors.
if err := delegateDel(exec, ifName, delegates[idx], rt, binDir); err != nil { if err := delegateDel(exec, pod, ifName, delegates[idx], rt, binDir); err != nil {
errorstrings = append(errorstrings, err.Error()) errorstrings = append(errorstrings, err.Error())
} }
} }
@ -394,7 +403,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
n.Delegates[0].MasterPlugin = true n.Delegates[0].MasterPlugin = true
} }
_, kc, err := k8s.TryLoadPodDelegates(k8sArgs, n, kubeClient) _, pod, kc, err := k8s.TryLoadPodDelegates(k8sArgs, n, kubeClient)
if err != nil { if err != nil {
return nil, cmdErr(k8sArgs, "error loading k8s delegates k8s args: %v", err) return nil, cmdErr(k8sArgs, "error loading k8s delegates k8s args: %v", err)
} }
@ -412,7 +421,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
runtimeConfig := types.MergeCNIRuntimeConfig(n.RuntimeConfig, delegate) runtimeConfig := types.MergeCNIRuntimeConfig(n.RuntimeConfig, delegate)
rt := types.CreateCNIRuntimeConf(args, k8sArgs, ifName, runtimeConfig) rt := types.CreateCNIRuntimeConf(args, k8sArgs, ifName, runtimeConfig)
tmpResult, err = delegateAdd(exec, ifName, delegate, rt, n.BinDir, cniArgs) tmpResult, err = delegateAdd(exec, pod, ifName, delegate, rt, n.BinDir, cniArgs)
if err != nil { if err != nil {
// If the add failed, tear down all networks we already added // If the add failed, tear down all networks we already added
netName := delegate.Conf.Name netName := delegate.Conf.Name
@ -420,7 +429,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
netName = delegate.ConfList.Name netName = delegate.ConfList.Name
} }
// Ignore errors; DEL must be idempotent anyway // Ignore errors; DEL must be idempotent anyway
_ = delPlugins(exec, args.IfName, n.Delegates, idx, rt, n.BinDir) _ = delPlugins(exec, nil, args.IfName, n.Delegates, idx, rt, n.BinDir)
return nil, cmdErr(k8sArgs, "error adding container to network %q: %v", netName, err) return nil, cmdErr(k8sArgs, "error adding container to network %q: %v", netName, err)
} }
@ -553,7 +562,7 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) err
} }
// Get pod annotation and so on // Get pod annotation and so on
_, _, err := k8s.TryLoadPodDelegates(k8sArgs, in, kubeClient) _, _, _, err := k8s.TryLoadPodDelegates(k8sArgs, in, kubeClient)
if err != nil { if err != nil {
if len(in.Delegates) == 0 { if len(in.Delegates) == 0 {
// No delegate available so send error // No delegate available so send error
@ -603,8 +612,16 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) err
} }
} }
kubeClient, err = k8s.GetK8sClient(in.Kubeconfig, kubeClient)
var pod *v1.Pod
if kubeClient != nil {
podName := string(k8sArgs.K8S_POD_NAME)
podNamespace := string(k8sArgs.K8S_POD_NAMESPACE)
pod, _ = kubeClient.GetPod(podNamespace, podName)
}
rt := types.CreateCNIRuntimeConf(args, k8sArgs, "", in.RuntimeConfig) rt := types.CreateCNIRuntimeConf(args, k8sArgs, "", in.RuntimeConfig)
return delPlugins(exec, args.IfName, in.Delegates, len(in.Delegates)-1, rt, in.BinDir) return delPlugins(exec, pod, args.IfName, in.Delegates, len(in.Delegates)-1, rt, in.BinDir)
} }
func main() { func main() {

View File

@ -1169,7 +1169,7 @@ var _ = Describe("multus operations", func() {
_, err = cmdAdd(args, fExec, nil) _, err = cmdAdd(args, fExec, nil)
Expect(fExec.addIndex).To(Equal(2)) Expect(fExec.addIndex).To(Equal(2))
Expect(fExec.delIndex).To(Equal(2)) Expect(fExec.delIndex).To(Equal(2))
Expect(err).To(MatchError("Multus: error adding pod to network \"other1\": delegateAdd: error invoking DelegateAdd - \"other-plugin\": error in getting result from AddNetwork: expected plugin failure")) Expect(err).To(MatchError("Multus: [/]: error adding container to network \"other1\": delegateAdd: error invoking DelegateAdd - \"other-plugin\": error in getting result from AddNetwork: expected plugin failure"))
// Cleanup default network file. // Cleanup default network file.
if _, errStat := os.Stat(configPath); errStat == nil { if _, errStat := os.Stat(configPath); errStat == nil {
@ -1805,7 +1805,7 @@ var _ = Describe("multus operations", func() {
err = cmdDel(args, fExec, fKubeClient) err = cmdDel(args, fExec, fKubeClient)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) Expect(fExec.delIndex).To(Equal(len(fExec.plugins)))
Expect(fKubeClient.PodCount).To(Equal(3)) Expect(fKubeClient.PodCount).To(Equal(4))
Expect(fKubeClient.NetCount).To(Equal(1)) Expect(fKubeClient.NetCount).To(Equal(1))
}) })
@ -1886,7 +1886,7 @@ var _ = Describe("multus operations", func() {
err = cmdDel(args, fExec, fKubeClient) err = cmdDel(args, fExec, fKubeClient)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) Expect(fExec.delIndex).To(Equal(len(fExec.plugins)))
Expect(fKubeClient.PodCount).To(Equal(4)) Expect(fKubeClient.PodCount).To(Equal(5))
Expect(fKubeClient.NetCount).To(Equal(2)) Expect(fKubeClient.NetCount).To(Equal(2))
}) })

View File

@ -149,6 +149,7 @@ func NewFakePod(name string, netAnnotation string, defaultNetAnnotation string)
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: name, Name: name,
Namespace: "test", Namespace: "test",
UID: "testUID",
}, },
Spec: v1.PodSpec{ Spec: v1.PodSpec{
Containers: []v1.Container{ Containers: []v1.Container{

View File

@ -97,6 +97,9 @@ func LoadDelegateNetConf(bytes []byte, net *NetworkSelectionElement, deviceID st
} }
if net != nil { if net != nil {
if net.Name != "" {
delegateConf.Name = net.Name
}
if net.InterfaceRequest != "" { if net.InterfaceRequest != "" {
delegateConf.IfnameRequest = net.InterfaceRequest delegateConf.IfnameRequest = net.InterfaceRequest
} }
@ -160,6 +163,7 @@ func CreateCNIRuntimeConf(args *skel.CmdArgs, k8sArgs *K8sArgs, ifName string, r
ContainerID: args.ContainerID, ContainerID: args.ContainerID,
NetNS: args.Netns, NetNS: args.Netns,
IfName: ifName, IfName: ifName,
// NOTE: Verbose logging depends on this order, so please keep Args order.
Args: [][2]string{ Args: [][2]string{
{"IgnoreUnknown", string("true")}, {"IgnoreUnknown", string("true")},
{"K8S_POD_NAMESPACE", string(k8sArgs.K8S_POD_NAMESPACE)}, {"K8S_POD_NAMESPACE", string(k8sArgs.K8S_POD_NAMESPACE)},

View File

@ -368,17 +368,17 @@ var _ = Describe("config operations", func() {
"args1": "val1" "args1": "val1"
}` }`
type bridgeNetConf struct { type bridgeNetConf struct {
Name string `json:"name"` Name string `json:"name"`
Type string `json:"type"` Type string `json:"type"`
Args struct { Args struct {
CNI map[string]string `json:"cni"` CNI map[string]string `json:"cni"`
} `json:"args"` } `json:"args"`
} }
err := json.Unmarshal([]byte(cniArgs), &args) err := json.Unmarshal([]byte(cniArgs), &args)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
net := &NetworkSelectionElement{ net := &NetworkSelectionElement{
Name: "test-elem", Name: "test-elem",
CNIArgs: &args, CNIArgs: &args,
} }
delegateNetConf, err := LoadDelegateNetConf([]byte(conf), net, "") delegateNetConf, err := LoadDelegateNetConf([]byte(conf), net, "")
@ -404,17 +404,17 @@ var _ = Describe("config operations", func() {
"args1": "val1a" "args1": "val1a"
}` }`
type bridgeNetConf struct { type bridgeNetConf struct {
Name string `json:"name"` Name string `json:"name"`
Type string `json:"type"` Type string `json:"type"`
Args struct { Args struct {
CNI map[string]string `json:"cni"` CNI map[string]string `json:"cni"`
} `json:"args"` } `json:"args"`
} }
err := json.Unmarshal([]byte(cniArgs), &args) err := json.Unmarshal([]byte(cniArgs), &args)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
net := &NetworkSelectionElement{ net := &NetworkSelectionElement{
Name: "test-elem", Name: "test-elem",
CNIArgs: &args, CNIArgs: &args,
} }
delegateNetConf, err := LoadDelegateNetConf([]byte(conf), net, "") delegateNetConf, err := LoadDelegateNetConf([]byte(conf), net, "")
@ -439,20 +439,20 @@ var _ = Describe("config operations", func() {
"args1": "val1" "args1": "val1"
}` }`
type bridgeNetConf struct { type bridgeNetConf struct {
Type string `json:"type"` Type string `json:"type"`
Args struct { Args struct {
CNI map[string]string `json:"cni"` CNI map[string]string `json:"cni"`
} `json:"args"` } `json:"args"`
} }
type bridgeNetConfList struct { type bridgeNetConfList struct {
Name string `json:"name"` Name string `json:"name"`
Plugins []*bridgeNetConf `json:"plugins"` Plugins []*bridgeNetConf `json:"plugins"`
} }
err := json.Unmarshal([]byte(cniArgs), &args) err := json.Unmarshal([]byte(cniArgs), &args)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
net := &NetworkSelectionElement{ net := &NetworkSelectionElement{
Name: "test-elem", Name: "test-elem",
CNIArgs: &args, CNIArgs: &args,
} }
delegateNetConf, err := LoadDelegateNetConf([]byte(conf), net, "") delegateNetConf, err := LoadDelegateNetConf([]byte(conf), net, "")

View File

@ -94,6 +94,7 @@ type NetworkStatus struct {
type DelegateNetConf struct { type DelegateNetConf struct {
Conf types.NetConf Conf types.NetConf
ConfList types.NetConfList ConfList types.NetConfList
Name string
IfnameRequest string `json:"ifnameRequest,omitempty"` IfnameRequest string `json:"ifnameRequest,omitempty"`
MacRequest string `json:"macRequest,omitempty"` MacRequest string `json:"macRequest,omitempty"`
IPRequest []string `json:"ipRequest,omitempty"` IPRequest []string `json:"ipRequest,omitempty"`