From 662485e2d276c65e7713b3f3b40b9e475f1a1ab0 Mon Sep 17 00:00:00 2001 From: Nir Magnezi Date: Wed, 13 Sep 2017 15:54:28 +0300 Subject: [PATCH] Update devstack plugin and examples The devstack plugin should only use the openstackclient to interact with OpenStack services via CLI. This patch fixes both the devstack plugin and the examples. Task: 5678 Task: 5680 Task: 5698 Story: 2001183 Change-Id: Id30ab0484edb350f0a424a0fc90c381357614b8e --- devstack/contrib/new-octavia-devstack.sh | 7 +--- devstack/plugin.sh | 24 ++++++------ devstack/samples/multinode/local-2.conf | 6 +-- devstack/samples/multinode/local.conf | 19 +++------- devstack/samples/singlenode/local.conf | 19 +++------- devstack/samples/singlenode/local.sh | 48 ++++++++++++++---------- 6 files changed, 52 insertions(+), 71 deletions(-) diff --git a/devstack/contrib/new-octavia-devstack.sh b/devstack/contrib/new-octavia-devstack.sh index 888172cdab..7b67fbfaa4 100755 --- a/devstack/contrib/new-octavia-devstack.sh +++ b/devstack/contrib/new-octavia-devstack.sh @@ -16,9 +16,8 @@ git clone https://github.com/openstack-dev/devstack.git $HOME/devstack cat < $HOME/devstack/localrc enable_plugin barbican https://review.openstack.org/openstack/barbican -enable_plugin neutron-lbaas https://review.openstack.org/openstack/neutron-lbaas enable_plugin octavia https://review.openstack.org/openstack/octavia -LIBS_FROM_GIT+=python-neutronclient +LIBS_FROM_GIT+=python-octaviaclient KEYSTONE_TOKEN_FORMAT=UUID @@ -41,10 +40,6 @@ ENABLED_SERVICES+=,placement-api,placement-client ENABLED_SERVICES+=,g-api,g-reg # Neutron ENABLED_SERVICES+=,q-svc,q-agt,q-dhcp,q-l3,q-meta,neutron -# Enable LBaaS V2 -ENABLED_SERVICES+=,q-lbaasv2 -# Cinder (optional) -#ENABLED_SERVICES+=,cinder,c-api,c-vol,c-sch # Tempest (optional) #ENABLED_SERVICES+=,tempest # Octavia diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 74a8851458..c7db1d6ad4 100644 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -61,7 +61,7 @@ function build_octavia_worker_image { else export DIB_REPOREF_amphora_agent=$(git -c "$OCTAVIA_DIR" log -1 --pretty="format:%H") fi - TOKEN=$(openstack token issue | grep ' id ' | get_field 2) + TOKEN=$(openstack token issue -f value -c id) die_if_not_set $LINENO TOKEN "Keystone failed to get token." octavia_dib_tracing_arg= @@ -234,6 +234,7 @@ function octavia_configure { iniset $OCTAVIA_CONF oslo_messaging rpc_thread_pool_size 2 iniset $OCTAVIA_CONF oslo_messaging topic octavia_prov + # TODO(nmagnezi): Remove this when neutron-lbaas gets deprecated # Setting neutron request_poll_timeout iniset $NEUTRON_CONF octavia request_poll_timeout 3000 if [[ "$WSGI_MODE" == "uwsgi" ]]; then @@ -314,16 +315,13 @@ function octavia_configure { function create_mgmt_network_interface { if [ $OCTAVIA_MGMT_PORT_IP != 'auto' ]; then - SUBNET_ID=$(neutron subnet-show lb-mgmt-subnet | awk '/ id / {print $4}') - PORT_FIXED_IP="--fixed-ip subnet_id=$SUBNET_ID,ip_address=$OCTAVIA_MGMT_PORT_IP" + SUBNET_ID=$(openstack subnet show lb-mgmt-subnet -f value -c id) + PORT_FIXED_IP="--fixed-ip subnet=$SUBNET_ID,ip-address=$OCTAVIA_MGMT_PORT_IP" fi - # TODO(johnsom) Change this to OSC when security group is working - id_and_mac=$(neutron port-create --name octavia-health-manager-$OCTAVIA_NODE-listen-port --security-group lb-health-mgr-sec-grp --device-owner Octavia:health-mgr --binding:host_id=$(hostname) lb-mgmt-net $PORT_FIXED_IP | awk '/ id | mac_address / {print $4}') + MGMT_PORT_ID=$(openstack port create --security-group lb-health-mgr-sec-grp --device-owner Octavia:health-mgr --host=$(hostname) -c id -f value --network lb-mgmt-net $PORT_FIXED_IP octavia-health-manager-$OCTAVIA_NODE-listen-port) + MGMT_PORT_MAC=$(openstack port show -c mac_address -f value $MGMT_PORT_ID) - id_and_mac=($id_and_mac) - MGMT_PORT_ID=${id_and_mac[0]} - MGMT_PORT_MAC=${id_and_mac[1]} # TODO(johnsom) This gets the IPv4 address, should be updated for IPv6 MGMT_PORT_IP=$(openstack port show -f value -c fixed_ips $MGMT_PORT_ID | awk '{FS=",| "; gsub(",",""); gsub("'\''",""); for(i = 1; i <= NF; ++i) {if ($i ~ /^ip_address/) {n=index($i, "="); if (substr($i, n+1) ~ "\\.") print substr($i, n+1)}}}') if function_exists octavia_create_network_interface_device ; then @@ -358,8 +356,8 @@ function create_mgmt_network_interface { function build_mgmt_network { # Create network and attach a subnet - OCTAVIA_AMP_NETWORK_ID=$(openstack network create lb-mgmt-net | awk '/ id / {print $4}') - OCTAVIA_AMP_SUBNET_ID=$(openstack subnet create --subnet-range $OCTAVIA_MGMT_SUBNET --allocation-pool start=$OCTAVIA_MGMT_SUBNET_START,end=$OCTAVIA_MGMT_SUBNET_END --network lb-mgmt-net lb-mgmt-subnet | awk '/ id / {print $4}') + OCTAVIA_AMP_NETWORK_ID=$(openstack network create lb-mgmt-net -f value -c id) + OCTAVIA_AMP_SUBNET_ID=$(openstack subnet create --subnet-range $OCTAVIA_MGMT_SUBNET --allocation-pool start=$OCTAVIA_MGMT_SUBNET_START,end=$OCTAVIA_MGMT_SUBNET_END --network lb-mgmt-net lb-mgmt-subnet -f value -c id) # Create security group and rules openstack security group create lb-mgmt-sec-grp @@ -377,7 +375,7 @@ function build_mgmt_network { } function configure_lb_mgmt_sec_grp { - OCTAVIA_MGMT_SEC_GRP_ID=$(openstack security group list | awk ' / lb-mgmt-sec-grp / {print $2}') + OCTAVIA_MGMT_SEC_GRP_ID=$(openstack security group show lb-mgmt-sec-grp -f value -c id) iniset ${OCTAVIA_CONF} controller_worker amp_secgroup_list ${OCTAVIA_MGMT_SEC_GRP_ID} } @@ -394,7 +392,7 @@ function configure_octavia_tempest { function create_amphora_flavor { # Pass even if it exists to avoid race condition on multinode openstack flavor create --id auto --ram 1024 --disk 2 --vcpus 1 --private m1.amphora -f value -c id || true - amp_flavor_id=$(openstack flavor list --all -c ID -c Name | awk ' / m1.amphora / {print $2}') + amp_flavor_id=$(openstack flavor show m1.amphora -f value -c id) iniset $OCTAVIA_CONF controller_worker amp_flavor_id $amp_flavor_id } @@ -477,7 +475,7 @@ function octavia_start { iniset $OCTAVIA_CONF controller_worker amp_image_tag ${OCTAVIA_AMP_IMAGE_TAG} - OCTAVIA_AMP_NETWORK_ID=$(openstack network list | awk '/ lb-mgmt-net / {print $2}') + OCTAVIA_AMP_NETWORK_ID=$(openstack network show lb-mgmt-net -f value -c id) iniset $OCTAVIA_CONF controller_worker amp_boot_network_list ${OCTAVIA_AMP_NETWORK_ID} diff --git a/devstack/samples/multinode/local-2.conf b/devstack/samples/multinode/local-2.conf index 49cc3376d1..64a2652ba2 100644 --- a/devstack/samples/multinode/local-2.conf +++ b/devstack/samples/multinode/local-2.conf @@ -9,7 +9,7 @@ RECLONE=True enable_plugin octavia https://git.openstack.org/openstack/octavia -LIBS_FROM_GIT+=python-neutronclient +LIBS_FROM_GIT+=python-octaviaclient DATABASE_PASSWORD=password ADMIN_PASSWORD=password SERVICE_PASSWORD=password @@ -20,8 +20,6 @@ LOGFILE=$DEST/logs/stack.sh.log VERBOSE=True LOG_COLOR=True -ENABLED_SERVICES= - # Nova enable_service n-cpu @@ -53,8 +51,6 @@ DATABASE_TYPE=mysql Q_PLUGIN=ml2 Q_ML2_TENANT_NETWORK_TYPE=vxlan -IMAGE_URLS+=",http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img" - LOGFILE=$DEST/logs/stack.sh.log # Old log files are automatically removed after 7 days to keep things neat. Change diff --git a/devstack/samples/multinode/local.conf b/devstack/samples/multinode/local.conf index fee7e801fb..67ee15cea2 100644 --- a/devstack/samples/multinode/local.conf +++ b/devstack/samples/multinode/local.conf @@ -5,14 +5,13 @@ RECLONE=True -# Load the external LBaaS plugin. +# Load the external Octavia plugin. -enable_plugin neutron-lbaas https://git.openstack.org/openstack/neutron-lbaas -enable_plugin neutron-lbaas-dashboard https://git.openstack.org/openstack/neutron-lbaas-dashboard +enable_plugin octavia-dashboard https://git.openstack.org/openstack/octavia-dashboard enable_plugin octavia https://git.openstack.org/openstack/octavia enable_plugin barbican https://git.openstack.org/openstack/barbican -LIBS_FROM_GIT+=python-neutronclient +LIBS_FROM_GIT+=python-octaviaclient DATABASE_PASSWORD=password ADMIN_PASSWORD=password SERVICE_PASSWORD=password @@ -46,20 +45,14 @@ enable_service g-api enable_service g-reg # Neutron +enable_service neutron enable_service q-svc enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-meta -# Cinder -enable_service c-api -enable_service c-vol -enable_service c-sch - - -# LBaaS V2 and Octavia -enable_service q-lbaasv2 +# Octavia enable_service octavia enable_service o-cw enable_service o-hm @@ -76,8 +69,6 @@ OCTAVIA_NODES=main:192.168.42.10,second:192.168.42.11 Q_PLUGIN=ml2 Q_ML2_TENANT_NETWORK_TYPE=vxlan -IMAGE_URLS+=",http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img" - LOGFILE=$DEST/logs/stack.sh.log # Old log files are automatically removed after 7 days to keep things neat. Change diff --git a/devstack/samples/singlenode/local.conf b/devstack/samples/singlenode/local.conf index 628e01cf7c..d31288396b 100644 --- a/devstack/samples/singlenode/local.conf +++ b/devstack/samples/singlenode/local.conf @@ -18,14 +18,13 @@ RECLONE=True -# Load the external LBaaS plugin. +# Load the external Octavia plugin. -enable_plugin neutron-lbaas https://git.openstack.org/openstack/neutron-lbaas -enable_plugin neutron-lbaas-dashboard https://git.openstack.org/openstack/neutron-lbaas-dashboard +enable_plugin octavia-dashboard https://git.openstack.org/openstack/octavia-dashboard enable_plugin octavia https://git.openstack.org/openstack/octavia enable_plugin barbican https://git.openstack.org/openstack/barbican -LIBS_FROM_GIT+=python-neutronclient +LIBS_FROM_GIT+=python-octaviaclient DATABASE_PASSWORD=password ADMIN_PASSWORD=password SERVICE_PASSWORD=password @@ -59,20 +58,14 @@ enable_service g-api enable_service g-reg # Neutron +enable_service neutron enable_service q-svc enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-meta -# Cinder -enable_service c-api -enable_service c-vol -enable_service c-sch - - -# LBaaS V2 and Octavia -enable_service q-lbaasv2 +# Octavia enable_service octavia enable_service o-cw enable_service o-hm @@ -86,8 +79,6 @@ Q_PLUGIN=ml2 Q_ML2_TENANT_NETWORK_TYPE=vxlan Q_DVR_MODE=dvr_snat -IMAGE_URLS+=",http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img" - LOGFILE=$DEST/logs/stack.sh.log # Old log files are automatically removed after 7 days to keep things neat. Change diff --git a/devstack/samples/singlenode/local.sh b/devstack/samples/singlenode/local.sh index a93f809cf6..f01c3db028 100755 --- a/devstack/samples/singlenode/local.sh +++ b/devstack/samples/singlenode/local.sh @@ -20,7 +20,7 @@ DEST=${DEST:-/opt/stack} # Polling functions function wait_for_loadbalancer_active() { lb_name=$1 - while [ $(neutron lbaas-loadbalancer-list | grep $lb_name | grep ACTIVE | wc --lines) == 0 ]; do + while [ $(openstack loadbalancer show $lb_name -f value -c provisioning_status) != "ACTIVE" ]; do sleep 2 done } @@ -33,12 +33,12 @@ if is_service_enabled nova; then source ${TOP_DIR}/openrc demo demo # Create an SSH key to use for the instances - DEVSTACK_LBAAS_SSH_KEY_NAME=$(hostname)_DEVSTACK_LBAAS_SSH_KEY_RSA + DEVSTACK_LBAAS_SSH_KEY_NAME=DEVSTACK_LBAAS_SSH_KEY_RSA DEVSTACK_LBAAS_SSH_KEY_DIR=${TOP_DIR} DEVSTACK_LBAAS_SSH_KEY=${DEVSTACK_LBAAS_SSH_KEY_DIR}/${DEVSTACK_LBAAS_SSH_KEY_NAME} rm -f ${DEVSTACK_LBAAS_SSH_KEY}.pub ${DEVSTACK_LBAAS_SSH_KEY} ssh-keygen -b 2048 -t rsa -f ${DEVSTACK_LBAAS_SSH_KEY} -N "" - nova keypair-add --pub-key=${DEVSTACK_LBAAS_SSH_KEY}.pub ${DEVSTACK_LBAAS_SSH_KEY_NAME} + openstack keypair create --public-key=${DEVSTACK_LBAAS_SSH_KEY}.pub ${DEVSTACK_LBAAS_SSH_KEY_NAME} # Add tcp/22,80 and icmp to default security group openstack security group rule create --protocol tcp --dst-port 22:22 default @@ -46,46 +46,56 @@ if is_service_enabled nova; then openstack security group rule create --protocol icmp default # Boot some instances - NOVA_BOOT_ARGS="--key-name ${DEVSTACK_LBAAS_SSH_KEY_NAME} --image $(openstack image list | awk '/ cirros-0.3.4-x86_64-disk / {print $2}') --flavor 1 --nic net-id=$(neutron net-list | awk '/ private / {print $2}')" + NOVA_BOOT_ARGS="--key-name ${DEVSTACK_LBAAS_SSH_KEY_NAME} --image $(openstack image show cirros-0.3.5-x86_64-disk -f value -c id) --flavor 1 --nic net-id=$(openstack network show private -f value -c id)" - nova boot ${NOVA_BOOT_ARGS} node1 - nova boot ${NOVA_BOOT_ARGS} node2 + openstack server create ${NOVA_BOOT_ARGS} node1 + openstack server create ${NOVA_BOOT_ARGS} node2 echo "Waiting ${BOOT_DELAY} seconds for instances to boot" sleep ${BOOT_DELAY} - IP1=$(nova show node1 | grep "private network" | awk '/private network/ {ip = substr($5, 0, length($5)-1); if (ip ~ "\\.") print ip; else print $6}') - IP2=$(nova show node2 | grep "private network" | awk '/private network/ {ip = substr($5, 0, length($5)-1); if (ip ~ "\\.") print ip; else print $6}') + IP1=$(openstack server show node1 | awk '/private/ {ip = substr($4, 9, length($4)-9) ; if (ip ~ "\\.") print ip ; else print $5}') + IP2=$(openstack server show node2 | awk '/private/ {ip = substr($4, 9, length($4)-9) ; if (ip ~ "\\.") print ip ; else print $5}') touch ~/.ssh/known_hosts ssh-keygen -R ${IP1} ssh-keygen -R ${IP2} + + # Get Neutron router namespace details + NAMESPACE_NAME='qrouter-'$(openstack router show router1 -f value -c id) + NAMESPACE_CMD_PREFIX='sudo ip netns exec' + # Run a simple web server on the instances chmod 0755 ${TOP_DIR}/webserver.sh - scp -i ${DEVSTACK_LBAAS_SSH_KEY} -o StrictHostKeyChecking=no ${TOP_DIR}/webserver.sh cirros@${IP1}:webserver.sh - scp -i ${DEVSTACK_LBAAS_SSH_KEY} -o StrictHostKeyChecking=no ${TOP_DIR}/webserver.sh cirros@${IP2}:webserver.sh - - screen_process node1 "ssh -i ${DEVSTACK_LBAAS_SSH_KEY} -o StrictHostKeyChecking=no cirros@${IP1} ./webserver.sh" - screen_process node2 "ssh -i ${DEVSTACK_LBAAS_SSH_KEY} -o StrictHostKeyChecking=no cirros@${IP2} ./webserver.sh" + $NAMESPACE_CMD_PREFIX $NAMESPACE_NAME scp -i ${DEVSTACK_LBAAS_SSH_KEY} -o StrictHostKeyChecking=no ${TOP_DIR}/webserver.sh cirros@${IP1}:webserver.sh + $NAMESPACE_CMD_PREFIX $NAMESPACE_NAME scp -i ${DEVSTACK_LBAAS_SSH_KEY} -o StrictHostKeyChecking=no ${TOP_DIR}/webserver.sh cirros@${IP2}:webserver.sh + $NAMESPACE_CMD_PREFIX $NAMESPACE_NAME ssh -o UserKnownHostsFile=/dev/null -i ${DEVSTACK_LBAAS_SSH_KEY} -o StrictHostKeyChecking=no -q cirros@${IP1} "screen -d -m sh webserver.sh" + $NAMESPACE_CMD_PREFIX $NAMESPACE_NAME ssh -o UserKnownHostsFile=/dev/null -i ${DEVSTACK_LBAAS_SSH_KEY} -o StrictHostKeyChecking=no -q cirros@${IP2} "screen -d -m sh webserver.sh" fi -if is_service_enabled q-lbaasv2; then +if is_service_enabled octavia; then - neutron lbaas-loadbalancer-create --name lb1 private-subnet + SUBNET_ID=$(openstack subnet show private-subnet -f value -c id) + openstack loadbalancer create --name lb1 --vip-subnet-id $SUBNET_ID wait_for_loadbalancer_active lb1 - neutron lbaas-listener-create --loadbalancer lb1 --protocol HTTP --protocol-port 80 --name listener1 + openstack loadbalancer listener create lb1 --protocol HTTP --protocol-port 80 --name listener1 wait_for_loadbalancer_active lb1 - neutron lbaas-pool-create --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP --name pool1 + openstack loadbalancer pool create --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP --name pool1 wait_for_loadbalancer_active lb1 - neutron lbaas-member-create --subnet private-subnet --address ${IP1} --protocol-port 80 pool1 + openstack loadbalancer member create --subnet-id $SUBNET_ID --address ${IP1} --protocol-port 80 pool1 wait_for_loadbalancer_active lb1 - neutron lbaas-member-create --subnet private-subnet --address ${IP2} --protocol-port 80 pool1 + openstack loadbalancer member create --subnet-id $SUBNET_ID --address ${IP2} --protocol-port 80 pool1 fi + +echo "How to test load balancing:" +echo "" +echo "${NAMESPACE_CMD_PREFIX} ${NAMESPACE_NAME} curl $(openstack loadbalancer show lb1 -f value -c vip_address)" +echo ""