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
This commit is contained in:
huangtianhua 2015-06-03 14:47:55 +08:00
parent d83e8ac397
commit 8140409e63
4 changed files with 29 additions and 15 deletions

View File

@ -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())

View File

@ -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'])

View File

@ -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()

View File

@ -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)