Adds functionality to modify VM resources 94/1394/4
authorTim Rozet <trozet@redhat.com>
Thu, 3 Sep 2015 21:12:11 +0000 (17:12 -0400)
committerTim Rozet <trozet@redhat.com>
Wed, 9 Sep 2015 21:03:29 +0000 (17:03 -0400)
VM resources (vcpus, memory, disk size) are now configurable in the
opnfv_ksgen_settings files.  Each node in the ksgen settings file now
has "memory, cpus, disk" attributes:
 - cpus is an integer number of CPUs to assign to the VM
 - memory is an integer size in kilobytes
 - disk is an integer size in gigabytes

The vagrant box vmdk is resized for each VM.  Each VM will then modify
its partition to the new size, execute the normal reboot, then extend
the physical+logical volumes and filesystem using vagrant provisioning
scripts.

JIRA: APEX-1

Change-Id: I471319db14d2189052961b2f533c65850ebeb1e7
Signed-off-by: Tim Rozet <trozet@redhat.com>
foreman/ci/Vagrantfile
foreman/ci/deploy.sh
foreman/ci/opnfv_ksgen_settings.yml
foreman/ci/opnfv_ksgen_settings_no_HA.yml
foreman/ci/resize_lvm.sh [new file with mode: 0755]
foreman/ci/resize_partition.sh [new file with mode: 0755]

index 5550976..c7dfc03 100644 (file)
@@ -80,10 +80,11 @@ Vagrant.configure(2) do |config|
   #   sudo apt-get update
   #   sudo apt-get install -y apache2
   # SHELL
-  
+
   config.ssh.username = 'root'
   config.ssh.password = 'vagrant'
   config.ssh.insert_key = 'true'
+  config.vm.provision :shell, path: "resize_partition.sh"
   config.vm.provision "ansible" do |ansible|
      ansible.playbook = "reload_playbook.yml"
   end
@@ -97,4 +98,5 @@ Vagrant.configure(2) do |config|
     config.vm.provision :shell, :inline => "systemctl stop dhcpd"
     config.vm.provision :shell, :inline => "systemctl disable dhcpd"
   end
+  config.vm.provision :shell, path: "resize_lvm.sh"
 end
index dcead8b..149695a 100755 (executable)
@@ -29,6 +29,8 @@ declare -A controllers_ip_arr
 declare -A admin_ip_arr
 declare -A public_ip_arr
 
+vagrant_box_dir=~/.vagrant.d/boxes/opnfv-VAGRANTSLASH-centos-7.0/1.0.0/virtualbox/
+vagrant_box_vmdk=box-disk1.vmdk
 vm_dir=/var/opt/opnfv
 script=`realpath $0`
 ##END VARS
