示例#1
0
    def get_subnet_by_netpart(self, netpart_id):
        nuagel2dom = nuagelib.NuageL2Domain({'net_partition_id': netpart_id})
        l2_doms = self.restproxy.get(nuagel2dom.get_all_resources_in_ent(),
                                     required=True)
        res = []
        for l2dom in l2_doms:
            np_dict = dict()
            np_dict['name'] = l2dom['name']
            np_dict['ID'] = l2dom['ID']
            np_dict['subnet_os_id'] = strip_cms_id(l2dom['externalID'])
            np_dict['dhcp_managed'] = l2dom['DHCPManaged']
            np_dict['IPType'] = l2dom['IPType']
            np_dict['ipv4_cidr'] = \
                str(netaddr.IPNetwork("{}/{}".format(l2dom['address'],
                                                     l2dom['netmask'])))\
                if l2dom.get('address') else ""
            np_dict['IPv6Address'] = l2dom['IPv6Address']
            np_dict['ipv4_gateway'] = \
                self.get_gw_from_dhcp_options(l2dom['ID'])
            np_dict['IPv6Gateway'] = l2dom['IPv6Gateway']
            np_dict['net_partition_id'] = netpart_id
            np_dict['enableDHCPv4'] = l2dom['enableDHCPv4']
            np_dict['enableDHCPv6'] = l2dom['enableDHCPv6']

            res.append(np_dict)
        return res
示例#2
0
    def get_subnet_by_netpart(self, netpart_id):
        nuagel2dom = nuagelib.NuageL2Domain({'net_partition_id': netpart_id})
        l2_doms = self.restproxy.get(nuagel2dom.get_all_resources_in_ent(),
                                     required=True)
        res = []
        for l2dom in l2_doms:
            # backend_l2domain for domain linked to shared infrastructure
            l2_backend_dom = l2dom
            shared_resource = l2dom['associatedSharedNetworkResourceID']
            if shared_resource:
                # find backend l2dom
                l2_backend_doms = self.restproxy.get(
                    nuagel2dom.get_resource(shared_resource), required=True)
                l2_backend_dom = l2_backend_doms[0]
            np_dict = dict()
            np_dict['name'] = l2dom['name']
            np_dict['ID'] = l2dom['ID']
            np_dict['net_partition_id'] = netpart_id
            np_dict['subnet_os_id'] = strip_cms_id(l2dom['externalID'])
            np_dict['dhcp_managed'] = l2_backend_dom['DHCPManaged']
            np_dict['IPType'] = l2_backend_dom['IPType']
            np_dict['ipv4_cidr'] = (str(
                netaddr.IPNetwork("{}/{}".format(l2_backend_dom['address'],
                                                 l2_backend_dom['netmask'])))
                                    if l2_backend_dom.get('address') else "")
            np_dict['IPv6Address'] = l2_backend_dom['IPv6Address']
            np_dict['ipv4_gateway'] = self.get_gw_from_dhcp_options(
                l2_backend_dom['ID'])
            np_dict['IPv6Gateway'] = l2_backend_dom['IPv6Gateway']
            np_dict['enableDHCPv4'] = l2_backend_dom['enableDHCPv4']
            np_dict['enableDHCPv6'] = l2_backend_dom['enableDHCPv6']

            res.append(np_dict)
        return res
    def get_gateway_vport(self, context, tenant_id, netpart_id,
                          nuage_vport_id):
        nuage_vport = gw_helper.get_nuage_vport(self.restproxy, nuage_vport_id)
        if not nuage_vport:
            # Just return empty list. Plugin will throw 404
            return []

        subnet_mapping = nuagedb.get_subnet_l2dom_by_nuage_id(
            context.session, nuage_vport['parentID'])

        if nuage_vport['VLANID']:
            nuage_gw_vport = self._get_gateway_vport(context, tenant_id,
                                                     netpart_id,
                                                     nuage_vport['VLANID'])
            nuage_gw_vport['vlanid'] = nuage_vport['VLANID']
            return nuage_gw_vport

        ret = dict()
        ret['subnet_id'] = strip_cms_id(subnet_mapping["subnet_id"])
        # gridinv - for VSD managed subnets external ID is empty,
        # se we have to compute subnet_id in plugin from nuage_subnet_id
        ret['nuage_subnet_id'] = subnet_mapping["nuage_subnet_id"]

        nuage_vport_type = nuage_vport['type']
        if nuage_vport_type == constants.BRIDGE_VPORT_TYPE:
            # Get the bridge interface on the vport
            nuage_br_intf = gw_helper.get_interface_by_vport(
                self.restproxy, nuage_vport_id, nuage_vport_type)

            if nuage_br_intf:
                ret['interface'] = nuage_br_intf['ID']
        elif nuage_vport_type == constants.HOST_VPORT_TYPE:
            # Get the host interface on the vport
            nuage_host_intf = gw_helper.get_interface_by_vport(
                self.restproxy, nuage_vport_id, nuage_vport_type)
            if nuage_host_intf:
                ret['interface'] = nuage_host_intf['ID']
                ret['port_id'] = strip_cms_id(nuage_host_intf['externalID'])

        ret['vport_type'] = nuage_vport_type
        ret['vport_name'] = nuage_vport['name']
        ret['vlanid'] = None
        return ret
