summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrabi <ramishra@redhat.com>2016-12-16 13:28:24 +0530
committerrabi <ramishra@redhat.com>2017-01-10 15:39:46 +0530
commit047120ac519322ebdab2e4eb13e93da07cf98b84 (patch)
tree582b820722b983fac4da80a62a690904927d5d7e
parent1d78f3baaebaf98c1a753c3965f082b0d3c55ee1 (diff)
downloadheat-047120ac519322ebdab2e4eb13e93da07cf98b84.tar.gz
Use metadata and personality with server rebuild
Nova allows setting instance metadata and injecting personality files with a server rebuild, we should allow that too. Change-Id: Ic2ce21c0dc06315b9040a56bfd9e6864097ba2a7 Closes-Bug: #1650470 (cherry picked from commit 2f317af1beeaf3c464a0ad7b13bec9c0786ea202)
-rw-r--r--heat/engine/clients/os/nova.py5
-rw-r--r--heat/engine/resources/openstack/nova/server.py11
-rw-r--r--heat/tests/openstack/nova/test_server.py9
3 files changed, 19 insertions, 6 deletions
diff --git a/heat/engine/clients/os/nova.py b/heat/engine/clients/os/nova.py
index 9d60c1c49..b207c4895 100644
--- a/heat/engine/clients/os/nova.py
+++ b/heat/engine/clients/os/nova.py
@@ -496,12 +496,13 @@ echo -e '%s\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers
result=msg, resource_status=status)
def rebuild(self, server_id, image_id, password=None,
- preserve_ephemeral=False):
+ preserve_ephemeral=False, meta=None, files=None):
"""Rebuild the server and call check_rebuild to verify."""
server = self.fetch_server(server_id)
if server:
server.rebuild(image_id, password=password,
- preserve_ephemeral=preserve_ephemeral)
+ preserve_ephemeral=preserve_ephemeral,
+ meta=meta, files=files)
return True
else:
return False
diff --git a/heat/engine/resources/openstack/nova/server.py b/heat/engine/resources/openstack/nova/server.py
index 064397804..0fa363b1a 100644
--- a/heat/engine/resources/openstack/nova/server.py
+++ b/heat/engine/resources/openstack/nova/server.py
@@ -1081,13 +1081,22 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin,
image_update_policy = (
prop_diff.get(self.IMAGE_UPDATE_POLICY) or
self.properties[self.IMAGE_UPDATE_POLICY])
+ instance_meta = prop_diff.get(self.METADATA,
+ self.properties[self.METADATA])
+
+ if instance_meta is not None:
+ instance_meta = self.client_plugin().meta_serialize(instance_meta)
+ personality_files = self.properties[self.PERSONALITY]
+
image = prop_diff[self.IMAGE]
preserve_ephemeral = (
image_update_policy == 'REBUILD_PRESERVE_EPHEMERAL')
password = (prop_diff.get(self.ADMIN_PASS) or
self.properties[self.ADMIN_PASS])
kwargs = {'password': password,
- 'preserve_ephemeral': preserve_ephemeral}
+ 'preserve_ephemeral': preserve_ephemeral,
+ 'meta': instance_meta,
+ 'files': personality_files}
prg = progress.ServerUpdateProgress(self.resource_id,
'rebuild',
handler_extra={'args': (image,),
diff --git a/heat/tests/openstack/nova/test_server.py b/heat/tests/openstack/nova/test_server.py
index 6a883bbd3..2338c3399 100644
--- a/heat/tests/openstack/nova/test_server.py
+++ b/heat/tests/openstack/nova/test_server.py
@@ -1854,11 +1854,13 @@ class ServersTest(common.HeatTestCase):
if 'REBUILD' == policy:
mock_rebuild.assert_called_once_with(
return_server, '2', password=password,
- preserve_ephemeral=False)
+ preserve_ephemeral=False,
+ meta=None, files={})
else:
mock_rebuild.assert_called_once_with(
return_server, '2', password=password,
- preserve_ephemeral=True)
+ preserve_ephemeral=True,
+ meta=None, files={})
def test_server_update_image_rebuild_status_rebuild(self):
# Normally we will see 'REBUILD' first and then 'ACTIVE".
@@ -1915,7 +1917,8 @@ class ServersTest(common.HeatTestCase):
six.text_type(error))
self.assertEqual((server.UPDATE, server.FAILED), server.state)
mock_rebuild.assert_called_once_with(
- return_server, '2', password=None, preserve_ephemeral=False)
+ return_server, '2', password=None, preserve_ephemeral=False,
+ meta=None, files={})
def test_server_update_properties(self):
return_server = self.fc.servers.list()[1]