def pre_dbe_delete(cls, id, obj_dict, db_conn):
        ok, vxlan_routing = cls.is_vxlan_routing_enabled(db_conn, obj_dict)
        if not ok:
            return (ok, vxlan_routing, None)

        if vxlan_routing:
            ok, proj_dict = cls.get_parent_project(obj_dict, db_conn)
            vn_int_fqname = proj_dict.get('fq_name')
            vn_int_name = get_lr_internal_vn_name(obj_dict.get('uuid'))
            vn_int_fqname.append(vn_int_name)
            vn_int_uuid = db_conn.fq_name_to_uuid('virtual_network',
                                                  vn_int_fqname)

            api_server = db_conn.get_api_server()
            attr_obj = LogicalRouterVirtualNetworkType(
                'InternalVirtualNetwork')
            attr_dict = attr_obj.__dict__
            api_server.internal_request_ref_update(
                'logical-router',
                obj_dict['uuid'],
                'DELETE',
                'virtual-network',
                vn_int_uuid,
                vn_int_fqname,
                attr=attr_dict)
            api_server.internal_request_delete('virtual-network', vn_int_uuid)

            def undo_int_vn_delete():
                return cls.create_intvn_and_ref(obj_dict, db_conn)
            get_context().push_undo(undo_int_vn_delete)

        return True, '', None
    def test_vxlan_update_for_lr(self):
        project = self._vnc_lib.project_read(fq_name=['default-domain',
                                                      'default-project'])
        project.set_vxlan_routing(True)
        self._vnc_lib.project_update(project)
        mock_zk = self._api_server._db_conn._zk_db

        # Create Logical Router
        lr = LogicalRouter('router-test-v4-%s' %(self.id()), project)
        lr.set_vxlan_network_identifier('5001')
        lr_uuid = self._vnc_lib.logical_router_create(lr)
        lr_read = self._vnc_lib.logical_router_read(id=lr_uuid)
        vxlan_id = lr_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id, '5001')

        lr.set_vxlan_network_identifier('5002')
        self._vnc_lib.logical_router_update(lr)
        lr_read = self._vnc_lib.logical_router_read(id=lr_uuid)
        vxlan_id = lr_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id, '5002')

        int_vn_name = get_lr_internal_vn_name(lr_uuid)
        int_vn_fqname = ['default-domain', 'default-project', int_vn_name]

        self.assertEqual( ':'.join(int_vn_fqname) +"_vxlan",
                         mock_zk.get_vn_from_id(int(vxlan_id)))

        self._vnc_lib.logical_router_delete(id=lr_uuid)
        logger.debug('PASS - test_vxlan_update_for_lr')
    def pre_dbe_delete(cls, id, obj_dict, db_conn):
        ok, vxlan_routing = cls.is_vxlan_routing_enabled(db_conn, obj_dict)
        if not ok:
            return (ok, vxlan_routing, None)

        if vxlan_routing:
            ok, proj_dict = cls.get_parent_project(obj_dict, db_conn)
            vn_int_fqname = proj_dict.get('fq_name')
            vn_int_name = get_lr_internal_vn_name(obj_dict.get('uuid'))
            vn_int_fqname.append(vn_int_name)
            vn_int_uuid = db_conn.fq_name_to_uuid('virtual_network',
                                                  vn_int_fqname)

            api_server = db_conn.get_api_server()
            attr_obj = LogicalRouterVirtualNetworkType(
                'InternalVirtualNetwork')
            attr_dict = attr_obj.__dict__
            api_server.internal_request_ref_update('logical-router',
                                                   obj_dict['uuid'],
                                                   'DELETE',
                                                   'virtual-network',
                                                   vn_int_uuid,
                                                   vn_int_fqname,
                                                   attr=attr_dict)
            api_server.internal_request_delete('virtual-network', vn_int_uuid)

            def undo_int_vn_delete():
                return cls.create_intvn_and_ref(obj_dict, db_conn)

            get_context().push_undo(undo_int_vn_delete)

        return True, '', None
