def _validate_mapping_conditions(self, network_view_json): db_network_views = dbi.get_network_views(self.ctx.session) db_mapping_conditions = dbi.get_mapping_conditions(self.ctx.session) expected_conditions = dict((nv['name'], nv['extattrs']) for nv in network_view_json if nv['extattrs']) expected_condition_rows = [] for netview in expected_conditions: netview_row = utils.find_one_in_list('network_view', netview, db_network_views) netview_id = netview_row.id for condition_name in expected_conditions[netview]: if 'Mapping' not in condition_name: continue values = expected_conditions[netview][condition_name]['value'] if not isinstance(values, list): expected_condition_rows.append(netview_id + DELIMITER + condition_name + DELIMITER + values) continue for value in values: expected_condition_rows.append(netview_id + DELIMITER + condition_name + DELIMITER + value) actual_condition_rows = utils.get_composite_values_from_records( ['network_view_id', 'neutron_object_name', 'neutron_object_value'], db_mapping_conditions) self.assertEqual(set(expected_condition_rows), set(actual_condition_rows))
def _update_mapping_conditions(self, discovered_netview, netview_id, participated): session = self._context.session mapping_conditions = dict() if participated: mapping_conditions = self._get_mapping_conditions( discovered_netview) discovered_condition_rows = [] for condition_name in mapping_conditions: conditions = [netview_id + DELIMITER + condition_name + DELIMITER + value for value in mapping_conditions[condition_name]] discovered_condition_rows += conditions mapping_condition_rows = utils.find_in_list( 'network_view_id', [netview_id], self.db_mapping_conditions) condition_rows = utils.get_composite_values_from_records( ['network_view_id', 'neutron_object_name', 'neutron_object_value'], mapping_condition_rows, DELIMITER) persisted_set = set(condition_rows) discovered_set = set(discovered_condition_rows) addable_set = discovered_set.difference(persisted_set) removable_set = persisted_set.difference(discovered_set) for condition_attr in addable_set: condition = condition_attr.split(DELIMITER) network_view_id = condition[0] neutron_object_name = condition[1] neutron_object_value = condition[2] dbi.add_mapping_condition(session, network_view_id, neutron_object_name, neutron_object_value) for condition_attr in removable_set: condition = condition_attr.split(DELIMITER) network_view_id = condition[0] neutron_object_name = condition[1] neutron_object_value = condition[2] dbi.remove_mapping_condition(session, network_view_id, neutron_object_name, neutron_object_value)
def _update_mapping_conditions(self, discovered_netview, netview_id, participated): session = self._context.session mapping_conditions = dict() if participated: mapping_conditions = self._get_mapping_conditions( discovered_netview) discovered_condition_rows = [] for condition_name in mapping_conditions: conditions = [ netview_id + DELIMITER + condition_name + DELIMITER + value for value in mapping_conditions[condition_name] ] discovered_condition_rows += conditions mapping_condition_rows = utils.find_in_list('network_view_id', [netview_id], self.db_mapping_conditions) condition_rows = utils.get_composite_values_from_records( ['network_view_id', 'neutron_object_name', 'neutron_object_value'], mapping_condition_rows, DELIMITER) persisted_set = set(condition_rows) discovered_set = set(discovered_condition_rows) addable_set = discovered_set.difference(persisted_set) removable_set = persisted_set.difference(discovered_set) for condition_attr in addable_set: condition = condition_attr.split(DELIMITER) network_view_id = condition[0] neutron_object_name = condition[1] neutron_object_value = condition[2] dbi.add_mapping_condition(session, network_view_id, neutron_object_name, neutron_object_value) for condition_attr in removable_set: condition = condition_attr.split(DELIMITER) network_view_id = condition[0] neutron_object_name = condition[1] neutron_object_value = condition[2] dbi.remove_mapping_condition(session, network_view_id, neutron_object_name, neutron_object_value)
def test_get_composite_values_from_records(self): grid_1_id = 100 grid_1_name = 'test grid 1' grid_2_id = 200 grid_2_name = 'test grid 2' dbi.remove_grids(self.ctx.session, [grid_1_id, grid_2_id]) dbi.add_grid(self.ctx.session, grid_1_id, grid_1_name, '{}', 'ON', 'gm-id-1') dbi.add_grid(self.ctx.session, grid_2_id, grid_2_name, '{}', 'OFF', 'gm-id-2') grids = dbi.get_grids(self.ctx.session) composite_keys = ['grid_id', 'grid_name'] delimiter = '-' composite_values = utils.get_composite_values_from_records( composite_keys, grids, delimiter) expected_value = str(grid_1_id) + delimiter + grid_1_name self.assertEqual(expected_value, composite_values[0]) expected_value = str(grid_2_id) + delimiter + grid_2_name self.assertEqual(expected_value, composite_values[1])
def _validate_member_mapping(self, network_view_json, network_json): db_members = dbi.get_members(self.ctx.session, grid_id=self.test_grid_config.grid_id) db_network_views = dbi.get_network_views(self.ctx.session) db_mapping_members = dbi.get_mapping_members(self.ctx.session) db_service_members = dbi.get_service_members(self.ctx.session) gm_row = utils.find_one_in_list('member_type', const.MEMBER_TYPE_GRID_MASTER, db_members) gm_member_id = gm_row.member_id dedicated_delegation_members = dict() for netview in network_view_json: netview_name = netview['name'] if (netview.get('cloud_info') and netview.get('cloud_info').get('delegated_member')): delegated_member = utils.find_one_in_list( 'member_name', netview['cloud_info']['delegated_member']['name'], db_members) dedicated_delegation_members[netview_name] = ( delegated_member.member_id) expected_mapping_members = [] expected_service_members = [] # get delegated authority members from network views for netview in dedicated_delegation_members: netview_row = utils.find_one_in_list('network_view', netview, db_network_views) netview_id = netview_row.id authority_member = dedicated_delegation_members[netview] mapping_relation = const.MAPPING_RELATION_DELEGATED mapping_row_info = (netview_id + DELIMITER + authority_member + DELIMITER + mapping_relation) expected_mapping_members.append(mapping_row_info) # get authority members from networks for network in network_json: netview = network['network_view'] netview_row = utils.find_one_in_list('network_view', netview, db_network_views) netview_id = netview_row.id mapping_relation = const.MAPPING_RELATION_GM_OWNED authority_member = gm_member_id if netview in dedicated_delegation_members: authority_member = dedicated_delegation_members[netview] mapping_relation = const.MAPPING_RELATION_DELEGATED elif (network.get('cloud_info') and network['cloud_info'].get('delegated_member')): delegated_member = utils.find_one_in_list( 'member_name', network['cloud_info']['delegated_member']['name'], db_members) authority_member = delegated_member.member_id mapping_relation = const.MAPPING_RELATION_DELEGATED mapping_row_info = (netview_id + DELIMITER + authority_member + DELIMITER + mapping_relation) if mapping_row_info not in expected_mapping_members: expected_mapping_members.append(mapping_row_info) if network.get('members'): for m in network['members']: if m['_struct'] == 'dhcpmember': dhcp_member = utils.find_one_in_list( 'member_name', m['name'], db_members) mapping_row_info = (netview_id + DELIMITER + dhcp_member.member_id + DELIMITER + const.SERVICE_TYPE_DHCP) if mapping_row_info not in expected_service_members: expected_service_members.append(mapping_row_info) if network.get('options'): dns_membe_ips = [] for option in network['options']: if option.get('name') == 'domain-name-servers': option_values = option.get('value') if option_values: dns_membe_ips = option_values.split(',') break for membe_ip in dns_membe_ips: dns_member = utils.find_one_in_list( 'member_ip', membe_ip, db_members) mapping_row_info = (netview_id + DELIMITER + dns_member.member_id + DELIMITER + const.SERVICE_TYPE_DNS) if mapping_row_info not in expected_service_members: expected_service_members.append(mapping_row_info) actual_mapping_members = utils.get_composite_values_from_records( ['network_view_id', 'member_id', 'mapping_relation'], db_mapping_members) self.assertEqual(set(expected_mapping_members), set(actual_mapping_members)) actual_service_members = utils.get_composite_values_from_records( ['network_view_id', 'member_id', 'service'], db_service_members) self.assertEqual(set(expected_service_members), set(actual_service_members))
def _sync_network_mapping(self, discovered_networks, discovered_delegations): """Discover networks and sync with db. The discovered network json contains the following data: - network view - network - cloud_info for delegated member if cloud platform is supported - dhcp members :param discovered_networks: discovered network json :param discovered_delegations: discovered delegation members :return: None """ session = self._context.session self._load_persisted_mappings() discovered_mapping = self._get_member_mapping(discovered_networks, discovered_delegations) # add or remove authority mapping members persisted_authority_members = utils.get_composite_values_from_records( ['network_view_id', 'member_id', 'mapping_relation'], self.db_authority_members, DELIMITER) persisted_set = set(persisted_authority_members) discovered_set = set(discovered_mapping['authority_members']) addable_set = discovered_set.difference(persisted_set) removable_set = persisted_set.difference(discovered_set) for authority_member_info in addable_set: authority_member = authority_member_info.split(DELIMITER) network_view_id = authority_member[0] member_id = authority_member[1] mapping_relation = authority_member[2] dbi.add_mapping_member(session, network_view_id, member_id, mapping_relation) for authority_member_info in removable_set: authority_member = authority_member_info.split(DELIMITER) network_view_id = authority_member[0] member_id = authority_member[1] dbi.remove_mapping_member(session, network_view_id, member_id) # add or remove service members persisted_service_members = utils.get_composite_values_from_records( ['network_view_id', 'member_id', 'service'], self.db_service_members, DELIMITER) persisted_set = set(persisted_service_members) discovered_set = set(discovered_mapping['service_members']) addable_set = discovered_set.difference(persisted_set) removable_set = persisted_set.difference(discovered_set) for service_member_info in addable_set: service_member = service_member_info.split(DELIMITER) network_view_id = service_member[0] member_id = service_member[1] service = service_member[2] dbi.add_service_member(session, network_view_id, member_id, service) for service_member_info in removable_set: service_member = service_member_info.split(DELIMITER) network_view_id = service_member[0] member_id = service_member[1] service = service_member[2] dbi.remove_service_member(session, network_view_id, member_id=member_id, service=service)
def test_grid_management(self): grid_list = [{'grid_id': 100, 'grid_name': 'Test Grid 1000', 'grid_connection': '{}', 'grid_status': 'ON'}, {'grid_id': 200, 'grid_name': 'Test Grid 2000', 'grid_connection': '{}', 'grid_status': 'OFF'}] # expects no grid db_grids = infoblox_db.get_grids(self.ctx.session) self.assertEqual(0, len(db_grids)) # test grid additions self._create_grids(grid_list) db_grids = infoblox_db.get_grids(self.ctx.session) actual_grid_rows = utils.get_composite_values_from_records( ['grid_id', 'grid_name', 'grid_connection', 'grid_status'], db_grids) expected_grid_rows = utils.get_composite_values_from_records( ['grid_id', 'grid_name', 'grid_connection', 'grid_status'], grid_list) self.assertEqual(expected_grid_rows, actual_grid_rows) # test grid retrieval by grid_id filter db_grids = infoblox_db.get_grids(self.ctx.session, grid_id=grid_list[0]['grid_id']) self.assertEqual(grid_list[0]['grid_id'], db_grids[0]['grid_id']) self.assertEqual(grid_list[0]['grid_name'], db_grids[0]['grid_name']) self.assertEqual(grid_list[0]['grid_connection'], db_grids[0]['grid_connection']) self.assertEqual(grid_list[0]['grid_connection'], db_grids[0]['grid_connection']) self.assertEqual(grid_list[0]['grid_status'], db_grids[0]['grid_status']) db_grids = infoblox_db.get_grids(self.ctx.session, grid_id=grid_list[1]['grid_id'], grid_name=grid_list[0]['grid_name']) self.assertEqual([], db_grids) # test grid retrieval by grid_id and grid_name filters db_grids = infoblox_db.get_grids(self.ctx.session, grid_id=grid_list[1]['grid_id'], grid_name=grid_list[1]['grid_name']) self.assertEqual(grid_list[1]['grid_id'], db_grids[0]['grid_id']) self.assertEqual(grid_list[1]['grid_name'], db_grids[0]['grid_name']) self.assertEqual(grid_list[1]['grid_connection'], db_grids[0]['grid_connection']) self.assertEqual(grid_list[1]['grid_connection'], db_grids[0]['grid_connection']) self.assertEqual(grid_list[1]['grid_status'], db_grids[0]['grid_status']) # test grid update grid_name_update = "Test Grid 1000 Enhanced" grid_connection_json = { "wapi_version": "2.0", "ssl_verify": False, "http_pool_connections": 100, "http_pool_maxsize": 100, "http_request_timeout": 120, "admin_user": {"name": "admin", "password": "******"} } grid_connection_json_string = jsonutils.dumps(grid_connection_json) infoblox_db.update_grid(self.ctx.session, grid_list[0]['grid_id'], grid_name_update, grid_connection_json_string) db_grids = infoblox_db.get_grids(self.ctx.session, grid_list[0]['grid_id']) self.assertEqual(grid_name_update, db_grids[0]['grid_name']) self.assertEqual(grid_connection_json_string, db_grids[0]['grid_connection']) # test grid removal infoblox_db.remove_grids(self.ctx.session, [grid_list[0]['grid_id']]) db_grids = infoblox_db.get_grids(self.ctx.session, grid_list[0]['grid_id']) self.assertEqual(0, len(db_grids)) # remove two grids self._create_grids([grid_list[0]]) infoblox_db.remove_grids(self.ctx.session, [grid_list[0]['grid_id'], grid_list[1]['grid_id']]) db_grids = infoblox_db.get_grids(self.ctx.session) self.assertEqual(0, len(db_grids))
def test_mapping_management_mapping_members(self): # prepare grid self._create_default_grid() # prepare grid members self._create_simple_members() db_members = infoblox_db.get_members(self.ctx.session) gm_member = utils.find_one_in_list('member_type', 'GM', db_members) # prepare network views netview_dict = {'default': gm_member.member_id} self._create_network_views(netview_dict) # get network view id db_network_views = infoblox_db.get_network_views(self.ctx.session) netview_default_row = utils.find_one_in_list('network_view', 'default', db_network_views) netview_id = netview_default_row.id # should be no mapping members db_mapping_members = infoblox_db.get_mapping_members(self.ctx.session) self.assertEqual(0, len(db_mapping_members)) # test mapping member additions expected_rows = [] member_id = db_members[0]['member_id'] relation = const.MAPPING_RELATION_DELEGATED infoblox_db.add_mapping_member(self.ctx.session, netview_id, member_id, relation) expected_rows.append(netview_id + ':' + member_id + ':' + relation) member_id = db_members[1]['member_id'] relation = const.MAPPING_RELATION_DELEGATED infoblox_db.add_mapping_member(self.ctx.session, netview_id, member_id, relation) expected_rows.append(netview_id + ':' + member_id + ':' + relation) db_mapping_members = infoblox_db.get_mapping_members(self.ctx.session) actual_rows = utils.get_composite_values_from_records( ['network_view_id', 'member_id', 'mapping_relation'], db_mapping_members, ':') self.assertEqual(expected_rows, actual_rows) # test mapping member update member_id = db_members[0]['member_id'] relation = const.MAPPING_RELATION_GM_OWNED infoblox_db.update_mapping_member(self.ctx.session, netview_id, member_id, relation) expected_rows[0] = netview_id + ':' + member_id + ':' + relation db_mapping_members = infoblox_db.get_mapping_members(self.ctx.session) actual_rows = utils.get_composite_values_from_records( ['network_view_id', 'member_id', 'mapping_relation'], db_mapping_members, ':') self.assertEqual(expected_rows, actual_rows) # test mapping member removals member_id = db_members[0]['member_id'] infoblox_db.remove_mapping_member(self.ctx.session, netview_id, member_id) db_mapping_members = infoblox_db.get_mapping_members( self.ctx.session, member_id=member_id) self.assertEqual([], db_mapping_members)
def test_mapping_management_mapping_conditions(self): # prepare grid self._create_default_grid() # prepare members self._create_simple_members() db_members = infoblox_db.get_members(self.ctx.session) gm_member = utils.find_one_in_list('member_type', 'GM', db_members) # prepare network views netview_dict = {'default': gm_member.member_id} self._create_network_views(netview_dict) db_network_views = infoblox_db.get_network_views(self.ctx.session) netview_default_row = utils.find_one_in_list('network_view', 'default', db_network_views) netview_id = netview_default_row.id # should be no conditions db_conditions = infoblox_db.get_mapping_conditions(self.ctx.session) self.assertEqual(0, len(db_conditions)) expected_rows = [] # test mapping condition additions neutron_object_name = const.EA_MAPPING_TENANT_ID neutron_object_value = '90fbad5a098a4b7cb98826128d5b40b3' expected_rows.append(netview_id + ':' + neutron_object_name + ':' + neutron_object_value) infoblox_db.add_mapping_condition(self.ctx.session, netview_id, neutron_object_name, neutron_object_value) neutron_object_name = const.EA_MAPPING_SUBNET_CIDR neutron_object_values = ["12.12.1.0/24", "13.13.1.0/24"] for value in neutron_object_values: expected_rows.append(netview_id + ':' + neutron_object_name + ':' + value) infoblox_db.add_mapping_conditions(self.ctx.session, netview_id, neutron_object_name, neutron_object_values) db_conditions = infoblox_db.get_mapping_conditions(self.ctx.session) actual_rows = utils.get_composite_values_from_records( ['network_view_id', 'neutron_object_name', 'neutron_object_value'], db_conditions, ':') self.assertEqual(expected_rows, actual_rows) # test mapping condition removals # - remove Tenant ID Mapping condition condition_1 = expected_rows[0].split(':') condition_neutron_object_name = condition_1[1] condition_neutron_object_value = condition_1[2] infoblox_db.remove_mapping_condition(self.ctx.session, netview_id, condition_neutron_object_name, condition_neutron_object_value) db_conditions = infoblox_db.get_mapping_conditions( self.ctx.session, network_view_id=netview_id, grid_id=self.grid_id, neutron_object_name=condition_neutron_object_name) self.assertEqual([], db_conditions) # - remove two Tenant CIDR Mapping conditions condition_2 = expected_rows[1].split(':') condition_3 = expected_rows[2].split(':') condition_neutron_object_name = condition_2[1] condition_neutron_object_values = [condition_2[2], condition_3[2]] infoblox_db.remove_mapping_conditions(self.ctx.session, netview_id, condition_neutron_object_name, condition_neutron_object_values) db_conditions = infoblox_db.get_mapping_conditions( self.ctx.session, network_view_id=netview_id, grid_id=self.grid_id, neutron_object_name=condition_neutron_object_name) self.assertEqual([], db_conditions) db_conditions = infoblox_db.get_mapping_conditions(self.ctx.session) self.assertEqual([], db_conditions)
def test_grid_management(self): grid_list = [{ 'grid_id': 100, 'grid_name': 'Test Grid 1000', 'grid_connection': '{}', 'grid_status': 'ON' }, { 'grid_id': 200, 'grid_name': 'Test Grid 2000', 'grid_connection': '{}', 'grid_status': 'OFF' }] # expects no grid db_grids = infoblox_db.get_grids(self.ctx.session) self.assertEqual(0, len(db_grids)) # test grid additions self._create_grids(grid_list) db_grids = infoblox_db.get_grids(self.ctx.session) actual_grid_rows = utils.get_composite_values_from_records( ['grid_id', 'grid_name', 'grid_connection', 'grid_status'], db_grids) expected_grid_rows = utils.get_composite_values_from_records( ['grid_id', 'grid_name', 'grid_connection', 'grid_status'], grid_list) self.assertEqual(expected_grid_rows, actual_grid_rows) # test grid retrieval by grid_id filter db_grids = infoblox_db.get_grids(self.ctx.session, grid_id=grid_list[0]['grid_id']) self.assertEqual(grid_list[0]['grid_id'], db_grids[0]['grid_id']) self.assertEqual(grid_list[0]['grid_name'], db_grids[0]['grid_name']) self.assertEqual(grid_list[0]['grid_connection'], db_grids[0]['grid_connection']) self.assertEqual(grid_list[0]['grid_connection'], db_grids[0]['grid_connection']) self.assertEqual(grid_list[0]['grid_status'], db_grids[0]['grid_status']) db_grids = infoblox_db.get_grids(self.ctx.session, grid_id=grid_list[1]['grid_id'], grid_name=grid_list[0]['grid_name']) self.assertEqual([], db_grids) # test grid retrieval by grid_id and grid_name filters db_grids = infoblox_db.get_grids(self.ctx.session, grid_id=grid_list[1]['grid_id'], grid_name=grid_list[1]['grid_name']) self.assertEqual(grid_list[1]['grid_id'], db_grids[0]['grid_id']) self.assertEqual(grid_list[1]['grid_name'], db_grids[0]['grid_name']) self.assertEqual(grid_list[1]['grid_connection'], db_grids[0]['grid_connection']) self.assertEqual(grid_list[1]['grid_connection'], db_grids[0]['grid_connection']) self.assertEqual(grid_list[1]['grid_status'], db_grids[0]['grid_status']) # test grid update grid_name_update = "Test Grid 1000 Enhanced" grid_connection_json = { "wapi_version": "2.0", "ssl_verify": False, "http_pool_connections": 100, "http_pool_maxsize": 100, "http_request_timeout": 120, "admin_user": { "name": "admin", "password": "******" } } grid_connection_json_string = jsonutils.dumps(grid_connection_json) infoblox_db.update_grid(self.ctx.session, grid_list[0]['grid_id'], grid_name_update, grid_connection_json_string) db_grids = infoblox_db.get_grids(self.ctx.session, grid_list[0]['grid_id']) self.assertEqual(grid_name_update, db_grids[0]['grid_name']) self.assertEqual(grid_connection_json_string, db_grids[0]['grid_connection']) # test grid removal infoblox_db.remove_grids(self.ctx.session, [grid_list[0]['grid_id']]) db_grids = infoblox_db.get_grids(self.ctx.session, grid_list[0]['grid_id']) self.assertEqual(0, len(db_grids)) # remove two grids self._create_grids([grid_list[0]]) infoblox_db.remove_grids( self.ctx.session, [grid_list[0]['grid_id'], grid_list[1]['grid_id']]) db_grids = infoblox_db.get_grids(self.ctx.session) self.assertEqual(0, len(db_grids))
def test_member_management(self): # prepare grid self._create_default_grid() member_list = [{ 'member_id': 'M_1000', 'member_name': 'Member 1000', 'member_ip': '10.10.1.12', 'member_ipv6': None, 'member_type': 'REGULAR', 'member_status': 'ON' }, { 'member_id': 'M_2000', 'member_name': 'Member 2000', 'member_ip': '10.10.1.22', 'member_ipv6': 'fd44:acb:5df6:1083::22', 'member_type': 'CPM', 'member_status': 'ON' }] # expects no member db_members = infoblox_db.get_members(self.ctx.session) self.assertEqual(0, len(db_members)) # test member additions self._create_members(member_list, self.grid_id) db_members = infoblox_db.get_members(self.ctx.session) actual_member_rows = utils.get_composite_values_from_records([ 'member_id', 'member_name', 'member_ip', 'member_ipv6', 'member_type', 'member_status' ], db_members) expected_member_rows = utils.get_composite_values_from_records([ 'member_id', 'member_name', 'member_ip', 'member_ipv6', 'member_type', 'member_status' ], member_list) self.assertEqual(expected_member_rows, actual_member_rows) # test member update member_name_update = "Member 1000 VM" member_ipv6_update = "fd44:acb:5df6:1083::12" infoblox_db.update_member(self.ctx.session, member_list[0]['member_id'], self.grid_id, member_name=member_name_update, member_ipv6=member_ipv6_update) db_members = infoblox_db.get_members(self.ctx.session, member_list[0]['member_id'], grid_id=self.grid_id) self.assertEqual(member_name_update, db_members[0]['member_name']) self.assertEqual(member_ipv6_update, db_members[0]['member_ipv6']) # test member removals infoblox_db.remove_members(self.ctx.session, [member_list[0]['member_id']]) db_members = infoblox_db.get_members(self.ctx.session, member_list[0]['member_id']) self.assertEqual(0, len(db_members)) self._create_members([member_list[0]], self.grid_id) db_members = infoblox_db.get_members(self.ctx.session) self.assertEqual(2, len(db_members)) infoblox_db.remove_members( self.ctx.session, [member_list[0]['member_id'], member_list[1]['member_id']]) db_members = infoblox_db.get_members(self.ctx.session) self.assertEqual(0, len(db_members)) infoblox_db.remove_grids(self.ctx.session, [self.grid_id])
def test_member_management(self): # prepare grid self._create_default_grid() member_list = [{'member_id': 'M_1000', 'member_name': 'Member 1000', 'member_ip': '10.10.1.12', 'member_ipv6': None, 'member_type': 'REGULAR', 'member_status': 'ON'}, {'member_id': 'M_2000', 'member_name': 'Member 2000', 'member_ip': '10.10.1.22', 'member_ipv6': 'fd44:acb:5df6:1083::22', 'member_type': 'CPM', 'member_status': 'ON'}] # expects no member db_members = infoblox_db.get_members(self.ctx.session) self.assertEqual(0, len(db_members)) # test member additions self._create_members(member_list, self.grid_id) db_members = infoblox_db.get_members(self.ctx.session) actual_member_rows = utils.get_composite_values_from_records( ['member_id', 'member_name', 'member_ip', 'member_ipv6', 'member_type', 'member_status'], db_members) expected_member_rows = utils.get_composite_values_from_records( ['member_id', 'member_name', 'member_ip', 'member_ipv6', 'member_type', 'member_status'], member_list) self.assertEqual(expected_member_rows, actual_member_rows) # test member update member_name_update = "Member 1000 VM" member_ipv6_update = "fd44:acb:5df6:1083::12" infoblox_db.update_member(self.ctx.session, member_list[0]['member_id'], self.grid_id, member_name=member_name_update, member_ipv6=member_ipv6_update) db_members = infoblox_db.get_members(self.ctx.session, member_list[0]['member_id'], grid_id=self.grid_id) self.assertEqual(member_name_update, db_members[0]['member_name']) self.assertEqual(member_ipv6_update, db_members[0]['member_ipv6']) # test member removals infoblox_db.remove_members(self.ctx.session, [member_list[0]['member_id']]) db_members = infoblox_db.get_members(self.ctx.session, member_list[0]['member_id']) self.assertEqual(0, len(db_members)) self._create_members([member_list[0]], self.grid_id) db_members = infoblox_db.get_members(self.ctx.session) self.assertEqual(2, len(db_members)) infoblox_db.remove_members(self.ctx.session, [member_list[0]['member_id'], member_list[1]['member_id']]) db_members = infoblox_db.get_members(self.ctx.session) self.assertEqual(0, len(db_members)) infoblox_db.remove_grids(self.ctx.session, [self.grid_id])