diff --git a/pkg/cloudprovider/providers/azure/azure_routes_test.go b/pkg/cloudprovider/providers/azure/azure_routes_test.go index cc248ee52e6..1d251da63b2 100644 --- a/pkg/cloudprovider/providers/azure/azure_routes_test.go +++ b/pkg/cloudprovider/providers/azure/azure_routes_test.go @@ -22,6 +22,7 @@ import ( "reflect" "testing" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/cloudprovider" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network" @@ -38,6 +39,8 @@ func TestDeleteRoute(t *testing.T) { RouteTableName: "bar", Location: "location", }, + unmanagedNodes: sets.NewString(), + nodeInformerSynced: func() bool { return true }, } route := cloudprovider.Route{TargetNode: "node", DestinationCIDR: "1.2.3.4/24"} routeName := mapNodeNameToRouteName(route.TargetNode) @@ -62,6 +65,28 @@ func TestDeleteRoute(t *testing.T) { ob, found := mp[routeName] if found { t.Errorf("unexpectedly found: %v that should have been deleted.", ob) + t.FailNow() + } + + // test delete route for unmanaged nodes. + nodeName := "node1" + nodeCIDR := "4.3.2.1/24" + cloud.unmanagedNodes.Insert(nodeName) + cloud.routeCIDRs = map[string]string{ + nodeName: nodeCIDR, + } + route1 := cloudprovider.Route{ + TargetNode: mapRouteNameToNodeName(nodeName), + DestinationCIDR: nodeCIDR, + } + err = cloud.DeleteRoute(context.TODO(), "cluster", &route1) + if err != nil { + t.Errorf("unexpected error deleting route: %v", err) + t.FailNow() + } + cidr, found := cloud.routeCIDRs[nodeName] + if found { + t.Errorf("unexpected CIDR item (%q) for %s", cidr, nodeName) } } @@ -79,6 +104,8 @@ func TestCreateRoute(t *testing.T) { RouteTableName: "bar", Location: "location", }, + unmanagedNodes: sets.NewString(), + nodeInformerSynced: func() bool { return true }, } cache, _ := cloud.newRouteTableCache() cloud.rtCache = cache @@ -122,6 +149,29 @@ func TestCreateRoute(t *testing.T) { if *routeInfo.NextHopIPAddress != nodeIP { t.Errorf("Expected IP address: %s, saw %s", nodeIP, *routeInfo.NextHopIPAddress) } + + // test create route for unmanaged nodes. + nodeName := "node1" + nodeCIDR := "4.3.2.1/24" + cloud.unmanagedNodes.Insert(nodeName) + cloud.routeCIDRs = map[string]string{} + route1 := cloudprovider.Route{ + TargetNode: mapRouteNameToNodeName(nodeName), + DestinationCIDR: nodeCIDR, + } + err = cloud.CreateRoute(context.TODO(), "cluster", "unused", &route1) + if err != nil { + t.Errorf("unexpected error creating route: %v", err) + t.FailNow() + } + cidr, found := cloud.routeCIDRs[nodeName] + if !found { + t.Errorf("unexpected missing item for %s", nodeName) + t.FailNow() + } + if cidr != nodeCIDR { + t.Errorf("unexpected cidr %s, saw %s", nodeCIDR, cidr) + } } func TestCreateRouteTableIfNotExists_Exists(t *testing.T) { diff --git a/pkg/cloudprovider/providers/azure/azure_test.go b/pkg/cloudprovider/providers/azure/azure_test.go index bf694d84f3c..2d243a9e7a8 100644 --- a/pkg/cloudprovider/providers/azure/azure_test.go +++ b/pkg/cloudprovider/providers/azure/azure_test.go @@ -958,6 +958,7 @@ func getTestCloud() (az *Cloud) { nodeInformerSynced: func() bool { return true }, nodeResourceGroups: map[string]string{}, unmanagedNodes: sets.NewString(), + routeCIDRs: map[string]string{}, } az.DisksClient = newFakeDisksClient() az.InterfacesClient = newFakeAzureInterfacesClient() diff --git a/pkg/cloudprovider/providers/azure/azure_wrap_test.go b/pkg/cloudprovider/providers/azure/azure_wrap_test.go index 5ab090c2a47..8c7ba0ee4da 100644 --- a/pkg/cloudprovider/providers/azure/azure_wrap_test.go +++ b/pkg/cloudprovider/providers/azure/azure_wrap_test.go @@ -23,6 +23,8 @@ import ( "testing" "github.com/Azure/go-autorest/autorest" + "github.com/stretchr/testify/assert" + "k8s.io/apimachinery/pkg/util/sets" ) func TestExtractNotFound(t *testing.T) { @@ -51,3 +53,57 @@ func TestExtractNotFound(t *testing.T) { } } } + +func TestIsNodeUnmanaged(t *testing.T) { + tests := []struct { + name string + unmanagedNodes sets.String + node string + expected bool + expectErr bool + }{ + { + name: "unmanaged node should return true", + unmanagedNodes: sets.NewString("node1", "node2"), + node: "node1", + expected: true, + }, + { + name: "managed node should return false", + unmanagedNodes: sets.NewString("node1", "node2"), + node: "node3", + expected: false, + }, + { + name: "empty unmanagedNodes should return true", + unmanagedNodes: sets.NewString(), + node: "node3", + expected: false, + }, + { + name: "no synced informer should report error", + unmanagedNodes: sets.NewString(), + node: "node1", + expectErr: true, + }, + } + + az := getTestCloud() + for _, test := range tests { + az.unmanagedNodes = test.unmanagedNodes + if test.expectErr { + az.nodeInformerSynced = func() bool { + return false + } + } + + real, err := az.IsNodeUnmanaged(test.node) + if test.expectErr { + assert.Error(t, err, test.name) + continue + } + + assert.NoError(t, err, test.name) + assert.Equal(t, test.expected, real, test.name) + } +}