Exemple #4
0
 def test_vn_internal_lr(self):
     proj_obj = self._vnc_lib.project_read(
             fq_name=['default-domain', 'default-project'])
     proj_obj.set_vxlan_routing(True)
     self._vnc_lib.project_update(proj_obj)
     lr_name = self.id() + '_logicalrouter'
     lr = LogicalRouter(lr_name)
     rtgt_list = RouteTargetList(route_target=['target:3:1'])
     lr.set_configured_route_target_list(rtgt_list)
     self._vnc_lib.logical_router_create(lr)
     lr_read = self._vnc_lib.logical_router_read(fq_name=lr.get_fq_name())
     lr_target = self.check_lr_target(lr_read.get_fq_name())
     ivn_name = get_lr_internal_vn_name(lr_read.uuid)
     lr_ivn_read = self._vnc_lib.virtual_network_read(
                                fq_name=proj_obj.get_fq_name()+[ivn_name])
     ri_name = self.get_ri_name(lr_ivn_read)
     self.check_route_target_in_routing_instance(
                                     ri_name,rtgt_list.get_route_target())
     # change RT and see it is getting updated
     rtgt_list.delete_route_target('target:3:1')
     rtgt_list.add_route_target('target:4:1')
     lr.set_configured_route_target_list(rtgt_list)
     self._vnc_lib.logical_router_update(lr)
     self.check_route_target_in_routing_instance(
                                     ri_name,rtgt_list.get_route_target())
     # cleanup
     self._vnc_lib.logical_router_delete(id=lr.uuid)
     self.check_lr_is_deleted(uuid=lr.uuid)
     self.check_vn_is_deleted(uuid=lr_ivn_read.uuid)
    def create_intvn_and_ref(cls, obj_dict):
        vn_fq_name = (obj_dict['fq_name'][:-1] +
                      [get_lr_internal_vn_name(obj_dict['uuid'])])
        kwargs = {'id_perms': IdPermsType(user_visible=False)}
        vn_property = VirtualNetworkType(forwarding_mode='l3')
        if 'vxlan_network_identifier' in obj_dict:
            vn_property.set_vxlan_network_identifier(
                obj_dict['vxlan_network_identifier'])
        kwargs['virtual_network_properties'] = vn_property
        rt_list = obj_dict.get(
            'configured_route_target_list', {}).get('route_target')
        if rt_list:
            kwargs['route_target_list'] = RouteTargetList(rt_list)
        ok, result = cls.server.get_resource_class(
            'virtual_network').locate(vn_fq_name, **kwargs)
        if not ok:
            return False, result

        attr_obj = LogicalRouterVirtualNetworkType('InternalVirtualNetwork')
        attr_dict = attr_obj.__dict__
        api_server = cls.server

        try:
            api_server.internal_request_ref_update(
                'logical-router',
                obj_dict['uuid'],
                'ADD',
                'virtual-network',
                result['uuid'],
                result['fq_name'],
                attr=attr_dict)
        except HttpError as e:
            return False, (e.status_code, e.content)
        return True, ''
    def pre_dbe_delete(cls, id, obj_dict, db_conn):
        logical_router_type = cls.check_lr_type(obj_dict)
        if logical_router_type == 'vxlan-routing':
            vn_int_fqname = (obj_dict['fq_name'][:-1] +
                             [get_lr_internal_vn_name(obj_dict['uuid'])])
            vn_int_uuid = db_conn.fq_name_to_uuid('virtual_network',
                                                  vn_int_fqname)

            api_server = cls.server
            try:
                api_server.internal_request_ref_update(
                    'logical-router',
                    obj_dict['uuid'],
                    'DELETE',
                    'virtual-network',
                    vn_int_uuid,
                    vn_int_fqname)
                api_server.internal_request_delete('virtual-network',
                                                   vn_int_uuid)
            except HttpError as e:
                if e.status_code != 404:
                    return False, (e.status_code, e.content), None
            except NoIdError:
                pass

            def undo_int_vn_delete():
                return cls.create_intvn_and_ref(obj_dict)
            get_context().push_undo(undo_int_vn_delete)

        return True, '', None
 def test_vn_internal_lr(self):
     proj_obj = self._vnc_lib.project_read(
             fq_name=['default-domain', 'default-project'])
     proj_obj.set_vxlan_routing(True)
     self._vnc_lib.project_update(proj_obj)
     lr_name = self.id() + '_logicalrouter'
     lr = LogicalRouter(lr_name)
     rtgt_list = RouteTargetList(route_target=['target:3:1'])
     lr.set_configured_route_target_list(rtgt_list)
     self._vnc_lib.logical_router_create(lr)
     lr_read = self._vnc_lib.logical_router_read(fq_name=lr.get_fq_name())
     lr_target = self.check_lr_target(lr_read.get_fq_name())
     ivn_name = get_lr_internal_vn_name(lr_read.uuid)
     lr_ivn_read = self._vnc_lib.virtual_network_read(
                                fq_name=proj_obj.get_fq_name()+[ivn_name])
     ri_name = self.get_ri_name(lr_ivn_read)
     self.check_route_target_in_routing_instance(
                                     ri_name,rtgt_list.get_route_target())
     # change RT and see it is getting updated
     rtgt_list.delete_route_target('target:3:1')
     rtgt_list.add_route_target('target:4:1')
     lr.set_configured_route_target_list(rtgt_list)
     self._vnc_lib.logical_router_update(lr)
     self.check_route_target_in_routing_instance(
                                     ri_name,rtgt_list.get_route_target())
     # cleanup
     self._vnc_lib.logical_router_delete(id=lr.uuid)
     self.check_lr_is_deleted(uuid=lr.uuid)
     self.check_vn_is_deleted(uuid=lr_ivn_read.uuid)
Exemple #8
0
    def test_vxlan_update_for_lr(self):
        project = self._vnc_lib.project_read(
            fq_name=['default-domain', 'default-project'])
        project.set_vxlan_routing(True)
        self._vnc_lib.project_update(project)
        mock_zk = self._api_server._db_conn._zk_db

        # Create Logical Router
        lr = LogicalRouter('router-test-v4-%s' % self.id(), project)
        lr.set_vxlan_network_identifier('5001')
        lr.set_logical_router_type('vxlan-routing')
        lr_uuid = self._vnc_lib.logical_router_create(lr)
        lr_read = self._vnc_lib.logical_router_read(id=lr_uuid)
        vxlan_id = lr_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id, '5001')

        lr.set_vxlan_network_identifier('5002')
        self._vnc_lib.logical_router_update(lr)
        lr_read = self._vnc_lib.logical_router_read(id=lr_uuid)
        vxlan_id = lr_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id, '5002')

        int_vn_name = get_lr_internal_vn_name(lr_uuid)
        int_vn_fqname = ['default-domain', 'default-project', int_vn_name]

        self.assertEqual(':'.join(int_vn_fqname) + "_vxlan",
                         mock_zk.get_vn_from_id(int(vxlan_id)))

        self._vnc_lib.logical_router_delete(id=lr_uuid)
