aboutsummaryrefslogtreecommitdiff
path: root/tests/test-ironic.sh
diff options
context:
space:
mode:
authorMark Goddard <mark@stackhpc.com>2018-05-16 13:36:38 +0100
committerMark Goddard <mark@stackhpc.com>2019-06-11 10:22:04 +0100
commit845040ad3f2a477f5ab823391390e84355dd140e (patch)
treef3c38367d2fad4fc0690cb30b0a8383edc523856 /tests/test-ironic.sh
parent860f4ea605ba318fc2811ff22d5a6e6d6c7f7769 (diff)
downloadkolla-ansible-845040ad3f2a477f5ab823391390e84355dd140e.tar.gz
kolla-ansible-845040ad3f2a477f5ab823391390e84355dd140e.zip
Add CI job for ironic
Adds four new CI jobs for testing centos/ubuntu binary/source deploys with ironic enabled. These are run only when there are changes to the ironic role. Performs some simple testing by creating a node using the fake-hardware hardware type and creating a server. Change-Id: Ie669e57ce2af53257b4ca05f45193cb73f48827a Depends-On: https://review.opendev.org/664011
Diffstat (limited to 'tests/test-ironic.sh')
-rwxr-xr-xtests/test-ironic.sh138
1 files changed, 138 insertions, 0 deletions
diff --git a/tests/test-ironic.sh b/tests/test-ironic.sh
new file mode 100755
index 000000000..4a5fcbb62
--- /dev/null
+++ b/tests/test-ironic.sh
@@ -0,0 +1,138 @@
+#!/bin/bash
+
+set -o xtrace
+set -o errexit
+set -o pipefail
+
+# Enable unbuffered output for Ansible in Jenkins.
+export PYTHONUNBUFFERED=1
+
+# Adapted from the function of the same name in the ironic devstack plugin.
+function wait_for_placement_resources {
+ # After nodes have been enrolled, we need to wait for both ironic and
+ # nova's periodic tasks to populate the resource tracker with available
+ # nodes and resources. Wait up to 2 minutes for a given resource before
+ # timing out.
+ local expected_count=1
+ local resource_class="RC0"
+
+ curl -L -o jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
+ chmod +x jq
+
+ # TODO(mgoddard): switch to Placement OSC plugin, once it exists
+ local token
+ token=$(openstack token issue -f value -c id)
+ local endpoint
+ endpoint=$(openstack endpoint list --service placement --interface public -f value -c URL)
+ if [[ -z $endpoint ]]; then
+ echo "Cannot find Placement API endpoint"
+ return 1
+ fi
+
+ local i
+ local count
+ echo "Waiting 2 minutes for Nova resource tracker to pick up $expected_count nodes"
+ for i in $(seq 1 120); do
+ # Fetch provider UUIDs from Placement
+ local providers
+ providers=$(curl -sH "X-Auth-Token: $token" $endpoint/resource_providers \
+ | ./jq -r '.resource_providers[].uuid')
+
+ local p
+ # Total count of the resource class, has to be equal to nodes count
+ count=0
+ for p in $providers; do
+ local amount
+ # A resource class inventory record looks something like
+ # {"max_unit": 1, "min_unit": 1, "step_size": 1, "reserved": 0, "total": 1, "allocation_ratio": 1}
+ # Subtract reserved from total (defaulting both to 0)
+ amount=$(curl -sH "X-Auth-Token: $token" $endpoint/resource_providers/$p/inventories \
+ | ./jq ".inventories.CUSTOM_$resource_class as \$cls
+ | (\$cls.total // 0) - (\$cls.reserved // 0)")
+ if [ $amount -gt 0 ]; then
+ count=$(( count + $amount ))
+ fi
+ done
+
+ if [ $count -ge $expected_count ]; then
+ return 0
+ fi
+ sleep 1
+ done
+
+ echo "Timed out waiting for Nova to track $expected_count nodes"
+ return 1
+}
+
+function create_resources {
+ # Create a bare metal node and port.
+ openstack baremetal node create \
+ --name node-0 \
+ --driver fake-hardware \
+ --network-interface noop \
+ --property cpu_arch=x86_64 \
+ --resource-class rc0
+ node_uuid=$(openstack baremetal node show node-0 -f value -c uuid)
+ openstack baremetal port create \
+ 00:11:22:33:44:55 \
+ --node $node_uuid
+ openstack baremetal node power off node-0
+ openstack baremetal node manage node-0 --wait
+ openstack baremetal node provide node-0 --wait
+
+ # Create a bare metal flavor in nova.
+ openstack flavor create \
+ baremetal \
+ --vcpus 1 \
+ --ram 1024 \
+ --disk 10 \
+ --property resources:CUSTOM_RC0=1 \
+ --property resources:VCPU=0 \
+ --property resources:MEMORY_MB=0 \
+ --property resources:DISK_GB=0 \
+ --public
+}
+
+function test_ironic_logged {
+ # Assumes init-runonce has been executed.
+ . /etc/kolla/admin-openrc.sh
+ . ~/ironic-venv/bin/activate
+
+ # Smoke test ironic API.
+ if ! openstack baremetal driver list | grep fake-hardware; then
+ echo "No active conductors with fake-hardware driver"
+ exit 1
+ fi
+ openstack baremetal node list
+ openstack baremetal port list
+
+ create_resources
+ wait_for_placement_resources
+
+ echo "TESTING: Server creation"
+ openstack server create --wait --image cirros --flavor baremetal --key-name mykey --network demo-net kolla_boot_test
+ openstack --debug server list
+ # If the status is not ACTIVE, print info and exit 1
+ if [[ $(openstack server show kolla_boot_test -f value -c status) != "ACTIVE" ]]; then
+ echo "FAILED: Instance is not active"
+ openstack --debug server show kolla_boot_test
+ return 1
+ fi
+ echo "SUCCESS: Server creation"
+
+ echo "TESTING: Server deletion"
+ openstack server delete --wait kolla_boot_test
+ echo "SUCCESS: Server deletion"
+}
+
+function test_ironic {
+ echo "Testing Ironic"
+ if ! test_ironic_logged > /tmp/logs/ansible/test-ironic 2>&1; then
+ echo "Testing Ironic failed. See ansible/test-ironic for details"
+ return 1
+ else
+ echo "Successfully tested Ironic. See ansible/test-ironic for details"
+ fi
+}
+
+test_ironic