From 8d05a6cdf709c6d290bd7b47f31eff1e142b9b20 Mon Sep 17 00:00:00 2001 From: Evan Baker Date: Tue, 5 Apr 2022 21:34:18 +0000 Subject: [PATCH] support CIDR notation in the NC PrimaryIP Signed-off-by: Evan Baker --- cns/singletenantcontroller/conversion.go | 22 ++++--- cns/singletenantcontroller/conversion_test.go | 60 ++++++++++--------- 2 files changed, 47 insertions(+), 35 deletions(-) diff --git a/cns/singletenantcontroller/conversion.go b/cns/singletenantcontroller/conversion.go index 9b6577f558..e1dbd5be5d 100644 --- a/cns/singletenantcontroller/conversion.go +++ b/cns/singletenantcontroller/conversion.go @@ -2,7 +2,9 @@ package kubecontroller import ( "net" + "net/netip" //nolint:gci // netip breaks gci?? "strconv" + "strings" "github.com/Azure/azure-container-networking/cns" "github.com/Azure/azure-container-networking/crd/nodenetworkconfig/api/v1alpha" @@ -32,21 +34,25 @@ func CRDStatusToNCRequest(status *v1alpha.NodeNetworkConfigStatus) (cns.CreateNe nc := status.NetworkContainers[0] - ip := net.ParseIP(nc.PrimaryIP) - if ip == nil { - return cns.CreateNetworkContainerRequest{}, errors.Wrapf(ErrInvalidPrimaryIP, "IP: %s", nc.PrimaryIP) + primaryIP := nc.PrimaryIP + // if the PrimaryIP is not a CIDR, append a /32 + if !strings.Contains(primaryIP, "/") { + primaryIP += "/32" } - _, ipNet, err := net.ParseCIDR(nc.SubnetAddressSpace) + primaryPrefix, err := netip.ParsePrefix(primaryIP) if err != nil { - return cns.CreateNetworkContainerRequest{}, errors.Wrapf(err, "invalid SubnetAddressSpace %s", nc.SubnetAddressSpace) + return cns.CreateNetworkContainerRequest{}, errors.Wrapf(err, "IP: %s", primaryIP) } - size, _ := ipNet.Mask.Size() + secondaryPrefix, err := netip.ParsePrefix(nc.SubnetAddressSpace) + if err != nil { + return cns.CreateNetworkContainerRequest{}, errors.Wrapf(err, "invalid SubnetAddressSpace %s", nc.SubnetAddressSpace) + } subnet := cns.IPSubnet{ - IPAddress: ip.String(), - PrefixLength: uint8(size), + IPAddress: primaryPrefix.Addr().String(), + PrefixLength: uint8(secondaryPrefix.Bits()), } secondaryIPConfigs := map[string]cns.SecondaryIPConfig{} diff --git a/cns/singletenantcontroller/conversion_test.go b/cns/singletenantcontroller/conversion_test.go index c02725c027..4dd4ea4651 100644 --- a/cns/singletenantcontroller/conversion_test.go +++ b/cns/singletenantcontroller/conversion_test.go @@ -1,18 +1,18 @@ package kubecontroller import ( - "reflect" "strconv" "testing" "github.com/Azure/azure-container-networking/cns" "github.com/Azure/azure-container-networking/crd/nodenetworkconfig/api/v1alpha" + "github.com/stretchr/testify/assert" ) const ( uuid = "539970a2-c2dd-11ea-b3de-0242ac130004" defaultGateway = "10.0.0.2" - ipInCIDR = "10.0.0.1/32" + ipIsCIDR = "10.0.0.1/32" ipMalformed = "10.0.0.0.0" ncID = "160005ba-cd02-11ea-87d0-0242ac130003" primaryIP = "10.0.0.1" @@ -74,24 +74,30 @@ var validRequest = cns.CreateNetworkContainerRequest{ func TestConvertNNCStatusToNCRequest(t *testing.T) { tests := []struct { name string - status v1alpha.NodeNetworkConfigStatus - ncreq cns.CreateNetworkContainerRequest + input v1alpha.NodeNetworkConfigStatus + want cns.CreateNetworkContainerRequest wantErr bool }{ + { + name: "valid", + input: validStatus, + wantErr: false, + want: validRequest, + }, { name: "no nc", - status: v1alpha.NodeNetworkConfigStatus{}, + input: v1alpha.NodeNetworkConfigStatus{}, wantErr: false, - ncreq: cns.CreateNetworkContainerRequest{}, + want: cns.CreateNetworkContainerRequest{}, }, { name: ">1 nc", - status: invalidStatusMultiNC, + input: invalidStatusMultiNC, wantErr: true, }, { name: "malformed primary IP", - status: v1alpha.NodeNetworkConfigStatus{ + input: v1alpha.NodeNetworkConfigStatus{ NetworkContainers: []v1alpha.NetworkContainer{ { PrimaryIP: ipMalformed, @@ -110,7 +116,7 @@ func TestConvertNNCStatusToNCRequest(t *testing.T) { }, { name: "malformed IP assignment", - status: v1alpha.NodeNetworkConfigStatus{ + input: v1alpha.NodeNetworkConfigStatus{ NetworkContainers: []v1alpha.NetworkContainer{ { PrimaryIP: primaryIP, @@ -129,10 +135,10 @@ func TestConvertNNCStatusToNCRequest(t *testing.T) { }, { name: "IP is CIDR", - status: v1alpha.NodeNetworkConfigStatus{ + input: v1alpha.NodeNetworkConfigStatus{ NetworkContainers: []v1alpha.NetworkContainer{ { - PrimaryIP: ipInCIDR, + PrimaryIP: ipIsCIDR, ID: ncID, IPAssignments: []v1alpha.IPAssignment{ { @@ -140,15 +146,22 @@ func TestConvertNNCStatusToNCRequest(t *testing.T) { IP: testSecIP, }, }, + SubnetName: subnetName, + DefaultGateway: defaultGateway, SubnetAddressSpace: subnetAddressSpace, + Version: version, }, }, + Scaler: v1alpha.Scaler{ + BatchSize: 1, + }, }, - wantErr: true, + wantErr: false, + want: validRequest, }, { name: "IP assignment is CIDR", - status: v1alpha.NodeNetworkConfigStatus{ + input: v1alpha.NodeNetworkConfigStatus{ NetworkContainers: []v1alpha.NetworkContainer{ { PrimaryIP: primaryIP, @@ -156,7 +169,7 @@ func TestConvertNNCStatusToNCRequest(t *testing.T) { IPAssignments: []v1alpha.IPAssignment{ { Name: uuid, - IP: ipInCIDR, + IP: ipIsCIDR, }, }, SubnetAddressSpace: subnetAddressSpace, @@ -167,7 +180,7 @@ func TestConvertNNCStatusToNCRequest(t *testing.T) { }, { name: "address space is not CIDR", - status: v1alpha.NodeNetworkConfigStatus{ + input: v1alpha.NodeNetworkConfigStatus{ NetworkContainers: []v1alpha.NetworkContainer{ { PrimaryIP: primaryIP, @@ -184,24 +197,17 @@ func TestConvertNNCStatusToNCRequest(t *testing.T) { }, wantErr: true, }, - { - name: "valid", - status: validStatus, - wantErr: false, - ncreq: validRequest, - }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { - got, err := CRDStatusToNCRequest(&tt.status) - if (err != nil) != tt.wantErr { - t.Errorf("ConvertNNCStatusToNCRequest() error = %v, wantErr %v", err, tt.wantErr) + got, err := CRDStatusToNCRequest(&tt.input) + if tt.wantErr { + assert.Error(t, err) return } - if !reflect.DeepEqual(got, tt.ncreq) { - t.Errorf("ConvertNNCStatusToNCRequest()\nhave: %+v\n want: %+v", got, tt.ncreq) - } + assert.NoError(t, err) + assert.EqualValues(t, tt.want, got) }) } }