noheat: Upgrades, refactor, deploy Devstack
[integration.git] / deployment / noheat / infra-openstack / vagrant / Vagrantfile
index f797675..ed1a3d0 100644 (file)
@@ -1,23 +1,31 @@
 # -*- mode: ruby -*-
 # -*- coding: utf-8 -*-
 
+host_folder_ansible = "../ansible"
+synced_folder_ansible = "/ansible"
 synced_folder_main = "/vagrant"
 synced_folder_config = "#{synced_folder_main}/config"
 os_config = "#{synced_folder_config}/local.conf"
-os_clouds = "#{synced_folder_config}/clouds.yaml"
+os_clouds_template = "#{synced_folder_config}/clouds.yaml"
 os_clouds_dir = "${HOME}/.config/openstack"
+os_clouds_config = "#{os_clouds_dir}/clouds.yaml"
+os_admin = "admin"
+os_user = "demo"
+image_url = "https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img"
+image_name = "Ubuntu_20.04"
 
 vm_cpu = 1
 vm_cpus = 4
 vm_memory = 1 * 1024
 vm_memory_os = 8 * 1024
 vm_disk = 32
-vm_box = "generic/ubuntu1804"
+vm_box = "generic/ubuntu2004"
 
 operation = {
   name: 'operator',
   hostname: 'operator',
   ip: '172.17.5.254',
+  ip_os: '172.24.4.254',
   cpus: vm_cpu,
   memory: vm_memory,
   disk: vm_disk
@@ -26,6 +34,7 @@ devstack = {
   name: 'devstack',
   hostname: 'devstack',
   ip: '172.17.5.200',
+  ip_os: '172.24.4.2',
   cpus: vm_cpus,
   memory: vm_memory_os,
   disk: vm_disk
@@ -33,6 +42,8 @@ devstack = {
 
 all = [] << operation << devstack
 
+operation_post_msg = "Run: \"vagrant provision #{operation[:name]} --provision-with=add_os_image,run_playbook_create\" to complete infrastructure deployment"
+
 $enable_ipv6 = <<-SCRIPT
   sed -i'' 's/net.ipv6.conf.all.disable_ipv6.*$/net.ipv6.conf.all.disable_ipv6 = 0/' /etc/sysctl.conf
   sysctl -p
@@ -48,20 +59,44 @@ SCRIPT
 
 $setup_py = <<-SCRIPT
   export DEBIAN_FRONTEND=noninteractive
-  sudo -E apt-get update
-  sudo -E apt-get install -yq python3-distutils
+  apt-get update
+  apt-get install -yq python3-distutils
 
   curl -fsSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
-  sudo -H python3 get-pip.py
-  pip install python-openstackclient
+  python3 get-pip.py
+SCRIPT
+
+$setup_openstackclient = <<-SCRIPT
+  pip install --ignore-installed python-openstackclient
   mkdir -p #{os_clouds_dir}
 SCRIPT
 
-$link_file = <<-SCRIPT
-  src="$1"
-  dst="$2"
-  echo "Symlinking ${src} to ${dst}"
-  ln -sf "$src" "$dst"
+$setup_openstacksdk = <<-SCRIPT
+  pip install ansible openstacksdk
+  mkdir -p #{os_clouds_dir}
+SCRIPT
+
+$create_os_clouds = <<-SCRIPT
+  user="$1"
+  template="$2"
+  config="$3"
+  OS_USERNAME="$user" envsubst < "$template" > "$config"
+SCRIPT
+
+$add_os_image = <<-SCRIPT
+  url="$1"
+  name="$2"
+  image="/root/${name}.img"
+  wget --quiet --continue --output-document="$image" "$url"
+  export OS_CLOUD=openstack
+  openstack image create "$name" --public --disk-format qcow2 --container-format bare --file "$image"
+SCRIPT
+
+$run_playbook = <<-SCRIPT
+  PLAYBOOK="$1"
+  export OS_CLOUD=openstack
+  cd #{synced_folder_ansible}
+  ansible-playbook "$PLAYBOOK"
 SCRIPT
 
 Vagrant.configure("2") do |config|
@@ -83,6 +118,7 @@ Vagrant.configure("2") do |config|
       end
 
       config.vm.network :private_network, ip: machine[:ip]
+      config.vm.network :private_network, ip: machine[:ip_os]
 
       if machine[:name] == 'devstack'
         config.vm.network "forwarded_port", guest: 80, host: 8080
@@ -95,12 +131,35 @@ Vagrant.configure("2") do |config|
 
       if machine[:name] == 'operator'
         config.vm.synced_folder ".", synced_folder_main, type: "rsync", rsync__exclude: "Vagrantfile"
+        config.vm.synced_folder host_folder_ansible, synced_folder_ansible, type: "rsync"
+
+        config.vm.provision "setup_py", type: :shell, inline: $setup_py
+        config.vm.provision "setup_openstackclient", type: :shell, inline: $setup_openstackclient
+        config.vm.provision "create_os_clouds_admin", type: :shell, run: "always" do |s|
+          s.inline = $create_os_clouds
+          s.args = [os_admin, os_clouds_template, os_clouds_config]
+        end
+        config.vm.provision "setup_openstacksdk", type: :shell, privileged: false, inline: $setup_openstacksdk
+        config.vm.provision "create_os_clouds", type: :shell, run: "always" do |s|
+          s.privileged = false
+          s.inline = $create_os_clouds
+          s.args = [os_user, os_clouds_template, os_clouds_config]
+        end
 
-        config.vm.provision "setup_openstacksdk", type: :shell, privileged: false, inline: $setup_py
-        config.vm.provision "link_os_clouds", type: :shell, run: "always" do |s|
+        config.vm.post_up_message = operation_post_msg
+        config.vm.provision "add_os_image", type: :shell, run: "never" do |s|
+          s.inline = $add_os_image
+          s.args = [image_url, image_name]
+        end
+        config.vm.provision "run_playbook_create", type: :shell, run: "never" do |s|
+          s.privileged = false
+          s.inline = $run_playbook
+          s.args = "create.yml"
+        end
+        config.vm.provision "run_playbook_destroy", type: :shell, run: "never" do |s|
           s.privileged = false
-          s.inline = $link_file
-          s.args = [os_clouds, os_clouds_dir]
+          s.inline = $run_playbook
+          s.args = "destroy.yml"
         end
       end
     end