From 8140409e6345d76fbfb0d433c263826eaff4860a Mon Sep 17 00:00:00 2001 From: huangtianhua Date: Wed, 3 Jun 2015 14:47:55 +0800 Subject: [PATCH] Inherit files when restore We use stack.prepare_abandon() to make the snapshot data, but the data have no 'files' then will result in ValueError raised(No content found in the "files" section for get_file path) when restore. This patch will store 'files' for snapshot data( also for prepare abandon data), then we can get 'files' from the snapshot data when stack restore. Change-Id: I0fddf92e950b93dce70eb8e5a562cf8d0046a9ab Closes-Bug: #1461375 --- heat/engine/stack.py | 6 ++++-- heat/tests/engine/test_stack_snapshot.py | 8 +++++--- heat/tests/test_engine_service.py | 4 +++- heat/tests/test_server.py | 26 ++++++++++++++++-------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/heat/engine/stack.py b/heat/engine/stack.py index fdc47002d..8624b9fac 100755 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -1469,9 +1469,10 @@ class Stack(collections.Mapping): Restore the given snapshot, invoking handle_restore on all resources. ''' self.updated_time = datetime.datetime.utcnow() - env = environment.Environment(snapshot.data['environment']) - template = tmpl.Template(snapshot.data['template'], env=env) + files = snapshot.data['files'] + template = tmpl.Template(snapshot.data['template'], + env=env, files=files) newstack = self.__class__(self.context, self.name, template, timeout_mins=self.timeout_mins, disable_rollback=self.disable_rollback) @@ -1559,6 +1560,7 @@ class Stack(collections.Mapping): 'id': self.id, 'action': self.action, 'environment': self.env.user_env_as_dict(), + 'files': self.t.files, 'status': self.status, 'template': self.t.t, 'resources': dict((res.name, res.prepare_abandon()) diff --git a/heat/tests/engine/test_stack_snapshot.py b/heat/tests/engine/test_stack_snapshot.py index 6c7e65290..6b753f322 100644 --- a/heat/tests/engine/test_stack_snapshot.py +++ b/heat/tests/engine/test_stack_snapshot.py @@ -37,9 +37,9 @@ class SnapshotServiceTest(common.HeatTestCase): self.engine.create_periodic_tasks() utils.setup_dummy_db() - def _create_stack(self, stack_name): + def _create_stack(self, stack_name, files=None): t = template_format.parse(tools.wp_template) - stk = utils.parse_stack(t, stack_name=stack_name) + stk = utils.parse_stack(t, stack_name=stack_name, files=files) stk.state_set(stk.CREATE, stk.COMPLETE, 'mock completion') return stk @@ -75,7 +75,8 @@ class SnapshotServiceTest(common.HeatTestCase): @mock.patch.object(stack.Stack, 'load') def test_create_snapshot(self, mock_load): - stk = self._create_stack('stack_snapshot_create') + files = {'a_file': 'the contents'} + stk = self._create_stack('stack_snapshot_create', files=files) mock_load.return_value = stk snapshot = self.engine.stack_snapshot( @@ -90,6 +91,7 @@ class SnapshotServiceTest(common.HeatTestCase): self.assertEqual("COMPLETE", snapshot['status']) self.assertEqual("SNAPSHOT", snapshot['data']['action']) self.assertEqual("COMPLETE", snapshot['data']['status']) + self.assertEqual(files, snapshot['data']['files']) self.assertEqual(stk.id, snapshot['data']['id']) self.assertIsNotNone(stk.updated_time) self.assertIsNotNone(snapshot['creation_time']) diff --git a/heat/tests/test_engine_service.py b/heat/tests/test_engine_service.py index 6c23d2aee..e1e294849 100644 --- a/heat/tests/test_engine_service.py +++ b/heat/tests/test_engine_service.py @@ -2189,16 +2189,18 @@ class StackServiceTest(common.HeatTestCase): 'type': u'AWS::EC2::Instance'}} self.m.ReplayAll() ret = self.eng.abandon_stack(self.ctx, self.stack.identifier()) - self.assertEqual(9, len(ret)) + self.assertEqual(10, len(ret)) self.assertEqual('CREATE', ret['action']) self.assertEqual('COMPLETE', ret['status']) self.assertEqual('service_abandon_stack', ret['name']) + self.assertEqual({}, ret['files']) self.assertIn('id', ret) self.assertEqual(expected_res, ret['resources']) self.assertEqual(self.stack.t.t, ret['template']) self.assertIn('project_id', ret) self.assertIn('stack_user_project_id', ret) self.assertIn('environment', ret) + self.assertIn('files', ret) self.m.VerifyAll() self.eng.thread_group_mgr.groups[self.stack.id].wait() diff --git a/heat/tests/test_server.py b/heat/tests/test_server.py index ebc9a77da..7f64cb939 100644 --- a/heat/tests/test_server.py +++ b/heat/tests/test_server.py @@ -64,6 +64,18 @@ wp_template = ''' } ''' +ns_template = ''' +heat_template_version: 2015-04-30 +resources: + server: + type: OS::Nova::Server + properties: + image: F17-x86_64-gold + flavor: m1.large + user_data: {get_file: a_file} + networks: [{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'}] +''' + subnet_template = ''' heat_template_version: 2013-05-23 resources: @@ -3276,12 +3288,8 @@ class ServersTest(common.HeatTestCase): self.m.VerifyAll() def test_server_restore(self): - t = template_format.parse(wp_template) - # create server with network id - sp = t['Resources']['WebServer']['Properties'] - sp['networks'] = [{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'}] - - tmpl = template.Template(t) + t = template_format.parse(ns_template) + tmpl = template.Template(t, files={'a_file': 'the content'}) stack = parser.Stack(utils.dummy_context(), "server_restore", tmpl) stack.store() @@ -3293,8 +3301,8 @@ class ServersTest(common.HeatTestCase): self.m.StubOutWithMock(self.fc.servers, 'create') self.fc.servers.create( - image=744, flavor=3, key_name='test', - name=utils.PhysName("server_restore", "WebServer"), + image=744, flavor=3, key_name=None, + name=utils.PhysName("server_restore", "server"), nics=[{'net-id': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'}], security_groups=[], userdata=mox.IgnoreArg(), scheduler_hints=None, @@ -3324,7 +3332,7 @@ class ServersTest(common.HeatTestCase): self.assertEqual((stack.SNAPSHOT, stack.COMPLETE), stack.state) data = stack.prepare_abandon() - resource_data = data['resources']['WebServer']['resource_data'] + resource_data = data['resources']['server']['resource_data'] resource_data['snapshot_image_id'] = 'CentOS 5.2' fake_snapshot = collections.namedtuple( 'Snapshot', ('data', 'stack_id'))(data, stack.id)