示例#4
0
def make_subnet_dict(subnet):
    res = dict()
    res['subnet_id'] = subnet['ID']
    res['subnet_name'] = subnet['name']
    res['subnet_os_id'] = strip_cms_id(subnet['externalID'])
    res['subnet_shared_net_id'] = \
        subnet['associatedSharedNetworkResourceID']
    res['subnet_address'] = subnet['address']
    res['subnet_netmask'] = subnet['netmask']
    res['subnet_gateway'] = subnet['gateway']
    res['subnet_iptype'] = subnet['IPType']
    return res
示例#5
0
def get_nuage_domain_by_zoneid(restproxy_serv, zone_id):
    nuage_dom = get_nuage_zone_by_id(restproxy_serv, zone_id)
    req_params = {
        'domain_id': nuage_dom['nuage_parent_id']
    }
    nuage_l3domain = nuagelib.NuageL3Domain(create_params=req_params)
    l3domain = restproxy_serv.get(nuage_l3domain.get_resource(),
                                  required=True)[0]

    return {'nuage_domain_id': l3domain['ID'],
            'externalID': (strip_cms_id(l3domain['externalID'])
                           if l3domain['externalID'] else None)}
 def get_subnet_by_netpart(self, netpart_id):
     nuagel2dom = nuagelib.NuageL2Domain({'net_partition_id': netpart_id})
     response = self.restproxy.rest_call(
         'GET', nuagel2dom.get_all_resources_in_ent(), '')
     if not nuagel2dom.validate(response):
         raise restproxy.RESTProxyError(nuagel2dom.error_msg)
     res = []
     for l2dom in nuagel2dom.get_response_objlist(response):
         np_dict = dict()
         np_dict['domain_name'] = l2dom['name']
         np_dict['domain_id'] = l2dom['ID']
         np_dict['subnet_os_id'] = strip_cms_id(l2dom['externalID'])
         res.append(np_dict)
     return res
示例#7
0
def get_nuage_domain_by_zoneid(restproxy_serv, zone_id):
    nuage_dom = get_nuage_zone_by_id(restproxy_serv, zone_id)
    req_params = {'domain_id': nuage_dom['nuage_parent_id']}
    nuage_l3domain = nuagelib.NuageL3Domain(create_params=req_params)
    dom_resp = restproxy_serv.rest_call('GET', nuage_l3domain.get_resource(),
                                        '')

    if not nuage_l3domain.validate(dom_resp):
        raise restproxy.RESTProxyError(nuage_l3domain.error_msg)

    if len(dom_resp[3]) > 0:
        ret = {'nuage_domain_id': dom_resp[3][0]['ID'], 'externalID': None}
        if dom_resp[3][0]['externalID']:
            ret['externalID'] = strip_cms_id(dom_resp[3][0]['externalID'])

        return ret
