Merge "Auto Generated INFO.yaml file"
[joid.git] / ci / 03-maasdeploy.sh
index 48d886b..73b789f 100755 (executable)
 #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
+snapinstall=0
+
+opnfvdistro=`cat /etc/lsb-release | grep CODENAME | cut -d "=" -f 2`
+
+if [ "bionic" == "$opnfvdistro" ]; then
+    snapinstall=1
+fi
+
 
 if [ ! -e $HOME/.ssh/id_rsa ]; then
     ssh-keygen -N '' -f $HOME/.ssh/id_rsa
 fi
 
-#install the packages needed
-sudo apt-add-repository ppa:juju/stable -y
-sudo apt-add-repository ppa:maas/stable -y
-sudo apt-add-repository cloud-archive:ocata -y
-sudo apt-get update -y
+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-key adv --keyserver keyserver.ubuntu.com --recv-keys 5EDB1B62EC4926EA
+sudo apt-get update -y || true
+sudo apt-get install software-properties-common -y
+
+if [ "$snapinstall" -eq "0" ]; then
+    sudo apt-add-repository ppa:juju/stable -y
+    sudo apt-add-repository ppa:maas/stable -y
+fi
+if [ "bionic" != "$opnfvdistro" ]; then
+        sudo apt-add-repository cloud-archive:queens -y
+    if [ "aarch64" == "$NODE_ARCTYPE" ]; then
+        sudo add-apt-repository ppa:ubuntu-cloud-archive/queens-staging -y
+    fi
+fi
+
+sudo apt-get update -y || true
 #sudo apt-get dist-upgrade -y
-sudo apt-get install bridge-utils openssh-server bzr git virtinst qemu-kvm libvirt-bin juju \
-             maas maas-region-controller python-pip python-psutil python-openstackclient \
-             python-congressclient gsutil charm-tools pastebinit python-jinja2 sshpass \
-             openssh-server vlan ipmitool jq expect -y
 
-sudo pip install --upgrade pip
+if [ "$snapinstall" -eq "1" ]; then
+    sudo apt-get install bridge-utils openssh-server bzr git virtinst qemu-kvm libvirt-bin \
+             maas maas-region-controller juju python-pip python-psutil python-openstackclient \
+             python-congressclient gsutil pastebinit python-jinja2 sshpass \
+             openssh-server vlan ipmitool jq expect snap -y --allow-unauthenticated
+    sudo service ntp stop
+    sudo snap install charm
+    sudo snap install --devmode --stable maas
+else
+    sudo apt-get install bridge-utils openssh-server bzr git virtinst qemu-kvm libvirt-bin \
+             maas maas-region-controller juju python-pip python-psutil python-openstackclient \
+             python-congressclient gsutil charm-tools pastebinit python-jinja2 sshpass \
+             openssh-server vlan ipmitool jq expect snap -y --allow-unauthenticated
+fi
 
-#first parameter should be custom and second should be either
-# absolute location of file (including file name) or url of the
-# file to download.
+if [ "aarch64" == "$NODE_ARCTYPE" ]; then
+    sudo apt-get install qemu qemu-efi qemu-system-aarch64 -y --allow-unauthenticated
+fi
 
+sudo -H pip install --upgrade pip
 
 #
 # 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
 
@@ -76,28 +149,21 @@ 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`
 MAIN_ARCHIVE=`grep "main_archive" deployconfig.yaml | cut -d ':' -f 2-3 | sed -e 's/ //'`
-URL=https://images.maas.io/ephemeral-v2/daily/
+URL=https://images.maas.io/ephemeral-v3/daily/
 KEYRING_FILE=/usr/share/keyrings/ubuntu-cloudimage-keyring.gpg
 SOURCE_ID=1
 FABRIC_ID=1
 PRIMARY_RACK_CONTROLLER="$MAAS_IP"
-SUBNET_CIDR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="admin")'.cidr | cut -d \" -f 2 `
-SUBNETDATA_CIDR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="data")'.cidr | cut -d \" -f 2 `
-SUBNETPUB_CIDR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="public")'.cidr | cut -d \" -f 2 `
-SUBNETSTOR_CIDR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="storage")'.cidr | cut -d \" -f 2 `
-SUBNETFLOAT_CIDR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="floating")'.cidr | cut -d \" -f 2 `
 VLAN_UNTTAGED="untagged"
 
 # In the case of a virtual deployment get deployconfig.yaml
-if [ "$virtinstall" -eq 1 ]; then
-    ./cleanvm.sh || true
-fi
+./cleanvm.sh || true
 
 #create backup directory
 mkdir ~/joid_config/ || true
@@ -126,7 +192,7 @@ else
     sudo mv 90-joid-init /etc/sudoers.d/
 fi
 
-echo "... Deployment of maas Started ...."
+echo_info "Deployment of MAAS started"
 
 #
 # Virsh preparation
@@ -134,20 +200,34 @@ echo "... Deployment of maas Started ...."
 
 # define the pool and try to start even though its already exist.
 # For fresh install this may or may not there.
