Beispiel #1
0
def create_vrfs(delete=''):
    vrf_df = pd.read_excel("input-data/ACI_DD_Workbook.xlsx",
                           sheet_name='VRFs')
    file = open("VRF_Configuration.log", "w")
    logon = apic_logon()
    uniMo = logon.lookupByDn('uni')
    for index, row in vrf_df.iterrows():
        fvTenant = Tenant(uniMo, row['Tenant'])
        if delete == 'yes':
            fvCtx = Ctx(fvTenant, name=row['Name'], status='deleted')
        else:

            fvCtx = Ctx(fvTenant,
                        name=row['Name'],
                        pcEnfDir=row['Enforcement Direction'],
                        pcEndPref=row['Enforcement'],
                        description=row['Description'])
        cfgRequest = ConfigRequest()
        cfgRequest.addMo(fvCtx)
        logon.commit(cfgRequest)
        json_data = toJSONStr(fvCtx, prettyPrint=True)
        file.write(
            '\n-------------------------------------------------------------------\n'
        )
        file.write(json_data)
    file.close()
Beispiel #2
0
def create_private_network(parent_mo, private_network, **args):
    """Create a Private Network. The private layer 3 network context that belongs to a specific tenant or is shared."""
    args = args['optional_args'] if 'optional_args' in args.keys() else args

    fv_ctx = Ctx(parent_mo,
                 private_network,
                 pcEnfPref=get_value(args, 'enforcement_preference',
                                     DEFAULT_ENFORCEMENT_PREFERENCE))

    if is_valid_key(args, 'dns_label'):
        dns_lbl = Lbl(fv_ctx, args['dns_label'])

    if is_valid_key(args, 'bgp_timers'):
        fv_rsbgpctxpol = RsBgpCtxPol(fv_ctx,
                                     tnBgpCtxPolName=args['bgp_timers'])

    if is_valid_key(args, 'ospf_timers'):
        fv_rsospfctxpol = RsOspfCtxPol(fv_ctx,
                                       tnOspfCtxPolName=args['ospf_timers'])

    if is_valid_key(args, 'bgp_timers'):
        fv_rsctxmonpol = RsCtxMonPol(fv_ctx,
                                     tnMonEPGPolName=args['monitoring_policy'])

    return fv_ctx
Beispiel #3
0
def createVRF(md, tn, vrfname, desc):
    tenant = 'uni/tn-' + tn
    uniMo = md.lookupByDn(tenant)
    fvCtxMo = Ctx(uniMo, name=vrfname, descr=desc)

    cfgRequest = ConfigRequest()
    cfgRequest.addMo(fvCtxMo)
    md.commit(cfgRequest)
Beispiel #4
0
def add_private_l3_network(modir, tenant_name, private_l3_network):
    """Build a private L3 network"""

    # Query a tenant
    fv_tenant = modir.lookupByDn('uni/tn-' + tenant_name)

    # create a private network
    fv_ctx = Ctx(fv_tenant, private_l3_network)

    print_query_xml(fv_tenant)
    commit_change(modir, fv_tenant)
Beispiel #5
0
def create_vrf(logon_session,
               tenant_name="Example_TN",
               description="Description",
               vrf_name=''):

    from cobra.internal.codec.jsoncodec import toJSONStr
    from cobra.model.fv import Tenant, RsTenantMonPol, Ctx, RsOspfCtxPol
    from cobra.model.fv import RsCtxToExtRouteTagPol, RsBgpCtxPol, RsCtxToEpRet
    from cobra.model.fv import RsBgpCtxPol, RsVrfValidationPol
    from cobra.mit.request import ConfigRequest
    import cobra.model.pol
    import cobra.model.vns
    from cobra.model.vz import Any
    c = ConfigRequest()
    #apic_logon(apic_url, user, password)
    polUni = cobra.model.pol.Uni('')

    fvTenant = Tenant(polUni, tenant_name)

    fvCtx = Ctx(fvTenant,
                ownerKey=u'',
                name=vrf_name,
                descr=u'',
                knwMcastAct=u'permit',
                pcEnfDir=u'ingress',
                nameAlias=u'',
                ownerTag=u'',
                annotation=u'',
                pcEnfPref=u'enforced',
                bdEnforcedEnable=u'no')
    fvRsVrfValidationPol = RsVrfValidationPol(fvCtx,
                                              tnL3extVrfValidationPolName=u'',
                                              annotation=u'')
    vzAny = Any(fvCtx,
                matchT=u'AtleastOne',
                name=u'',
                descr=u'',
                prefGrMemb=u'disabled',
                nameAlias=u'',
                annotation=u'')
    fvRsOspfCtxPol = RsOspfCtxPol(fvCtx, annotation=u'', tnOspfCtxPolName=u'')
    fvRsCtxToEpRet = RsCtxToEpRet(fvCtx, annotation=u'', tnFvEpRetPolName=u'')
    fvRsCtxToExtRouteTagPol = RsCtxToExtRouteTagPol(fvCtx,
                                                    annotation=u'',
                                                    tnL3extRouteTagPolName=u'')
    fvRsBgpCtxPol = RsBgpCtxPol(fvCtx, tnBgpCtxPolName=u'', annotation=u'')

    ctx_data = toJSONStr(polUni)

    c.addMo(polUni)
    logon_session.commit(c)
    return ctx_data
