From e57d3906be433f0e552716be002f6425c4b3d06c Mon Sep 17 00:00:00 2001 From: Drew Walters Date: Wed, 2 Dec 2020 23:05:50 +0000 Subject: [PATCH 1/3] Add testutil package This change adds a new package, testutil, that initializes objects with test data for unit and integration tests. By reusing our test data, we will save on lines of code. --- pkg/controllers/sipcluster_controller_test.go | 90 +++---------------- pkg/vbmh/vbmh_test.go | 27 +----- testutil/testutil.go | 90 +++++++++++++++++++ 3 files changed, 103 insertions(+), 104 deletions(-) create mode 100644 testutil/testutil.go diff --git a/pkg/controllers/sipcluster_controller_test.go b/pkg/controllers/sipcluster_controller_test.go index 54ee9c9..bd88c52 100644 --- a/pkg/controllers/sipcluster_controller_test.go +++ b/pkg/controllers/sipcluster_controller_test.go @@ -25,12 +25,12 @@ import ( metal3 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" airshipv1 "sipcluster/pkg/api/v1" "sipcluster/pkg/vbmh" + "sipcluster/testutil" ) var _ = Describe("SIPCluster controller", func() { @@ -42,14 +42,14 @@ var _ = Describe("SIPCluster controller", func() { nodes := []string{"master", "master", "master", "worker", "worker", "worker", "worker"} namespace := "default" for node, role := range nodes { - vBMH, networkData := createBMH(node, namespace, role, 6) + vBMH, networkData := testutil.CreateBMH(node, namespace, role, 6) Expect(k8sClient.Create(context.Background(), vBMH)).Should(Succeed()) Expect(k8sClient.Create(context.Background(), networkData)).Should(Succeed()) } // Create SIP cluster clusterName := "subcluster-test1" - sipCluster := createSIPCluster(clusterName, namespace, 3, 4) + sipCluster := testutil.CreateSIPCluster(clusterName, namespace, 3, 4) Expect(k8sClient.Create(context.Background(), sipCluster)).Should(Succeed()) // Poll BMHs until SIP has scheduled them to the SIP cluster @@ -62,7 +62,7 @@ var _ = Describe("SIPCluster controller", func() { var bmh metal3.BareMetalHost for node := range nodes { Expect(k8sClient.Get(context.Background(), types.NamespacedName{ - Name: fmt.Sprintf("node%d", node), + Name: fmt.Sprintf("node0%d", node), Namespace: namespace, }, &bmh)).Should(Succeed()) } @@ -80,14 +80,14 @@ var _ = Describe("SIPCluster controller", func() { nodes := []string{"master", "master", "worker", "worker", "worker", "worker"} namespace := "default" for node, role := range nodes { - vBMH, networkData := createBMH(node, namespace, role, 6) + vBMH, networkData := testutil.CreateBMH(node, namespace, role, 6) Expect(k8sClient.Create(context.Background(), vBMH)).Should(Succeed()) Expect(k8sClient.Create(context.Background(), networkData)).Should(Succeed()) } // Create SIP cluster clusterName := "subcluster-test2" - sipCluster := createSIPCluster(clusterName, namespace, 3, 4) + sipCluster := testutil.CreateSIPCluster(clusterName, namespace, 3, 4) Expect(k8sClient.Create(context.Background(), sipCluster)).Should(Succeed()) // Poll BMHs and validate they are not scheduled @@ -99,7 +99,7 @@ var _ = Describe("SIPCluster controller", func() { var bmh metal3.BareMetalHost for node := range nodes { Expect(k8sClient.Get(context.Background(), types.NamespacedName{ - Name: fmt.Sprintf("node%d", node), + Name: fmt.Sprintf("node0%d", node), Namespace: namespace, }, &bmh)).Should(Succeed()) } @@ -117,14 +117,14 @@ var _ = Describe("SIPCluster controller", func() { nodes := []string{"master", "master", "master", "worker", "worker"} namespace := "default" for node, role := range nodes { - vBMH, networkData := createBMH(node, namespace, role, 6) + vBMH, networkData := testutil.CreateBMH(node, namespace, role, 6) Expect(k8sClient.Create(context.Background(), vBMH)).Should(Succeed()) Expect(k8sClient.Create(context.Background(), networkData)).Should(Succeed()) } // Create SIP cluster clusterName := "subcluster-test3" - sipCluster := createSIPCluster(clusterName, namespace, 3, 4) + sipCluster := testutil.CreateSIPCluster(clusterName, namespace, 3, 4) Expect(k8sClient.Create(context.Background(), sipCluster)).Should(Succeed()) // Poll BMHs and validate they are not scheduled @@ -136,7 +136,7 @@ var _ = Describe("SIPCluster controller", func() { var bmh metal3.BareMetalHost for node := range nodes { Expect(k8sClient.Get(context.Background(), types.NamespacedName{ - Name: fmt.Sprintf("node%d", node), + Name: fmt.Sprintf("node0%d", node), Namespace: namespace, }, &bmh)).Should(Succeed()) } @@ -171,73 +171,3 @@ func cleanTestResources() { Expect(k8sClient.DeleteAllOf(context.Background(), &airshipv1.SIPCluster{}, opts...)).Should(Succeed()) Expect(k8sClient.DeleteAllOf(context.Background(), &corev1.Secret{}, opts...)).Should(Succeed()) } - -func createBMH(node int, namespace string, role string, rack int) (*metal3.BareMetalHost, *corev1.Secret) { - rackLabel := fmt.Sprintf("r%d", rack) - networkDataName := fmt.Sprintf("node%d-network-data", node) - return &metal3.BareMetalHost{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("node%d", node), - Namespace: namespace, - Labels: map[string]string{ - "airshipit.org/vino-flavor": role, - vbmh.SipScheduleLabel: "false", - vbmh.RackLabel: rackLabel, - vbmh.ServerLabel: fmt.Sprintf("stl2%so%d", rackLabel, node), - }, - }, - Spec: metal3.BareMetalHostSpec{ - NetworkData: &corev1.SecretReference{ - Namespace: namespace, - Name: networkDataName, - }, - }, - }, &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: networkDataName, - Namespace: namespace, - }, - Data: map[string][]byte{ - "networkData": []byte("ewoKICAgICJsaW5rcyI6IFsKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJlbm80IiwKICAgICAgICAgICAgIm5hbWUiOiAiZW5vNCIsCiAgICAgICAgICAgICJ0eXBlIjogInBoeSIsCiAgICAgICAgICAgICJtdHUiOiAxNTAwCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJlbnA1OXMwZjEiLAogICAgICAgICAgICAibmFtZSI6ICJlbnA1OXMwZjEiLAogICAgICAgICAgICAidHlwZSI6ICJwaHkiLAogICAgICAgICAgICAibXR1IjogOTEwMAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiZW5wMjE2czBmMCIsCiAgICAgICAgICAgICJuYW1lIjogImVucDIxNnMwZjAiLAogICAgICAgICAgICAidHlwZSI6ICJwaHkiLAogICAgICAgICAgICAibXR1IjogOTEwMAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiYm9uZDAiLAogICAgICAgICAgICAibmFtZSI6ICJib25kMCIsCiAgICAgICAgICAgICJ0eXBlIjogImJvbmQiLAogICAgICAgICAgICAiYm9uZF9saW5rcyI6IFsKICAgICAgICAgICAgICAgICJlbnA1OXMwZjEiLAogICAgICAgICAgICAgICAgImVucDIxNnMwZjAiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJib25kX21vZGUiOiAiODAyLjNhZCIsCiAgICAgICAgICAgICJib25kX3htaXRfaGFzaF9wb2xpY3kiOiAibGF5ZXIzKzQiLAogICAgICAgICAgICAiYm9uZF9taWltb24iOiAxMDAsCiAgICAgICAgICAgICJtdHUiOiA5MTAwCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40MSIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQxIiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQxLAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40MiIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQyIiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQyLAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40NCIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQ0IiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQ0LAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40NSIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQ1IiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQ1LAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfQogICAgXSwKICAgICJuZXR3b3JrcyI6IFsKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJvYW0taXB2NiIsCiAgICAgICAgICAgICJ0eXBlIjogImlwdjYiLAogICAgICAgICAgICAibGluayI6ICJib25kMC40MSIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjIwMDE6MTg5MDoxMDAxOjI5M2Q6OjE0MCIsCiAgICAgICAgICAgICJyb3V0ZXMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5ldHdvcmsiOiAiOjovMCIsCiAgICAgICAgICAgICAgICAgICAgIm5ldG1hc2siOiAiOjovMCIsCiAgICAgICAgICAgICAgICAgICAgImdhdGV3YXkiOiAiMjAwMToxODkwOjEwMDE6MjkzZDo6MSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAib2FtLWlwdjQiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY0IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDEiLAogICAgICAgICAgICAiaXBfYWRkcmVzcyI6ICIzMi42OC41MS4xNDAiLAogICAgICAgICAgICAibmV0bWFzayI6ICIyNTUuMjU1LjI1NS4xMjgiLAogICAgICAgICAgICAiZG5zX25hbWVzZXJ2ZXJzIjogWwogICAgICAgICAgICAgICAgIjEzNS4xODguMzQuMTI0IiwKICAgICAgICAgICAgICAgICIxMzUuMzguMjQ0LjE2IiwKICAgICAgICAgICAgICAgICIxMzUuMTg4LjM0Ljg0IgogICAgICAgICAgICBdLAogICAgICAgICAgICAicm91dGVzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuZXR3b3JrIjogIjAuMC4wLjAiLAogICAgICAgICAgICAgICAgICAgICJuZXRtYXNrIjogIjAuMC4wLjAiLAogICAgICAgICAgICAgICAgICAgICJnYXRld2F5IjogIjMyLjY4LjUxLjEyOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAicHhlLWlwdjYiLAogICAgICAgICAgICAibGluayI6ICJlbm80IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NiIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogImZkMDA6OTAwOjEwMDoxMzg6OjEyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAicHhlLWlwdjQiLAogICAgICAgICAgICAibGluayI6ICJlbm80IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NCIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjE3Mi4zMC4wLjEyIiwKICAgICAgICAgICAgIm5ldG1hc2siOiAiMjU1LjI1NS4yNTUuMTI4IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAic3RvcmFnZS1pcHY2IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDIiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY2IiwKICAgICAgICAgICAgImlwX2FkZHJlc3MiOiAiZmQwMDo5MDA6MTAwOjEzOTo6MTYiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJzdG9yYWdlLWlwdjQiLAogICAgICAgICAgICAibGluayI6ICJib25kMC40MiIsCiAgICAgICAgICAgICJ0eXBlIjogImlwdjQiLAogICAgICAgICAgICAiaXBfYWRkcmVzcyI6ICIxNzIuMzEuMC4xNiIsCiAgICAgICAgICAgICJuZXRtYXNrIjogIjI1NS4yNTUuMjU1LjEyOCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImlkIjogImtzbi1pcHY2IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDQiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY2IiwKICAgICAgICAgICAgImlwX2FkZHJlc3MiOiAiZmQwMDo5MDA6MTAwOjEzYTo6MTIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJrc24taXB2NCIsCiAgICAgICAgICAgICJsaW5rIjogImJvbmQwLjQ0IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NCIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjE3Mi4yOS4wLjEyIiwKICAgICAgICAgICAgIm5ldG1hc2siOiAiMjU1LjI1NS4yNTUuMTI4IgogICAgICAgIH0KICAgIF0KfQo="), - }, - Type: corev1.SecretTypeOpaque, - } -} - -func createSIPCluster(name string, namespace string, masters int, workers int) *airshipv1.SIPCluster { - return &airshipv1.SIPCluster{ - TypeMeta: metav1.TypeMeta{ - Kind: "SIPCluster", - APIVersion: "airship.airshipit.org/v1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: airshipv1.SIPClusterSpec{ - Config: &airshipv1.SipConfig{ - ClusterName: name, - }, - Nodes: map[airshipv1.VmRoles]airshipv1.NodeSet{ - airshipv1.VmMaster: { - VmFlavor: "airshipit.org/vino-flavor=master", - Scheduling: airshipv1.ServerAntiAffinity, - Count: &airshipv1.VmCount{ - Active: masters, - Standby: 0, - }, - }, - airshipv1.VmWorker: { - VmFlavor: "airshipit.org/vino-flavor=worker", - Scheduling: airshipv1.ServerAntiAffinity, - Count: &airshipv1.VmCount{ - Active: workers, - Standby: 0, - }, - }, - }, - InfraServices: map[airshipv1.InfraService]airshipv1.InfraConfig{}, - }, - Status: airshipv1.SIPClusterStatus{}, - } -} diff --git a/pkg/vbmh/vbmh_test.go b/pkg/vbmh/vbmh_test.go index 206546f..b69a540 100644 --- a/pkg/vbmh/vbmh_test.go +++ b/pkg/vbmh/vbmh_test.go @@ -1,13 +1,9 @@ package vbmh import ( - "fmt" - metal3 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/scheme" @@ -15,6 +11,7 @@ import ( mockClient "sigs.k8s.io/controller-runtime/pkg/client/fake" airshipv1 "sipcluster/pkg/api/v1" + "sipcluster/testutil" ) const ( @@ -27,26 +24,8 @@ var _ = Describe("MachineList", func() { BeforeEach(func() { nodes := map[string]*Machine{} for n := 0; n < numNodes; n++ { - bmh := metal3.BareMetalHost{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("node0%d", n), - Namespace: "default", - Labels: map[string]string{ - "airshipit.org/vino-flavor": "master", - SipScheduleLabel: "false", - RackLabel: "r002", - ServerLabel: fmt.Sprintf("node0%dr002", n), - }, - }, - Spec: metal3.BareMetalHostSpec{ - NetworkData: &corev1.SecretReference{ - Namespace: "default", - Name: "fake-network-data", - }, - }, - } - - nodes[bmh.Name] = NewMachine(bmh, airshipv1.VmMaster, NotScheduled) + bmh, _ := testutil.CreateBMH(n, "default", "master", 6) + nodes[bmh.Name] = NewMachine(*bmh, airshipv1.VmMaster, NotScheduled) } machineList = &MachineList{ diff --git a/testutil/testutil.go b/testutil/testutil.go new file mode 100644 index 0000000..dc46e3d --- /dev/null +++ b/testutil/testutil.go @@ -0,0 +1,90 @@ +package testutil + +import ( + "fmt" + + metal3 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + airshipv1 "sipcluster/pkg/api/v1" +) + +// NOTE(aw442m): These constants have been redefined from the vbmh package in order to avoid an import cycle. +const ( + sipRackLabel = "sip.airshipit.org/rack" + sipScheduleLabel = "sip.airshipit.org/sip-scheduled" + sipServerLabel = "sip.airshipit.org/server" +) + +// CreateBMH initializes a BaremetalHost with specific parameteres for use in test cases. +func CreateBMH(node int, namespace string, role string, rack int) (*metal3.BareMetalHost, *corev1.Secret) { + rackLabel := fmt.Sprintf("r%d", rack) + networkDataName := fmt.Sprintf("node%d-network-data", node) + return &metal3.BareMetalHost{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("node0%d", node), + Namespace: namespace, + Labels: map[string]string{ + "airshipit.org/vino-flavor": role, + sipScheduleLabel: "false", + sipRackLabel: rackLabel, + sipServerLabel: fmt.Sprintf("stl2%so%d", rackLabel, node), + }, + }, + Spec: metal3.BareMetalHostSpec{ + NetworkData: &corev1.SecretReference{ + Namespace: namespace, + Name: networkDataName, + }, + }, + }, &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: networkDataName, + Namespace: namespace, + }, + Data: map[string][]byte{ + "networkData": []byte("ewoKICAgICJsaW5rcyI6IFsKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJlbm80IiwKICAgICAgICAgICAgIm5hbWUiOiAiZW5vNCIsCiAgICAgICAgICAgICJ0eXBlIjogInBoeSIsCiAgICAgICAgICAgICJtdHUiOiAxNTAwCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJlbnA1OXMwZjEiLAogICAgICAgICAgICAibmFtZSI6ICJlbnA1OXMwZjEiLAogICAgICAgICAgICAidHlwZSI6ICJwaHkiLAogICAgICAgICAgICAibXR1IjogOTEwMAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiZW5wMjE2czBmMCIsCiAgICAgICAgICAgICJuYW1lIjogImVucDIxNnMwZjAiLAogICAgICAgICAgICAidHlwZSI6ICJwaHkiLAogICAgICAgICAgICAibXR1IjogOTEwMAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiYm9uZDAiLAogICAgICAgICAgICAibmFtZSI6ICJib25kMCIsCiAgICAgICAgICAgICJ0eXBlIjogImJvbmQiLAogICAgICAgICAgICAiYm9uZF9saW5rcyI6IFsKICAgICAgICAgICAgICAgICJlbnA1OXMwZjEiLAogICAgICAgICAgICAgICAgImVucDIxNnMwZjAiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJib25kX21vZGUiOiAiODAyLjNhZCIsCiAgICAgICAgICAgICJib25kX3htaXRfaGFzaF9wb2xpY3kiOiAibGF5ZXIzKzQiLAogICAgICAgICAgICAiYm9uZF9taWltb24iOiAxMDAsCiAgICAgICAgICAgICJtdHUiOiA5MTAwCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40MSIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQxIiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQxLAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40MiIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQyIiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQyLAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40NCIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQ0IiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQ0LAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40NSIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQ1IiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQ1LAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfQogICAgXSwKICAgICJuZXR3b3JrcyI6IFsKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJvYW0taXB2NiIsCiAgICAgICAgICAgICJ0eXBlIjogImlwdjYiLAogICAgICAgICAgICAibGluayI6ICJib25kMC40MSIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjIwMDE6MTg5MDoxMDAxOjI5M2Q6OjE0MCIsCiAgICAgICAgICAgICJyb3V0ZXMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5ldHdvcmsiOiAiOjovMCIsCiAgICAgICAgICAgICAgICAgICAgIm5ldG1hc2siOiAiOjovMCIsCiAgICAgICAgICAgICAgICAgICAgImdhdGV3YXkiOiAiMjAwMToxODkwOjEwMDE6MjkzZDo6MSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAib2FtLWlwdjQiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY0IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDEiLAogICAgICAgICAgICAiaXBfYWRkcmVzcyI6ICIzMi42OC41MS4xNDAiLAogICAgICAgICAgICAibmV0bWFzayI6ICIyNTUuMjU1LjI1NS4xMjgiLAogICAgICAgICAgICAiZG5zX25hbWVzZXJ2ZXJzIjogWwogICAgICAgICAgICAgICAgIjEzNS4xODguMzQuMTI0IiwKICAgICAgICAgICAgICAgICIxMzUuMzguMjQ0LjE2IiwKICAgICAgICAgICAgICAgICIxMzUuMTg4LjM0Ljg0IgogICAgICAgICAgICBdLAogICAgICAgICAgICAicm91dGVzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuZXR3b3JrIjogIjAuMC4wLjAiLAogICAgICAgICAgICAgICAgICAgICJuZXRtYXNrIjogIjAuMC4wLjAiLAogICAgICAgICAgICAgICAgICAgICJnYXRld2F5IjogIjMyLjY4LjUxLjEyOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAicHhlLWlwdjYiLAogICAgICAgICAgICAibGluayI6ICJlbm80IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NiIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogImZkMDA6OTAwOjEwMDoxMzg6OjEyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAicHhlLWlwdjQiLAogICAgICAgICAgICAibGluayI6ICJlbm80IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NCIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjE3Mi4zMC4wLjEyIiwKICAgICAgICAgICAgIm5ldG1hc2siOiAiMjU1LjI1NS4yNTUuMTI4IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAic3RvcmFnZS1pcHY2IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDIiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY2IiwKICAgICAgICAgICAgImlwX2FkZHJlc3MiOiAiZmQwMDo5MDA6MTAwOjEzOTo6MTYiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJzdG9yYWdlLWlwdjQiLAogICAgICAgICAgICAibGluayI6ICJib25kMC40MiIsCiAgICAgICAgICAgICJ0eXBlIjogImlwdjQiLAogICAgICAgICAgICAiaXBfYWRkcmVzcyI6ICIxNzIuMzEuMC4xNiIsCiAgICAgICAgICAgICJuZXRtYXNrIjogIjI1NS4yNTUuMjU1LjEyOCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImlkIjogImtzbi1pcHY2IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDQiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY2IiwKICAgICAgICAgICAgImlwX2FkZHJlc3MiOiAiZmQwMDo5MDA6MTAwOjEzYTo6MTIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJrc24taXB2NCIsCiAgICAgICAgICAgICJsaW5rIjogImJvbmQwLjQ0IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NCIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjE3Mi4yOS4wLjEyIiwKICAgICAgICAgICAgIm5ldG1hc2siOiAiMjU1LjI1NS4yNTUuMTI4IgogICAgICAgIH0KICAgIF0KfQo="), + }, + Type: corev1.SecretTypeOpaque, + } +} + +// CreateSIPCluster initializes a SIPCluster with specific parameters for use in test cases. +func CreateSIPCluster(name string, namespace string, masters int, workers int) *airshipv1.SIPCluster { + return &airshipv1.SIPCluster{ + TypeMeta: metav1.TypeMeta{ + Kind: "SIPCluster", + APIVersion: "airship.airshipit.org/v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + Spec: airshipv1.SIPClusterSpec{ + Config: &airshipv1.SipConfig{ + ClusterName: name, + }, + Nodes: map[airshipv1.VmRoles]airshipv1.NodeSet{ + airshipv1.VmMaster: airshipv1.NodeSet{ + VmFlavor: "airshipit.org/vino-flavor=master", + Scheduling: airshipv1.ServerAntiAffinity, + Count: &airshipv1.VmCount{ + Active: masters, + Standby: 0, + }, + }, + airshipv1.VmWorker: airshipv1.NodeSet{ + VmFlavor: "airshipit.org/vino-flavor=worker", + Scheduling: airshipv1.ServerAntiAffinity, + Count: &airshipv1.VmCount{ + Active: workers, + Standby: 0, + }, + }, + }, + InfraServices: map[airshipv1.InfraService]airshipv1.InfraConfig{}, + }, + Status: airshipv1.SIPClusterStatus{}, + } +} From 17e1333944597557df2aa66c7e2f6354cc8012fd Mon Sep 17 00:00:00 2001 From: Drew Walters Date: Thu, 3 Dec 2020 20:47:32 +0000 Subject: [PATCH 2/3] Update testutil network data secret type This commit changes the testutil network data to a human readable format for ease of maintenance. Previously, it was base 64 encoded. --- testutil/testutil.go | 148 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 147 insertions(+), 1 deletion(-) diff --git a/testutil/testutil.go b/testutil/testutil.go index dc46e3d..4ae8806 100644 --- a/testutil/testutil.go +++ b/testutil/testutil.go @@ -15,6 +15,152 @@ const ( sipRackLabel = "sip.airshipit.org/rack" sipScheduleLabel = "sip.airshipit.org/sip-scheduled" sipServerLabel = "sip.airshipit.org/server" + + networkDataContent = ` +{ + "links": [ + { + "id": "eno4", + "name": "eno4", + "type": "phy", + "mtu": 1500 + }, + { + "id": "enp59s0f1", + "name": "enp59s0f1", + "type": "phy", + "mtu": 9100 + }, + { + "id": "enp216s0f0", + "name": "enp216s0f0", + "type": "phy", + "mtu": 9100 + }, + { + "id": "bond0", + "name": "bond0", + "type": "bond", + "bond_links": [ + "enp59s0f1", + "enp216s0f0" + ], + "bond_mode": "802.3ad", + "bond_xmit_hash_policy": "layer3+4", + "bond_miimon": 100, + "mtu": 9100 + }, + { + "id": "bond0.41", + "name": "bond0.41", + "type": "vlan", + "vlan_link": "bond0", + "vlan_id": 41, + "mtu": 9100, + "vlan_mac_address": null + }, + { + "id": "bond0.42", + "name": "bond0.42", + "type": "vlan", + "vlan_link": "bond0", + "vlan_id": 42, + "mtu": 9100, + "vlan_mac_address": null + }, + { + "id": "bond0.44", + "name": "bond0.44", + "type": "vlan", + "vlan_link": "bond0", + "vlan_id": 44, + "mtu": 9100, + "vlan_mac_address": null + }, + { + "id": "bond0.45", + "name": "bond0.45", + "type": "vlan", + "vlan_link": "bond0", + "vlan_id": 45, + "mtu": 9100, + "vlan_mac_address": null + } + ], + "networks": [ + { + "id": "oam-ipv6", + "type": "ipv6", + "link": "bond0.41", + "ip_address": "2001:1890:1001:293d::139", + "routes": [ + { + "network": "::/0", + "netmask": "::/0", + "gateway": "2001:1890:1001:293d::1" + } + ] + }, + { + "id": "oam-ipv4", + "type": "ipv4", + "link": "bond0.41", + "ip_address": "32.68.51.139", + "netmask": "255.255.255.128", + "dns_nameservers": [ + "135.188.34.124", + "135.38.244.16", + "135.188.34.84" + ], + "routes": [ + { + "network": "0.0.0.0", + "netmask": "0.0.0.0", + "gateway": "32.68.51.129" + } + ] + }, + { + "id": "pxe-ipv6", + "link": "eno4", + "type": "ipv6", + "ip_address": "fd00:900:100:138::11" + }, + { + "id": "pxe-ipv4", + "link": "eno4", + "type": "ipv4", + "ip_address": "172.30.0.11", + "netmask": "255.255.255.128" + }, + { + "id": "storage-ipv6", + "link": "bond0.42", + "type": "ipv6", + "ip_address": "fd00:900:100:139::15" + }, + { + "id": "storage-ipv4", + "link": "bond0.42", + "type": "ipv4", + "ip_address": "172.31.1.15", + "netmask": "255.255.255.128" + }, + { + "id": "ksn-ipv6", + "link": "bond0.44", + "type": "ipv6", + "ip_address": "fd00:900:100:13a::11" + }, + { + "id": "ksn-ipv4", + "link": "bond0.44", + "type": "ipv4", + "ip_address": "172.29.0.11", + "netmask": "255.255.255.128" + } + ] +}` ) // CreateBMH initializes a BaremetalHost with specific parameteres for use in test cases. @@ -44,7 +190,7 @@ func CreateBMH(node int, namespace string, role string, rack int) (*metal3.BareM Namespace: namespace, }, Data: map[string][]byte{ - "networkData": []byte("ewoKICAgICJsaW5rcyI6IFsKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJlbm80IiwKICAgICAgICAgICAgIm5hbWUiOiAiZW5vNCIsCiAgICAgICAgICAgICJ0eXBlIjogInBoeSIsCiAgICAgICAgICAgICJtdHUiOiAxNTAwCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJlbnA1OXMwZjEiLAogICAgICAgICAgICAibmFtZSI6ICJlbnA1OXMwZjEiLAogICAgICAgICAgICAidHlwZSI6ICJwaHkiLAogICAgICAgICAgICAibXR1IjogOTEwMAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiZW5wMjE2czBmMCIsCiAgICAgICAgICAgICJuYW1lIjogImVucDIxNnMwZjAiLAogICAgICAgICAgICAidHlwZSI6ICJwaHkiLAogICAgICAgICAgICAibXR1IjogOTEwMAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiYm9uZDAiLAogICAgICAgICAgICAibmFtZSI6ICJib25kMCIsCiAgICAgICAgICAgICJ0eXBlIjogImJvbmQiLAogICAgICAgICAgICAiYm9uZF9saW5rcyI6IFsKICAgICAgICAgICAgICAgICJlbnA1OXMwZjEiLAogICAgICAgICAgICAgICAgImVucDIxNnMwZjAiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJib25kX21vZGUiOiAiODAyLjNhZCIsCiAgICAgICAgICAgICJib25kX3htaXRfaGFzaF9wb2xpY3kiOiAibGF5ZXIzKzQiLAogICAgICAgICAgICAiYm9uZF9taWltb24iOiAxMDAsCiAgICAgICAgICAgICJtdHUiOiA5MTAwCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40MSIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQxIiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQxLAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40MiIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQyIiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQyLAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40NCIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQ0IiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQ0LAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJib25kMC40NSIsCiAgICAgICAgICAgICJuYW1lIjogImJvbmQwLjQ1IiwKICAgICAgICAgICAgInR5cGUiOiAidmxhbiIsCiAgICAgICAgICAgICJ2bGFuX2xpbmsiOiAiYm9uZDAiLAogICAgICAgICAgICAidmxhbl9pZCI6IDQ1LAogICAgICAgICAgICAibXR1IjogOTEwMCwKICAgICAgICAgICAgInZsYW5fbWFjX2FkZHJlc3MiOiBudWxsCiAgICAgICAgfQogICAgXSwKICAgICJuZXR3b3JrcyI6IFsKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJvYW0taXB2NiIsCiAgICAgICAgICAgICJ0eXBlIjogImlwdjYiLAogICAgICAgICAgICAibGluayI6ICJib25kMC40MSIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjIwMDE6MTg5MDoxMDAxOjI5M2Q6OjE0MCIsCiAgICAgICAgICAgICJyb3V0ZXMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5ldHdvcmsiOiAiOjovMCIsCiAgICAgICAgICAgICAgICAgICAgIm5ldG1hc2siOiAiOjovMCIsCiAgICAgICAgICAgICAgICAgICAgImdhdGV3YXkiOiAiMjAwMToxODkwOjEwMDE6MjkzZDo6MSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAib2FtLWlwdjQiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY0IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDEiLAogICAgICAgICAgICAiaXBfYWRkcmVzcyI6ICIzMi42OC41MS4xNDAiLAogICAgICAgICAgICAibmV0bWFzayI6ICIyNTUuMjU1LjI1NS4xMjgiLAogICAgICAgICAgICAiZG5zX25hbWVzZXJ2ZXJzIjogWwogICAgICAgICAgICAgICAgIjEzNS4xODguMzQuMTI0IiwKICAgICAgICAgICAgICAgICIxMzUuMzguMjQ0LjE2IiwKICAgICAgICAgICAgICAgICIxMzUuMTg4LjM0Ljg0IgogICAgICAgICAgICBdLAogICAgICAgICAgICAicm91dGVzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuZXR3b3JrIjogIjAuMC4wLjAiLAogICAgICAgICAgICAgICAgICAgICJuZXRtYXNrIjogIjAuMC4wLjAiLAogICAgICAgICAgICAgICAgICAgICJnYXRld2F5IjogIjMyLjY4LjUxLjEyOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAicHhlLWlwdjYiLAogICAgICAgICAgICAibGluayI6ICJlbm80IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NiIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogImZkMDA6OTAwOjEwMDoxMzg6OjEyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAicHhlLWlwdjQiLAogICAgICAgICAgICAibGluayI6ICJlbm80IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NCIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjE3Mi4zMC4wLjEyIiwKICAgICAgICAgICAgIm5ldG1hc2siOiAiMjU1LjI1NS4yNTUuMTI4IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAic3RvcmFnZS1pcHY2IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDIiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY2IiwKICAgICAgICAgICAgImlwX2FkZHJlc3MiOiAiZmQwMDo5MDA6MTAwOjEzOTo6MTYiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJzdG9yYWdlLWlwdjQiLAogICAgICAgICAgICAibGluayI6ICJib25kMC40MiIsCiAgICAgICAgICAgICJ0eXBlIjogImlwdjQiLAogICAgICAgICAgICAiaXBfYWRkcmVzcyI6ICIxNzIuMzEuMC4xNiIsCiAgICAgICAgICAgICJuZXRtYXNrIjogIjI1NS4yNTUuMjU1LjEyOCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImlkIjogImtzbi1pcHY2IiwKICAgICAgICAgICAgImxpbmsiOiAiYm9uZDAuNDQiLAogICAgICAgICAgICAidHlwZSI6ICJpcHY2IiwKICAgICAgICAgICAgImlwX2FkZHJlc3MiOiAiZmQwMDo5MDA6MTAwOjEzYTo6MTIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJrc24taXB2NCIsCiAgICAgICAgICAgICJsaW5rIjogImJvbmQwLjQ0IiwKICAgICAgICAgICAgInR5cGUiOiAiaXB2NCIsCiAgICAgICAgICAgICJpcF9hZGRyZXNzIjogIjE3Mi4yOS4wLjEyIiwKICAgICAgICAgICAgIm5ldG1hc2siOiAiMjU1LjI1NS4yNTUuMTI4IgogICAgICAgIH0KICAgIF0KfQo="), + "networkData": []byte(networkDataContent), }, Type: corev1.SecretTypeOpaque, } From e3dbdf280bd11ca2a58e677985940d6f83b145cf Mon Sep 17 00:00:00 2001 From: Drew Walters Date: Thu, 3 Dec 2020 20:48:29 +0000 Subject: [PATCH 3/3] Add additional vbmh package tests This commit adds additional vbmh package tests to validate that SIP reads the correct interface information when spawning infrastructure services. --- pkg/vbmh/vbmh_test.go | 91 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/pkg/vbmh/vbmh_test.go b/pkg/vbmh/vbmh_test.go index b69a540..9f0c4ec 100644 --- a/pkg/vbmh/vbmh_test.go +++ b/pkg/vbmh/vbmh_test.go @@ -76,7 +76,96 @@ var _ = Describe("MachineList", func() { Expect(bmh.Labels[SipScheduleLabel]).To(Equal("false")) } } - }) + It("Should not produce a list of BMH objects when there are none available for scheduling", func() { + // "Schedule" all nodes + var objs []runtime.Object + for _, machine := range machineList.Machines { + machine.BMH.Labels[SipScheduleLabel] = "true" + objs = append(objs, &machine.BMH) + } + + k8sClient := mockClient.NewFakeClient(objs...) + _, err := machineList.getBMHs(k8sClient) + Expect(err).ToNot(BeNil()) + }) + + It("Should retrieve the BMH IP from the BMH's NetworkData secret when infra services are defined", func() { + // Create a BMH with a NetworkData secret + bmh, secret := testutil.CreateBMH(1, "default", "master", 6) + + var objs []runtime.Object + objs = append(objs, bmh) + objs = append(objs, secret) + + ml := &MachineList{ + NamespacedName: types.NamespacedName{ + Name: "vbmh", + Namespace: "default", + }, + Machines: map[string]*Machine{ + bmh.Name: NewMachine(*bmh, airshipv1.VmMaster, NotScheduled), + }, + Log: ctrl.Log.WithName("controllers").WithName("SIPCluster"), + } + + sipCluster := testutil.CreateSIPCluster("subcluster-1", "default", 1, 3) + sipCluster.Spec.InfraServices = map[airshipv1.InfraService]airshipv1.InfraConfig{ + airshipv1.LoadBalancerService: airshipv1.InfraConfig{ + Image: "haproxy:latest", + NodeLabels: map[string]string{ + "test": "true", + }, + NodePorts: []int{7000, 7001, 7002}, + NodeInterface: "oam-ipv4", + }, + } + k8sClient := mockClient.NewFakeClient(objs...) + Expect(ml.Extrapolate(*sipCluster, k8sClient)).To(BeTrue()) + + // NOTE(drewwalters96): Interface data is b64 encoded in the testutil convenience function. + Expect(ml.Machines[bmh.Name].Data.IpOnInterface).To(Equal(map[string]string{"oam-ipv4": "32.68.51.139"})) + }) + + It("Should not retrieve the BMH IP from the BMH's NetworkData secret if no infraServices are defined", func() { + // Create a BMH with a NetworkData secret + bmh, secret := testutil.CreateBMH(1, "default", "master", 6) + + var objs []runtime.Object + objs = append(objs, bmh) + objs = append(objs, secret) + + ml := &MachineList{ + NamespacedName: types.NamespacedName{ + Name: "vbmh", + Namespace: "default", + }, + Machines: map[string]*Machine{ + bmh.Name: NewMachine(*bmh, airshipv1.VmMaster, NotScheduled), + }, + Log: ctrl.Log.WithName("controllers").WithName("SIPCluster"), + } + + k8sClient := mockClient.NewFakeClient(objs...) + sipCluster := testutil.CreateSIPCluster("subcluster-1", "default", 1, 3) + Expect(ml.Extrapolate(*sipCluster, k8sClient)).To(BeTrue()) + Expect(len(ml.Machines[bmh.Name].Data.IpOnInterface)).To(Equal(0)) + }) + + + It("Should not retrieve the BMH IP if it has been previously extrapolated", func() { + // Store an IP address for each machine + var objs []runtime.Object + for _, machine := range machineList.Machines { + machine.Data.IpOnInterface = map[string]string{ + "oam-ipv4": "32.68.51.139", + } + objs = append(objs, &machine.BMH) + } + + k8sClient := mockClient.NewFakeClient(objs...) + sipCluster := testutil.CreateSIPCluster("subcluster-1", "default", 1, 3) + Expect(machineList.Extrapolate(*sipCluster, k8sClient)).To(BeTrue()) + }) })