Skip to content

Commit a04c708

Browse files
committed
metal3: add e2e tests
1 parent 73b1124 commit a04c708

File tree

150 files changed

+24560
-6801
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+24560
-6801
lines changed

e2e/baremetal_test.go

+165
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
package e2e
2+
3+
import (
4+
metal3v1 "github.com/metal3-io/cluster-api-provider-metal3/api/v1beta1"
5+
. "github.com/onsi/ginkgo/v2"
6+
. "github.com/onsi/gomega"
7+
corev1 "k8s.io/api/core/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
11+
"sigs.k8s.io/controller-runtime/pkg/client"
12+
yaml "sigs.k8s.io/yaml"
13+
14+
configv1 "github.com/openshift/api/config/v1"
15+
mapiv1 "github.com/openshift/api/machine/v1beta1"
16+
bmv1alpha1 "github.com/openshift/cluster-api-provider-baremetal/pkg/apis/baremetal/v1alpha1"
17+
"github.com/openshift/cluster-capi-operator/e2e/framework"
18+
)
19+
20+
const (
21+
baremetalMachineTemplateName = "baremetal-machine-template"
22+
)
23+
24+
var _ = Describe("Cluster API Baremetal MachineSet", Ordered, func() {
25+
var baremetalMachineTemplate *metal3v1.Metal3MachineTemplate
26+
var machineSet *clusterv1.MachineSet
27+
var mapiMachineSpec *bmv1alpha1.BareMetalMachineProviderSpec
28+
29+
BeforeAll(func() {
30+
if platform != configv1.BareMetalPlatformType {
31+
Skip("Skipping Baremetal E2E tests")
32+
}
33+
framework.CreateCoreCluster(cl, clusterName, "Metal3Cluster")
34+
mapiMachineSpec = getBaremetalMAPIProviderSpec(cl)
35+
createBaremetalCluster(cl, mapiMachineSpec)
36+
})
37+
38+
AfterEach(func() {
39+
if platform != configv1.BareMetalPlatformType {
40+
// Because AfterEach always runs, even when tests are skipped, we have to
41+
// explicitly skip it here for other platforms.
42+
Skip("Skipping Baremetal E2E tests")
43+
}
44+
framework.DeleteMachineSets(cl, machineSet)
45+
framework.WaitForMachineSetsDeleted(cl, machineSet)
46+
framework.DeleteObjects(cl, baremetalMachineTemplate)
47+
})
48+
49+
It("should be able to run a machine", func() {
50+
baremetalMachineTemplate = createBaremetalMachineTemplate(cl, mapiMachineSpec)
51+
52+
machineSet = framework.CreateMachineSet(cl, framework.NewMachineSetParams(
53+
"baremetal-machineset",
54+
clusterName,
55+
"", // mapiMachineSpec.Zone,
56+
1,
57+
corev1.ObjectReference{
58+
Kind: "Metal3MachineTemplate",
59+
APIVersion: infraAPIVersion,
60+
Name: baremetalMachineTemplateName,
61+
},
62+
))
63+
64+
framework.WaitForMachineSet(cl, machineSet.Name)
65+
})
66+
})
67+
68+
func getBaremetalMAPIProviderSpec(cl client.Client) *bmv1alpha1.BareMetalMachineProviderSpec {
69+
machineSetList := &mapiv1.MachineSetList{}
70+
Expect(cl.List(ctx, machineSetList, client.InNamespace(framework.MAPINamespace))).To(Succeed())
71+
72+
Expect(machineSetList.Items).ToNot(HaveLen(0))
73+
machineSet := machineSetList.Items[0]
74+
Expect(machineSet.Spec.Template.Spec.ProviderSpec.Value).ToNot(BeNil())
75+
76+
providerSpec := &bmv1alpha1.BareMetalMachineProviderSpec{}
77+
Expect(yaml.Unmarshal(machineSet.Spec.Template.Spec.ProviderSpec.Value.Raw, providerSpec)).To(Succeed())
78+
79+
return providerSpec
80+
}
81+
82+
func createBaremetalCluster(cl client.Client, mapiProviderSpec *bmv1alpha1.BareMetalMachineProviderSpec) *metal3v1.Metal3Cluster {
83+
By("Creating Baremetal cluster")
84+
85+
host, port, err := framework.GetControlPlaneHostAndPort(cl)
86+
if err != nil {
87+
Expect(err).ToNot(HaveOccurred(), "should not fail getting the Control Plane host and port")
88+
}
89+
90+
baremetalCluster := &metal3v1.Metal3Cluster{
91+
ObjectMeta: metav1.ObjectMeta{
92+
Name: clusterName,
93+
Namespace: framework.CAPINamespace,
94+
// The ManagedBy Annotation is set so CAPI infra providers ignore the InfraCluster object,
95+
// as that's managed externally, in this case by the cluster-capi-operator's infracluster controller.
96+
Annotations: map[string]string{
97+
clusterv1.ManagedByAnnotation: managedByAnnotationValueClusterCAPIOperatorInfraClusterController,
98+
},
99+
},
100+
Spec: metal3v1.Metal3ClusterSpec{
101+
ControlPlaneEndpoint: metal3v1.APIEndpoint{
102+
Host: host,
103+
Port: int(port),
104+
},
105+
// Network: metal3v1.Network{
106+
// Name: &mapiProviderSpec.NetworkInterfaces[0].Network,
107+
// },
108+
// Region: mapiProviderSpec.Region,
109+
// Project: mapiProviderSpec.ProjectID,
110+
},
111+
}
112+
113+
if err := cl.Create(ctx, baremetalCluster); err != nil && !apierrors.IsAlreadyExists(err) {
114+
Expect(err).ToNot(HaveOccurred())
115+
}
116+
117+
Eventually(func() (bool, error) {
118+
patchedBaremetalCluster := &metal3v1.Metal3Cluster{}
119+
err := cl.Get(ctx, client.ObjectKeyFromObject(baremetalCluster), patchedBaremetalCluster)
120+
if err != nil {
121+
return false, err
122+
}
123+
124+
if patchedBaremetalCluster.Annotations == nil {
125+
return false, nil
126+
}
127+
128+
if _, ok := patchedBaremetalCluster.Annotations[clusterv1.ManagedByAnnotation]; !ok {
129+
return false, nil
130+
}
131+
132+
return patchedBaremetalCluster.Status.Ready, nil
133+
}, framework.WaitShort).Should(BeTrue())
134+
135+
return baremetalCluster
136+
}
137+
138+
func createBaremetalMachineTemplate(cl client.Client, mapiProviderSpec *bmv1alpha1.BareMetalMachineProviderSpec) *metal3v1.Metal3MachineTemplate {
139+
By("Creating Baremetal machine template")
140+
141+
baremetalMachineSpec := metal3v1.Metal3MachineSpec{
142+
Image: metal3v1.Image{
143+
URL: mapiProviderSpec.Image.URL,
144+
Checksum: mapiProviderSpec.Image.Checksum,
145+
},
146+
}
147+
148+
baremetalMachineTemplate := &metal3v1.Metal3MachineTemplate{
149+
ObjectMeta: metav1.ObjectMeta{
150+
Name: baremetalMachineTemplateName,
151+
Namespace: framework.CAPINamespace,
152+
},
153+
Spec: metal3v1.Metal3MachineTemplateSpec{
154+
Template: metal3v1.Metal3MachineTemplateResource{
155+
Spec: baremetalMachineSpec,
156+
},
157+
},
158+
}
159+
160+
if err := cl.Create(ctx, baremetalMachineTemplate); err != nil && !apierrors.IsAlreadyExists(err) {
161+
Expect(err).ToNot(HaveOccurred())
162+
}
163+
164+
return baremetalMachineTemplate
165+
}

