예제 #1
0
    def _release_service_members(self, is_last_subnet_in_netview):
        """Frees up service members

        For CPM, only one subnet should remain in a given network view
        scope since other subnet(s) could use the same dhcp/dns member.

        For GM, dhcp/dns could be GM itself or another member. it is hard
        to determine whether the same member is used in multiple subnets or
        not since we store service members per network view level only.
        for dhcp/dns members, we can release them when only one subnet remains.
        """
        if self.grid_config.dhcp_support is False:
            return

        session = self.ib_cxt.context.session

        if (self.ib_cxt.mapping.authority_member.member_type ==
                const.MEMBER_TYPE_CP_MEMBER):
            if self._is_member_releasable():
                # release service members
                service_member_ids = self._get_service_members('member_id')
                if service_member_ids:
                    dbi.remove_service_members(
                        session,
                        self.ib_cxt.mapping.network_view_id,
                        service_member_ids)
        else:
            # to release dhcp/dns members, only one subnet should remain in the
            # current network view.
            if is_last_subnet_in_netview:
                dhcp_member_ids = [m.member_id
                                   for m in self.ib_cxt.mapping.dhcp_members]
                for member_id in dhcp_member_ids:
                    dbi.remove_service_member(
                        session,
                        self.ib_cxt.mapping.network_view_id,
                        member_id,
                        const.SERVICE_TYPE_DHCP)

                dns_member_ids = [m.member_id
                                  for m in self.ib_cxt.mapping.dns_members]
                for member_id in dns_member_ids:
                    dbi.remove_service_member(
                        session,
                        self.ib_cxt.mapping.network_view_id,
                        member_id,
                        const.SERVICE_TYPE_DNS)
예제 #2
0
    def _release_service_members(self, is_last_subnet_in_netview):
        """Frees up service members

        For CPM, only one subnet should remain in a given network view
        scope since other subnet(s) could use the same dhcp/dns member.

        For GM, dhcp/dns could be GM itself or another member. it is hard
        to determine whether the same member is used in multiple subnets or
        not since we store service members per network view level only.
        for dhcp/dns members, we can release them when only one subnet remains.
        """
        if self.grid_config.dhcp_support is False:
            return

        session = self.ib_cxt.context.session

        if (self.ib_cxt.mapping.authority_member.member_type ==
                const.MEMBER_TYPE_CP_MEMBER):
            if self._is_member_releasable():
                # release service members
                service_member_ids = self._get_service_members('member_id')
                if service_member_ids:
                    dbi.remove_service_members(
                        session,
                        self.ib_cxt.mapping.network_view_id,
                        service_member_ids)
        else:
            # to release dhcp/dns members, only one subnet should remain in the
            # current network view.
            if is_last_subnet_in_netview:
                dhcp_member_ids = [m.member_id
                                   for m in self.ib_cxt.mapping.dhcp_members]
                for member_id in dhcp_member_ids:
                    dbi.remove_service_member(
                        session,
                        self.ib_cxt.mapping.network_view_id,
                        member_id,
                        const.SERVICE_TYPE_DHCP)

                dns_member_ids = [m.member_id
                                  for m in self.ib_cxt.mapping.dns_members]
                for member_id in dns_member_ids:
                    dbi.remove_service_member(
                        session,
                        self.ib_cxt.mapping.network_view_id,
                        member_id,
                        const.SERVICE_TYPE_DNS)
예제 #3
0
    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_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)
예제 #5
0
    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)
예제 #6
0
    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)