Add cleanup back
Related-PROD: PROD-34629
Change-Id: I8e9ab3c92aac77061d9e9bd718ad9ad9c7a73e4a
diff --git a/cleanup.sh b/cleanup.sh
new file mode 100644
index 0000000..0e9b0ac
--- /dev/null
+++ b/cleanup.sh
@@ -0,0 +1,334 @@
+#!/bin/bash
+export OS_INTERFACE='admin'
+mask='s_rally\|rally_\|tempest_\|tempest-\|spt-'
+exclude='manual\|-static-'
+stack_alt=false
+stack_regex='api-[0-9]+-[a-z]+'
+dry_run=false
+clean_projects=false
+make_servers_active=false
+serial=false
+batch_size=10
+# granularity values: days,hours,minutes,seconds
+stack_granularity=days
+stack_granularity_value=1
+
+function show_help {
+ printf "Resource cleaning script\nMask is: %s\n\t-h, -?\tShow this help\n" ${mask}
+ printf "\t-t\tDry run mode, no cleaning done\n"
+ printf "\t-P\tForce cleaning of projects\n"
+ printf "\t-s\tUse single thread of 'openstack' client for cleanup\n"
+ printf "\t-S\tSet servers to ACTIVE before deletion (bare metal reqiured)\n"
+ printf "\t-f\tForce stack cleanup with an additional mask of '%s'\n" ${stack_regex}
+ printf "\t-F\tForce purge deleted stacks. Batch size: %s, >%s %s\n" ${batch_size} ${stack_granularity_value} ${stack_granularity}
+}
+
+OPTIND=1 # Reset in case getopts has been used previously in the shell.
+while getopts "h?:tsSPfF" opt; do
+ case "$opt" in
+ h|\?)
+ show_help
+ exit 0
+ ;;
+ t) dry_run=true
+ printf "Running in dry-run mode\n"
+ ;;
+ s) serial=true
+ printf "Single threaded mode enabled\n"
+ ;;
+ S) make_servers_active=true
+ printf "Servers will be set to ACTIVE before deletion\n"
+ ;;
+ P) clean_projects=true
+ printf "Project cleanning enabled\n"
+ ;;
+ f) stack_alt=true
+ printf "Cleaning stacks using additional mask '%s'\n" ${stack_regex}
+ ;;
+ F) purge_deleted_stacks=true
+ printf "Purging stacks deleted >$stack_granularity_value $stack_granularity ago enabled, batch size %s\n" $stack_batch_size
+ ;;
+ esac
+done
+
+shift $((OPTIND-1))
+[ "${1:-}" = "--" ] && shift
+
+### Execute collected commands and flush the temp file
+function _clean_and_flush {
+ if [ "$dry_run" = true ] ; then
+ return 0
+ fi
+ if [ -s ${cmds} ]; then
+ if [ "${serial}" = false ] ; then
+ echo "... processing $(cat ${cmds} | wc -l) commands, worker threads ${batch_size}"
+ cat ${cmds} | tr '\n' '\0' | xargs -P ${batch_size} -n 1 -0 echo | openstack
+ #cat ${cmds} | openstack
+ truncate -s 0 ${cmds}
+ else
+ echo "... processing $(cat ${cmds} | wc -l) commands"
+ cat ${cmds} | tr '\n' '\0' | xargs -P 1 -n 1 -0 echo | openstack
+ truncate -s 0 ${cmds}
+ fi
+ fi
+}
+
+function _clean_and_flush_cinder {
+ if [ "$dry_run" = true ] ; then
+ return 0
+ fi
+ if [ -s ${cmds} ]; then
+ if [ "${serial}" = false ] ; then
+ echo "... processing $(cat ${cmds} | wc -l) commands, worker threads ${batch_size}"
+ cat ${cmds} | tr '\n' '\0' | xargs -I{} -P ${batch_size} -n 1 -0 /bin/bash -c 'cinder --os-volume-api-version 3.43 {}'
+ #cat ${cmds} | cinder --os-volume-api-version 3.43
+ truncate -s 0 ${cmds}
+ else
+ echo "... processing $(cat ${cmds} | wc -l) commands"
+ cat ${cmds} | tr '\n' '\0' | xargs -I{} -P 1 -n 1 -0 /bin/bash -c 'cinder --os-volume-api-version 3.43 {}'
+ truncate -s 0 ${cmds}
+ fi
+ fi
+}
+
+### Users
+function _clean_users {
+ users=( $(openstack user list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#users[@]} users containing '${mask}' found"
+ printf "%s\n" ${users[@]} | xargs -I{} echo user delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Roles
+function _clean_roles {
+ roles=( $(openstack role list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#roles[@]} roles containing '${mask}' found"
+ printf "%s\n" ${roles[@]} | xargs -I{} echo role delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Projects
+function _clean_projects {
+ projects=( $(openstack project list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#projects[@]} projects containing '${mask}' found"
+ printf "%s\n" ${projects[@]} | xargs -I{} echo project delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Servers
+function _clean_servers {
+ servers=( $(openstack server list -c ID -c Name -f value --all | grep "${mask}" | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#servers[@]} servers containing '${mask}' found"
+ if [ "$make_servers_active" = true ]; then
+ printf "%s\n" ${servers[@]} | xargs -I{} echo server set --state active {} >>${cmds}
+ fi
+ printf "%s\n" ${servers[@]} | xargs -I{} echo server delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Reset snapshot state and delete
+function _clean_snapshots {
+ snapshots=( $(openstack volume snapshot list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#snapshots[@]} snapshots containing '${mask}' found"
+ printf "%s\n" ${snapshots[@]} | xargs -I{} echo volume snapshot set --state available {} >>${cmds}
+ printf "%s\n" ${snapshots[@]} | xargs -I{} echo volume snapshot delete {} >>${cmds}
+ _clean_and_flush
+}
+
+function _clean_volumes {
+ volumes=( $(openstack volume list --all -c ID -c Name -c Type -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#volumes[@]} volumes containing '${mask}' found"
+ printf "%s\n" ${volumes[@]} | xargs -I{} echo volume set --state available {} >>${cmds}
+ printf "%s\n" ${volumes[@]} | xargs -I{} echo volume delete {} >>${cmds}
+ _clean_and_flush
+}
+
+function _clean_volume_groups {
+ groups=( $(cinder --os-volume-api-version 3.43 group-list --all-tenants 1 | grep ${mask} | grep -v ${exclude} | awk '{print $2}') )
+ echo "-> ${#groups[@]} groups containing '${mask}' found"
+ printf "%s\n" ${groups[@]} | xargs -I{} echo group-delete {} >>${cmds}
+ _clean_and_flush_cinder
+}
+
+function _clean_volume_group_types {
+ group_types=( $(cinder --os-volume-api-version 3.43 group-type-list | grep ${mask} | grep -v ${exclude} | awk '{print $2}') )
+ echo "-> ${#group_types[@]} group types containing '${mask}' found"
+ printf "%s\n" ${group_types[@]} | xargs -I{} echo group-type-delete {} >>${cmds}
+ _clean_and_flush_cinder
+}
+
+### Volume types
+function _clean_volume_types {
+ vtypes=( $(openstack volume type list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#vtypes[@]} volume types containing '${mask}' found"
+ printf "%s\n" ${vtypes[@]} | xargs -I{} echo volume type delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Images
+function _clean_images {
+ images=( $(openstack image list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#images[@]} images containing '${mask}' found"
+ printf "%s\n" ${images[@]} | xargs -I{} echo image delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Sec groups
+function _clean_sec_groups {
+ projects=( $(openstack project list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ sgroups=( $(printf "%s\n" ${projects[@]} | xargs -I{} /bin/bash -c "openstack security group list -c ID -c Project -f value | grep {} | cut -d' ' -f1") )
+ echo "-> ${#sgroups[@]} security groups for project containing '${mask}' found"
+ printf "%s\n" ${sgroups[@]} | xargs -I{} echo security group delete {} >>${cmds}
+ _clean_and_flush
+
+ # Additional step to cleanup 'hanged' groups
+ sgroups_raw=( $(openstack security group list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#sgroups_raw[@]} security groups for '${mask}' found"
+ printf "%s\n" ${sgroups_raw[@]} | xargs -I{} echo security group delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Keypairs
+function _clean_keypairs {
+ keypairs=( $(openstack keypair list -c Name -f value | grep ${mask} | grep -v ${exclude}) )
+ echo "-> ${#keypairs[@]} keypairs containing '${mask}' found"
+ printf "%s\n" ${keypairs[@]} | xargs -I{} echo keypair delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Routers and Networks
+function _clean_routers_and_networks {
+ routers=( $(openstack router list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d ' ' -f1) )
+ if [ ${#routers[@]} -eq 0 ]; then
+ echo "-> No routers containing '${mask}' found"
+ else
+ echo "-> ${#routers[@]} routers containing '${mask}' found"
+ echo "... unsetting gateways"
+ printf "%s\n" ${routers[@]} | xargs -I{} echo router unset --external-gateway {} >>${cmds}
+ _clean_and_flush
+
+ echo "... removing ports"
+ for router in ${routers[@]}; do
+ r_ports=( $(openstack port list --router ${router} -f value -c ID) )
+ if [ ${#r_ports[@]} -eq 0 ]; then
+ echo "... no ports to unplug for ${router}"
+ else
+ for r_port in ${r_ports[@]}; do
+ echo "... queued removal of port '${r_port}' from router '${router}'"
+ echo "router remove port ${router} ${r_port}" >>${cmds}
+ done
+ fi
+ done
+ _clean_and_flush
+
+ echo "... deleting routers"
+ printf "%s\n" ${routers[@]} | xargs -I{} echo router delete {} >>${cmds}
+ _clean_and_flush
+ fi
+
+ networks=( $(openstack network list | grep "${mask}" | grep -v ${exclude} | cut -d' ' -f2) )
+ if [ ${#networks[@]} -eq 0 ]; then
+ echo "-> No networks containing '${mask}' found"
+ else
+ ports=()
+ subnets=()
+ for((idx=0;idx<${#networks[@]};idx++)) do
+ ports+=( $(openstack port list --network ${networks[idx]} -c ID -f value) )
+ subnets+=( $(openstack subnet list --network ${networks[idx]} -c ID -f value) )
+ echo "-> $((${idx}+1)) of ${#networks[@]}, total ${#ports[@]} ports, ${#subnets[@]} subnets"
+ done
+ printf "%s\n" ${ports[@]} | xargs -I{} echo port delete {} >>${cmds}
+ printf "%s\n" ${subnets[@]} | xargs -I{} echo subnet delete {} >>${cmds}
+ echo network delete ${networks[@]} >>${cmds}
+ echo "-> ${#routers[@]} routers, ${#ports[@]} ports, ${#subnets[@]} subnets, ${#networks[@]} networks"
+ fi
+ _clean_and_flush
+}
+
+### Regions
+function _clean_regions {
+ regions=( $(openstack region list -c Region -f value | grep ${mask} | grep -v ${exclude}) )
+ echo "-> ${#regions[@]} regions containing '${mask}' found"
+ printf "%s\n" ${regions[@]} | xargs -I{} echo region delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Stacks
+function _clean_stacks {
+ # By default openstack denies use of global_index for everyone.
+ # In case you want to have handy cleanup, consider updating policy.json here:
+ # root@ctl0x:~# cat -n /etc/heat/policy.json | grep global_index
+ # 48 "stacks:global_index": "rule:deny_everybody",
+ # 73 "software_configs:global_index": "rule:deny_everybody",
+ # After this you will be able to use --all option
+
+ stacks=( $(openstack stack list --nested --hidden -c ID -c "Stack Name" -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#stacks[@]} stacks containing '${mask}' found"
+ printf "%s\n" ${stacks[@]} | xargs -I{} echo stack check {} >>${cmds}
+ printf "%s\n" ${stacks[@]} | xargs -I{} echo stack delete -y {} >>${cmds}
+ _clean_and_flush
+
+ if [ "$stack_alt" = true ]; then
+ stacks=( $(openstack stack list --nested --hidden -c ID -c "Stack Name" -f value | grep -E ${stack_regex} | cut -d' ' -f1) )
+ echo "-> ${#stacks[@]} stacks containing '${stack_regex}' found"
+ printf "%s\n" ${stacks[@]} | xargs -I{} echo stack check {} >>${cmds}
+ printf "%s\n" ${stacks[@]} | xargs -I{} echo stack delete -y {} >>${cmds}
+ _clean_and_flush
+ fi
+
+ if [ "$purge_deleted_stacks" = true ]; then
+ heat-manage purge_deleted -g ${stack_granularity} -b ${batch_size} ${stack_granularity_value} | wc -l | xargs -I{} echo "-> Purged {} stacks"
+ fi
+}
+
+### Containers
+function _clean_containers {
+ containers=( $(openstack container list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#containers[@]} containers containing '${mask}' found"
+ printf "%s\n" ${containers[@]} | xargs -I{} echo container delete {} >>${cmds}
+ _clean_and_flush
+}
+
+function _clean_flavors {
+ flavors=( $(openstack flavor list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#flavors[@]} flavors containing '${mask}' found"
+ printf "%s\n" ${flavors[@]} | xargs -I{} echo flavor delete {} >>${cmds}
+ _clean_and_flush
+}
+
+###################
+### Main
+###################
+# temp file for commands
+cmds=$(mktemp)
+trap "rm -f ${cmds}" EXIT
+echo "Using tempfile: '${cmds}'"
+
+# Consider cleaning contrail resources carefully
+# ...and only after that - clean projects
+
+_clean_stacks
+_clean_servers
+_clean_flavors
+_clean_users
+_clean_roles
+_clean_snapshots
+_clean_volumes
+_clean_volume_groups
+_clean_volume_group_types
+_clean_volume_types
+_clean_images
+_clean_sec_groups
+_clean_keypairs
+_clean_routers_and_networks
+_clean_regions
+_clean_containers
+
+# project cleaning disabled by default
+# Coz cleaning Contrail with no projects is a hard task
+if [ "$clean_projects" = true ]; then
+ _clean_projects
+fi
+
+# remove temp file
+rm ${cmds}
diff --git a/scripts/prepare.sh b/scripts/prepare.sh
new file mode 100644
index 0000000..10f005a
--- /dev/null
+++ b/scripts/prepare.sh
@@ -0,0 +1,397 @@
+#!/bin/bash
+export OS_INTERFACE='admin'
+
+# local vars
+name_prefix=cvp
+filename=${name_prefix}.manifest
+rcfile=${name_prefix}rc
+huge_pages=false
+logfile=prepare.log
+
+# Project, User, Roles
+project=${name_prefix}.project
+user=${name_prefix}.user
+admin=${name_prefix}.admin
+password=mcp1234
+
+# Security group
+sg_all=${name_prefix}.sg.all
+sg_icmp=${name_prefix}.sg.icmp
+sg_ssh=${name_prefix}.sg.ssh
+sg_iperf=${name_prefix}.sg.perf
+
+# Testkey
+key=${name_prefix}_testkey
+
+# Flavors: tiny, small (cirrus and migration), medium (ubuntu and volume/stress activities)
+flavor_t=${name_prefix}.tiny
+flavor_s=${name_prefix}.small
+flavor_m=${name_prefix}.medium
+flavor_h=${name_prefix}.high
+
+# Fixed Networks (2, for testing router interconnection)
+net_left=${name_prefix}.net.1
+net_right=${name_prefix}.net.2
+subnet1=${name_prefix}.subnet.1
+subnet2=${name_prefix}.subnet.2
+
+# Router
+router=${name_prefix}.router
+
+# Images: cirros (3.5, 4.0), ubuntu (16.04)
+cirros3=${name_prefix}.cirros.35
+cirros4=${name_prefix}.cirros.40
+ubuntu16=${name_prefix}.ubuntu.1604
+ubuntuspt=${name_prefix}.ubuntu.spt
+
+cirros3_link=http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img
+cirros4_link=http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-aarch64-disk.img
+ubuntu16_link=https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img
+
+# Volume (2GB)
+volume=${name_prefix}.volume
+
+function show_help {
+ printf "CVP Pipeline: Resource creation script\n\t-h, -?\t\tShow this help\n"
+ printf "\t-H\t\tAdds '--property hw:mem_page_size=large' to flavors, i.e. huge_pages for DPDK\n"
+ printf "\t-w <path>\tSets working folder"
+}
+
+OPTIND=1 # Reset in case getopts has been used previously in the shell.
+while getopts "h?:Hw:" opt; do
+ case "$opt" in
+ h|\?)
+ show_help
+ exit 0
+ ;;
+ w) working_folder=${OPTARG}
+ printf "# Working folder is ${working_folder}\n"
+ ;;
+ h) huge_pages=true
+ printf "# Using 'huge_pages' property in flavors\n"
+ ;;
+ esac
+done
+
+shift $((OPTIND-1))
+[ "${1:-}" = "--" ] && shift
+
+function put() {
+ echo "$1=$2" | tee -a ${filename}
+}
+
+# now, some hard to understand stuff...
+# f1 $(<command with output to cut>)
+function f1() { echo $1 | cut -d' ' -f1; };
+# <commands with output to cut> | p1
+function p1() { while read input; do echo ${input} | cut -d' ' -f1; done; };
+# ol1 is short for openstack list with 1 param. Also grep and cut
+# "ol1 network public" will list all networks, grep by name public and return IDs
+function ol1() { echo $(openstack $1 list -c ID -c Name -f value | grep $2 | cut -d' ' -f1); }
+# same as ol1 but with 2 initial commands before list
+function ol2() { echo $(openstack $1 $2 list -c ID -c Name -f value | grep $3 | cut -d' ' -f1); }
+
+function print_manifest() {
+ touch ./${filename}
+ truncate -s 0 ${filename}
+ printf "\n\n# Checking and filling manifest: $(pwd)/${filename}\n"
+ put project_name ${project}
+ put project_id $(ol1 project ${project})
+ put user_name ${user}
+ put user_id $(ol1 user ${user})
+ put admin_name ${admin}
+ put admin_id $(ol1 user ${admin})
+ # sg
+ put secgroup_all_name ${sg_all}
+ put secgroup_all_id $(ol2 security group ${sg_all})
+ put secgroup_icmp_name ${sg_icmp}
+ put secgroup_icmp_id $(ol2 security group ${sg_icmp})
+ put secgroup_ssh_name ${sg_ssh}
+ put secgroup_ssh_id $(ol2 security group ${sg_ssh})
+ put secgroup_iperf_name ${sg_iperf}
+ put secgroup_iperf_id $(ol2 security group ${sg_iperf})
+
+ # keypair
+ put keypair_name ${key}
+ put keypair_id $(ol1 keypair ${key})
+
+ # flavors
+ put flavor_tiny_name ${flavor_t}
+ put flavor_tiny_id $(ol1 flavor ${flavor_t})
+ put flavor_small_name ${flavor_s}
+ put flavor_small_id $(ol1 flavor ${flavor_s})
+ put flavor_medium_name ${flavor_m}
+ put flavor_medium_id $(ol1 flavor ${flavor_m})
+ put flavor_high_name ${flavor_h}
+ put flavor_high_id $(ol1 flavor ${flavor_h})
+
+ # fixed nets
+ put fixed_net_left_name ${net_left}
+ put fixed_net_left_id $(ol1 network ${net_left})
+ put fixed_net_right_name ${net_right}
+ put fixed_net_right_id $(ol1 network ${net_right})
+ put fixed_net_left_subnet_name ${subnet1}
+ put fixed_net_left_subnet_id $(openstack subnet list --network ${net_left} -c ID -f value | p1)
+ put fixed_net_right_subnet_name ${subnet2}
+ put fixed_net_right_subnet_id $(openstack subnet list --network ${net_right} -c ID -f value | p1)
+
+ # router
+ put router_name ${router}
+ put router_id $(ol1 router ${router})
+
+ # volumes
+ put volume_name ${volume}
+ put volume_id $(ol1 volume ${volume})
+
+ # images
+ put cirros35_name ${cirros3}
+ put cirros35_id $(ol1 image ${cirros3})
+ put cirros40_name ${cirros4}
+ put cirros40_id $(ol1 image ${cirros4})
+ put ubuntu16_name ${ubuntu16}
+ put ubuntu16_id $(ol1 image ${ubuntu16})
+ put ubuntuspt_name ${ubuntuspt}
+ put ubuntuspt_id $(ol1 image ${ubuntuspt})
+}
+
+# create rc file out of current ENV vars
+function putrc() {
+ printf "# Saving ${1} file\n"
+ echo "export OS_IDENTITY_API_VERSION=${OS_IDENTITY_API_VERSION:-3}" >${1}
+ echo "export OS_AUTH_URL=${OS_AUTH_URL}" >>${1}
+ echo "export OS_PROJECT_DOMAIN_NAME=${OS_PROJECT_DOMAIN_NAME}" >>${1}
+ echo "export OS_USER_DOMAIN_NAME=${OS_USER_DOMAIN_NAME}" >>${1}
+ echo "export OS_PROJECT_NAME=${OS_PROJECT_NAME}" >>${1}
+ echo "export OS_TENANT_NAME=${OS_TENANT_NAME}" >>${1}
+ echo "export OS_USERNAME=${OS_USERNAME}" >>${1}
+ echo "export OS_PASSWORD=${OS_PASSWORD}" >>${1}
+ echo "export OS_REGION_NAME=${OS_REGION_NAME}" >>${1}
+ echo "export OS_INTERFACE=${OS_INTERFACE}" >>${1}
+ echo "export OS_ENDPOINT_TYPE=${OS_ENDPOINT_TYPE}" >>${1}
+ echo "export OS_CACERT=${OS_CACERT}" >>${1}
+}
+
+# update ENV vars to newly created project
+function updatesession() {
+ export OS_PROJECT_NAME=${project}
+ export OS_TENANT_NAME=${project}
+ export OS_USERNAME=${admin}
+ export OS_PASSWORD=${password}
+}
+
+function process_cmds() {
+ if [ -s ${cmds} ]; then
+ cat ${cmds} | tr '\n' '\0' | xargs -P 1 -n 1 -0 echo | tee /dev/tty | openstack -v 2>&1 >>${logfile}
+ truncate -s 0 ${cmds}
+ fi
+}
+
+function _project() {
+ echo project create ${project} >>${cmds}
+ echo role add --user admin --project ${project} admin >>${cmds}
+}
+
+function _users() {
+ echo user create --project ${project} --password ${password} ${user} >>${cmds}
+ echo user create --project ${project} --password ${password} ${admin} >>${cmds}
+ echo role add --user ${admin} --project ${project} admin >>${cmds}
+ echo role add --user ${admin} --project ${project} creator >>${cmds}
+ echo role add --user ${user} --project ${project} member >>${cmds}
+ echo role add --user ${user} --project ${project} creator >>${cmds}
+
+}
+
+function _sg_all() {
+ echo security group create --project ${project} ${sg_all} >>${cmds}
+ # icmp
+ echo security group rule create --protocol icmp ${sg_all} >>${cmds}
+ # ssh
+ echo security group rule create --protocol tcp --dst-port 22 ${sg_all} >>${cmds}
+ # iperf
+ echo security group rule create --protocol tcp --dst-port 5001 ${sg_all} >>${cmds}
+ # iperf3
+ echo security group rule create --protocol tcp --dst-port 5201 ${sg_all} >>${cmds}
+ # nc connectivity
+ echo security group rule create --protocol tcp --dst-port 3000 ${sg_all} >>${cmds}
+ # http
+ echo security group rule create --protocol tcp --dst-port 80 ${sg_all} >>${cmds}
+ # https
+ echo security group rule create --protocol tcp --dst-port 443 ${sg_all} >>${cmds}
+}
+
+function _sg_icmp() {
+ echo security group create --project ${project} ${sg_icmp} >>${cmds}
+ echo security group rule create --protocol icmp ${sg_icmp} >>${cmds}
+}
+
+function _sg_ssh() {
+ echo security group create --project ${project} ${sg_ssh} >>${cmds}
+ # icmp
+ echo security group rule create --protocol icmp ${sg_ssh} >>${cmds}
+ # ssh
+ echo security group rule create --protocol tcp --dst-port 22 ${sg_ssh} >>${cmds}
+}
+
+function _sg_iperf() {
+ echo security group create --project ${project} ${sg_iperf} >>${cmds}
+ # icmp
+ echo security group rule create --protocol icmp ${sg_iperf} >>${cmds}
+ # iperf
+ echo security group rule create --protocol tcp --dst-port 5001 ${sg_iperf} >>${cmds}
+ # iperf3
+ echo security group rule create --protocol tcp --dst-port 5201 ${sg_iperf} >>${cmds}
+}
+
+function create_keypair() {
+ echo "# Creating keypair"
+ openstack keypair create ${key} >${key}
+ chmod 600 ${key}
+ echo "-> created keyfile: $(pwd)/${key}"
+}
+
+function _flavors() {
+ # huge paged flavors
+ if [ "$huge_pages" = true ]; then
+ echo flavor create --id 1 --ram 64 --disk 1 --vcpus 1 ${flavor_t} --property hw:mem_page_size=large >>${cmds}
+ echo flavor create --id 2 --ram 256 --disk 2 --vcpus 1 ${flavor_s} --property hw:mem_page_size=large >>${cmds}
+ echo flavor create --id 3 --ram 2048 --disk 10 --vcpus 2 ${flavor_m} --property hw:mem_page_size=large >>${cmds}
+ echo flavor create --id 4 --ram 2048 --disk 20 --vcpus 4 ${flavor_h} --property hw:mem_page_size=large >>${cmds}
+ else
+ echo flavor create --id 1 --ram 64 --disk 1 --vcpus 1 ${flavor_t} >>${cmds}
+ echo flavor create --id 2 --ram 256 --disk 2 --vcpus 1 ${flavor_s} >>${cmds}
+ echo flavor create --id 3 --ram 2048 --disk 10 --vcpus 2 ${flavor_m} >>${cmds}
+ echo flavor create --id 4 --ram 2048 --disk 20 --vcpus 4 ${flavor_h} >>${cmds}
+ fi
+}
+
+function _volumes() {
+ echo volume create --size 2 ${volume} >>${cmds}
+}
+
+function create_fixed_nets() {
+ echo "# Creating fixed networks"
+ echo network create --project ${project} ${net_left} >>${cmds}
+ echo subnet create ${subnet1} --network ${net_left} --subnet-range 10.10.11.0/24 >>${cmds}
+ echo network set --share ${net_left} >>${cmds}
+ echo network create --project ${project} ${net_right} >>${cmds}
+ echo subnet create ${subnet2} --network ${net_right} --subnet-range 10.10.12.0/24 >>${cmds}
+ echo network set --share ${net_right} >>${cmds}
+ process_cmds
+
+ # get subnet ids
+ subnet1_id=$(openstack subnet list --network ${net_left} -c ID -f value)
+ subnet2_id=$(openstack subnet list --network ${net_right} -c ID -f value)
+
+ echo router create --project ${project} ${router} >>${cmds}
+ process_cmds
+
+ router_id=$(openstack router list -c ID -c Name -f value | grep ${router} | cut -d' ' -f1)
+ echo router add subnet ${router_id} ${subnet1_id} >>${cmds}
+ echo router add subnet ${router_id} ${subnet2_id} >>${cmds}
+ process_cmds
+
+ # TODO: Search for external net
+ external=prod-public
+ echo router set ${router} --external-gateway ${external} >>${cmds}
+ process_cmds
+}
+
+function _get_image() {
+ # build vars for name and link
+ name="${1}"
+ link="${1}_link"
+ which wget >/dev/null
+ if [ $? -ne 0 ]; then
+ printf "\nERROR: 'wget' not detected. Download skipped: ${!name}\n"
+ else
+ # no redownloads, quet, save named and show progress
+ r=$(wget --no-check-certificate -nc -q -O ./${!name} --show-progress ${!link})
+ if [ $? -ne 0 ]; then
+ # non-empty output on error
+ echo ${r}
+ fi
+ fi
+}
+
+function create_image() {
+ name="${1}"
+ # Check if image is in the cloud
+ echo "# Checking image '${!name}'"
+ ids=( $(ol1 image ${!name}) )
+ # if array is empty, download and upload it
+ if [ ${#ids[@]} -eq 0 ]; then
+ # check and download
+ if [ ! -f ${!name} ]; then
+ r=$(_get_image ${1})
+ else
+ r=""
+ fi
+ # check if output is not empty
+ if [ ${#r} -eq 0 ]; then
+ image_id=$(openstack image create --public --disk-format qcow2 --container-format bare --file ${!name} ${!name} -c id -f value)
+ echo "-> created ${!name} (${image_id})"
+ else
+ printf "\n-> Error detected, creation skipped\n"
+ fi
+ else
+ # image(s) already there, list them
+ for id in ${ids[@]}; do
+ echo "-> found ${!name} with ID of '${id}'"
+ done
+ fi
+}
+
+###################
+### Main
+###################
+if [[ -z ${working_folder+x} ]]; then
+ # cwd into working dir
+ cd ${working_folder}
+fi
+
+cmds=$(mktemp)
+trap "rm -f ${cmds}" EXIT
+echo "Using tempfile: '${cmds}'"
+
+touch ${logfile}
+echo "Using log file: '${logfile}'"
+
+# Create
+echo "# Creating project and users"
+_project
+_users
+process_cmds
+
+echo "# Creating 'rc' and switching"
+putrc "./adminrc"
+updatesession
+putrc "./${rcfile}"
+
+echo "# Creating basic resources"
+# not dependent stuff
+_sg_all
+_sg_icmp
+_sg_ssh
+_sg_iperf
+_flavors
+_volumes
+process_cmds
+
+# sophisticated, step dependent stuff
+create_keypair
+create_fixed_nets
+
+# images
+#create_image cirros3
+#create_image cirros4
+#create_image ubuntu16
+# update image name to correct one uploaded
+#ubuntuspt_file="ubuntuspt.img"
+#openstack image create --public --disk-format qcow2 --container-format bare --file ${ubuntuspt_file} ${ubuntuspt} -c id -f value
+
+### Manifest and fall back to original rc
+print_manifest
+printf ="\n\nSetting quota\n"
+openstack quota set --cores -1 --ram -1 --instances -1 --volumes -1 --gigabytes -1 cvp.project
+source "./adminrc"
+printf "\n\nOriginal rc preserved and backed up in 'adminrc'\nNew rc is '${rcfile}'\n"