-sudo adduser $USER libvirtd
+#some system i am seeing libvirt and some have libvirtd looks like libvirt-bin is
+#keep switching so lets try both.
+
+sudo adduser $USER libvirtd || true
+sudo adduser $USER libvirt || true
 sudo virsh pool-define-as default --type dir --target /var/lib/libvirt/images/ || true
 sudo virsh pool-start default || true
 sudo virsh pool-autostart default || true
 
-# In case of virtual install set network
 if [ "$virtinstall" -eq 1 ]; then
     sudo virsh net-dumpxml default > default-net-org.xml
-    sudo sed -i '/dhcp/d' default-net-org.xml
-    sudo sed -i '/range/d' default-net-org.xml
-    sudo virsh net-define default-net-org.xml
+    sed -i '/dhcp/d' default-net-org.xml
+    sed -i '/range/d' default-net-org.xml
     sudo virsh net-destroy default
+    sudo virsh net-define default-net-org.xml
     sudo virsh net-start default
+    sudo virsh net-autostart default || true
     rm -f default-net-org.xml
+else
+    # As we use kvm so setup network on admin network
+    ADMIN_BR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="admin")'.bridge | cut -d \" -f 2 `
+    sed -i "s@brAdm@$ADMIN_BR@" net.xml
+    sudo virsh net-destroy default || true
+    sudo virsh net-undefine default || true
+    sudo virsh net-define net.xml || true
+    sudo virsh net-autostart default || true
+    sudo virsh net-start default || true
+    sudo virsh net-autostart default || true
 fi
 
 #
@@ -156,35 +236,50 @@ fi
 
 # To avoid problem between apiclient/maas_client and apiclient from google
 # we remove the package google-api-python-client from yardstick installer
-if [ $(pip list |grep google-api-python-client |wc -l) == 1 ]; then
+if [ $(pip list --format=columns | grep google-api-python-client | wc -l) == 1 ]; then
     sudo pip uninstall google-api-python-client
 fi
 
-
-if [ ! -e ~maas/.ssh/id_rsa.pub ]; then
-    if [ ! -e $HOME/id_rsa_maas.pub ]; then
-        [ -e $HOME/id_rsa_maas ] && rm -f $HOME/id_rsa_maas
-        sudo su - $USER -c "echo |ssh-keygen -t rsa -f $HOME/id_rsa_maas"
+if [ "$snapinstall" -eq "0" ]; then
+    if [ ! -e ~maas/.ssh/id_rsa.pub ]; then
+        if [ ! -e $HOME/id_rsa_maas.pub ]; then
+            [ -e $HOME/id_rsa_maas ] && rm -f $HOME/id_rsa_maas
+            sudo su - $USER -c "echo |ssh-keygen -t rsa -f $HOME/id_rsa_maas"
+        fi
+        sudo -u maas mkdir ~maas/.ssh/ || true
+        sudo cp $HOME/id_rsa_maas ~maas/.ssh/id_rsa
+        sudo cp $HOME/id_rsa_maas.pub ~maas/.ssh/id_rsa.pub
+        sudo chown maas:maas ~maas/.ssh/id_rsa
+        sudo chown maas:maas ~maas/.ssh/id_rsa.pub
+        sudo cat ~maas/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
+    fi
+else
+    if [ ! -e /root/.ssh/id_rsa.pub ]; then
+        if [ ! -e $HOME/id_rsa_maas.pub ]; then
+            [ -e $HOME/id_rsa_maas ] && rm -f $HOME/id_rsa_maas
+            sudo su - $USER -c "echo |ssh-keygen -t rsa -f $HOME/id_rsa_maas"
+        fi
+        sudo -u root mkdir /root/.ssh/ || true
+        sudo cp $HOME/id_rsa_maas /root/.ssh/id_rsa
+        sudo cp $HOME/id_rsa_maas.pub /root/.ssh/id_rsa.pub
+        sudo chown root:root /root/.ssh/id_rsa
+        sudo chown root:root /root/.ssh/id_rsa.pub
+        sudo cat /root/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
     fi
-    sudo -u maas mkdir ~maas/.ssh/ || true
-    sudo cp $HOME/id_rsa_maas ~maas/.ssh/id_rsa
-    sudo cp $HOME/id_rsa_maas.pub ~maas/.ssh/id_rsa.pub
-    sudo chown maas:maas ~maas/.ssh/id_rsa
-    sudo chown maas:maas ~maas/.ssh/id_rsa.pub
 fi
 
 # Ensure virsh can connect without ssh auth
-sudo cat ~maas/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
 sudo cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
 