Beispiel #6
0
def createBridgeDomain(tenant, epgSpec, apicMoDir):
    logging.debug('Inside createBridgeDomain function')
    gw = epgSpec['gw-cidr']

    netmask = gw.split('/')
    if len(netmask) != 2:
        return ['failed', 'invalid subnet']
    # Check if gw ip is correct
    bdIsL3 = True
    if netmask[0] == '':
        logging.info('Missing gateway in contiv network. Creating BD without Subnet (L2 only).')
        bdIsL3 = False
    
    bdName = epgSpec['nw-name']
    bdDn = formBDDn(tenant, bdName)

    logging.info('Creating BD %s under tenant %s' % (bdName, tenant))
    # Check if there is a VRF to tie the BD. If not, create one.
    tenMo = tenantDict[tenant]
    ctxMos = findTenantVrfContexts(tenant, apicMoDir)
    logging.debug('Fetched context mos:')
    logging.debug(ctxMos)
    if len(ctxMos) == 0:
        # No VRFs found. Need to create one.
        tenVrfName = formTenantVRFName(tenant)
        ctxMo = Ctx(tenMo, tenVrfName)
        cR = ConfigRequest()
        cR.addMo(ctxMo)
        apicMoDir.commit(cR)
    elif len(ctxMos) > 1:
        logging.error('Multi VRF scenario requires pre-created BDs')
        return ['failed', 'Multiple VRFs under tenant not supported yet']
    else:
        for ctxMo in ctxMos:
            tenVrfName = ctxMo.name

    fvBDMo = BD(tenMo, name=bdName)
    RsCtx(fvBDMo, tnFvCtxName=tenVrfName)
    if bdIsL3:
        # create subnet
        Subnet(fvBDMo, gw)
    cR = ConfigRequest()
    cR.addMo(fvBDMo)
    apicMoDir.commit(cR)
    if bdIsL3:
        subnetDict[gw] = fvBDMo
    logging.info('Created BD {}'.format(bdName))

    return ['success', 'ok']
Beispiel #7
0
def create_3tier_application(modir, tenant_name):
    policy_universe = modir.lookupByDn('uni')
    fv_tenant = Tenant(policy_universe, tenant_name)

    # create context
    fv_ctx = Ctx(fv_tenant, CTX_NAME)

    #
    fv_bd = BD(fv_tenant, 'BD1')

    #
    fv_rs_ctx = RsCtx(fv_bd)
    fv_rs_ctx.__setattr__('tnFvCtxName', 'Apple-Router')
    fv_subnet_10 = Subnet(fv_bd,'10.0.0.1/24', scope='public')
    fv_subnet_20 = Subnet(fv_bd, '20.0.0.1/24', scope='public')
    fv_subnet_30 = Subnet(fv_bd, '30.0.0.1/24', scope='public')
    fv_subnet_40 = Subnet(fv_bd, '40.0.0.1/24', scope='public')

    #
    fv_ap = Ap(fv_tenant, '3-TierApp')

    fv_aepg_client = AEPg(fv_ap, 'Client')
    fv_rs_bd_client = RsBd(fv_aepg_client, tnFvBDName='BD1')
