Exemple #1
0
 def _make_grp_id_list(self, params):
     nuage_grp_id_list = []
     if params['subn_tenant'] != params['tenant']:
         nuage_userid, nuage_groupid = helper.create_usergroup(
             self.restproxy, params['subn_tenant'], params['netpart_id'])
         nuage_grp_id_list.append(nuage_groupid)
     nuage_userid, nuage_groupid = helper.create_usergroup(
         self.restproxy, params['tenant'], params['netpart_id'])
     nuage_grp_id_list.append(nuage_groupid)
     return nuage_grp_id_list
    def _check_tenant_perm(self, vlan_id, user_tenant, netpart_id):
        req_params = {'vlan_id': vlan_id}
        # Check if the grp exists in VSD, if not create it
        nuage_user, nuage_group = helper.create_usergroup(
            self.restproxy, user_tenant, netpart_id)

        nuage_perm = nuagelib.NuagePermission(create_params=req_params)
        response = self.restproxy.rest_call('GET',
                                            nuage_perm.get_resource_by_vlan(),
                                            '')
        if not nuage_perm.validate(response):
            LOG.error("Permissions not available for vlan %s", vlan_id)
            return False

        if nuage_perm.check_response_exist(response):
            perm = nuage_perm.get_response_obj(response)
            if perm['permittedEntityID'] == nuage_group:
                LOG.debug(
                    "user tenant %(ten)s has permission on vlan "
                    "%(vlan)s", {
                        'ten': user_tenant,
                        'vlan': vlan_id
                    })
                return True

        return False
    def add_tenant_perm(self, vlan_id, user_tenant, netpart_id):
        req_params = {'vlan_id': vlan_id}
        # Check if the grp exists in VSD, if not create it
        nuage_user, nuage_group = helper.create_usergroup(
            self.restproxy, user_tenant, netpart_id)

        # Check if permission already exists
        perm = gw_helper.get_tenant_perm(self.restproxy, vlan_id)
        if perm:
            msg = _("Vlan %(vlan)s  already assigned to %(ten)s") % \
                {'vlan': vlan_id, 'ten': perm['permittedEntityName']}
            if perm['permittedEntityID'] != nuage_group:
                raise restproxy.RESTProxyError(msg)
            else:
                LOG.debug(msg)
                return

        nuage_perm = nuagelib.NuagePermission(create_params=req_params)
        data = nuage_perm.perm_update(nuage_group)
        data.update({'externalID': get_vsd_external_id(user_tenant)})
        response = self.restproxy.rest_call('POST',
                                            nuage_perm.get_resource_by_vlan(),
                                            data)
        if not nuage_perm.validate(response):
            raise restproxy.RESTProxyError(nuage_perm.error_msg)
    def remove_tenant_perm(self, vlan_id, user_tenant, netpart_id):
        nuage_user, nuage_group = helper.create_usergroup(
            self.restproxy, user_tenant, netpart_id)

        req_params = {'vlan_id': vlan_id}

        extra_params = {'entity_id': nuage_group}
        nuage_perm = nuagelib.NuagePermission(create_params=req_params,
                                              extra_params=extra_params)
        permissions = self.restproxy.get(nuage_perm.get_resource_by_vlan())

        for perm in permissions:
            if perm['permittedEntityID'] == nuage_group:
                LOG.debug("Removing %(grp)s permission from vlan %(vlan)s", {
                    'grp': user_tenant,
                    'vlan': vlan_id
                })
                req_params['perm_id'] = perm['ID']
                self.restproxy.delete(nuage_perm.get_resource_by_id() +
                                      '?responseChoice=1')

                # return the num of remaining groups
                return len(permissions) - 1

        msg = _("Vlan %(vlan)s is not assigned to tenant "
                "%(grp)s") % {
                    'grp': user_tenant,
                    'vlan': vlan_id
                }
        LOG.debug(msg)
        return len(permissions) - 1
    def _check_tenant_perm(self, vlan_id, user_tenant, netpart_id):
        req_params = {'vlan_id': vlan_id}
        # Check if the grp exists in VSD, if not create it
        nuage_user, nuage_group = helper.create_usergroup(
            self.restproxy, user_tenant, netpart_id)

        nuage_perm = nuagelib.NuagePermission(create_params=req_params)
        permissions = self.restproxy.get(nuage_perm.get_resource_by_vlan(),
                                         required=True)
        if not permissions:
            return False
        else:
            return permissions[0]['permittedEntityID'] == nuage_group
    def attach_nuage_group_to_nuagenet(self, tenant, nuage_npid,
                                       nuage_subnetid, shared):
        nuage_uid, nuage_gid = helper.create_usergroup(self.restproxy, tenant,
                                                       nuage_npid)
        nuagesubn = nuagelib.NuageSubnet()
        nuagegroup = nuagelib.NuageGroup()

        if shared:
            # Get the id for grp 'everybody'
            params = {'net_partition_id': nuage_npid}
            nuagegroup = nuagelib.NuageGroup(create_params=params)
            response = self.restproxy.rest_call(
                'GET', nuagegroup.list_resource(), '',
                nuagegroup.extra_headers_get_for_everybody())
            if not nuagegroup.validate(response):
                raise restproxy.RESTProxyError(nuagegroup.error_msg)
            nuage_all_groupid = nuagegroup.get_groupid(response)

        response = self.restproxy. \
            rest_call('GET', nuagesubn.get_resource(nuage_subnetid),
                      '')
        if not nuagesubn.validate(response):
            nuagel2dom = nuagelib.NuageL2Domain()
            response = self.restproxy. \
                rest_call('GET', nuagel2dom.get_resource(nuage_subnetid),
                          '')
            if not nuagel2dom.validate(response):
                raise restproxy.RESTProxyError(nuagel2dom.error_msg)
            if shared:
                self.create_permission(nuage_subnetid,
                                       nuage_all_groupid,
                                       tenant,
                                       perm_on='l2domains')
            else:
                self.create_permission(nuage_subnetid,
                                       nuage_gid,
                                       tenant,
                                       perm_on='l2domains')
            return nuage_uid, nuage_gid
        else:
            if shared:
                self.create_permission(nuagesubn.get_parentzone(response),
                                       nuage_all_groupid, tenant)
            else:
                self.create_permission(nuagesubn.get_parentzone(response),
                                       nuage_gid, tenant)
            return nuage_uid, nuage_gid
    def remove_tenant_perm(self, vlan_id, user_tenant, netpart_id):
        nuage_user, nuage_group = helper.create_usergroup(
            self.restproxy, user_tenant, netpart_id)

        req_params = {'vlan_id': vlan_id}

        extra_params = {'entity_id': nuage_group}
        nuage_perm = nuagelib.NuagePermission(create_params=req_params,
                                              extra_params=extra_params)
        response = self.restproxy.rest_call('GET',
                                            nuage_perm.get_resource_by_vlan(),
                                            '')
        if not nuage_perm.validate(response):
            raise restproxy.RESTProxyError(nuage_perm.error_msg)

        perm_list = nuage_perm.get_response_objlist(response)

        for perm in perm_list:
            if perm['permittedEntityID'] == nuage_group:
                LOG.debug("Removing %(grp)s permission from vlan %(vlan)s", {
                    'grp': user_tenant,
                    'vlan': vlan_id
                })
                req_params['perm_id'] = perm['ID']

                response = self.restproxy.rest_call(
                    'DELETE',
                    nuage_perm.get_resource_by_id() + '?responseChoice=1', '')
                if not nuage_perm.validate(response):
                    raise restproxy.RESTProxyError(nuage_perm.error_msg)

                # return the num of remaining groups
                return len(perm_list) - 1

        msg = _("Vlan %(vlan)s is not assigned to tenant "
                "%(grp)s") % {
                    'grp': user_tenant,
                    'vlan': vlan_id
                }
        LOG.debug(msg)
        return len(perm_list) - 1
    def attach_nuage_group_to_nuagenet(self, tenant, nuage_npid,
                                       nuage_subnetid, shared, tenant_name):
        nuage_uid, nuage_gid = helper.create_usergroup(self.restproxy, tenant,
                                                       nuage_npid, tenant_name)
        nuagesubn = nuagelib.NuageSubnet()

        if shared:
            # Get the id for grp 'everybody'
            params = {'net_partition_id': nuage_npid}
            nuagegroup = nuagelib.NuageGroup(create_params=params)
            groups = self.restproxy.get(
                nuagegroup.list_resource(),
                extra_headers=nuagegroup.extra_headers_get_for_everybody(),
                required=True)
            nuage_all_groupid = groups[0]['ID'] if groups else None
        try:
            subnet = self.restproxy.get(nuagesubn.get_resource(nuage_subnetid),
                                        required=True)[0]
        except restproxy.ResourceNotFoundException:
            nuagel2dom = nuagelib.NuageL2Domain()
            self.restproxy.get(nuagel2dom.get_resource(nuage_subnetid),
                               required=True)
            if shared:
                self.create_permission(nuage_subnetid,
                                       nuage_all_groupid,
                                       tenant,
                                       perm_on='l2domains')
            else:
                self.create_permission(nuage_subnetid,
                                       nuage_gid,
                                       tenant,
                                       perm_on='l2domains')
            return nuage_uid, nuage_gid
        else:
            if shared:
                self.create_permission(subnet['parentID'], nuage_all_groupid,
                                       tenant)
            else:
                self.create_permission(subnet['parentID'], nuage_gid, tenant)
            return nuage_uid, nuage_gid
    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
Exemple #10
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
Exemple #11
0
 def create_usergroup(self, tenant, net_partition_id):
     return helper.create_usergroup(self.restproxy, tenant,
                                    net_partition_id)
    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
    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