-#
-# MAAS deploy
-#
-
-installmaas(){
-    sudo apt-get install maas maas-region-controller -y
-}
-
+if [ "$snapinstall" -eq "1" ]; then
+    sudo maas init --mode all --maas-url http://$MAAS_IP:5240/MAAS --admin-username $PROFILE \
+                   --admin-password $PROFILE --admin-email ubuntu@ubuntu.com || true
+    API_KEY=`sudo maas apikey --username=$PROFILE`
+else
+    sudo maas-rack config --region-url http://$MAAS_IP:5240/MAAS
+    sudo maas createadmin --username=$PROFILE --email=ubuntu@ubuntu.com --password=$PROFILE || true
+    API_KEY=`sudo maas-region apikey --username=$PROFILE`
+fi
 #
 # MAAS config
 # https://insights.ubuntu.com/2016/01/23/maas-setup-deploying-openstack-on-maas-1-9-with-juju/
@@ -192,18 +287,12 @@ installmaas(){
 #
 configuremaas(){
     #reconfigure maas with correct MAAS address.
-    #Below code is needed as MAAS have issue in commisoning without restart.
-    sudo ./maas-reconfigure-region.sh $MAAS_IP
-    sleep 30
-    sudo maas-rack config --region-url http://$MAAS_IP:5240/MAAS
-
-    sudo maas createadmin --username=ubuntu --email=ubuntu@ubuntu.com --password=ubuntu || true
-    API_KEY=`sudo maas-region apikey --username=ubuntu`
     maas login $PROFILE $API_SERVERMAAS $API_KEY
     maas $PROFILE maas set-config name='main_archive' value=$MAIN_ARCHIVE || true
     maas $PROFILE maas set-config name=upstream_dns value=$MY_UPSTREAM_DNS || true
     maas $PROFILE maas set-config name='maas_name' value=$MAAS_NAME || true
     maas $PROFILE maas set-config name='ntp_server' value='ntp.ubuntu.com' || true
+    maas $PROFILE domain update 0 name=$MAAS_NAME  || true
     maas $PROFILE sshkeys create "key=$SSH_KEY" || true
 
     for tag in bootstrap compute control storage
@@ -211,115 +300,127 @@ configuremaas(){
         maas $PROFILE tags create name=$tag || true
     done
 
+    #below tag would be used to enable huge pages for DPDK and SRIOV enablement in Ubuntu kernel via MAAS
+    maas $PROFILE tags create name='opnfv-dpdk' comment='OPNFV DPDK enablement' \
+         kernel_opts='hugepagesz=2M hugepages=1024 hugepagesz=1G hugepages=20 default_hugepagesz=1G intel_iommu=on' || true
+
+    #maas $PROFILE package-repositories create name="Ubuntu  Proposed new" \
+    #     url="http://archive.ubuntu.com/ubuntu" components="main" \
+    #     distributions="xenial-proposed" arches=amd64,i386
+
     #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
+    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
-    maas $PROFILE boot-resources import || true
-    sleep 10
-
-    while [ "$(maas $PROFILE boot-resources is-importing)" == "true" ];
-    do
-        sleep 60
-    done
-}
+    maas $PROFILE boot-source update $SOURCE_ID \
+         url=$URL keyring_filename=$KEYRING_FILE || true
 
-setopnfvspaces(){
-    # Create spaces
-    for sp in admin tenant-data public-api tenant-api tenant-public; do
-        maas $PROFILE spaces create name=$sp || true
-    done
-}
+    maas $PROFILE boot-source-selections create 1 \
+         os="ubuntu" release="xenial" arches="amd64" \
+         labels="*" || true
+    maas $PROFILE boot-source-selections create 1 \
+         os="ubuntu" release="bionic" arches="amd64" \
+         labels="*" || true
 
-getfabrichostingnet(){
-    SUBN_CIDR=$1
-    NET_FABRIC_NAME=$(maas $PROFILE subnets read | jq -r ".[] |  select(.cidr==\"$SUBN_CIDR\")".vlan.fabric)
-    NET_FABRIC_ID=$(maas $PROFILE fabric read $NET_FABRIC_NAME | jq -r ".id")
-}
+    if [ $NODE_ARCTYPE != "x86_64" ] ; then
+        maas $PROFILE boot-source-selection update 1 1 arches="$NODE_ARCHES" || true
+        maas $PROFILE boot-source-selection update 1 2 arches="$NODE_ARCHES" || true
+    fi
 
-deleteexistingnetw(){
-    CIDR_LIST=$(cat labconfig.json | jq --raw-output ".opnfv.spaces[]".cidr | grep -v null)
-    for CIDR in $CIDR_LIST; do
-        NETID=$(maas $PROFILE subnets read | jq ".[] | select(.cidr==\"$CIDR\")".id)
-        maas $PROFILE subnet delete $NETID
-    done
-}
+    if [ "$snapinstall" -eq "0" ]; then
+        maas $PROFILE boot-resources import || true
+    fi
 
-deleteunusednetw(){
-    USED_CIDR_LIST=$(cat labconfig.json | jq --raw-output ".opnfv.spaces[]".cidr | grep -v null)
-    CIDR_LIST=$(maas $PROFILE networks read | jq -r ".[].description")
-    for CIDR in $CIDR_LIST; do
-        if [[ $USED_CIDR_LIST != *$CIDR* ]]; then
-            NETID=$(maas $PROFILE subnets read | jq ".[] | select(.cidr==\"$CIDR\")".id)
-            maas $PROFILE subnet delete $NETID
-        fi
+    while [ "$(maas $PROFILE boot-resources is-importing)" == "true" ];
+    do
+        sleep 60
     done
 }
 
-setopnfvfabrics(){
-
-    # Based on first node we get the fabric mapping
-    NODE_0_MAC_LIST=$(cat labconfig.json | jq --raw-output ".lab.racks[0].nodes[0].nics[] ".mac[] | sort -u)
-    FAB_ID=1
-    for MAC in $NODE_0_MAC_LIST; do
-        # Get the spaces attached to a mac
-        IF_SPACES=$(cat labconfig.json | jq --raw-output ".lab.racks[0].nodes[$NODE_ID].nics[] | select(.mac[] | contains(\"$MAC\")) ".spaces[])
-        if [[ $IF_SPACES == *admin* ]]; then
-            # Reuse fabric 0 to be sure the interface i hosted by the jumphost (assuming it is the first one)
-            FABRIC_ID=$ADMIN_FABRIC_ID
-            maas $PROFILE fabric update $FABRIC_ID name=opnfv$FAB_ID
-        else
-            # Create a new fabric
-            FABRIC_ID=$(maas $PROFILE fabrics create name=opnfv$FAB_ID| jq --raw-output ".id")
-        fi
-        # Create the network attached to a space
-        for SPACE in $IF_SPACES; do
-            # First check if this space have a vlan
-            SP_VLAN=$(cat labconfig.json | jq --raw-output ".opnfv.spaces[] | select(.type==\"$SPACE\")".vlan)
-            # Create it if needed
-            if ([ $SP_VLAN ] && [ "$SP_VLAN" != "null" ]); then
-                maas $PROFILE vlans create $FABRIC_ID vid=$SP_VLAN
-                VID=$SP_VLAN
-                VID_REQ="vid=$SP_VLAN"
+setupspacenetwork(){
+    #get space, subnet and vlan and create accordingly.
+    #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
+        SPACE_CIDR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="'$type'")'.cidr | cut -d \" -f 2 `
+        SPACE_VLAN=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="'$type'")'.vlan | cut -d \" -f 2 `
+        SPACE_GWAY=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="'$type'")'.gateway | cut -d \" -f 2 `
+        NET_FABRIC_NAME=$(maas $PROFILE subnets read | jq -r ".[] |  select(.cidr==\"$SPACE_CIDR\")".vlan.fabric)
+        if ([ $NET_FABRIC_NAME ] && [ $NET_FABRIC_NAME != "null" ]); then
+            NET_FABRIC_VID=$(maas $PROFILE subnets read | jq -r ".[] |  select(.cidr==\"$SPACE_CIDR\")".vlan.vid)
+            NET_FABRIC_ID=$(maas $PROFILE fabric read $NET_FABRIC_NAME | jq -r ".id")
+            if ([ $SPACE_VLAN == "null" ]); then
+                SPACE_VLAN=0
+            fi
+            NET_VLAN_ID=$(maas $PROFILE vlans read $NET_FABRIC_ID | jq -r ".[] |  select(.vid==\"$SPACE_VLAN\")".id)
+            NET_VLAN_VID=$(maas $PROFILE vlans read $NET_FABRIC_ID | jq -r ".[] |  select(.vid==\"$SPACE_VLAN\")".vid)
+            if ([ $SPACE_GWAY ] && [ "$SPACE_GWAY" != "null" ]); then
+                maas $PROFILE subnet update $SPACE_CIDR gateway_ip=$SPACE_GWAY || true
+            fi
+            if ([ $NET_VLAN_VID ] && [ $NET_VLAN_VID == "0" ]); then
+                config_done=1
+            elif ([ $NET_VLAN_VID ] && [ $NET_VLAN_VID == $SPACE_VLAN ]); then
+                config_done=1
             else
-                SP_VLAN=$VLAN_UNTTAGED
-                VID=0
-                VID_REQ=""
+                NET_VLAN_ID=$(maas $PROFILE vlans create $NET_FABRIC_ID vid=$SPACE_VLAN | jq --raw-output ".id")
+                if ([ $NET_VLAN_ID ] && [ $NET_VLAN_ID != "null" ]); then
+                    maas $PROFILE subnet update $SPACE_CIDR vlan=$NET_VLAN_ID || true
+                    NET_FABRIC_VID=$SPACE_VLAN
+                fi
             fi
-            # Create the network
-            case "$SPACE" in
-                'admin')    SUBNET_CIDR=$SUBNET_CIDR;       JUJU_SPACE="admin";         DHCP='enabled' ;;
-                'data')     SUBNET_CIDR=$SUBNETDATA_CIDR;   JUJU_SPACE="tenant-data";   DHCP='' ;;
-                'public')   SUBNET_CIDR=$SUBNETPUB_CIDR;    JUJU_SPACE="public-api";    DHCP='' ;;
-                'storage')  SUBNET_CIDR=$SUBNETSTOR_CIDR;   JUJU_SPACE="tenant-api";    DHCP='' ;;
-                'floating') SUBNET_CIDR=$SUBNETFLOAT_CIDR;  JUJU_SPACE="tenant-public"; DHCP='' ;;
-                *) JUJU_SPACE='null'; DHCP='OFF'; echo "      >>> Unknown SPACE" ;;
-            esac
-            # If we have a network, we create it
-            if ([ $SUBNET_CIDR ] && [ "$SUBNET_CIDR" != "null" ]); then
-                JUJU_SPACE_ID=$(maas $PROFILE spaces read | jq -r ".[] |  select(.name==\"$JUJU_SPACE\")".id)
-                # If subnet exist move it, else create it (to avoid issues with network discovery by maas)
-                if maas $PROFILE subnet read $SUBNET_CIDR; then
-                    TARGET_VLAN=$(maas $PROFILE vlans read $FABRIC_ID | jq -r ".[] | select(".vid"==$VID)".id)
-                    maas $PROFILE subnet update $SUBNET_CIDR vlan=$TARGET_VLAN
+        else
+            if ([ $SPACE_CIDR ] && [ "$SPACE_CIDR" != "null" ]); then
+                FABRIC_ID=$(maas $PROFILE fabrics create name=opnfv$type | jq --raw-output ".id")
+                NET_FABRIC_ID=$FABRIC_ID
+                NET_FABRIC_VID=$SPACE_VLAN
+                if ([ $SPACE_VLAN ] && [ "$SPACE_VLAN" != "null" ]); then
+                    NET_VLAN_ID=$(maas $PROFILE vlans create $FABRIC_ID vid=$SPACE_VLAN | jq --raw-output ".id")
+                    if ([ $SPACE_GWAY ] && [ "$SPACE_GWAY" != "null" ]); then
+                        maas $PROFILE subnets create fabric=$FABRIC_ID cidr=$SPACE_CIDR vid=$VID_ID gateway_ip=$SPACE_GWAY || true
+                    else
+                        maas $PROFILE subnets create fabric=$FABRIC_ID cidr=$SPACE_CIDR vid=$VID_ID || true
+                    fi
+                    NET_FABRIC_VID=$VLAN_ID
                 else