#    fv_rs_bd_client.__setattr__('tnFvBDName', 'BD1')
    fv_rs_cons_webct_client = RsCons(fv_aepg_client, 'WebCt')

    fv_aepg_web = AEPg(fv_ap, 'Web')
    fv_rs_bd_web = RsBd(fv_aepg_web, tnFvBDName='BD1')
    fv_rs_cons_webct_web = RsProv(fv_aepg_web, 'WebCt')
    fv_rs_cons_appct_web = RsCons(fv_aepg_web, 'AppCt')

    fv_aepg_app = AEPg(fv_ap, 'App')
    fv_rs_bd_app = RsBd(fv_aepg_app, tnFvBDName='DB1')
    fv_rs_cons_webct_app = RsProv(fv_aepg_app, 'WebCt')
    fv_rs_cons_appct_app = RsCons(fv_aepg_app, 'AppCt')

    fv_aepg_db = AEPg(fv_ap, 'DB')
    fv_rs_bd_db = RsBd(fv_aepg_db, tnFvBDName='BD1')
    fv_rs_prov_db = RsProv(fv_aepg_db, 'DbCt')

    print toXMLStr(policy_universe, prettyPrint=True)
    # Commit the change using a ConfigRequest object
    configReq = ConfigRequest()
    configReq.addMo(policy_universe)
    modir.commit(configReq)
Beispiel #8
0
def setupTenant(spec, apicMoDir):
    logging.debug('Inside setupTenant function')
    tenant = spec['tenant']
    # Check if the APIC already knows about this tenant
    tenantDn = formTenantDn(tenant)
    exists, fvTenantMo = checkDnExists(apicMoDir, tenantDn)
    if exists:
        # The tenant already exists in the APIC. Stash what we got.
        logging.info('Tenant %s already exists.' % tenant)
        tenantDict[tenant] = fvTenantMo
    else:
        logging.info('Creating tenant %s' % tenant)
        uniMo = apicMoDir.lookupByDn('uni')
        fvTenantMo = Tenant(uniMo, tenant)
        # create a vrf for the tenant
        ctxMo = Ctx(fvTenantMo, tenant + '-Vrf')
        cR = ConfigRequest()
        cR.addMo(fvTenantMo)
        apicMoDir.commit(cR)
        tenantDict[tenant] = fvTenantMo

    return ['success', 'ok']
# CONNECT TO APIC
print('Initializing connection to APIC.\n**')
moDir = MoDirectory(LoginSession('https://apic', 'admin', 'cisco123'))
moDir.login()

# Get the top level Policy Universe Directory
uniMo = moDir.lookupByDn('uni')

print("Starting Tenant Creation.\n**")
for tenant in TENANT_INFO:
    print("Creating tenant %s.." % (tenant['name']))
    fvTenantMo = Tenant(uniMo, tenant['name'])

    # Create Private Network
    Ctx(fvTenantMo, tenant['ctx'])

    # Create Bridge Domain
    fvBDMo = BD(fvTenantMo, name=tenant['bd'])

    # Create association to private network
    RsCtx(fvBDMo, tnFvCtxName=tenant['ctx'])

    # Create Application Profile
    for app in tenant['ap']:
        print('Creating Application Profile: %s' % app['name'])
        fvApMo = Ap(fvTenantMo, app['name'])

        # Create EPGs
        for epg in app['epgs']:
