blob: 87c76a1a86c6a50860e182ea2f4375189c6e9226 [file] [log] [blame]
#!/bin/bash
# Copyright 2019 AT&T Intellectual Property. All rights reserved.
#
# 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.
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
NO_PROMPT=0
RANDOM_PREFIX="ONAP"
RANDOM_STRING="$RANDOM_PREFIX"-`cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 4`
DEVSTACK_RG=
DEVSTACK_LOCATION=
PUBLIC_KEY=
DEVSTACK_NAME=
DEVSTACK_VM_SIZE=
SUBNET_CIDR=
ADMIN_USER=
BUILD_DIR=
DEVSTACK_VNET_NAME=
USER_PUBLIC_IP_PREFIX=
DEVSTACK_PRIVATE_IP=
DEVSTACK_SUBNET_NAME=
DEVSTACK_DISK_SIZE=
OPENSTACK_USER=
OPENSTACK_PASS=
OS_PROJECT_NAME=
IMAGE_LIST=
DEVSTACK_BRANCH=
function check_required_parameter() {
# arg1 = parameter
# arg2 = parameter name
if [ -z "$1" ]; then
echo "$2 was not was provided. This parameter is required."
exit 1
fi
}
function check_optional_paramater() {
# arg1 = parameter
# arg2 = parameter name
if [ -z "$1" ]; then
echo "$2"
else
echo "$1"
fi
}
while test $# -gt 0; do
case "$1" in
-h|--help)
echo "./create_devstack.sh [options]"
echo " "
echo " "
echo "required:"
echo "--public-key public key to add for admin user [required]"
echo "--user-public-ip public ip that will be granted access to VM [required]"
echo "-l, --location location to deploy VM [required]"
echo "-u, --admin-user admin user to create on VM [required]"
echo " "
echo "additional options:"
echo "-f, --no-prompt executes with no prompt for confirmation"
echo "-h, --help provide brief overview of script"
echo "-n, --name VM name [optional]"
echo "-g, --resource-group provide brief overview of script [optional]"
echo "-s, --size Azure flavor size for VM [optional]"
echo "-c, --cidr cidr for VNET to create for VM [optional]. If provided, must also provide --devstack-private-ip from same range."
echo "-d, --directory directory to store cloud config data [optional]"
echo "--vnet-name name of Vnet to create for VM [optional]"
echo "--image-list space delimited list of image urls that will be added to devstack [optional]"
echo "--devstack-private-ip private ip assigned to VM [optional]. If provided, this value must come from the CIDR range of VNET."
echo "--devstack-subnet-name subnet name created on VNET [optional]"
echo "--devstack-disk-size size of OS disk to be allocated [optional]"
echo "--openstack-username default user name for openstack [optional]"
echo "--openstack-password default password for openstack [optional]"
echo "--openstack-tenant default tenant name for openstack [optional]"
echo "--devstack-branch branch to use for devstack install [optional]"
echo ""
exit 0
;;
-f|--no-prompt)
shift
NO_PROMPT=1
;;
-n|--name)
shift
DEVSTACK_NAME=$1
shift
;;
-g|--resource-group)
shift
DEVSTACK_RG=$1
shift
;;
-s|--size)
shift
DEVSTACK_VM_SIZE=$1
shift
;;
-l|--location)
shift
DEVSTACK_LOCATION=$1
shift
;;
-c|--cidr)
shift
SUBNET_CIDR=$1
shift
;;
-u|--admin-user)
shift
ADMIN_USER=$1
shift
;;
-d|--directory)
shift
BUILD_DIR=$1
shift
;;
--vnet-name)
shift
DEVSTACK_VNET_NAME=$1
shift
;;
--image-list)
shift
IMAGE_LIST=$1
shift
;;
--public-key)
shift
PUBLIC_KEY=$1
shift
;;
--user-public-ip)
shift
USER_PUBLIC_IP_PREFIX=$1
shift
;;
--devstack-private-ip)
shift
DEVSTACK_PRIVATE_IP=$1
shift
;;
--devstack-subnet-name)
shift
DEVSTACK_SUBNET_NAME=$1
shift
;;
--devstack-disk-size)
shift
DEVSTACK_DISK_SIZE=$1
shift
;;
--openstack-username)
shift
OPENSTACK_USER=$1
shift
;;
--openstack-password)
shift
OPENSTACK_PASS=$1
shift
;;
--openstack-tenant)
shift
OS_PROJECT_NAME=$1
shift
;;
--devstack-branch)
shift
DEVSTACK_BRANCH=$1
shift
;;
*)
echo "Unknown Argument $1. Try running with --help."
exit 0
;;
esac
done
check_required_parameter "$ADMIN_USER" "--admin-user"
check_required_parameter "$PUBLIC_KEY" "--public-key"
check_required_parameter "$DEVSTACK_LOCATION" "--location"
check_required_parameter "$USER_PUBLIC_IP_PREFIX" "--user-public-ip"
DEVSTACK_RG=$(check_optional_paramater "$DEVSTACK_RG" $RANDOM_STRING"-DEVSTACKRG")
DEVSTACK_NAME=$(check_optional_paramater "$DEVSTACK_NAME" $RANDOM_STRING"-DEVSTACK")
DEVSTACK_VM_SIZE=$(check_optional_paramater "$DEVSTACK_VM_SIZE" "Standard_DS4_v2")
SUBNET_CIDR=$(check_optional_paramater "$SUBNET_CIDR" "173.0.0.0/24")
BUILD_DIR=$(check_optional_paramater "$BUILD_DIR" /tmp/devstack-$RANDOM_STRING)
DEVSTACK_VNET_NAME=$(check_optional_paramater "$DEVSTACK_VNET_NAME" $RANDOM_STRING"-DEVSTACK-VNET")
DEVSTACK_PRIVATE_IP=$(check_optional_paramater "$DEVSTACK_PRIVATE_IP" "173.0.0.4")
DEVSTACK_SUBNET_NAME=$(check_optional_paramater "$DEVSTACK_SUBNET_NAME" $RANDOM_STRING"-DEVSTACK-VNET-SUBNET")
DEVSTACK_DISK_SIZE=$(check_optional_paramater "$DEVSTACK_DISK_SIZE" "64")
OPENSTACK_USER=$(check_optional_paramater "$OPENSTACK_USER" "admin")
OPENSTACK_PASS=$(check_optional_paramater "$OPENSTACK_PASS" "secret")
OS_PROJECT_NAME=$(check_optional_paramater "$OS_PROJECT_NAME" "admin")
IMAGE_LIST=$(check_optional_paramater "$IMAGE_LIST" "")
DEVSTACK_BRANCH=$(check_optional_paramater "$DEVSTACK_BRANCH" "master")
if [ $NO_PROMPT = 0 ]; then
read -p "Would you like to proceed? [y/n]" -n 1 -r
echo " "
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
exit 0
fi
fi
set -x
set -e
# TODO
# This needs to be hardened
DEVSTACK_PRIVATE_GATEWAY=`echo $DEVSTACK_PRIVATE_IP | sed 's/.$/1/'`
DEVSTACK_ALLOCATION_START=`echo $DEVSTACK_PRIVATE_IP | sed 's/.$/10/'`
DEVSTACK_ALLOCATION_END=`echo $DEVSTACK_PRIVATE_IP | sed 's/.$/240/'`
DATA_FILE=$BUILD_DIR/cloud-cfg-os.yaml
if [ ! -d $BUILD_DIR ]; then
echo "running script standalone..."
mkdir -p "$BUILD_DIR"
fi
$DIR/create_resource_group.sh "$DEVSTACK_RG" "$DEVSTACK_LOCATION"
az network public-ip create --resource-group "$DEVSTACK_RG" --name "DEVSTACK_PUBLIC_IP" --allocation-method Static
DEVSTACK_PUBLIC_IP=`az network public-ip show --resource-group "$DEVSTACK_RG" --name "DEVSTACK_PUBLIC_IP" --query 'ipAddress' --output tsv`
cat > $DATA_FILE <<EOF
#cloud-config
package_upgrade: true
packages:
- resolvconf
- python3-dev
users:
- default
- name: stack
lock_passwd: False
sudo: ["ALL=(ALL) NOPASSWD:ALL\nDefaults:stack !requiretty"]
shell: /bin/bash
write_files:
- path: /home/stack/start.sh
permissions: 0755
content: |
#!/bin/sh
DEBIAN_FRONTEND=noninteractive sudo apt-get -qqy update || sudo yum update -qy
DEBIAN_FRONTEND=noninteractive sudo apt-get install -qqy git || sudo yum install -qy git
sudo chown stack:stack /home/stack
cd /home/stack
git clone -b $DEVSTACK_BRANCH https://git.openstack.org/openstack-dev/devstack
cd devstack
cat > local.conf <<EOF
[[local|localrc]]
HOST_IP=$DEVSTACK_PRIVATE_IP
SERVICE_HOST=$DEVSTACK_PRIVATE_IP
MYSQL_HOST=$DEVSTACK_PRIVATE_IP
RABBIT_HOST=$DEVSTACK_PRIVATE_IP
GLANCE_HOSTPORT=$DEVSTACK_PRIVATE_IP:9292
ADMIN_PASSWORD="secret"
DATABASE_PASSWORD="secret"
RABBIT_PASSWORD="secret"
SERVICE_PASSWORD="secret"
enable_service h-eng h-api h-api-cfn h-api-cw
disable_service tempest
enable_plugin heat https://git.openstack.org/openstack/heat $DEVSTACK_BRANCH
enable_plugin heat-dashboard https://opendev.org/openstack/heat-dashboard $DEVSTACK_BRANCH
## Neutron options
Q_USE_SECGROUP=True
FLOATING_RANGE="$SUBNET_CIDR"
IPV4_ADDRS_SAFE_TO_USE="192.168.100.0/24"
Q_FLOATING_ALLOCATION_POOL=start=$DEVSTACK_ALLOCATION_START,end=$DEVSTACK_ALLOCATION_END
PUBLIC_NETWORK_GATEWAY="$DEVSTACK_PRIVATE_GATEWAY"
PUBLIC_INTERFACE=eth0
# Disable security groups
# Q_USE_SECGROUP=False
# LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver
# Open vSwitch provider networking configuration
Q_USE_PROVIDERNET_FOR_PUBLIC=True
OVS_PHYSICAL_BRIDGE=br-ex
PUBLIC_BRIDGE=br-ex
OVS_BRIDGE_MAPPINGS=public:br-ex
USE_PYTHON3=True
[[post-config|/etc/nova/nova.conf]]
[libvirt]
cpu_mode = host-passthrough
EOF
./stack.sh
source accrc/admin/admin
openstack project create --domain default --description "New Project" "$OS_PROJECT_NAME"
openstack user create --domain default --project "$OS_PROJECT_NAME" --password "$OPENSTACK_PASS" "$OPENSTACK_USER"
openstack role add --project "$OS_PROJECT_NAME" --user "$OPENSTACK_USER" admin
openstack network set --disable-port-security public
openstack subnet set --dhcp public-subnet
openstack subnet set --dns-nameserver 8.8.4.4 public-subnet
openstack network set --share public
openstack network set --share private
for image in `echo "$IMAGE_LIST"`; do
file_name=\`echo "\$image" | rev | cut -d "/" -f 1 | rev\`
image_name=\`echo "\$file_name" | rev | cut -d "." -f 2- | rev\`
wget -O /tmp/"\$file_name" "\$image"
openstack image create --disk-format qcow2 --public --file /tmp/"\$file_name" --property img_config_drive=mandatory "\$image_name"
done
runcmd:
- echo "nameserver 8.8.4.4" >> /etc/resolvconf/resolv.conf.d/head
- echo "nameserver 8.8.8.8" >> /etc/resolvconf/resolv.conf.d/head
- service resolvconf restart
- su -l stack ./start.sh
- iptables -t nat -F POSTROUTING
- iptables -t nat -A POSTROUTING -o br-ex -j MASQUERADE
- iptables -t nat -A PREROUTING -d "$DEVSTACK_PUBLIC_IP" -j DNAT --to-destination $DEVSTACK_PRIVATE_IP
EOF
DEVSTACK_IMAGE="UbuntuLTS"
DEVSTACK_SECURITY_GROUP=$DEVSTACK_NAME"-SG"
az network nsg create --resource-group "$DEVSTACK_RG" \
--name "$DEVSTACK_SECURITY_GROUP"
$DIR/create_sg_rule.sh "$DEVSTACK_RG" "$DEVSTACK_SECURITY_GROUP" '*' "22" "$USER_PUBLIC_IP_PREFIX" '*' '*' "SSH" "100"
$DIR/create_sg_rule.sh "$DEVSTACK_RG" "$DEVSTACK_SECURITY_GROUP" '*' "80" "$USER_PUBLIC_IP_PREFIX" '*' '*' "HORIZON" "110"
az vm create --name "$DEVSTACK_NAME" \
--resource-group "$DEVSTACK_RG" \
--size "$DEVSTACK_VM_SIZE" \
--admin-username "$ADMIN_USER" \
--ssh-key-value @"$PUBLIC_KEY" \
--os-disk-size-gb "$DEVSTACK_DISK_SIZE" \
--image "$DEVSTACK_IMAGE" \
--location "$DEVSTACK_LOCATION" \
--subnet-address-prefix "$SUBNET_CIDR" \
--subnet "$DEVSTACK_SUBNET_NAME" \
--vnet-address-prefix "$SUBNET_CIDR" \
--vnet-name "$DEVSTACK_VNET_NAME" \
--custom-data "$DATA_FILE" \
--nsg "$DEVSTACK_SECURITY_GROUP" \
--private-ip-address "$DEVSTACK_PRIVATE_IP" \
--public-ip-address "DEVSTACK_PUBLIC_IP"
echo ""
az network vnet subnet update --resource-group="$DEVSTACK_RG" \
--name "$DEVSTACK_SUBNET_NAME" \
--vnet-name "$DEVSTACK_VNET_NAME" \
--network-security-group "$DEVSTACK_SECURITY_GROUP"
DEVSTACK_NIC_ID=`az vm nic list --resource-group ${DEVSTACK_RG} --vm-name ${DEVSTACK_NAME} --query "[0] | id" --output tsv`
### Enabling IP Forwarding on DEVSTACK vnic ###
az network nic update --ids "$DEVSTACK_NIC_ID" --ip-forwarding