Skip to content

Commit

Permalink
Implement BMH provisioning E2E test
Browse files Browse the repository at this point in the history
Introduce an end-to-end test validating the provisioning and
deprovisioning flow of a BareMetalHost.
  • Loading branch information
Max Rantil committed Oct 25, 2023
1 parent f23a438 commit be75aca
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 19 deletions.
28 changes: 28 additions & 0 deletions hack/ci-e2e.sh
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,34 @@ export BOOT_MAC_ADDRESS
# These are the VBMC defaults (used since we did not specify anything else for `vbmc add`).
export BMC_USER=admin
export BMC_PASSWORD=password
# This is the IP address of the host where the image server is running.
IMAGE_FILE="cirros-0.5.2-x86_64-disk.img"
export IMAGE_MD5SUM="b874c39491a2377b8490f5f1e89761a4"
IMAGE_IP_ADDRESS=$(echo $BMC_ADDRESS | sed -n 's|ipmi://\([^:]*\).*|\1|p')
export IMAGE_URL="http://${IMAGE_IP_ADDRESS}/${IMAGE_FILE}"

## Setup image server
# Create a directory for images
mkdir -p images
pushd images

# Check if IMAGE_FILE already exists
if [[ ! -f $IMAGE_FILE ]]; then
wget http://download.cirros-cloud.net/0.5.2/$IMAGE_FILE
else
echo "$IMAGE_FILE already exists. Skipping download."
fi

popd

# Check if container "image-server" is running
if [ "$(docker ps -q -f name=image-server)" ]; then
echo "Container 'image-server' is already running. Removing..."
docker rm -f image-server
fi

# Run image server
docker run --rm --name image-server -d -p 80:8080 -v "$(pwd)/images:/usr/share/nginx/html" nginxinc/nginx-unprivileged

## Setup image server

Expand Down
16 changes: 8 additions & 8 deletions test/e2e/basic_provisioning_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/cluster-api/test/framework"
"sigs.k8s.io/cluster-api/util"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/cluster-api/util/patch"

metal3api "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
)
Expand Down Expand Up @@ -77,7 +77,7 @@ var _ = Describe("Provisioning", func() {
}
err = clusterProxy.GetClient().Create(ctx, &bmh)
Expect(err).NotTo(HaveOccurred())

By("Waiting for the BMH to be in registering state")
WaitForBmhInProvisioningState(ctx, WaitForBmhInProvisioningStateInput{
Client: clusterProxy.GetClient(),
Expand All @@ -93,16 +93,16 @@ var _ = Describe("Provisioning", func() {
}, e2eConfig.GetIntervals(specName, "wait-available")...)

By("Patching the BMH to test provisioning")
bmhPatch := client.MergeFrom(bmh.DeepCopy())
helper, err := patch.NewHelper(&bmh, clusterProxy.GetClient())
Expect(err).NotTo(HaveOccurred())
bmh.Spec.Image = &metal3api.Image{
URL: e2eConfig.GetVariable("IMAGE_URL"),
Checksum: e2eConfig.GetVariable("IMAGE_CHECKSUM"),
}
bmh.Spec.RootDeviceHints = &metal3api.RootDeviceHints{
DeviceName: "/dev/vda",
}
err = clusterProxy.GetClient().Patch(ctx, &bmh, bmhPatch)
Expect(err).NotTo(HaveOccurred())
Expect(helper.Patch(ctx, &bmh)).To(Succeed())

By("Waiting for the BMH to be in provisioning state")
WaitForBmhInProvisioningState(ctx, WaitForBmhInProvisioningStateInput{
Expand All @@ -119,10 +119,10 @@ var _ = Describe("Provisioning", func() {
}, e2eConfig.GetIntervals(specName, "wait-provisioned")...)

By("Triggering the deprovisioning of the BMH")
bmhPatch = client.MergeFrom(bmh.DeepCopy())
bmh.Spec.Image = nil
err = clusterProxy.GetClient().Patch(ctx, &bmh, bmhPatch)
helper, err = patch.NewHelper(&bmh, clusterProxy.GetClient())
Expect(err).NotTo(HaveOccurred())
bmh.Spec.Image = nil
Expect(helper.Patch(ctx, &bmh)).To(Succeed())

By("Waiting for the BMH to become deprovisioned")
WaitForBmhInProvisioningState(ctx, WaitForBmhInProvisioningStateInput{
Expand Down
10 changes: 4 additions & 6 deletions test/e2e/config/fixture.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ variables:
BMC_PASSWORD: password
BMC_ADDRESS: ipmi://192.168.222.1:16230
BOOT_MAC_ADDRESS: "00:60:2f:31:81:01"
# Image to use for the test BMH.
IMAGE_URL: http://192.168.122.1/cirros-0.5.2-x86_64-disk.img
IMAGE_SERVER_IP: 192.168.122.1
IMAGE_CHECKSUM: b874c39491a2377b8490f5f1e89761a4
IMAGE_URL: "http://192.168.222.1/cirros-0.5.2-x86_64-disk.img"
IMAGE_CHECKSUM: "b874c39491a2377b8490f5f1e89761a4"

intervals:
inspection/wait-unmanaged: ["1m", "10ms"]
Expand All @@ -37,5 +35,5 @@ intervals:
default/wait-namespace-deleted: ["20s", "1s"]
ironic/wait-deployment: ["10m", "2s"]
default/wait-provisioning: ["20s", "1s"]
default/wait-provisioned: ["5m", "5s"]
default/wait-deprovisioning: ["1m", "2s"]
default/wait-provisioned: ["1m", "10ms"]
default/wait-deprovisioning: ["1m", "2s"]
8 changes: 3 additions & 5 deletions test/e2e/config/ironic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,8 @@ variables:
BMC_PASSWORD: password
BMC_ADDRESS: ipmi://192.168.222.1:16230
BOOT_MAC_ADDRESS: "00:60:2f:31:81:01"
# Image to use for the test BMH.
IMAGE_SERVER_IP: 192.168.122.1
IMAGE_URL: http://192.168.122.1/cirros-0.5.2-x86_64-disk.img
IMAGE_CHECKSUM: b874c39491a2377b8490f5f1e89761a4
IMAGE_URL: "http://192.168.222.1/cirros-0.5.2-x86_64-disk.img"
IMAGE_CHECKSUM: "b874c39491a2377b8490f5f1e89761a4"

intervals:
inspection/wait-unmanaged: ["1m", "5s"]
Expand All @@ -42,4 +40,4 @@ intervals:
default/wait-power-state: ["10m", "100ms"]
default/wait-provisioning: ["20s", "1s"]
default/wait-provisioned: ["5m", "5s"]
default/wait-deprovisioning: ["1m", "2s"]
default/wait-deprovisioning: ["1m", "10ms"]

0 comments on commit be75aca

Please sign in to comment.