def reserve_authority_member(self): """Reserves the next available authority member. Find the next available authority member and reserve it, then update mapping metadata and load managers if the authority member is CPM. :return: None """ session = self.context.session network_view = self.mapping.network_view authority_member = None # get next available member if self.grid_config.dhcp_support is False: authority_member = dbi.get_next_authority_member_for_ipam( session, self.grid_id) else: # as default, authority member is 'GM' gm_member = utils.find_one_in_list('member_type', const.MEMBER_TYPE_GRID_MASTER, self.discovered_grid_members) authority_member = gm_member cp_member = utils.find_one_in_list('member_type', const.MEMBER_TYPE_CP_MEMBER, self.discovered_grid_members) if self.grid_config.is_cloud_wapi and cp_member: authority_member = dbi.get_next_authority_member_for_dhcp( session, self.grid_id) if not authority_member: # if no CPM available, use GM authority_member = gm_member if not authority_member: raise exc.InfobloxCannotReserveAuthorityMember( network_view=network_view) # create network view mapping and update mapping dns_view = self._get_dns_view() # network_view_id will be updated with nios object id once the network # view is created network_view_id = utils.get_hash() dbi.add_network_view(session, network_view_id, network_view, self.grid_id, authority_member.member_id, False, dns_view, network_view, dns_view, True, False) self.mapping.network_view_id = network_view_id self.mapping.authority_member = authority_member self.mapping.dns_view = dns_view # change connector if authority member is changed. if self.connector.host != self.mapping.authority_member.member_wapi: self._load_managers()
def reserve_authority_member(self): """Reserves the next available authority member. Find the next available authority member and reserve it, then update mapping metadata and load managers if the authority member is CPM. :return: None """ session = self.context.session network_view = self.mapping.network_view authority_member = None # get next available member if self.grid_config.dhcp_support is False: authority_member = dbi.get_next_authority_member_for_ipam( session, self.grid_id) else: # as default, authority member is 'GM' gm_member = utils.find_one_in_list('member_type', const.MEMBER_TYPE_GRID_MASTER, self.discovered_grid_members) authority_member = gm_member cp_member = utils.find_one_in_list('member_type', const.MEMBER_TYPE_CP_MEMBER, self.discovered_grid_members) if self.grid_config.is_cloud_wapi and cp_member: authority_member = dbi.get_next_authority_member_for_dhcp( session, self.grid_id) if not authority_member: # if no CPM available, use GM authority_member = gm_member if not authority_member: raise exc.InfobloxCannotReserveAuthorityMember( network_view=network_view) # create network view mapping and update mapping dns_view = self._get_dns_view() # network_view_id will be updated with nios object id once the network # view is created network_view_id = utils.get_hash() dbi.add_network_view(session, network_view_id, network_view, self.grid_id, authority_member.member_id, False, dns_view, network_view, dns_view, True, False) self.mapping.network_view_id = network_view_id self.mapping.authority_member = authority_member self.mapping.dns_view = dns_view # change connector if authority member is changed. if self.connector.host != self.mapping.authority_member.member_wapi: self._load_managers()
def _create_network_views(self, network_view_dict): netview_count = 1 for network_view in network_view_dict: is_default = True if network_view == 'default' else False dns_view = ('default' if network_view == 'default' else 'default.' + network_view) netview_id = 'netview-id-' + str(netview_count) infoblox_db.add_network_view(self.ctx.session, netview_id, network_view, self.grid_id, network_view_dict[network_view], False, dns_view, network_view, dns_view, True, is_default) netview_count += 1
def _create_network_views(self, network_view_dict): netview_count = 1 for network_view in network_view_dict: is_default = True if network_view == 'default' else False dns_view = ('default' if network_view == 'default' else 'default.' + network_view) netview_id = 'netview-id-' + str(netview_count) infoblox_db.add_network_view(self.ctx.session, netview_id, network_view, self.grid_id, network_view_dict[network_view], False, dns_view, network_view, dns_view, True, is_default) netview_count += 1
def _sync_network_views(self, discovered_netviews, dns_views): """Discover network views and sync with db. The discovered network view json contains the following data: - network view - cloud_info for delegated member if cloud platform is supported - mapping conditional EAs So discovered information will be updated in tables such as infoblox_network_views and infoblox_mapping_conditions. :param discovered_netviews: discovered network view json :return: None """ session = self._context.session self._load_persisted_mappings() discovered_delegations = dict() persisted_netview_ids = utils.get_values_from_records( 'id', self.db_network_views) discovered_netview_ids = [] for netview in discovered_netviews: netview_name = netview['name'] is_default = netview[const.IS_DEFAULT] netview_id = utils.get_network_view_id(self._grid_id, netview['_ref']) cloud_adapter_id_vals = utils.get_ea_value( const.EA_CLOUD_ADAPTER_ID, netview, True) if cloud_adapter_id_vals is None: participated = False else: cloud_adapter_ids = [ gid for gid in cloud_adapter_id_vals if int(gid) == self._grid_id ] participated = True if cloud_adapter_ids else False if not participated: continue shared_val = utils.get_ea_value(const.EA_IS_SHARED, netview) is_shared = types.Boolean()(shared_val) if shared_val else False # authority member is default to GM gm_row = utils.find_one_in_list('member_type', const.MEMBER_TYPE_GRID_MASTER, self.db_members) authority_member_id = gm_row.member_id # get delegation member if cloud platform is supported delegated_member = self._get_delegated_member(netview) if delegated_member: authority_member_id = delegated_member.member_id discovered_delegations[netview_name] = ( delegated_member.member_id) dns_view = (dns_views[netview_name] if dns_views.get(netview_name) else None) # see if the network view already exists in db netview_row = utils.find_one_in_list('id', netview_id, self.db_network_views) if netview_row: dbi.update_network_view(session, netview_id, netview_name, authority_member_id, is_shared, dns_view, participated, is_default) else: internal_netview = (const.DEFAULT_NETWORK_VIEW if is_default else netview_name) internal_dnsview = (const.DEFAULT_DNS_VIEW if is_default else dns_view) dbi.add_network_view(session, netview_id, netview_name, self._grid_id, authority_member_id, is_shared, dns_view, internal_netview, internal_dnsview, participated, is_default) discovered_netview_ids.append(netview_id) # update mapping conditions for the current network view self._update_mapping_conditions(netview, netview_id, participated) # we have added new network views. now let's remove persisted # network views not found from discovery persisted_set = set(persisted_netview_ids) removable_set = persisted_set.difference(discovered_netview_ids) removable_netviews = list(removable_set) if removable_netviews: dbi.remove_network_views(session, removable_netviews) session.flush() return discovered_delegations
def _sync_network_views(self, discovered_netviews, dns_views): """Discover network views and sync with db. The discovered network view json contains the following data: - network view - cloud_info for delegated member if cloud platform is supported - mapping conditional EAs So discovered information will be updated in tables such as infoblox_network_views and infoblox_mapping_conditions. :param discovered_netviews: discovered network view json :return: None """ session = self._context.session self._load_persisted_mappings() discovered_delegations = dict() persisted_netview_ids = utils.get_values_from_records( 'id', self.db_network_views) discovered_netview_ids = [] for netview in discovered_netviews: netview_name = netview['name'] is_default = netview[const.IS_DEFAULT] netview_id = utils.get_network_view_id(self._grid_id, netview['_ref']) cloud_adapter_id_vals = utils.get_ea_value( const.EA_CLOUD_ADAPTER_ID, netview, True) if cloud_adapter_id_vals is None: participated = False else: cloud_adapter_ids = [gid for gid in cloud_adapter_id_vals if int(gid) == self._grid_id] participated = True if cloud_adapter_ids else False if not participated: continue shared_val = utils.get_ea_value(const.EA_IS_SHARED, netview) is_shared = types.Boolean()(shared_val) if shared_val else False # authority member is default to GM gm_row = utils.find_one_in_list('member_type', const.MEMBER_TYPE_GRID_MASTER, self.db_members) authority_member_id = gm_row.member_id # get delegation member if cloud platform is supported delegated_member = self._get_delegated_member(netview) if delegated_member: authority_member_id = delegated_member.member_id discovered_delegations[netview_name] = ( delegated_member.member_id) dns_view = (dns_views[netview_name] if dns_views.get(netview_name) else None) # see if the network view already exists in db netview_row = utils.find_one_in_list('id', netview_id, self.db_network_views) if netview_row: dbi.update_network_view(session, netview_id, netview_name, authority_member_id, is_shared, dns_view, participated, is_default) else: internal_netview = (const.DEFAULT_NETWORK_VIEW if is_default else netview_name) internal_dnsview = (const.DEFAULT_DNS_VIEW if is_default else dns_view) dbi.add_network_view(session, netview_id, netview_name, self._grid_id, authority_member_id, is_shared, dns_view, internal_netview, internal_dnsview, participated, is_default) discovered_netview_ids.append(netview_id) # update mapping conditions for the current network view self._update_mapping_conditions(netview, netview_id, participated) # we have added new network views. now let's remove persisted # network views not found from discovery persisted_set = set(persisted_netview_ids) removable_set = persisted_set.difference(discovered_netview_ids) removable_netviews = list(removable_set) if removable_netviews: dbi.remove_network_views(session, removable_netviews) session.flush() return discovered_delegations