From 51980378eec2d00c9696df0dedf020a92d94ddf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=BE=AE=E6=BE=9C?= Date: Tue, 17 Oct 2023 16:59:08 +0800 Subject: [PATCH] sync subnet to vpc while switching between custom VPC and default VPC (#3218) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * sync subnet to vpc while subnet's vpc modified Signed-off-by: 夜微澜 * update check conditions of vpc names Signed-off-by: 夜微澜 --------- Signed-off-by: 夜微澜 --- pkg/controller/subnet.go | 234 ++++++++++++++++++++++----------------- pkg/controller/vpc.go | 4 +- pkg/util/const.go | 3 + 3 files changed, 139 insertions(+), 102 deletions(-) diff --git a/pkg/controller/subnet.go b/pkg/controller/subnet.go index d442c4738db..ea739a12fd3 100644 --- a/pkg/controller/subnet.go +++ b/pkg/controller/subnet.go @@ -28,8 +28,11 @@ import ( ) func (c *Controller) enqueueAddSubnet(obj interface{}) { - var key string - var err error + var ( + key string + err error + ) + if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { utilruntime.HandleError(err) return @@ -39,8 +42,11 @@ func (c *Controller) enqueueAddSubnet(obj interface{}) { } func (c *Controller) enqueueDeleteSubnet(obj interface{}) { - var key string - var err error + var ( + key string + err error + ) + if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { utilruntime.HandleError(err) return @@ -53,26 +59,37 @@ func (c *Controller) enqueueUpdateSubnet(oldObj, newObj interface{}) { oldSubnet := oldObj.(*kubeovnv1.Subnet) newSubnet := newObj.(*kubeovnv1.Subnet) - var key string - var err error + var ( + usingIPs float64 + key, u2oInterconnIP string + err error + ) + if key, err = cache.MetaNamespaceKeyFunc(newObj); err != nil { utilruntime.HandleError(err) return } - var usingIPs float64 if newSubnet.Spec.Protocol == kubeovnv1.ProtocolIPv6 { usingIPs = newSubnet.Status.V6UsingIPs } else { usingIPs = newSubnet.Status.V4UsingIPs } - u2oInterconnIP := newSubnet.Status.U2OInterconnectionIP + + u2oInterconnIP = newSubnet.Status.U2OInterconnectionIP if !newSubnet.DeletionTimestamp.IsZero() && usingIPs == 0 || (usingIPs == 1 && u2oInterconnIP != "") { c.addOrUpdateSubnetQueue.Add(key) return } - if oldSubnet.Spec.Vpc != newSubnet.Spec.Vpc { + if oldSubnet.Spec.Vpc != newSubnet.Spec.Vpc && + !(oldSubnet.Spec.Vpc == "" && newSubnet.Spec.Vpc == c.config.ClusterRouter || + oldSubnet.Spec.Vpc == c.config.ClusterRouter && newSubnet.Spec.Vpc == "") { + if oldSubnet.Spec.Vpc == "" { + newSubnet.Annotations[util.VpcLastName] = c.config.ClusterRouter + } else { + newSubnet.Annotations[util.VpcLastName] = oldSubnet.Spec.Vpc + } c.updateVpcStatusQueue.Add(oldSubnet.Spec.Vpc) } @@ -103,8 +120,8 @@ func (c *Controller) enqueueUpdateSubnet(oldObj, newObj interface{}) { oldSubnet.Spec.Vpc != newSubnet.Spec.Vpc || oldSubnet.Spec.NatOutgoing != newSubnet.Spec.NatOutgoing || !reflect.DeepEqual(oldSubnet.Spec.NatOutgoingPolicyRules, newSubnet.Spec.NatOutgoingPolicyRules) || - (newSubnet.Spec.U2OInterconnection && newSubnet.Spec.U2OInterconnectionIP != "" && - oldSubnet.Spec.U2OInterconnectionIP != newSubnet.Spec.U2OInterconnectionIP) { + (newSubnet.Spec.U2OInterconnection && newSubnet.Spec.U2OInterconnectionIP != "" && oldSubnet.Spec.U2OInterconnectionIP != newSubnet.Spec.U2OInterconnectionIP) { + klog.V(3).Infof("enqueue update subnet %s", key) if oldSubnet.Spec.GatewayType != newSubnet.Spec.GatewayType { @@ -176,7 +193,7 @@ func (c *Controller) processNextAddSubnetWorkItem() bool { return false } - err := func(obj interface{}) error { + if err := func(obj interface{}) error { defer c.addOrUpdateSubnetQueue.Done(obj) var key string var ok bool @@ -191,8 +208,7 @@ func (c *Controller) processNextAddSubnetWorkItem() bool { } c.addOrUpdateSubnetQueue.Forget(obj) return nil - }(obj) - if err != nil { + }(obj); err != nil { utilruntime.HandleError(err) return true } @@ -205,7 +221,7 @@ func (c *Controller) processNextUpdateSubnetStatusWorkItem() bool { return false } - err := func(obj interface{}) error { + if err := func(obj interface{}) error { defer c.updateSubnetStatusQueue.Done(obj) var key string var ok bool @@ -220,8 +236,7 @@ func (c *Controller) processNextUpdateSubnetStatusWorkItem() bool { } c.updateSubnetStatusQueue.Forget(obj) return nil - }(obj) - if err != nil { + }(obj); err != nil { utilruntime.HandleError(err) return true } @@ -234,7 +249,7 @@ func (c *Controller) processNextDeleteSubnetWorkItem() bool { return false } - err := func(obj interface{}) error { + if err := func(obj interface{}) error { defer c.deleteSubnetQueue.Done(obj) var subnet *kubeovnv1.Subnet var ok bool @@ -249,8 +264,7 @@ func (c *Controller) processNextDeleteSubnetWorkItem() bool { } c.deleteSubnetQueue.Forget(obj) return nil - }(obj) - if err != nil { + }(obj); err != nil { utilruntime.HandleError(err) return true } @@ -258,11 +272,12 @@ func (c *Controller) processNextDeleteSubnetWorkItem() bool { } func formatSubnet(subnet *kubeovnv1.Subnet, c *Controller) (*kubeovnv1.Subnet, error) { - var err error - changed := false + var ( + changed bool + err error + ) - changed, err = checkSubnetChanged(subnet) - if err != nil { + if changed, err = checkSubnetChanged(subnet); err != nil { klog.Error(err) return nil, err } @@ -354,37 +369,40 @@ func (c *Controller) updateNatOutgoingPolicyRulesStatus(subnet *kubeovnv1.Subnet } func checkSubnetChanged(subnet *kubeovnv1.Subnet) (bool, error) { - var err error - changed := false - ret := false + var ( + changed, ret bool + err error + ) // changed value may be overlapped, so use ret to record value - changed, err = checkAndUpdateCIDR(subnet) - if err != nil { + if changed, err = checkAndUpdateCIDR(subnet); err != nil { klog.Error(err) return changed, err } if changed { ret = true } - changed, err = checkAndUpdateGateway(subnet) - if err != nil { + + if changed, err = checkAndUpdateGateway(subnet); err != nil { klog.Error(err) return changed, err } if changed { ret = true } - changed = checkAndUpdateExcludeIps(subnet) - if changed { + + if changed = checkAndUpdateExcludeIPs(subnet); changed { ret = true } return ret, nil } func checkAndUpdateCIDR(subnet *kubeovnv1.Subnet) (bool, error) { - changed := false - var cidrBlocks []string + var ( + changed bool + cidrBlocks []string + ) + for _, cidr := range strings.Split(subnet.Spec.CIDRBlock, ",") { _, ipNet, err := net.ParseCIDR(cidr) if err != nil { @@ -401,9 +419,12 @@ func checkAndUpdateCIDR(subnet *kubeovnv1.Subnet) (bool, error) { } func checkAndUpdateGateway(subnet *kubeovnv1.Subnet) (bool, error) { - changed := false - var gw string - var err error + var ( + changed bool + gw string + err error + ) + switch { case subnet.Spec.Gateway == "": gw, err = util.GetGwByCidr(subnet.Spec.CIDRBlock) @@ -425,17 +446,19 @@ func checkAndUpdateGateway(subnet *kubeovnv1.Subnet) (bool, error) { } // this func must be called after subnet.Spec.Gateway is valued -func checkAndUpdateExcludeIps(subnet *kubeovnv1.Subnet) bool { - changed := false - var excludeIps []string - excludeIps = append(excludeIps, strings.Split(subnet.Spec.Gateway, ",")...) - sort.Strings(excludeIps) +func checkAndUpdateExcludeIPs(subnet *kubeovnv1.Subnet) bool { + var ( + changed bool + excludeIPs []string + ) + excludeIPs = append(excludeIPs, strings.Split(subnet.Spec.Gateway, ",")...) + sort.Strings(excludeIPs) if len(subnet.Spec.ExcludeIps) == 0 { - subnet.Spec.ExcludeIps = excludeIps + subnet.Spec.ExcludeIps = excludeIPs changed = true } else { - changed = checkAndFormatsExcludeIps(subnet) - for _, gw := range excludeIps { + changed = checkAndFormatsExcludeIPs(subnet) + for _, gw := range excludeIPs { gwExists := false for _, excludeIP := range subnet.Spec.ExcludeIps { if util.ContainsIPs(excludeIP, gw) { @@ -465,13 +488,13 @@ func (c *Controller) handleSubnetFinalizer(subnet *kubeovnv1.Subnet) (bool, erro return false, nil } - usingIps := subnet.Status.V4UsingIPs + usingIPs := subnet.Status.V4UsingIPs if util.CheckProtocol(subnet.Spec.CIDRBlock) == kubeovnv1.ProtocolIPv6 { - usingIps = subnet.Status.V6UsingIPs + usingIPs = subnet.Status.V6UsingIPs } u2oInterconnIP := subnet.Status.U2OInterconnectionIP - if !subnet.DeletionTimestamp.IsZero() && (usingIps == 0 || (usingIps == 1 && u2oInterconnIP != "")) { + if !subnet.DeletionTimestamp.IsZero() && (usingIPs == 0 || (usingIPs == 1 && u2oInterconnIP != "")) { subnet.Finalizers = util.RemoveString(subnet.Finalizers, util.ControllerName) if _, err := c.config.KubeOvnClient.KubeovnV1().Subnets().Update(context.Background(), subnet, metav1.UpdateOptions{}); err != nil { klog.Errorf("failed to remove finalizer from subnet %s, %v", subnet.Name, err) @@ -499,8 +522,7 @@ func (c Controller) patchSubnetStatus(subnet *kubeovnv1.Subnet, reason, errStr s } } - bytes, err := subnet.Status.Bytes() - if err != nil { + if bytes, err := subnet.Status.Bytes(); err != nil { klog.Error(err) } else { if _, err := c.config.KubeOvnClient.KubeovnV1().Subnets().Patch(context.Background(), subnet.Name, types.MergePatchType, bytes, metav1.PatchOptions{}, "status"); err != nil { @@ -537,7 +559,9 @@ func (c *Controller) validateVpcBySubnet(subnet *kubeovnv1.Subnet) (*kubeovnv1.V return vpc, err } for _, vpc := range vpcs { - if subnet.Spec.Vpc != vpc.Name && !vpc.Status.Default && util.IsStringsOverlap(vpc.Spec.Namespaces, subnet.Spec.Namespaces) { + if (subnet.Annotations[util.VpcLastName] == "" && subnet.Spec.Vpc != vpc.Name || + subnet.Annotations[util.VpcLastName] != "" && subnet.Annotations[util.VpcLastName] != vpc.Name) && + !vpc.Status.Default && util.IsStringsOverlap(vpc.Spec.Namespaces, subnet.Spec.Namespaces) { err = fmt.Errorf("namespaces %v are overlap with vpc '%s'", subnet.Spec.Namespaces, vpc.Name) klog.Error(err) return vpc, err @@ -1153,7 +1177,10 @@ func (c *Controller) syncVirtualPort(key string) error { } func (c *Controller) reconcileNamespaces(subnet *kubeovnv1.Subnet) error { - var err error + var ( + namespaces []*v1.Namespace + err error + ) // 1. add annotations to bind namespace for _, ns := range subnet.Spec.Namespaces { @@ -1161,8 +1188,7 @@ func (c *Controller) reconcileNamespaces(subnet *kubeovnv1.Subnet) error { } // 2. update unbind namespace annotation - namespaces, err := c.namespacesLister.List(labels.Everything()) - if err != nil { + if namespaces, err = c.namespacesLister.List(labels.Everything()); err != nil { klog.Errorf("failed to list namespaces, %v", err) return err } @@ -1190,8 +1216,7 @@ func (c *Controller) reconcileCustomVpcBfdStaticRoute(vpcName, subnetName string klog.Error(err) return err } - needUpdate := false - v4Exist := false + subnet, err := c.subnetsLister.Get(subnetName) if err != nil { klog.Errorf("failed to get subnet %s, %v", subnetName, err) @@ -1205,7 +1230,13 @@ func (c *Controller) reconcileCustomVpcBfdStaticRoute(vpcName, subnetName string klog.Errorf("failed to get vpc %s, %v", vpcName, err) return err } - lrpEipName := fmt.Sprintf("%s-%s", vpcName, c.config.ExternalGatewaySwitch) + + var ( + needUpdate, v4Exist bool + lrpEipName string + ) + + lrpEipName = fmt.Sprintf("%s-%s", vpcName, c.config.ExternalGatewaySwitch) lrpEip, err := c.ovnEipsLister.Get(lrpEipName) if err != nil { err := fmt.Errorf("failed to get lrp eip %s, %v", lrpEipName, err) @@ -1218,6 +1249,7 @@ func (c *Controller) reconcileCustomVpcBfdStaticRoute(vpcName, subnetName string return err } vpc := cachedVpc.DeepCopy() + for _, eip := range ovnEips { if !eip.Status.Ready || eip.Status.V4Ip == "" { err := fmt.Errorf("ovn eip %q not ready", eip.Name) @@ -1589,11 +1621,13 @@ func (c *Controller) reconcileDefaultCentralizedSubnetRouteInDefaultVpc(subnet * func (c *Controller) reconcileEcmpCentralizedSubnetRouteInDefaultVpc(subnet *kubeovnv1.Subnet) error { // centralized subnet, enable ecmp, add ecmp policy route - gatewayNodes := strings.Split(subnet.Spec.GatewayNode, ",") - nodeV4Ips := make([]string, 0, len(gatewayNodes)) - nodeV6Ips := make([]string, 0, len(gatewayNodes)) - nameV4IpMap := make(map[string]string, len(gatewayNodes)) - nameV6IpMap := make(map[string]string, len(gatewayNodes)) + var ( + gatewayNodes = strings.Split(subnet.Spec.GatewayNode, ",") + nodeV4IPs = make([]string, 0, len(gatewayNodes)) + nodeV6IPs = make([]string, 0, len(gatewayNodes)) + nameV4IPMap = make(map[string]string, len(gatewayNodes)) + nameV6IPMap = make(map[string]string, len(gatewayNodes)) + ) for _, gw := range gatewayNodes { // the format of gatewayNodeStr can be like 'kube-ovn-worker:172.18.0.2, kube-ovn-control-plane:172.18.0.3', which consists of node name and designative egress ip @@ -1617,39 +1651,39 @@ func (c *Controller) reconcileEcmpCentralizedSubnetRouteInDefaultVpc(subnet *kub } nexthopV4, nexthopV6 := util.SplitStringIP(nexthopNodeIP) if nexthopV4 != "" { - nameV4IpMap[node.Name] = nexthopV4 - nodeV4Ips = append(nodeV4Ips, nexthopV4) + nameV4IPMap[node.Name] = nexthopV4 + nodeV4IPs = append(nodeV4IPs, nexthopV4) } if nexthopV6 != "" { - nameV6IpMap[node.Name] = nexthopV6 - nodeV6Ips = append(nodeV6Ips, nexthopV6) + nameV6IPMap[node.Name] = nexthopV6 + nodeV6IPs = append(nodeV6IPs, nexthopV6) } } else { klog.Errorf("gateway node %v is not ready", gw) } } - v4Cidr, v6Cidr := util.SplitStringIP(subnet.Spec.CIDRBlock) - if nodeV4Ips != nil && v4Cidr != "" { + v4CIDR, v6CIDR := util.SplitStringIP(subnet.Spec.CIDRBlock) + if nodeV4IPs != nil && v4CIDR != "" { klog.Infof("delete old distributed policy route for subnet %s", subnet.Name) if err := c.deletePolicyRouteByGatewayType(subnet, kubeovnv1.GWDistributedType, false); err != nil { klog.Errorf("failed to delete policy route for overlay subnet %s, %v", subnet.Name, err) return err } - klog.Infof("subnet %s configure ecmp policy route, nexthops %v", subnet.Name, nodeV4Ips) - if err := c.updatePolicyRouteForCentralizedSubnet(subnet.Name, v4Cidr, nodeV4Ips, nameV4IpMap); err != nil { + klog.Infof("subnet %s configure ecmp policy route, nexthops %v", subnet.Name, nodeV4IPs) + if err := c.updatePolicyRouteForCentralizedSubnet(subnet.Name, v4CIDR, nodeV4IPs, nameV4IPMap); err != nil { klog.Errorf("failed to add v4 ecmp policy route for centralized subnet %s: %v", subnet.Name, err) return err } } - if nodeV6Ips != nil && v6Cidr != "" { + if nodeV6IPs != nil && v6CIDR != "" { klog.Infof("delete old distributed policy route for subnet %s", subnet.Name) if err := c.deletePolicyRouteByGatewayType(subnet, kubeovnv1.GWDistributedType, false); err != nil { klog.Errorf("failed to delete policy route for overlay subnet %s, %v", subnet.Name, err) return err } - klog.Infof("subnet %s configure ecmp policy route, nexthops %v", subnet.Name, nodeV6Ips) - if err := c.updatePolicyRouteForCentralizedSubnet(subnet.Name, v6Cidr, nodeV6Ips, nameV6IpMap); err != nil { + klog.Infof("subnet %s configure ecmp policy route, nexthops %v", subnet.Name, nodeV6IPs) + if err := c.updatePolicyRouteForCentralizedSubnet(subnet.Name, v6CIDR, nodeV6IPs, nameV6IPMap); err != nil { klog.Errorf("failed to add v6 ecmp policy route for centralized subnet %s: %v", subnet.Name, err) return err } @@ -1942,11 +1976,11 @@ func calcDualSubnetStatusIP(subnet *kubeovnv1.Subnet, c *Controller) error { } // subnet.Spec.ExcludeIps contains both v4 and v6 addresses - v4ExcludeIps, v6ExcludeIps := util.SplitIpsByProtocol(subnet.Spec.ExcludeIps) + v4ExcludeIPs, v6ExcludeIPs := util.SplitIpsByProtocol(subnet.Spec.ExcludeIps) // gateway always in excludeIPs cidrBlocks := strings.Split(subnet.Spec.CIDRBlock, ",") - v4toSubIPs := util.ExpandExcludeIPs(v4ExcludeIps, cidrBlocks[0]) - v6toSubIPs := util.ExpandExcludeIPs(v6ExcludeIps, cidrBlocks[1]) + v4toSubIPs := util.ExpandExcludeIPs(v4ExcludeIPs, cidrBlocks[0]) + v6toSubIPs := util.ExpandExcludeIPs(v6ExcludeIPs, cidrBlocks[1]) _, v4CIDR, _ := net.ParseCIDR(cidrBlocks[0]) _, v6CIDR, _ := net.ParseCIDR(cidrBlocks[1]) v4availableIPs := util.AddressCount(v4CIDR) - util.CountIPNums(v4toSubIPs) @@ -2108,40 +2142,40 @@ func isOvnSubnet(subnet *kubeovnv1.Subnet) bool { return subnet.Spec.Provider == "" || subnet.Spec.Provider == util.OvnProvider || strings.HasSuffix(subnet.Spec.Provider, "ovn") } -func checkAndFormatsExcludeIps(subnet *kubeovnv1.Subnet) bool { - var excludeIps []string - mapIps := make(map[string]*ipam.IPRange, len(subnet.Spec.ExcludeIps)) +func checkAndFormatsExcludeIPs(subnet *kubeovnv1.Subnet) bool { + var excludeIPs []string + mapIPs := make(map[string]*ipam.IPRange, len(subnet.Spec.ExcludeIps)) for _, excludeIP := range subnet.Spec.ExcludeIps { - if _, ok := mapIps[excludeIP]; !ok { + if _, ok := mapIPs[excludeIP]; !ok { ips := strings.Split(excludeIP, "..") start, _ := ipam.NewIP(ips[0]) end := start if len(ips) != 1 { end, _ = ipam.NewIP(ips[1]) } - mapIps[excludeIP] = ipam.NewIPRange(start, end) + mapIPs[excludeIP] = ipam.NewIPRange(start, end) } } - newMap := filterRepeatIPRange(mapIps) + newMap := filterRepeatIPRange(mapIPs) for _, v := range newMap { if v.Start().Equal(v.End()) { - excludeIps = append(excludeIps, v.Start().String()) + excludeIPs = append(excludeIPs, v.Start().String()) } else { - excludeIps = append(excludeIps, v.Start().String()+".."+v.End().String()) + excludeIPs = append(excludeIPs, v.Start().String()+".."+v.End().String()) } } - sort.Strings(excludeIps) - if !reflect.DeepEqual(subnet.Spec.ExcludeIps, excludeIps) { - klog.V(3).Infof("excludeips before format is %v, after format is %v", subnet.Spec.ExcludeIps, excludeIps) - subnet.Spec.ExcludeIps = excludeIps + sort.Strings(excludeIPs) + if !reflect.DeepEqual(subnet.Spec.ExcludeIps, excludeIPs) { + klog.V(3).Infof("excludeips before format is %v, after format is %v", subnet.Spec.ExcludeIps, excludeIPs) + subnet.Spec.ExcludeIps = excludeIPs return true } return false } -func filterRepeatIPRange(mapIps map[string]*ipam.IPRange) map[string]*ipam.IPRange { - for ka, a := range mapIps { - for kb, b := range mapIps { +func filterRepeatIPRange(mapIPs map[string]*ipam.IPRange) map[string]*ipam.IPRange { + for ka, a := range mapIPs { + for kb, b := range mapIPs { if ka == kb && a == b { continue } @@ -2152,30 +2186,30 @@ func filterRepeatIPRange(mapIps map[string]*ipam.IPRange) map[string]*ipam.IPRan if (a.Start().Equal(b.Start()) || a.Start().GreaterThan(b.Start())) && (a.End().Equal(b.End()) || a.End().LessThan(b.End())) { - delete(mapIps, ka) + delete(mapIPs, ka) continue } if (a.Start().Equal(b.Start()) || a.Start().GreaterThan(b.Start())) && a.End().GreaterThan(b.End()) { - delete(mapIps, ka) - mapIps[kb] = ipam.NewIPRange(b.Start(), a.End()) + delete(mapIPs, ka) + mapIPs[kb] = ipam.NewIPRange(b.Start(), a.End()) continue } if (a.End().Equal(b.End()) || a.End().LessThan(b.End())) && a.Start().LessThan(b.Start()) { - delete(mapIps, ka) - mapIps[kb] = ipam.NewIPRange(a.Start(), b.End()) + delete(mapIPs, ka) + mapIPs[kb] = ipam.NewIPRange(a.Start(), b.End()) continue } // a contains b - mapIps[kb] = a - delete(mapIps, ka) + mapIPs[kb] = a + delete(mapIPs, ka) } } - return mapIps + return mapIPs } func (c *Controller) checkGwNodeExists(gatewayNode string) bool { diff --git a/pkg/controller/vpc.go b/pkg/controller/vpc.go index fa837b13f57..c79910b0829 100644 --- a/pkg/controller/vpc.go +++ b/pkg/controller/vpc.go @@ -66,7 +66,7 @@ func (c *Controller) enqueueUpdateVpc(oldObj, newObj interface{}) { if newVpc.Annotations == nil { newVpc.Annotations = make(map[string]string) } - newVpc.Annotations["ovn.kubernetes.io/last_policies"] = convertPolicies(oldVpc.Spec.PolicyRoutes) + newVpc.Annotations[util.VpcLastPolicies] = convertPolicies(oldVpc.Spec.PolicyRoutes) c.addOrUpdateVpcQueue.Add(key) } @@ -440,7 +440,7 @@ func (c *Controller) handleAddOrUpdateVpc(key string) error { ) if vpc.Name == c.config.ClusterRouter { - policyRouteExisted = reversePolicies(vpc.Annotations["ovn.kubernetes.io/last_policies"]) + policyRouteExisted = reversePolicies(vpc.Annotations[util.VpcLastPolicies]) // diff list policyRouteNeedDel, policyRouteNeedAdd = diffPolicyRouteWithExisted(policyRouteExisted, vpc.Spec.PolicyRoutes) } else { diff --git a/pkg/util/const.go b/pkg/util/const.go index 2f5caad537e..e0d7ddbc7fa 100644 --- a/pkg/util/const.go +++ b/pkg/util/const.go @@ -111,6 +111,9 @@ const ( NodeNameLabel = "ovn.kubernetes.io/node-name" NetworkPolicyLogAnnotation = "ovn.kubernetes.io/enable_log" + VpcLastName = "ovn.kubernetes.io/last_vpc_name" + VpcLastPolicies = "ovn.kubernetes.io/last_policies" + ProtocolTCP = "tcp" ProtocolUDP = "udp" ProtocolSCTP = "sctp"