e2e/go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ require (
1010
github.com/metal3-io/cluster-api-provider-metal3/api v1.7.0
1111
github.com/onsi/ginkgo/v2 v2.19.0
1212
github.com/onsi/gomega v1.33.1
13-
github.com/openshift/api v0.0.0-20220921125526-1866ef90edbf
13+
github.com/openshift/api v0.0.0-20240124164020-e2ce40831f2e
14+
github.com/openshift/cluster-api-provider-baremetal v0.0.0-20240529144704-2549061c570a
1415
k8s.io/api v0.30.2
1516
k8s.io/apimachinery v0.30.2
1617
k8s.io/client-go v0.30.2

e2e/go.sum

+11-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFG
1111
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI=
1212
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM=
1313
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE=
14-
github.com/Azure/azure-service-operator/v2 v2.8.0 h1:VeXvLrgMD3/LEbyuSddDTcnGR0CK+YE2vKRvx1tiY4k=
14+
github.com/Azure/azure-service-operator/v2 v2.8.0 h1:BcyB8LvRmtgVIIUaXwWIJz5eHvknyno0qq5LkDuvM/s=
1515
github.com/Azure/azure-service-operator/v2 v2.8.0/go.mod h1:ezbJS56PcORFFqLV8XZmM9xZ12m6aGAkg353fQhWD/8=
1616
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
1717
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
@@ -126,6 +126,10 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
126126
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
127127
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
128128
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
129+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
130+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
131+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
132+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
129133
github.com/metal3-io/cluster-api-provider-metal3/api v1.7.0 h1:9ALpFlMFacUTCZVChphg49xU/urSB+vvlAlxuICWLqU=
130134
github.com/metal3-io/cluster-api-provider-metal3/api v1.7.0/go.mod h1:c0M3xS4zQxJpHDVNEb53wLdbYa0/kuWJHw6d9a9CjGQ=
131135
github.com/metal3-io/ip-address-manager/api v1.7.0 h1:ie9SQPWDWTjBnnxnG+qSfoqIOs+4vp5k0tVI+/0HNGo=
@@ -149,8 +153,10 @@ github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA
149153
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
150154
github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
151155
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
152-
github.com/openshift/api v0.0.0-20220921125526-1866ef90edbf h1:Bohu/gUxpyuTjQx2m01DFNgtGMy3wtti6s7mJ+Gtblc=
153-
github.com/openshift/api v0.0.0-20220921125526-1866ef90edbf/go.mod h1:HJAEIh4gLXPDdWxgCbvmJjzd9QIxyPZJtPU0u2W4vH4=
156+
github.com/openshift/api v0.0.0-20240124164020-e2ce40831f2e h1:cxgCNo/R769CO23AK5TCh45H9SMUGZ8RukiF2/Qif3o=
157+
github.com/openshift/api v0.0.0-20240124164020-e2ce40831f2e/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4=
158+
github.com/openshift/cluster-api-provider-baremetal v0.0.0-20240529144704-2549061c570a h1:KWSEyxc2IeueaaD9E+IwlBxLqFPtSGUvghnssaM+uQE=
159+
github.com/openshift/cluster-api-provider-baremetal v0.0.0-20240529144704-2549061c570a/go.mod h1:+eLKAJUhziIt76wz0RGCn5wRZM42EO8msGBHn6xkFGw=
154160
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
155161
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
156162
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -189,8 +195,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
189195
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
190196
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
191197
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
192-
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
193-
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
198+
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
199+
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
194200
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
195201
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
196202
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=

0 commit comments

Comments
 (0)