[p/openstack.nova] Allow creation of pty on aarch64
[armband.git] / patches / opnfv-fuel / 0002-salt-formulas-Add-enable-armband-formula.patch
1 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2 : Copyright (c) 2018 Enea AB and others.
3 :
4 : All rights reserved. This program and the accompanying materials
5 : are made available under the terms of the Apache License, Version 2.0
6 : which accompanies this distribution, and is available at
7 : http://www.apache.org/licenses/LICENSE-2.0
8 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
9 From: Guillermo Herrero <Guillermo.Herrero@enea.com>
10 Date: Tue, 25 Jul 2017 00:58:32 +0200
11 Subject: [PATCH] salt-formulas: Add & enable armband formula
12
13 - prereq: install qemu-efi;
14 - prereq: install vgabios;
15 - prereq: fix missing link for vgabios binary blob;
16 - nova patch: Add video type virtio for AArch64 (backport from [1]);
17 - nova patch: libvirt driver: AArch64: ACPI depends on AAVMF;
18 - nova conf: cpu_model=cortex-a57 (only for virtual deploys);
19 - nova conf: virt_type=qemu (only for virtual deploys);
20 - nova compute conf: virt_type=qemu (only for virtual deploys);
21 - nova conf: pointer_model=ps2mouse since AArch64 has no USB tablet;
22
23 [1] https://github.com/openstack/nova/commit/f0f0953
24
25 Signed-off-by: Guillermo Herrero <Guillermo.Herrero@enea.com>
26 Signed-off-by: Charalampos Kominos <Charalampos.Kominos@enea.com>
27 Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
28 ---
29  mcp/config/states/openstack_ha                     |  1 +
30  mcp/config/states/openstack_noha                   |  2 +
31  mcp/config/states/virtual_control_plane            |  1 +
32  .../armband/files/nova-libvirt-aarch64-rollup.diff | 76 ++++++++++++++++++++++
33  mcp/salt-formulas/armband/init.sls                 |  7 ++
34  mcp/salt-formulas/armband/nova_config.sls          | 35 ++++++++++
35  mcp/salt-formulas/armband/nova_libvirt.sls         |  7 ++
36  mcp/salt-formulas/armband/qemu_efi.sls             |  2 +
37  mcp/salt-formulas/armband/vgabios.sls              |  7 ++
38  9 files changed, 138 insertions(+)
39  create mode 100644 mcp/salt-formulas/armband/files/nova-libvirt-aarch64-rollup.diff
40  create mode 100644 mcp/salt-formulas/armband/init.sls
41  create mode 100644 mcp/salt-formulas/armband/nova_config.sls
42  create mode 100644 mcp/salt-formulas/armband/nova_libvirt.sls
43  create mode 100644 mcp/salt-formulas/armband/qemu_efi.sls
44  create mode 100644 mcp/salt-formulas/armband/vgabios.sls
45
46 diff --git a/mcp/config/states/openstack_ha b/mcp/config/states/openstack_ha
47 index 4f3760f6..115a56c1 100755
48 --- a/mcp/config/states/openstack_ha
49 +++ b/mcp/config/states/openstack_ha
50 @@ -52,6 +52,7 @@ salt -I 'neutron:server' state.sls neutron -b 1
51  salt -I 'neutron:gateway' state.sls neutron.gateway
52
53  salt -I 'nova:compute' state.sls nova
54 +wait_for 5.0 "salt -I 'nova:compute' state.sls armband"
55
56  salt -C 'I@mongodb:server and *01*' state.sls mongodb || true
57  wait_for 10 "salt -C 'I@mongodb:server and *01*' cmd.run 'mongo localhost:27017/admin'"
58 diff --git a/mcp/config/states/openstack_noha b/mcp/config/states/openstack_noha
59 index 9fc30bbf..998fc6b4 100755
60 --- a/mcp/config/states/openstack_noha
61 +++ b/mcp/config/states/openstack_noha
62 @@ -52,6 +52,8 @@ salt -I 'ceilometer:agent' state.sls ceilometer
63
64  salt -I 'horizon:server' state.sls horizon
65
66 +salt -I 'nova:compute' state.sls armband
67 +
68  # workaround for the pike horizon is missing css, FUEL-324
69  salt -I 'horizon:server' file.symlink \
70    /var/lib/openstack-dashboard/static \
71 diff --git a/mcp/config/states/virtual_control_plane b/mcp/config/states/virtual_control_plane
72 index 80c0c87e..144245f9 100755
73 --- a/mcp/config/states/virtual_control_plane
74 +++ b/mcp/config/states/virtual_control_plane
75 @@ -27,6 +27,7 @@ if [ "${ERASE_ENV}" -eq 1 ]; then
76  fi
77
78  # KVM libvirt first, VCP deployment
79 +wait_for 5.0 "salt -C 'kvm*' state.sls armband"
80  wait_for 5.0 "salt -C 'kvm*' state.sls libvirt"
81
82  salt -C 'kvm* or cmp*' state.apply salt
83 diff --git a/mcp/salt-formulas/armband/files/nova-libvirt-aarch64-rollup.diff b/mcp/salt-formulas/armband/files/nova-libvirt-aarch64-rollup.diff
84 new file mode 100644
85 index 00000000..36ddf72b
86 --- /dev/null
87 +++ b/mcp/salt-formulas/armband/files/nova-libvirt-aarch64-rollup.diff
88 @@ -0,0 +1,163 @@
89 +From: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
90 +Date: Thu, 24 Aug 2017 10:57:28 +0200
91 +Subject: [PATCH] libvirt: AArch64: ACPI depends on AAVMF
92 +
93 +On AArch64, ACPI should be added to domain XML only if guest UEFI
94 +(AAVMF) is also used.
95 +
96 +[ Alexandru.Avadanii@enea.com ]
97 +- pike rebase: minor context adj
98 +
99 +Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
100 +Signed-off-by: Ciprian Barbu <ciprian.barbu@enea.com>
101 +
102 +---
103 +
104 +diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
105 +--- a/nova/virt/libvirt/driver.py
106 ++++ b/nova/virt/libvirt/driver.py
107 +@@ -4314,7 +4314,10 @@
108 +
109 +         if (virt_type not in ("lxc", "uml", "parallels", "xen") or
110 +                 (virt_type == "xen" and guest.os_type == fields.VMMode.HVM)):
111 +-            guest.features.append(vconfig.LibvirtConfigGuestFeatureACPI())
112 ++            guestarch = libvirt_utils.get_arch(image_meta)
113 ++            if (guestarch not in (fields.Architecture.ARMV7, fields.Architecture.AARCH64) or
114 ++                image_meta.properties.get('hw_firmware_type') == 'uefi'):
115 ++                    guest.features.append(vconfig.LibvirtConfigGuestFeatureACPI())
116 +             guest.features.append(vconfig.LibvirtConfigGuestFeatureAPIC())
117 +
118 +         if (virt_type in ("qemu", "kvm") and
119 +--
120 +
121 +From f0f09530ee9169eb29bc28d4f118676d7dc6640e Mon Sep 17 00:00:00 2001
122 +From: Kevin Zhao <kevin.zhao@arm.com>
123 +Date: Tue, 15 Aug 2017 09:52:09 +0000
124 +Subject: [PATCH] Add video type virtio for AArch64
125 +
126 +Currently only "virtio" type is supported on AArch64, and the
127 +other "virrus", "qxl" and "vga" don't work on AArch64 according to
128 +libvirt upstream:
129 +https://www.redhat.com/archives/libvir-list/2016-September/msg00546.html
130 +Then this patch adds the virtio for AArch64 and tweaks the related test cases.
131 +
132 +Closes-bug: #1710766
133 +
134 +[ Alexandru.Avadanii@enea.com ]
135 +Dropped test changes so it applies cleanly on Newton without more backports.
136 +
137 +Change-Id: Iba8a1e671f2b5759b3d9178aa1871d0cf888b26b
138 +Signed-off-by: Kevin Zhao <kevin.zhao@arm.com>
139 +Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
140 +---
141 +
142 +--- a/nova/virt/libvirt/driver.py
143 ++++ b/nova/virt/libvirt/driver.py
144 +@@ -4342,7 +4342,8 @@ def _check_number_of_serial_console(self, num_ports):
145 +                 allowed=ALLOWED_QEMU_SERIAL_PORTS, virt_type=virt_type)
146 +
147 +     def _add_video_driver(self, guest, image_meta, flavor):
148 +-        VALID_VIDEO_DEVICES = ("vga", "cirrus", "vmvga", "xen", "qxl")
149 ++        VALID_VIDEO_DEVICES = ("vga", "cirrus", "vmvga",
150 ++                               "xen", "qxl", "virtio")
151 +         video = vconfig.LibvirtConfigGuestVideo()
152 +         # NOTE(ldbragst): The following logic sets the video.type
153 +         # depending on supported defaults given the architecture,
154 +@@ -4360,6 +4361,10 @@ def _add_video_driver(self, guest, image_meta, flavor):
155 +             # NOTE(ldbragst): PowerKVM doesn't support 'cirrus' be default
156 +             # so use 'vga' instead when running on Power hardware.
157 +             video.type = 'vga'
158 ++        elif guestarch in (fields.Architecture.AARCH64):
159 ++            # NOTE(kevinz): Only virtio device type is supported by AARCH64
160 ++            # so use 'virtio' instead when running on AArch64 hardware.
161 ++            video.type = 'virtio'
162 +         elif CONF.spice.enabled:
163 +             video.type = 'qxl'
164 +         if image_meta.properties.get('hw_video_model'):
165 +---
166 +
167 +From ac6d3cd85ffe94115f15134406ba0d366e938764 Mon Sep 17 00:00:00 2001
168 +From: Charalampos Kominos <Charalampos.Kominos@enea.com>
169 +Date: Tue, 13 Mar 2018 17:02:56 +0100
170 +
171 +Subject: [PATCH] openstack:nova: Allow nova to create a pty device for aarch64VM
172 +Armband uses openstack packages from canonical. Those packages
173 +are configured to work with other packages from UCA repos. Since
174 +ARMband uses newer versions of certain packages than those in UCA
175 +(libvirt) we can force different config without breaking anything.
176 +
177 +JIRA: ARMBAND-352
178 +
179 +Signed-off-by: Charalampos Kominos <charalampos.kominos@enea.com>
180 +---
181 +
182 +--- a/nova/virt/libvirt/driver.py
183 ++++ b/nova/virt/libvirt/driver.py
184 +@@ -4615,13 +4615,11 @@
185 +                   self._is_s390x_guest(image_meta)):
186 +             self._create_consoles_s390x(guest_cfg, instance,
187 +                                         flavor, image_meta)
188 +-        elif (virt_type in ("qemu", "kvm") and
189 +-                  self._is_arm_guest(image_meta)):
190 +-            # NOTE(jamespage): libvirt 2.5.0 as shipped in Ubuntu zesty
191 +-            #                  and the Pike UCA needs to be configured
192 +-            #                  for compatibility on arm64.
193 +-            self._create_consoles_arm(guest_cfg, instance,
194 +-                                      flavor, image_meta)
195 ++
196 ++        #ARMband: Canonical applies a patch to align with libvirt 2.5.0 in UCA repos
197 ++        #         which breaks the console on aarch64. Since ARMband uses a newer
198 ++        #         we can safely revert that chagne libvirt version
199 ++
200 +         elif virt_type in ("qemu", "kvm"):
201 +             self._create_consoles_qemu_kvm(guest_cfg, instance,
202 +                                         flavor, image_meta)
203 +@@ -4630,12 +4628,6 @@
204 +         s390x_archs = (fields.Architecture.S390, fields.Architecture.S390X)
205 +         return libvirt_utils.get_arch(image_meta) in s390x_archs
206 +
207 +-    def _is_arm_guest(self, image_meta):
208 +-        arm_archs = (fields.Architecture.AARCH64,
209 +-                     fields.Architecture.ARMV7B,
210 +-                     fields.Architecture.ARMV7)
211 +-        return libvirt_utils.get_arch(image_meta) in arm_archs
212 +-
213 +     def _create_consoles_qemu_kvm(self, guest_cfg, instance, flavor,
214 +                                   image_meta):
215 +         char_dev_cls = vconfig.LibvirtConfigGuestSerial
216 +@@ -4665,25 +4657,6 @@
217 +                                      "sclplm")
218 +         self._create_pty_device(guest_cfg, char_dev_cls, "sclp", log_path)
219 +
220 +-    def _create_consoles_arm(self, guest_cfg, instance, flavor, image_meta):
221 +-        char_dev_cls = vconfig.LibvirtConfigGuestConsole
222 +-        log_path = self._get_console_log_path(instance)
223 +-        if CONF.serial_console.enabled:
224 +-            if not self._serial_ports_already_defined(instance):
225 +-                num_ports = hardware.get_number_of_serial_ports(flavor,
226 +-                                                                image_meta)
227 +-                self._check_number_of_serial_console(num_ports)
228 +-                self._create_serial_consoles(guest_cfg, num_ports,
229 +-                                             char_dev_cls, log_path)
230 +-        else:
231 +-            # NOTE(jamespage): Force creation of file device for compatibility
232 +-            #                  with aarch64 + libvirt 2.5.0
233 +-            self._create_file_device(guest_cfg, instance, char_dev_cls,
234 +-                                     force=True)
235 +-        # NOTE(jamespage): Skip creation of pty devices; they only work with
236 +-        #                  the virtio driver which does not capture early
237 +-        #                  boot on aarch64
238 +-
239 +     def _create_pty_device(self, guest_cfg, char_dev_cls, target_type=None,
240 +                            log_path=None):
241 +         def _create_base_dev():
242 +@@ -4721,8 +4721,8 @@
243 +                guest_cfg.add_device(_create_base_dev())
244 +
245 +     def _create_file_device(self, guest_cfg, instance, char_dev_cls,
246 +-                            target_type=None, force=False):
247 +-        if self._is_virtlogd_available() and not force:
248 ++                            target_type=None):
249 ++        if self._is_virtlogd_available():
250 +             return
251 +
252 +         consolelog = char_dev_cls()
253 diff --git a/mcp/salt-formulas/armband/init.sls b/mcp/salt-formulas/armband/init.sls
254 new file mode 100644
255 index 00000000..8a8cf2ab
256 --- /dev/null
257 +++ b/mcp/salt-formulas/armband/init.sls
258 @@ -0,0 +1,7 @@
259 +include:
260 + - armband.qemu_efi
261 + - armband.vgabios
262 + {%- if salt['pkg.version']('python-nova') %}
263 + - armband.nova_libvirt
264 + - armband.nova_config
265 + {%- endif %}
266 diff --git a/mcp/salt-formulas/armband/nova_config.sls b/mcp/salt-formulas/armband/nova_config.sls
267 new file mode 100644
268 index 00000000..31fa031a
269 --- /dev/null
270 +++ b/mcp/salt-formulas/armband/nova_config.sls
271 @@ -0,0 +1,35 @@
272 +{% if grains['virtual'] == 'kvm' %}
273 +nova_virt_type:
274 +  file.replace:
275 +    - name: "/etc/nova/nova.conf"
276 +    - pattern: '^virt_type\s*=.*$'
277 +    - repl: "virt_type = qemu"
278 +nova_compute_virt_type:
279 +  file.replace:
280 +    - name: "/etc/nova/nova-compute.conf"
281 +    - pattern: '^virt_type\s*=.*$'
282 +    - repl: "virt_type = qemu"
283 +{% endif %}
284 +nova_pointer_model:
285 +  file.replace:
286 +    - name: "/etc/nova/nova.conf"
287 +    - pattern: '^#pointer_model\s*=.*$'
288 +    - repl: "pointer_model = ps2mouse"
289 +nova_cpu_mode:
290 +  file.replace:
291 +    - name: "/etc/nova/nova.conf"
292 +    - pattern:  '^cpu_mode\s*=\s*host-passthrough'
293 +    - repl: "cpu_mode = custom"
294 +nova_cpu_model:
295 +  file.replace:
296 +    - name: "/etc/nova/nova.conf"
297 +    - pattern: '^#cpu_model\s*=.*$'
298 +    {% if grains['virtual'] == 'kvm' %}
299 +    - repl: "cpu_model = cortex-a57"
300 +    {% else %}
301 +    - repl: "cpu_model = host"
302 +    {% endif %}
303 +restart_nova-compute:
304 +  cmd:
305 +    - run
306 +    - name: "service nova-compute restart"
307 diff --git a/mcp/salt-formulas/armband/nova_libvirt.sls b/mcp/salt-formulas/armband/nova_libvirt.sls
308 new file mode 100644
309 index 00000000..bc2cbda9
310 --- /dev/null
311 +++ b/mcp/salt-formulas/armband/nova_libvirt.sls
312 @@ -0,0 +1,7 @@
313 +nova-libvirt-aarch64-rollup:
314 +  file.patch:
315 +  - name: /usr/lib/python2.7/dist-packages
316 +  - source: salt://armband/files/nova-libvirt-aarch64-rollup.diff
317 +  - hash: False
318 +  - options: '-p1'
319 +  - unless: 'test -f /var/cache/salt/minion/files/base/armband/files/nova-libvirt-aarch64-rollup.diff && cd /usr/lib/python2.7/dist-packages && patch -p1 -R --dry-run /var/cache/salt/minion/files/base/armband/files/nova-libvirt-aarch64-rollup.diff'
320 diff --git a/mcp/salt-formulas/armband/qemu_efi.sls b/mcp/salt-formulas/armband/qemu_efi.sls
321 new file mode 100644
322 index 00000000..c697dae9
323 --- /dev/null
324 +++ b/mcp/salt-formulas/armband/qemu_efi.sls
325 @@ -0,0 +1,2 @@
326 +qemu-efi:
327 +  pkg.installed
328 diff --git a/mcp/salt-formulas/armband/vgabios.sls b/mcp/salt-formulas/armband/vgabios.sls
329 new file mode 100644
330 index 00000000..500c2bcf
331 --- /dev/null
332 +++ b/mcp/salt-formulas/armband/vgabios.sls
333 @@ -0,0 +1,7 @@
334 +vgabios:
335 +  pkg.installed
336 +/usr/share/qemu:
337 +  file.directory
338 +/usr/share/qemu/vgabios-stdvga.bin:
339 +  file.symlink:
340 +    - target: "/usr/share/vgabios/vgabios.bin"