diff options
| author | Mark Goddard <mark@stackhpc.com> | 2018-05-16 13:36:38 +0100 |
|---|---|---|
| committer | Mark Goddard <mark@stackhpc.com> | 2019-06-11 10:22:04 +0100 |
| commit | 845040ad3f2a477f5ab823391390e84355dd140e (patch) | |
| tree | f3c38367d2fad4fc0690cb30b0a8383edc523856 /tests/test-ironic.sh | |
| parent | 860f4ea605ba318fc2811ff22d5a6e6d6c7f7769 (diff) | |
| download | kolla-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-x | tests/test-ironic.sh | 138 |
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 |