-                    maas $PROFILE subnets create fabric=$FABRIC_ID cidr=$SUBNET_CIDR $VID_REQ space=$JUJU_SPACE_ID
-                fi
-
-                # Add the Gateway
-                GW=$(cat labconfig.json | jq ".opnfv.spaces[] | select(.type==\"$SPACE\")".gateway | cut -d \" -f 2)
-                if ([ $GW ] && [ "$GW" != "null" ]); then
-                    maas $PROFILE subnet update $SUBNET_CIDR gateway_ip=$GW || true
+                    if ([ $SPACE_GWAY ] && [ "$SPACE_GWAY" != "null" ]); then
+                        maas $PROFILE subnets create fabric=$FABRIC_ID cidr=$SPACE_CIDR vid="0" gateway_ip=$SPACE_GWAY || true
+                    else
+                        maas $PROFILE subnets create fabric=$FABRIC_ID cidr=$SPACE_CIDR vid="0" || true
+                    fi
                 fi
+                NET_FABRIC_NAME=$(maas $PROFILE subnets read | jq -r ".[] |  select(.cidr==\"$SPACE_CIDR\")".vlan.fabric)
+            fi
+        fi
+        case "$type" in
+            'admin')           JUJU_SPACE="internal-api";  DHCP='enabled' ;;
+            'data')            JUJU_SPACE="tenant-data";   DHCP='' ;;
+            'public')          JUJU_SPACE="public-api";    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)
+        JUJU_VLAN_VID=$(maas $PROFILE subnets read | jq -r ".[] |  select(.name==\"$SPACE_CIDR\")".vlan.vid)
+        NET_FABRIC_ID=$(maas $PROFILE fabric read $NET_FABRIC_NAME | jq -r ".id")
+        if ([ $NET_FABRIC_ID ] && [ $NET_FABRIC_ID != "null" ]); then
+            if ([ $JUJU_VLAN_VID ] && [ $JUJU_VLAN_VID != "null" ]); then
+                maas $PROFILE vlan update $NET_FABRIC_ID $JUJU_VLAN_VID space=$JUJU_SPACE_ID || true
+            fi
+        fi
+        if ([ $type == "admin" ]); then
+            # If we have a network, we create it
+            if ([ $NET_FABRIC_ID ]); then
                 # Set ranges
