Ejemplo n.º 1
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)
Ejemplo n.º 2
0
    def test_vm_port_not_added_to_lr(self):
        project = self._vnc_lib.project_read(
            ['default-domain', 'default-project'])
        ipam = self._vnc_lib.network_ipam_read(
            ['default-domain', 'default-project', 'default-network-ipam'])

        # Create subnets
        ipam_sn_v4_vn = IpamSubnetType(subnet=SubnetType('11.1.1.0', 24))

        # Create VN my-vn
        vn = VirtualNetwork('%s-vn' % self.id(), project)
        vn.add_network_ipam(ipam, VnSubnetsType([ipam_sn_v4_vn]))
        self._vnc_lib.virtual_network_create(vn)
        net_obj = self._vnc_lib.virtual_network_read(id=vn.uuid)

        # Create v4 Ip object
        ip_obj = InstanceIp(name=str(uuid.uuid4()), instance_ip_family='v4')
        ip_obj.uuid = ip_obj.name

        # Create VM
        vm_inst_obj = VirtualMachine(str(uuid.uuid4()))
        vm_inst_obj.uuid = vm_inst_obj.name
        self._vnc_lib.virtual_machine_create(vm_inst_obj)

        id_perms = IdPermsType(enable=True)
        vm_port_obj = VirtualMachineInterface(str(uuid.uuid4()),
                                              vm_inst_obj,
                                              id_perms=id_perms)
        vm_port_obj.uuid = vm_port_obj.name
        vm_port_obj.set_virtual_network(vn)
        ip_obj.set_virtual_machine_interface(vm_port_obj)
        ip_obj.set_virtual_network(net_obj)
        self._vnc_lib.virtual_machine_interface_create(vm_port_obj)

        self._vnc_lib.instance_ip_create(ip_obj)

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

        # Add Router Interface
        lr.add_virtual_machine_interface(vm_port_obj)
        with ExpectedException(RefsExistError):
            self._vnc_lib.logical_router_update(lr)
        lr.del_virtual_machine_interface(vm_port_obj)

        # Create Port
        port_obj = self.create_port(project, net_obj)
        lr.add_virtual_machine_interface(port_obj)
        self._vnc_lib.logical_router_update(lr)
        with ExpectedException(BadRequest):
            port_obj.add_virtual_machine(vm_inst_obj)
            self._vnc_lib.virtual_machine_interface_update(port_obj)
        self._vnc_lib.logical_router_delete(id=lr.uuid)
    def test_delete_lr_missing_vn_refs(self):
        # Get Project Ref
        project = self._vnc_lib.project_read(
            fq_name=['default-domain', 'default-project'])
        lr = LogicalRouter('router-test-missing_vn_refs-%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)
        logger.debug('Created Logical Router ')

        # Create a VN Object
        vn = VirtualNetwork('%s-vn' % self.id(), project)
        self._vnc_lib.virtual_network_create(vn)
        # Create a Virtual Machine Interface that does not have VN Ref
        id_perms = IdPermsType(enable=True)
        vmi_no_vn_ref = VirtualMachineInterface(str(uuid.uuid4()),
                                                parent_obj=project,
                                                id_perms=id_perms)

        vmi_no_vn_ref.set_virtual_network(vn)
        vmi_uuid = self._vnc_lib.virtual_machine_interface_create(
            vmi_no_vn_ref)
        # Do not associate VN Ref to VMI and create
        lr.add_virtual_machine_interface(vmi_no_vn_ref)
        self._vnc_lib.logical_router_update(lr)
        vmi_obj = self._vnc_lib.virtual_machine_interface_read(id=vmi_uuid)
        vn_refs = vmi_obj.get_virtual_network_refs()
        vn_uuid = vn_refs[0]['uuid']
        self._vnc_lib.ref_update('virtual_machine_interface', vmi_uuid,
                                 'virtual_network', vn_uuid, None, 'DELETE')
        vmi_obj = self._vnc_lib.virtual_machine_interface_read(id=vmi_uuid)
        vn_refs = vmi_obj.get_virtual_network_refs()
        self.assertIsNone(vn_refs)

        # Create a VN Object
        vn2 = VirtualNetwork('%s-vn2' % self.id(), project)
        self._vnc_lib.virtual_network_create(vn2)
        # Create a Virtual Machine Interface that does not have VN Ref
        vmi_no_vn_ref_2 = VirtualMachineInterface(str(uuid.uuid4()),
                                                  parent_obj=project,
                                                  id_perms=id_perms)

        vmi_no_vn_ref_2.set_virtual_network(vn2)
        self._vnc_lib.virtual_machine_interface_create(vmi_no_vn_ref_2)
        # Do not associate VN Ref to VMI and create
        lr.add_virtual_machine_interface(vmi_no_vn_ref_2)
        self._vnc_lib.logical_router_update(lr)
        # Deleting directly from api-server as api server
        # will not allow deletion
        self._vnc_lib.logical_router_delete(id=lr.uuid)
    def test_create_logical_router(self):
        lr_name = 'lr-' + self.id()
        lr_fq_name = ['default-domain', 'default-project', lr_name]
        lr = LogicalRouter(fq_name=lr_fq_name,
                           parent_type='project',
                           logical_router_type='vxlan-routing',
                           vxlan_network_identifier='5000')
        lr.set_physical_router(self.pr1)
        self._vnc_lib.logical_router_create(lr)
        self.check_trans_info('Logical Router',
                              'Create',
                              lr_name,
                              pr_name=self.pr1.name)

        lr.add_virtual_machine_interface(self.vmi)

        self._vnc_lib.logical_router_update(lr)
        self.check_trans_info('Logical Router',
                              'Update',
                              lr_name,
                              pr_name=self.pr1.name)

        self._vnc_lib.logical_router_delete(id=lr.uuid)
        self.check_trans_info('Logical Router',
                              'Delete',
                              lr_name,
                              pr_name=self.pr1.name)
Ejemplo n.º 5
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 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(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)
Ejemplo n.º 7
0
    def test_change_from_snat_to_vxlan(self):
        project = self._vnc_lib.project_read(
            fq_name=['default-domain', 'default-project'])
        # Create Logical Router enabled for SNAT.
        lr = LogicalRouter('router-test-snat-to-vxlan-%s' % (self.id()),
                           project)

        lr.set_logical_router_type('snat-routing')
        lr_uuid = self._vnc_lib.logical_router_create(lr)
        lr = self._vnc_lib.logical_router_read(id=lr_uuid)
        logger.debug('Created Logical Router ')

        lr.set_logical_router_type('vxlan-routing')
        with ExpectedException(BadRequest):
            self._vnc_lib.logical_router_update(lr)

        logger.debug('PASS: Could not update LR from SNAT to VXLAN')
Ejemplo n.º 8
0
 def create_lr(self, lrname, vns, prs, vmis):
     lr_fq_name = ['default-domain', 'default-project', lrname]
     lr = LogicalRouter(fq_name=lr_fq_name,
                        parent_type='project',
                        logical_router_type='vxlan-routing')
     for pr in prs:
         probj = self._vnc_lib.physical_router_read(id=pr.get_uuid())
         lr.add_physical_router(probj)
     for vn in vns:
         vminame = 'vmi-lr-to-vn' + vn.get_display_name()
         fq_name1 = ['default-domain', 'default-project', vminame]
         vmi = VirtualMachineInterface(fq_name=fq_name1,
                                       parent_type='project')
         vmi.set_virtual_network(vn)
         self._vnc_lib.virtual_machine_interface_create(vmi)
         vmis[vminame] = vmi
         lr.add_virtual_machine_interface(vmi)
     lr_uuid = self._vnc_lib.logical_router_create(lr)
     return lr, self._vnc_lib.logical_router_read(id=lr_uuid)
    def create_all(self):
        self.create_features([
            'underlay-ip-clos', 'overlay-bgp', 'l2-gateway', 'l3-gateway',
            'vn-interconnect'
        ])
        self.create_physical_roles(['leaf', 'spine', 'pnf'])
        self.create_overlay_roles(['crb-gateway', 'pnf-servicechain'])
        self.create_role_definitions([
            AttrDict({
                'name': 'crb-gateway-spine',
                'physical_role': 'spine',
                'overlay_role': 'crb-gateway',
                'features': ['l3-gateway', 'vn-interconnect'],
                'feature_configs': None
            }),
            AttrDict({
                'name': 'pnf-service-chain',
                'physical_role': 'pnf',
                'overlay_role': 'pnf-servicechain',
                'features': ['l3-gateway', 'vn-interconnect'],
                'feature_configs': None
            })
        ])

        self.jt = self.create_job_template('job-template-1' + self.id())
        self.fabric = self.create_fabric('fabric-1' + self.id())
        self.np1, self.rc1 = self.create_node_profile(
            'node-profile-1' + self.id(),
            device_family='junos-qfx',
            role_mappings=[
                AttrDict({
                    'physical_role': 'spine',
                    'rb_roles': ['crb-gateway']
                })
            ],
            job_template=self.jt)
        self.np2, self.rc2 = self.create_node_profile(
            'node-profile-2' + self.id(),
            device_family='junos-srx',
            role_mappings=[
                AttrDict({
                    'physical_role': 'pnf',
                    'rb_roles': ['pnf-servicechain']
                })
            ],
            job_template=self.jt)

        rtr1_name = 'router1' + self.id()
        self.bgp_router1, self.pr1 = self.create_router(
            rtr1_name,
            '1.1.1.1',
            product='qfx10008',
            family='junos-qfx',
            role='spine',
            rb_roles=['crb-gateway', 'DCI-Gateway'],
            physical_role=self.physical_roles['spine'],
            overlay_role=self.overlay_roles['crb-gateway'],
            fabric=self.fabric,
            node_profile=self.np1)
        rtr2_name = 'router2' + self.id()
        self.bgp_router2, self.pr2 = self.create_router(
            rtr2_name,
            '1.1.1.2',
            product='qfx10008',
            family='junos-qfx',
            role='pnf',
            rb_roles=['PNF-Servicechain'],
            physical_role=self.physical_roles['pnf'],
            overlay_role=self.overlay_roles['pnf-servicechain'],
            fabric=self.fabric,
            node_profile=self.np2)

        pi1_0_name = "xe-0/0/0"
        self.pi1_0 = PhysicalInterface(pi1_0_name, parent_obj=self.pr1)
        self.pi1_0_fq = ':'.join(self.pi1_0.fq_name)
        self._vnc_lib.physical_interface_create(self.pi1_0)

        pi1_1_name = "xe-0/0/1"
        self.pi1_1 = PhysicalInterface(pi1_1_name, parent_obj=self.pr1)
        self.pi1_1_fq = ':'.join(self.pi1_1.fq_name)
        self._vnc_lib.physical_interface_create(self.pi1_1)

        pi2_0_name = "xe-0/0/0"
        self.pi2_0 = PhysicalInterface(pi2_0_name, parent_obj=self.pr2)
        self._vnc_lib.physical_interface_create(self.pi2_0)

        pi2_1_name = "xe-0/0/1"
        self.pi2_1 = PhysicalInterface(pi2_1_name, parent_obj=self.pr2)
        self._vnc_lib.physical_interface_create(self.pi2_1)

        self.vn1 = self.create_vn('1', '1.1.1.0')

        lr1_name = 'lr1-' + self.id()
        lr1_fq_name = ['default-domain', 'default-project', lr1_name]
        self.lr1 = LogicalRouter(fq_name=lr1_fq_name,
                                 parent_type='project',
                                 logical_router_type='vxlan-routing',
                                 vxlan_network_identifier='3000')
        self.lr1.set_physical_router(self.pr1)
        self._vnc_lib.logical_router_create(self.lr1)

        lr2_name = 'lr2-' + self.id()
        lr2_fq_name = ['default-domain', 'default-project', lr2_name]
        self.lr2 = LogicalRouter(fq_name=lr2_fq_name,
                                 parent_type='project',
                                 logical_router_type='vxlan-routing',
                                 vxlan_network_identifier='4000')
        self.lr2.set_physical_router(self.pr2)
        self._vnc_lib.logical_router_create(self.lr2)

        fq_name = ['default-domain', 'default-project', 'vmi-' + self.id()]
        self.vmi = VirtualMachineInterface(fq_name=fq_name,
                                           parent_type='project')
        self.vmi.set_virtual_network(self.vn1)
        self._vnc_lib.virtual_machine_interface_create(self.vmi)

        self.lr1.add_virtual_machine_interface(self.vmi)
        self._vnc_lib.logical_router_update(self.lr1)
class TestTransactionsDM(TestAnsibleCommonDM):
    def setUp(self, extra_config_knobs=None):
        super(TestTransactionsDM,
              self).setUp(extra_config_knobs=extra_config_knobs)
        self.create_all()

    def tearDown(self):
        self.delete_all()
        super(TestTransactionsDM, self).tearDown()

    @retries(5, hook=retry_exc_handler)
    def chk_trans_info(self,
                       trans_id=None,
                       pr_name=None,
                       trans_descr=None,
                       allow_update=False):
        if pr_name:
            t_id, t_descr = FakeJobHandler.get_dev_transaction_info(pr_name)
        else:
            t_id, t_descr = FakeJobHandler.get_transaction_info()

        if allow_update and 'Create' in trans_descr and 'Update' in t_descr:
            trans_descr = trans_descr.replace('Create', 'Update')
        if 'DCI' in trans_descr and trans_descr != t_descr and pr_name:
            print("Transaction mistmatch {} != {}".format(
                trans_descr, t_descr))
            # sometimes due to timing, PR transaction gets updated.
            trans_descr = "Bgp Router '{}' Update".format(pr_name)

        self.assertEqual(trans_descr, t_descr)
        if trans_id:
            self.assertEqual(trans_id, t_id)
        print("TRANSACTION: {}".format(trans_descr))
        return t_id, t_descr

    def check_trans_info(self,
                         obj_type=None,
                         oper=None,
                         obj_name=None,
                         trans_id=None,
                         pr_name=None,
                         trans_descr=None,
                         allow_update=False):
        trans_descr = trans_descr or "{} '{}' {}".format(
            obj_type, obj_name, oper)
        time.sleep(1)
        return self.chk_trans_info(trans_id=trans_id,
                                   pr_name=pr_name,
                                   trans_descr=trans_descr,
                                   allow_update=allow_update)

    def test_update_bgp_router(self):
        self.bgp_router1.set_display_name("foo")
        self._vnc_lib.bgp_router_update(self.bgp_router1)
        self.check_trans_info('Bgp Router',
                              'Update',
                              self.bgp_router1.name,
                              pr_name=self.bgp_router1.name)

    def test_create_logical_router(self):
        lr_name = 'lr-' + self.id()
        lr_fq_name = ['default-domain', 'default-project', lr_name]
        lr = LogicalRouter(fq_name=lr_fq_name,
                           parent_type='project',
                           logical_router_type='vxlan-routing',
                           vxlan_network_identifier='5000')
        lr.set_physical_router(self.pr1)
        self._vnc_lib.logical_router_create(lr)
        self.check_trans_info('Logical Router',
                              'Create',
                              lr_name,
                              pr_name=self.pr1.name)

        lr.add_virtual_machine_interface(self.vmi)

        self._vnc_lib.logical_router_update(lr)
        self.check_trans_info('Logical Router',
                              'Update',
                              lr_name,
                              pr_name=self.pr1.name)

        self._vnc_lib.logical_router_delete(id=lr.uuid)
        self.check_trans_info('Logical Router',
                              'Delete',
                              lr_name,
                              pr_name=self.pr1.name)

    def test_create_vpg(self):
        device_name = self.pr1.get_fq_name()[-1]
        fabric_name = self.fabric.get_fq_name()[-1]
        phy_int_name = self.pi1_0.get_fq_name()[-1]

        vpg_name = "vpg-" + self.id()
        vlan_tag = 10

        vmi = VirtualMachineInterface(vpg_name + "-tagged-" + str(vlan_tag),
                                      parent_type='project',
                                      fq_name=[
                                          "default-domain", "default-project",
                                          vpg_name + "-tagged-" + str(vlan_tag)
                                      ])

        vmi_profile = \
            "{\"local_link_information\":[{\"switch_id\":\"%s\",\"port_id\":"\
            "\"%s\",\"switch_info\":\"%s\",\"fabric\":\"%s\"}]}" % \
            (phy_int_name, phy_int_name, device_name, fabric_name)

        vmi_bindings = {
            "key_value_pair": [{
                "key": "vnic_type",
                "value": "baremetal"
            }, {
                "key": "vif_type",
                "value": "vrouter"
            }, {
                "key": "vpg",
                "value": vpg_name
            }, {
                "key": "profile",
                "value": vmi_profile
            }]
        }
        vmi.set_virtual_machine_interface_bindings(vmi_bindings)
        vmi_properties = {"sub_interface_vlan_tag": vlan_tag}
        vmi.set_virtual_machine_interface_properties(vmi_properties)

        vmi.set_virtual_network(self.vn1)

        sg_name = 'sg-1' + self.id()
        project = self._vnc_lib.project_read(
            ['default-domain', 'default-project'])
        sg = SecurityGroup(name=sg_name, parent_obj=project)
        self._vnc_lib.security_group_create(sg)

        # now create a VPG
        vpg = VirtualPortGroup(vpg_name, parent_obj=self.fabric)
        vpg.set_security_group(sg)
        self._vnc_lib.virtual_port_group_create(vpg)
        self._vnc_lib.virtual_machine_interface_create(vmi)
        self.check_trans_info('Virtual Port Group',
                              'Create',
                              vpg_name,
                              allow_update=True)
        # Update VPG
        vpg.set_virtual_machine_interface_list([{'uuid': vmi.get_uuid()}])
        self._vnc_lib.virtual_port_group_update(vpg)
        self.check_trans_info('Virtual Port Group', 'Update', vpg_name)

        # Update Security Group
        sg = self._vnc_lib.security_group_read(sg.get_fq_name())
        rule1 = self.build_acl_rule(0, 65535, 'egress', 'icmp', 'IPv4')
        sg_rule1 = self._security_group_rule_build(rule1, sg.get_fq_name_str())
        self._security_group_rule_append(sg, sg_rule1)
        self._vnc_lib.security_group_update(sg)
        self.check_trans_info('Security Group', 'Update', sg_name)

        self._vnc_lib.virtual_machine_interface_delete(id=vmi.uuid)
        self.check_trans_info('Virtual Port Group', 'Delete', vpg_name)

        self._vnc_lib.virtual_port_group_delete(id=vpg.uuid)

    def test_create_dci(self):
        dci_name = "test-dci" + self.id()
        dci = DataCenterInterconnect(dci_name)
        dci.add_logical_router(self.lr1)
        self._vnc_lib.data_center_interconnect_create(dci)
        self.check_trans_info('DCI', 'Create', dci_name, pr_name=self.pr1.name)

        dci.del_logical_router(self.lr1)
        self._vnc_lib.data_center_interconnect_update(dci)
        self.check_trans_info('DCI', 'Update', dci_name, pr_name=self.pr1.name)

        dci.add_logical_router(self.lr1)
        self._vnc_lib.data_center_interconnect_update(dci)
        self._vnc_lib.data_center_interconnect_delete(id=dci.uuid)
        self.check_trans_info('DCI', 'Delete', dci_name, pr_name=self.pr1.name)

    def test_create_service_instance(self):
        sas_name = 'sas-1' + self.id()
        sas_fq_name = ['default-global-system-config', sas_name]
        sas = ServiceApplianceSet(
            fq_name=sas_fq_name,
            parent_type='global-system-config',
            service_appliance_set_virtualization_type='physical-device')
        self._vnc_lib.service_appliance_set_create(sas)

        sa_name = 'sa-1' + self.id()
        sa_fq_name = ['default-global-system-config', sas_name, sa_name]
        sa = ServiceAppliance(
            fq_name=sa_fq_name,
            parent_type='service-appliance-set',
            service_appliance_virtualization_type='physical-device')

        sa.set_service_appliance_properties(
            KeyValuePairs([
                KeyValuePair(key='left-attachment-point', value=self.pi1_0_fq),
                KeyValuePair(key='right-attachment-point', value=self.pi1_1_fq)
            ]))
        attr = ServiceApplianceInterfaceType(interface_type='left')
        sa.add_physical_interface(self.pi2_0, attr)
        attr = ServiceApplianceInterfaceType(interface_type='right')
        sa.add_physical_interface(self.pi2_1, attr)
        self._vnc_lib.service_appliance_create(sa)
        tid, td = self.check_trans_info('Service Appliance',
                                        'Create',
                                        sa_name,
                                        pr_name=self.pr1.name)

        st_name = 'st-1' + self.id()
        st_fq_name = ['default-domain', st_name]
        st = ServiceTemplate(fq_name=st_fq_name)
        st.set_service_appliance_set(sas)
        st.set_service_config_managed(False)
        svc_properties = ServiceTemplateType()
        svc_properties.set_service_virtualization_type('physical-device')
        if_type = ServiceTemplateInterfaceType(interface_type='left')
        svc_properties.add_interface_type(if_type)
        if_type = ServiceTemplateInterfaceType(interface_type='right')
        svc_properties.add_interface_type(if_type)
        st.set_service_template_properties(svc_properties)
        self._vnc_lib.service_template_create(st)
        self.check_trans_info(trans_id=tid,
                              trans_descr=td,
                              pr_name=self.pr1.name)

        si_name = 'si-' + self.id()
        si_fqn = ['default-domain', 'default-project', si_name]
        si = ServiceInstance(fq_name=si_fqn)
        si.fq_name = si_fqn
        si.add_service_template(st)
        kvp_array = []
        kvp = KeyValuePair("left-svc-vlan", "100")
        kvp_array.append(kvp)
        kvp = KeyValuePair("right-svc-vlan", "101")
        kvp_array.append(kvp)
        kvp = KeyValuePair("left-svc-asns", "66000,66001")
        kvp_array.append(kvp)
        kvp = KeyValuePair("right-svc-asns", "66000,66002")
        kvp_array.append(kvp)
        kvps = KeyValuePairs()
        kvps.set_key_value_pair(kvp_array)
        si.set_annotations(kvps)
        props = ServiceInstanceType()
        props.set_service_virtualization_type('physical-device')
        props.set_ha_mode("active-standby")
        si.set_service_instance_properties(props)
        self._vnc_lib.service_instance_create(si)
        self.check_trans_info(trans_id=tid,
                              trans_descr=td,
                              pr_name=self.pr1.name)

        pt_name = 'pt-' + self.id()
        pt = PortTuple(pt_name, parent_obj=si)
        pt.add_logical_router(self.lr1)
        pt.add_logical_router(self.lr2)
        kvp_array = []
        kvp = KeyValuePair("left-lr", self.lr1.uuid)
        kvp_array.append(kvp)
        kvp = KeyValuePair("right-lr", self.lr2.uuid)
        kvp_array.append(kvp)
        kvps = KeyValuePairs()
        kvps.set_key_value_pair(kvp_array)
        pt.set_annotations(kvps)
        self._vnc_lib.port_tuple_create(pt)
        self.check_trans_info('Service Instance',
                              'Create',
                              si_name,
                              pr_name=self.pr1.name)

        self._vnc_lib.port_tuple_delete(id=pt.uuid)
        self.check_trans_info('Service Instance',
                              'Delete',
                              si_name,
                              pr_name=self.pr1.name)

        self._vnc_lib.service_appliance_delete(fq_name=sa.fq_name)
        self.check_trans_info('Service Appliance',
                              'Delete',
                              sa_name,
                              pr_name=self.pr1.name)

    def create_all(self):
        self.create_features([
            'underlay-ip-clos', 'overlay-bgp', 'l2-gateway', 'l3-gateway',
            'vn-interconnect'
        ])
        self.create_physical_roles(['leaf', 'spine', 'pnf'])
        self.create_overlay_roles(['crb-gateway', 'pnf-servicechain'])
        self.create_role_definitions([
            AttrDict({
                'name': 'crb-gateway-spine',
                'physical_role': 'spine',
                'overlay_role': 'crb-gateway',
                'features': ['l3-gateway', 'vn-interconnect'],
                'feature_configs': None
            }),
            AttrDict({
                'name': 'pnf-service-chain',
                'physical_role': 'pnf',
                'overlay_role': 'pnf-servicechain',
                'features': ['l3-gateway', 'vn-interconnect'],
                'feature_configs': None
            })
        ])

        self.jt = self.create_job_template('job-template-1' + self.id())
        self.fabric = self.create_fabric('fabric-1' + self.id())
        self.np1, self.rc1 = self.create_node_profile(
            'node-profile-1' + self.id(),
            device_family='junos-qfx',
            role_mappings=[
                AttrDict({
                    'physical_role': 'spine',
                    'rb_roles': ['crb-gateway']
                })
            ],
            job_template=self.jt)
        self.np2, self.rc2 = self.create_node_profile(
            'node-profile-2' + self.id(),
            device_family='junos-srx',
            role_mappings=[
                AttrDict({
                    'physical_role': 'pnf',
                    'rb_roles': ['pnf-servicechain']
                })
            ],
            job_template=self.jt)

        rtr1_name = 'router1' + self.id()
        self.bgp_router1, self.pr1 = self.create_router(
            rtr1_name,
            '1.1.1.1',
            product='qfx10008',
            family='junos-qfx',
            role='spine',
            rb_roles=['crb-gateway', 'DCI-Gateway'],
            physical_role=self.physical_roles['spine'],
            overlay_role=self.overlay_roles['crb-gateway'],
            fabric=self.fabric,
            node_profile=self.np1)
        rtr2_name = 'router2' + self.id()
        self.bgp_router2, self.pr2 = self.create_router(
            rtr2_name,
            '1.1.1.2',
            product='qfx10008',
            family='junos-qfx',
            role='pnf',
            rb_roles=['PNF-Servicechain'],
            physical_role=self.physical_roles['pnf'],
            overlay_role=self.overlay_roles['pnf-servicechain'],
            fabric=self.fabric,
            node_profile=self.np2)

        pi1_0_name = "xe-0/0/0"
        self.pi1_0 = PhysicalInterface(pi1_0_name, parent_obj=self.pr1)
        self.pi1_0_fq = ':'.join(self.pi1_0.fq_name)
        self._vnc_lib.physical_interface_create(self.pi1_0)

        pi1_1_name = "xe-0/0/1"
        self.pi1_1 = PhysicalInterface(pi1_1_name, parent_obj=self.pr1)
        self.pi1_1_fq = ':'.join(self.pi1_1.fq_name)
        self._vnc_lib.physical_interface_create(self.pi1_1)

        pi2_0_name = "xe-0/0/0"
        self.pi2_0 = PhysicalInterface(pi2_0_name, parent_obj=self.pr2)
        self._vnc_lib.physical_interface_create(self.pi2_0)

        pi2_1_name = "xe-0/0/1"
        self.pi2_1 = PhysicalInterface(pi2_1_name, parent_obj=self.pr2)
        self._vnc_lib.physical_interface_create(self.pi2_1)

        self.vn1 = self.create_vn('1', '1.1.1.0')

        lr1_name = 'lr1-' + self.id()
        lr1_fq_name = ['default-domain', 'default-project', lr1_name]
        self.lr1 = LogicalRouter(fq_name=lr1_fq_name,
                                 parent_type='project',
                                 logical_router_type='vxlan-routing',
                                 vxlan_network_identifier='3000')
        self.lr1.set_physical_router(self.pr1)
        self._vnc_lib.logical_router_create(self.lr1)

        lr2_name = 'lr2-' + self.id()
        lr2_fq_name = ['default-domain', 'default-project', lr2_name]
        self.lr2 = LogicalRouter(fq_name=lr2_fq_name,
                                 parent_type='project',
                                 logical_router_type='vxlan-routing',
                                 vxlan_network_identifier='4000')
        self.lr2.set_physical_router(self.pr2)
        self._vnc_lib.logical_router_create(self.lr2)

        fq_name = ['default-domain', 'default-project', 'vmi-' + self.id()]
        self.vmi = VirtualMachineInterface(fq_name=fq_name,
                                           parent_type='project')
        self.vmi.set_virtual_network(self.vn1)
        self._vnc_lib.virtual_machine_interface_create(self.vmi)

        self.lr1.add_virtual_machine_interface(self.vmi)
        self._vnc_lib.logical_router_update(self.lr1)

    def delete_all(self):
        self._vnc_lib.logical_router_delete(id=self.lr1.uuid)
        self._vnc_lib.logical_router_delete(id=self.lr2.uuid)

        self._vnc_lib.virtual_machine_interface_delete(id=self.vmi.uuid)

        self._vnc_lib.physical_interface_delete(id=self.pi1_0.uuid)
        self._vnc_lib.physical_interface_delete(id=self.pi1_1.uuid)
        self._vnc_lib.physical_interface_delete(id=self.pi2_0.uuid)
        self._vnc_lib.physical_interface_delete(id=self.pi2_1.uuid)

        self.delete_routers(None, self.pr1)
        self.wait_for_routers_delete(None, self.pr1.get_fq_name())
        self._vnc_lib.bgp_router_delete(id=self.bgp_router1.uuid)

        self.delete_routers(None, self.pr2)
        self.wait_for_routers_delete(None, self.pr2.get_fq_name())
        self._vnc_lib.bgp_router_delete(id=self.bgp_router2.uuid)

        self._vnc_lib.virtual_network_delete(id=self.vn1.uuid)
        self._vnc_lib.role_config_delete(id=self.rc1.uuid)
        self._vnc_lib.role_config_delete(id=self.rc2.uuid)
        self._vnc_lib.node_profile_delete(id=self.np1.uuid)
        self._vnc_lib.node_profile_delete(id=self.np2.uuid)
        self._vnc_lib.fabric_delete(id=self.fabric.uuid)
        self._vnc_lib.job_template_delete(id=self.jt.uuid)

        self.delete_role_definitions()
        self.delete_overlay_roles()
        self.delete_physical_roles()
        self.delete_features()
        self.wait_for_features_delete()

    def build_acl_rule(self, pmin, pmax, direction, proto, etype):
        rule = {}
        rule['port_min'] = pmin
        rule['port_max'] = pmax
        rule['direction'] = direction
        rule['ip_prefix'] = None
        rule['protocol'] = proto
        rule['ether_type'] = etype
        return rule
Ejemplo n.º 11
0
    def _load_init_data(self):
        """
        Load init data for job playbooks.

        This function loads init data from a data file specified by the
        argument '--fabric_ansible_dir' to the database. The data file
        must be in JSON format and follow the format below

        "my payload": {
            "object_type": "tag"
            "objects": [
                {
                    "fq_name": [
                        "fabric=management_ip"

                    ],
                    "name": "fabric=management_ip",
                    "tag_type_name": "fabric",
                    "tag_value": "management_ip"

                }

            ]

        }
        """
        try:
            json_data = self._load_json_data()
            if json_data is None:
                self._logger.error('Unable to load init data')
                return

            for item in json_data.get("data"):
                object_type = item.get("object_type")

                # Get the class name from object type
                cls_name = CamelCase(object_type)
                # Get the class object
                cls_ob = str_to_class(cls_name, resource_client.__name__)

                # saving the objects to the database
                for obj in item.get("objects"):
                    instance_obj = cls_ob.from_dict(**obj)

                    # create/update the object
                    fq_name = instance_obj.get_fq_name()
                    try:
                        uuid_id = self._vnc_api.fq_name_to_id(
                            object_type, fq_name)
                        if object_type == "tag":
                            continue
                        instance_obj.set_uuid(uuid_id)
                        # Update config json inside role-config object
                        if object_type == 'role-config':
                            role_config_obj = self._vnc_api.\
                                role_config_read(id=uuid_id)
                            cur_config_json = json.loads(
                                role_config_obj.get_role_config_config())
                            def_config_json = json.loads(
                                instance_obj.get_role_config_config())
                            def_config_json.update(cur_config_json)
                            instance_obj.set_role_config_config(
                                json.dumps(def_config_json))

                        if object_type != 'telemetry-profile' and \
                                object_type != 'sflow-profile' and \
                                object_type != 'device-functional-group':
                            self._vnc_api._object_update(
                                object_type, instance_obj)

                    except NoIdError:
                        self._vnc_api._object_create(object_type, instance_obj)

            for item in json_data.get("refs"):
                from_type = item.get("from_type")
                from_fq_name = item.get("from_fq_name")
                from_uuid = self._vnc_api.fq_name_to_id(
                    from_type, from_fq_name)

                to_type = item.get("to_type")
                to_fq_name = item.get("to_fq_name")
                to_uuid = self._vnc_api.fq_name_to_id(to_type, to_fq_name)

                self._vnc_api.ref_update(from_type, from_uuid, to_type,
                                         to_uuid, to_fq_name, 'ADD')
        except Exception as e:
            err_msg = 'error while loading init data: %s\n' % str(e)
            err_msg += detailed_traceback()
            self._logger.error(err_msg)

        # create VN and IPAM for IPV6 link-local addresses
        ipv6_link_local_nw = '_internal_vn_ipv6_link_local'
        self._create_ipv6_ll_ipam_and_vn(self._vnc_api, ipv6_link_local_nw)

        # - fetch list of all the physical routers
        # - check physical and overlay role associated with each PR
        # - create ref between physical_role and physical_router object,
        # if PR is assigned with a specific physical role
        # - create ref between overlay_roles and physical_router object,
        # if PR is assigned with specific overlay roles
        obj_list = self._vnc_api._objects_list('physical-router')
        pr_list = obj_list.get('physical-routers')
        for pr in pr_list or []:
            try:
                pr_obj = self._vnc_api.\
                    physical_router_read(id=pr.get('uuid'))
                physical_role = pr_obj.get_physical_router_role()
                overlay_roles = pr_obj.get_routing_bridging_roles()
                if overlay_roles is not None:
                    overlay_roles = overlay_roles.get_rb_roles()
                if physical_role:
                    try:
                        physical_role_uuid = self._vnc_api.\
                            fq_name_to_id('physical_role',
                                          ['default-global-system-config',
                                           physical_role])
                        if physical_role_uuid:
                            self._vnc_api.ref_update('physical-router',
                                                     pr.get('uuid'),
                                                     'physical-role',
                                                     physical_role_uuid, None,
                                                     'ADD')
                    except NoIdError:
                        pass
                if overlay_roles:
                    for overlay_role in overlay_roles or []:
                        try:
                            overlay_role_uuid = self._vnc_api.\
                                fq_name_to_id('overlay_role',
                                              ['default-global-system-config',
                                               overlay_role.lower()])
                            if overlay_role_uuid:
                                self._vnc_api.ref_update(
                                    'physical-router', pr.get('uuid'),
                                    'overlay-role', overlay_role_uuid, None,
                                    'ADD')
                        except NoIdError:
                            pass
            except NoIdError:
                pass

        # handle replacing master-LR as <fab_name>-master-LR here
        # as part of in-place cluster update. Copy the master-LR
        # and also its associated vns and their annotations here

        master_lr_obj = None
        try:
            master_lr_obj = self._vnc_api.logical_router_read(
                fq_name=['default-domain', 'default-project', 'master-LR'])
        except NoIdError:
            try:
                master_lr_obj = self._vnc_api.logical_router_read(
                    fq_name=['default-domain', 'admin', 'master-LR'])
            except NoIdError:
                pass

        if master_lr_obj:
            vmi_refs = master_lr_obj.get_virtual_machine_interface_refs() or []
            # get existing pr refs
            pr_refs = master_lr_obj.get_physical_router_refs() or []
            fabric_refs = master_lr_obj.get_fabric_refs() or []
            perms2 = master_lr_obj.get_perms2()
            fab_fq_name = None

            try:
                # This has to happen before creating fab-master-LR as
                # otherwise it will fail creation
                # of fab-master-lr with annotations having master-lr uuid
                # Now delete master-LR object
                # this will delete lr annotations from fabric in
                # corresponding VNs if they exist
                self._vnc_api.logical_router_delete(
                    id=master_lr_obj.get_uuid())

                # try to obtain the fabric refs either by fabric ref if one
                # is available or from pr_refs if available

                if pr_refs and not fabric_refs:
                    # this is assuming that even though there can be
                    # multiple pr refs, a LR cannot have more than
                    # one fabric refs. So a random pr chosen in the pr
                    # refs list will have the same fabric name as the other
                    # prs in the list
                    pr_ref = pr_refs[-1]
                    pr_obj = self._vnc_api.physical_router_read(id=pr_ref.get(
                        'uuid', self._vnc_api.fq_name_to_id(pr_ref.get('to'))))
                    fabric_refs = pr_obj.get_fabric_refs() or []

                if fabric_refs:
                    fabric_ref = fabric_refs[-1]
                    fab_fq_name = fabric_ref.get(
                        'to',
                        self._vnc_api.id_to_fq_name(fabric_ref.get('uuid')))

                # if fab_fq_name is not derivable or was not present, then
                # skip creating fab_name-master-LR as fabric information
                # is not available
                # if fab_fq_name is available, copy necessary refs from prev.
                # master LR, create new fab_name-master-LR and this will update
                # VN annotations accordingly.
                if fab_fq_name:
                    def_project = self._vnc_api.project_read(
                        ['default-domain', 'default-project'])
                    fab_name = fab_fq_name[-1]
                    lr_fq_name = [
                        'default-domain', 'default-project',
                        fab_name + '-master-LR'
                    ]
                    fab_master_lr_obj = LogicalRouter(
                        name=lr_fq_name[-1],
                        fq_name=lr_fq_name,
                        logical_router_gateway_external=False,
                        logical_router_type='vxlan-routing',
                        parent_obj=def_project)
                    perms2.set_global_access(PERMS_RWX)
                    fab_master_lr_obj.set_perms2(perms2)

                    fab_master_lr_obj.set_virtual_machine_interface_list(
                        vmi_refs)
                    fab_master_lr_obj.set_physical_router_list(pr_refs)
                    fab_master_lr_obj.set_fabric_list(fabric_refs)

                    self._vnc_api.logical_router_create(fab_master_lr_obj)
            except NoIdError:
                pass
            except Exception as exc:
                err_msg = "An exception occurred while attempting to " \
                          "create fabric master-LR: %s " % exc.message
                self._logger.warning(err_msg)

        # handle deleted job_templates as part of in-place cluster update
        to_be_del_jt_names = [
            'show_interfaces_template', 'show_config_interfaces_template',
            'show_interfaces_by_names_template'
        ]
        for jt_name in to_be_del_jt_names:
            try:
                self._vnc_api.job_template_delete(
                    fq_name=['default-global-system-config', jt_name])
            except NoIdError:
                pass
Ejemplo n.º 12
0
    def test_lr_v4_subnets(self):
        # Create Domain
        domain = Domain('my-lr-domain')
        self._vnc_lib.domain_create(domain)

        # Create Project
        project = Project('my-lr-proj', domain)
        self._vnc_lib.project_create(project)

        # Create NetworkIpam
        ipam = NetworkIpam('default-network-ipam', project, IpamType("dhcp"))
        self._vnc_lib.network_ipam_create(ipam)

        ipam = self._vnc_lib.network_ipam_read(
            ['my-lr-domain', 'my-lr-proj', 'default-network-ipam'])

        # Create subnets
        ipam_sn_v4_vn1 = IpamSubnetType(subnet=SubnetType('11.1.1.0', 24))
        ipam_sn_v6_vn1 = IpamSubnetType(subnet=SubnetType('fd11::', 120))
        ipam_sn_v4_vn2 = IpamSubnetType(subnet=SubnetType('11.1.2.0', 24))
        ipam_sn_v6_vn2 = IpamSubnetType(subnet=SubnetType('fd12::', 120))

        # Create VN my-vn-1
        vn1 = VirtualNetwork('my-vn-1', project)
        vn1.add_network_ipam(ipam,
                             VnSubnetsType([ipam_sn_v4_vn1, ipam_sn_v6_vn1]))
        self._vnc_lib.virtual_network_create(vn1)
        net_obj1 = self._vnc_lib.virtual_network_read(id=vn1.uuid)

        # Create VN my-vn-2
        vn2 = VirtualNetwork('my-vn-2', project)
        vn2.add_network_ipam(ipam,
                             VnSubnetsType([ipam_sn_v4_vn2, ipam_sn_v6_vn2]))
        self._vnc_lib.virtual_network_create(vn2)
        net_obj2 = self._vnc_lib.virtual_network_read(id=vn2.uuid)

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

        # Create a Virtual Machine Interface belonging to my-vn-1
        id_perms = IdPermsType(enable=True)
        port_obj1 = VirtualMachineInterface(str(uuid.uuid4()),
                                            parent_obj=project,
                                            id_perms=id_perms)
        port_obj1.uuid = port_obj1.name
        port_obj1.set_virtual_network(vn1)
        port_obj1.set_virtual_machine_interface_device_owner(
            'DEVICE_OWNER_ROUTER_INTF')
        # Assign gateway ip
        ipam_refs = net_obj1.get_network_ipam_refs()
        for ipam_ref in ipam_refs:
            subnets = ipam_ref['attr'].get_ipam_subnets()
            for subnet in subnets:
                cidr = '%s/%s' % (subnet.subnet.get_ip_prefix(),
                                  subnet.subnet.get_ip_prefix_len())
                if IPNetwork(cidr).version == 4:
                    gateway_ip = subnet.get_default_gateway()
        self._vnc_lib.virtual_machine_interface_create(port_obj1)

        # Create v4 Ip object
        ip_obj1 = InstanceIp(name=str(uuid.uuid4()),
                             instance_ip_address=gateway_ip,
                             instance_ip_family='v4')
        ip_obj1.uuid = ip_obj1.name
        ip_obj1.set_virtual_machine_interface(port_obj1)
        ip_obj1.set_virtual_network(net_obj1)
        ip_id1 = self._vnc_lib.instance_ip_create(ip_obj1)

        # Add Router Interface (test being subnet)
        lr.add_virtual_machine_interface(port_obj1)
        self._vnc_lib.logical_router_update(lr)

        # Create a Virtual Machine Interface belonging to my-vn-2
        port_obj2 = VirtualMachineInterface(str(uuid.uuid4()),
                                            parent_obj=project,
                                            id_perms=id_perms)
        port_obj2.uuid = port_obj2.name
        port_obj2.set_virtual_network(vn2)
        port_obj2.set_virtual_machine_interface_device_owner(
            'DEVICE_OWNER_ROUTER_INTF')
        # Assign gateway ip
        ipam_refs = net_obj2.get_network_ipam_refs()
        for ipam_ref in ipam_refs:
            subnets = ipam_ref['attr'].get_ipam_subnets()
            for subnet in subnets:
                cidr = '%s/%s' % (subnet.subnet.get_ip_prefix(),
                                  subnet.subnet.get_ip_prefix_len())
                if IPNetwork(cidr).version == 4:
                    gateway_ip = subnet.get_default_gateway()
        self._vnc_lib.virtual_machine_interface_create(port_obj2)

        # Create v4 Ip object
        ip_obj2 = InstanceIp(name=str(uuid.uuid4()),
                             instance_ip_address=gateway_ip,
                             instance_ip_family='v4')
        ip_obj2.uuid = ip_obj2.name
        ip_obj2.set_virtual_machine_interface(port_obj2)
        ip_obj2.set_virtual_network(net_obj2)
        ip_id2 = self._vnc_lib.instance_ip_create(ip_obj2)

        # Add Router Interface (test being subnet)
        lr.add_virtual_machine_interface(port_obj2)
        self._vnc_lib.logical_router_update(lr)

        # TODO: Schema transformer not integrated in the tests,
        #       hence route-target refs not set yet
        # Verify Route Target Creation
        rt_refs = lr.get_route_target_refs()
        for rt_ref in rt_refs or []:
            rt_obj = self._vnc_lib.route_target_read(id=rt_ref['uuid'])
            ri_refs = rt_obj.get_routing_instance_back_refs()
            for ri_ref in ri_refs:
                ri_obj = self.vnc_lib.routing_instance_read(id=ri_ref['uuid'])
                ri_name = ri_obj.get_display_name()
                if ri_name != 'my-vn-1' and ri_name != 'my-vn-2':
                    pass

        # cleanup
        self._vnc_lib.instance_ip_delete(id=ip_id1)
        self._vnc_lib.instance_ip_delete(id=ip_id2)
        self._vnc_lib.logical_router_delete(id=lr_uuid)
        self._vnc_lib.virtual_machine_interface_delete(id=port_obj1.uuid)
        self._vnc_lib.virtual_machine_interface_delete(id=port_obj2.uuid)
        self._vnc_lib.virtual_network_delete(id=vn1.uuid)
        self._vnc_lib.virtual_network_delete(id=vn2.uuid)
        self._vnc_lib.network_ipam_delete(id=ipam.uuid)
        self._vnc_lib.project_delete(id=project.uuid)
        self._vnc_lib.domain_delete(id=domain.uuid)
Ejemplo n.º 13
0
    def test_same_network_not_attached_to_lr(self):
        project = self._vnc_lib.project_read(
            ['default-domain', 'default-project'])
        ipam = self._vnc_lib.network_ipam_read(
            ['default-domain', 'default-project', 'default-network-ipam'])

        # Create subnets
        ipam_sn_v4_vn = IpamSubnetType(subnet=SubnetType('11.1.1.0', 24))

        # Create VN my-vn
        vn = VirtualNetwork('%s-vn' % self.id(), project)
        vn.add_network_ipam(ipam, VnSubnetsType([ipam_sn_v4_vn]))
        self._vnc_lib.virtual_network_create(vn)
        net_obj = self._vnc_lib.virtual_network_read(id=vn.uuid)

        # Create v4 Ip object
        ip_obj = InstanceIp(name=str(uuid.uuid4()), instance_ip_family='v4')
        ip_obj.uuid = ip_obj.name

        # Create Port
        port_obj = self.create_port(project, net_obj)

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

        # Add Router Interface
        lr.add_virtual_machine_interface(port_obj)
        self._vnc_lib.logical_router_update(lr)

        # set router_external
        net_obj.set_router_external(True)
        self._vnc_lib.virtual_network_update(net_obj)

        with ExpectedException(BadRequest):
            lr.add_virtual_network(net_obj)
            self._vnc_lib.logical_router_update(lr)
        lr.del_virtual_network(net_obj)

        lr.del_virtual_machine_interface(port_obj)
        self._vnc_lib.logical_router_update(lr)
        lr.add_virtual_network(net_obj)
        self._vnc_lib.logical_router_update(lr)

        # Create Port
        port_obj = self.create_port(project, net_obj)
        with ExpectedException(BadRequest):
            lr.add_virtual_machine_interface(port_obj)
            self._vnc_lib.logical_router_update(lr)
        self._vnc_lib.logical_router_delete(id=lr.uuid)
Ejemplo n.º 14
0
    def _create_fabric_master_LR(self,
                                 fab_fq_name,
                                 perms2,
                                 fabric_refs=None,
                                 fabric_obj=None,
                                 vmi_refs=None,
                                 pr_refs=None):

        def_project = self._vnc_api.project_read(
            ['default-domain', 'default-project'])
        fab_name = fab_fq_name[-1]
        lr_fq_name = [
            'default-domain', 'default-project', fab_name + '-master-LR'
        ]
        fab_master_lr_obj = LogicalRouter(
            name=lr_fq_name[-1],
            fq_name=lr_fq_name,
            logical_router_gateway_external=False,
            logical_router_type='vxlan-routing',
            parent_obj=def_project)
        perms2.set_global_access(PERMS_RWX)
        fab_master_lr_obj.set_perms2(perms2)

        if vmi_refs:
            fab_master_lr_obj.set_virtual_machine_interface_list(vmi_refs)
        if pr_refs:
            fab_master_lr_obj.set_physical_router_list(pr_refs)

        if fabric_refs:
            fab_master_lr_obj.set_fabric_list(fabric_refs)

        if fabric_obj:
            fab_master_lr_obj.set_fabric(fabric_obj)

        self._vnc_api.logical_router_create(fab_master_lr_obj)
Ejemplo n.º 15
0
    def setUp(self):
        def _carve_out_subnets(subnets, cidr):
            carved_subnets = []
            for subnet in subnets:
                slash_x_subnets = IPNetwork(subnet.get('cidr')).subnet(cidr)
                for slash_x_sn in slash_x_subnets:
                    carved_subnets.append({'cidr': str(slash_x_sn)})
            return carved_subnets
        # end _carve_out_subnets

        def _get_network_ipam(ipam_name, subnets, subnetting):
            def _new_subnet(cidr):
                split_cidr = cidr.split('/')
                return SubnetType(
                    ip_prefix=split_cidr[0],
                    ip_prefix_len=split_cidr[1])
            # end _new_subnet
            ipam = NetworkIpam(
                name=ipam_name,
                ipam_subnets=IpamSubnets([
                    IpamSubnetType(
                        subnet=_new_subnet(sn.get('cidr')),
                        default_gateway=sn.get('gateway'),
                        subnet_uuid=str(uuid.uuid1())
                    ) for sn in subnets if int(
                        sn.get('cidr').split('/')[-1]) < 31
                ]),
                ipam_subnet_method='flat-subnet',
                ipam_subnetting=subnetting
            )
            return ipam
        # end _add_network_ipam
        super(TestPnfPortTuple, self).setUp()
        logger.debug("setUp called")
        # Create Global objects
        default_gsc_name = 'default-global-system-config'
        gsc_obj = self.api.global_system_config_read(
            GlobalSystemConfig().fq_name)
        proj_obj = self.api.project_read(Project().fq_name)
        # Create PNF and spine Physical Router
        pnf_obj = PhysicalRouter('pnf-' + self.id(), gsc_obj)
        pnf_obj.set_physical_router_role('pnf')
        self.pnf_uuid = self.api.physical_router_create(pnf_obj)
        # Create spine Physical Router
        spine_obj = PhysicalRouter('spine-' + self.id(), gsc_obj)
        self.spine_uuid = self.api.physical_router_create(spine_obj)
        # Create left/right LR
        left_lr_name = 'left_lr-' + self.id()
        left_lr_obj = LogicalRouter(name=left_lr_name, parent_obj=proj_obj)
        left_lr_obj.add_physical_router(spine_obj)
        self.left_lr_uuid = self.api.logical_router_create(left_lr_obj)
        right_lr_name = 'right_lr-' + self.id()
        right_lr_obj = LogicalRouter(name=right_lr_name, parent_obj=proj_obj)
        right_lr_obj.add_physical_router(spine_obj)
        self.right_lr_uuid = self.api.logical_router_create(right_lr_obj)
        # create left, right PNF PI
        left_pnf_pi_obj = PhysicalInterface(
            'ge-0/0/1-' + self.id(), parent_obj=pnf_obj)
        right_pnf_pi_obj = PhysicalInterface(
            'ge-0/0/2-' + self.id(), parent_obj=pnf_obj)
        lo_pnf_pi_obj = PhysicalInterface('lo0', parent_obj=pnf_obj)
        self.left_pnf_pi_uuid = self.api.physical_interface_create(
            left_pnf_pi_obj)
        self.right_pnf_pi_uuid = self.api.physical_interface_create(
            right_pnf_pi_obj)
        self.lo_pnf_pi_uuid = self.api.physical_interface_create(lo_pnf_pi_obj)
        # create left, right spine PI
        left_spine_pi_obj = PhysicalInterface(
            'xe-0/0/1-' + self.id(), parent_obj=spine_obj)
        right_spine_pi_obj = PhysicalInterface(
            'xe-0/0/2-' + self.id(), parent_obj=spine_obj)
        self.left_spine_pi_uuid = self.api.physical_interface_create(
            left_spine_pi_obj)
        self.right_spine_pi_uuid = self.api.physical_interface_create(
            right_spine_pi_obj)
        # Create Service Appliance Set
        sas_obj = ServiceApplianceSet('sas-' + self.id(), gsc_obj)
        sas_obj.set_service_appliance_set_virtualization_type(
            'physical-device')
        self.sas_uuid = self.api.service_appliance_set_create(sas_obj)
        # Create Service template
        st_obj = ServiceTemplate(name='st-' + self.id())
        st_obj.set_service_appliance_set(sas_obj)
        svc_properties = ServiceTemplateType()
        svc_properties.set_service_virtualization_type('physical-device')
        if_type = ServiceTemplateInterfaceType()
        if_type.set_service_interface_type('left')
        svc_properties.add_interface_type(if_type)
        if_type = ServiceTemplateInterfaceType()
        if_type.set_service_interface_type('right')
        svc_properties.add_interface_type(if_type)
        st_obj.set_service_template_properties(svc_properties)
        self.st_uuid = self.api.service_template_create(st_obj)
        # Create Service Instance object
        si_fqn = ['default-domain', 'default-project', 'si-' + self.id()]
        si_obj = ServiceInstance(fq_name=si_fqn)
        si_obj.fq_name = si_fqn
        si_obj.add_service_template(st_obj)
        kvp_array = []
        kvp = KeyValuePair("left-svc-vlan", "100")
        kvp_array.append(kvp)
        kvp = KeyValuePair("right-svc-vlan", "101")
        kvp_array.append(kvp)
        kvp = KeyValuePair("left-svc-asns", "66000,66001")
        kvp_array.append(kvp)
        kvp = KeyValuePair("right-svc-asns", "66000,66002")
        kvp_array.append(kvp)
        kvps = KeyValuePairs()
        kvps.set_key_value_pair(kvp_array)
        si_obj.set_annotations(kvps)
        props = ServiceInstanceType()
        props.set_service_virtualization_type('physical-device')
        props.set_ha_mode("active-standby")
        si_obj.set_service_instance_properties(props)
        self.si_uuid = self.api.service_instance_create(si_obj)
        # Create service appliance
        sa_obj = ServiceAppliance('sa-' + self.id(), parent_obj=sas_obj)
        kvp_array = []
        kvp = KeyValuePair(
            "left-attachment-point",
            default_gsc_name +
            ':' +
            'spine-' +
            self.id() +
            ':' +
            'xe-0/0/1-' +
            self.id())
        kvp_array.append(kvp)
        kvp = KeyValuePair(
            "right-attachment-point",
            default_gsc_name +
            ':' +
            'spine-' +
            self.id() +
            ':' +
            'xe-0/0/2-' +
            self.id())
        kvp_array.append(kvp)
        kvps = KeyValuePairs()
        kvps.set_key_value_pair(kvp_array)
        sa_obj.set_service_appliance_properties(kvps)
        sa_obj.set_service_appliance_virtualization_type('physical-device')
        attr = ServiceApplianceInterfaceType(interface_type='left')
        sa_obj.add_physical_interface(left_pnf_pi_obj, attr)
        attr = ServiceApplianceInterfaceType(interface_type='right')
        sa_obj.add_physical_interface(right_pnf_pi_obj, attr)
        self.sa_uuid = self.api.service_appliance_create(sa_obj)
        # Create fabric and add it to spine and PNF
        fab_obj = Fabric('fab-' + self.id())
        self.fab_uuid = self.api.fabric_create(fab_obj)
        pnf_obj.add_fabric(fab_obj)
        self.api.physical_router_update(pnf_obj)
        spine_obj.add_fabric(fab_obj)
        self.api.physical_router_update(spine_obj)
        fab_obj = self.api.fabric_read(id=self.fab_uuid)
        # Create PNF service chain IPAM/network
        pnf_cidr = [{'cidr': "10.1.1.0/28"}]
        peer_subnets = _carve_out_subnets(pnf_cidr, 29)
        pnf_vn_obj = VirtualNetwork(
            name='fab-' + self.id() + '-pnf-servicechain-network',
            virtual_network_properties=VirtualNetworkType(
                forwarding_mode='l3'),
            address_allocation_mode='flat-subnet-only')
        self.pnf_vn_uuid = self.api.virtual_network_create(pnf_vn_obj)
        pnf_ipam_obj = _get_network_ipam(
            'fab-' +
            self.id() +
            '-pnf-servicechain-network-ipam',
            peer_subnets,
            True)
        self.pnf_ipam_uuid = self.api.network_ipam_create(pnf_ipam_obj)
        pnf_vn_obj.add_network_ipam(pnf_ipam_obj, VnSubnetsType([]))
        self.api.virtual_network_update(pnf_vn_obj)
        fab_obj = self.api.fabric_read(id=self.fab_uuid)
        fab_obj.add_virtual_network(
            pnf_vn_obj, FabricNetworkTag(
                network_type='pnf-servicechain'))
        self.api.fabric_update(fab_obj)
        # Create loopback IPAM/network
        lo_cidr = [{'cidr': "100.100.100.0/28"}]
        peer_subnets = _carve_out_subnets(lo_cidr, 28)
        lo_vn_obj = VirtualNetwork(
            name='fab-' + self.id() + '-loopback-network',
            virtual_network_properties=VirtualNetworkType(
                forwarding_mode='l3'),
            address_allocation_mode='flat-subnet-only')
        self.lo_vn_uuid = self.api.virtual_network_create(lo_vn_obj)
        lo_ipam_obj = _get_network_ipam(
            'fab-' +
            self.id() +
            '-loopback-network-ipam',
            peer_subnets,
            False)
        self.lo_ipam_uuid = self.api.network_ipam_create(lo_ipam_obj)
        lo_vn_obj.add_network_ipam(lo_ipam_obj, VnSubnetsType([]))
        self.api.virtual_network_update(lo_vn_obj)
        fab_obj = self.api.fabric_read(id=self.fab_uuid)
        fab_obj.add_virtual_network(
            lo_vn_obj, FabricNetworkTag(
                network_type='loopback'))
        self.api.fabric_update(fab_obj)
    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)