From 4072eb76269c8ddf409874e704d5d89a5b0d50a0 Mon Sep 17 00:00:00 2001 From: bobz965 Date: Thu, 8 Dec 2022 19:01:28 +0800 Subject: [PATCH] fix vpc spec external not true after init external gw (#2140) --- pkg/controller/external-gw.go | 30 ++++++++++++++++++++---------- pkg/controller/subnet.go | 19 ++++++++++++++----- pkg/daemon/config.go | 2 +- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/pkg/controller/external-gw.go b/pkg/controller/external-gw.go index 248bf9ad079..397bd100951 100644 --- a/pkg/controller/external-gw.go +++ b/pkg/controller/external-gw.go @@ -63,23 +63,33 @@ func (c *Controller) resyncExternalGateway() { lastExGwCM = cm.Data c.ovnLegacyClient.ExternalGatewayType = cm.Data["type"] klog.Info("finish establishing ovn external gw") + cachedVpc, err := c.vpcsLister.Get(c.config.ClusterRouter) if err != nil { klog.Errorf("failed to get vpc %s, %v", c.config.ClusterRouter, err) return } vpc := cachedVpc.DeepCopy() - vpc.Spec.EnableExternal = true - vpc.Status.EnableExternal = true - bytes, err := vpc.Status.Bytes() - if err != nil { - klog.Errorf("failed to get vpc bytes, %v", err) - return + if !vpc.Spec.EnableExternal { + vpc.Spec.EnableExternal = true + if _, err := c.config.KubeOvnClient.KubeovnV1().Vpcs().Update(context.Background(), vpc, metav1.UpdateOptions{}); err != nil { + errMsg := fmt.Errorf("failed to update vpc enable external %s, %v", vpc.Name, err) + klog.Error(errMsg) + return + } } - if _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Patch(context.Background(), - vpc.Name, types.MergePatchType, bytes, metav1.PatchOptions{}, "status"); err != nil { - klog.Errorf("failed to patch vpc %s, %v", c.config.ClusterRouter, err) - return + if !vpc.Status.EnableExternal { + vpc.Status.EnableExternal = true + bytes, err := vpc.Status.Bytes() + if err != nil { + klog.Errorf("failed to get vpc bytes, %v", err) + return + } + if _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Patch(context.Background(), + vpc.Name, types.MergePatchType, bytes, metav1.PatchOptions{}, "status"); err != nil { + klog.Errorf("failed to patch vpc %s, %v", c.config.ClusterRouter, err) + return + } } } } diff --git a/pkg/controller/subnet.go b/pkg/controller/subnet.go index 4dafa814b4d..b412a5037fd 100644 --- a/pkg/controller/subnet.go +++ b/pkg/controller/subnet.go @@ -484,6 +484,7 @@ func (c *Controller) handleAddOrUpdateSubnet(key string) error { } return err } + klog.V(4).Infof("handle add or update subnet %s", cachedSubnet.Name) subnet := cachedSubnet.DeepCopy() if err = formatSubnet(subnet, c); err != nil { @@ -640,9 +641,11 @@ func (c *Controller) handleAddOrUpdateSubnet(key string) error { } } else { // logical switch exists, only update other_config - if err := c.ovnLegacyClient.SetLogicalSwitchConfig(subnet.Name, vpc.Status.Router, subnet.Spec.Protocol, subnet.Spec.CIDRBlock, subnet.Spec.Gateway, subnet.Spec.ExcludeIps, needRouter); err != nil { - c.patchSubnetStatus(subnet, "SetLogicalSwitchConfigFailed", err.Error()) - return err + if !randomAllocateGW { + if err := c.ovnLegacyClient.SetLogicalSwitchConfig(subnet.Name, vpc.Status.Router, subnet.Spec.Protocol, subnet.Spec.CIDRBlock, subnet.Spec.Gateway, subnet.Spec.ExcludeIps, needRouter); err != nil { + c.patchSubnetStatus(subnet, "SetLogicalSwitchConfigFailed", err.Error()) + return err + } } if !needRouter && !randomAllocateGW { klog.Infof("remove connection from router %s to switch %s", vpc.Status.Router, subnet.Name) @@ -818,7 +821,7 @@ func (c *Controller) handleDeleteSubnet(subnet *kubeovnv1.Subnet) error { } } else { if k8serrors.IsNotFound(err) { - klog.Infof("remove connection from router %s to switch %s", vpc.Status.Router, subnet.Name) + klog.Infof("remove connection from router %s to switch %s", util.DefaultVpc, subnet.Name) if err = c.ovnLegacyClient.RemoveRouterPort(subnet.Name, util.DefaultVpc); err != nil { klog.Errorf("failed to delete router port %s %v", subnet.Name, err) return err @@ -1382,8 +1385,14 @@ func (c *Controller) reconcileVlan(subnet *kubeovnv1.Subnet) error { if subnet.Spec.Vlan == "" { return nil } - klog.Infof("reconcile vlan %v", subnet.Spec.Vlan) + isExternalGatewaySwitch := !subnet.Spec.LogicalGateway && subnet.Name == c.config.ExternalGatewaySwitch + if isExternalGatewaySwitch { + // external gw deal this vlan subnet, just skip + klog.Infof("skip reconcile vlan subnet %s", c.config.ExternalGatewaySwitch) + return nil + } + vlan, err := c.vlansLister.Get(subnet.Spec.Vlan) if err != nil { klog.Errorf("failed to get vlan %s: %v", subnet.Spec.Vlan, err) diff --git a/pkg/daemon/config.go b/pkg/daemon/config.go index c6e7fda362f..5e80ef7352e 100644 --- a/pkg/daemon/config.go +++ b/pkg/daemon/config.go @@ -55,7 +55,7 @@ type Configuration struct { DefaultProviderName string DefaultInterfaceName string ExternalGatewayConfigNS string - ExternalGatewaySwitch string + ExternalGatewaySwitch string // provider network underlay vlan subnet } // ParseFlags will parse cmd args then init kubeClient and configuration