def _register_services(self): session = self.context.session service = const.SERVICE_TYPE_DHCP for member in self.mapping.dhcp_members: service_members = dbi.get_service_members( session, network_view_id=self.mapping.network_view_id, member_id=member.member_id, grid_id=self.grid_id, service=service) if not service_members: dbi.add_service_member(session, self.mapping.network_view_id, member.member_id, service) service = const.SERVICE_TYPE_DNS for member in self.mapping.dns_members: service_members = dbi.get_service_members( session, network_view_id=self.mapping.network_view_id, member_id=member.member_id, grid_id=self.grid_id, service=service) if not service_members: dbi.add_service_member(session, self.mapping.network_view_id, member.member_id, service)
def _reserve_dhcp_member(self): # for CPM, the authority member itself serves DHCP if (self.mapping.authority_member.member_type == const.MEMBER_TYPE_CP_MEMBER): return self.mapping.authority_member # for GM, # check if a network view is already serving dhcp. # if true, then use the same dhcp member. # if false, see if gm itself is serving dhcp for other network view. # if true, then try to get the next available dhcp member. # if false, use gm for dhcp session = self.context.session dhcp_member = None dhcp_service_members = dbi.get_service_members( session, network_view_id=self.mapping.network_view_id, service=const.SERVICE_TYPE_DHCP) if dhcp_service_members: dhcp_member = utils.find_one_in_list( 'member_id', dhcp_service_members[0].member_id, self.discovered_grid_members) else: if self.grid_config.use_grid_master_for_dhcp: dhcp_service_members = dbi.get_service_members( session, member_id=self.mapping.authority_member.member_id, service=const.SERVICE_TYPE_DHCP) if dhcp_service_members: # authority is GM, a dhcp member needs to be selected. dhcp_member = dbi.get_next_dhcp_member(session, self.grid_id, True) if not dhcp_member: raise exc.InfobloxDHCPMemberNotReserved( network_view=self.mapping.network_view, cidr=self.subnet.get('cidr')) else: dhcp_member = self.mapping.authority_member else: dhcp_member = dbi.get_next_dhcp_member(session, self.grid_id, False) if not dhcp_member: raise exc.InfobloxDHCPMemberNotReserved( network_view=self.mapping.network_view, cidr=self.subnet.get('cidr')) return dhcp_member
def _load_persisted_mappings(self): session = self._context.session self.db_network_views = dbi.get_network_views(session, grid_id=self._grid_id) self.db_mapping_conditions = dbi.get_mapping_conditions( session, grid_id=self._grid_id) self.db_authority_members = dbi.get_mapping_members( session, grid_id=self._grid_id) self.db_service_members = dbi.get_service_members( session, grid_id=self._grid_id)
def _load_persisted_mappings(self): session = self._context.session self.db_network_views = dbi.get_network_views( session, grid_id=self._grid_id) self.db_mapping_conditions = dbi.get_mapping_conditions( session, grid_id=self._grid_id) self.db_authority_members = dbi.get_mapping_members( session, grid_id=self._grid_id) self.db_service_members = dbi.get_service_members( session, grid_id=self._grid_id)
def _test_reserve_service_members_with_ib_network_gm_owned( self, dns_support): user_id = 'test user' tenant_id = 'tenant-id' # prepare network network_name = 'Test Network' network = self.plugin_stub.create_network(tenant_id, network_name) # prepare subnet subnet_name = 'Test Subnet' subnet_cidr = '11.11.1.0/24' subnet = self.plugin_stub.create_subnet(tenant_id, subnet_name, network['id'], subnet_cidr) self.grid_config.dhcp_support = True self.grid_config.dns_support = dns_support ib_cxt = ib_context.InfobloxContext(self.ctx, user_id, network, subnet, self.grid_config, self.plugin) ib_cxt._register_services = mock.Mock() dhcp_members = dbi.get_service_members( self.ctx.session, network_view_id=ib_cxt.mapping.network_view_id, service=const.SERVICE_TYPE_DHCP) expected_dhcp_member = dhcp_members[0] # ib network with no members and options connector = mock.Mock() test_ib_network = ib_objects.NetworkV4(connector, network_view='default', cidr='12.12.1.0/24') test_ib_network.members = [] test_ib_network.options = [] ib_cxt.reserve_service_members(test_ib_network) expected_dns_members = (ib_cxt.mapping.dhcp_members if dns_support else []) self.assertEqual(expected_dhcp_member.member_id, ib_cxt.mapping.dhcp_members[0].member_id) self.assertEqual(expected_dns_members, ib_cxt.mapping.dns_members) actual_opt_router = [ opt for opt in test_ib_network.options if opt.name == 'routers' ] self.assertEqual(subnet['gateway_ip'], actual_opt_router[0].value)
def _test_reserve_service_members_with_ib_network_gm_owned( self, dns_support): user_id = 'test user' tenant_id = 'tenant-id' # prepare network network_name = 'Test Network' network = self.plugin_stub.create_network(tenant_id, network_name) # prepare subnet subnet_name = 'Test Subnet' subnet_cidr = '11.11.1.0/24' subnet = self.plugin_stub.create_subnet(tenant_id, subnet_name, network['id'], subnet_cidr) self.grid_config.dhcp_support = True self.grid_config.dns_support = dns_support ib_cxt = ib_context.InfobloxContext(self.ctx, user_id, network, subnet, self.grid_config, self.plugin) ib_cxt._register_services = mock.Mock() dhcp_members = dbi.get_service_members( self.ctx.session, network_view_id=ib_cxt.mapping.network_view_id, service=const.SERVICE_TYPE_DHCP) expected_dhcp_member = dhcp_members[0] # ib network with no members and options connector = mock.Mock() test_ib_network = ib_objects.NetworkV4(connector, network_view='default', cidr='12.12.1.0/24') test_ib_network.members = [] test_ib_network.options = [] ib_cxt.reserve_service_members(test_ib_network) expected_dns_members = ( ib_cxt.mapping.dhcp_members if dns_support else []) self.assertEqual(expected_dhcp_member.member_id, ib_cxt.mapping.dhcp_members[0].member_id) self.assertEqual(expected_dns_members, ib_cxt.mapping.dns_members) actual_opt_router = [opt for opt in test_ib_network.options if opt.name == 'routers'] self.assertEqual(subnet['gateway_ip'], actual_opt_router[0].value)
def _update_service_member_mapping(self): if not self.ib_network: return if not self.grid_config.dhcp_support: return session = self.context.session # dhcp members dhcp_members = self._get_dhcp_members(self.ib_network) if not dhcp_members: return ib_dhcp_members = [] for m in dhcp_members: dhcp_ip = m.member_dhcp_ip or m.member_ip ib_dhcp_members.append( ib_objects.AnyMember(_struct='dhcpmember', name=m.member_name, ipv4addr=dhcp_ip)) # get dns members from ib network if member exists. if not, get them # from service members dns_members = self._get_dns_members(self.ib_network) if not dns_members: dns_members = [] dns_service_members = dbi.get_service_members( session, network_view_id=self.mapping.network_view_id, service=const.SERVICE_TYPE_DNS) for sm in dns_service_members: member = utils.find_one_in_list('member_id', sm.member_id, self.discovered_grid_members) if member: dns_members.append(member) nameservers = self._get_nameservers(dns_members) self.mapping.dhcp_members = dhcp_members self.mapping.dns_members = dns_members self.mapping.ib_dhcp_members = ib_dhcp_members self.mapping.ib_nameservers = nameservers
def _update_service_member_mapping(self): if not self.ib_network: return if not self.grid_config.dhcp_support: return session = self.context.session # dhcp members dhcp_members = self._get_dhcp_members(self.ib_network) if not dhcp_members: return ib_dhcp_members = [] for m in dhcp_members: dhcp_ip = m.member_dhcp_ip or m.member_ip ib_dhcp_members.append(ib_objects.AnyMember(_struct='dhcpmember', name=m.member_name, ipv4addr=dhcp_ip)) # get dns members from ib network if member exists. if not, get them # from service members dns_members = self._get_dns_members(self.ib_network) if not dns_members: dns_members = [] dns_service_members = dbi.get_service_members( session, network_view_id=self.mapping.network_view_id, service=const.SERVICE_TYPE_DNS) for sm in dns_service_members: member = utils.find_one_in_list('member_id', sm.member_id, self.discovered_grid_members) if member: dns_members.append(member) nameservers = self._get_nameservers(dns_members) self.mapping.dhcp_members = dhcp_members self.mapping.dns_members = dns_members self.mapping.ib_dhcp_members = ib_dhcp_members self.mapping.ib_nameservers = nameservers
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 test_service_member(self): # prepare grid self._create_default_grid() # prepare grid members member_list = [{'member_id': 'm1', 'member_name': 'm1.com', 'member_ip': '10.10.1.1', 'member_ipv6': None, 'member_type': const.MEMBER_TYPE_GRID_MASTER, 'member_status': 'ON'}, {'member_id': 'm2', 'member_name': 'm2.com', 'member_ip': '10.10.1.2', 'member_ipv6': 'fd44:acb:5df6:1083::22', 'member_type': const.MEMBER_TYPE_CP_MEMBER, 'member_status': 'ON'}] self._create_members(member_list, self.grid_id) db_members = infoblox_db.get_members(self.ctx.session, grid_id=self.grid_id) gm_member = utils.find_one_in_list('member_type', 'GM', db_members) m2_member = utils.find_one_in_list('member_id', 'm2', db_members) # create 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 = utils.find_one_in_list('network_view', 'default', db_network_views) # test addition infoblox_db.add_service_member(self.ctx.session, netview_default.id, gm_member.member_id, const.SERVICE_TYPE_DHCP) infoblox_db.add_service_member(self.ctx.session, netview_default.id, m2_member.member_id, const.SERVICE_TYPE_DHCP) db_service_members = infoblox_db.get_service_members( self.ctx.session, netview_default.id) gm_dhcp_member = utils.find_one_in_list('member_id', gm_member.member_id, db_service_members) self.assertIsNotNone(gm_dhcp_member) m2_dhcp_member = utils.find_one_in_list('member_id', m2_member.member_id, db_service_members) self.assertIsNotNone(m2_dhcp_member) # test removal infoblox_db.remove_service_member(self.ctx.session, netview_default.id) db_service_members = infoblox_db.get_service_members( self.ctx.session, netview_default.id) gm_dhcp_member = utils.find_one_in_list('member_id', gm_member.member_id, db_service_members) self.assertIsNone(gm_dhcp_member) m2m_dhcp_member = utils.find_one_in_list('member_id', m2_member.member_id, db_service_members) self.assertIsNone(m2m_dhcp_member)
def test_service_member(self): # prepare grid self._create_default_grid() # prepare grid members member_list = [{ 'member_id': 'm1', 'member_name': 'm1.com', 'member_ip': '10.10.1.1', 'member_ipv6': None, 'member_type': const.MEMBER_TYPE_GRID_MASTER, 'member_status': 'ON' }, { 'member_id': 'm2', 'member_name': 'm2.com', 'member_ip': '10.10.1.2', 'member_ipv6': 'fd44:acb:5df6:1083::22', 'member_type': const.MEMBER_TYPE_CP_MEMBER, 'member_status': 'ON' }] self._create_members(member_list, self.grid_id) db_members = infoblox_db.get_members(self.ctx.session, grid_id=self.grid_id) gm_member = utils.find_one_in_list('member_type', 'GM', db_members) m2_member = utils.find_one_in_list('member_id', 'm2', db_members) # create 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 = utils.find_one_in_list('network_view', 'default', db_network_views) # test addition infoblox_db.add_service_member(self.ctx.session, netview_default.id, gm_member.member_id, const.SERVICE_TYPE_DHCP) infoblox_db.add_service_member(self.ctx.session, netview_default.id, m2_member.member_id, const.SERVICE_TYPE_DHCP) db_service_members = infoblox_db.get_service_members( self.ctx.session, netview_default.id) gm_dhcp_member = utils.find_one_in_list('member_id', gm_member.member_id, db_service_members) self.assertIsNotNone(gm_dhcp_member) m2_dhcp_member = utils.find_one_in_list('member_id', m2_member.member_id, db_service_members) self.assertIsNotNone(m2_dhcp_member) # test removal infoblox_db.remove_service_member(self.ctx.session, netview_default.id) db_service_members = infoblox_db.get_service_members( self.ctx.session, netview_default.id) gm_dhcp_member = utils.find_one_in_list('member_id', gm_member.member_id, db_service_members) self.assertIsNone(gm_dhcp_member) m2m_dhcp_member = utils.find_one_in_list('member_id', m2_member.member_id, db_service_members) self.assertIsNone(m2m_dhcp_member)