Beispiel #10
0
def main(host, port, user, password):

    # CONNECT TO APIC
    print('Initializing connection to APIC...')
    apicUrl = 'http://%s:%d' % (host, port)
    moDir = MoDirectory(LoginSession(apicUrl, user, password))
    moDir.login()

    # Get the top level Policy Universe Directory
    uniMo = moDir.lookupByDn('uni')
    uniInfraMo = moDir.lookupByDn('uni/infra')

    # Create Vlan Namespace
    nsInfo = VMM_DOMAIN_INFO['namespace']
    print("Creating namespace %s.." % (nsInfo['name']))
    fvnsVlanInstPMo = VlanInstP(uniInfraMo, nsInfo['name'], 'dynamic')
    #fvnsArgs = {'from': nsInfo['from'], 'to': nsInfo['to']}
    EncapBlk(fvnsVlanInstPMo, nsInfo['from'], nsInfo['to'], name=nsInfo['name'])
    
    nsCfg = ConfigRequest()
    nsCfg.addMo(fvnsVlanInstPMo)
    moDir.commit(nsCfg)

    # Create VMM Domain
    print('Creating VMM domain...')

    vmmpVMwareProvPMo = moDir.lookupByDn('uni/vmmp-VMware')
    vmmDomPMo = DomP(vmmpVMwareProvPMo, VMM_DOMAIN_INFO['name'])
    
    vmmUsrMo = []
    for usrp in VMM_DOMAIN_INFO['usrs']:
        usrMo = UsrAccP(vmmDomPMo, usrp['name'], usr=usrp['usr'],
                        pwd=usrp['pwd'])
        vmmUsrMo.append(usrMo)

    # Create Controllers under domain
    for ctrlr in VMM_DOMAIN_INFO['ctrlrs']:
        vmmCtrlrMo = CtrlrP(vmmDomPMo, ctrlr['name'], scope=ctrlr['scope'],
                            hostOrIp=ctrlr['ip'])
        # Associate Ctrlr to UserP
        RsAcc(vmmCtrlrMo, tDn=vmmUsrMo[0].dn)
    
    # Associate Domain to Namespace
    RsVlanNs(vmmDomPMo, tDn=fvnsVlanInstPMo.dn)
   
    vmmCfg = ConfigRequest()
    vmmCfg.addMo(vmmDomPMo)
    moDir.commit(vmmCfg)
    print("VMM Domain Creation Completed.")

    print("Starting Tenant Creation..")
    for tenant in TENANT_INFO:
        print("Creating tenant %s.." % (tenant['name']))
        fvTenantMo = Tenant(uniMo, tenant['name'])
        
        # Create Private Network
        Ctx(fvTenantMo, tenant['pvn'])
        
        # Create Bridge Domain
        fvBDMo = BD(fvTenantMo, name=tenant['bd'])
        
        # Create association to private network
        RsCtx(fvBDMo, tnFvCtxName=tenant['pvn'])
        
        # Create Application Profile
        for app in tenant['ap']:
            print('Creating Application Profile: %s' % app['name'])
            fvApMo = Ap(fvTenantMo, app['name'])
            
            # Create EPGs 
            for epg in app['epgs']:
                
                print("Creating EPG: %s..." % (epg['name'])) 
                fvAEPgMo = AEPg(fvApMo, epg['name'])
                
                # Associate EPG to Bridge Domain 
                RsBd(fvAEPgMo, tnFvBDName=tenant['bd'])
                # Associate EPG to VMM Domain
                RsDomAtt(fvAEPgMo, vmmDomPMo.dn)

        # Commit each tenant seperately
        tenantCfg = ConfigRequest()
        tenantCfg.addMo(fvTenantMo)
        moDir.commit(tenantCfg)
    print('All done!')
