ironic/devstack/upgrade/resources.sh
Vasyl Saienko bf91a8fca4 Wait for cleaning is completed after base smoke tests
Nova do not wait for cleaning is completed when deleting instance
as result after destroy phase ironic may still perform cleaning.
This patch ensures all nodes are available again after base smoke tests
finished and hypervisor stats are updated.

We still need to wait for resources after destroy phase which will be
done in separate patch as changes to grenade workflow are needed.

Change-Id: Ib6c5a0543533893664cb3e895286d0e226e364d2
2017-08-18 14:41:25 +00:00

169 lines
5.8 KiB
Bash
Executable File

#!/bin/bash
#
# Copyright 2015 Hewlett-Packard Development Company, L.P.
# Copyright 2016 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
set -o errexit
source $GRENADE_DIR/grenaderc
source $GRENADE_DIR/functions
source $TOP_DIR/openrc admin admin
IRONIC_DEVSTACK_DIR=$(cd $(dirname "$0")/.. && pwd)
source $IRONIC_DEVSTACK_DIR/lib/ironic
RESOURCES_NETWORK_GATEWAY=${RESOURCES_NETWORK_GATEWAY:-10.2.0.1}
RESOURCES_FIXED_RANGE=${RESOURCES_FIXED_RANGE:-10.2.0.0/20}
NEUTRON_NET=ironic_grenade
set -o xtrace
function wait_for_ironic_resources {
local i
local nodes_count
nodes_count=$(openstack baremetal node list -f value -c "Provisioning State" | wc -l)
echo_summary "Waiting 5 minutes for Ironic resources become available again"
for i in $(seq 1 30); do
if openstack baremetal node list -f value -c "Provisioning State" | grep -qi failed; then
die $LINENO "One of nodes is in failed state."
fi
if [[ $(openstack baremetal node list -f value -c "Provisioning State" | grep -ci available) == $nodes_count ]]; then
return 0
fi
sleep 10
done
openstack baremetal node list
die $LINENO "Timed out waiting for Ironic nodes are available again."
}
total_cpus=$(( $IRONIC_VM_SPECS_CPU * $IRONIC_VM_COUNT ))
if [[ "${HOST_TOPOLOGY}" == "multinode" ]]; then
total_cpus=$(( 2 * $total_cpus ))
fi
function early_create {
# We need these steps only in case of flat-network
if [[ -n "${IRONIC_PROVISION_NETWORK_NAME}" ]]; then
return
fi
# Ironic needs to have network access to the instance during deployment
# from the control plane (ironic-conductor). This 'early_create' function
# creates a new network with a unique CIDR, adds a route to this network
# from ironic-conductor and creates taps between br-int and brbm.
# ironic-conductor will be able to access the ironic nodes via this new
# network.
# TODO(vsaienko) use OSC when Neutron commands are supported in the stable
# release.
local net_id
net_id=$(openstack network create --share $NEUTRON_NET -f value -c id)
resource_save network net_id $net_id
local subnet_params=""
subnet_params+="--ip_version 4 "
subnet_params+="--gateway $RESOURCES_NETWORK_GATEWAY "
subnet_params+="--name $NEUTRON_NET "
subnet_params+="$net_id $RESOURCES_FIXED_RANGE"
local subnet_id
subnet_id=$(neutron subnet-create $subnet_params | grep ' id ' | get_field 2)
resource_save network subnet_id $subnet_id
local router_id
router_id=$(openstack router create $NEUTRON_NET -f value -c id)
resource_save network router_id $router_id
neutron router-interface-add $NEUTRON_NET $subnet_id
neutron router-gateway-set $NEUTRON_NET public
# Add a route to the baremetal network via the Neutron public router.
# ironic-conductor will be able to access the ironic nodes via this new
# route.
local r_net_gateway
# Determine the IP address of the interface (ip -4 route get 8.8.8.8) that
# will be used to access a public IP on the router we created ($router_id).
# In this case we use the Google DNS server at 8.8.8.8 as the public IP
# address. This does not actually attempt to contact 8.8.8.8, it just
# determines the IP address of the interface that traffic to 8.8.8.8 would
# use. We use the IP address of this interface to setup the route.
test_with_retry "sudo ip netns exec qrouter-$router_id ip -4 route get 8.8.8.8 " "Route did not start" 60
r_net_gateway=$(sudo ip netns exec qrouter-$router_id ip -4 route get 8.8.8.8 |grep dev | awk '{print $7}')
sudo ip route replace $RESOURCES_FIXED_RANGE via $r_net_gateway
# NOTE(vsaienko) remove connection between br-int and brbm from old setup
sudo ovs-vsctl -- --if-exists del-port ovs-1-tap1
sudo ovs-vsctl -- --if-exists del-port brbm-1-tap1
create_ovs_taps $net_id
}
function create {
:
}
function verify {
:
}
function verify_noapi {
:
}
function destroy {
# We need these steps only in case of flat-network
if [[ -n "${IRONIC_PROVISION_NETWORK_NAME}" ]]; then
return
fi
# NOTE(vsaienko) move ironic VMs back to private network.
local net_id
net_id=$(openstack network show private -f value -c id)
create_ovs_taps $net_id
# NOTE(vsaienko) during early_create phase we update grenade resources neutron/subnet_id,
# neutron/router_id, neutron/net_id. It was needed to instruct nova to boot instances
# in ironic_grenade network instead of neutron_grenade during resources phase. As result
# during neutron/resources.sh destroy phase ironic_grenade router|subnet|network were deleted.
# Make sure that we removed neutron resources here.
neutron router-gateway-clear neutron_grenade || /bin/true
neutron router-interface-delete neutron_grenade neutron_grenade || /bin/true
neutron router-delete neutron_grenade || /bin/true
neutron net-delete neutron_grenade || /bin/true
}
# Dispatcher
case $1 in
"early_create")
wait_for_ironic_resources
wait_for_nova_resources "vcpus" $total_cpus
early_create
;;
"create")
create
;;
"verify_noapi")
verify_noapi
;;
"verify")
verify
;;
"destroy")
destroy
;;
esac