Merge "Auto Generated INFO.yaml file"
[joid.git] / ci / 03-maasdeploy.sh
index 992be83..73b789f 100755 (executable)
@@ -21,9 +21,16 @@ 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
@@ -46,20 +53,43 @@ 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
+sudo apt-get update -y || true
 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 apt-add-repository cloud-archive:ocata -y
-sudo apt-get update -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 \
+
+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
+             openssh-server vlan ipmitool jq expect snap -y --allow-unauthenticated
+fi
 
-sudo -H pip install --upgrade pip
+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
@@ -133,9 +163,7 @@ PRIMARY_RACK_CONTROLLER="$MAAS_IP"
 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
@@ -181,7 +209,6 @@ sudo virsh pool-define-as default --type dir --target /var/lib/libvirt/images/ |
 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
     sed -i '/dhcp/d' default-net-org.xml
@@ -189,7 +216,18 @@ if [ "$virtinstall" -eq 1 ]; then
     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
 
 #
@@ -202,23 +240,46 @@ if [ $(pip list --format=columns | grep google-api-python-client | wc -l) == 1 ]
     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
 
+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/
@@ -226,18 +287,12 @@ sudo cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
 #
 configuremaas(){
     #reconfigure maas with correct MAAS address.
-    #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
-
-    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
@@ -245,6 +300,14 @@ 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 admin-api internal-api public-api \
@@ -258,11 +321,21 @@ configuremaas(){
     maas $PROFILE boot-source update $SOURCE_ID \
          url=$URL keyring_filename=$KEYRING_FILE || true
 
+    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
+
     if [ $NODE_ARCTYPE != "x86_64" ] ; then
-        maas $PROFILE boot-source-selection update 1 1 arches="$NODE_ARCHES"
+        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
 
-    maas $PROFILE boot-resources import || true
+    if [ "$snapinstall" -eq "0" ]; then
+        maas $PROFILE boot-resources import || true
+    fi
 
     while [ "$(maas $PROFILE boot-resources is-importing)" == "true" ];
     do
@@ -271,7 +344,6 @@ configuremaas(){
 }
 
 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`
@@ -290,7 +362,7 @@ setupspacenetwork(){
             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
+                maas $PROFILE subnet update $SPACE_CIDR gateway_ip=$SPACE_GWAY || true
             fi
             if ([ $NET_VLAN_VID ] && [ $NET_VLAN_VID == "0" ]); then
                 config_done=1
@@ -299,7 +371,7 @@ setupspacenetwork(){
             else
                 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
+                    maas $PROFILE subnet update $SPACE_CIDR vlan=$NET_VLAN_ID || true
                     NET_FABRIC_VID=$SPACE_VLAN
                 fi
             fi
@@ -311,16 +383,16 @@ setupspacenetwork(){
                 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
+                        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
+                        maas $PROFILE subnets create fabric=$FABRIC_ID cidr=$SPACE_CIDR vid=$VID_ID || true
                     fi
                     NET_FABRIC_VID=$VLAN_ID
                 else
                     if ([ $SPACE_GWAY ] && [ "$SPACE_GWAY" != "null" ]); then
-                        maas $PROFILE subnets create fabric=$FABRIC_ID cidr=$SPACE_CIDR vid="0" gateway_ip=$SPACE_GWAY
+                        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"
+                        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)
@@ -341,7 +413,7 @@ setupspacenetwork(){
         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
+                maas $PROFILE vlan update $NET_FABRIC_ID $JUJU_VLAN_VID space=$JUJU_SPACE_ID || true
             fi
         fi
         if ([ $type == "admin" ]); then
@@ -363,14 +435,36 @@ setupspacenetwork(){
                 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
+        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
@@ -390,9 +484,7 @@ addnodes(){
         VIRSHIP=""  # TODO: parse from $VIRSHURL if needed
     fi
 
-    if [ "$virtinstall" -eq 1 ]; then
-        netw=" --network bridge=virbr0,model=virtio"
-    elif ([ "$VIRSHHOST" != "" ]); then
+    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"
@@ -401,7 +493,7 @@ addnodes(){
     else
         netw=""
 
-        brid=`brctl show | grep 8000 | cut -d "8" -f 1 |  tr "\n" " " | tr "    " " " | tr -s " "`
+        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
@@ -427,8 +519,8 @@ addnodes(){
 
     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 \
-                 --print-xml | tee bootstrap
+                 $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`
@@ -440,7 +532,6 @@ addnodes(){
         done
     fi
     virsh -c $VIRSHURL define --file bootstrap
-    virsh -c $VIRSHURL autostart bootstrap
 
     rm -f bootstrap
 
@@ -464,11 +555,11 @@ addnodes(){
 
             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 --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`
             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 \
@@ -510,7 +601,20 @@ addnodes(){
         done
     fi
 
-    maas $PROFILE pods create type=virsh power_address="$VIRSHURL" power_user=$USER
+     # 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
@@ -540,10 +644,12 @@ sleep 30
 
 setupspacenetwork
 
-#just make sure rack controller has been synced and import only
-# just whether images have been imported or not.
-sudo ./maas-reconfigure-region.sh $MAAS_IP
-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
 
 # Let's add the nodes now. Currently works only for virtual deployment.
 addnodes
@@ -555,7 +661,6 @@ echo_info "Initial deployment of MAAS finished"
 #maas $PROFILE sshkeys new key="`cat ./maas/sshkeys/DominoKey.pub`"
 
 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`
 
@@ -585,7 +690,6 @@ addcloud() {
 #
 # Enable MAAS nodes interfaces
 #
-API_KEY=`sudo maas-region apikey --username=ubuntu`
 maas login $PROFILE $API_SERVERMAAS $API_KEY
 
 if [ -e ./labconfig.json ]; then