Beispiel #11
0
def tenant_policy(host, user, password):
    print('[BEG] Tenant Configuration')
    moDir = apic_login(host, user, password)

    uniMo = moDir.lookupByDn('uni')

    fvTenantMo = Tenant(uniMo, 'Cobra-Demo')

    print('--- Building VRF(s)')
    # Create Private Network
    vrf1 = Ctx(fvTenantMo, "DC_INSIDE")
    vrf2 = Ctx(fvTenantMo, "DC_OUTISDE")

    print('--- Building Bridge Domain(s)')
    # Create Bridge Domain & Subnets
    fvBDMo1 = BD(fvTenantMo, "SERVER_BD1")
    fvSubnet = Subnet(fvBDMo1,
                      name=u'Sub1',
                      ip=u'106.0.1.1/24',
                      preferred=u'no',
                      virtual=u'no')
    fvSubnet = Subnet(fvBDMo1,
                      name=u'Sub2',
                      ip=u'106.0.2.1/24',
                      preferred=u'no',
                      virtual=u'no')

    print('--- Adding Subnets to Bridge Domain(s)')
    # Create Bridge Domain & Subnets
    fvBDMo2 = BD(fvTenantMo, "SERVER_BD2")
    fvSubnet = Subnet(fvBDMo2,
                      name=u'Sub3',
                      ip=u'106.0.3.1/24',
                      preferred=u'no',
                      virtual=u'no',
                      scope=u'public')
    fvSubnet = Subnet(fvBDMo2,
                      name=u'Sub4',
                      ip=u'106.0.4.1/24',
                      preferred=u'no',
                      virtual=u'yes')
    fvSubnet = Subnet(fvBDMo2,
                      name=u'Sub5',
                      ip=u'106.0.5.1/24',
                      preferred=u'no',
                      virtual=u'no',
                      scope=u'public')

    print('--- Adding Bridge Domain(s) to VRF(s)')
    # Create association to private network
    fv1RsCtx = RsCtx(fvBDMo1, tnFvCtxName=vrf1.name)
    fv2RsCtx = RsCtx(fvBDMo2, tnFvCtxName=vrf1.name)

    print('--- Building Web Filter')
    # Build Web Filters
    vzFilter1 = Filter(fvTenantMo, name=u'Web-Filters')
    vzEntry = Entry(vzFilter1,
                    applyToFrag=u'no',
                    dToPort=u'https',
                    prot=u'tcp',
                    stateful=u'no',
                    etherT=u'ip',
                    dFromPort=u'https',
                    name=u'https')
    vzEntry2 = Entry(vzFilter1,
                     applyToFrag=u'no',
                     dToPort=u'https',
                     prot=u'tcp',
                     stateful=u'no',
                     etherT=u'ip',
                     dFromPort=u'https',
                     name=u'https')

    print('--- Building App Filter')
    # Build App Filters
    vzFilter2 = Filter(fvTenantMo, name=u'App-Filters')
    vzEntry = Entry(vzFilter2,
                    applyToFrag=u'no',
                    dToPort=u'8080',
                    prot=u'tcp',
                    stateful=u'no',
                    etherT=u'ip',
                    dFromPort=u'8080',
                    name=u'tcp8080')
    vzEntry2 = Entry(vzFilter2,
                     dToPort=u'8443',
                     prot=u'tcp',
                     stateful=u'no',
                     etherT=u'ip',
                     dFromPort=u'8443',
                     name=u'tcp8443')

    print('--- Creating Contract(s)')
    #Create Contracts
    httpContract = BrCP(fvTenantMo, 'WEB')
    vzSubjMo = Subj(httpContract, 'Web-Ports')
    RsSubjFiltAtt(vzSubjMo, tnVzFilterName=vzFilter1.name)
    RsSubjFiltAtt(vzSubjMo, tnVzFilterName='icmp')

    appContract = BrCP(fvTenantMo, 'APP')
    vzSubjMo = Subj(appContract, 'App-Ports')
    RsSubjFiltAtt(vzSubjMo, tnVzFilterName=vzFilter2.name)
    RsSubjFiltAtt(vzSubjMo, tnVzFilterName='icmp')

    dbContract = BrCP(fvTenantMo, 'DB')
    vzSubjMo = Subj(dbContract, 'DB-Ports')
    RsSubjFiltAtt(vzSubjMo, tnVzFilterName='icmp')

    print('--- Creating Application Profile')
    #Create Application Profile
    fvApMo = Ap(fvTenantMo, 'DemoAppProfile')

    print('--- Building EPG: App')
    #Build AEPg APP
    fvAEPg1 = AEPg(fvApMo, 'APP')
    fvAEPgBD1 = RsBd(fvAEPg1, tnFvBDName=fvBDMo1.name)
    #Attach Static AEPg to Interface
    fvRsPathAtt1 = RsPathAtt(fvAEPg1,
                             tDn=u'topology/pod-1/paths-101/pathep-[eth1/15]',
                             primaryEncap=u'unknown',
                             instrImedcy=u'lazy',
                             mode=u'regular',
                             encap=u'vlan-2005')

    AppProv1 = RsProv(fvAEPg1, tnVzBrCPName=appContract.name)
    AppCons1 = RsCons(fvAEPg1, tnVzBrCPName=dbContract.name)

    print('--- Building EPG: Web')
    #Build AEPg WEB
    fvAEPg2 = AEPg(fvApMo, 'WEB')
    fvAEPgBD1 = RsBd(fvAEPg2, tnFvBDName=fvBDMo2.name)
    #Attach Static AEPg to Interface
    fvRsPathAtt2 = RsPathAtt(fvAEPg2,
                             tDn=u'topology/pod-1/paths-101/pathep-[eth1/16]',
                             primaryEncap=u'unknown',
                             instrImedcy=u'lazy',
                             mode=u'regular',
                             encap=u'vlan-2006')

    WebProv1 = RsProv(fvAEPg2, tnVzBrCPName=httpContract.name)
    WebCons1 = RsCons(fvAEPg2, tnVzBrCPName=appContract.name)

    print('--- Building EPG: DB')
    #Build AEPg DB
    fvAEPg3 = AEPg(fvApMo, 'DB')
    print('	--- Attaching DB to Bridge Domain: ' + fvBDMo2.name)
    fvAEPgBD1 = RsBd(fvAEPg3, tnFvBDName=fvBDMo2.name)
    #Attach Static AEPg to Interface
    fvRsPathAtt3 = RsPathAtt(fvAEPg3,
                             tDn=u'topology/pod-1/paths-101/pathep-[eth1/17]',
                             primaryEncap=u'unknown',
                             instrImedcy=u'lazy',
                             mode=u'regular',
                             encap=u'vlan-2007')

    DbProv1 = RsProv(fvAEPg3, tnVzBrCPName=dbContract.name)

    print('--- Building L3 Out')
    # Configure L3 Out
    l3extOut = Out(fvTenantMo, name=u'L3Ext-Cobra', enforceRtctrl=u'export')
    l3extRsEctx = RsEctx(l3extOut, tnFvCtxName=vrf1.name)
    l3extLNodeP = LNodeP(l3extOut, name=u'Leaf102')
    l3extRsNodeL3OutAtt = RsNodeL3OutAtt(l3extLNodeP,
                                         rtrIdLoopBack=u'no',
                                         rtrId=u'10.10.15.250',
                                         tDn=u'topology/pod-1/node-102')
    l3extLIfP = LIfP(l3extLNodeP, name=u'port1-Cobra')
    ospfIfP = IfP(l3extLIfP, authKeyId=u'1')
    ospfRsIfPol = RsIfPol(ospfIfP, tnOspfIfPolName=u'OSPF-P2P')
    l3extRsPathL3OutAtt = RsPathL3OutAtt(
        l3extLIfP,
        addr=u'10.10.100.9/30',
        encapScope=u'local',
        mode=u'regular',
        ifInstT=u'l3-port',
        mtu=u'1500',
        tDn=u'topology/pod-1/paths-102/pathep-[eth1/1]')

    l3extInstP = l3ext.InstP(l3extOut, name=u'L3-OUT-EPG')
    fvRsCons = RsCons(l3extInstP, tnVzBrCPName=httpContract.name)
    l3extSubnet = L3Sub(l3extInstP, ip=u'0.0.0.0/0')
    ospfExtP = ExtP(l3extOut,
                    areaCtrl=u'redistribute,summary',
                    areaId=u'0.0.0.1',
                    areaType=u'regular',
                    areaCost=u'1')
    BDAttL3Out1 = RsBDToOut(fvBDMo2, tnL3extOutName=l3extOut.name)

    cfg_commit(moDir, fvTenantMo)
    print('[END] Tenant Configuration')
