diff --git a/pkg/controller/init.go b/pkg/controller/init.go index be2fb550881..8d58121c9fb 100644 --- a/pkg/controller/init.go +++ b/pkg/controller/init.go @@ -5,6 +5,7 @@ import ( "fmt" "strings" + v1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -12,6 +13,7 @@ import ( "k8s.io/klog" kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" + "github.com/kubeovn/kube-ovn/pkg/ovs" "github.com/kubeovn/kube-ovn/pkg/util" ) @@ -298,6 +300,9 @@ func (c *Controller) InitIPAM() error { } } } + if err = c.initAppendPodExternalIds(pod); err != nil { + klog.Errorf("failed to init append pod %s.%s externalIds: %v", pod.Name, pod.Namespace, err) + } } } @@ -318,6 +323,10 @@ func (c *Controller) InitIPAM() error { if v4IP != "" && v6IP != "" { node.Annotations[util.IpAddressAnnotation] = util.GetStringIP(v4IP, v6IP) } + + if err = c.initAppendNodeExternalIds(portName, node.Name); err != nil { + klog.Errorf("failed to init append node %s externalIds: %v", node.Name, err) + } } } @@ -465,3 +474,48 @@ func (c *Controller) initSyncCrdVlans() error { return nil } + +func (c *Controller) initAppendPodExternalIds(pod *v1.Pod) error { + podNets, err := c.getPodKubeovnNets(pod) + if err != nil { + klog.Errorf("failed to get pod nets %v", err) + return err + } + + for _, podNet := range podNets { + portName := ovs.PodNameToPortName(pod.Name, pod.Namespace, podNet.ProviderName) + externalIds, err := c.ovnClient.OvnGet("logical_switch_port", portName, "external_ids", "") + if err != nil { + klog.Errorf("failed to get lsp external_ids for pod %s/%s, %v", pod.Namespace, pod.Name, err) + return err + } + if strings.Contains(externalIds, "pod") || strings.Contains(externalIds, "vendor") { + continue + } + + ovnCommand := []string{"set", "logical_switch_port", portName, fmt.Sprintf("external_ids:pod=%s/%s", pod.Namespace, pod.Name), fmt.Sprintf("external_ids:vendor=%s", util.CniTypeName)} + if err = c.ovnClient.SetLspExternalIds(ovnCommand); err != nil { + klog.Errorf("failed to set lsp external_ids for pod %s/%s, %v", pod.Namespace, pod.Name, err) + return err + } + } + return nil +} + +func (c *Controller) initAppendNodeExternalIds(portName, nodeName string) error { + externalIds, err := c.ovnClient.OvnGet("logical_switch_port", portName, "external_ids", "") + if err != nil { + klog.Errorf("failed to get lsp external_ids for node %s, %v", nodeName, err) + return err + } + if strings.Contains(externalIds, "vendor") { + return nil + } + + ovnCommand := []string{"set", "logical_switch_port", portName, fmt.Sprintf("external_ids:vendor=%s", util.CniTypeName)} + if err = c.ovnClient.SetLspExternalIds(ovnCommand); err != nil { + klog.Errorf("failed to set lsp external_ids for node %s, %v", nodeName, err) + return err + } + return nil +} diff --git a/pkg/ovs/ovn-nbctl.go b/pkg/ovs/ovn-nbctl.go index b3792aafb95..0f1df6f439c 100644 --- a/pkg/ovs/ovn-nbctl.go +++ b/pkg/ovs/ovn-nbctl.go @@ -1155,3 +1155,21 @@ func (c Client) CreateLocalnetPort(ls, port, providerName, vlanID string) error return nil } + +func (c Client) OvnGet(table, record, column, key string) (string, error) { + var columnVal string + if key == "" { + columnVal = column + } else { + columnVal = column + ":" + key + } + args := []string{"get", table, record, columnVal} + return c.ovnNbCommand(args...) +} + +func (c Client) SetLspExternalIds(cmd []string) error { + if _, err := c.ovnNbCommand(cmd...); err != nil { + return fmt.Errorf("failed to set lsp externalIds, %v", err) + } + return nil +}