示例#8
0
    def get_gateway_vport(self, context, tenant_id, netpart_id,
                          nuage_vport_id):
        nuage_vport = gw_helper.get_nuage_vport(self.restproxy,
                                                nuage_vport_id)
        if not nuage_vport:
            # Just return empty list. Plugin will throw 404
            return []

        nuage_subnet_id = nuage_vport['parentID']
        if nuage_vport['VLANID']:
            nuage_gw_vport = self._get_gateway_vport(context, tenant_id,
                                                     netpart_id,
                                                     nuage_vport['VLANID'])
            nuage_gw_vport['vlanid'] = nuage_vport['VLANID']
            return nuage_gw_vport

        ret = dict()
        ret['nuage_subnet_id'] = nuage_subnet_id

        nuage_vport_type = nuage_vport['type']
        if nuage_vport_type == constants.BRIDGE_VPORT_TYPE:
            # Get the bridge interface on the vport
            nuage_br_intf = gw_helper.get_interface_by_vport(
                self.restproxy,
                nuage_vport_id,
                nuage_vport_type)
            if nuage_br_intf:
                ret['interface'] = nuage_br_intf['ID']

        elif nuage_vport_type == constants.HOST_VPORT_TYPE:
            # Get the host interface on the vport
            nuage_host_intf = gw_helper.get_interface_by_vport(
                self.restproxy,
                nuage_vport_id,
                nuage_vport_type)
            if nuage_host_intf:
                ret['interface'] = nuage_host_intf['ID']
                ret['port_id'] = strip_cms_id(
                    nuage_host_intf['externalID'])

        ret['vport_type'] = nuage_vport_type
        ret['vport_name'] = nuage_vport['name']
        ret['vlanid'] = None
        return ret
    def get_gateway_vports(self, context, tenant_id, netpart_id, filters):
        subnet_id = filters['subnet'][0]
        nuage_subnet_id = filters['nuage_subnet_id'][0]
        # Get the nuage l2domain/subnet corresponding to neutron subnet
        # nuage_subnet_id passed in filters by plugin

        subnet_mapping = nuagedb.get_subnet_l2dom_by_nuage_id(
            context.session, nuage_subnet_id)

        if not subnet_mapping:
            msg = _("Nuage subnet for neutron subnet %(subn)s not found " %
                    {'subn': subnet_id})  # noqa H702
            raise restproxy.RESTProxyError(msg)

        if subnet_mapping['nuage_l2dom_tmplt_id']:
            subnet_type = constants.L2DOMAIN
        else:
            subnet_type = constants.SUBNET

        if 'id' in filters:
            # This is to get vport by id
            vport = gw_helper.get_nuage_vport(self.restproxy, filters['id'][0])
            # Return an empty list for neutronclient get_res_by_id_or_name()
            if not vport:
                return []

            if vport['parentID'] != subnet_mapping['nuage_subnet_id']:
                return []

            vport_list = [vport]
        elif 'name' in filters:
            # This is to get vport by name
            vport = gw_helper.get_nuage_vport_by_name(
                self.restproxy, subnet_mapping['nuage_subnet_id'],
                filters['name'][0], subnet_type)
            # Return an empty list for neutronclient get_res_by_id_or_name()
            if not vport:
                return []

            if vport['parentID'] != subnet_mapping['nuage_subnet_id']:
                return []

            vport_list = [vport]
        else:
            if subnet_type == constants.SUBNET:
                # Get all host/bridge vports
                vport_list = gw_helper.get_vports_for_subnet(
                    self.restproxy, subnet_mapping['nuage_subnet_id'])
            else:
                # Get all host/bridge vports
                vport_list = gw_helper.get_vports_for_l2domain(
                    self.restproxy, subnet_mapping['nuage_subnet_id'])

        resp_list = []
        for vport in vport_list:
            vport_type = vport['type']
            resp = dict()
            if vport_type in [
                    constants.HOST_VPORT_TYPE, constants.BRIDGE_VPORT_TYPE
            ]:
                resp['vport_id'] = vport['ID']
                resp['vport_type'] = vport_type
                resp['vport_name'] = vport['name']
                # Get the host/bridge interface
                nuage_interface = gw_helper.get_interface_by_vport(
                    self.restproxy, vport['ID'], vport_type)

                resp['port_id'] = None
                if nuage_interface:
                    resp['interface'] = nuage_interface['ID']
                    resp['port_id'] = strip_cms_id(
                        nuage_interface['externalID'])

                if vport_type == constants.HOST_VPORT_TYPE:
                    resp['subnet_id'] = subnet_id
                else:
                    resp['subnet_id'] = subnet_id

                if not vport['VLANID']:
                    # Skip this vport as it does not have any vlan.
                    # This should never happen as if vport is created a vlan
                    # is always associated with it
                    continue

                # Get the gw interface
                nuage_vlan = gw_helper.get_gateway_port_vlan(
                    self.restproxy, vport['VLANID'])

                resp['nuage_vlan_id'] = nuage_vlan['ID']
                resp['gateway'] = nuage_vlan['gatewayID']
                resp['gatewayport'] = nuage_vlan['parentID']
                resp['value'] = nuage_vlan['value']

                resp_list.append(resp)

        if tenant_id:
            updated_vport_list = []
            for vport in resp_list:
                ent_perm = gw_helper.get_ent_permission_on_vlan(
                    self.restproxy, vport['nuage_vlan_id'])
                if ent_perm:
                    vlan_perm = self._check_tenant_perm(
                        vport['nuage_vlan_id'], tenant_id,
                        ent_perm['permittedEntityID'])
                    if vlan_perm:
                        updated_vport_list.append(vport)
            return updated_vport_list

        return resp_list
