Merge pull request #16 from drewwalters96/vbmh-tests
Additional vbmh package tests
This commit is contained in:
commit
18ff3aa7ab
@ -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{},
|
||||
}
|
||||
}
|
||||
|
@ -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{
|
||||
@ -97,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())
|
||||
})
|
||||
})
|
||||
|
236
testutil/testutil.go
Normal file
236
testutil/testutil.go
Normal file
@ -0,0 +1,236 @@
|
||||
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"
|
||||
|
||||
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.
|
||||
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(networkDataContent),
|
||||
},
|
||||
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{},
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user