Add Vagrant-based development environment 50/109250/5
authorPawel Wieczorek <p.wieczorek2@samsung.com>
Fri, 29 May 2020 16:12:38 +0000 (18:12 +0200)
committerBartek Grzybowski <b.grzybowski@partner.samsung.com>
Thu, 30 Jul 2020 09:02:42 +0000 (09:02 +0000)
Development guide ("HACKING") is subject to change based on gathered
feedback.

Issue-ID: INT-1601
Change-Id: I8988c8a6e85d215485666690e0c281412a1ce869
Signed-off-by: Pawel Wieczorek <p.wieczorek2@samsung.com>
deployment/noheat/infra-openstack/HACKING [new file with mode: 0644]
deployment/noheat/infra-openstack/HACKING.rst [new symlink]
deployment/noheat/infra-openstack/vagrant/Vagrantfile [new file with mode: 0644]
deployment/noheat/infra-openstack/vagrant/config/clouds.yaml [new file with mode: 0644]
deployment/noheat/infra-openstack/vagrant/config/local.conf [new file with mode: 0644]

diff --git a/deployment/noheat/infra-openstack/HACKING b/deployment/noheat/infra-openstack/HACKING
new file mode 100644 (file)
index 0000000..d0c1edc
--- /dev/null
@@ -0,0 +1,29 @@
+=========================
+ Development environment
+=========================
+
+This environment focuses on interactions with OpenStack (here: DevStack) instance. Changes can be
+made from host machine but additional guest ("operator") is provided for developers' convenience.
+
+Environment on "operator" machine is already set up and can be accessed by:
+
+.. code-block:: shell
+
+    $ vagrant ssh operator
+
+Provided ``clouds.yaml`` file differs slightly from the one that can be obtained with following
+steps:
+
+#. Open OpenStack dashboard (http://localhost:8080 forwarded from "devstack" machine)
+#. Navigate to ``Project``, then ``API Access`` on the left panel
+#. Select ``Download OpenStack RC File``, then ``OpenStack clouds.yaml File`` on the right side
+
+Summary of changes:
+
+- Added password from ``local.conf`` file (used in DevStack instance setup)
+- Removed ``project_id`` which might change on a new DevStack instance
+- Replaced ``auth_url`` based on machine's dynamic IP with the static private address
+
+Installed Python package ``python-openstackclient`` includes key package ``openstacksdk`` as
+a dependency and provides additional CLI tools. Tool ``pip`` for Python 3 was used for installing
+these packages.
diff --git a/deployment/noheat/infra-openstack/HACKING.rst b/deployment/noheat/infra-openstack/HACKING.rst
new file mode 120000 (symlink)
index 0000000..3f7568e
--- /dev/null
@@ -0,0 +1 @@
+HACKING
\ No newline at end of file
diff --git a/deployment/noheat/infra-openstack/vagrant/Vagrantfile b/deployment/noheat/infra-openstack/vagrant/Vagrantfile
new file mode 100644 (file)
index 0000000..f797675
--- /dev/null
@@ -0,0 +1,108 @@
+# -*- mode: ruby -*-
+# -*- coding: utf-8 -*-
+
+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_dir = "${HOME}/.config/openstack"
+
+vm_cpu = 1
+vm_cpus = 4
+vm_memory = 1 * 1024
+vm_memory_os = 8 * 1024
+vm_disk = 32
+vm_box = "generic/ubuntu1804"
+
+operation = {
+  name: 'operator',
+  hostname: 'operator',
+  ip: '172.17.5.254',
+  cpus: vm_cpu,
+  memory: vm_memory,
+  disk: vm_disk
+}
+devstack = {
+  name: 'devstack',
+  hostname: 'devstack',
+  ip: '172.17.5.200',
+  cpus: vm_cpus,
+  memory: vm_memory_os,
+  disk: vm_disk
+}
+
+all = [] << operation << devstack
+
+$enable_ipv6 = <<-SCRIPT
+  sed -i'' 's/net.ipv6.conf.all.disable_ipv6.*$/net.ipv6.conf.all.disable_ipv6 = 0/' /etc/sysctl.conf
+  sysctl -p
+SCRIPT
+
+$setup_devstack = <<-SCRIPT
+  CONFIG="$1"
+  git clone https://opendev.org/openstack/devstack
+  cd devstack
+  cp "$CONFIG" .
+  ./stack.sh
+SCRIPT
+
+$setup_py = <<-SCRIPT
+  export DEBIAN_FRONTEND=noninteractive
+  sudo -E apt-get update
+  sudo -E 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
+  mkdir -p #{os_clouds_dir}
+SCRIPT
+
+$link_file = <<-SCRIPT
+  src="$1"
+  dst="$2"
+  echo "Symlinking ${src} to ${dst}"
+  ln -sf "$src" "$dst"
+SCRIPT
+
+Vagrant.configure("2") do |config|
+  all.each do |machine|
+    config.vm.define machine[:name] do |config|
+      config.vm.box = vm_box
+      config.vm.hostname = machine[:hostname]
+
+      config.vm.provider :virtualbox do |v|
+        v.name = machine[:name]
+        v.memory = machine[:memory]
+        v.cpus = machine[:cpus]
+      end
+
+      config.vm.provider :libvirt do |v|
+        v.memory = machine[:memory]
+        v.cpus = machine[:cpus]
+        v.machine_virtual_size = machine[:disk] # set at VM creation
+      end
+
+      config.vm.network :private_network, ip: machine[:ip]
+
+      if machine[:name] == 'devstack'
+        config.vm.network "forwarded_port", guest: 80, host: 8080
+
+        config.vm.synced_folder ".", synced_folder_main, type: "rsync", rsync__exclude: "Vagrantfile"
+
+        config.vm.provision "enable_ipv6", type: :shell, run: "always", inline: $enable_ipv6
+        config.vm.provision "setup_devstack", type: :shell, privileged: false, inline: $setup_devstack, args: os_config
+      end
+
+      if machine[:name] == 'operator'
+        config.vm.synced_folder ".", synced_folder_main, type: "rsync", rsync__exclude: "Vagrantfile"
+
+        config.vm.provision "setup_openstacksdk", type: :shell, privileged: false, inline: $setup_py
+        config.vm.provision "link_os_clouds", type: :shell, run: "always" do |s|
+          s.privileged = false
+          s.inline = $link_file
+          s.args = [os_clouds, os_clouds_dir]
+        end
+      end
+    end
+  end
+end
diff --git a/deployment/noheat/infra-openstack/vagrant/config/clouds.yaml b/deployment/noheat/infra-openstack/vagrant/config/clouds.yaml
new file mode 100644 (file)
index 0000000..6dab24a
--- /dev/null
@@ -0,0 +1,11 @@
+clouds:
+  openstack:
+    auth:
+      auth_url: http://172.17.5.200/identity
+      username: "demo"
+      password: "default123456!"
+      project_name: "demo"
+      user_domain_name: "Default"
+    region_name: "RegionOne"
+    interface: "public"
+    identity_api_version: 3
diff --git a/deployment/noheat/infra-openstack/vagrant/config/local.conf b/deployment/noheat/infra-openstack/vagrant/config/local.conf
new file mode 100644 (file)
index 0000000..f891286
--- /dev/null
@@ -0,0 +1,5 @@
+[[local|localrc]]
+ADMIN_PASSWORD=default123456!
+DATABASE_PASSWORD=$ADMIN_PASSWORD
+RABBIT_PASSWORD=$ADMIN_PASSWORD
+SERVICE_PASSWORD=$ADMIN_PASSWORD