Exemple #9
0
    def set_route_target_list(self):
        old_rt_list = self.rt_list.copy()
        old_bgpvpn_rt_list = self.bgpvpn_rt_list.copy()
        old_bgpvpn_import_rt_list = self.bgpvpn_import_rt_list.copy()
        old_bgpvpn_export_rt_list = self.bgpvpn_export_rt_list.copy()

        # Set the system allocated route target
        config_rt_list = self.configured_route_target_list\
            or RouteTargetList()
        self.rt_list = set(config_rt_list.get_route_target())

        # Get BGP VPN's route targets associated to that router
        self.bgpvpn_rt_list = set()
        self.bgpvpn_import_rt_list = set()
        self.bgpvpn_export_rt_list = set()
        for bgpvpn_name in self.bgpvpns:
            bgpvpn = ResourceBaseST.get_obj_type_map().get('bgpvpn').get(
                bgpvpn_name)
            if bgpvpn is not None:
                self.bgpvpn_rt_list |= bgpvpn.rt_list
                self.bgpvpn_import_rt_list |= bgpvpn.import_rt_list
                self.bgpvpn_export_rt_list |= bgpvpn.export_rt_list

        rt_add = ((self.rt_list - old_rt_list) |
                  (self.bgpvpn_rt_list - old_bgpvpn_rt_list))
        rt_add_import = self.bgpvpn_import_rt_list - old_bgpvpn_import_rt_list
        rt_add_export = self.bgpvpn_export_rt_list - old_bgpvpn_export_rt_list
        rt_del = (((old_rt_list - self.rt_list) |
                   (old_bgpvpn_rt_list - self.bgpvpn_rt_list) |
                   (old_bgpvpn_import_rt_list - self.bgpvpn_import_rt_list) |
                   (old_bgpvpn_export_rt_list - self.bgpvpn_export_rt_list)) -
                  (self.rt_list | self.bgpvpn_rt_list
                   | self.bgpvpn_import_rt_list | self.bgpvpn_export_rt_list))
        if not (rt_add or rt_add_import or rt_add_export or rt_del):
            return

        if self.logical_router_type == 'vxlan-routing':
            vn = ':'.join((self.obj.fq_name[:-1] +
                           [common.get_lr_internal_vn_name(self.obj.uuid)]))
            vn_obj = ResourceBaseST.get_obj_type_map().get(
                'virtual_network').get(vn)
            if vn_obj is not None:
                ri_obj = vn_obj.get_primary_routing_instance()
                ri_obj.update_route_target_list(rt_add=rt_add,
                                                rt_add_import=rt_add_import,
                                                rt_add_export=rt_add_export,
                                                rt_del=rt_del)
        else:
            for vn in self.virtual_networks:
                vn_obj = ResourceBaseST.get_obj_type_map().get(
                    'virtual_network').get(vn)
                if vn_obj is not None:
                    ri_obj = vn_obj.get_primary_routing_instance()
                    ri_obj.update_route_target_list(
                        rt_add=rt_add,
                        rt_add_import=rt_add_import,
                        rt_add_export=rt_add_export,
                        rt_del=rt_del)
        self.delete_route_targets(rt_del)
    def pre_dbe_create(cls, tenant_name, obj_dict, db_conn):
        ok, result = cls._ensure_lr_dci_association(obj_dict)
        if not ok:
            return ok, result

        ok, result = cls.check_port_gateway_not_in_same_network(
            db_conn, obj_dict)
        if not ok:
            return ok, result

        ok, result = cls.is_port_in_use_by_vm(obj_dict, db_conn)
        if not ok:
            return ok, result

        ok, result = cls._check_type(obj_dict)
        if not ok:
            return ok, result

        vxlan_id = cls._check_vxlan_id_in_lr(obj_dict)
        logical_router_type = cls.check_lr_type(obj_dict)

        if vxlan_id and logical_router_type == 'vxlan-routing':
            # If input vxlan_id is not None, that means we need to reserve it.

            # First, if vxlan_id is not None, set it in Zookeeper and set the
            # undo function for when any failures happen later.
            # But first, get the internal_vlan name using which the resource
            # in zookeeper space will be reserved.

            vxlan_fq_name = '%s:%s_vxlan' % (
                ':'.join(obj_dict['fq_name'][:-1]),
                get_lr_internal_vn_name(obj_dict['uuid']),
            )

            try:
                # Now that we have the internal VN name, allocate it in
                # zookeeper only if the resource hasn't been reserved already
                cls.vnc_zk_client.alloc_vxlan_id(vxlan_fq_name, int(vxlan_id))
            except ResourceExistsError:
                msg = ("Cannot set VXLAN_ID: %s, it has already been set" %
                       vxlan_id)
                return False, (400, msg)

            def undo_vxlan_id():
                cls.vnc_zk_client.free_vxlan_id(int(vxlan_id), vxlan_fq_name)
                return True, ""

            get_context().push_undo(undo_vxlan_id)

        # Check if type of all associated BGP VPN are 'l3'
        ok, result = cls.server.get_resource_class(
            'bgpvpn').check_router_supports_vpn_type(obj_dict)
        if not ok:
            return ok, result

        # Check if we can reference the BGP VPNs
        return cls.server.get_resource_class(
            'bgpvpn').check_router_has_bgpvpn_assoc_via_network(obj_dict)