-                SUBNET_PREFIX=${SUBNET_CIDR::-5}
+                SUBNET_PREFIX=${SPACE_CIDR::-5}
                 IP_RES_RANGE_LOW="$SUBNET_PREFIX.1"
                 IP_RES_RANGE_HIGH="$SUBNET_PREFIX.39"
                 IP_DYNAMIC_RANGE_LOW="$SUBNET_PREFIX.40"
@@ -331,49 +432,95 @@ setopnfvfabrics(){
                     start_ip=$IP_DYNAMIC_RANGE_LOW end_ip=$IP_DYNAMIC_RANGE_HIGH \
                     comment='This is a reserved dynamic range' || true
                 # Set DHCP
-                if [ $DHCP ]; then
-                    PRIMARY_RACK_CONTROLLER=$(maas $PROFILE rack-controllers read | jq -r '.[0].system_id')
-                    maas $PROFILE vlan update $FABRIC_ID $SP_VLAN dhcp_on=True primary_rack=$PRIMARY_RACK_CONTROLLER || true
-                fi
+                PRIMARY_RACK_CONTROLLER=$(maas $PROFILE rack-controllers read | jq -r '.[0].system_id')
+                maas $PROFILE vlan update $NET_FABRIC_ID $NET_FABRIC_VID dhcp_on=True primary_rack=$PRIMARY_RACK_CONTROLLER || true
             fi
-        done
-        # Increment the fabric ID
-        FAB_ID=$((FAB_ID+1))
+        elif ([ $type == "public" ] || [ $type == "osapi" ]); then
+            # If we have a network, we create reserve IPS for public IP range
+            if ([ $NET_FABRIC_ID ]); then
+                # Set ranges
+                SUBNET_PREFIX=${SPACE_CIDR::-5}
+                IP_RES_RANGE_LOW="$SUBNET_PREFIX.1"
+                IP_RES_RANGE_HIGH="$SUBNET_PREFIX.39"
+                maas $PROFILE ipranges create type=reserved \
+                     start_ip=$IP_RES_RANGE_LOW end_ip=$IP_RES_RANGE_HIGH \
+                     comment='This is a reserved range' || true
+            fi
+        else
+            if ([ $NET_FABRIC_ID ]); then
+                # Set ranges
+                SUBNET_PREFIX=${SPACE_CIDR::-5}
+                IP_RES_RANGE_LOW="$SUBNET_PREFIX.1"
+                IP_RES_RANGE_HIGH="$SUBNET_PREFIX.5"
+                maas $PROFILE ipranges create type=reserved \
+                     start_ip=$IP_RES_RANGE_LOW end_ip=$IP_RES_RANGE_HIGH \
+                     comment='This is a reserved range' || true
+            fi
+        fi
     done
-
 }
 
 addnodes(){
-    API_KEY=`sudo maas-region apikey --username=ubuntu`
     maas login $PROFILE $API_SERVERMAAS $API_KEY
 
+    maas $PROFILE maas set-config name=default_min_hwe_kernel value=hwe-16.04-edge || true
+
     # make sure there is no machine entry in maas
     for m in $(maas $PROFILE machines read | jq -r '.[].system_id')
     do
-        maas ubuntu machine delete $m
+        maas $PROFILE machine delete $m
     done
-
-    if [ "$virtinstall" -eq 1 ]; then
-        netw=" --network bridge=virbr0,model=virtio"
+    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 ([ $VIRSHURL == "" ] || [ "$VIRSHURL" == "null" ]); then
+        VIRSHIP=$MAAS_IP
+        VIRSHURL="qemu+ssh://$USER@$VIRSHIP/system "
+        VIRSHHOST=""
     else
-        brid=`brctl show | grep 8000 | cut -d "8" -f 1 |  tr "\n" " " | tr "    " " " | tr -s " "`
+        VIRSHHOST=$(echo $VIRSHURL| cut -d\/ -f 3 | cut -d@ -f2)
+        VIRSHIP=""  # TODO: parse from $VIRSHURL if needed
+    fi
 
+    if ([ "$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=`sudo 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 `
+
         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
 
-    sudo virt-install --connect qemu:///system --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 \
-                 $netw --boot network,hd,menu=off --noautoconsole \
-                 --vnc --print-xml | tee bootstrap
+    # Add server fingerprint to known hosts to prevent security prompt in the
+    # SSH connection during the virt-install
+    if [ $VIRSHIP != "" ]; then
+        # Check if the IP is not already present among the known hosts
+        if ! ssh-keygen -F $VIRSHIP > /dev/null ; then
+            echo_info "SSH fingerprint of the host is not known yet, adding to known_hosts"
+            ssh-keyscan -H $VIRSHIP >> ~/.ssh/known_hosts
+        fi
+    fi
+
+    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 --video virtio --noautoconsole --autostart \
+                 --accelerate --print-xml | tee bootstrap
 
     if [ "$virtinstall" -eq 1 ]; then
         bootstrapmac=`grep  "mac address" bootstrap | head -1 | cut -d '"' -f 2`
@@ -384,13 +531,16 @@ addnodes(){
             bootstrapmac=$bootstrapmac" mac_addresses="$mac
         done
     fi
-    sudo virsh -c qemu:///system define --file bootstrap
+    virsh -c $VIRSHURL define --file 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='qemu+ssh://'$USER'@'$MAAS_IP'/system' \
-        architecture='amd64/generic' power_parameters_power_id='bootstrap'
+        power_parameters_power_address="$VIRSHURL" \
+        architecture=$NODE_ARC power_parameters_power_id='bootstrap'
 
     bootstrapid=$(maas $PROFILE machines read | jq -r '.[] | select(.hostname == "bootstrap").system_id')
 
@@ -403,44 +553,84 @@ addnodes(){
            units=$(($units - 1));
            NODE_NAME=`cat labconfig.json | jq ".lab.racks[].nodes[$units].name" | cut -d \" -f 2 `
 
-            sudo virt-install --connect qemu:///system --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 --video virtio --noautoconsole --autostart \
+                     --accelerate --print-xml | tee $NODE_NAME
 
             nodemac=`grep  "mac address" $NODE_NAME | head -1 | cut -d '"' -f 2`
-            sudo virsh -c qemu:///system define --file $NODE_NAME
+            virsh -c $VIRSHURL define --file $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='qemu+ssh://'$USER'@'$MAAS_IP'/system' \
-                architecture='amd64/generic' power_parameters_power_id=$NODE_NAME
+                power_parameters_power_address="$VIRSHURL" \
+                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 `
-           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 \
-               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
 
-    # make sure nodes are added into MAAS and none of them is in commisoning state
-    while [ "$(maas $PROFILE nodes read | grep  Commissioning )" ];
+     # Iterate to avoid "Conflict error" issue
+     for ii in 1 2 3 4 5 6 7 8 9 10
+     do
+       echo "Try $ii"
+       maas $PROFILE pods create type=virsh power_address="$VIRSHURL" power_user=$USER > /tmp/deploy.out 2>&1 || true
+       cat /tmp/deploy.out
+       if ! fgrep -q 'Conflict' /tmp/deploy.out
+       then
+         break
+       else
+         continue
+       fi
+     done
+
+
+    # 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
 
 }
@@ -452,79 +642,25 @@ sleep 30
 # functioncall with subnetid to add and second parameter is dhcp enable
 # third parameter will define the space. It is required to have admin
 
-setopnfvspaces
-getfabrichostingnet $SUBNET_CIDR
-ADMIN_FABRIC_ID=$NET_FABRIC_ID
-ADMIN_FABRIC_NAME=$NET_FABRIC_NAME
-deleteexistingnetw
-sleep 30
-setopnfvfabrics
-deleteunusednetw
+setupspacenetwork
 
-#just make sure rack controller has been synced and import only
-# just whether images have been imported or not.
-sleep 120
+if [ "$snapinstall" -eq 0 ]; then
+    sudo sed -i 's/localhost/'$MAAS_IP'/g' /etc/maas/rackd.conf
+    sudo service maas-rackd restart
+    sudo service maas-regiond restart
+    sleep 120
+fi
 
-#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`"
 #maas $PROFILE sshkeys new key="`cat ./maas/sshkeys/DominoKey.pub`"
 
-#
-# Functions for MAAS network customization
-#
-
-#Below function will mark the interfaces in Auto mode to enbled by MAAS
-# using hostname of the node added into MAAS
-enableautomodebyname() {
-    API_KEY=`sudo maas-region apikey --username=ubuntu`
-    maas login $PROFILE $API_SERVERMAAS $API_KEY
-
-    if [ ! -z "$4" ]; then
-        for i in `seq 1 7`;
-        do
-            nodes=$(maas $PROFILE nodes read | jq -r '.[].system_id')
-            if [ ! -z "$nodes" ]; then
-                maas $PROFILE interface link-subnet $nodes $1  mode=$2 subnet=$3 || true
-            fi
-       done
-    fi
-}
-
-#Below function will create vlan and update interface with the new vlan
-# will return the vlan id created
-crvlanupdsubnet() {
-    API_KEY=`sudo maas-region apikey --username=ubuntu`
-    maas login $PROFILE $API_SERVERMAAS $API_KEY
-
-    # TODO: fix subnet creation and use 'jq'
-    newvlanid=`maas $PROFILE vlans create $2 name=$3 vid=$4 | grep resource | cut -d '/' -f 6 `
-    maas $PROFILE subnet update $5 vlan=$newvlanid
-    eval "$1"="'$newvlanid'"
-}
-
-#Below function will create interface with new vlan and bind to physical interface
-crnodevlanint() {
-    API_KEY=`sudo maas-region apikey --username=ubuntu`
-    maas login $PROFILE $API_SERVERMAAS $API_KEY
-
-    for node in $(maas $PROFILE nodes read | jq -r '.[].system_id')
-    do
-        vlanid=$(maas $PROFILE subnets read | jq '.[].vlan | select(.vid=='$1')'.id)
-        fabricid=`maas $PROFILE subnets read | jq '.[].vlan | select(.vid=='$1')'.fabric_id`
-        interface=`maas $PROFILE interfaces read $node | jq '.[] | select(.vlan.fabric_id=='$fabricid')'.id`
-        maas $PROFILE interfaces create-vlan $node vlan=$vlanid parent=$interface || true
-     done
- }
-
-#function for JUJU envronment
-
 addcredential() {
-    API_KEY=`sudo maas-region apikey --username=ubuntu`
     controllername=`awk 'NR==1{print substr($1, 1, length($1)-1)}' deployconfig.yaml`
     cloudname=`awk 'NR==1{print substr($1, 1, length($1)-1)}' deployconfig.yaml`
 
@@ -547,31 +683,13 @@ addcloud() {
     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
 }
 
-#
-# VLAN customization
-#
-
-case "$labname" in
-    'intelpod9' )
-        maas refresh
-        crvlanupdsubnet vlan904 fabric-1 "MgmtNetwork" 904 2 || true
-        crvlanupdsubnet vlan905 fabric-2 "PublicNetwork" 905 3 || true
-        crnodevlanint $vlan905 eth1 || true
-        crnodevlanint $vlan905 eth3 || true
-        enableautomodebyname eth1.905 AUTO "10.9.15.0/24" || true
-        enableautomodebyname eth3.905 AUTO "10.9.15.0/24" || true
-        enableautomodebyname eth0 AUTO "10.9.12.0/24" || true
-        enableautomodebyname eth2 AUTO "10.9.12.0/24" || true
-        ;;
-esac
-
 #
 # Enable MAAS nodes interfaces
 #
-API_KEY=`sudo maas-region apikey --username=ubuntu`
 maas login $PROFILE $API_SERVERMAAS $API_KEY
 
 if [ -e ./labconfig.json ]; then
@@ -582,21 +700,23 @@ if [ -e ./labconfig.json ]; then
         # 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 )
         for IF_NAME in $IF_LIST; do
             # get the space of the interface
             IF_SPACE=$(cat labconfig.json | jq --raw-output ".lab.racks[0].nodes[$NODE_ID].nics[] | select(.ifname==\"$IF_NAME\") ".spaces[])
+            SUBNET_CIDR=`cat labconfig.json | jq '.opnfv.spaces[] | select(.type=="'$IF_SPACE'")'.cidr | cut -d \" -f 2 `
             case "$IF_SPACE" in
-                'data') SUBNET_CIDR=$SUBNETDATA_CIDR; IF_MODE='AUTO' ;;
-                'public') SUBNET_CIDR=$SUBNETPUB_CIDR; IF_MODE='AUTO' ;;
-                'storage') SUBNET_CIDR=$SUBNETSTOR_CIDR; IF_MODE='AUTO' ;;
-                'floating') SUBNET_CIDR=$SUBNETFLOAT_CIDR; IF_MODE='link_up' ;;
-                *) SUBNET_CIDR='null'; IF_MODE='null'; echo "      >>> Unknown SPACE" ;;
+                '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
-            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)
@@ -609,10 +729,14 @@ if [ -e ./labconfig.json ]; then
 
             # 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)