示例#10
0
    def _get_gateway_vport(self, context, tenant_id, netpart_id,
                           nuage_vlan_id):
        # subnet is required to keep the o/p format consistent with
        # create_gateway_vport o/p
        ret = {
            'subnet_id': None,
            'interface': None,
            'vport_id': None,
            'vport_type': None,
            'vport_name': None,
            'port_id': None
        }

        # Get the gw interface
        try:
            nuage_vlan = gw_helper.get_gateway_port_vlan(
                self.restproxy, nuage_vlan_id)
        except Exception as e:
            if e.code == constants.RES_NOT_FOUND:
                return
            raise

        # Check for tenant permission
        # tenant_id is None in case of admin. We don't check permissions
        # for admin.netpart_id will be None when called from
        # delete_gateway_vport. We don't have to check permissions for
        # delete as client always calls get() before delete and we check
        # permissions during get()
        if tenant_id and netpart_id:
            ent_perm = gw_helper.get_ent_permission_on_vlan(
                self.restproxy, nuage_vlan['ID'])
            has_perm = self._check_tenant_perm(nuage_vlan_id, tenant_id,
                                               ent_perm['permittedEntityID'])
            if not has_perm:
                msg = _("Tenant %(ten)s does not have permission for vlan %("
                        "vlan)s" % {
                            'ten': tenant_id,  # noqa H702
                            'vlan': nuage_vlan_id
                        })
                LOG.warn(msg)
                raise restproxy.RESTProxyError(msg)

        ret['gateway'] = nuage_vlan['gatewayID']
        ret['gatewayport'] = nuage_vlan['parentID']
        ret['value'] = nuage_vlan['value']

        # Check if it is associated with a vport
        nuage_vport_id = nuage_vlan['vportID']
        if not nuage_vport_id:
            msg = _("Nuage gateway interface %s is not associated with any "
                    "vport" % nuage_vlan_id)  # noqa H702
            raise restproxy.RESTProxyError(msg)

        # Get the vport
        nuage_vport = gw_helper.get_nuage_vport(self.restproxy, nuage_vport_id)
        if nuage_vport:
            subnet_mapping = nuagedb.get_subnet_l2dom_by_nuage_id(
                context.session, nuage_vport['parentID'])
            ret['subnet_id'] = subnet_mapping["subnet_id"]
            ret['nuage_subnet_id'] = nuage_vport['parentID']
            nuage_vport_type = nuage_vport['type']
            if nuage_vport_type == constants.BRIDGE_VPORT_TYPE:
                # Get the bridge interface on the vport
                nuage_br_intf = gw_helper.get_interface_by_vport(
                    self.restproxy, nuage_vport_id, nuage_vport_type)

                if nuage_br_intf:
                    ret['interface'] = nuage_br_intf['ID']
            elif nuage_vport_type == constants.HOST_VPORT_TYPE:
                # Get the host interface on the vport
                nuage_host_intf = gw_helper.get_interface_by_vport(
                    self.restproxy, nuage_vport_id, nuage_vport_type)
                if nuage_host_intf:
                    ret['interface'] = nuage_host_intf['ID']
                    ret['port_id'] = strip_cms_id(
                        nuage_host_intf['externalID'])
            else:
                msg = _("Nuage vport associated with gateway interface %s is"
                        " not connected to a bridge/host interface" %
                        nuage_vlan_id)  # noqa H702
                raise restproxy.RESTProxyError(msg)

            ret['vport_id'] = nuage_vport_id
            ret['vport_type'] = nuage_vport_type
            ret['vport_name'] = nuage_vport['name']

        return ret
示例#11
0
    def create_subnet(self, ipv4_subnet, ipv6_subnet, params):
        subnet = ipv4_subnet or ipv6_subnet
        req_params = {
            'net_partition_id': params['netpart_id'],
            'name': helper.get_subnet_name(subnet)
        }
        ext_params = {
            'externalID': helper.get_subnet_external_id(subnet),
            'DHCPManaged': True,
            'dualStackDynamicIPAllocation': False
        }

        if ipv4_subnet:
            net = netaddr.IPNetwork(ipv4_subnet['cidr'])
            ext_params.update({
                'address': str(net.ip),
                'netmask': str(net.netmask),
                'gateway': params['dhcp_ip'],
                'IPType': constants.IPV4,
                'enableDHCPv4': ipv4_subnet['enable_dhcp']
            })
        elif ipv6_subnet:
            net = netaddr.IPNetwork(ipv6_subnet['cidr'])
            ext_params.update({
                'IPv6Address': str(net.cidr),
                'IPv6Gateway': params['dhcpv6_ip'],
                'IPType': constants.IPV6,
                'enableDHCPv6': ipv6_subnet['enable_dhcp']
            })
        if ipv4_subnet and ipv6_subnet:
            params.update({'network_id': subnet['network_id']})
            ext_params.update(
                helper.get_subnet_update_data(ipv4_subnet=ipv4_subnet,
                                              ipv6_subnet=ipv6_subnet,
                                              params=params))
        if not ext_params.get('description'):
            ext_params['description'] = helper.get_subnet_description(subnet)

        nuagel2domtmplt = nuagelib.NuageL2DomTemplate(create_params=req_params,
                                                      extra_params=ext_params)
        nuagel2domtemplate = self.restproxy.post(
            nuagel2domtmplt.post_resource(),
            nuagel2domtmplt.post_data(),
            on_res_exists=self.restproxy.retrieve_by_ext_id_and_cidr)[0]

        l2dom_tmplt_id = nuagel2domtemplate['ID']

        req_params['template'] = l2dom_tmplt_id
        req_params['externalID'] = ext_params['externalID']

        ext_params = {
            'address': ext_params.get('address'),
            'IPv6Address': ext_params.get('IPv6Address'),
            'description': ext_params['description'],
            'IPType': ext_params['IPType'],
            'ingressReplicationEnabled': params['ingressReplicationEnabled']
        }

        if (params.get('tunnelType') == constants.VSD_TUNNEL_TYPES['MPLS']):
            ext_params['l2EncapType'] = constants.VSD_TUNNEL_TYPES['MPLS']

        nuagel2domain = nuagelib.NuageL2Domain(create_params=req_params,
                                               extra_params=ext_params)
        try:
            l2domain = self.restproxy.post(
                nuagel2domain.post_resource(),
                nuagel2domain.post_data(),
                on_res_exists=self.restproxy.retrieve_by_ext_id_and_cidr)[0]
        except Exception:
            self.restproxy.delete(
                nuagel2domtmplt.delete_resource(nuagel2domtemplate['ID']))
            raise

        l2domain_id = l2domain['ID']
        subnet_dict = {
            'nuage_l2template_id': l2dom_tmplt_id,
            'nuage_l2domain_id': l2domain_id,
            'nuage_external_id': strip_cms_id(l2domain['externalID']),
            'nuage_parent_id': l2domain['parentID']
        }

        nuagedhcpoptions = dhcpoptions.NuageDhcpOptions(self.restproxy)
        if ipv4_subnet:
            nuagedhcpoptions.create_nuage_dhcp(
                ipv4_subnet,
                parent_id=l2domain_id,
                network_type=constants.NETWORK_TYPE_L2)
        if ipv6_subnet:
            nuagedhcpoptions.create_nuage_dhcp(
                ipv6_subnet,
                parent_id=l2domain_id,
                network_type=constants.NETWORK_TYPE_L2)

        nuage_userid, nuage_groupid = helper.create_usergroup(
            self.restproxy, params['tenant_id'], params['netpart_id'],
            params.get('tenant_name'))
        subnet_dict['nuage_userid'] = nuage_userid
        subnet_dict['nuage_groupid'] = nuage_groupid

        self._attach_nuage_group_to_l2domain(nuage_groupid, l2domain_id,
                                             params['netpart_id'],
                                             params.get('shared'),
                                             params['tenant_id'])
        self._create_nuage_def_l2domain_acl(
            l2domain_id, subnet, allow_non_ip=params['allow_non_ip'])
        self._create_nuage_def_l2domain_adv_fwd_template(l2domain_id, subnet)

        return subnet_dict