Exemple #11
0
    def test_vxlan_update_failure_for_lr(self):
        project = self._vnc_lib.project_read(
            fq_name=['default-domain', 'default-project'])
        project.set_vxlan_routing(True)
        self._vnc_lib.project_update(project)
        mock_zk = self._api_server._db_conn._zk_db

        # Create Logical Router
        lr1 = LogicalRouter('router-test-v4-%s' % self.id(), project)
        lr1.set_vxlan_network_identifier('5003')
        lr1.set_logical_router_type('vxlan-routing')
        lr1_uuid = self._vnc_lib.logical_router_create(lr1)
        lr1_read = self._vnc_lib.logical_router_read(id=lr1_uuid)
        vxlan_id1 = lr1_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id1, '5003')

        lr2 = LogicalRouter('router-test-v4-%s-2' % self.id(), project)
        lr2.set_vxlan_network_identifier('5004')
        lr2.set_logical_router_type('vxlan-routing')
        lr2_uuid = self._vnc_lib.logical_router_create(lr2)
        lr2_read = self._vnc_lib.logical_router_read(id=lr2_uuid)
        vxlan_id2 = lr2_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id2, '5004')

        lr2.set_vxlan_network_identifier('5003')

        with ExpectedException(BadRequest):
            self._vnc_lib.logical_router_update(lr2)

        lr_read = self._vnc_lib.logical_router_read(id=lr2_uuid)
        vxlan_id = lr_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id, '5004')

        int_vn_name = get_lr_internal_vn_name(lr2_uuid)
        int_vn_fqname = ['default-domain', 'default-project', int_vn_name]

        self.assertEqual(':'.join(int_vn_fqname) + "_vxlan",
                         mock_zk.get_vn_from_id(int(vxlan_id)))

        self._vnc_lib.logical_router_delete(id=lr1_uuid)
        self._vnc_lib.logical_router_delete(id=lr2_uuid)
    def create_intvn_and_ref(cls, obj_dict, db_conn):
        ok, proj_dict = db_conn.dbe_read('project', obj_dict['parent_uuid'])
        if not ok:
            return (ok, proj_dict)

        vn_int_name = get_lr_internal_vn_name(obj_dict.get('uuid'))
        proj_obj = Project(name=proj_dict.get('fq_name')[-1],
                           parent_type='domain',
                           fq_name=proj_dict.get('fq_name'))

        vn_obj = VirtualNetwork(name=vn_int_name, parent_obj=proj_obj)
        id_perms = IdPermsType(enable=True, user_visible=False)
        vn_obj.set_id_perms(id_perms)

        int_vn_property = VirtualNetworkType(forwarding_mode='l3')
        if 'vxlan_network_identifier' in obj_dict:
            vni_id = obj_dict['vxlan_network_identifier']
            int_vn_property.set_vxlan_network_identifier(vni_id)
        vn_obj.set_virtual_network_properties(int_vn_property)

        rt_list = obj_dict.get('configured_route_target_list',
                               {}).get('route_target')
        if rt_list:
            vn_obj.set_route_target_list(RouteTargetList(rt_list))

        vn_int_dict = json.dumps(vn_obj, default=_obj_serializer_all)
        api_server = db_conn.get_api_server()
        status, obj = api_server.internal_request_create(
            'virtual-network', json.loads(vn_int_dict))
        attr_obj = LogicalRouterVirtualNetworkType('InternalVirtualNetwork')
        attr_dict = attr_obj.__dict__
        api_server.internal_request_ref_update(
            'logical-router',
            obj_dict['uuid'],
            'ADD',
            'virtual-network',
            obj['virtual-network']['uuid'],
            obj['virtual-network']['fq_name'],
            attr=attr_dict)
        return True, ''
    def create_intvn_and_ref(cls, obj_dict, db_conn):
        ok, proj_dict = db_conn.dbe_read('project', obj_dict['parent_uuid'])
        if not ok:
            return (ok, proj_dict)

        vn_int_name = get_lr_internal_vn_name(obj_dict.get('uuid'))
        proj_obj = Project(name=proj_dict.get('fq_name')[-1],
                           parent_type='domain',
                           fq_name=proj_dict.get('fq_name'))

        vn_obj = VirtualNetwork(name=vn_int_name, parent_obj=proj_obj)
        id_perms = IdPermsType(enable=True, user_visible=False)
        vn_obj.set_id_perms(id_perms)

        int_vn_property = VirtualNetworkType(forwarding_mode='l3')
        if 'vxlan_network_identifier' in obj_dict:
            vni_id = obj_dict['vxlan_network_identifier']
            int_vn_property.set_vxlan_network_identifier(vni_id)
        vn_obj.set_virtual_network_properties(int_vn_property)

        rt_list = obj_dict.get('configured_route_target_list',
                               {}).get('route_target')
        if rt_list:
            vn_obj.set_route_target_list(RouteTargetList(rt_list))

        vn_int_dict = json.dumps(vn_obj, default=_obj_serializer_all)
        api_server = db_conn.get_api_server()
        status, obj = api_server.internal_request_create(
            'virtual-network', json.loads(vn_int_dict))
        attr_obj = LogicalRouterVirtualNetworkType('InternalVirtualNetwork')
        attr_dict = attr_obj.__dict__
        api_server.internal_request_ref_update(
            'logical-router',
            obj_dict['uuid'],
            'ADD',
            'virtual-network',
            obj['virtual-network']['uuid'],
            obj['virtual-network']['fq_name'],
            attr=attr_dict)
        return True, ''
    def test_vxlan_update_failure_for_lr(self):
        project = self._vnc_lib.project_read(fq_name=['default-domain',
                                                      'default-project'])
        project.set_vxlan_routing(True)
        self._vnc_lib.project_update(project)
        mock_zk = self._api_server._db_conn._zk_db

        # Create Logical Router
        lr1 = LogicalRouter('router-test-v4-%s' %(self.id()), project)
        lr1.set_vxlan_network_identifier('5003')
        lr1_uuid = self._vnc_lib.logical_router_create(lr1)
        lr1_read = self._vnc_lib.logical_router_read(id=lr1_uuid)
        vxlan_id1 = lr1_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id1, '5003')

        lr2 = LogicalRouter('router-test-v4-%s-2' %(self.id()), project)
        lr2.set_vxlan_network_identifier('5004')
        lr2_uuid = self._vnc_lib.logical_router_create(lr2)
        lr2_read = self._vnc_lib.logical_router_read(id=lr2_uuid)
        vxlan_id2 = lr2_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id2, '5004')

        lr2.set_vxlan_network_identifier('5003')

        with ExpectedException(cfgm_common.exceptions.BadRequest) as e:
            self._vnc_lib.logical_router_update(lr2)

        lr_read = self._vnc_lib.logical_router_read(id=lr2_uuid)
        vxlan_id = lr_read.get_vxlan_network_identifier()
        self.assertEqual(vxlan_id, '5004')

        int_vn_name = get_lr_internal_vn_name(lr2_uuid)
        int_vn_fqname = ['default-domain', 'default-project', int_vn_name]

        self.assertEqual( ':'.join(int_vn_fqname) +"_vxlan",
                         mock_zk.get_vn_from_id(int(vxlan_id)))

        self._vnc_lib.logical_router_delete(id=lr1_uuid)
        self._vnc_lib.logical_router_delete(id=lr2_uuid)
        logger.debug('PASS - test_vxlan_update_failure_for_lr')
