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