Beispiel #12
0
                                             timeout=180)
    md = MoDirectory(session)

    print "Trying to log in ..."
    md.login()
    print "Trying to log in ... successful"
    # Get the top level Policy Universe Directory
    uniMo = md.lookupByDn('uni')

    for tenant in tenants:
        print "Creating Tenant [{}]".format(tenant.getName())
        fvTenantMo = Tenant(uniMo, tenant.getName(), descr=tenant.getDesc())

        for vrf in tenant.getVrfs():
            print "Creating VRF [{}]".format(vrf.getName())
            Ctx(fvTenantMo, vrf.getName(), descr=vrf.getDesc())

            for bd in vrf.getBds():
                print "Creating BD [{}]".format(bd.getName())
                fvBDMo = BD(fvTenantMo, bd.getName(), descr=bd.getDesc())
                # Create association to VRF
                RsCtx(fvBDMo, tnFvCtxName=vrf.getName())

            for ap in vrf.getAppProfiles():
                print "Creating App Profile [{}]".format(ap.getName())
                fvApMo = Ap(fvTenantMo, ap.getName(), descr=ap.getDesc())

                for epg in ap.getEpgs():
                    print "Creating EPG [{}]".format(epg.getName())
                    fvAEPgMo = AEPg(fvApMo, epg.getName(), descr=epg.getDesc())
                    # Associate EPG to Bridge Domain