func TestServiceUpdateLabel(t *testing.T) { kube := mocks.NewKubeClient() client := new(contrail_mocks.ApiClient) client.Init() client.AddInterceptor("virtual-machine-interface", &VmiInterceptor{}) client.AddInterceptor("virtual-network", &NetworkInterceptor{}) client.AddInterceptor("instance-ip", &IpInterceptor{}) client.AddInterceptor("floating-ip", &FloatingIpInterceptor{}) controller := NewTestController(kube, client, nil, nil) pod1 := &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "test-sv1", Namespace: "testns", UID: kubetypes.UID(uuid.New()), Labels: map[string]string{ "name": "server", }, }, } pod2 := &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "test-xz2", Namespace: "testns", UID: kubetypes.UID(uuid.New()), Labels: map[string]string{ "name": "client1", "uses": "red", }, }, } pod3 := &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "test-xz3", Namespace: "testns", UID: kubetypes.UID(uuid.New()), Labels: map[string]string{ "name": "client2", "uses": "blue", }, }, } service := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: "service", Namespace: "testns", Labels: map[string]string{ "name": "red", }, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "name": "server", }, ClusterIP: "10.254.42.42", Type: api.ServiceTypeLoadBalancer, }, } netnsProject := new(types.Project) netnsProject.SetFQName("", []string{"default-domain", "testns"}) client.Create(netnsProject) kube.PodInterface.On("Update", pod1).Return(pod1, nil) kube.PodInterface.On("Update", pod2).Return(pod2, nil) kube.PodInterface.On("Update", pod3).Return(pod3, nil) selectServer := labels.Set(map[string]string{"name": "server"}).AsSelector() kube.PodInterface.On("List", selectServer, mock.Anything).Return(&api.PodList{Items: []api.Pod{*pod1}}, nil) kube.ServiceInterface.On("Update", service).Return(service, nil) shutdown := make(chan struct{}) go controller.Run(shutdown) controller.AddPod(pod1) controller.AddPod(pod2) controller.AddPod(pod3) controller.AddService(service) time.Sleep(100 * time.Millisecond) redPolicy, err := types.NetworkPolicyByName(client, "default-domain:testns:red") assert.NoError(t, err) if err == nil { assert.Len(t, redPolicy.GetNetworkPolicyEntries().PolicyRule, 1) assert.True(t, policyHasRule(redPolicy, "default-domain:testns:client1", "default-domain:testns:service-red")) refs, err := redPolicy.GetVirtualNetworkBackRefs() assert.NoError(t, err) nameList := getReferenceListNames(refs) assert.Contains(t, nameList, "default-domain:testns:client1") assert.Contains(t, nameList, "default-domain:testns:service-red") } bluePolicy, err := types.NetworkPolicyByName(client, "default-domain:testns:blue") assert.NoError(t, err) if err == nil { assert.Len(t, bluePolicy.GetNetworkPolicyEntries().PolicyRule, 0) refs, err := bluePolicy.GetVirtualNetworkBackRefs() assert.NoError(t, err) assert.Len(t, refs, 1) } nService := new(api.Service) *nService = *service nService.Labels = map[string]string{ "name": "blue", } // The service will receive a different PublicIP because this is translated into a service delete operation, // followed by an add. kube.ServiceInterface.On("Update", nService).Return(nService, nil) controller.UpdateService(service, nService) time.Sleep(100 * time.Millisecond) type shutdownMsg struct { } shutdown <- shutdownMsg{} bluePolicy, err = types.NetworkPolicyByName(client, "default-domain:testns:blue") assert.NoError(t, err) if err == nil { assert.Len(t, bluePolicy.GetNetworkPolicyEntries().PolicyRule, 1) assert.True(t, policyHasRule(bluePolicy, "default-domain:testns:client2", "default-domain:testns:service-blue")) refs, err := bluePolicy.GetVirtualNetworkBackRefs() assert.NoError(t, err) nameList := getReferenceListNames(refs) assert.Contains(t, nameList, "default-domain:testns:client2") assert.Contains(t, nameList, "default-domain:testns:service-blue") } redPolicy, err = types.NetworkPolicyByName(client, "default-domain:testns:red") assert.NoError(t, err) if err == nil { assert.Len(t, redPolicy.GetNetworkPolicyEntries().PolicyRule, 0) refs, err := redPolicy.GetVirtualNetworkBackRefs() assert.NoError(t, err) assert.Len(t, refs, 1) } fip, err := types.FloatingIpByName(client, "default-domain:testns:service-blue:service-blue:service") assert.NoError(t, err) if err == nil { vmList, err := getFloatingIpToInstanceList(client, fip) assert.NoError(t, err) assert.Len(t, vmList, 1) assert.Contains(t, vmList, string(pod1.UID)) } }