Divide OpenStack management access to admin and user
[integration.git] / deployment / noheat / infra-openstack / vagrant / Vagrantfile
1 # -*- mode: ruby -*-
2 # -*- coding: utf-8 -*-
3
4 host_folder_ansible = "../ansible"
5 synced_folder_ansible = "/ansible"
6 synced_folder_main = "/vagrant"
7 synced_folder_config = "#{synced_folder_main}/config"
8 os_config = "#{synced_folder_config}/local.conf"
9 os_clouds_template = "#{synced_folder_config}/clouds.yaml"
10 os_clouds_dir = "${HOME}/.config/openstack"
11 os_clouds_config = "#{os_clouds_dir}/clouds.yaml"
12 os_admin = "admin"
13 os_user = "demo"
14
15 vm_cpu = 1
16 vm_cpus = 4
17 vm_memory = 1 * 1024
18 vm_memory_os = 8 * 1024
19 vm_disk = 32
20 vm_box = "generic/ubuntu1804"
21
22 operation = {
23   name: 'operator',
24   hostname: 'operator',
25   ip: '172.17.5.254',
26   ip_os: '172.24.4.254',
27   cpus: vm_cpu,
28   memory: vm_memory,
29   disk: vm_disk
30 }
31 devstack = {
32   name: 'devstack',
33   hostname: 'devstack',
34   ip: '172.17.5.200',
35   ip_os: '172.24.4.2',
36   cpus: vm_cpus,
37   memory: vm_memory_os,
38   disk: vm_disk
39 }
40
41 all = [] << operation << devstack
42
43 operation_post_msg = "Run: \"vagrant provision #{operation[:name]} --provision-with=run_playbook_create\" to complete infrastructure deployment"
44
45 $enable_ipv6 = <<-SCRIPT
46   sed -i'' 's/net.ipv6.conf.all.disable_ipv6.*$/net.ipv6.conf.all.disable_ipv6 = 0/' /etc/sysctl.conf
47   sysctl -p
48 SCRIPT
49
50 $setup_devstack = <<-SCRIPT
51   CONFIG="$1"
52   git clone https://opendev.org/openstack/devstack
53   cd devstack
54   cp "$CONFIG" .
55   ./stack.sh
56 SCRIPT
57
58 $setup_py = <<-SCRIPT
59   export DEBIAN_FRONTEND=noninteractive
60   apt-get update
61   apt-get install -yq python3-distutils
62
63   curl -fsSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
64   python3 get-pip.py
65 SCRIPT
66
67 $setup_openstackclient = <<-SCRIPT
68   pip install --ignore-installed python-openstackclient
69   mkdir -p #{os_clouds_dir}
70 SCRIPT
71
72 $setup_openstacksdk = <<-SCRIPT
73   pip install ansible openstacksdk
74   mkdir -p #{os_clouds_dir}
75 SCRIPT
76
77 $create_os_clouds = <<-SCRIPT
78   user="$1"
79   template="$2"
80   config="$3"
81   OS_USERNAME="$user" envsubst < "$template" > "$config"
82 SCRIPT
83
84 $run_playbook = <<-SCRIPT
85   PLAYBOOK="$1"
86   export OS_CLOUD=openstack
87   cd #{synced_folder_ansible}
88   ansible-playbook "$PLAYBOOK"
89 SCRIPT
90
91 Vagrant.configure("2") do |config|
92   all.each do |machine|
93     config.vm.define machine[:name] do |config|
94       config.vm.box = vm_box
95       config.vm.hostname = machine[:hostname]
96
97       config.vm.provider :virtualbox do |v|
98         v.name = machine[:name]
99         v.memory = machine[:memory]
100         v.cpus = machine[:cpus]
101       end
102
103       config.vm.provider :libvirt do |v|
104         v.memory = machine[:memory]
105         v.cpus = machine[:cpus]
106         v.machine_virtual_size = machine[:disk] # set at VM creation
107       end
108
109       config.vm.network :private_network, ip: machine[:ip]
110       config.vm.network :private_network, ip: machine[:ip_os]
111
112       if machine[:name] == 'devstack'
113         config.vm.network "forwarded_port", guest: 80, host: 8080
114
115         config.vm.synced_folder ".", synced_folder_main, type: "rsync", rsync__exclude: "Vagrantfile"
116
117         config.vm.provision "enable_ipv6", type: :shell, run: "always", inline: $enable_ipv6
118         config.vm.provision "setup_devstack", type: :shell, privileged: false, inline: $setup_devstack, args: os_config
119       end
120
121       if machine[:name] == 'operator'
122         config.vm.synced_folder ".", synced_folder_main, type: "rsync", rsync__exclude: "Vagrantfile"
123         config.vm.synced_folder host_folder_ansible, synced_folder_ansible, type: "rsync"
124
125         config.vm.provision "setup_py", type: :shell, inline: $setup_py
126         config.vm.provision "setup_openstackclient", type: :shell, inline: $setup_openstackclient
127         config.vm.provision "create_os_clouds_admin", type: :shell, run: "always" do |s|
128           s.inline = $create_os_clouds
129           s.args = [os_admin, os_clouds_template, os_clouds_config]
130         end
131         config.vm.provision "setup_openstacksdk", type: :shell, privileged: false, inline: $setup_openstacksdk
132         config.vm.provision "create_os_clouds", type: :shell, run: "always" do |s|
133           s.privileged = false
134           s.inline = $create_os_clouds
135           s.args = [os_user, os_clouds_template, os_clouds_config]
136         end
137
138         config.vm.post_up_message = operation_post_msg
139         config.vm.provision "run_playbook_create", type: :shell, run: "never" do |s|
140           s.privileged = false
141           s.inline = $run_playbook
142           s.args = "create.yml"
143         end
144         config.vm.provision "run_playbook_destroy", type: :shell, run: "never" do |s|
145           s.privileged = false
146           s.inline = $run_playbook
147           s.args = "destroy.yml"
148         end
149       end
150     end
151   end
152 end