Skip to content

Commit

Permalink
do not set gatewayType for non ovn subnet and custom vpc subnet (kube…
Browse files Browse the repository at this point in the history
…ovn#4283)

Signed-off-by: oilbeater <liumengxinfly@gmail.com>
  • Loading branch information
oilbeater authored and SkalaNetworks committed Jul 12, 2024
1 parent 48013ba commit f6e8d2b
Show file tree
Hide file tree
Showing 4 changed files with 177 additions and 21 deletions.
7 changes: 7 additions & 0 deletions pkg/controller/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@ func newFakeController(t *testing.T) *fakeController {
syncVirtualPortsQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), ""),
}

ctrl.config = &Configuration{
ClusterRouter: "ovn-cluster",
DefaultLogicalSwitch: "ovn-default",
NodeSwitch: "join",
KubeOvnClient: kubeovnClient,
}

return &fakeController{
fakeController: ctrl,
fakeInformers: fakeInformers,
Expand Down
46 changes: 26 additions & 20 deletions pkg/controller/subnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,36 +290,36 @@ func (c *Controller) formatSubnet(subnet *kubeovnv1.Subnet) (*kubeovnv1.Subnet,
klog.Error(err)
return nil, err
}

if subnet.Spec.Provider == "" {
subnet.Spec.Provider = util.OvnProvider
changed = true
}
newCIDRBlock := subnet.Spec.CIDRBlock
if subnet.Spec.Protocol != util.CheckProtocol(newCIDRBlock) {
subnet.Spec.Protocol = util.CheckProtocol(subnet.Spec.CIDRBlock)
changed = true
}
if subnet.Spec.GatewayType == "" {
subnet.Spec.GatewayType = kubeovnv1.GWDistributedType
changed = true
}

if subnet.Spec.Vpc == "" {
if !isOvnSubnet(subnet) {
klog.Infof("subnet %s is not ovn subnet, no vpc", subnet.Name)
} else {
changed = true
if isOvnSubnet(subnet) {
subnet.Spec.Vpc = c.config.ClusterRouter
changed = true
}
}

if subnet.Spec.Vpc == c.config.ClusterRouter && subnet.Name != c.config.NodeSwitch {
// Some format only needed in the default VPC
if subnet.Spec.GatewayType == "" {
subnet.Spec.GatewayType = kubeovnv1.GWDistributedType
changed = true
}
// Some features only work in the default VPC
if subnet.Spec.Default && subnet.Name != c.config.DefaultLogicalSwitch {
subnet.Spec.Default = false
changed = true
}
if subnet.Spec.Vlan != "" {
if _, err := c.vlansLister.Get(subnet.Spec.Vlan); err != nil {
err = fmt.Errorf("failed to get vlan %s: %s", subnet.Spec.Vlan, err)
klog.Error(err)
return nil, err
}
}

if subnet.Spec.Vlan != "" {
if _, err := c.vlansLister.Get(subnet.Spec.Vlan); err != nil {
err = fmt.Errorf("failed to get vlan %s: %s", subnet.Spec.Vlan, err)
klog.Error(err)
return nil, err
}
}

Expand Down Expand Up @@ -404,6 +404,12 @@ func checkSubnetChanged(subnet *kubeovnv1.Subnet) (bool, error) {
if changed = checkAndUpdateExcludeIPs(subnet); changed {
ret = true
}

if subnet.Spec.Protocol != util.CheckProtocol(subnet.Spec.CIDRBlock) {
subnet.Spec.Protocol = util.CheckProtocol(subnet.Spec.CIDRBlock)
ret = true
}

return ret, nil
}

Expand Down
143 changes: 143 additions & 0 deletions pkg/controller/subnet_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package controller

import (
"context"
"fmt"
"testing"

Expand Down Expand Up @@ -131,3 +132,145 @@ func Test_syncVirtualPort(t *testing.T) {
err = ctrl.syncVirtualPort(subnet.Name)
require.NoError(t, err)
}

func Test_formatSubnet(t *testing.T) {
t.Parallel()

fakeController := newFakeController(t)
ctrl := fakeController.fakeController
// enable := true
disable := false

tests := map[string]struct {
input *kubeovnv1.Subnet
output *kubeovnv1.Subnet
}{
"simple subnet with cidr block only": {
input: &kubeovnv1.Subnet{
ObjectMeta: metav1.ObjectMeta{
Name: "simple",
},
Spec: kubeovnv1.SubnetSpec{
CIDRBlock: "192.168.0.1/24",
},
},
output: &kubeovnv1.Subnet{
ObjectMeta: metav1.ObjectMeta{
Name: "simple",
},
Spec: kubeovnv1.SubnetSpec{
CIDRBlock: "192.168.0.0/24",
Protocol: kubeovnv1.ProtocolIPv4,
Gateway: "192.168.0.1",
Vpc: ctrl.config.ClusterRouter,
ExcludeIps: []string{"192.168.0.1"},
Provider: "ovn",
GatewayType: kubeovnv1.GWDistributedType,
EnableLb: &ctrl.config.EnableLb,
},
},
},
"complete subnet that do not need to be formatted": {
input: &kubeovnv1.Subnet{
ObjectMeta: metav1.ObjectMeta{
Name: "complete",
},
Spec: kubeovnv1.SubnetSpec{
CIDRBlock: "192.168.0.0/24",
Protocol: kubeovnv1.ProtocolIPv4,
Gateway: "192.168.0.255",
Vpc: "test-vpc",
ExcludeIps: []string{"192.168.0.1", "192.168.0.255"},
Provider: "ovn.test-provider",
GatewayType: kubeovnv1.GWCentralizedType,
EnableLb: &disable,
},
},
output: &kubeovnv1.Subnet{
ObjectMeta: metav1.ObjectMeta{
Name: "complete",
},
Spec: kubeovnv1.SubnetSpec{
CIDRBlock: "192.168.0.0/24",
Protocol: kubeovnv1.ProtocolIPv4,
Gateway: "192.168.0.255",
Vpc: "test-vpc",
ExcludeIps: []string{"192.168.0.1", "192.168.0.255"},
Provider: "ovn.test-provider",
GatewayType: kubeovnv1.GWCentralizedType,
EnableLb: &disable,
},
},
},
"do not format gatewayType for custom VPC subnet": {
input: &kubeovnv1.Subnet{
ObjectMeta: metav1.ObjectMeta{
Name: "custom-vpc",
},
Spec: kubeovnv1.SubnetSpec{
CIDRBlock: "192.168.0.0/24",
Protocol: kubeovnv1.ProtocolIPv4,
Gateway: "192.168.0.255",
Vpc: "test-vpc",
ExcludeIps: []string{"192.168.0.1", "192.168.0.255"},
Provider: "ovn.test-provider",
EnableLb: &disable,
},
},
output: &kubeovnv1.Subnet{
ObjectMeta: metav1.ObjectMeta{
Name: "custom-vpc",
},
Spec: kubeovnv1.SubnetSpec{
CIDRBlock: "192.168.0.0/24",
Protocol: kubeovnv1.ProtocolIPv4,
Gateway: "192.168.0.255",
Vpc: "test-vpc",
ExcludeIps: []string{"192.168.0.1", "192.168.0.255"},
Provider: "ovn.test-provider",
EnableLb: &disable,
},
},
},
"do not format gatewayType for non ovn subnet": {
input: &kubeovnv1.Subnet{
ObjectMeta: metav1.ObjectMeta{
Name: "external",
},
Spec: kubeovnv1.SubnetSpec{
CIDRBlock: "192.168.0.0/24",
Protocol: kubeovnv1.ProtocolIPv4,
Gateway: "192.168.0.255",
ExcludeIps: []string{"192.168.0.1", "192.168.0.255"},
Provider: "test-provider",
EnableLb: &disable,
},
},
output: &kubeovnv1.Subnet{
ObjectMeta: metav1.ObjectMeta{
Name: "external",
},
Spec: kubeovnv1.SubnetSpec{
CIDRBlock: "192.168.0.0/24",
Protocol: kubeovnv1.ProtocolIPv4,
Gateway: "192.168.0.255",
ExcludeIps: []string{"192.168.0.1", "192.168.0.255"},
Provider: "test-provider",
EnableLb: &disable,
},
},
},
}

for name, tc := range tests {
t.Run(name, func(t *testing.T) {
_, err := ctrl.config.KubeOvnClient.KubeovnV1().Subnets().Create(context.Background(), tc.input, metav1.CreateOptions{})
require.NoError(t, err)
formattedSubnet, err := ctrl.formatSubnet(tc.input)
require.NoError(t, err)
require.Equal(t, tc.output, formattedSubnet)
err = ctrl.config.KubeOvnClient.KubeovnV1().Subnets().Delete(context.Background(), tc.input.Name, metav1.DeleteOptions{})
require.NoError(t, err)
})
}
}
2 changes: 1 addition & 1 deletion pkg/controller/vpc_lb.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ func (c *Controller) createVpcLb(vpc *kubeovnv1.Vpc) error {

func (c *Controller) deleteVpcLb(vpc *kubeovnv1.Vpc) error {
name := vpcLbDeploymentName(vpc.Name)
klog.Infof("delete vpc lb deployment for %s", name)
_, err := c.config.KubeClient.AppsV1().Deployments(c.config.PodNamespace).Get(context.Background(), name, metav1.GetOptions{})
if err != nil {
if k8serrors.IsNotFound(err) {
Expand All @@ -57,6 +56,7 @@ func (c *Controller) deleteVpcLb(vpc *kubeovnv1.Vpc) error {
return err
}

klog.Infof("delete vpc lb deployment for %s", name)
if err = c.config.KubeClient.AppsV1().Deployments(c.config.PodNamespace).Delete(context.Background(), name, metav1.DeleteOptions{}); err != nil {
klog.Errorf("failed to delete LB deployment of VPC %s: %v", vpc.Name, err)
return err
Expand Down

0 comments on commit f6e8d2b

Please sign in to comment.