X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=ci%2F03-maasdeploy.sh;h=7ccb72d7afd77f1038b1737960a525e2bfc518ff;hb=ff57b174656b762b465d745d5f462484409e147b;hp=0207e89ab2fcdd86c2ee4c91ab968130f5cf3437;hpb=2f823d98d676b0465c01361f1ba942d14a3e974c;p=joid.git diff --git a/ci/03-maasdeploy.sh b/ci/03-maasdeploy.sh index 0207e89a..7ccb72d7 100755 --- a/ci/03-maasdeploy.sh +++ b/ci/03-maasdeploy.sh @@ -2,92 +2,145 @@ #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 " + 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 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-key adv --keyserver keyserver.ubuntu.com --recv-keys 5EDB1B62EC4926EA +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 apt-get install snap -y -#sudo snap install maas --classic -#sudo snap install juju --classic +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 -#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 +149,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` @@ -110,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 @@ -158,16 +209,13 @@ 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 - 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 - rm -f default-net-org.xml -fi +# 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-start default || true # # Cleanup, juju init and config backup @@ -179,31 +227,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 -# -# 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/ @@ -211,13 +274,6 @@ 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 @@ -230,11 +286,19 @@ 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 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,7 +307,13 @@ configuremaas(){ maas $PROFILE boot-source update $SOURCE_ID \ url=$URL keyring_filename=$KEYRING_FILE || true - maas $PROFILE boot-resources import || true + if [ $NODE_ARCTYPE != "x86_64" ] ; then + maas $PROFILE boot-source-selection update 1 1 arches="$NODE_ARCHES" + fi + + if [ "$snapinstall" -eq "0" ]; then + maas $PROFILE boot-resources import || true + fi while [ "$(maas $PROFILE boot-resources is-importing)" == "true" ]; do @@ -252,9 +322,8 @@ 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 @@ -271,7 +340,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 @@ -280,7 +349,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 @@ -292,16 +361,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) @@ -311,9 +380,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) @@ -321,11 +391,11 @@ 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 - # 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} @@ -343,19 +413,43 @@ 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 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') @@ -368,9 +462,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" @@ -379,11 +471,11 @@ 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 - if [ "$feature" == "$ADMIN_BR" ]; then + if ([ "$feature" == "$ADMIN_BR" ]); then netw=$netw" --network bridge="$feature",model=virtio" else netw=$netw @@ -403,10 +495,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 \ - $netw --boot network,hd,menu=off --noautoconsole \ - --vnc --print-xml | tee bootstrap + 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` @@ -418,6 +510,7 @@ addnodes(){ done fi virsh -c $VIRSHURL define --file bootstrap + rm -f bootstrap sleep 60 @@ -438,12 +531,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 --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 + 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,30 +555,44 @@ 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 - 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 @@ -513,10 +622,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 @@ -528,7 +639,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` @@ -558,7 +668,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 @@ -581,6 +690,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 +709,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) @@ -644,14 +758,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_info " .... MAAS deployment finished successfully ...." +echo_info "MAAS deployment finished successfully"