modified to autostart the VMs created for bootstrap and virtual
[joid.git] / ci / 03-maasdeploy.sh
index 0207e89..668eab9 100755 (executable)
@@ -2,7 +2,25 @@
 #placeholder for deployment script.
 set -ex
 
-source tools.sh
+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
@@ -12,16 +30,19 @@ if [ ! -e $HOME/.ssh/id_rsa ]; then
 fi
 
 NODE_ARCTYPE=`arch`
-NODE_ARC="amd64/generic"
+CPU_MODEL="host"
 
-if [ "x86_64" == "$NODE_ARCTYPE" ]; then
-    NODE_ARC="amd64/generic"
-elif  [ "ppc64le" == "$NODE_ARCTYPE" ]; then
-    NODE_ARC='ppc64el'
+if  [ "ppc64le" == "$NODE_ARCTYPE" ]; then
+    NODE_ARCHES="ppc64el"
+elif [ "aarch64" == "$NODE_ARCTYPE" ]; then
+    NODE_ARCHES="arm64"
+    CPU_MODEL="host-passthrough"
 else
-    NODE_ARC=$NODE_ARCTYPE
+    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
@@ -41,53 +62,57 @@ sudo apt-get install bridge-utils openssh-server bzr git virtinst qemu-kvm libvi
 
 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
-echo_info "Parsing lab configuration file"
+
 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
 
@@ -96,8 +121,8 @@ python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, i
 
 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`
@@ -211,7 +236,7 @@ installmaas(){
 #
 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
@@ -232,9 +257,9 @@ configuremaas(){
 
     #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_info "Creating the space $space"
         maas $PROFILE spaces create name=$space || true
@@ -243,6 +268,10 @@ configuremaas(){
     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" ];
@@ -254,7 +283,7 @@ configuremaas(){
 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
@@ -311,9 +340,10 @@ setupspacenetwork(){
             '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='' ;;
+            '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)
@@ -325,7 +355,7 @@ setupspacenetwork(){
             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}
@@ -356,6 +386,8 @@ addnodes(){
     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')
@@ -370,7 +402,7 @@ addnodes(){
 
     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"
@@ -383,7 +415,7 @@ addnodes(){
         ADMIN_BR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="admin")'.bridge | cut -d \" -f 2 `
 
         for feature in $brid; do
-            if [ "$feature" == "$ADMIN_BR" ]; then
+            if ([ "$feature" == "$ADMIN_BR" ]); then
                 netw=$netw" --network bridge="$feature",model=virtio"
             else
                 netw=$netw
@@ -403,10 +435,10 @@ addnodes(){
 
     echo_info "Creating and adding bootstrap node"
 
-    virt-install --connect $VIRSHURL --name bootstrap --ram 4098 --cpu host --vcpus 2 --video \
-                 cirrus --disk size=20,format=qcow2,bus=virtio,cache=directsync,io=native,pool=default \
+    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`
@@ -418,6 +450,8 @@ addnodes(){
         done
     fi
     virsh -c $VIRSHURL define --file bootstrap
+    virsh -c $VIRSHURL autostart bootstrap
+
     rm -f bootstrap
 
     sleep 60
@@ -438,12 +472,14 @@ addnodes(){
            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 \
@@ -460,26 +496,27 @@ addnodes(){
             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 `
             NODE_ARCTYPE=`cat labconfig.json |  jq ".lab.racks[].nodes[$units].architecture" | cut -d \" -f 2 `
 
-            if [ "x86_64" == "$NODE_ARCTYPE" ]; then
-                NODE_ARC="amd64/generic"
-            elif  [ "ppc64le" == "$NODE_ARCTYPE" ]; then
-                NODE_ARC='ppc64el'
+            if  [ "ppc64le" == "$NODE_ARCTYPE" ]; then
+                NODE_ARCHES="ppc64el"
+            elif [ "aarch64" == "$NODE_ARCTYPE" ]; then
+                NODE_ARCHES="arm64"
             else
-                NODE_ARC=$NODE_ARCTYPE
+                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
+                power_parameters_power_user=$POWER_USER power_parameters_power_pass=$POWER_PASS \
+                mac_addresses=$MAC_ADDRESS architecture=$NODE_ARC
         done
     fi
 
@@ -581,6 +618,7 @@ if [ -e ./labconfig.json ]; then
                 '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_info "      >>> Unknown SPACE" ;;
             esac
@@ -599,8 +637,12 @@ if [ -e ./labconfig.json ]; then
             if ([ $IF_VLAN ] && [ "$IF_VLAN" != "null" ]); then
                 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)
@@ -654,4 +696,4 @@ fi
 #
 # End of scripts
 #
-echo_info " .... MAAS deployment finished successfully ...."
+echo_info "MAAS deployment finished successfully"