@@ -1016,6 +1018,19 @@ start_virtual_nodes() {
       node_type=config_nodes_${node}_type
       node_type=$(eval echo \$$node_type)
 
+      ##modify memory and cpu
+      node_memory=$(eval echo \${config_nodes_${node}_memory})
+      node_vcpus=$(eval echo \${config_nodes_${node}_cpus})
+      node_storage=$(eval echo \${config_nodes_${node}_disk})
+
+      sed -i 's/^.*vb.memory =.*$/     vb.memory = '"$node_memory"'/' Vagrantfile
+      sed -i 's/^.*vb.cpus =.*$/     vb.cpus = '"$node_vcpus"'/' Vagrantfile
+
+      if ! resize_vagrant_disk $node_storage; then
+        echo "${red}Error while resizing vagrant box to size $node_storage for $node! ${reset}"
+        exit 1
+      fi
+
       ##trozet test make compute nodes wait 20 minutes
       if [ "$compute_wait_completed" = false ] && [ "$node_type" != "controller" ]; then
         echo "${blue}Waiting 20 minutes for Control nodes to install before continuing with Compute nodes..."
@@ -1094,11 +1109,6 @@ start_virtual_nodes() {
       sed -i 's/bootstrap.sh/vm_nodes_provision.sh/' Vagrantfile
       ## modify default_gw to be node_default_gw
       sed -i 's/^.*default_gw =.*$/  default_gw = '\""$node_default_gw"\"'/' Vagrantfile
-      ## modify VM memory to be 4gig
-      ##if node type is controller
-      if [ "$node_type" == "controller" ]; then
-        sed -i 's/^.*vb.memory =.*$/     vb.memory = 4096/' Vagrantfile
-      fi
       echo "${blue}Starting Vagrant Node $node! ${reset}"
       ##stand up vagrant
       if ! vagrant up; then
@@ -1205,6 +1215,77 @@ check_baremetal_nodes() {
   fi
 }
 
+##resizes vagrant disk (cannot shrink)
+##params: size in GB
+##usage: resize_vagrant_disk 100
+resize_vagrant_disk() {
+  if [[ "$1" < 40 ]]; then
+    echo "${blue}Warn: Requested disk size cannot be less than 40, using 40 as new size${reset}"
+    new_size_gb=40
+  else
+    new_size_gb=$1
+  fi
+
+  if ! vagrant box list | grep opnfv; then
+    vagrant box remove -f opnfv/centos-7.0
+    if ! vagrant box add opnfv/centos-7.0 --provider virtualbox; then
+      echo "${red}Unable to reclone vagrant box! Exiting...${reset}"
+      exit 1
+    fi
+  fi
+
+  pushd $vagrant_box_dir
+
+  # Close medium to make sure we can modify it
+  vboxmanage closemedium disk $vagrant_box_vmdk
+
+  cur_size=$(vboxmanage showhdinfo $vagrant_box_vmdk | grep -i capacity | grep -Eo [0-9]+)
+  cur_size_gb=$((cur_size / 1024))
+
+  if [ "$cur_size_gb" -eq "$new_size_gb" ]; then
+    echo "${blue}Info: Disk size already ${cur_size_gb} ${reset}"
+    popd
+    return
+  elif [[ "$new_size_gb" < "$cur_size_gb" ]] ; then
+    echo "${blue}Info: Requested disk is less than ${cur_size_gb} ${reset}"
+    echo "${blue}Re-adding vagrant box${reset}"
+    if vagrant box list | grep opnfv; then
+      popd
+      vagrant box remove -f opnfv/centos-7.0
+      if ! vagrant box add opnfv/centos-7.0 --provider virtualbox; then
+        echo "${red}Unable to reclone vagrant box! Exiting...${reset}"
+        exit 1
+      fi
+      pushd $vagrant_box_dir
+    fi
+  fi
+
+  new_size=$((new_size_gb * 1024))
+  if ! vboxmanage clonehd $vagrant_box_vmdk tmp-disk.vdi --format vdi; then
+    echo "${red}Error: Unable to clone ${vagrant_box_vmdk}${reset}"
+    popd
+    return 1
+  fi
+
+  if ! vboxmanage modifyhd tmp-disk.vdi --resize $new_size; then
+    echo "${red}Error: Unable modify tmp-disk.vdi to ${new_size}${reset}"
+    popd
+    return 1
+  fi
+
+  if  ! vboxmanage clonehd tmp-disk.vdi resized-disk.vmdk --format vmdk; then
+    echo "${red}Error: Unable clone tmp-disk.vdi to vmdk${reset}"
+    popd
+    return 1
+  fi
+
+  vboxmanage closemedium disk tmp-disk.vdi --delete
+  rm -f tmp-disk.vdi $vagrant_box_vmdk
+  cp -f resized-disk.vmdk $vagrant_box_vmdk
+  vboxmanage closemedium disk resized-disk.vmdk --delete
+  popd
+}
+
 ##END FUNCTIONS
 
 main() {
index b41a41b..0478c60 100644 (file)
@@ -114,6 +114,9 @@ nodes:
     admin_ip: compute_admin
     ansible_ssh_pass: "Op3nStack"
     admin_password: ""
+    cpus: 2
+    memory: 2048
+    disk: 40
     groups:
     - compute
     - foreman_nodes
@@ -137,6 +140,9 @@ nodes:
     private_mac: "10:23:45:67:87:AC"
     ansible_ssh_pass: "Op3nStack"
     admin_password: "octopus"
+    cpus: 2
+    memory: 4096
+    disk: 40
     groups:
     - controller
     - foreman_nodes
@@ -160,6 +166,9 @@ nodes:
     private_mac: "10:23:45:67:87:AD"
     ansible_ssh_pass: "Op3nStack"
     admin_password: "octopus"
+    cpus: 2
+    memory: 4096
+    disk: 40
     groups:
     - controller
     - foreman_nodes
@@ -183,6 +192,9 @@ nodes:
     private_mac: "10:23:45:67:87:AE"
     ansible_ssh_pass: "Op3nStack"
     admin_password: "octopus"
+    cpus: 2
+    memory: 4096
+    disk: 40
     groups:
     - controller
     - foreman_nodes
index 79db257..80a66a6 100644 (file)
@@ -81,6 +81,9 @@ nodes:
     admin_ip: compute_admin
     ansible_ssh_pass: "Op3nStack"
     admin_password: ""
+    cpus: 2
+    memory: 2048
+    disk: 40
     groups:
     - compute
     - foreman_nodes
@@ -104,6 +107,9 @@ nodes:
     private_mac: "10:23:45:67:87:AC"
     ansible_ssh_pass: "Op3nStack"
     admin_password: "octopus"
+    cpus: 2
+    memory: 4096
+    disk: 40
     groups:
     - controller
     - foreman_nodes
diff --git a/foreman/ci/resize_lvm.sh b/foreman/ci/resize_lvm.sh
new file mode 100755 (executable)
index 0000000..64a9c62
--- /dev/null
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+
+#script for resizing volumes in Foreman/QuickStack VM
+#author: Tim Rozet (trozet@redhat.com)
+#
+#Uses Vagrant and VirtualBox
+#VagrantFile uses resize_partition.sh
+#
+#Pre-requisties:
+#Vagrant box disk size already resized
+#Partition already resized
+
+##VARS
+reset=`tput sgr0`
+blue=`tput setaf 4`
+red=`tput setaf 1`
+green=`tput setaf 2`
+
+##END VARS
+
+echo "${blue}Resizing physical volume${reset}"
+if ! pvresize /dev/sda2; then
+  echo "${red}Unable to resize physical volume${reset}"
+  exit 1
+else
+  new_part_size=`pvdisplay | grep -Eo "PV Size\s*[0-9]+\." | awk {'print $3'} | tr -d .`
+  echo "${blue}New physical volume size: ${new_part_size}${reset}"
+fi
+
+echo "${blue}Resizing logical volume${reset}"
+if ! lvextend /dev/mapper/centos-root -r -l +100%FREE; then
+  echo "${red}Unable to resize logical volume${reset}"
+  exit 1
+else
+  new_fs_size=`df -h | grep centos-root | awk '{print $2}'`
+  echo "${blue}Filesystem resized to: ${new_fs_size}${reset}"
+fi
diff --git a/foreman/ci/resize_partition.sh b/foreman/ci/resize_partition.sh
new file mode 100755 (executable)
index 0000000..4c5581d
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+
+#script for extending disk partition in Foreman/QuickStack VM
+#author: Tim Rozet (trozet@redhat.com)
+#
+#Uses Vagrant and VirtualBox
+#VagrantFile uses resize_partition.sh
+#
+#Pre-requisties:
+#Vagrant box disk size already resized
+
+##VARS
+reset=`tput sgr0`
+blue=`tput setaf 4`
+red=`tput setaf 1`
+green=`tput setaf 2`
+
+##END VARS
+
+echo "${blue}Extending partition...${reset}"
+echo "d
+2
+n
+p
+
+
+
+p
+t
+2
+8e
+w
+"|fdisk /dev/sda; true