#placeholder for deployment script.
set -ex
+source common/tools.sh
+
+
+usage() {
+ # no xtrace output
+ { set +x; } 2> /dev/null
+
+ echo "OPNFV JOID deployer of the MAAS (Metal as a Service) infrastructure."
+ echo "Usage: $0 custom <path_to_labconfig>"
+ echo " $0 virtual"
+ exit ${1-0}
+}
+
+# Print usage help message if requested
+if [ "$1" == "help" ] || [ "$1" == "-h" ] || [ "$1" == "--help" ]
+then
+ usage;
+fi
+
+
virtinstall=0
labname=$1
ssh-keygen -N '' -f $HOME/.ssh/id_rsa
fi
-#install the packages needed
+NODE_ARCTYPE=`arch`
+CPU_MODEL="host"
+
+if [ "ppc64le" == "$NODE_ARCTYPE" ]; then
+ NODE_ARCHES="ppc64el"
+elif [ "aarch64" == "$NODE_ARCTYPE" ]; then
+ NODE_ARCHES="arm64"
+ CPU_MODEL="host-passthrough"
+else
+ NODE_ARCHES="amd64"
+fi
+
+NODE_ARC="$NODE_ARCHES/generic"
+
+# Install the packages needed
+echo_info "Installing and upgrading required packages"
sudo apt-get install software-properties-common -y
sudo apt-add-repository ppa:juju/stable -y
sudo apt-add-repository ppa:maas/stable -y
sudo -H pip install --upgrade pip
-#first parameter should be custom and second should be either
-# absolute location of file (including file name) or url of the
-# file to download.
-
#
# Config preparation
#
# Get labconfig and generate deployconfig.yaml
+
case "$labname" in
- intelpod[569]|orangepod[12]|cengnpod[12] )
- array=(${labname//pod/ })
- cp ../labconfig/${array[0]}/pod${array[1]}/labconfig.yaml .
- python genDeploymentConfig.py -l labconfig.yaml > deployconfig.yaml
- ;;
- 'attvirpod1' )
- cp ../labconfig/att/virpod1/labconfig.yaml .
- python genDeploymentConfig.py -l labconfig.yaml > deployconfig.yaml
- ;;
'custom')
+ # Deployment with a custom labconfig file
labfile=$2
- if [ -e $labfile ]; then
- cp $labfile ./labconfig.yaml || true
- else
- wget $labconfigfile -t 3 -T 10 -O ./labconfig.yaml || true
+ if [ -z "$labfile" ]; then
+ if [ ! -e ./labconfig.yaml ]; then
+ # no labconfig file was specified and no ci/labconfig.yaml is present
+ echo_error "Labconfig file must be specified when using custom"
+ usage 1
+ else
+ # no labconfig file was specified and but a (backup) ci/labconfig.yaml found
+ echo_warning "Labconfig was not specified, using ./labconfig.yaml instead"
+ # no action needed, ./labconfig.yaml already present
+ fi
+ elif [ ! -e "$labfile" ]; then
+ # labconfig file was specified but does not exist on disk
+ echo_warning "Labconfig not found locally, trying download"
+
+ wget $labfile -t 3 -T 10 -O ./labconfig.yaml || true
count=`wc -l labconfig.yaml | cut -d " " -f 1`
if [ $count -lt 10 ]; then
- rm -rf labconfig.yaml
+ echo_error "Unable to download labconfig"
+ exit 1
fi
- fi
- if [ ! -e ./labconfig.yaml ]; then
- virtinstall=1
- labname="default"
- cp ../labconfig/default/labconfig.yaml ./
- cp ../labconfig/default/deployconfig.yaml ./
else
- python genDeploymentConfig.py -l labconfig.yaml > deployconfig.yaml
- labname=`grep "maas_name" deployconfig.yaml | cut -d ':' -f 2 | sed -e 's/ //'`
+ echo_info "Using $labfile to setup deployment"
+ cp $labfile ./labconfig.yaml
fi
+
+ python genDeploymentConfig.py -l labconfig.yaml > deployconfig.yaml
+ labname=`grep "maas_name" deployconfig.yaml | cut -d ':' -f 2 | sed -e 's/ //'`
;;
- * )
- virtinstall=1
- labname="default"
+ 'virtual'|'')
+ # Virtual deployment using a default labconfig file
+ echo_info "Using default labconfig for virtual install"
cp ../labconfig/default/labconfig.yaml ./
python genDeploymentConfig.py -l labconfig.yaml > deployconfig.yaml
+ labname="default"
+ virtinstall=1
+ ;;
+ * )
+ # Unknown argument
+ echo_error "Unknown script argument: $labname"
+ usage 1
;;
esac
MAAS_IP=$(grep " ip_address" deployconfig.yaml | cut -d ':' -f 2 | sed -e 's/ //')
MAAS_NAME=`grep "maas_name" deployconfig.yaml | cut -d ':' -f 2 | sed -e 's/ //'`
-API_SERVER="http://$MAAS_IP/MAAS/api/2.0"
-API_SERVERMAAS="http://$MAAS_IP/MAAS/"
+API_SERVER="http://$MAAS_IP:5240/MAAS/api/2.0"
+API_SERVERMAAS="http://$MAAS_IP:5240/MAAS/"
PROFILE=ubuntu
MY_UPSTREAM_DNS=`grep "upstream_dns" deployconfig.yaml | cut -d ':' -f 2 | sed -e 's/ //'`
SSH_KEY=`cat ~/.ssh/id_rsa.pub`
sudo mv 90-joid-init /etc/sudoers.d/
fi
-echo "... Deployment of maas Started ...."
+echo_info "Deployment of MAAS started"
#
# Virsh preparation
#
configuremaas(){
#reconfigure maas with correct MAAS address.
- #Below code is needed as MAAS have issue in commisoning without restart.
+ #Below code is needed as MAAS have issue in commissioning without restart.
#sudo ./maas-reconfigure-region.sh $MAAS_IP
sleep 30
sudo maas-rack config --region-url http://$MAAS_IP:5240/MAAS
#create the required spaces.
maas $PROFILE space update 0 name=default || true
- for space in unused admin-api internal-api public-api compute-data \
- compute-external storage-data storage-cluster admin \
- tenant-data tenant-api tenant-public
+ for space in admin-api internal-api public-api \
+ storage-access storage-cluster admin \
+ tenant-data tenant-api tenant-public os-api
do
- echo "Creating the space $space"
+ echo_info "Creating the space $space"
maas $PROFILE spaces create name=$space || true
done
maas $PROFILE boot-source update $SOURCE_ID \
url=$URL keyring_filename=$KEYRING_FILE || true
+ if [ $NODE_ARCTYPE != "x86_64" ] ; then
+ maas $PROFILE boot-source-selection update 1 1 arches="$NODE_ARCHES"
+ fi
+
maas $PROFILE boot-resources import || true
while [ "$(maas $PROFILE boot-resources is-importing)" == "true" ];
setupspacenetwork(){
#get space, subnet and vlan and create accordingly.
- #for type in admin data storage external floating public; do
+ #for type in admin osapi data storage external floating public; do
nettypes=`cat labconfig.json | jq '.opnfv.spaces[]'.type | cut -d \" -f 2`
for type in $nettypes; do
config_done=0
'admin') JUJU_SPACE="internal-api"; DHCP='enabled' ;;
'data') JUJU_SPACE="tenant-data"; DHCP='' ;;
'public') JUJU_SPACE="public-api"; DHCP='' ;;
- 'storage') JUJU_SPACE="tenant-stor"; DHCP='' ;;
- 'storagecluster') JUJU_SPACE="storclus"; DHCP='' ;;
+ 'storage') JUJU_SPACE="storage-cluster"; DHCP='' ;;
+ 'storageaccess') JUJU_SPACE="storage-data"; DHCP='' ;;
'floating') JUJU_SPACE="tenant-public"; DHCP='' ;;
- *) JUJU_SPACE='default'; DHCP='OFF'; echo " >>> Unknown SPACE" ;;
+ 'osapi') JUJU_SPACE="os-api"; DHCP='' ;;
+ *) JUJU_SPACE='default'; DHCP='OFF'; echo_info " >>> Unknown SPACE" ;;
esac
JUJU_SPACE_ID=$(maas $PROFILE spaces read | jq -r ".[] | select(.name==\"$JUJU_SPACE\")".id)
JUJU_VLAN_VID=$(maas $PROFILE subnets read | jq -r ".[] | select(.name==\"$SPACE_CIDR\")".vlan.vid)
fi
fi
if ([ $type == "admin" ]); then
- # If we have a network, we create it
+ # If we have a network, we create it
if ([ $NET_FABRIC_ID ]); then
# Set ranges
SUBNET_PREFIX=${SPACE_CIDR::-5}
do
maas $PROFILE machine delete $m
done
+ podno=$(maas $PROFILE pods read | jq -r ".[]".id)
+ maas $PROFILE pod delete $podno || true
# if we have a virshurl configuration we use it, else we use local
VIRSHURL=$(cat labconfig.json | jq -r '.opnfv.virshurl')
if [ "$virtinstall" -eq 1 ]; then
netw=" --network bridge=virbr0,model=virtio"
- elif ([ $VIRSHHOST != "" ]); then
+ elif ([ "$VIRSHHOST" != "" ]); then
# Get the bridge hosting the remote virsh
brid=$(ssh $VIRSHHOST "ip a l | grep $VIRSHHOST | perl -pe 's/.* (.*)\$/\$1/g'")
netw=" --network bridge=$brid,model=virtio"
# prepare a file containing virsh remote url to connect without adding it n command line
echo "export VIRSH_DEFAULT_CONNECT_URI=$VIRSHURL" > virsh_uri.sh
else
+ netw=""
+
brid=`brctl show | grep 8000 | cut -d "8" -f 1 | tr "\n" " " | tr " " " " | tr -s " "`
+ ADMIN_BR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="admin")'.bridge | cut -d \" -f 2 `
- netw=""
for feature in $brid; do
- if [ "$feature" == "" ]; then
- netw=$netw
- elif [ "$feature" == "virbr0" ]; then
- netw=$netw
- else
+ if ([ "$feature" == "$ADMIN_BR" ]); then
netw=$netw" --network bridge="$feature",model=virtio"
+ else
+ netw=$netw
fi
done
fi
if [ $VIRSHIP != "" ]; then
# Check if the IP is not already present among the known hosts
if ! ssh-keygen -F $VIRSHIP > /dev/null ; then
- echo "SSH fingerprint of the host is not known yet, adding"
+ echo_info "SSH fingerprint of the host is not known yet, adding to known_hosts"
ssh-keyscan -H $VIRSHIP >> ~/.ssh/known_hosts
fi
fi
- virt-install --connect $VIRSHURL --name bootstrap --ram 4098 --cpu host --vcpus 2 --video \
- cirrus --arch x86_64 --disk size=20,format=qcow2,bus=virtio,cache=directsync,io=native,pool=default \
+ echo_info "Creating and adding bootstrap node"
+
+ virt-install --connect $VIRSHURL --name bootstrap --ram 4098 --cpu $CPU_MODEL --vcpus 2 \
+ --disk size=20,format=qcow2,bus=virtio,cache=directsync,io=native,pool=default \
$netw --boot network,hd,menu=off --noautoconsole \
- --vnc --print-xml | tee bootstrap
+ --print-xml | tee bootstrap
if [ "$virtinstall" -eq 1 ]; then
bootstrapmac=`grep "mac address" bootstrap | head -1 | cut -d '"' -f 2`
done
fi
virsh -c $VIRSHURL define --file bootstrap
+ virsh -c $VIRSHURL autostart bootstrap
+
rm -f bootstrap
sleep 60
maas $PROFILE machines create autodetect_nodegroup='yes' name='bootstrap' \
tags='bootstrap' hostname='bootstrap' power_type='virsh' mac_addresses=$bootstrapmac \
power_parameters_power_address="$VIRSHURL" \
- architecture='amd64/generic' power_parameters_power_id='bootstrap'
+ architecture=$NODE_ARC power_parameters_power_id='bootstrap'
bootstrapid=$(maas $PROFILE machines read | jq -r '.[] | select(.hostname == "bootstrap").system_id')
units=$(($units - 1));
NODE_NAME=`cat labconfig.json | jq ".lab.racks[].nodes[$units].name" | cut -d \" -f 2 `
- virt-install --connect $VIRSHURL --name $NODE_NAME --ram 8192 --cpu host --vcpus 4 \
+ virt-install --connect $VIRSHURL --name $NODE_NAME --ram 8192 --cpu $CPU_MODEL --vcpus 4 \
--disk size=120,format=qcow2,bus=virtio,cache=directsync,io=native,pool=default \
- $netw $netw --boot network,hd,menu=off --noautoconsole --vnc --print-xml | tee $NODE_NAME
+ $netw $netw --boot network,hd,menu=off --noautoconsole --print-xml | tee $NODE_NAME
nodemac=`grep "mac address" $NODE_NAME | head -1 | cut -d '"' -f 2`
virsh -c $VIRSHURL define --file $NODE_NAME
+ virsh -c $VIRSHURL autostart $NODE_NAME
+
rm -f $NODE_NAME
maas $PROFILE machines create autodetect_nodegroup='yes' name=$NODE_NAME \
tags='control compute' hostname=$NODE_NAME power_type='virsh' mac_addresses=$nodemac \
power_parameters_power_address="$VIRSHURL" \
- architecture='amd64/generic' power_parameters_power_id=$NODE_NAME
+ architecture=$NODE_ARC power_parameters_power_id=$NODE_NAME
nodeid=$(maas $PROFILE machines read | jq -r '.[] | select(.hostname == '\"$NODE_NAME\"').system_id')
maas $PROFILE tag update-nodes control add=$nodeid || true
maas $PROFILE tag update-nodes compute add=$nodeid || true
done
else
- units=`cat deployconfig.json | jq .opnfv.units`
+ units=`cat deployconfig.json | jq .opnfv.units`
- until [ $(($units)) -lt 1 ]; do
- units=$(($units - 1));
- NODE_NAME=`cat labconfig.json | jq ".lab.racks[].nodes[$units].name" | cut -d \" -f 2 `
- MAC_ADDRESS=`cat labconfig.json | jq ".lab.racks[].nodes[$units].nics[] | select(.spaces[]==\"admin\").mac"[0] | cut -d \" -f 2 `
- MAC_ADDRESS1=`cat labconfig.json | jq ".lab.racks[].nodes[$units].nics[] | select(.spaces[]==\"floating\").mac"[0] | cut -d \" -f 2 `
- POWER_TYPE=`cat labconfig.json | jq ".lab.racks[].nodes[$units].power.type" | cut -d \" -f 2 `
- POWER_IP=`cat labconfig.json | jq ".lab.racks[].nodes[$units].power.address" | cut -d \" -f 2 `
- POWER_USER=`cat labconfig.json | jq ".lab.racks[].nodes[$units].power.user" | cut -d \" -f 2 `
- POWER_PASS=`cat labconfig.json | jq ".lab.racks[].nodes[$units].power.pass" | cut -d \" -f 2 `
-
- maas $PROFILE machines create autodetect_nodegroup='yes' name=$NODE_NAME \
- hostname=$NODE_NAME power_type=$POWER_TYPE power_parameters_power_address=$POWER_IP \
- power_parameters_power_user=$POWER_USER power_parameters_power_pass=$POWER_PASS mac_addresses=$MAC_ADDRESS \
- mac_addresses=$MAC_ADDRESS1 architecture='amd64/generic'
- done
+ until [ $(($units)) -lt 1 ]; do
+ units=$(($units - 1));
+ NODE_NAME=`cat labconfig.json | jq ".lab.racks[].nodes[$units].name" | cut -d \" -f 2 `
+ MAC_ADDRESS=`cat labconfig.json | jq ".lab.racks[].nodes[$units].nics[] | select(.spaces[]==\"admin\").mac"[0] | cut -d \" -f 2 `
+ POWER_TYPE=`cat labconfig.json | jq ".lab.racks[].nodes[$units].power.type" | cut -d \" -f 2 `
+ POWER_IP=`cat labconfig.json | jq ".lab.racks[].nodes[$units].power.address" | cut -d \" -f 2 `
+ POWER_USER=`cat labconfig.json | jq ".lab.racks[].nodes[$units].power.user" | cut -d \" -f 2 `
+ POWER_PASS=`cat labconfig.json | jq ".lab.racks[].nodes[$units].power.pass" | cut -d \" -f 2 `
+ NODE_ARCTYPE=`cat labconfig.json | jq ".lab.racks[].nodes[$units].architecture" | cut -d \" -f 2 `
+
+ if [ "ppc64le" == "$NODE_ARCTYPE" ]; then
+ NODE_ARCHES="ppc64el"
+ elif [ "aarch64" == "$NODE_ARCTYPE" ]; then
+ NODE_ARCHES="arm64"
+ else
+ NODE_ARCHES="amd64"
+ fi
+
+ NODE_ARC="$NODE_ARCHES/generic"
+
+ echo_info "Creating node $NODE_NAME"
+ maas $PROFILE machines create autodetect_nodegroup='yes' name=$NODE_NAME \
+ hostname=$NODE_NAME power_type=$POWER_TYPE power_parameters_power_address=$POWER_IP \
+ power_parameters_power_user=$POWER_USER power_parameters_power_pass=$POWER_PASS \
+ mac_addresses=$MAC_ADDRESS architecture=$NODE_ARC
+ done
fi
maas $PROFILE pods create type=virsh power_address="$VIRSHURL" power_user=$USER
- # make sure nodes are added into MAAS and none of them is in commisoning state
- while [ "$(maas $PROFILE nodes read | grep Commissioning )" ];
+ # Make sure nodes are added into MAAS and none of them is in commissioning state
+ i=0
+ while [ "$(maas $PROFILE nodes read | grep Commissioning )" ];
do
+ echo_info "Waiting for nodes to finish commissioning. ${i} minutes elapsed."
sleep 60
+ i=$[$i+1]
+
+ # Make sure that no nodes have failed commissioning or testing
+ if [ "$(maas $PROFILE nodes read | grep 'Failed' )" ];
+ then
+ echo "Error: Some nodes have failed commissioning or testing" 1>&2
+ exit 1
+ fi
+
done
}
sudo ./maas-reconfigure-region.sh $MAAS_IP
sleep 120
-#lets add the nodes now. Currently works only for virtual deploymnet.
+# Let's add the nodes now. Currently works only for virtual deployment.
addnodes
-echo "... Deployment of maas finish ...."
+echo_info "Initial deployment of MAAS finished"
#Added the Qtip public to run the Qtip test after install on bare metal nodes.
#maas $PROFILE sshkeys new key="`cat ./maas/sshkeys/QtipKey.pub`"
echo " auth-types: [oauth1]" >> maas-cloud.yaml
echo " endpoint: $API_SERVERMAAS" >> maas-cloud.yaml
+ echo_info "Adding cloud $cloudname"
juju add-cloud $cloudname maas-cloud.yaml --replace
}
# Get the NAME/SYS_ID of this node
NODE_NAME=$(cat labconfig.json | jq --raw-output ".lab.racks[0].nodes[$NODE_ID].name")
NODE_SYS_ID=$(maas $PROFILE nodes read | jq -r ".[] | select(.hostname==\"$NODE_NAME\")".system_id)
- echo ">>> Configuring node $NODE_NAME [$NODE_ID][$NODE_SYS_ID]"
+ echo_info ">>> Configuring node $NODE_NAME [$NODE_ID][$NODE_SYS_ID]"
# Recover the network interfaces list and configure each one
# with sorting the list, we have hardware interface first, than the vlan interfaces
IF_LIST=$(cat labconfig.json | jq --raw-output ".lab.racks[0].nodes[$NODE_ID].nics[] ".ifname | sort -u )
'data') IF_MODE='AUTO' ;;
'public') IF_MODE='AUTO' ;;
'storage') IF_MODE='AUTO' ;;
+ 'osapi') IF_MODE='AUTO' ;;
'floating') IF_MODE='link_up' ;;
- *) SUBNET_CIDR='null'; IF_MODE='null'; echo " >>> Unknown SPACE" ;;
+ *) SUBNET_CIDR='null'; IF_MODE='null'; echo_info " >>> Unknown SPACE" ;;
esac
- echo " >>> Configuring interface $IF_NAME [$IF_SPACE][$SUBNET_CIDR]"
+ echo_info " >>> Configuring interface $IF_NAME [$IF_SPACE][$SUBNET_CIDR]"
# if we have a vlan parameter in the space config
IF_VLAN=$(cat labconfig.json | jq --raw-output ".opnfv.spaces[] | select(.type==\"$IF_SPACE\")".vlan)
# In case of a VLAN interface
if ([ $IF_VLAN ] && [ "$IF_VLAN" != "null" ]); then
- echo " >>> Configuring VLAN $IF_VLAN"
+ echo_info " >>> Configuring VLAN $IF_VLAN"
VLANID=$(maas $PROFILE subnets read | jq ".[].vlan | select(.vid==$IF_VLAN)".id)
- FABRICID=$(maas $PROFILE subnets read | jq ".[].vlan | select(.vid==$IF_VLAN)".fabric_id)
- INTERFACE=$(maas $PROFILE interfaces read $NODE_SYS_ID | jq ".[] | select(.vlan.fabric_id==$FABRICID)".id)
+ if ([ $VLANID ] && [ "$VLANID" != "null" ]); then
+ FABRICID=$(maas $PROFILE subnets read | jq ".[].vlan | select(.vid==$IF_VLAN)".fabric_id)
+ if ([ $FABRICID ] && [ "$FABRICID" != "null" ]); then
+ INTERFACE=$(maas $PROFILE interfaces read $NODE_SYS_ID | jq ".[] | select(.vlan.fabric_id==$FABRICID)".id)
+ fi
+ fi
if [[ -z $INTERFACE ]]; then
# parent interface is not set because it does not have a SUBNET_CIDR
PARENT_VLANID=$(maas $PROFILE fabrics read | jq ".[].vlans[] | select(.fabric_id==$FABRICID and .name==\"untagged\")".id)
maas $PROFILE interface link-subnet $NODE_SYS_ID $IF_NAME mode=$IF_MODE subnet=$SUBNET_CIDR || true
sleep 2
else
- echo " >>> Not configuring, we have an empty Subnet CIDR"
+ echo_info " >>> Not configuring, we have an empty Subnet CIDR"
fi
done
#
# End of scripts
#
-echo " .... MAAS deployment finished successfully ...."
+echo_info "MAAS deployment finished successfully"