Exemple #15
0
    def test_vxlan_routing_for_internal_vn(self):
        project = self._vnc_lib.project_read(
            fq_name=['default-domain', 'default-project'])
        project.set_vxlan_routing(True)
        self._vnc_lib.project_update(project)

        # Create Logical Router
        lr = LogicalRouter('router-test-v4-%s' % self.id(), project)
        lr.set_logical_router_type('vxlan-routing')
        lr_uuid = self._vnc_lib.logical_router_create(lr)
        lr = self._vnc_lib.logical_router_read(id=lr_uuid)

        # Check to see whether internal VN for VxLAN Routing is created.
        int_vn_name = get_lr_internal_vn_name(lr_uuid)
        int_vn_fqname = ['default-domain', 'default-project', int_vn_name]
        try:
            self._vnc_lib.virtual_network_read(fq_name=int_vn_fqname)
        except NoIdError as e:
            # Invisible objects do not come up in read
            # calls but throws up a exception saying the
            # object is invisible but cannot be read, confirming
            # the presence of the object. Hack!
            if "This object is not visible" not in str(e):
                assert (False)

        # Check to see if deleting the VN deletes the internal VN
        # that was created.
        self._vnc_lib.logical_router_delete(id=lr_uuid)
        try:
            self._vnc_lib.virtual_network_read(fq_name=int_vn_fqname)
            self.fail("Logical router internal virtual network was not "
                      "removed")
        except NoIdError:
            pass

        # Check to see if we are able to disable VxLAN Routing
        # after LR is deleted in the project.
        project.set_vxlan_routing(False)
        self._vnc_lib.project_update(project)
    def post_dbe_update(cls, uuid, fq_name, obj_dict, db_conn,
                        prop_collection_updates=None):
        ok, vxlan_routing = cls.is_vxlan_routing_enabled(db_conn, obj_dict)
        if not ok:
            return ok, vxlan_routing
        ok, lr_orig_dict = db_conn.dbe_read(
            'logical_router',
            obj_dict['uuid'],
            obj_fields=['virtual_network_refs'])
        if not ok:
            return ok, lr_orig_dict
        if (obj_dict.get('configured_route_target_list') is None and
                'vxlan_network_identifier' not in obj_dict):
            return True, ''
        if vxlan_routing is True:
            vn_int_name = get_lr_internal_vn_name(obj_dict.get('uuid'))
            vn_id = None
            for vn_ref in lr_orig_dict['virtual_network_refs']:
                if (vn_ref.get('attr', {}).get(
                        'logical_router_virtual_network_type') ==
                        'InternalVirtualNetwork'):
                    vn_id = vn_ref.get('uuid')
                    break
            if vn_id is None:
                return True, ''
            ok, vn_dict = db_conn.dbe_read(
                'virtual_network',
                vn_id,
                obj_fields=['route_target_list',
                            'fq_name',
                            'uuid',
                            'parent_uuid',
                            'virtual_network_properties'])
            if not ok:
                return ok, vn_dict
            vn_rt_dict_list = vn_dict.get('route_target_list')
            vn_rt_list = []
            if vn_rt_dict_list:
                vn_rt_list = vn_rt_dict_list.get('route_target', [])
            lr_rt_list_obj = obj_dict.get('configured_route_target_list')
            lr_rt_list = []
            if lr_rt_list_obj:
                lr_rt_list = lr_rt_list_obj.get('route_target', [])

            vxlan_id_in_db = vn_dict.get('virtual_network_properties', {}).get(
                'vxlan_network_identifier')

            if(vxlan_id_in_db != obj_dict.get('vxlan_network_identifier') or
                    set(vn_rt_list) != set(lr_rt_list)):
                ok, proj_dict = db_conn.dbe_read('project',
                                                 vn_dict['parent_uuid'])
                if not ok:
                    return ok, proj_dict
                proj_obj = Project(name=vn_dict.get('fq_name')[-2],
                                   parent_type='domain',
                                   fq_name=proj_dict.get('fq_name'))

                vn_obj = VirtualNetwork(name=vn_int_name, parent_obj=proj_obj)

                if (set(vn_rt_list) != set(lr_rt_list)):
                    vn_obj.set_route_target_list(lr_rt_list_obj)

                # If vxlan_id has been set, we need to propogate it to the
                # internal VN.
                if vxlan_id_in_db != obj_dict.get('vxlan_network_identifier'):
                    prop = vn_dict.get('virtual_network_properties', {})
                    prop['vxlan_network_identifier'] =\
                        obj_dict['vxlan_network_identifier']
                    vn_obj.set_virtual_network_properties(prop)

                vn_int_dict = json.dumps(vn_obj, default=_obj_serializer_all)
                status, obj = cls.server.internal_request_update(
                    'virtual-network',
                    vn_dict['uuid'],
                    json.loads(vn_int_dict))
        return True, ''
    def pre_dbe_create(cls, tenant_name, obj_dict, db_conn):
        ok, result = cls.check_for_external_gateway(db_conn, obj_dict)
        if not ok:
            return ok, result

        ok, result = cls._ensure_lr_dci_association(obj_dict)
        if not ok:
            return ok, result

        ok, result = cls.check_port_gateway_not_in_same_network(db_conn,
                                                                obj_dict)
        if not ok:
            return ok, result

        ok, result = cls.is_port_in_use_by_vm(obj_dict, db_conn)
        if not ok:
            return ok, result

        ok, result = cls.is_vxlan_routing_enabled(db_conn, obj_dict)
        if not ok:
            return ok, result
        vxlan_routing = result

        vxlan_id = None
        vxlan_id = cls._check_vxlan_id_in_lr(obj_dict)

        if vxlan_routing and vxlan_id:
            # If input vxlan_id is not None, that means we need to reserve it.
            # First, check if vxlan_id is set for other fq_name
            existing_fq_name = cls.vnc_zk_client.get_vn_from_id(int(vxlan_id))
            if existing_fq_name is not None:
                msg = ("Cannot set VXLAN_ID: %s, it has already been set" %
                       vxlan_id)
                return False, (400, msg)

            # Second, if vxlan_id is not None, set it in Zookeeper and set the
            # undo function for when any failures happen later.
            # But first, get the internal_vlan name using which the resource
            # in zookeeper space will be reserved.

            ok, proj_dict = db_conn.dbe_read('project',
                                             obj_dict['parent_uuid'])
            if not ok:
                return (ok, proj_dict)

            vn_int_name = get_lr_internal_vn_name(obj_dict.get('uuid'))
            proj_obj = Project(name=proj_dict.get('fq_name')[-1],
                               parent_type='domain',
                               fq_name=proj_dict.get('fq_name'))

            vn_obj = VirtualNetwork(name=vn_int_name, parent_obj=proj_obj)

            try:
                vxlan_fq_name = ':'.join(vn_obj.fq_name) + '_vxlan'
                # Now that we have the internal VN name, allocate it in
                # zookeeper only if the resource hasn't been reserved already
                cls.vnc_zk_client.alloc_vxlan_id(vxlan_fq_name, int(vxlan_id))
            except ResourceExistsError:
                msg = ("Cannot set VXLAN_ID: %s, it has already been set"
                       % vxlan_id)
                return False, (400, msg)

            def undo_vxlan_id():
                cls.vnc_zk_client.free_vxlan_id(int(vxlan_id), vxlan_fq_name)
                return True, ""
            get_context().push_undo(undo_vxlan_id)

        # Check if type of all associated BGP VPN are 'l3'
        ok, result = cls.server.get_resource_class(
            'bgpvpn').check_router_supports_vpn_type(obj_dict)
        if not ok:
            return ok, result

        # Check if we can reference the BGP VPNs
        return cls.server.get_resource_class(
            'bgpvpn').check_router_has_bgpvpn_assoc_via_network(obj_dict)
    def pre_dbe_create(cls, tenant_name, obj_dict, db_conn):
        ok, result = cls.check_for_external_gateway(db_conn, obj_dict)
        if not ok:
            return ok, result

        ok, result = cls._ensure_lr_dci_association(obj_dict)
        if not ok:
            return ok, result

        ok, result = cls.check_port_gateway_not_in_same_network(
            db_conn, obj_dict)
        if not ok:
            return ok, result

        ok, result = cls.is_port_in_use_by_vm(obj_dict, db_conn)
        if not ok:
            return ok, result

        ok, result = cls.is_vxlan_routing_enabled(db_conn, obj_dict)
        if not ok:
            return ok, result
        vxlan_routing = result

        vxlan_id = None
        vxlan_id = cls._check_vxlan_id_in_lr(obj_dict)

        if vxlan_routing and vxlan_id:
            # If input vxlan_id is not None, that means we need to reserve it.
            # First, check if vxlan_id is set for other fq_name
            existing_fq_name = cls.vnc_zk_client.get_vn_from_id(int(vxlan_id))
            if existing_fq_name is not None:
                msg = ("Cannot set VXLAN_ID: %s, it has already been set" %
                       vxlan_id)
                return False, (400, msg)

            # Second, if vxlan_id is not None, set it in Zookeeper and set the
            # undo function for when any failures happen later.
            # But first, get the internal_vlan name using which the resource
            # in zookeeper space will be reserved.

            ok, proj_dict = db_conn.dbe_read('project',
                                             obj_dict['parent_uuid'])
            if not ok:
                return (ok, proj_dict)

            vn_int_name = get_lr_internal_vn_name(obj_dict.get('uuid'))
            proj_obj = Project(name=proj_dict.get('fq_name')[-1],
                               parent_type='domain',
                               fq_name=proj_dict.get('fq_name'))

            vn_obj = VirtualNetwork(name=vn_int_name, parent_obj=proj_obj)

            try:
                vxlan_fq_name = ':'.join(vn_obj.fq_name) + '_vxlan'
                # Now that we have the internal VN name, allocate it in
                # zookeeper only if the resource hasn't been reserved already
                cls.vnc_zk_client.alloc_vxlan_id(vxlan_fq_name, int(vxlan_id))
            except ResourceExistsError:
                msg = ("Cannot set VXLAN_ID: %s, it has already been set" %
                       vxlan_id)
                return False, (400, msg)

            def undo_vxlan_id():
                cls.vnc_zk_client.free_vxlan_id(int(vxlan_id), vxlan_fq_name)
                return True, ""

            get_context().push_undo(undo_vxlan_id)

        # Check if type of all associated BGP VPN are 'l3'
        ok, result = cls.server.get_resource_class(
            'bgpvpn').check_router_supports_vpn_type(obj_dict)
        if not ok:
            return ok, result

        # Check if we can reference the BGP VPNs
        return cls.server.get_resource_class(
            'bgpvpn').check_router_has_bgpvpn_assoc_via_network(obj_dict)
    def post_dbe_update(cls, uuid, fq_name, obj_dict, db_conn,
                        prop_collection_updates=None):

        ok, result = db_conn.dbe_read(
            'logical_router',
            obj_dict['uuid'],
            obj_fields=['virtual_network_refs', 'logical_router_type'])
        if not ok:
            return ok, result
        lr_orig_dict = result

        if (obj_dict.get('configured_route_target_list') is None and
                'vxlan_network_identifier' not in obj_dict):
            return True, ''

        logical_router_type_in_db = cls.check_lr_type(lr_orig_dict)
        if logical_router_type_in_db == 'vxlan-routing':
            # If logical_router_type was set to vxlan-routing in DB,
            # it means that an existing LR used for VXLAN
            # support was updated to either change the
            # vxlan_network_identifer or configured_route_target_list

            vn_int_name = get_lr_internal_vn_name(obj_dict.get('uuid'))
            vn_id = None
            for vn_ref in lr_orig_dict.get('virtual_network_refs') or []:
                if (vn_ref.get('attr', {}).get(
                        'logical_router_virtual_network_type') ==
                        'InternalVirtualNetwork'):
                    vn_id = vn_ref.get('uuid')
                    break
            if vn_id is None:
                return True, ''
            ok, vn_dict = db_conn.dbe_read(
                'virtual_network',
                vn_id,
                obj_fields=['route_target_list',
                            'fq_name',
                            'uuid',
                            'parent_uuid',
                            'virtual_network_properties'])
            if not ok:
                return ok, vn_dict
            vn_rt_dict_list = vn_dict.get('route_target_list')
            vn_rt_list = []
            if vn_rt_dict_list:
                vn_rt_list = vn_rt_dict_list.get('route_target', [])
            lr_rt_list_obj = obj_dict.get('configured_route_target_list')
            lr_rt_list = []
            if lr_rt_list_obj:
                lr_rt_list = lr_rt_list_obj.get('route_target', [])

            vxlan_id_in_db = vn_dict.get('virtual_network_properties', {}).get(
                'vxlan_network_identifier')

            if(vxlan_id_in_db != obj_dict.get('vxlan_network_identifier') or
                    set(vn_rt_list) != set(lr_rt_list)):
                ok, proj_dict = db_conn.dbe_read('project',
                                                 vn_dict['parent_uuid'])
                if not ok:
                    return ok, proj_dict
                proj_obj = Project(name=vn_dict.get('fq_name')[-2],
                                   parent_type='domain',
                                   fq_name=proj_dict.get('fq_name'))

                vn_obj = VirtualNetwork(name=vn_int_name, parent_obj=proj_obj)

                if (set(vn_rt_list) != set(lr_rt_list)):
                    vn_obj.set_route_target_list(lr_rt_list_obj)

                # If vxlan_id has been set, we need to propogate it to the
                # internal VN.
                if vxlan_id_in_db != obj_dict.get('vxlan_network_identifier'):
                    prop = vn_dict.get('virtual_network_properties', {})
                    prop['vxlan_network_identifier'] =\
                        obj_dict['vxlan_network_identifier']
                    vn_obj.set_virtual_network_properties(prop)

                vn_int_dict = json.dumps(vn_obj, default=_obj_serializer_all)
                status, obj = cls.server.internal_request_update(
                    'virtual-network',
                    vn_dict['uuid'],
                    json.loads(vn_int_dict))
        return True, ''