示例#12
0
    def create_l3domain(self, neutron_router, router, net_partition,
                        tenant_name):
        req_params = {
            'net_partition_id': net_partition['id'],
            'name': neutron_router['id'],
            'templateID': net_partition['l3dom_tmplt_id'],
            'externalID': get_vsd_external_id(neutron_router['id'])
        }
        if router.get('nuage_router_template'):
            req_params['templateID'] = router['nuage_router_template']

        extra_params = {
            'description': neutron_router['name']
        }
        if 'rd' in router and router['rd']:
            extra_params['routeDistinguisher'] = router['rd']
        if 'rt' in router and router['rt']:
            extra_params['routeTarget'] = router['rt']
        if router.get('tunnel_type'):
            neutron_tunnel_type = router['tunnel_type']
            vsd_types = constants.VSD_TUNNEL_TYPES
            extra_params['tunnelType'] = vsd_types[neutron_tunnel_type]
        if 'ecmp_count' in router:
            extra_params['ECMPCount'] = router.get('ecmp_count')
        if ('nuage_backhaul_vnid' in router and
                router['nuage_backhaul_vnid']):
            extra_params['backHaulVNID'] = router['nuage_backhaul_vnid']
        if ('nuage_backhaul_rd' in router and
                router['nuage_backhaul_rd']):
            extra_params['backHaulRouteDistinguisher'] = (
                router['nuage_backhaul_rd'])
        if ('nuage_backhaul_rt' in router and
                router['nuage_backhaul_rt']):
            extra_params['backHaulRouteTarget'] = router['nuage_backhaul_rt']

        # PATEnabled & UnderlayEnabled
        pat_enabled, underlay_enabled = self._calculate_pat_and_underlay(
            router)
        extra_params['PATEnabled'] = pat_enabled
        extra_params['underlayEnabled'] = underlay_enabled

        router_dict = {}
        nuagel3domain, zone_list = self._create_domain(req_params,
                                                       extra_params)
        nuage_domain_id = nuagel3domain['ID']
        external_id = nuagel3domain['externalID']
        parent_id = nuagel3domain['parentID']
        router_dict['nuage_external_id'] = strip_cms_id(external_id)
        router_dict['nuage_parent_id'] = parent_id
        router_dict['nuage_domain_id'] = nuage_domain_id
        router_dict['nuage_template_id'] = nuagel3domain.get('templateID')
        router_dict['rt'] = nuagel3domain.get('routeTarget')
        router_dict['rd'] = nuagel3domain.get('routeDistinguisher')
        router_dict['ecmp_count'] = nuagel3domain.get('ECMPCount')
        router_dict['tunnel_type'] = nuagel3domain.get('tunnelType')
        router_dict['nuage_backhaul_vnid'] = nuagel3domain.get('backHaulVNID')
        router_dict['nuage_backhaul_rd'] = (
            nuagel3domain.get('backHaulRouteDistinguisher'))
        router_dict['nuage_backhaul_rt'] = (
            nuagel3domain.get('backHaulRouteTarget'))

        isolated_id = None
        shared_id = None

        if router.get('nuage_router_template'):
            for zone in zone_list:
                if (zone['name'] == TEMPLATE_ISOLATED_ZONE and
                        not zone['publicZone']):
                    isolated_id = zone['ID']
                elif (zone['name'] == TEMPLATE_SHARED_ZONE and
                      not zone['publicZone']):
                    shared_id = zone['ID']
                external_id_params = {
                    'zone_id': zone['ID']
                }
                external_id_zone = nuagelib.NuageZone(
                    create_params=external_id_params)
                helper.set_external_id_only(
                    self.restproxy,
                    resource=external_id_zone.get_resource(),
                    id=neutron_router['id'])
            if not isolated_id or not shared_id:
                msg = ("Mandatory zones %s or %s do not exist in VSD" % (
                    TEMPLATE_ISOLATED_ZONE, TEMPLATE_SHARED_ZONE))
                self.delete_l3domain(nuage_domain_id)
                raise restproxy.ResourceNotFoundException(msg)
            router_dict['nuage_def_zone_id'] = isolated_id
            router_dict['nuage_shared_zone_id'] = shared_id
            self._make_nuage_zone_shared(net_partition['id'], shared_id,
                                         neutron_router['tenant_id'])
        elif net_partition.get('isolated_zone', None):
            for zone in zone_list:
                if zone['name'] == net_partition['isolated_zone']:
                    isolated_id = zone['ID']
                if zone['name'] == net_partition['shared_zone']:
                    shared_id = zone['ID']
                external_id_params = {
                    'zone_id': zone['ID']
                }
                external_id_zone = nuagelib.NuageZone(
                    create_params=external_id_params)
                helper.set_external_id_only(
                    self.restproxy,
                    resource=external_id_zone.get_resource(),
                    id=neutron_router['id'])
            if not isolated_id or not shared_id:
                msg = "Default zones do not exist in VSD"
                self.delete_l3domain(nuage_domain_id)
                raise restproxy.ResourceNotFoundException(msg)

            router_dict['nuage_def_zone_id'] = isolated_id
            router_dict['nuage_shared_zone_id'] = shared_id
            # TODO(Ronak) - Handle exception here
            self._make_nuage_zone_shared(net_partition['id'], shared_id,
                                         neutron_router['tenant_id'])

        nuage_userid, nuage_groupid = \
            helper.create_usergroup(self.restproxy,
                                    neutron_router['tenant_id'],
                                    net_partition['id'],
                                    tenant_name)
        router_dict['nuage_userid'] = nuage_userid
        router_dict['nuage_groupid'] = nuage_groupid

        self._attach_nuage_group_to_zone(nuage_groupid,
                                         router_dict['nuage_def_zone_id'],
                                         neutron_router['tenant_id'])
        iacl_id, oacl_id = self._create_nuage_def_l3domain_acl(
            nuage_domain_id, neutron_router['id'])
        router_dict['iacl_id'] = iacl_id
        router_dict['oacl_id'] = oacl_id
        self._create_nuage_def_l3domain_adv_fwd_template(nuage_domain_id,
                                                         neutron_router['id'])
        return router_dict
    def create_subnet(self, os_subnet, params):
        net = netaddr.IPNetwork(os_subnet['cidr'])
        req_params = {
            'net_partition_id': params['netpart_id'],
            'name': os_subnet['id'],
        }
        ext_params = {
            "DHCPManaged": os_subnet['enable_dhcp'],
            "address": str(net.ip),
            "netmask": str(net.netmask),
            "gateway": params['dhcp_ip'],
            'externalID': get_vsd_external_id(os_subnet['id'])
        }
        nuagel2domtmplt = nuagelib.NuageL2DomTemplate(create_params=req_params,
                                                      extra_params=ext_params)
        nuagel2domtemplate = self.restproxy.post(
            nuagel2domtmplt.post_resource(),
            nuagel2domtmplt.post_data(),
            on_res_exists=self.restproxy.retrieve_by_name)[0]

        l2dom_tmplt_id = nuagel2domtemplate['ID']

        req_params = {
            'net_partition_id': params['netpart_id'],
            'name': os_subnet['id'],
            'template': l2dom_tmplt_id,
            'externalID': get_vsd_external_id(os_subnet['id'])
        }
        ext_params = {'description': os_subnet['name']}
        nuagel2domain = nuagelib.NuageL2Domain(create_params=req_params,
                                               extra_params=ext_params)
        try:
            l2domain = self.restproxy.post(nuagel2domain.post_resource(),
                                           nuagel2domain.post_data())[0]
        except Exception:
            self.restproxy.delete(
                nuagel2domtmplt.delete_resource(nuagel2domtemplate['ID']))
            raise

        l2domain_id = l2domain['ID']
        subnet_dict = {
            'nuage_l2template_id': l2dom_tmplt_id,
            'nuage_l2domain_id': l2domain_id,
            'nuage_external_id': strip_cms_id(l2domain['externalID']),
            'nuage_parent_id': l2domain['parentID']
        }

        nuagedhcpoptions = dhcpoptions.NuageDhcpOptions(self.restproxy)
        nuagedhcpoptions.create_nuage_dhcp(
            os_subnet,
            parent_id=l2domain_id,
            network_type=constants.NETWORK_TYPE_L2)

        nuage_userid, nuage_groupid = \
            helper.create_usergroup(self.restproxy,
                                    params['tenant_id'],
                                    params['netpart_id'])
        subnet_dict['nuage_userid'] = nuage_userid
        subnet_dict['nuage_groupid'] = nuage_groupid

        self._attach_nuage_group_to_l2domain(nuage_groupid, l2domain_id,
                                             params['netpart_id'],
                                             params.get('shared'),
                                             params['tenant_id'])
        self._create_nuage_def_l2domain_acl(l2domain_id, os_subnet['id'])
        self._create_nuage_def_l2domain_adv_fwd_template(
            l2domain_id, os_subnet['id'])

        pnet_binding = params.get('pnet_binding', None)
        if pnet_binding:
            pnet_params = {
                'pnet_binding': pnet_binding,
                'netpart_id': params['netpart_id'],
                'l2domain_id': l2domain_id,
                'neutron_subnet_id': os_subnet['id']
            }
            try:
                pnet_helper.process_provider_network(self.restproxy,
                                                     self.policygroups,
                                                     pnet_params)
            except Exception:
                self.delete_subnet(os_subnet['id'])
                raise

        return subnet_dict
