#!/bin/bash # os-create-network.sh, ABr, 20141016 # Create OpenStack networks with a single command # Call the script with the name of the tenant, and the name of the external network. # Example: ./os-create-network.sh demo ext-net 192.168.1.2 # # The above will create tenant-specific Neutron network objects as follows: # [TENANT_NAME]-net - The tenant-specific network object # [TENANT_NAME]-subnet - Will be created using 10.0.0.0/24 as the subnet # [TENANT_NAME]-router - The tenant-specific router object. # # Using the example, we'd have demo-net (Network Object), demo-subnet (Subnet Object), # and demo-router (Router Object) created. # # The script assumes that you already have your ext-net and the corresponding # external subnet created. # # Enjoy! function usage { echo "Usage: $0 [TENANT_NAME] [EXT_NET_NAME] [DNS]" return 0 } function do_exit { l_rc="$1" shift if [ $l_rc -ne 0 ]; then echo "Error: $*" usage fi rm -f $l_tmp exit $l_rc } # quick validation [[ "$1" == "" ]] && do_exit 1 "Missing tenant name" [[ "$2" == "" ]] && do_exit 1 "Missing external network name" [[ "$3" == "" ]] && do_exit 1 "Missing DNS entry" # ext-net name l_tenant_name="$1" l_extnet_name="$2" l_dns="$3" # work files l_tmp="/tmp/lmil-os-create-network.$$" echo "$(date +"%Y%d%m-%H%M"): Process tenant '$l_tenant_name'..." # names to use l_net_name="$l_tenant_name-net" l_subnet_name="$l_tenant_name-net" l_subnet_name="$l_tenant_name-subnet" l_router_name="$l_tenant_name-router" l_flag=1 # validate ext-net if [ $l_flag -eq 1 ]; then echo -n "$(date +"%Y%d%m-%H%M"): Validate EXT-NET '$l_extnet_name'..." l_extnet_id=$(neutron --os-tenant-name="$l_tenant_name" net-list | grep -e " $l_extnet_name " | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##' 2>&1) if [[ "$l_extnet_id" == "" ]]; then do_exit 2 "Invalid EXT-NET" else echo "OK ($l_extnet_id)" fi fi # validate we have a subnet for the ext-net (lame and slow) if [ $l_flag -eq 1 ]; then echo -n "$(date +"%Y%d%m-%H%M"): Validate subnet for EXT-NET '$l_extnet_name'..." l_extsubnet_id="" l_extsubnet_name="" l_all_subnet_ids=$(neutron --os-tenant-name="$l_tenant_name" subnet-list | tail -n +4 | head -n -1 | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') for i in $l_all_subnet_ids; do # read subnet details neutron --os-tenant-name="$l_tenant_name" subnet-show $i 2>/dev/null > $l_tmp l_rc=$? [ $l_rc -ne 0 ] && do_exit 3 "Invalid subnet_id '$i'" # get network ID and compare to EXT-NET l_extsubnet_network_id=$(cat $l_tmp | grep -e "^| network_id" | cut -d'|' -f 3 | sed -e 's#^ \+##; s#[ \t]*$##') l_extsubnet_name=$(cat $l_tmp | grep -e "^| name" | cut -d'|' -f 3 | sed -e 's#^ \+##; s#[ \t]*$##') if [ "$l_extsubnet_network_id" = "$l_extnet_id" ]; then l_extsubnet_id="$i" echo "OK ('$l_extsubnet_name', $l_extsubnet_id)" break fi l_extsubnet_network_id="" done [ "$l_extsubnet_id" = "" ] && do_exit 2 "Unable to locate subnet for '$l_extnet_name' ($l_extnet_id)" fi # create network if [ $l_flag -eq 1 ]; then l_net_id=$(neutron --os-tenant-name="$l_tenant_name" net-list | grep -e " $l_net_name " | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [[ "$l_net_id" == "" ]]; then echo -n "$(date +"%Y%d%m-%H%M"): Create network '$l_net_name'..." l_msg=$(neutron --os-tenant-name="$l_tenant_name" net-create "$l_net_name" 2>&1) l_rc=$? if [ $l_rc -ne 0 ]; then do_exit 2 "$l_msg"; fi l_net_id=$(neutron --os-tenant-name="$l_tenant_name" net-list | grep -e " $l_net_name " | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [ $l_rc -eq 0 ]; then echo "OK ($l_net_id)"; else do_exit 2 "Identify network: $l_msg"; fi else echo "$(date +"%Y%d%m-%H%M"): Use network '$l_net_name' ($l_net_id)" fi fi # create subnet if [ $l_flag -eq 1 ]; then l_subnet_id=$(neutron --os-tenant-name="$l_tenant_name" subnet-list | grep -e " $l_subnet_name " | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [[ "$l_subnet_id" == "" ]]; then echo -n "$(date +"%Y%d%m-%H%M"): Create subnet '$l_subnet_name'..." l_msg=$(neutron --os-tenant-name="$l_tenant_name" subnet-create "$l_net_name" --name "$l_subnet_name" --gateway 10.0.0.1 10.0.0.0/24 --dns_nameservers list=true $l_dns 2>&1) l_rc=$? [ $l_rc -ne 0 ] && do_exit 2 "$l_msg" l_subnet_id=$(neutron --os-tenant-name="$l_tenant_name" subnet-list | grep -e " $l_subnet_name " | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [ $l_rc -eq 0 ]; then echo "OK ($l_subnet_id)"; else do_exit 2 "Identify subnet: $l_msg"; fi else echo "$(date +"%Y%d%m-%H%M"): Use subnet '$l_subnet_name' ($l_subnet_id)" fi fi # create router if [ $l_flag -eq 1 ]; then l_router_id=$(neutron --os-tenant-name="$l_tenant_name" router-list | grep -e " $l_router_name " | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [[ "$l_router_id" == "" ]]; then echo -n "$(date +"%Y%d%m-%H%M"): Create router '$l_router_name'..." l_msg=$(neutron --os-tenant-name="$l_tenant_name" router-create "$l_router_name" 2>&1) l_rc=$? [ $l_rc -ne 0 ] && do_exit 2 "$l_msg" l_router_id=$(neutron --os-tenant-name="$l_tenant_name" router-list | grep -e " $l_router_name " | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [ $l_rc -eq 0 ]; then echo "OK ($l_router_id)"; else do_exit 2 "Identify router: $l_msg"; fi else echo "$(date +"%Y%d%m-%H%M"): Use router '$l_router_name' ($l_router_id)" fi fi # add subnet to router if [ $l_flag -eq 1 ]; then l_subnet_port_id=$(neutron --os-tenant-name="$l_tenant_name" router-port-list "$l_router_name" | grep -e "$l_subnet_id" | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [[ "$l_subnet_port_id" == "" ]]; then echo -n "$(date +"%Y%d%m-%H%M"): Add subnet to router'..." l_msg=$(neutron --os-tenant-name="$l_tenant_name" router-interface-add "$l_router_name" "$l_subnet_name" 2>&1) l_rc=$? [ $l_rc -ne 0 ] && do_exit 2 "$l_msg" l_subnet_port_id=$(neutron --os-tenant-name="$l_tenant_name" router-port-list "$l_router_name" | grep -e "$l_subnet_id" | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [ $l_rc -eq 0 ]; then echo "OK ($l_subnet_port_id)"; else do_exit 2 "Identify subnet interface: $l_msg"; fi else echo "$(date +"%Y%d%m-%H%M"): Use subnet interface '$l_subnet_port_id'" fi fi # add external gateway to router if [ $l_flag -eq 1 ]; then l_extsubnet_port_id=$(neutron --os-tenant-name="$l_tenant_name" router-port-list "$l_router_name" | grep -e "$l_extsubnet_id" | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [[ "$l_extsubnet_port_id" == "" ]]; then echo -n "$(date +"%Y%d%m-%H%M"): Set external gateway for router'..." l_msg=$(neutron --os-tenant-name="$l_tenant_name" router-gateway-set "$l_router_name" "$l_extnet_name" 2>&1) l_rc=$? [ $l_rc -ne 0 ] && do_exit 2 "$l_msg" l_extsubnet_port_id=$(neutron --os-tenant-name="$l_tenant_name" router-port-list "$l_router_name" | grep -e "$l_extsubnet_id" | cut -d'|' -f 2 | sed -e 's#^ \+##; s#[ \t]*$##') if [ $l_rc -eq 0 ]; then echo "OK ($l_extsubnet_port_id)"; else do_exit 2 "Identify external subnet interface: $l_msg"; fi else echo "$(date +"%Y%d%m-%H%M"): Use external subnet interface '$l_extsubnet_port_id'" fi fi # get the IP address echo -n "$(date +"%Y%d%m-%H%M"): Get external IP..." l_ext_ip=$(neutron port-show $l_extsubnet_port_id | grep -e ip_address | sed -e 's#.*ip_address": "\([^"]\+\).*#\1#') l_rc=$? [ $l_rc -ne 0 ] && do_exit 3 "Error getting IP" echo "OK ($l_ext_ip)" # finally, verify a ping echo -n "$(date +"%Y%d%m-%H%M"): Verify ping..." l_msg=$(ping -c 1 $l_ext_ip 2>&1) [ $l_rc -ne 0 ] && do_exit 3 "$l_msg" echo "OK" do_exit 0