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:
parent
d83e8ac397
commit
8140409e63
@ -1469,9 +1469,10 @@ class Stack(collections.Mapping):
|
|||||||
Restore the given snapshot, invoking handle_restore on all resources.
|
Restore the given snapshot, invoking handle_restore on all resources.
|
||||||
'''
|
'''
|
||||||
self.updated_time = datetime.datetime.utcnow()
|
self.updated_time = datetime.datetime.utcnow()
|
||||||
|
|
||||||
env = environment.Environment(snapshot.data['environment'])
|
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,
|
newstack = self.__class__(self.context, self.name, template,
|
||||||
timeout_mins=self.timeout_mins,
|
timeout_mins=self.timeout_mins,
|
||||||
disable_rollback=self.disable_rollback)
|
disable_rollback=self.disable_rollback)
|
||||||
@ -1559,6 +1560,7 @@ class Stack(collections.Mapping):
|
|||||||
'id': self.id,
|
'id': self.id,
|
||||||
'action': self.action,
|
'action': self.action,
|
||||||
'environment': self.env.user_env_as_dict(),
|
'environment': self.env.user_env_as_dict(),
|
||||||
|
'files': self.t.files,
|
||||||
'status': self.status,
|
'status': self.status,
|
||||||
'template': self.t.t,
|
'template': self.t.t,
|
||||||
'resources': dict((res.name, res.prepare_abandon())
|
'resources': dict((res.name, res.prepare_abandon())
|
||||||
|
@ -37,9 +37,9 @@ class SnapshotServiceTest(common.HeatTestCase):
|
|||||||
self.engine.create_periodic_tasks()
|
self.engine.create_periodic_tasks()
|
||||||
utils.setup_dummy_db()
|
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)
|
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')
|
stk.state_set(stk.CREATE, stk.COMPLETE, 'mock completion')
|
||||||
|
|
||||||
return stk
|
return stk
|
||||||
@ -75,7 +75,8 @@ class SnapshotServiceTest(common.HeatTestCase):
|
|||||||
|
|
||||||
@mock.patch.object(stack.Stack, 'load')
|
@mock.patch.object(stack.Stack, 'load')
|
||||||
def test_create_snapshot(self, mock_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
|
mock_load.return_value = stk
|
||||||
|
|
||||||
snapshot = self.engine.stack_snapshot(
|
snapshot = self.engine.stack_snapshot(
|
||||||
@ -90,6 +91,7 @@ class SnapshotServiceTest(common.HeatTestCase):
|
|||||||
self.assertEqual("COMPLETE", snapshot['status'])
|
self.assertEqual("COMPLETE", snapshot['status'])
|
||||||
self.assertEqual("SNAPSHOT", snapshot['data']['action'])
|
self.assertEqual("SNAPSHOT", snapshot['data']['action'])
|
||||||
self.assertEqual("COMPLETE", snapshot['data']['status'])
|
self.assertEqual("COMPLETE", snapshot['data']['status'])
|
||||||
|
self.assertEqual(files, snapshot['data']['files'])
|
||||||
self.assertEqual(stk.id, snapshot['data']['id'])
|
self.assertEqual(stk.id, snapshot['data']['id'])
|
||||||
self.assertIsNotNone(stk.updated_time)
|
self.assertIsNotNone(stk.updated_time)
|
||||||
self.assertIsNotNone(snapshot['creation_time'])
|
self.assertIsNotNone(snapshot['creation_time'])
|
||||||
|
@ -2189,16 +2189,18 @@ class StackServiceTest(common.HeatTestCase):
|
|||||||
'type': u'AWS::EC2::Instance'}}
|
'type': u'AWS::EC2::Instance'}}
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
ret = self.eng.abandon_stack(self.ctx, self.stack.identifier())
|
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('CREATE', ret['action'])
|
||||||
self.assertEqual('COMPLETE', ret['status'])
|
self.assertEqual('COMPLETE', ret['status'])
|
||||||
self.assertEqual('service_abandon_stack', ret['name'])
|
self.assertEqual('service_abandon_stack', ret['name'])
|
||||||
|
self.assertEqual({}, ret['files'])
|
||||||
self.assertIn('id', ret)
|
self.assertIn('id', ret)
|
||||||
self.assertEqual(expected_res, ret['resources'])
|
self.assertEqual(expected_res, ret['resources'])
|
||||||
self.assertEqual(self.stack.t.t, ret['template'])
|
self.assertEqual(self.stack.t.t, ret['template'])
|
||||||
self.assertIn('project_id', ret)
|
self.assertIn('project_id', ret)
|
||||||
self.assertIn('stack_user_project_id', ret)
|
self.assertIn('stack_user_project_id', ret)
|
||||||
self.assertIn('environment', ret)
|
self.assertIn('environment', ret)
|
||||||
|
self.assertIn('files', ret)
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
self.eng.thread_group_mgr.groups[self.stack.id].wait()
|
self.eng.thread_group_mgr.groups[self.stack.id].wait()
|
||||||
|
|
||||||
|
@ -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 = '''
|
subnet_template = '''
|
||||||
heat_template_version: 2013-05-23
|
heat_template_version: 2013-05-23
|
||||||
resources:
|
resources:
|
||||||
@ -3276,12 +3288,8 @@ class ServersTest(common.HeatTestCase):
|
|||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
|
|
||||||
def test_server_restore(self):
|
def test_server_restore(self):
|
||||||
t = template_format.parse(wp_template)
|
t = template_format.parse(ns_template)
|
||||||
# create server with network id
|
tmpl = template.Template(t, files={'a_file': 'the content'})
|
||||||
sp = t['Resources']['WebServer']['Properties']
|
|
||||||
sp['networks'] = [{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'}]
|
|
||||||
|
|
||||||
tmpl = template.Template(t)
|
|
||||||
stack = parser.Stack(utils.dummy_context(), "server_restore", tmpl)
|
stack = parser.Stack(utils.dummy_context(), "server_restore", tmpl)
|
||||||
stack.store()
|
stack.store()
|
||||||
|
|
||||||
@ -3293,8 +3301,8 @@ class ServersTest(common.HeatTestCase):
|
|||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
image=744, flavor=3, key_name='test',
|
image=744, flavor=3, key_name=None,
|
||||||
name=utils.PhysName("server_restore", "WebServer"),
|
name=utils.PhysName("server_restore", "server"),
|
||||||
nics=[{'net-id': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'}],
|
nics=[{'net-id': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'}],
|
||||||
security_groups=[],
|
security_groups=[],
|
||||||
userdata=mox.IgnoreArg(), scheduler_hints=None,
|
userdata=mox.IgnoreArg(), scheduler_hints=None,
|
||||||
@ -3324,7 +3332,7 @@ class ServersTest(common.HeatTestCase):
|
|||||||
self.assertEqual((stack.SNAPSHOT, stack.COMPLETE), stack.state)
|
self.assertEqual((stack.SNAPSHOT, stack.COMPLETE), stack.state)
|
||||||
|
|
||||||
data = stack.prepare_abandon()
|
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'
|
resource_data['snapshot_image_id'] = 'CentOS 5.2'
|
||||||
fake_snapshot = collections.namedtuple(
|
fake_snapshot = collections.namedtuple(
|
||||||
'Snapshot', ('data', 'stack_id'))(data, stack.id)
|
'Snapshot', ('data', 'stack_id'))(data, stack.id)
|
||||||
|
Loading…
Reference in New Issue
Block a user