diff --git a/cloud/linode/route_controller_test.go b/cloud/linode/route_controller_test.go index cf862340..6b2efc64 100644 --- a/cloud/linode/route_controller_test.go +++ b/cloud/linode/route_controller_test.go @@ -16,8 +16,9 @@ import ( ) func TestListRoutes(t *testing.T) { - Options.VPCNames = "test" + Options.VPCNames = "test,abc" vpcIDs["test"] = 1 + vpcIDs["abc"] = 2 Options.EnableRouteController = true nodeID := 123 @@ -36,7 +37,7 @@ func TestListRoutes(t *testing.T) { assert.NoError(t, err) client.EXPECT().ListInstances(gomock.Any(), gomock.Any()).Times(1).Return([]linodego.Instance{}, nil) - client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return([]linodego.VPCIP{}, nil) + client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(2).Return([]linodego.VPCIP{}, nil) routes, err := routeController.ListRoutes(ctx, "test") assert.NoError(t, err) assert.Empty(t, routes) @@ -59,7 +60,7 @@ func TestListRoutes(t *testing.T) { assert.NoError(t, err) client.EXPECT().ListInstances(gomock.Any(), nil).Times(1).Return([]linodego.Instance{validInstance}, nil) - client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return([]linodego.VPCIP{}, nil) + client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(2).Return([]linodego.VPCIP{}, nil) routes, err := routeController.ListRoutes(ctx, "test") assert.NoError(t, err) assert.Empty(t, routes) @@ -85,7 +86,7 @@ func TestListRoutes(t *testing.T) { assert.NoError(t, err) client.EXPECT().ListInstances(gomock.Any(), nil).Times(1).Return([]linodego.Instance{validInstance}, nil) - client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(2).Return(noRoutesInVPC, nil) + client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(4).Return(noRoutesInVPC, nil) routes, err := routeController.ListRoutes(ctx, "test") assert.NoError(t, err) assert.Empty(t, routes) @@ -126,7 +127,7 @@ func TestListRoutes(t *testing.T) { assert.NoError(t, err) client.EXPECT().ListInstances(gomock.Any(), nil).Times(1).Return([]linodego.Instance{validInstance}, nil) - client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(2).Return(routesInVPC, nil) + client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(4).Return(routesInVPC, nil) routes, err := routeController.ListRoutes(ctx, "test") assert.NoError(t, err) assert.NotEmpty(t, routes) @@ -167,11 +168,73 @@ func TestListRoutes(t *testing.T) { assert.NoError(t, err) client.EXPECT().ListInstances(gomock.Any(), nil).Times(1).Return([]linodego.Instance{validInstance}, nil) - client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(2).Return(routesInDifferentVPC, nil) + client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(4).Return(routesInDifferentVPC, nil) routes, err := routeController.ListRoutes(ctx, "test") assert.NoError(t, err) assert.Empty(t, routes) }) + + t.Run("should return routes if multiple instances exists, connected to VPCs and ip_ranges configured", func(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + client := mocks.NewMockClient(ctrl) + routeController, err := newRoutes(client) + assert.NoError(t, err) + + vpcIP2 := "10.0.0.3" + addressRange3 := "10.192.40.0/24" + addressRange4 := "10.192.50.0/24" + + validInstance2 := linodego.Instance{ + ID: 124, + Label: "mock-instance2", + Type: linodeType, + Region: region, + IPv4: []*net.IP{&publicIPv4, &privateIPv4}, + } + + routesInVPC2 := []linodego.VPCIP{ + { + Address: &vpcIP2, + AddressRange: nil, + VPCID: vpcIDs["abc"], + NAT1To1: nil, + LinodeID: 124, + }, + { + Address: nil, + AddressRange: &addressRange3, + VPCID: vpcIDs["abc"], + NAT1To1: nil, + LinodeID: 124, + }, + { + Address: nil, + AddressRange: &addressRange4, + VPCID: vpcIDs["abc"], + NAT1To1: nil, + LinodeID: 124, + }, + } + + client.EXPECT().ListInstances(gomock.Any(), nil).Times(1).Return([]linodego.Instance{validInstance, validInstance2}, nil) + c1 := client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(routesInVPC, nil) + c2 := client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).After(c1).Times(1).Return(routesInVPC2, nil) + c3 := client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).After(c2).Times(1).Return(routesInVPC, nil) + client.EXPECT().ListVPCIPAddresses(gomock.Any(), gomock.Any(), gomock.Any()).After(c3).Times(1).Return(routesInVPC2, nil) + routes, err := routeController.ListRoutes(ctx, "test") + assert.NoError(t, err) + assert.NotEmpty(t, routes) + cidrs := make([]string, len(routes)) + for i, value := range routes { + cidrs[i] = value.DestinationCIDR + } + assert.Contains(t, cidrs, addressRange1) + assert.Contains(t, cidrs, addressRange2) + assert.Contains(t, cidrs, addressRange3) + assert.Contains(t, cidrs, addressRange4) + }) } func TestCreateRoute(t *testing.T) {