@@ -633,20 +757,22 @@ if [ -e ./labconfig.json ]; then
                 # rename interface if needed
                 IF_MACLOWER=$( cat labconfig.json | jq ".lab.racks[0].nodes[$NODE_ID].nics[] | select(.ifname==\"$IF_NEWNAME\")".mac[0])
                 IF_MAC=(${IF_MACLOWER,,})
-                IF_ID=$( maas ubuntu interfaces read $NODE_SYS_ID | jq ".[] | select(.mac_address==$IF_MAC)".id)
-                maas $PROFILE interface update $NODE_SYS_ID $IF_ID name=$IF_NEWNAME
+                IF_ID=$( maas $PROFILE interfaces read $NODE_SYS_ID | jq ".[] | select(.mac_address==$IF_MAC)".id)
+                if ([ $IF_ID ] && [ "$IF_ID" != "null" ]); then
+                    maas $PROFILE interface update $NODE_SYS_ID $IF_ID name=$IF_NEWNAME
+                fi
             fi
             # Configure the interface
             if ([ $SUBNET_CIDR ] && [ "$SUBNET_CIDR" != "null" ]); then
                 VLANID=$(maas $PROFILE subnet read $SUBNET_CIDR | jq -r '.vlan.id')
                 if !([ $IF_VLAN ] && [ "$IF_VLAN" != "null" ]); then
                     # If this interface is not a VLAN (done withe create-vlan)
-                    maas $PROFILE interface update $NODE_SYS_ID $IF_NAME vlan=$VLANID
+                    maas $PROFILE interface update $NODE_SYS_ID $IF_NAME vlan=$VLANID || true
                 fi
                 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
@@ -654,14 +780,10 @@ if [ -e ./labconfig.json ]; then
 fi
 
 # Add the cloud and controller credentials for MAAS for that lab.
-jujuver=`juju --version`
-
-if [[ "$jujuver" > "2" ]]; then
-    addcloud
-    addcredential
-fi
+addcloud
+addcredential
 
 #
 # End of scripts
 #
-echo " .... MAAS deployment finished successfully ...."
+echo_info "MAAS deployment finished successfully"