diff --git a/multus/multus.go b/multus/multus.go index 14f8adf86..3d2a4dc71 100644 --- a/multus/multus.go +++ b/multus/multus.go @@ -294,6 +294,31 @@ func getPodNetworkAnnotation(client *kubernetes.Clientset, k8sArgs K8sArgs) (str return pod.Annotations["kubernetes.cni.cncf.io/networks"], nil } +func parsePodNetworkObjectName(podnetwork string) (string, string, string, error) { + var netNsName string + var netIfName string + var networkName string + + slashItems := strings.Split(podnetwork, "/") + if len(slashItems) == 2 { + netNsName = strings.TrimSpace(slashItems[0]) + networkName = slashItems[1] + } else if len(slashItems) == 1 { + networkName = slashItems[0] + } else { + return "", "", "", fmt.Errorf("Invalid network object (failed at '/')") + } + + atItems := strings.Split(networkName, "@") + networkName = strings.TrimSpace(atItems[0]) + if len(atItems) == 2 { + netIfName = strings.TrimSpace(atItems[1]) + } else if len(atItems) != 1 { + return "", "", "", fmt.Errorf("Invalid network object (failed at '@')") + } + return netNsName, networkName, netIfName, nil +} + func parsePodNetworkObject(podnetwork string) ([]map[string]interface{}, error) { var podNet []map[string]interface{} @@ -307,12 +332,20 @@ func parsePodNetworkObject(podnetwork string) ([]map[string]interface{}, error) commaItems := strings.Split(podnetwork, ",") // Build a map from the comma delimited items. for i := range commaItems { - atItems := strings.Split(commaItems[i], "@") - m := make(map[string]interface{}) - m["name"] = strings.TrimSpace(atItems[0]) - if len(atItems) == 2 { - m["interfaceRequest"] = atItems[1] + // Parse network name (i.e. /@) + netNsName, networkName, netIfName, err := parsePodNetworkObjectName(commaItems[i]) + if err != nil { + return nil, fmt.Errorf("parsePodNetworkObject: %v", err) } + m := make(map[string]interface{}) + m["name"] = networkName + if netNsName != "" { + m["namespace"] = netNsName + } + if netIfName != "" { + m["interfaceRequest"] = netIfName + } + podNet = append(podNet, m) } } @@ -361,7 +394,12 @@ func getnetplugin(client *kubernetes.Clientset, networkinfo map[string]interface return "", fmt.Errorf("getnetplugin: network name can't be empty") } - tprclient := fmt.Sprintf("/apis/cni.cncf.io/v1/namespaces/default/networks/%s", networkname) + netNsName := "default" + if networkinfo["namespace"] != nil { + netNsName = networkinfo["namespace"].(string) + } + + tprclient := fmt.Sprintf("/apis/cni.cncf.io/v1/namespaces/%s/networks/%s", netNsName, networkname) netobjdata, err := client.ExtensionsV1beta1().RESTClient().Get().AbsPath(tprclient).DoRaw() if err != nil {