diff --git a/controllers/yawol-cloud-controller/targetcontroller/service_controller_test.go b/controllers/yawol-cloud-controller/targetcontroller/service_controller_test.go index ea09c68b..1152cd7a 100644 --- a/controllers/yawol-cloud-controller/targetcontroller/service_controller_test.go +++ b/controllers/yawol-cloud-controller/targetcontroller/service_controller_test.go @@ -2482,5 +2482,62 @@ var _ = Describe("Check loadbalancer reconcile", Serial, Ordered, func() { return fmt.Errorf("projectID is not correctly set in infrastructure %v", lb.Spec.Infrastructure.ProjectID) }, time.Second*5, time.Millisecond*500).Should(Succeed()) }) + + It("should update subnet from annotation", func() { + By("creating a service without overwritten subnet id") + service := v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "service-test34", + Namespace: "default", + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + { + Name: "port1", + Protocol: v1.ProtocolTCP, + Port: 12345, + TargetPort: intstr.IntOrString{IntVal: 12345}, + NodePort: 31034, + }, + }, + Type: "LoadBalancer", + }, + } + Expect(k8sClient.Create(ctx, &service)).Should(Succeed()) + + By("checking that the defaultNetwork SubnetID is set") + Eventually(func() error { + err := k8sClient.Get(ctx, types.NamespacedName{Name: "default--service-test34", Namespace: "default"}, &lb) + if err != nil { + return err + } + if (testInfraDefaults.SubnetID == nil && lb.Spec.Infrastructure.DefaultNetwork.SubnetID == nil) || + (lb.Spec.Infrastructure.DefaultNetwork.SubnetID != nil && testInfraDefaults.SubnetID != nil && + *lb.Spec.Infrastructure.DefaultNetwork.SubnetID == *testInfraDefaults.SubnetID) { + return nil + } + return fmt.Errorf("defaultNetwork subbnetID is not correct %v", lb.Spec.Infrastructure.DefaultNetwork.SubnetID) + }, time.Second*5, time.Millisecond*500).Should(Succeed()) + + By("update svc to overwrite subbnetwork ID") + Expect(k8sClient.Get(ctx, client.ObjectKey{Name: service.Name, Namespace: service.Namespace}, &service)).Should(Succeed()) + service.ObjectMeta.Annotations = map[string]string{ + yawolv1beta1.ServiceDefaultSubnetID: "newSubnetID", + } + Expect(k8sClient.Update(ctx, &service)).Should(Succeed()) + + By("check if lb gets new subnet ID") + Eventually(func() error { + err := k8sClient.Get(ctx, types.NamespacedName{Name: "default--service-test34", Namespace: "default"}, &lb) + if err != nil { + return err + } + if lb.Spec.Infrastructure.DefaultNetwork.SubnetID != nil && + *lb.Spec.Infrastructure.DefaultNetwork.SubnetID == "newSubnetID" { + return nil + } + return fmt.Errorf("defaultNetwork SubnetID is not correct %v", lb.Spec.Infrastructure.DefaultNetwork.NetworkID) + }, time.Second*5, time.Millisecond*500).Should(Succeed()) + }) }) }) diff --git a/controllers/yawol-controller/loadbalancer/loadbalancer_controller_test.go b/controllers/yawol-controller/loadbalancer/loadbalancer_controller_test.go index 8b9cca23..479eb0ec 100644 --- a/controllers/yawol-controller/loadbalancer/loadbalancer_controller_test.go +++ b/controllers/yawol-controller/loadbalancer/loadbalancer_controller_test.go @@ -1016,6 +1016,7 @@ func getMockLB(lbNN types.NamespacedName) *LB { DefaultNetwork: yawolv1beta1.LoadBalancerDefaultNetwork{ FloatingNetID: ptr.To("floatingnet-id"), NetworkID: "network-id", + SubnetID: ptr.To("subnet-id"), }, Flavor: yawolv1beta1.OpenstackFlavorRef{ FlavorID: ptr.To("flavor-id"), diff --git a/controllers/yawol-controller/loadbalancermachine/loadbalancermachine_controller_test.go b/controllers/yawol-controller/loadbalancermachine/loadbalancermachine_controller_test.go index 1fc9bbc9..4ac4584d 100644 --- a/controllers/yawol-controller/loadbalancermachine/loadbalancermachine_controller_test.go +++ b/controllers/yawol-controller/loadbalancermachine/loadbalancermachine_controller_test.go @@ -240,6 +240,60 @@ var _ = Describe("load balancer machine", Serial, Ordered, func() { }) }) // openstack not working + Context("customizable subnetID features", func() { + BeforeEach(func() { + lbm.Spec.Infrastructure.DefaultNetwork.SubnetID = ptr.To("lb-subnetID") + }) + + It("should create openstack resources", func() { + lbmNN := runtimeClient.ObjectKeyFromObject(lbm) + + Eventually(func(g Gomega) { + var actual yawolv1beta1.LoadBalancerMachine + g.Expect(k8sClient.Get(ctx, lbmNN, &actual)).To(Succeed()) + + g.Expect(actual.Status.ServerID).ToNot(BeNil()) + g.Expect(actual.Status.DefaultPortID).ToNot(BeNil()) + + _, err := client.ServerClientObj.Get(ctx, *actual.Status.ServerID) + g.Expect(err).To(Succeed()) + + port, err := client.PortClientObj.Get(ctx, *actual.Status.DefaultPortID) + g.Expect(err).To(Succeed()) + g.Expect(port.FixedIPs).To(HaveLen(1)) + + g.Expect(port.FixedIPs[0].SubnetID).To(Equal("lb-subnetID")) + }, timeout, interval).Should(Succeed()) + }) + }) // customizable subnetID features + + Context("fallback to default subnetID", func() { + BeforeEach(func() { + lbm.Spec.Infrastructure.DefaultNetwork.SubnetID = nil // unset + }) + + It("should create openstack resources", func() { + lbmNN := runtimeClient.ObjectKeyFromObject(lbm) + + Eventually(func(g Gomega) { + var actual yawolv1beta1.LoadBalancerMachine + g.Expect(k8sClient.Get(ctx, lbmNN, &actual)).To(Succeed()) + + g.Expect(actual.Status.ServerID).ToNot(BeNil()) + g.Expect(actual.Status.DefaultPortID).ToNot(BeNil()) + + _, err := client.ServerClientObj.Get(ctx, *actual.Status.ServerID) + g.Expect(err).To(Succeed()) + + port, err := client.PortClientObj.Get(ctx, *actual.Status.DefaultPortID) + g.Expect(err).To(Succeed()) + g.Expect(len(port.FixedIPs)).To(Equal(1)) + + g.Expect(port.FixedIPs[0].SubnetID).To(Equal("default-subnet-id")) + }, timeout, interval).Should(Succeed()) + }) + }) // fallback to default subnetID + Context("additionalNetworks features", func() { BeforeEach(func() { lbm.Spec.Infrastructure.AdditionalNetworks = []yawolv1beta1.LoadBalancerAdditionalNetwork{ diff --git a/internal/openstack/testing/fake.go b/internal/openstack/testing/fake.go index 74bfab26..c89c7a11 100644 --- a/internal/openstack/testing/fake.go +++ b/internal/openstack/testing/fake.go @@ -237,12 +237,20 @@ func GetFakeClient() *MockClient { }, CreateFunc: func(ctx context.Context, optsBuilder ports.CreateOptsBuilder) (*ports.Port, error) { opts := optsBuilder.(ports.CreateOpts) + var fixedIPs []ports.IP + if opts.FixedIPs != nil { + fixedIPs = opts.FixedIPs.([]ports.IP) + } + subnetID := "default-subnet-id" + if len(fixedIPs) > 0 { + subnetID = fixedIPs[0].SubnetID + } port := &ports.Port{ ID: getID(&client), Name: opts.Name, NetworkID: opts.NetworkID, - FixedIPs: []ports.IP{{IPAddress: generateIP()}}, + FixedIPs: []ports.IP{{SubnetID: subnetID, IPAddress: generateIP()}}, } if opts.SecurityGroups != nil {