func (m *InstanceManager) AttachFloatingIp( podName, projectName string, floatingIp *types.FloatingIp) { fqn := []string{m.config.DefaultDomain, projectName, podName} obj, err := m.client.FindByName( "virtual-machine-interface", strings.Join(fqn, ":")) if err != nil { glog.Errorf("GET vmi %s: %v", podName, err) return } vmi := obj.(*types.VirtualMachineInterface) refs, err := floatingIp.GetVirtualMachineInterfaceRefs() if err != nil { glog.Errorf("GET floating-ip %s: %v", floatingIp.GetUuid(), err) return } for _, ref := range refs { if ref.Uuid == vmi.GetUuid() { return } } floatingIp.AddVirtualMachineInterface(vmi) err = m.client.Update(floatingIp) if err != nil { glog.Errorf("Update floating-ip %s: %v", podName, err) } }
// Create floating-ip with 2 vmi references, delete it and verify that // the back_refs are updated as expected. func TestDeleteRefs(t *testing.T) { db := NewInMemDatabase() vmi1 := new(types.VirtualMachineInterface) vmi1.SetUuid(uuid.New()) vmi1.SetName("port1") assert.NoError(t, db.Put(vmi1, nil, GetReferenceList(vmi1))) vmi2 := new(types.VirtualMachineInterface) vmi2.SetUuid(uuid.New()) vmi2.SetName("port2") assert.NoError(t, db.Put(vmi2, nil, GetReferenceList(vmi2))) fip := new(types.FloatingIp) fip.SetUuid(uuid.New()) fip.SetName("fip") fip.AddVirtualMachineInterface(vmi1) fip.AddVirtualMachineInterface(vmi2) assert.NoError(t, db.Put(fip, nil, GetReferenceList(fip))) assert.Error(t, db.Delete(vmi1)) result, err := db.GetBackReferences(parseUID(vmi2.GetUuid()), "floating_ip") assert.NoError(t, err) assert.Len(t, result, 1) assert.NoError(t, db.Delete(fip)) result, err = db.GetBackReferences(parseUID(vmi2.GetUuid()), "floating_ip") assert.NoError(t, err) assert.Len(t, result, 0) assert.NoError(t, db.Delete(vmi1)) assert.NoError(t, db.Delete(vmi2)) }
func TestConsistencyServiceIp(t *testing.T) { env := new(TestFramework) env.SetUp("192.0.2.0/24") config := env.config client := env.client netnsProject := new(types.Project) netnsProject.SetFQName("domain", []string{"default-domain", "testns"}) client.Create(netnsProject) service1 := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: "s1", Namespace: "testns", Labels: map[string]string{ config.NetworkTag: "services", }, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "Name": "pod01", }, ClusterIP: "10.254.42.42", Type: api.ServiceTypeLoadBalancer, }, } service2 := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: "s2", Namespace: "testns", Labels: map[string]string{ config.NetworkTag: "services", }, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "Name": "pod02", }, ClusterIP: "10.254.42.43", ExternalIPs: []string{"10.1.4.89"}, }, } service3 := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: "s3", Namespace: "testns", Labels: map[string]string{ config.NetworkTag: "services", }, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "Name": "pod01", }, ClusterIP: "10.254.42.44", }, } env.Start() installPods(env, "testns", 3) env.AddService(service1, "pod01") env.AddService(service2, "pod02") env.AddService(service3, "pod01") env.SyncBarrier() env.Shutdown() assert.True(t, env.checker.Check()) pool, err := types.FloatingIpPoolByName(client, "default-domain:testns:service-services:service-services") assert.NoError(t, err) vmi, err := types.VirtualMachineInterfaceByName(client, "default-domain:testns:pod01") assert.NoError(t, err) vip := new(types.FloatingIp) fqn := make([]string, len(pool.GetFQName())+1) copy(fqn, pool.GetFQName()) fqn[len(pool.GetFQName())] = "s4" vip.SetFQName(vip.GetDefaultParentType(), fqn) vip.AddVirtualMachineInterface(vmi) assert.NoError(t, client.Create(vip)) assert.False(t, env.checker.Check()) assert.NoError(t, client.Delete(vip)) assert.True(t, env.checker.Check()) vip, err = types.FloatingIpByName(client, "default-domain:testns:service-services:service-services:s3") assert.NoError(t, err) assert.NoError(t, client.Delete(vip)) assert.False(t, env.checker.Check()) }
func TestConsistencyServiceIp(t *testing.T) { client := createTestClient() podStore := new(mocks.Store) serviceStore := new(mocks.Store) checker := NewConsistencyChecker(client, NewConfig(), podStore, serviceStore, nil) kube := mocks.NewKubeClient() controller := NewTestController(kube, client, nil, nil) config := controller.config netnsProject := new(types.Project) netnsProject.SetFQName("domain", []string{"default-domain", "testns"}) client.Create(netnsProject) installPods(controller, &kube.PodInterface.Mock, &podStore.Mock, "testns", 3) service1 := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: "s1", Namespace: "testns", Labels: map[string]string{ config.NetworkTag: "services", }, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "app": "pod01", }, ClusterIP: "10.254.42.42", Type: api.ServiceTypeLoadBalancer, }, } service2 := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: "s2", Namespace: "testns", Labels: map[string]string{ config.NetworkTag: "services", }, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "app": "pod02", }, ClusterIP: "10.254.42.43", ExternalIPs: []string{"10.1.4.89"}, }, } service3 := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: "s3", Namespace: "testns", Labels: map[string]string{ config.NetworkTag: "services", }, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "app": "pod01", }, ClusterIP: "10.254.42.44", }, } kube.ServiceInterface.On("Update", service1).Return(service1, nil) shutdown := make(chan struct{}) go controller.Run(shutdown) controller.AddService(service1) controller.AddService(service2) controller.AddService(service3) serviceStore.On("List").Return([]interface{}{service1, service2, service3}) time.Sleep(100 * time.Millisecond) type shutdownMsg struct { } shutdown <- shutdownMsg{} time.Sleep(100 * time.Millisecond) assert.True(t, checker.Check()) pool, err := types.FloatingIpPoolByName(client, "default-domain:testns:service-services:service-services") assert.NoError(t, err) vmi, err := types.VirtualMachineInterfaceByName(client, "default-domain:testns:pod01") assert.NoError(t, err) vip := new(types.FloatingIp) fqn := make([]string, len(pool.GetFQName())+1) copy(fqn, pool.GetFQName()) fqn[len(pool.GetFQName())] = "s4" vip.SetFQName(vip.GetDefaultParentType(), fqn) vip.AddVirtualMachineInterface(vmi) assert.NoError(t, client.Create(vip)) assert.False(t, checker.Check()) assert.NoError(t, client.Delete(vip)) assert.True(t, checker.Check()) vip, err = types.FloatingIpByName(client, "default-domain:testns:service-services:service-services:s3") assert.NoError(t, err) assert.NoError(t, client.Delete(vip)) assert.False(t, checker.Check()) }