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':
|