Exemple #20
0
    def test_vxlan_routing_for_internal_vn(self):
        global_vrouter_config = GlobalVrouterConfig()
        self._vnc_lib.global_vrouter_config_create(global_vrouter_config)

        project = self._vnc_lib.project_read(
            fq_name=['default-domain', 'default-project'])
        project.set_vxlan_routing(True)
        self._vnc_lib.project_update(project)

        # Create Logical Router
        lr = LogicalRouter('router-test-v4-%s' % (self.id()), project)
        lr_uuid = self._vnc_lib.logical_router_create(lr)
        lr = self._vnc_lib.logical_router_read(id=lr_uuid)
        logger.debug('Created Logical Router ')

        # Check to see whether internal VN for VxLAN Routing is created.
        int_vn_name = get_lr_internal_vn_name(lr_uuid)
        int_vn_fqname = ['default-domain', 'default-project', int_vn_name]
        try:
            int_vn = self._vnc_lib.virtual_network_read(fq_name=int_vn_fqname)
        except NoIdError as e:
            # Invisible objects do not come up in read
            # calls but throws up a exception saying the
            # object is invisible but cannot be read, confirming
            # the presence of the object. Hack!
            if "This object is not visible" not in str(e):
                logger.debug(
                    'FAIL - Internal VN not created for Logical Router')
                assert (False)
        logger.debug('PASS - Internal VN created for Logical Router')

        # Check to see if we are not able to attach Ext Gateway when
        # VxLAN Routing is enabled.
        ext_vn = VirtualNetwork(name=self.id() + '_ext_lr')
        ext_vn_uuid = self._vnc_lib.virtual_network_create(ext_vn)
        ext_vn = self._vnc_lib.virtual_network_read(id=ext_vn_uuid)
        lr.add_virtual_network(ext_vn)
        try:
            self._vnc_lib.logical_router_update(lr)
        except cfgm_common.exceptions.BadRequest as e:
            logger.debug(
                'PASS - Not able to attach Ext GW when VxLAN Routing is enabled'
            )
        else:
            logger.debug(
                'FAIL - Able to attach Ext GW when VxLAN Routing is enabled')
            assert (False)

        # Check to see if we are not able to disable VxLAN routing in the
        # project when there is one LR in the project.
        project.set_vxlan_routing(False)
        try:
            self._vnc_lib.project_update(project)
        except cfgm_common.exceptions.BadRequest as e:
            logger.debug(
                'PASS - Checking not updating vxlan_routing in project')
        else:
            logger.debug(
                'FAIL - VxLAN Routing cant be updated in Project when LR exists'
            )
            assert (False)

        # Check to see if deleting the VN deletes the internal VN
        # that was created.
        self._vnc_lib.logical_router_delete(id=lr_uuid)
        try:
            int_vn = self._vnc_lib.virtual_network_read(fq_name=int_vn_fqname)
        except NoIdError:
            logger.debug(
                'PASS - Internal VN created for Logical Router is purged')
        else:
            logger.debug(
                'FAIL - Internal VN created for Logical Router is not purged')
            assert (False)

        # Check to see if we are able to disable VxLAN Routing
        # after LR is deleted in the project.
        project.set_vxlan_routing(False)
        try:
            self._vnc_lib.project_update(project)
        except cfgm_common.exceptions.BadRequest as e:
            logger.debug(
                'FAIL - VxLAN Routing update not allowed when LR doesnt exist')
            assert (False)
        else:
            logger.debug('PASS - VxLAN Routing update successful')
    def test_vxlan_routing_for_internal_vn(self):
        project = self._vnc_lib.project_read(
            fq_name=['default-domain', 'default-project'])
        project.set_vxlan_routing(True)
        self._vnc_lib.project_update(project)

        # Create Logical Router
        lr = LogicalRouter('router-test-v4-%s' % self.id(), project)
        lr_uuid = self._vnc_lib.logical_router_create(lr)
        lr = self._vnc_lib.logical_router_read(id=lr_uuid)

        # Check to see whether internal VN for VxLAN Routing is created.
        int_vn_name = get_lr_internal_vn_name(lr_uuid)
        int_vn_fqname = ['default-domain', 'default-project', int_vn_name]
        try:
            self._vnc_lib.virtual_network_read(fq_name=int_vn_fqname)
        except NoIdError as e:
            # Invisible objects do not come up in read
            # calls but throws up a exception saying the
            # object is invisible but cannot be read, confirming
            # the presence of the object. Hack!
            if "This object is not visible" not in str(e):
                assert (False)

        # Check to see if we are not able to attach Ext Gateway when
        # VxLAN Routing is enabled.
        ext_vn = VirtualNetwork(name=self.id() + '_ext_lr')
        ext_vn_uuid = self._vnc_lib.virtual_network_create(ext_vn)
        ext_vn = self._vnc_lib.virtual_network_read(id=ext_vn_uuid)
        lr.add_virtual_network(ext_vn)
        try:
            self._vnc_lib.logical_router_update(lr)
            self.fail("API allow to add an external gateway to the logical "
                      "router while the VxLAN routing is enabled")
        except BadRequest:
            pass

        # Check to see if we are not able to disable VxLAN routing in the
        # project when there is one LR in the project.
        project.set_vxlan_routing(False)
        try:
            self._vnc_lib.project_update(project)
            self.fail("API allows to disable VxLAN routhing while there is a "
                      "logical router in the project")
        except BadRequest:
            pass

        # Check to see if deleting the VN deletes the internal VN
        # that was created.
        self._vnc_lib.logical_router_delete(id=lr_uuid)
        try:
            self._vnc_lib.virtual_network_read(fq_name=int_vn_fqname)
            self.fail("Logical router internal virtual network was not "
                      "removed")
        except NoIdError:
            pass

        # Check to see if we are able to disable VxLAN Routing
        # after LR is deleted in the project.
        project.set_vxlan_routing(False)
        self._vnc_lib.project_update(project)
    def test_vxlan_routing_for_internal_vn(self):
        project = self._vnc_lib.project_read(fq_name=['default-domain',
                                                      'default-project'])
        project.set_vxlan_routing(True)
        self._vnc_lib.project_update(project)

        # Create Logical Router
        lr = LogicalRouter('router-test-v4-%s' %(self.id()), project)
        lr_uuid = self._vnc_lib.logical_router_create(lr)
        lr = self._vnc_lib.logical_router_read(id=lr_uuid)
        logger.debug('Created Logical Router ')

        # Check to see whether internal VN for VxLAN Routing is created.
        int_vn_name = get_lr_internal_vn_name(lr_uuid)
        int_vn_fqname = ['default-domain', 'default-project', int_vn_name]
        try:
            int_vn = self._vnc_lib.virtual_network_read(fq_name=int_vn_fqname)
        except NoIdError as e:
            # Invisible objects do not come up in read
            # calls but throws up a exception saying the
            # object is invisible but cannot be read, confirming
            # the presence of the object. Hack!
            if "This object is not visible" not in str(e):
                logger.debug('FAIL - Internal VN not created for Logical Router')
                assert(False)
        logger.debug('PASS - Internal VN created for Logical Router')

        # Check to see if we are not able to attach Ext Gateway when
        # VxLAN Routing is enabled.
        ext_vn = VirtualNetwork(name=self.id()+'_ext_lr')
        ext_vn_uuid = self._vnc_lib.virtual_network_create(ext_vn)
        ext_vn = self._vnc_lib.virtual_network_read(id=ext_vn_uuid)
        lr.add_virtual_network(ext_vn)
        try:
            self._vnc_lib.logical_router_update(lr)
        except cfgm_common.exceptions.BadRequest as e:
            logger.debug('PASS - Not able to attach Ext GW when VxLAN Routing is enabled')
        else:
            logger.debug('FAIL - Able to attach Ext GW when VxLAN Routing is enabled')
            assert(False)

        # Check to see if we are not able to disable VxLAN routing in the
        # project when there is one LR in the project.
        project.set_vxlan_routing(False)
        try:
            self._vnc_lib.project_update(project)
        except cfgm_common.exceptions.BadRequest as e:
            logger.debug('PASS - Checking not updating vxlan_routing in project')
        else:
            logger.debug('FAIL - VxLAN Routing cant be updated in Project when LR exists')
            assert(False)

        # Check to see if deleting the VN deletes the internal VN
        # that was created.
        self._vnc_lib.logical_router_delete(id=lr_uuid)
        try:
            int_vn = self._vnc_lib.virtual_network_read(fq_name=int_vn_fqname)
        except NoIdError:
            logger.debug('PASS - Internal VN created for Logical Router is purged')
        else:
            logger.debug('FAIL - Internal VN created for Logical Router is not purged')
            assert(False)

        # Check to see if we are able to disable VxLAN Routing
        # after LR is deleted in the project.
        project.set_vxlan_routing(False)
        try:
            self._vnc_lib.project_update(project)
        except cfgm_common.exceptions.BadRequest as e:
            logger.debug('FAIL - VxLAN Routing update not allowed when LR doesnt exist')
            assert(False)
        else:
            logger.debug('PASS - VxLAN Routing update successful')