def test_resource_data(self): self.stack = self.create_stack(stack_name='resource_data_test', stub=False) self.m.StubOutWithMock(clients.OpenStackClients, 'keystone') clients.OpenStackClients.keystone().MultipleTimes().AndReturn( fakes.FakeKeystoneClient( access='anaccesskey', secret='verysecret')) self.m.ReplayAll() self.stack.create() rsrc = self.stack['signal_handler'] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual('anaccesskey', rs_data.get('access_key')) self.assertEqual('verysecret', rs_data.get('secret_key')) self.assertEqual(2, len(rs_data.keys())) # And that we remove it on delete scheduler.TaskRunner(rsrc.delete)() self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual(0, len(rs_data.keys()))
def test_resource_data(self): self.stack = self.create_stack(stack_name='resource_data_test', stub=False) self.m.StubOutWithMock(clients.OpenStackClients, 'keystone') clients.OpenStackClients.keystone().MultipleTimes().AndReturn( fakes.FakeKeystoneClient(access='anaccesskey', secret='verysecret', credential_id='mycredential')) self.m.ReplayAll() self.stack.create() rsrc = self.stack['signal_handler'] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual('mycredential', rs_data.get('credential_id')) self.assertEqual('anaccesskey', rs_data.get('access_key')) self.assertEqual('verysecret', rs_data.get('secret_key')) self.assertEqual('1234', rs_data.get('user_id')) self.assertEqual(rsrc.resource_id, rs_data.get('user_id')) self.assertEqual(4, len(rs_data.keys())) # And that we remove it on delete scheduler.TaskRunner(rsrc.delete)() self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual(1, len(rs_data.keys())) self.m.VerifyAll()
def test_access_key(self): self.m.StubOutWithMock(user.AccessKey, "keystone") self.m.StubOutWithMock(user.User, "keystone") user.AccessKey.keystone().MultipleTimes().AndReturn(self.fc) user.User.keystone().MultipleTimes().AndReturn(self.fc) self.m.ReplayAll() t = template_format.parse(user_accesskey_template) stack = utils.parse_stack(t) self.create_user(t, stack, "CfnUser") rsrc = self.create_access_key(t, stack, "HostKeys") self.assertRaises(resource.UpdateReplace, rsrc.handle_update, {}, {}, {}) self.assertEqual(self.fc.access, rsrc.resource_id) self.assertEqual(self.fc.secret, rsrc._secret) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual(self.fc.secret, rs_data.get("secret_key")) self.assertEqual(self.fc.credential_id, rs_data.get("credential_id")) self.assertEqual(2, len(rs_data.keys())) self.assertEqual(utils.PhysName(stack.name, "CfnUser"), rsrc.FnGetAtt("UserName")) rsrc._secret = None self.assertEqual(self.fc.secret, rsrc.FnGetAtt("SecretAccessKey")) self.assertRaises(exception.InvalidTemplateAttribute, rsrc.FnGetAtt, "Foo") scheduler.TaskRunner(rsrc.delete)() self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) self.m.VerifyAll()
def handle_update(self, json_snippet, tmpl_diff, prop_diff): if self.MEMBERS in prop_diff: members = set(prop_diff[self.MEMBERS]) rd_members = db_api.resource_data_get_all(self) old_members = set(rd_members.keys()) client = self.neutron() for member in old_members - members: member_id = rd_members[member] try: client.delete_member(member_id) except NeutronClientException as ex: if ex.status_code != 404: raise ex db_api.resource_data_delete(self, member) pool = self.properties[self.POOL_ID] nova_client = self.nova() protocol_port = self.properties[self.PROTOCOL_PORT] for member in members - old_members: address = nova_utils.server_to_ipaddress(nova_client, member) lb_member = client.create_member({ 'member': { 'pool_id': pool, 'address': address, 'protocol_port': protocol_port}})['member'] db_api.resource_data_set(self, member, lb_member['id'])
def test_cinder_snapshot_error(self): fv = vt_base.FakeVolume('creating', 'available') fb = vt_base.FakeBackup('creating', 'error') stack_name = 'test_volume_stack' cinder.CinderClientPlugin._create().MultipleTimes().AndReturn( self.cinder_fc) self.cinder_fc.volumes.create( size=1, availability_zone=None, name='test_name', description='test_description').AndReturn(fv) self.m.StubOutWithMock(self.cinder_fc.backups, 'create') self.cinder_fc.backups.create('vol-123').AndReturn(fb) self.m.ReplayAll() t = template_format.parse(single_cinder_volume_template) stack = utils.parse_stack(t, stack_name=stack_name) rsrc = stack['volume'] scheduler.TaskRunner(rsrc.create)() self.assertRaises(exception.ResourceFailure, scheduler.TaskRunner(rsrc.snapshot)) self.assertEqual((rsrc.SNAPSHOT, rsrc.FAILED), rsrc.state) self.assertEqual("Error: error", rsrc.status_reason) self.assertEqual({}, db_api.resource_data_get_all(rsrc)) self.m.VerifyAll()
def test_delete_keypair_legacy(self): rsrc = self._user_create(stack_name='user_testdel', project_id='aprojectdel', user_id='auserdel') self.m.StubOutWithMock(fakes.FakeKeystoneClient, 'delete_stack_domain_user_keypair') fakes.FakeKeystoneClient.delete_stack_domain_user_keypair( user_id='auserdel', project_id='aprojectdel', credential_id='acredential').AndRaise(ValueError()) self.m.StubOutWithMock(fakes.FakeKeystoneClient, 'delete_ec2_keypair') fakes.FakeKeystoneClient.delete_ec2_keypair( user_id='auserdel', credential_id='acredential').AndReturn(None) self.m.ReplayAll() scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) db_api.resource_data_set(rsrc, 'credential_id', 'acredential') db_api.resource_data_set(rsrc, 'access_key', 'access123') db_api.resource_data_set(rsrc, 'secret_key', 'verysecret') rsrc._delete_keypair() rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual({'user_id': 'auserdel'}, rs_data) self.m.VerifyAll()
def test_access_key_get_from_keystone(self): self.m.StubOutWithMock(user.AccessKey, 'keystone') user.AccessKey.keystone().MultipleTimes().AndReturn(self.fc) self.m.ReplayAll() t = template_format.parse(user_accesskey_template) stack = utils.parse_stack(t) self.create_user(t, stack, 'CfnUser') rsrc = self.create_access_key(t, stack, 'HostKeys') # Delete the resource data for secret_key, to test that existing # stacks which don't have the resource_data stored will continue # working via retrieving the keypair from keystone db_api.resource_data_delete(rsrc, 'credential_id') db_api.resource_data_delete(rsrc, 'secret_key') rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual(0, len(rs_data.keys())) rsrc._secret = None self.assertEqual(self.fc.secret, rsrc.FnGetAtt('SecretAccessKey')) scheduler.TaskRunner(rsrc.delete)() self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) self.m.VerifyAll()
def test_resource_data(self): self.stack = self.create_stack(stack_name='resource_data_test', stub=False) self.m.StubOutWithMock(clients.OpenStackClients, 'keystone') clients.OpenStackClients.keystone().MultipleTimes().AndReturn( fakes.FakeKeystoneClient( access='anaccesskey', secret='verysecret', credential_id='mycredential')) self.m.ReplayAll() self.stack.create() rsrc = self.stack['signal_handler'] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual('mycredential', rs_data.get('credential_id')) self.assertEqual('anaccesskey', rs_data.get('access_key')) self.assertEqual('verysecret', rs_data.get('secret_key')) self.assertEqual('1234', rs_data.get('user_id')) self.assertEqual(rsrc.resource_id, rs_data.get('user_id')) self.assertEqual(4, len(rs_data.keys())) self.m.VerifyAll()
def test_get_user_id(self): self.stack = self.create_stack(stack_name='resource_data_test', stub=False) self.m.StubOutWithMock(clients.OpenStackClients, 'keystone') clients.OpenStackClients.keystone().MultipleTimes().AndReturn( fakes.FakeKeystoneClient( access='anaccesskey', secret='verysecret')) self.m.ReplayAll() self.stack.create() rsrc = self.stack['signal_handler'] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual('1234', rs_data.get('user_id')) self.assertEqual('1234', rsrc.resource_id) self.assertEqual('1234', rsrc._get_user_id()) # Check user id can still be fetched from resource_id # if the resource data is not there. db_api.resource_data_delete(rsrc, 'user_id') self.assertRaises( exception.NotFound, db_api.resource_data_get, rsrc, 'user_id') self.assertEqual('1234', rsrc._get_user_id()) self.m.VerifyAll()
def test_get_user_id(self): self.stack = self.create_stack(stack_name='resource_data_test', stub=False) self.m.StubOutWithMock(clients.OpenStackClients, 'keystone') clients.OpenStackClients.keystone().MultipleTimes().AndReturn( fakes.FakeKeystoneClient(access='anaccesskey', secret='verysecret')) self.m.ReplayAll() self.stack.create() rsrc = self.stack['signal_handler'] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual('1234', rs_data.get('user_id')) self.assertEqual('1234', rsrc.resource_id) self.assertEqual('1234', rsrc._get_user_id()) # Check user id can still be fetched from resource_id # if the resource data is not there. db_api.resource_data_delete(rsrc, 'user_id') self.assertRaises(exception.NotFound, db_api.resource_data_get, rsrc, 'user_id') self.assertEqual('1234', rsrc._get_user_id()) self.m.VerifyAll()
def test_access_key(self): t = template_format.parse(user_accesskey_template) stack = utils.parse_stack(t) self.create_user(t, stack, 'CfnUser') rsrc = self.create_access_key(t, stack, 'HostKeys') self.m.VerifyAll() self.assertEqual(self.fc.access, rsrc.resource_id) self.assertEqual(self.fc.secret, rsrc._secret) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual(self.fc.secret, rs_data.get('secret_key')) self.assertEqual(self.fc.credential_id, rs_data.get('credential_id')) self.assertEqual(2, len(rs_data.keys())) self.assertEqual(utils.PhysName(stack.name, 'CfnUser'), rsrc.FnGetAtt('UserName')) rsrc._secret = None self.assertEqual(self.fc.secret, rsrc.FnGetAtt('SecretAccessKey')) self.assertRaises(exception.InvalidTemplateAttribute, rsrc.FnGetAtt, 'Foo') scheduler.TaskRunner(rsrc.delete)() self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) self.m.VerifyAll()
def test_cinder_snapshot(self): fv = vt_base.FakeVolume('creating', 'available') fb = vt_base.FakeBackup('creating', 'available') stack_name = 'test_cvolume_snpsht_stack' cinder.CinderClientPlugin._create().MultipleTimes().AndReturn( self.cinder_fc) self.cinder_fc.volumes.create(size=1, availability_zone=None, description='test_description', name='test_name').AndReturn(fv) self.m.StubOutWithMock(self.cinder_fc.backups, 'create') self.cinder_fc.backups.create('vol-123').AndReturn(fb) self.m.ReplayAll() t = template_format.parse(single_cinder_volume_template) stack = utils.parse_stack(t, stack_name=stack_name) rsrc = stack['volume'] scheduler.TaskRunner(rsrc.create)() scheduler.TaskRunner(rsrc.snapshot)() self.assertEqual((rsrc.SNAPSHOT, rsrc.COMPLETE), rsrc.state) self.assertEqual({'backup_id': 'backup-123'}, db_api.resource_data_get_all(rsrc)) self.m.VerifyAll()
def test_access_key(self): t = template_format.parse(user_accesskey_template) stack = utils.parse_stack(t) self.create_user(t, stack, 'CfnUser') rsrc = self.create_access_key(t, stack, 'HostKeys') self.m.VerifyAll() self.assertRaises(resource.UpdateReplace, rsrc.handle_update, {}, {}, {}) self.assertEqual(self.fc.access, rsrc.resource_id) self.assertEqual(self.fc.secret, rsrc._secret) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual(self.fc.secret, rs_data.get('secret_key')) self.assertEqual(self.fc.credential_id, rs_data.get('credential_id')) self.assertEqual(2, len(rs_data.keys())) self.assertEqual(utils.PhysName(stack.name, 'CfnUser'), rsrc.FnGetAtt('UserName')) rsrc._secret = None self.assertEqual(self.fc.secret, rsrc.FnGetAtt('SecretAccessKey')) self.assertRaises(exception.InvalidTemplateAttribute, rsrc.FnGetAtt, 'Foo') scheduler.TaskRunner(rsrc.delete)() self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) self.m.VerifyAll()
def test_delete_keypair_legacy(self): rsrc = self._user_create(stack_name='user_testdel', project_id='aprojectdel', user_id='auserdel') self.m.StubOutWithMock(fakes.FakeKeystoneClient, 'delete_stack_domain_user_keypair') fakes.FakeKeystoneClient.delete_stack_domain_user_keypair( user_id='auserdel', project_id='aprojectdel', credential_id='acredential').AndRaise(ValueError()) self.m.StubOutWithMock(fakes.FakeKeystoneClient, 'delete_ec2_keypair') fakes.FakeKeystoneClient.delete_ec2_keypair( user_id='auserdel', credential_id='acredential').AndReturn(None) self.m.ReplayAll() scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) rsrc.data_set('credential_id', 'acredential') rsrc.data_set('access_key', 'access123') rsrc.data_set('secret_key', 'verysecret') rsrc._delete_keypair() rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual({'user_id': 'auserdel'}, rs_data) self.m.VerifyAll()
def handle_update(self, json_snippet, tmpl_diff, prop_diff): if self.MEMBERS in prop_diff: members = set(prop_diff[self.MEMBERS]) rd_members = db_api.resource_data_get_all(self) old_members = set(rd_members.keys()) client = self.neutron() for member in old_members - members: member_id = rd_members[member] try: client.delete_member(member_id) except NeutronClientException as ex: if ex.status_code != 404: raise ex db_api.resource_data_delete(self, member) pool = self.properties[self.POOL_ID] nova_client = self.nova() protocol_port = self.properties[self.PROTOCOL_PORT] for member in members - old_members: address = nova_utils.server_to_ipaddress(nova_client, member) lb_member = client.create_member({ 'member': { 'pool_id': pool, 'address': address, 'protocol_port': protocol_port } })['member'] db_api.resource_data_set(self, member, lb_member['id'])
def do_resource_data_list(): ctxt = context.get_admin_context() data = db_api.resource_data_get_all(ctxt, CONF.command.resource_id) print_format = "%-16s %-64s" for k in data.keys(): print(print_format % (k, data[k]))
def get_abandon_data(self): return { 'name': self.name, 'resource_id': self.resource_id, 'type': self.type(), 'action': self.action, 'status': self.status, 'metadata': self.metadata, 'resource_data': db_api.resource_data_get_all(self) }
def test_abandon_with_resource_data(self): tmpl = {"Type": "Foo"} res = generic_rsrc.GenericResource("test_resource", tmpl, self.stack) self.m.StubOutWithMock(db_api, "resource_data_get_all") db_api.resource_data_get_all(res).AndReturn({"test-key": "test-value"}) self.m.ReplayAll() expected = { "action": "INIT", "metadata": {}, "name": "test_resource", "resource_data": {"test-key": "test-value"}, "resource_id": None, "status": "COMPLETE", "type": "Foo", } actual = res.get_abandon_data() self.assertEqual(expected, actual) self.m.VerifyAll()
def get_abandon_data(self): return { "name": self.name, "resource_id": self.resource_id, "type": self.type(), "action": self.action, "status": self.status, "metadata": self.metadata, "resource_data": dict((r.key, r.value) for r in db_api.resource_data_get_all(self)), }
def prepare_abandon(self): self.abandon_in_progress = True return { 'name': self.name, 'resource_id': self.resource_id, 'type': self.type(), 'action': self.action, 'status': self.status, 'metadata': self.metadata, 'resource_data': db_api.resource_data_get_all(self) }
def test_handle_create_no_stack_project(self): rsrc = self._user_create(stack_name='user_test123', project_id='aproject123', user_id='auser123') self.m.ReplayAll() scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual({'user_id': 'auser123'}, rs_data) self.m.VerifyAll()
def test_handle_create_existing_project(self): rsrc = self._user_create(stack_name='stackuser_crexistprj', project_id='aproject456', user_id='auser456', create_project=False) self.m.ReplayAll() scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual({'user_id': 'auser456'}, rs_data) self.m.VerifyAll()
def test_handle_create_existing_project(self): rsrc = self._user_create(stack_name='user_test456', project_id='aproject456', user_id='auser456', create_project=False) self.m.ReplayAll() with utils.UUIDStub(self.resource_id): scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual({'user_id': 'auser456'}, rs_data) self.m.VerifyAll()
def _load_data(self, resource): '''Load the resource state from its DB representation.''' self.resource_id = resource.nova_instance self.action = resource.action self.status = resource.status self.status_reason = resource.status_reason self.id = resource.id try: self._data = db_api.resource_data_get_all(self, resource.data) except exception.NotFound: self._data = {} self._rsrc_metadata = resource.rsrc_metadata self.created_time = resource.created_at self.updated_time = resource.updated_at
def _load_data(self, resource): """Load the resource state from its DB representation.""" self.resource_id = resource.nova_instance self.action = resource.action self.status = resource.status self.status_reason = resource.status_reason self.id = resource.id try: self._data = db_api.resource_data_get_all(self, resource.data) except exception.NotFound: self._data = {} self._rsrc_metadata = resource.rsrc_metadata self.created_time = resource.created_at self.updated_time = resource.updated_at
def data(self): ''' Resource data for this resource Use methods data_set and data_delete to modify the resource data for this resource. :returns: a dict representing the resource data for this resource. ''' if self._data is None and self.id: try: self._data = db_api.resource_data_get_all(self) except exception.NotFound: pass return self._data or {}
def test_handle_create_fail_keypair_raise(self): self.stack = self.create_stack(stack_name='create_fail_keypair') self.m.StubOutWithMock(stack_user.StackUser, '_create_keypair') stack_user.StackUser._create_keypair().AndRaise(Exception('Failed')) self.m.ReplayAll() self.stack.create() rsrc = self.stack['signal_handler'] rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual((rsrc.CREATE, rsrc.FAILED), rsrc.state) self.assertIn('Failed', rsrc.status_reason) self.assertEqual('1234', rs_data.get('user_id')) self.assertIsNone(rsrc.resource_id) self.m.VerifyAll()
def __init__(self, name, definition, stack): if '/' in name: raise ValueError(_('Resource name may not contain "/"')) self.stack = stack self.context = stack.context self.name = name if isinstance(definition, rsrc_defn.ResourceDefinition): self.t = definition else: self.t = self.stack.resolve_static_data(definition) self.reparse() self.attributes = Attributes(self.name, self.attributes_schema, self._resolve_attribute) self.abandon_in_progress = False resource = stack.db_resource_get(name) if resource: self.resource_id = resource.nova_instance self.action = resource.action self.status = resource.status self.status_reason = resource.status_reason self.id = resource.id try: self._data = db_api.resource_data_get_all(self, resource.data) except exception.NotFound: self._data = {} self._rsrc_metadata = resource.rsrc_metadata self.created_time = resource.created_at self.updated_time = resource.updated_at else: self.resource_id = None # if the stack is being deleted, assume we've already been deleted if stack.action == stack.DELETE: self.action = self.DELETE else: self.action = self.INIT self.status = self.COMPLETE self.status_reason = '' self.id = None self._data = {} self._rsrc_metadata = None self.created_time = None self.updated_time = None
def __init__(self, name, json_snippet, stack): if '/' in name: raise ValueError(_('Resource name may not contain "/"')) self.stack = stack self.context = stack.context self.name = name self.json_snippet = json_snippet self.reparse() self.attributes = Attributes(self.name, self.attributes_schema, self._resolve_attribute) self.abandon_in_progress = False if stack.id: resource = db_api.resource_get_by_name_and_stack(self.context, name, stack.id) else: resource = None if resource: self.resource_id = resource.nova_instance self.action = resource.action self.status = resource.status self.status_reason = resource.status_reason self.id = resource.id try: self._data = db_api.resource_data_get_all(self, resource.data) except exception.NotFound: self._data = {} self.created_time = resource.created_at self.updated_time = resource.updated_at else: self.resource_id = None # if the stack is being deleted, assume we've already been deleted if stack.action == stack.DELETE: self.action = self.DELETE else: self.action = self.INIT self.status = self.COMPLETE self.status_reason = '' self.id = None self._data = {} self.created_time = None self.updated_time = None
def _load_data(self, resource): '''Load the resource state from its DB representation.''' self.resource_id = resource.nova_instance self.action = resource.action self.status = resource.status self.status_reason = resource.status_reason self.id = resource.id try: self._data = db_api.resource_data_get_all(self, resource.data) except exception.NotFound: self._data = {} self._rsrc_metadata = resource.rsrc_metadata self._stored_properties_data = resource.properties_data self.created_time = resource.created_at self.updated_time = resource.updated_at # self.t = resource.rsrc_defn self.frozen_defn = json.loads(resource.rsrc_defn) self.version = resource.version self.rsrc_defn_hash = resource.rsrc_defn_hash
def test_resource_data(self): self.stack = self.create_stack(stack_name="resource_data_test", stub=False) self.stub_keystoneclient(access="anaccesskey", secret="verysecret", credential_id="mycredential") self.m.ReplayAll() self.stack.create() rsrc = self.stack["signal_handler"] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual("mycredential", rs_data.get("credential_id")) self.assertEqual("anaccesskey", rs_data.get("access_key")) self.assertEqual("verysecret", rs_data.get("secret_key")) self.assertEqual("1234", rs_data.get("user_id")) self.assertEqual(rsrc.resource_id, rs_data.get("user_id")) self.assertEqual(4, len(rs_data.keys())) self.m.VerifyAll()
def test_delete_keypair_notfound(self): rsrc = self._user_create(stack_name='stackuser_testdel_kpr_notfound', project_id='aprojectdel', user_id='auserdel') self.m.StubOutWithMock(fakes.FakeKeystoneClient, 'delete_stack_domain_user_keypair') fakes.FakeKeystoneClient.delete_stack_domain_user_keypair( user_id='auserdel', project_id='aprojectdel', credential_id='acredential').AndReturn(None) self.m.ReplayAll() scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) rsrc.data_set('credential_id', 'acredential') rsrc._delete_keypair() rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual({'user_id': 'auserdel'}, rs_data) self.m.VerifyAll()
def test_handle_create_fail_keypair_none(self): self.stack = self.create_stack(stack_name='create_fail_keypair', stub=False) class FakeKeystoneClientFail(fakes.FakeKeystoneClient): def create_ec2_keypair(self, name): return None self.m.StubOutWithMock(clients.OpenStackClients, 'keystone') clients.OpenStackClients.keystone().MultipleTimes().AndReturn( FakeKeystoneClientFail(user_id='123xyz')) self.m.ReplayAll() self.stack.create() rsrc = self.stack['signal_handler'] rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual((rsrc.CREATE, rsrc.FAILED), rsrc.state) self.assertIn('Error creating ec2 keypair', rsrc.status_reason) self.assertEqual('123xyz', rs_data.get('user_id')) self.assertIsNone(rsrc.resource_id)
def test_get_user_id(self): self.stack = self.create_stack(stack_name="resource_data_test", stub=False) self.stub_keystoneclient(access="anaccesskey", secret="verysecret") self.m.ReplayAll() self.stack.create() rsrc = self.stack["signal_handler"] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual("1234", rs_data.get("user_id")) self.assertEqual("1234", rsrc.resource_id) self.assertEqual("1234", rsrc._get_user_id()) # Check user id can still be fetched from resource_id # if the resource data is not there. db_api.resource_data_delete(rsrc, "user_id") self.assertRaises(exception.NotFound, db_api.resource_data_get, rsrc, "user_id") self.assertEqual("1234", rsrc._get_user_id()) self.m.VerifyAll()
def test_resource_data(self): self.stack = self.create_stack(stack_name='resource_data_test', stub=False) self.stub_keystoneclient(access='anaccesskey', secret='verysecret', credential_id='mycredential') self.m.ReplayAll() self.stack.create() rsrc = self.stack['signal_handler'] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) # Ensure the resource data has been stored correctly rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual('mycredential', rs_data.get('credential_id')) self.assertEqual('anaccesskey', rs_data.get('access_key')) self.assertEqual('verysecret', rs_data.get('secret_key')) self.assertEqual('1234', rs_data.get('user_id')) self.assertEqual(rsrc.resource_id, rs_data.get('user_id')) self.assertEqual(4, len(rs_data.keys())) self.m.VerifyAll()
def test_create_keypair(self): rsrc = self._user_create(stack_name='user_testdel', project_id='aprojectdel', user_id='auserdel') # create_stack_domain_user_keypair(self, user_id, project_id): self.m.StubOutWithMock(fakes.FakeKeystoneClient, 'create_stack_domain_user_keypair') fakes.FakeKeystoneClient.create_stack_domain_user_keypair( user_id='auserdel', project_id='aprojectdel').AndReturn(self.fc.creds) self.m.ReplayAll() scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) kp = rsrc._create_keypair() self.assertEqual(self.fc.credential_id, kp.id) self.assertEqual(self.fc.access, kp.access) self.assertEqual(self.fc.secret, kp.secret) rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual(self.fc.credential_id, rs_data['credential_id']) self.assertEqual(self.fc.access, rs_data['access_key']) self.assertEqual(self.fc.secret, rs_data['secret_key']) self.m.VerifyAll()
def test_create_keypair(self): rsrc = self._user_create(stack_name='user_testdel', project_id='aprojectdel', user_id='auserdel') # create_stack_domain_user_keypair(self, user_id, project_id): self.m.StubOutWithMock(fakes.FakeKeystoneClient, 'create_stack_domain_user_keypair') fakes.FakeKeystoneClient.create_stack_domain_user_keypair( user_id='auserdel', project_id='aprojectdel').AndReturn( self.fc.creds) self.m.ReplayAll() scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) kp = rsrc._create_keypair() self.assertEqual(self.fc.credential_id, kp.id) self.assertEqual(self.fc.access, kp.access) self.assertEqual(self.fc.secret, kp.secret) rs_data = db_api.resource_data_get_all(rsrc) self.assertEqual(self.fc.credential_id, rs_data['credential_id']) self.assertEqual(self.fc.access, rs_data['access_key']) self.assertEqual(self.fc.secret, rs_data['secret_key']) self.m.VerifyAll()
def get_all(cls, resource, *args, **kwargs): # this method only returns dict, so we won't use objects mechanism here return db_api.resource_data_get_all(resource, *args, **kwargs)
def test_lb(self): tmpl = template_format.parse(as_template) network_body = { "network": { "id": str(uuid.uuid4()), "name": "testnet", "admin_state_up": True } } subnet_body = { "subnet": { "name": "testsubnet", "id": str(uuid.uuid4()), "network_id": network_body['network']['id'], "ip_version": 4, "cidr": "10.0.3.0/24", "allocation_pools": [ { "start": "10.0.3.20", "end": "10.0.3.150" } ], "gateway_ip": "10.0.3.1" } } self.params["SubnetId"] = subnet_body['subnet']['id'] mon_block = { 'health_monitor': tmpl['Resources']['myMonitor']['Properties'] } mon_block['health_monitor']['admin_state_up'] = True mon_ret_block = copy.deepcopy(mon_block) mon_ret_block['health_monitor']['id'] = str(uuid.uuid4()) mon_ret_block['health_monitor']['status'] = 'ACTIVE' pool_block = {'pool': {}} tmp_pool_block = tmpl['Resources']['myPool']['Properties'] for val in ['lb_method', 'protocol', 'name', 'description']: pool_block['pool'][val] = tmp_pool_block[val] pool_block['pool']['admin_state_up'] = True pool_block['pool']['subnet_id'] = self.params['SubnetId'] pool_block['pool']['admin_state_up'] = True pool_ret_block = copy.deepcopy(pool_block) pool_ret_block['pool']['id'] = str(uuid.uuid4()) pool_ret_block['pool']['status'] = 'ACTIVE' tmp_vip_block = tmp_pool_block.pop('vip') vip_block = { 'vip': { 'protocol': pool_block['pool']['protocol'], 'description': tmp_vip_block['description'], 'admin_state_up': True, 'subnet_id': self.params['SubnetId'], 'connection_limit': tmp_vip_block['connection_limit'], 'pool_id': pool_ret_block['pool']['id'], 'address': tmp_vip_block['address'], 'protocol_port': tmp_vip_block['protocol_port'], 'name': tmp_vip_block['name'] } } vip_ret_block = copy.deepcopy(vip_block) vip_ret_block['vip']['id'] = str(uuid.uuid4()) vip_ret_block['vip']['status'] = 'ACTIVE' port_block = { 'port': { 'network_id': network_body['network']['id'], 'fixed_ips': [ { 'subnet_id': subnet_body['subnet']['id'], } ], 'admin_state_up': True } } port_ret_block = copy.deepcopy(port_block) port_ret_block['port']['id'] = str(uuid.uuid4()) membera_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.4' } } membera_ret_block = copy.deepcopy(membera_block) membera_ret_block['member']['id'] = str(uuid.uuid4()) memberb_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.5' } } memberb_ret_block = copy.deepcopy(memberb_block) memberb_ret_block['member']['id'] = str(uuid.uuid4()) memberc_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.6' } } memberc_ret_block = copy.deepcopy(memberc_block) memberc_ret_block['member']['id'] = str(uuid.uuid4()) class id_type(object): def __init__(self, id, name): self.id = id self.name = name image_list = [id_type(id='768b5464-3df5-4abf-be33-63b60f8b99d0', name='foo')] flavor_list = [id_type(id='768b5464-3df5-4abf-be33-63b60f8b99d1', name='bar')] instances = {} clients.OpenStackClients.keystone().AndReturn( fakes.FakeKeystoneClient()) clients.neutronclient.Client.create_health_monitor(mon_block).\ AndReturn(mon_ret_block) clients.neutronclient.Client.create_pool(pool_block).\ AndReturn(pool_ret_block) clients.neutronclient.Client.associate_health_monitor( pool_ret_block['pool']['id'], {'health_monitor': { 'id': mon_ret_block['health_monitor']['id'] }}).AndReturn(None) clients.neutronclient.Client.create_vip(vip_block).\ AndReturn(vip_ret_block) clients.neutronclient.Client.show_pool(pool_ret_block['pool']['id']).\ AndReturn(pool_ret_block) clients.neutronclient.Client.show_vip(vip_ret_block['vip']['id']).\ AndReturn(vip_ret_block) clients.OpenStackClients.keystone().AndReturn( fakes.FakeKeystoneClient()) clients.OpenStackClients.keystone().AndReturn( fakes.FakeKeystoneClient()) parser.Stack.validate() instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) nova_utils.server_to_ipaddress( mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('1.2.3.4') clients.neutronclient.Client.create_member(membera_block).\ AndReturn(membera_ret_block) instances[instid] = membera_ret_block['member']['id'] # Start of update clients.OpenStackClients.keystone().AndReturn( fakes.FakeKeystoneClient()) parser.Stack.validate() instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) instances[instid] = memberb_ret_block['member']['id'] instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) nova_utils.server_to_ipaddress( mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('1.2.3.5') clients.neutronclient.Client.create_member(memberb_block).\ AndReturn(memberb_ret_block) nova_utils.server_to_ipaddress( mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('1.2.3.6') clients.neutronclient.Client.create_member(memberc_block).\ AndReturn(memberc_ret_block) self.m.ReplayAll() # Start of stack create env = {'parameters': self.params} tmpl = template_format.parse(as_template) stack = parser.Stack(self.ctx, 'update_test_stack', template.Template(tmpl), environment.Environment(env)) stack.store() stack.create() self.assertEqual(stack.state, (parser.Stack.CREATE, parser.Stack.COMPLETE)) # Start of stack update stack2 = parser.Stack.load(self.ctx, stack_id=stack.id) tmpl2 = copy.deepcopy(tmpl) tmpl2['Resources']['SvrGrp']['Properties']['DesiredCapacity'] = '3' update_stack = parser.Stack(self.ctx, 'update_test_stack', template.Template(tmpl2), environment.Environment(env)) stack2.update(update_stack) self.assertEqual(stack2.state, (parser.Stack.UPDATE, parser.Stack.COMPLETE)) members = db_api.resource_data_get_all(stack['ElasticLoadBalancer']) self.assertEqual(3, len(members.keys())) self.m.VerifyAll()
def test_lb(self): tmpl = template_format.parse(as_template) network_body = { "network": { "id": str(uuid.uuid4()), "name": "testnet", "admin_state_up": True } } subnet_body = { "subnet": { "name": "testsubnet", "id": str(uuid.uuid4()), "network_id": network_body['network']['id'], "ip_version": 4, "cidr": "10.0.3.0/24", "allocation_pools": [{ "start": "10.0.3.20", "end": "10.0.3.150" }], "gateway_ip": "10.0.3.1" } } self.params["SubnetId"] = subnet_body['subnet']['id'] mon_block = { 'health_monitor': tmpl['Resources']['myMonitor']['Properties'] } mon_block['health_monitor']['admin_state_up'] = True mon_ret_block = copy.deepcopy(mon_block) mon_ret_block['health_monitor']['id'] = str(uuid.uuid4()) mon_ret_block['health_monitor']['status'] = 'ACTIVE' pool_block = {'pool': {}} tmp_pool_block = tmpl['Resources']['myPool']['Properties'] for val in ['lb_method', 'protocol', 'name', 'description']: pool_block['pool'][val] = tmp_pool_block[val] pool_block['pool']['admin_state_up'] = True pool_block['pool']['subnet_id'] = self.params['SubnetId'] pool_block['pool']['admin_state_up'] = True pool_ret_block = copy.deepcopy(pool_block) pool_ret_block['pool']['id'] = str(uuid.uuid4()) pool_ret_block['pool']['status'] = 'ACTIVE' tmp_vip_block = tmp_pool_block.pop('vip') vip_block = { 'vip': { 'protocol': pool_block['pool']['protocol'], 'description': tmp_vip_block['description'], 'admin_state_up': True, 'subnet_id': self.params['SubnetId'], 'connection_limit': tmp_vip_block['connection_limit'], 'pool_id': pool_ret_block['pool']['id'], 'address': tmp_vip_block['address'], 'protocol_port': tmp_vip_block['protocol_port'], 'name': tmp_vip_block['name'] } } vip_ret_block = copy.deepcopy(vip_block) vip_ret_block['vip']['id'] = str(uuid.uuid4()) vip_ret_block['vip']['status'] = 'ACTIVE' port_block = { 'port': { 'network_id': network_body['network']['id'], 'fixed_ips': [{ 'subnet_id': subnet_body['subnet']['id'], }], 'admin_state_up': True } } port_ret_block = copy.deepcopy(port_block) port_ret_block['port']['id'] = str(uuid.uuid4()) membera_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.4' } } membera_ret_block = copy.deepcopy(membera_block) membera_ret_block['member']['id'] = str(uuid.uuid4()) memberb_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.5' } } memberb_ret_block = copy.deepcopy(memberb_block) memberb_ret_block['member']['id'] = str(uuid.uuid4()) memberc_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.6' } } memberc_ret_block = copy.deepcopy(memberc_block) memberc_ret_block['member']['id'] = str(uuid.uuid4()) class id_type(object): def __init__(self, id, name): self.id = id self.name = name instances = {} clients.OpenStackClients.keystone().AndReturn( fakes.FakeKeystoneClient()) clients.neutronclient.Client.create_health_monitor(mon_block).\ AndReturn(mon_ret_block) clients.neutronclient.Client.create_pool(pool_block).\ AndReturn(pool_ret_block) clients.neutronclient.Client.associate_health_monitor( pool_ret_block['pool']['id'], { 'health_monitor': { 'id': mon_ret_block['health_monitor']['id'] } }).AndReturn(None) clients.neutronclient.Client.create_vip(vip_block).\ AndReturn(vip_ret_block) clients.neutronclient.Client.show_pool(pool_ret_block['pool']['id']).\ AndReturn(pool_ret_block) clients.neutronclient.Client.show_vip(vip_ret_block['vip']['id']).\ AndReturn(vip_ret_block) clients.OpenStackClients.keystone().AndReturn( fakes.FakeKeystoneClient()) clients.OpenStackClients.keystone().AndReturn( fakes.FakeKeystoneClient()) parser.Stack.validate() instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) nova_utils.server_to_ipaddress(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('1.2.3.4') clients.neutronclient.Client.create_member(membera_block).\ AndReturn(membera_ret_block) instances[instid] = membera_ret_block['member']['id'] # Start of update clients.OpenStackClients.keystone().AndReturn( fakes.FakeKeystoneClient()) parser.Stack.validate() instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) instances[instid] = memberb_ret_block['member']['id'] instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) nova_utils.server_to_ipaddress(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('1.2.3.5') clients.neutronclient.Client.create_member(memberb_block).\ AndReturn(memberb_ret_block) nova_utils.server_to_ipaddress(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('1.2.3.6') clients.neutronclient.Client.create_member(memberc_block).\ AndReturn(memberc_ret_block) self.m.ReplayAll() # Start of stack create env = {'parameters': self.params} tmpl = template_format.parse(as_template) stack = parser.Stack(self.ctx, 'update_test_stack', template.Template(tmpl), environment.Environment(env)) stack.store() stack.create() self.assertEqual((parser.Stack.CREATE, parser.Stack.COMPLETE), stack.state) # Start of stack update stack2 = parser.Stack.load(self.ctx, stack_id=stack.id) tmpl2 = copy.deepcopy(tmpl) tmpl2['Resources']['SvrGrp']['Properties']['DesiredCapacity'] = '3' update_stack = parser.Stack(self.ctx, 'update_test_stack', template.Template(tmpl2), environment.Environment(env)) stack2.update(update_stack) self.assertEqual((parser.Stack.UPDATE, parser.Stack.COMPLETE), stack2.state) members = db_api.resource_data_get_all(stack['ElasticLoadBalancer']) self.assertEqual(3, len(members.keys())) self.m.VerifyAll()
def test_lb(self): tmpl = template_format.parse(as_template) network_body = { "network": { "id": str(uuid.uuid4()), "name": "testnet", "admin_state_up": True } } subnet_body = { "subnet": { "name": "testsubnet", "id": str(uuid.uuid4()), "network_id": network_body['network']['id'], "ip_version": 4, "cidr": "10.0.3.0/24", "allocation_pools": [ { "start": "10.0.3.20", "end": "10.0.3.150" } ], "gateway_ip": "10.0.3.1" } } self.params["SubnetId"] = subnet_body['subnet']['id'] mon_block = { 'health_monitor': tmpl['Resources']['myMonitor']['Properties'] } mon_block['health_monitor']['admin_state_up'] = True mon_ret_block = copy.deepcopy(mon_block) mon_ret_block['health_monitor']['id'] = str(uuid.uuid4()) mon_ret_block['health_monitor']['status'] = 'ACTIVE' pool_block = {'pool': {}} tmp_pool_block = tmpl['Resources']['myPool']['Properties'] for val in ['lb_method', 'protocol', 'name', 'description']: pool_block['pool'][val] = tmp_pool_block[val] pool_block['pool']['admin_state_up'] = True pool_block['pool']['subnet_id'] = self.params['SubnetId'] pool_block['pool']['admin_state_up'] = True pool_ret_block = copy.deepcopy(pool_block) pool_ret_block['pool']['id'] = str(uuid.uuid4()) pool_ret_block['pool']['status'] = 'ACTIVE' tmp_vip_block = tmp_pool_block.pop('vip') vip_block = { 'vip': { 'protocol': pool_block['pool']['protocol'], 'description': tmp_vip_block['description'], 'admin_state_up': True, 'subnet_id': self.params['SubnetId'], 'connection_limit': tmp_vip_block['connection_limit'], 'pool_id': pool_ret_block['pool']['id'], 'address': tmp_vip_block['address'], 'protocol_port': tmp_vip_block['protocol_port'], 'name': tmp_vip_block['name'] } } vip_ret_block = copy.deepcopy(vip_block) vip_ret_block['vip']['id'] = str(uuid.uuid4()) vip_ret_block['vip']['status'] = 'ACTIVE' membera_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.4' } } membera_ret_block = copy.deepcopy(membera_block) membera_ret_block['member']['id'] = str(uuid.uuid4()) memberb_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.5' } } memberb_ret_block = copy.deepcopy(memberb_block) memberb_ret_block['member']['id'] = str(uuid.uuid4()) memberc_block = { 'member': { 'protocol_port': 8080, 'pool_id': pool_ret_block['pool']['id'], 'address': '1.2.3.6' } } memberc_ret_block = copy.deepcopy(memberc_block) memberc_ret_block['member']['id'] = str(uuid.uuid4()) neutronclient.Client.create_health_monitor(mon_block).\ AndReturn(mon_ret_block) neutronclient.Client.create_pool(pool_block).\ AndReturn(pool_ret_block) neutronclient.Client.associate_health_monitor( pool_ret_block['pool']['id'], {'health_monitor': { 'id': mon_ret_block['health_monitor']['id'] }}).AndReturn(None) neutronclient.Client.create_vip(vip_block).\ AndReturn(vip_ret_block) neutronclient.Client.show_pool(pool_ret_block['pool']['id']).\ AndReturn(pool_ret_block) neutronclient.Client.show_vip(vip_ret_block['vip']['id']).\ AndReturn(vip_ret_block) parser.Stack.validate() instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) self.stub_ImageConstraint_validate() self.stub_FlavorConstraint_validate() nova.NovaClientPlugin.server_to_ipaddress( mox.IgnoreArg()).AndReturn('1.2.3.4') neutronclient.Client.create_member(membera_block).\ AndReturn(membera_ret_block) # Start of update parser.Stack.validate() instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) instid = str(uuid.uuid4()) instance.Instance.handle_create().AndReturn(instid) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(False) instance.Instance.check_create_complete(mox.IgnoreArg())\ .AndReturn(True) nova.NovaClientPlugin.server_to_ipaddress( mox.IgnoreArg()).AndReturn('1.2.3.5') neutronclient.Client.create_member(memberb_block).\ AndReturn(memberb_ret_block) nova.NovaClientPlugin.server_to_ipaddress( mox.IgnoreArg()).AndReturn('1.2.3.6') neutronclient.Client.create_member(memberc_block).\ AndReturn(memberc_ret_block) self.m.ReplayAll() # Start of stack create env = {'parameters': self.params} tmpl = template_format.parse(as_template) stack = parser.Stack(self.ctx, 'update_test_stack', template.Template(tmpl), environment.Environment(env)) stack.store() stack.create() self.assertEqual((parser.Stack.CREATE, parser.Stack.COMPLETE), stack.state) # Start of stack update stack2 = parser.Stack.load(self.ctx, stack_id=stack.id) tmpl2 = copy.deepcopy(tmpl) tmpl2['Resources']['SvrGrp']['Properties']['DesiredCapacity'] = '3' update_stack = parser.Stack(self.ctx, 'update_test_stack', template.Template(tmpl2), environment.Environment(env)) stack2.update(update_stack) self.assertEqual((parser.Stack.UPDATE, parser.Stack.COMPLETE), stack2.state) members = db_api.resource_data_get_all(stack['ElasticLoadBalancer']) self.assertEqual(3, len(members.keys())) self.m.VerifyAll()