示例#14
0
    def create_router(self, neutron_router, router, params):
        net_partition = params['net_partition']
        req_params = {
            'net_partition_id': net_partition['id'],
            'name': neutron_router['id'],
            'templateID': net_partition['l3dom_tmplt_id'],
            'externalID': get_vsd_external_id(neutron_router['id'])
        }
        if router['nuage_router_template']:
            req_params['templateID'] = router['nuage_router_template']

        extra_params = {'description': neutron_router['name']}
        if 'rd' in router.keys() and router['rd']:
            extra_params['routeDistinguisher'] = router['rd']
        if 'rt' in router.keys() and router['rt']:
            extra_params['routeTarget'] = router['rt']
        if router.get('tunnel_type'):
            neutron_tunnel_type = router['tunnel_type']
            vsd_types = constants.VSD_TUNNEL_TYPES
            extra_params['tunnelType'] = vsd_types[neutron_tunnel_type]
        if 'ecmp_count' in router:
            extra_params['ECMPCount'] = router.get('ecmp_count')
        if ('nuage_backhaul_vnid' in router.keys()
                and router['nuage_backhaul_vnid']):
            extra_params['backHaulVNID'] = router['nuage_backhaul_vnid']
        if ('nuage_backhaul_rd' in router.keys()
                and router['nuage_backhaul_rd']):
            extra_params['backHaulRouteDistinguisher'] = (
                router['nuage_backhaul_rd'])
        if ('nuage_backhaul_rt' in router.keys()
                and router['nuage_backhaul_rt']):
            extra_params['backHaulRouteTarget'] = router['nuage_backhaul_rt']

        # PATEnabled
        extra_params['PATEnabled'] = self._nuage_pat_enabled_or_disabled(
            router, params)
        extra_params['underlayEnabled'] = extra_params['PATEnabled']

        router_dict = {}
        nuagel3domain = nuagelib.NuageL3Domain(create_params=req_params,
                                               extra_params=extra_params)

        response = self.restproxy.rest_call('POST',
                                            nuagel3domain.post_resource(),
                                            nuagel3domain.post_data())
        if not nuagel3domain.validate(response):
            if not nuagel3domain.resource_exists(response):
                code = nuagel3domain.get_error_code(response)
                raise restproxy.RESTProxyError(nuagel3domain.error_msg,
                                               error_code=code)
            response = self.restproxy.rest_call(
                'GET',
                nuagel3domain.get_resource_with_ext_id(),
                '',
                extra_headers=nuagel3domain.extra_headers_get())
            if not nuagel3domain.get_validate(response):
                raise restproxy.RESTProxyError(nuagel3domain.error_msg)

        nuage_domain_id = nuagel3domain.get_domainid(response)
        external_id = nuagel3domain.get_response_externalid(response)
        parent_id = nuagel3domain.get_response_parentid(response)
        router_dict['nuage_external_id'] = strip_cms_id(external_id)
        router_dict['nuage_parent_id'] = parent_id
        router_dict['nuage_domain_id'] = nuage_domain_id
        router_dict['rt'] = nuagel3domain.get_domain_rt(response)
        router_dict['rd'] = nuagel3domain.get_domain_rd(response)
        router_dict['ecmp_count'] = nuagel3domain.get_domain_ecmp_count(
            response)
        router_dict['tunnel_type'] = nuagel3domain.get_domain_tunnel_type(
            response)
        router_dict['nuage_backhaul_vnid'] = (
            nuagel3domain.get_domain_backhaul_vnid(response))
        router_dict['nuage_backhaul_rd'] = (
            nuagel3domain.get_domain_backhaul_rd(response))
        router_dict['nuage_backhaul_rt'] = (
            nuagel3domain.get_domain_backhaul_rt(response))

        req_params = {'domain_id': nuage_domain_id}
        nuage_zone = nuagelib.NuageZone(req_params)
        response = self.restproxy.rest_call('GET', nuage_zone.list_resource(),
                                            '')
        if not nuage_zone.validate(response):
            self.delete_router(nuage_domain_id)
            raise restproxy.RESTProxyError(nuage_zone.error_msg)

        isolated_id = None
        shared_id = None

        if router['nuage_router_template'] is not None:
            for zone in nuage_zone.zone_list(response):
                if (zone['name'] == TEMPLATE_ISOLATED_ZONE
                        and not zone['publicZone']):
                    isolated_id = zone['ID']
                elif (zone['name'] == TEMPLATE_SHARED_ZONE
                      and not zone['publicZone']):
                    shared_id = zone['ID']
                external_id_params = {'zone_id': zone['ID']}
                external_id_zone = nuagelib.NuageZone(
                    create_params=external_id_params)
                helper.set_external_id_only(
                    self.restproxy,
                    resource=external_id_zone.get_resource(),
                    id=neutron_router['id'])
            if not isolated_id or not shared_id:
                msg = ("Mandatory zones %s or %s do not exist in VSD" %
                       (TEMPLATE_ISOLATED_ZONE, TEMPLATE_SHARED_ZONE))
                self.delete_router(nuage_domain_id)
                raise restproxy.RESTProxyError(msg)
            router_dict['nuage_def_zone_id'] = isolated_id
            router_dict['nuage_shared_zone_id'] = shared_id
            self._make_nuage_zone_shared(net_partition['id'], shared_id,
                                         params['tenant_id'])
        elif net_partition.get('isolated_zone', None):
            for zone in nuage_zone.zone_list(response):
                if zone['name'] == net_partition['isolated_zone']:
                    isolated_id = zone['ID']
                if zone['name'] == net_partition['shared_zone']:
                    shared_id = zone['ID']
                external_id_params = {'zone_id': zone['ID']}
                external_id_zone = nuagelib.NuageZone(
                    create_params=external_id_params)
                helper.set_external_id_only(
                    self.restproxy,
                    resource=external_id_zone.get_resource(),
                    id=neutron_router['id'])
            if not isolated_id or not shared_id:
                msg = "Default zones do not exist in VSD"
                self.delete_router(nuage_domain_id)
                raise restproxy.RESTProxyError(msg)

            router_dict['nuage_def_zone_id'] = isolated_id
            router_dict['nuage_shared_zone_id'] = shared_id
            # TODO(Ronak) - Handle exception here
            self._make_nuage_zone_shared(net_partition['id'], shared_id,
                                         params['tenant_id'])
        # TODO(Divya) - the following else block seems redudant, see if can
        # be removed
        else:
            router_dict['nuage_def_zone_id'] = nuage_zone.get_isolated_zone_id(
                response)
            external_id_params = {'zone_id': router_dict['nuage_def_zone_id']}
            external_id_zone = nuagelib.NuageZone(
                create_params=external_id_params)
            helper.set_external_id_only(
                self.restproxy,
                resource=external_id_zone.get_resource(),
                id=neutron_router['id'])
            shared_id = nuage_zone.get_shared_zone_id(response)
            external_id_zone['zone_id'] = shared_id
            external_id_zone = nuagelib.NuageZone(
                create_params=external_id_params)
            helper.set_external_id_only(
                self.restproxy,
                resource=external_id_zone.get_resource(),
                id=neutron_router['id'])
            self._make_nuage_zone_shared(net_partition['id'], shared_id,
                                         params['tenant_id'])

        nuage_userid, nuage_groupid = \
            helper.create_usergroup(self.restproxy, params['tenant_id'],
                                    params['net_partition']['id'])
        router_dict['nuage_userid'] = nuage_userid
        router_dict['nuage_groupid'] = nuage_groupid

        self._attach_nuage_group_to_zone(nuage_groupid,
                                         router_dict['nuage_def_zone_id'],
                                         params['tenant_id'])
        iacl_id, oacl_id = self._create_nuage_def_l3domain_acl(
            nuage_domain_id, neutron_router['id'])
        router_dict['iacl_id'] = iacl_id
        router_dict['oacl_id'] = oacl_id
        self._create_nuage_def_l3domain_adv_fwd_template(
            nuage_domain_id, neutron_router['id'])
        return router_dict