aboutsummaryrefslogtreecommitdiffstats
path: root/patches/fuel-library/arm64-bug-fixes/0005-nova-libvirt-fix-delete-instance-with-nvram.patch
blob: e2d5f73bf3ed1a06793c4cefd73b8c7c3d5c805f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: 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: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
Date: Thu, 19 Jan 2017 23:03:54 +0100
Subject: [PATCH] nova: libvirt: fix delete instance with nvram

Backported from [1].

Closes-bug: 1567807

[1] https://review.openstack.org/#/q/
    539d381434ccadcdc3f5d58c2705c35558a3a065

Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
---
 .../files/nova-libvirt-delete-with-nvram.patch     | 70 ++++++++++++++++++++++
 .../openstack_tasks/manifests/roles/compute.pp     | 12 ++++
 2 files changed, 82 insertions(+)
 create mode 100644 deployment/puppet/openstack/files/nova-libvirt-delete-with-nvram.patch

diff --git a/deployment/puppet/openstack/files/nova-libvirt-delete-with-nvram.patch b/deployment/puppet/openstack/files/nova-libvirt-delete-with-nvram.patch
new file mode 100644
index 0000000..5d4f67c
--- /dev/null
+++ b/deployment/puppet/openstack/files/nova-libvirt-delete-with-nvram.patch
@@ -0,0 +1,70 @@
+From: Kevin Zhao <kevin.zhao@linaro.org>
+Date: Thu, 5 Jan 2017 21:32:41 +0000
+Subject: [PATCH] libvirt: fix nova can't delete the instance with nvram
+
+Currently libvirt needs a flag when deleting an VM with a nvram file,
+without which nova can't delete an instance booted with UEFI. Add
+deletion flag for NVRAM. Also add a test case.
+
+[ Alexandru Avadanii ]
+Removed chunks affecting tests and adapted for OPNFV Armband.
+
+Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
+Co-authored-by: Derek Higgins <derekh@redhat.com>
+Change-Id: I46baa952b6c3a1a4c5cf2660931f317cafb5757d
+Closes-Bug: #1567807
+---
+
+diff --git a/virt/libvirt/driver.py b/virt/libvirt/driver.py
+--- a/virt/libvirt/driver.py
++++ b/virt/libvirt/driver.py
+@@ -903,7 +903,8 @@ class LibvirtDriver(driver.ComputeDriver):
+         try:
+             guest = self._host.get_guest(instance)
+             try:
+-                guest.delete_configuration()
++                support_uefi = self._has_uefi_support()
++                guest.delete_configuration(support_uefi)
+             except libvirt.libvirtError as e:
+                 with excutils.save_and_reraise_exception():
+                     errcode = e.get_error_code()
+@@ -1241,7 +1242,8 @@ class LibvirtDriver(driver.ComputeDriver):
+             #             If any part of this block fails, the domain is
+             #             re-defined regardless.
+             if guest.has_persistent_configuration():
+-                guest.delete_configuration()
++                support_uefi = self._has_uefi_support()
++                guest.delete_configuration(support_uefi)
+
+             # Start copy with VIR_DOMAIN_REBASE_REUSE_EXT flag to
+             # allow writing to existing external volume file
+@@ -1760,7 +1762,8 @@ class LibvirtDriver(driver.ComputeDriver):
+             #             If any part of this block fails, the domain is
+             #             re-defined regardless.
+             if guest.has_persistent_configuration():
+-                guest.delete_configuration()
++                support_uefi = self._has_uefi_support()
++                guest.delete_configuration(support_uefi)
+
+             # NOTE (rmk): Establish a temporary mirror of our root disk and
+             #             issue an abort once we have a complete copy.
+diff --git a/virt/libvirt/guest.py b/virt/libvirt/guest.py
+--- a/virt/libvirt/guest.py
++++ b/virt/libvirt/guest.py
+@@ -262,11 +262,13 @@ class Guest(object):
+                 yield VCPUInfo(
+                     id=vcpu[0], cpu=vcpu[3], state=vcpu[1], time=vcpu[2])
+
+-    def delete_configuration(self):
++    def delete_configuration(self, support_uefi=False):
+         """Undefines a domain from hypervisor."""
+         try:
+-            self._domain.undefineFlags(
+-                libvirt.VIR_DOMAIN_UNDEFINE_MANAGED_SAVE)
++            flags = libvirt.VIR_DOMAIN_UNDEFINE_MANAGED_SAVE
++            if support_uefi:
++                flags |= libvirt.VIR_DOMAIN_UNDEFINE_NVRAM
++            self._domain.undefineFlags(flags)
+         except libvirt.libvirtError:
+             LOG.debug("Error from libvirt during undefineFlags. %d"
+                       "Retrying with undefine", self.id)
diff --git a/deployment/puppet/openstack_tasks/manifests/roles/compute.pp b/deployment/puppet/openstack_tasks/manifests/roles/compute.pp
index f6e6698..dd0c034 100644
--- a/deployment/puppet/openstack_tasks/manifests/roles/compute.pp
+++ b/deployment/puppet/openstack_tasks/manifests/roles/compute.pp
@@ -301,6 +301,18 @@ class openstack_tasks::roles::compute {
     unless  => "patch -p1 -R -N --dry-run < ${nova_path}/libvirt-vga-console.patch",
     cwd     => $nova_path,
     require => [Package['patch']],
+  } ->
+  # FIXME(armband): Backport fix: nova delete instance with nvram
+  file { "${nova_path}/nova-libvirt-delete-with-nvram.patch":
+    ensure => "file",
+    source => "puppet:///modules/openstack/nova-libvirt-delete-with-nvram.patch",
+  } ->
+  exec { 'nova libvirt delete instance with nvram':
+    path    => ['/usr/bin'],
+    command => "patch -p1 < ${nova_path}/nova-libvirt-delete-with-nvram.patch",
+    unless  => "patch -p1 -R -N --dry-run < ${nova_path}/nova-libvirt-delete-with-nvram.patch",
+    cwd     => $nova_path,
+    require => [Package['patch']],
   }

   class { '::nova::cache':