:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : Copyright (c) 2017 Enea AB and others. : : All rights reserved. This program and the accompanying materials : are made available under the terms of the Apache License, Version 2.0 : which accompanies this distribution, and is available at : http://www.apache.org/licenses/LICENSE-2.0 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: From: Guillermo Herrero Date: Tue, 25 Jul 2017 00:58:32 +0200 Subject: [PATCH] mcp: salt-formulas: Add & enable armband formula FIXME: Re-enable apparmor. FIXME: Detect baremetal and re-enable acceleration. - install qemu-efi; - install vgabios; - disable apparmor as security driver for libvirt (temporary); - fix missing link for vgabios binary blob; - nova: virt_type=qemu (temporary, until we support baremetal too); - nova: pointer_model=ps2mouse since AArch64 has no USB tablet; - nova: cpu_model=cortex-a57; - nova: libvirt driver: Add ttyAMA0 by default on AArch64; - nova: libvirt driver: Use VGA video type by default on AArch64; - nova: libvirt driver: AArch64: ACPI depends on AAVMF; Signed-off-by: Guillermo Herrero Signed-off-by: Charalampos Kominos Signed-off-by: Alexandru Avadanii --- mcp/config/states/openstack | 2 + mcp/config/states/openstack_ha | 1 + mcp/config/states/virtual_control_plane | 1 + ...ate-vga-console-defaults-for-armv7-aarch64.diff | 48 ++++++++++++++++++++++ ...nova-libvirt-AArch64-ACPI-depends-on-AAVMF.diff | 45 ++++++++++++++++++++ mcp/salt-formulas/armband/init.sls | 6 +++ mcp/salt-formulas/armband/libvirt_driver.sls | 11 +++++ mcp/salt-formulas/armband/nova.sls | 30 ++++++++++++++ mcp/salt-formulas/armband/qemu.sls | 7 ++++ mcp/salt-formulas/armband/vgabios.sls | 6 +++ 10 files changed, 157 insertions(+) create mode 100644 mcp/salt-formulas/armband/files/nova-Update-vga-console-defaults-for-armv7-aarch64.diff create mode 100644 mcp/salt-formulas/armband/files/nova-libvirt-AArch64-ACPI-depends-on-AAVMF.diff create mode 100644 mcp/salt-formulas/armband/init.sls create mode 100644 mcp/salt-formulas/armband/libvirt_driver.sls create mode 100644 mcp/salt-formulas/armband/nova.sls create mode 100644 mcp/salt-formulas/armband/qemu.sls create mode 100644 mcp/salt-formulas/armband/vgabios.sls diff --git a/mcp/config/states/openstack b/mcp/config/states/openstack index beb6abb..885f2ac 100755 --- a/mcp/config/states/openstack +++ b/mcp/config/states/openstack @@ -35,3 +35,5 @@ salt -I 'ceilometer:server' state.sls ceilometer salt -I 'ceilometer:agent' state.sls ceilometer salt -I 'horizon:server' state.sls horizon + +salt -I 'nova:compute' state.sls armband diff --git a/mcp/config/states/openstack_ha b/mcp/config/states/openstack_ha index c4c513d..9084678 100755 --- a/mcp/config/states/openstack_ha +++ b/mcp/config/states/openstack_ha @@ -44,6 +44,7 @@ salt -I 'neutron:server' state.sls neutron -b 1 salt -I 'neutron:gateway' state.sls neutron.gateway salt -I 'nova:compute' state.sls nova +salt -I 'nova:compute' state.sls armband salt -I 'mongodb:server' state.sls mongodb wait_for 90 "salt -C 'I@mongodb:server and *01*' cmd.run 'mongo localhost:27017/admin'" diff --git a/mcp/config/states/virtual_control_plane b/mcp/config/states/virtual_control_plane index 645009b..79ad880 100755 --- a/mcp/config/states/virtual_control_plane +++ b/mcp/config/states/virtual_control_plane @@ -12,6 +12,7 @@ wait_for 90 "! salt 'kvm*' test.ping | tee /dev/stderr | grep -Fq 'Not connected salt -C '* and not cfg01* and not mas01*' state.apply linux,ntp +salt -C 'kvm*' state.sls armband salt -C 'kvm*' state.sls libvirt salt -C '* and not cfg01* and not mas01*' state.apply salt diff --git a/mcp/salt-formulas/armband/files/nova-Update-vga-console-defaults-for-armv7-aarch64.diff b/mcp/salt-formulas/armband/files/nova-Update-vga-console-defaults-for-armv7-aarch64.diff new file mode 100644 index 0000000..a5b08da --- /dev/null +++ b/mcp/salt-formulas/armband/files/nova-Update-vga-console-defaults-for-armv7-aarch64.diff @@ -0,0 +1,48 @@ +From: Stanislaw Kardach +Date: Tue, 22 Mar 2016 12:05:09 +0100 +Subject: [PATCH] nova: Update vga, console defaults for armv7, aarch64 + +Nova hardcodes default options for both video=cirrus and console. +armv7 and aarch64 VMs require video=vga, and since most applications +use PL011 serial driver for guests, adding console=ttyAMA0 is also +a nice UX addition. + +Signed-off-by: Stanislaw Kardach +Signed-off-by: Alexandru Avadanii +Signed-off-by: Guillermo Herrero + +--- + usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py b/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py +index bba9b00..99e86be 100644 +--- a/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py ++++ b/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py +@@ -4179,7 +4179,12 @@ class LibvirtDriver(driver.ComputeDriver): + if virt_type == "xen": + guest.os_cmdline = "ro root=%s" % root_device_name + else: ++ guestarch = libvirt_utils.get_arch(image_meta) + guest.os_cmdline = ("root=%s %s" % (root_device_name, CONSOLE)) ++ if guestarch in (fields.Architecture.ARMV7, ++ fields.Architecture.AARCH64): ++ # NOTE(armband): ARM v7/v8 use PL011 drv, add ttyAMA0 console ++ guest.os_cmdline += " console=ttyAMA0" + if virt_type == "qemu": + guest.os_cmdline += " no_timer_check" + if instance.ramdisk_id: +@@ -4288,9 +4293,12 @@ class LibvirtDriver(driver.ComputeDriver): + video.type = 'xen' + elif CONF.libvirt.virt_type == 'parallels': + video.type = 'vga' +- elif guestarch in (fields.Architecture.PPC, ++ elif guestarch in (fields.Architecture.ARMV7, ++ fields.Architecture.AARCH64, ++ fields.Architecture.PPC, + fields.Architecture.PPC64, + fields.Architecture.PPC64LE): ++ # NOTE(armband): Added ARM v7/v8, same as on PPC. + # NOTE(ldbragst): PowerKVM doesn't support 'cirrus' be default + # so use 'vga' instead when running on Power hardware. + video.type = 'vga' diff --git a/mcp/salt-formulas/armband/files/nova-libvirt-AArch64-ACPI-depends-on-AAVMF.diff b/mcp/salt-formulas/armband/files/nova-libvirt-AArch64-ACPI-depends-on-AAVMF.diff new file mode 100644 index 0000000..7c1b78a --- /dev/null +++ b/mcp/salt-formulas/armband/files/nova-libvirt-AArch64-ACPI-depends-on-AAVMF.diff @@ -0,0 +1,45 @@ +From: Alexandru Avadanii +Date: Thu, 24 Aug 2017 10:57:28 +0200 +Subject: [PATCH] libvirt: AArch64: ACPI depends on AAVMF + +On AArch64, ACPI should be added to domain XML only if guest UEFI +(AAVMF) is also used. + +Signed-off-by: Alexandru Avadanii +Signed-off-by: Ciprian Barbu + +--- + +diff --git a/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py b/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py +--- a/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py ++++ b/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py +@@ -4255,7 +4255,7 @@ + tmhyperv.present = True + clk.add_timer(tmhyperv) + +- def _set_features(self, guest, os_type, caps, virt_type): ++ def _set_features(self, guest, os_type, image_meta, caps, virt_type): + if virt_type == "xen": + # PAE only makes sense in X86 + if caps.host.cpu.arch in (fields.Architecture.I686, +@@ -4264,7 +4264,10 @@ + + if (virt_type not in ("lxc", "uml", "parallels", "xen") or + (virt_type == "xen" and guest.os_type == fields.VMMode.HVM)): +- guest.features.append(vconfig.LibvirtConfigGuestFeatureACPI()) ++ guestarch = libvirt_utils.get_arch(image_meta) ++ if (guestarch not in (fields.Architecture.ARMV7, fields.Architecture.AARCH64) or ++ image_meta.properties.get('hw_firmware_type') == 'uefi'): ++ guest.features.append(vconfig.LibvirtConfigGuestFeatureACPI()) + guest.features.append(vconfig.LibvirtConfigGuestFeatureAPIC()) + + if (virt_type in ("qemu", "kvm") and +@@ -4799,7 +4802,7 @@ + self._conf_non_lxc_uml(virt_type, guest, root_device_name, rescue, + instance, inst_path, image_meta, disk_info) + +- self._set_features(guest, instance.os_type, caps, virt_type) ++ self._set_features(guest, instance.os_type, image_meta, caps, virt_type) + self._set_clock(guest, instance.os_type, image_meta, virt_type) + + storage_configs = self._get_guest_storage_config( diff --git a/mcp/salt-formulas/armband/init.sls b/mcp/salt-formulas/armband/init.sls new file mode 100644 index 0000000..6e7b6ad --- /dev/null +++ b/mcp/salt-formulas/armband/init.sls @@ -0,0 +1,6 @@ +include: + - armband.qemu + - armband.vgabios + - armband.nova + - armband.libvirt_driver + diff --git a/mcp/salt-formulas/armband/libvirt_driver.sls b/mcp/salt-formulas/armband/libvirt_driver.sls new file mode 100644 index 0000000..9b47e2f --- /dev/null +++ b/mcp/salt-formulas/armband/libvirt_driver.sls @@ -0,0 +1,11 @@ +nova-libvirt-vga-console: + file.patch: + - name: /usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py + - source: salt://armband/files/nova-Update-vga-console-defaults-for-armv7-aarch64.diff + - hash: "71b22839913e6351edc70b6d59505f17" + +nova-libvirt-ACPI-AAVMF: + file.patch: + - name: /usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py + - source: salt://armband/files/nova-libvirt-AArch64-ACPI-depends-on-AAVMF.diff + - hash: "c02969d59f16f57242eb74a75e46b0cf" diff --git a/mcp/salt-formulas/armband/nova.sls b/mcp/salt-formulas/armband/nova.sls new file mode 100644 index 0000000..674f371 --- /dev/null +++ b/mcp/salt-formulas/armband/nova.sls @@ -0,0 +1,30 @@ +{% if grains['virtual'] == 'kvm' %} +nova_virt_type: + file.replace: + - name: "/etc/nova/nova.conf" + - pattern: '^virt_type\s*=.*$' + - repl: "virt_type = qemu" +{% endif %} +nova_pointer_model: + file.replace: + - name: "/etc/nova/nova.conf" + - pattern: '^#pointer_model\s*=.*$' + - repl: "pointer_model = ps2mouse" +nova_cpu_mode: + file.replace: + - name: "/etc/nova/nova.conf" + - pattern: '^cpu_mode\s*=\s*host-passthrough' + - repl: "cpu_mode = custom" +nova_cpu_model: + file.replace: + - name: "/etc/nova/nova.conf" + - pattern: '^#cpu_model\s*=.*$' + {% if grains['virtual'] == 'kvm' %} + - repl: "cpu_model = cortex-a57" + {% else %} + - repl: "cpu_model = host" + {% endif %} +restart_nova-compute: + cmd: + - run + - name: "service nova-compute restart" diff --git a/mcp/salt-formulas/armband/qemu.sls b/mcp/salt-formulas/armband/qemu.sls new file mode 100644 index 0000000..ecdb5ae --- /dev/null +++ b/mcp/salt-formulas/armband/qemu.sls @@ -0,0 +1,7 @@ +qemu-efi: + pkg.installed +/etc/libvirt/qemu.conf: + file.replace: + - pattern: ^#security_driver =.*$ + - repl: "security_driver = \"none\"" + diff --git a/mcp/salt-formulas/armband/vgabios.sls b/mcp/salt-formulas/armband/vgabios.sls new file mode 100644 index 0000000..a31eafa --- /dev/null +++ b/mcp/salt-formulas/armband/vgabios.sls @@ -0,0 +1,6 @@ +vgabios: + pkg.installed +/usr/share/qemu/vgabios-stdvga.bin: + file.symlink: + - target: "/usr/share/vgabios/vgabios.bin" +