Cisco APIC REST API Configuration Guide
Cisco APIC REST API Configuration Guide
Americas Headquarters
Cisco Systems, Inc.
170 West Tasman Drive
San Jose, CA 95134-1706
USA
http://www.cisco.com
Tel: 408 526-4000
800 553-NETS (6387)
Fax: 408 527-0883
2016-2017 Cisco Systems, Inc. All rights reserved.
CONTENTS
PART III Part 3: Setting Up APIC and the Fabric Using the REST API 111
Configuring Intra-EPG Isolation for Cisco AVS Using the REST API 141
Microsegmentation 141
Using Microsegmentation with Network-based Attributes on Bare Metal 141
Configuring Microsegmentation with Cisco ACI Using the REST API 142
Configuring an IP-based Microsegmented EPG as a Shared Resource Using the REST
API 143
Configuring a Network-Based Microsegmented EPG in a Bare-Metal Environment
Using the REST API 143
Application Profiles 144
Three-Tier Application Deployment 144
Parameters to Create a Filter for http 145
Parameters to Create Filters for rmi and sql 146
Deploying an Application Profile Using the REST API 146
Contracts, Taboo Contracts, and Preferred Groups 148
Security Policy Enforcement 148
Contracts and Taboo Contracts 149
Contracts Contain Security Policy Specifications 149
Contracts 152
Configuring a Contract Using the REST API 153
Configuring a Taboo Contract Using the REST API 153
Contract Preferred Groups 154
About Contract Preferred Groups 154
Configuring Contract Preferred Groups Using the REST API 155
NTP 162
Time Synchronization and NTP 162
Configuring NTP Using the REST API 162
Tetration 163
Overview 163
Configuring Cisco Tetration Analytics Using the REST API 163
NetFlow 164
About NetFlow 164
Configuring a NetFlow Exporter Policy for VM Networking Using the REST API 164
Configuring NetFlow Infra Selectors Using the REST API 164
Configuring the NetFlow Tenant Hierarchy Using the REST API 165
Consuming a NetFlow Exporter Policy Under a VMM Domain Using the REST API 167
Configuring the NetFlow or Tetration Analytics Priority Using the REST API 167
ACL Contract Permit and Deny Logging 167
About ACL Contract Permit and Deny Logs 167
Enabling Taboo Contract Deny Logging Using the REST API 168
DOM Statistics 168
About Digital Optical Monitoring 168
Enabling Digital Optical Monitoring Using the REST API 168
Syslog 170
About Syslog 170
Configuring a Syslog Group and Destination Using the REST API 171
Creating a Syslog Source Using the REST API 171
Enabling Syslog to Display in NX-OS CLI Format, Using the REST API 171
Data Plane Policing 172
Overview 172
Configuring Data Plane Policing Using the REST API 173
Traffic Storm Control 175
About Traffic Storm Control 175
Configuring a Traffic Storm Control Policy Using the REST API 175
Creating OSPF External Routed Network for Management Tenant Using REST
API 272
EIGRP 273
Overview 273
Configuring EIGRP Using the REST API 274
Neighbor Discovery 276
Neighbor Discovery 276
Creating the Tenant, VRF, and Bridge Domain with IPv6 Neighbor Discovery Using the
REST API 277
Audience
This guide is intended primarily for data center administrators with responsibilities and expertise in one or
more of the following:
Virtual machine installation and administration
Server administration
Switch and network administration
Table 1: New Features and Changed Information in this Document for Cisco APIC 2.2(1n) Release
802.1Q Tunnels You can now configure 802.1Q 802.1Q Tunnels in Provisioning
tunnels to enable Layer 2 Networks
point-to-multi-point tunneling of
Ethernet frames in the fabric, with
Quality of Service (QoS) priority
settings.
APIC Cluster High Availability Support is added to operate the Managing Cluster High
APICs in a cluster in an Availability in Managing APIC
Active/Standby mode. In an APIC Clusters
cluster, the designated active
APICs share the load and the
designated standby APICs can act
as an replacement for any of the
APICs in an active cluster.
Contract Preferred Groups Support is added for contract Contract Preferred Groups in
preferred groups that enable greater Configuring Tenants
control of communication between
EPGs in a VRF. If most of the
EPGs in the VRF should have open
communication, but a few should
only have limited communication
with the other EPGs, you can
configure a combination of a
contract preferred group and
contracts with filters to control
communication precisely.
Dynamic Breakout Ports Support is added for connecting a Dynamic Breakout Ports in
40 Gigabit Ethernet (GE) leaf Provisioning Layer 2 Networks
switch port to 4-10GE capable
(downlink) devices (with Cisco
40-Gigabit to 4X10-Gigabit
breakout cables).
FCoE over FEX Ports You can now configure FCoE over Configuring FCoE over FEX Using
FEX ports. the REST API in Provisioning
Layer 2 Networks
Table 2: New Features and Changed Information in this Document for Cisco APIC 2.1(1h) release
Document Conventions
Command descriptions use the following conventions:
Convention Description
bold Bold text indicates the commands and keywords that you enter literally
as shown.
Italic Italic text indicates arguments for which the user supplies the values.
variable Indicates a variable for which you supply values, in context where italics
cannot be used.
Convention Description
string A nonquoted set of characters. Do not use quotation marks around the
string or the string will include the quotation marks.
Convention Description
screen font Terminal sessions and information the switch displays are in screen font.
boldface screen font Information you must enter is in boldface screen font.
italic screen font Arguments for which you supply values are in italic screen font.
Note Means reader take note. Notes contain helpful suggestions or references to material not covered in the
manual.
Caution Means reader be careful. In this situation, you might do something that could result in equipment damage
or loss of data.
Related Documentation
Cisco Application Centric Infrastructure (ACI) Documentation
The ACI documentation is available at the following URL: http://www.cisco.com/c/en/us/support/
cloud-systems-management/application-policy-infrastructure-controller-apic/
tsd-products-support-series-home.html.
Documentation Feedback
To provide technical feedback on this document, or to report an error or omission, please send your comments
to apic-docfeedback@cisco.com. We appreciate your feedback.
properties of that object are specified as attributes of that element. Containment is defined by creating child
elements.
For JSON, encoding requires definition of certain entities to reflect the tree-based hierarchy; however, the
definition is repeated at all levels of the tree, so it is fairly simple to implement after it is initially understood.
All objects are described as JSON dictionaries, in which the key is the name of the package and class.
The value is another nested dictionary with two keys: attribute and children.
The attribute key contains a further nested dictionary describing key-value pairs that define attributes
on the object.
The children key contains a list that defines all the child objects. The children in this list are dictionaries
containing any nested objects, which are defined as described here.
Authentication
REST API username- and password-based authentication uses a special subset of request Universal Resource
Identifiers (URIs), including aaaLogin, aaaLogout, and aaaRefresh as the DN targets of a POST operation.
Their payloads contain a simple XML or JSON payload containing the MO representation of an aaaUser
object with the attribute name and pwd defining the username and password: for example, <aaaUser
name='admin' pwd='password'/>. The response to the POST operation will contain an authentication token
as both a Set-Cookie header and an attribute to the aaaLogin object in the response named token, for which
the XPath is /imdata/aaaLogin/@token if the encoding is XML. Subsequent operations on the REST API
can use this token value as a cookie named APIC-cookie to authenticate future requests.
Subscription
The REST API supports the subscription to one or more MOs during your active API session. When any MO
is created, changed, or deleted because of a user- or system-initiated action, an event is generated. If the event
changes the data on any of the active subscribed queries, the APIC will send out a notification to the API
client that created the subscription.
updated. The models are managed by multiple data management engine (DME) processes that run in the
fabric. When a user or process initiates an administrative change to a fabric component (for example, when
you apply a profile to a switch), the DME first applies that change to the information model and then applies
the change to the actual managed endpoint. This approach is called a model-driven framework.
The following branch diagram of a leaf switch port starts at the top Root of the ACI fabric MIT and shows a
hierarchy that comprises a chassis with two line module slots, with a line module in slot 2.
|root (root)
|sys (sys)
|ch(sys/ch)
|lcslot-1(sys/ch/lcslot-1)
|lcslot-2(sys/ch/lcslot-2)
|lc(sys/ch/lcslot-2/lc)
|leafport-1(sys/ch/lcslot-2/lc/leafport-1)
Object Naming
You can identify a specific object by its distinguished name (DN) or by its relative name (RN).
Note You cannot rename an existing object. To simplify references to an object or group of objects, you can
assign an alias or a tag.
Distinguished Name
The DN enables you to unambiguously identify a specific target object. The DN consists of a series of RNs:
dn = {rn}/{rn}/{rn}/{rn}...
In this example, the DN provides a fully qualified path for fabport-1 from the top of the object tree to the
object. The DN specifies the exact managed object on which the API call is operating.
Relative Name
The RN identifies an object from its siblings within the context of its parent object. The DN contains a sequence
of RNs.
For example, this DN:
<dn = "sys/ch/lcslot-1/lc/fabport-1"/>
Read Operations
After the object payloads are properly encoded as XML or JSON, they can be used in create, read, update, or
delete operations on the REST API. The following diagram shows the syntax for a read operation from the
REST API.
Because the REST API is HTTP-based, defining the URI to access a certain resource type is important. The
first two sections of the request URI simply define the protocol and access details of the APIC. Next in the
request URI is the literal string /api, indicating that the API will be invoked. Generally, read operations are
for an object or class, as discussed earlier, so the next part of the URI specifies whether the operation will be
for an MO or class. The next component defines either the fully qualified domain name (DN) being queried
for object-based queries, or the package and class name for class-based queries. The final mandatory part of
the request URI is the encoding format: either .xml or .json. This is the only method by which the payload
format is defined. (The APIC ignores Content-Type and other headers.)
Write Operations
Both create and update operations in the REST API are implemented using the POST method, so that if an
object does not already exist, it will be created, and if it does already exist, it will be updated to reflect any
changes between its existing state and desired state.
Both create and update operations can contain complex object hierarchies, so that a complete tree can be
defined in a single command so long as all objects are within the same context root and are under the 1MB
limit for data payloads for the REST API. This limit is in place to guarantee performance and protect the
system under high loads.
The context root helps define a method by which the APIC distributes information to multiple controllers and
helps ensure consistency. For the most part, the configuration should be transparent to the user, though very
large configurations may need to be broken into smaller pieces if they result in a distributed transaction.
Create and update operations use the same syntax as read operations, except that they are always targeted at
an object level, because you cannot make changes to every object of a specific class (nor would you want to).
The create or update operation should target a specific managed object, so the literal string /mo indicates that
the DN of the managed object will be provided, followed next by the actual DN. Filter strings can be applied
to POST operations; if you want to retrieve the results of your POST operation in the response, for example,
you can pass the rsp-subtree=modified query string to indicate that you want the response to include any
objects that have been modified by your POST operation.
The payload of the POST operation will contain the XML or JSON encoded data representing the MO that
defines the Cisco API command body.
Filters
The REST API supports a wide range of flexible filters, useful for narrowing the scope of your search to allow
information to be located more quickly. The filters themselves are appended as query URI options, starting
with a question mark (?) and concatenated with an ampersand (&). Multiple conditions can be joined together
to form complex filters.
The following query filters are available:
When you send an API command, the APIC checks the command for conformance with the MIM schema. If
an API command violates the MIM schema, the APIC rejects the command and returns an error message. For
example, you can create an MO only if it is allowed in the path you have specified in the command URI and
only if you have the required privilege level for that object class. You can configure an MO's properties only
with valid data, and you cannot create properties.
When composing an API command to create an MO, you need only include enough information in the
command's URI and data structure to uniquely define the new MO. If you omit the configuration of a property
when creating the MO, the property is populated with a default value if the MIM specifies one, or it is left
blank.
When modifying a property of an MO, you need only specify the property to be modified and its new value.
Other properties will be left unchanged.
When you read an existing MO, any password property of the MO is read as blank for security reasons.
If you then write the MO back to APIC, the password property is written as blank.
Tip If you need to store an MO with its password information, use a configuration export
policy. To store a specific MO, specify the MO as the target distinguished name in the
policy.
This example shows a URI for an API operation that involves an MO of class fv:Tenant:
https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
URI Components
The components of the URI are as follows:
http:// or https://Specifies HTTP or HTTPS. By default, only HTTPS is enabled. HTTP or
HTTP-to-HTTPS redirection, if desired, must be explicitly enabled and configured, as described in
Configuring HTTP and HTTPS Using the GUI, on page 31. HTTP and HTTPS can coexist.
hostSpecifies the hostname or IP address of the APIC.
:portSpecifies the port number for communicating with the APIC. If your system uses standard port
numbers for HTTP (80) or HTTPS (443), you can omit this component.
/api/Specifies that the message is directed to the API.
mo | classSpecifies whether the target of the operation is an MO or an object class.
dnSpecifies the distinguished name (DN) of the targeted MO.
classNameSpecifies the name of the targeted class. This name is a concatenation of the package name
of the object queried and the name of the class queried in the context of the corresponding package.
For example, the class aaa:User results in a className of aaaUser in the URI.
json | xmlSpecifies whether the encoding format of the command or response HTML body is JSON
or XML.
?options(Optional) Specifies one or more filters, selectors, or modifiers to a query. Multiple option
statements are joined by an ampersand (&).
https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
Alternatively, in a POST operation, you can POST to /api/mo and provide the DN in the body of the message,
as in this example:
POST https://apic-ip-address/api/mo.xml
<fvTenant dn="uni/tn-ExampleCorp"/>
You can also provide only the name in the message body and POST to /api/mo and the remaining RN
components, as in this example:
POST https://apic-ip-address/api/mo/uni.xml
<fvTenant name="ExampleCorp"/>
GET https://apic-ip-address/api/mo/topology/pod-1/node-1/sys/ch/bslot/board/sensor-3.json
GET https://apic-ip-address/api/class/aaaUser.json
The API reference for a typical method lists its input parameters, if any, and its return values, if any. The
method is called with a structure containing the essential input parameters, and a successful response returns
a complete structure containing the return values.
The description for a hypothetical method config:Method might appear in the API reference as follows:
Method config:Method(
inParameter1,
inParameter2,
inParameter3,
outParameter1,
outParameter2
)
The parameters beginning with "in" represent the input parameters. The parameters beginning with "out"
represent values returned by the method. Parameters with no "in" or "out" prefix are input parameters.
A JSON structure to call the method resembles the following structure:
{
"configMethod":
{
"attributes":
{
"inParameter1":"value1",
"inParameter2":"value2",
"inParameter3":"value3"
}
}
}
<configMethod
inParameter1="value1"
inParameter2="value2"
inParameter3="value3"
/>
Note The parameters of some methods include a substructure, such as filter settings or configuration settings
for an MO. For specific information, see the method description in the Cisco APIC Management Information
Model Reference.
{
"zzzObject" : {
"attributes" : {
"property1" : "value1",
"property2" : "value2",
"property3" : "value3"
},
"children" :
[{
"zzzChild1" : {
"attributes" : {
"childProperty1" : "childValue1",
"childProperty2" : "childValue1"
},
"children" : []
}
}
]
}
}
<zzzObject
property1 = "value1",
property2 = "value2",
property3 = "value3">
<zzzChild1
childProperty1 = "childValue1",
childProperty2 = "childValue1">
</zzzChild1>
</zzzObject>
Note Not every object supports a tag. To determine whether an object is taggable, inspect the class of the object
in the Cisco APIC Management Information Model Reference. If the contained hierarchy of the object
class includes a tag instance (such as tag:AInst or a class that derives from tag:AInst), an object of that
class can be tagged.
Adding Tags
You can add one or more tags by using the following syntax in the URI of an API POST operation:
In this syntax, name is the name of a tag and dn is the distinguished name of the object to which the tag is
assigned.
This example shows how to assign the tags tenants and orgs to the tenant named ExampleCorp:
POST https://apic-ip-address/api/tag/mo/uni/tn-ExampleCorp.xml?add=tenants,orgs
Removing Tags
You can remove one or more tags by using the following syntax in the URI of an API POST operation:
This example shows how to remove the tag orgs from the tenant named ExampleCorp:
POST https://apic-ip-address/api/tag/mo/uni/tn-ExampleCorp.xml?remove=orgs
You can delete all instances of a tag by using the following syntax in the URI of an API DELETE operation:
/api//tag/name.{json| xml}
This example shows how to remove the tag orgs from all objects:
DELETE https://apic-ip-address/api/tag/orgs.xml
Adding an Alias
You can add an alias by using the following syntax in the URI of an API POST operation:
/api/alias/mo/dn.{json| xml}?set=name
In this syntax, name is the name of the alias and dn is the distinguished name of the object to which the alias
is assigned.
This example shows how to assign the alias tenant8 to the tenant named ExampleCorp:
POST https://apic-ip-address/api/alias/mo/uni/tn-ExampleCorp.xml?set=tenant8
Removing an Alias
You can remove an alias by using the following syntax in the URI of an API POST operation:
/api/alias/mo/dn.{json| xml}?clear=yes
This example shows how to remove any alias from the tenant named ExampleCorp:
POST https://apic-ip-address/api/alias/mo/uni/tn-ExampleCorp.xml?clear=yes
Additional Examples
Note In the examples in this section, the responses have been edited to remove attributes unrelated to tags.
This example shows how to find all tags assigned to the tenant named ExampleCorp:
GET https://apic-ip-address/api/tag/mo/uni/tn-ExampleCorp.xml
RESPONSE:
<imdata>
<tagInst
dn="uni/tn-ExampleCorp/tag-tenants"
name="tenants"
/>
<tagInst
dn="uni/tn-ExampleCorp/tag-orgs"
name="orgs"
/>
</imdata>
This example shows how to find all objects with the tag 'tenants':
GET https://apic-ip-address/api/tag/tenants.xml
RESPONSE:
<imdata>
<fvTenant
dn="uni/tn-ExampleCorp"
name="ExampleCorp"
/>
</imdata>
query-target-filter=[eq|ne](attribute,value)
You can create a more complex test by combining operators and conditions using parentheses and commas:
query-target-filter=[and|or]([eq|ne](attribute,value),[eq|ne](attribute,value),...)
Note A scoping filter can contain a maximum of 20 '(attribute,value)' filter expressions. If the limit is
exceeded, the API returns an error.
Operator Description
eq Equal to
ne Not equal to
Operator Description
lt Less than
gt Greater than
bw Between
or Logical OR
wcard Wildcard
Examples
This example returns all managed objects of class aaaUser whose last name is equal to "Washington":
GET https://apic-ip-address/api/class/aaaUser.json?
query-target-filter=eq(aaaUser.lastName,"Washington")
GET https://apic-ip-address/api/class/fvAEPg.xml?
query-target-filter=eq(fvAEPg.fabEncap,"vxlan-12780288")
This example shows all tenant objects with a current health score of less than 50:
GET https://apic-ip-address/api/class/fvTenant.json?
rsp-subtree-include=health,required
&
rsp-subtree-filter=lt(healthInst.cur,"50")
This example returns all endpoint groups and their faults under the tenant ExampleCorp:
GET https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml?
query-target=subtree
&
target-subtree-class=fvAEPg
&
rsp-subtree-include=faults
This example returns aaa:Domain objects whose names are not "infra" or "common":
GET https://apic-ip-address/api/class/aaaDomain.json?
query-target-filter=
and(ne(aaaDomain.name,"infra"),
ne(aaaDomain.name,"common"))
target-subtree-class=mo-class1[,mo-class2]...
This statement specifies which object classes are to be considered when the query-target option is used with
a scope other than self. You can specify multiple desired object types as a comma-separated list with no spaces.
To request subtree information, combine query-target=subtree with the target-subtree-class statement to
indicate the specific subtree as follows:
query-target=subtree&target-subtree-class=className
This example requests information about the running firmware. The information is contained in the
firmware:CtrlrRunning subtree (child) object of the APIC firmware status container
firmware:CtrlrFwStatusCont:
GET https://apic-ip-address/api/class/firmwareCtrlrFwStatusCont.json?
query-target=subtree&target-subtree-class=firmwareCtrlrRunning
query-target-filter=filter-expression
This statement specifies a logical filter to be applied to the response. This statement can be used by itself or
applied after the query-target statement.
rsp-subtree-class=mo-class
When child objects are to be returned, this statement specifies that only child objects of the specified object
class are included in the response.
rsp-subtree-filter=filter-expression
When child objects are to be returned, this statement specifies a logical filter to be applied to the child objects.
Note When an rsp-subtree-filter query statement includes a class.property operand, the specified class name
is used only to identify the property and its type. The returned results are not filtered by class, and may
include any child object that contains a property of the same name but belonging to a different class if
that object's property matches the query condition. To filter by class, you must use additional query filters.
rsp-subtree-include=category1[,category2...][option]
When child objects are to be returned, this statement specifies additional contained objects or options to be
included in the response. You can specify one or more of the following categories in a comma-separated list
with no spaces:
audit-logsResponse includes subtrees with the history of user modifications to managed objects.
event-logsResponse includes subtrees with event history information.
faultsResponse includes subtrees with currently active faults.
fault-recordsResponse includes subtrees with fault history information.
healthResponse includes subtrees with current health information.
health-recordsResponse includes subtrees with health history information.
relationsResponse includes relations-related subtree information.
statsResponse includes statistics-related subtree information.
tasksResponse includes task-related subtree information.
With any of the preceding categories, you can also specify one of the following options to further refine the
query results:
countResponse includes a count of matching subtrees but not the subtrees themselves.
no-scopedResponse includes only the requested subtree information. Other top-level information of
the target MO is not included in the response.
requiredResponse includes only the managed objects that have subtrees matching the specified
category.
For example, to include fault-related subtrees, specify faults in the list. To return only fault-related subtrees
and no other top-level MO information, specify faults,no-scoped in the list as shown in this example:
query-target=subtree&rsp-subtree-include=faults,no-scoped
Note Some types of child objects are not created until the parent object has been pushed to a fabric node (leaf).
Until such a parent object has been pushed to a fabric node, a query on the parent object using the
rsp-subtree-include filter might return no results. For example, a class query for fvAEPg that includes
the query option rsp-subtree-include=stats will return stats only for endpoint groups that have been
applied to a tenant and pushed to a fabric node.
Note If the managed object is not configurable or cannot be exported (backed up), the managed
object is not returned.
Related Topics
Composing Query Filter Expressions, on page 15
Example: Using the JSON API to Get Running Firmware, on page 27
https://URI?condition[&condition[&...]]
Operator Description
eq Equal to
ne Not equal to
lt Less than
gt Greater than
bw Between
or Logical OR
wcard Wildcard
Use the optional pipe delimiter ('|') to specify either ascending order (asc) or descending order (desc). If no
order is specified, the default is ascending order.
You can perform a multi-level sort by more than one property (for example, last name and first name), but
all properties must be of the same MO or they must be inherited from the same abstract class.
This example shows you how to sort users by last name, then by first name:
GET
https://apic-ip-address/api/class/aaaUser.json?order-by=aaaUser.lastName|asc,aaaUser.firstName|asc
page-size=number-of-objects-per-page
By adding the page operator in the query URI, you can specify a single group to be returned using the following
syntax. The pages start from number 0.
page=page-number
This example shows you how to specify 15 fault instances per page in descending order, returning only the
first page:
GET
https://apic-ip-address/api/class/faultInfo.json?order-by=faultInst.severity|desc&page=0&page-size=15
Note Every query, whether paged or not, generates a new set of results. When you perform a query that returns
only a single page, the query response includes a count of the total results, but the unsent pages are not
stored and cannot be retrieved by a subsequent query. A subsequent query generates a new set of results
and returns the page requested in that query.
Opening a WebSocket
The API subscription feature uses the WebSocket protocol (RFC 6455) to implement a two-way connection
with the API client through which the API can send unsolicited notification messages to the client. To establish
this notification channel, you must first open a WebSocket connection with the API. Only a single WebSocket
connection is needed to support multiple query subscriptions with multiple APIC instances. The WebSocket
connection is dependent on your API session connection, and closes when your API session ends.
The WebSocket connection is typically opened by a JavaScript method in an HTML5-compliant browser, as
in the following example:
In the URI, the %TOKEN% is the current API session token (cookie). This example shows the URI with a
token:
https://apic-ip-address/socketGkZl5NLRZJl5+jqChouaZ9CYjgE58W/pMccR+LeXmdO0obG9NB
Iwo1VBo7+YC1oiJL9mS6I9qh62BkX+Xddhe0JYrTmSG4JcKZ4t3bcP2Mxy3VBmgoJjwZ76ZOuf9V9AD6X
l83lyoR4bLBzqbSSU1R2NIgUotCGWjZt5JX6CJF0=
After the WebSocket connection is established, it is not necessary to resend the API session token when the
API session is refreshed.
Creating a Subscription
To create a subscription to a query, perform the query with the option ?subscription=yes. This example
creates a subscription to a query of the fv:Tenant class in the JSON format:
GET https://apic-ip-address/api/class/fvTenant.json?subscription=yes
The query response contains a subscription identifier, subscriptionId, that you can use to refresh the
subscription and to identify future notifications from this subscription.
{
"subscriptionId" : "72057611234574337",
"imdata" : [{
"fvTenant" : {
"attributes" : {
"instanceId" : "0:0",
"childAction" : "",
"dn" : "uni/tn-common",
"lcOwn" : "local",
"monPolDn" : "",
"name" : "common",
"replTs" : "never",
"status" : ""
}
}
}
]
}
Receiving Notifications
An event notification from the subscription delivers a data structure that contains the subscription ID and the
MO description. In this JSON example, a new user has been created with the name "sysadmin5":
{
"subscriptionId" : ["72057598349672454", "72057598349672456"],
"imdata" : [{
"aaaUser" : {
"attributes" : {
"accountStatus" : "active",
"childAction" : "",
"clearPwdHistory" : "no",
"descr" : "",
"dn" : "uni/userext/user-sysadmin5",
"email" : "",
"encPwd" : "TUxISkhH$VHyidGgBX0r7N/srt/YcMYTEn5248ommFhNFzZghvAU=",
"expiration" : "never",
"expires" : "no",
"firstName" : "",
"intId" : "none",
"lastName" : "",
"lcOwn" : "local",
"name" : "sysadmin5",
"phone" : "",
"pwd" : "",
"pwdLifeTime" : "no-password-expire",
"pwdSet" : "yes",
"replTs" : "2013-05-30T11:28:33.835",
"rn" : "",
"status" : "created"
}
}
}
]
}
Because multiple active subscriptions can exist for a query, a notification can contain multiple subscription
IDs as in the example shown.
GET https://apic-ip-address/api/subscriptionRefresh.json?id=72057611234574337
The API returns an empty response to the refresh message unless the subscription has expired.
Note The timeout period for a subscription is one minute. To prevent lost notifications, you must send a
subscription refresh message at least once every 60 seconds.
Example: Using the JSON API to Add a Leaf Port Selector Profile
This example shows how to add a leaf port selector profile.
As shown in the Cisco APIC Management Information Model Reference, this hierarchy of classes forms a
leaf port selector profile:
fabric:LePortP A leaf port profile is represented by a managed object (MO) of this class, which has
a distinguished name (DN) format of uni/fabric/leportp-[name], in which leportp-[name] is the
relative name (RN). The leaf port profile object is a template that can contain a leaf port selector as a
child object.
fabric:LFPortS A leaf port selector is represented by an MO of this class, which has a RN format
of lefabports-[name]-typ-[type]. The leaf port selector object can contain one or more ports
or ranges of ports as child objects.
fabric:PortBlk A leaf port or a range of leaf ports is represented by an MO of this class,
which has a RN format of portblk-[name].
The API command that creates the new leaf port selector profile MO can also create and configure the child
MOs.
This example creates a leaf port selector profile with the name "MyLPSelectorProf." The example profile
contains a selector named "MySelectorName" that selects leaf port 1 on leaf switch 1 and leaf ports 3 through
5 on leaf switch 1. To create and configure the new profile, send this HTTP POST message:
POST http://apic-ip-address/api/mo/uni/fabric/leportp-MyLPSelectorProf.json
{
"fabricLePortP" : {
"attributes" : {
"descr" : "Selects leaf ports 1/1 and 1/3-5"
},
"children" : [{
"fabricLFPortS" : {
"attributes" : {
"name" : "MySelectorName",
"type" : "range"
},
"children" : [{
"fabricPortBlk" : {
"attributes" : {
"fromCard" : "1",
"toCard" : "1",
"fromPort" : "1",
"toPort" : "1",
"name" : "block2"
}
}
}, {
"fabricPortBlk" : {
"attributes" : {
"fromCard" : "1",
"toCard" : "1",
"fromPort" : "3",
"toPort" : "5",
"name" : "block3"
}
}
}
]
}
}
]
}
}
{
"imdata" : [{
"fabricLePortP" : {
"attributes" : {
"instanceId" : "0:0",
"childAction" : "deleteNonPresent",
"descr" : "Select leaf ports 1/1 and 1/3-5",
"dn" : "uni/fabric/leportp-MyLPSelectorProf",
"lcOwn" : "local",
"name" : "MyLPSelectorProf",
"replTs" : "never",
"rn" : "",
"status" : "created"
},
"children" : [{
"fabricLFPortS" : {
"attributes" : {
"instanceId" : "0:0",
"childAction" : "deleteNonPresent",
"dn" : "",
"lcOwn" : "local",
"name" : "MySelectorName",
"replTs" : "never",
"rn" : "lefabports-MySelectorName-typ-range",
"status" : "created",
"type" : "range"
},
"children" : [{
"fabricPortBlk" : {
"attributes" : {
"instanceId" : "0:0",
"childAction" : "deleteNonPresent",
"dn" : "",
"fromCard" : "1",
"fromPort" : "3",
"lcOwn" : "local",
"name" : "block3",
"replTs" : "never",
"rn" : "portblk-block3",
"status" : "created",
"toCard" : "1",
"toPort" : "5"
}
}
}, {
"fabricPortBlk" : {
"attributes" : {
"instanceId" : "0:0",
"childAction" : "deleteNonPresent",
"dn" : "",
"fromCard" : "1",
"fromPort" : "1",
"lcOwn" : "local",
"name" : "block2",
"replTs" : "never",
"rn" : "portblk-block2",
"status" : "created",
"toCard" : "1",
"toPort" : "1"
}
}
}
]
}
}
]
}
}
]
}
To delete the new profile, send an HTTP POST message with a fabricLePortP attribute of "status":"deleted",
as in this example:
POST http://apic-ip-address/api/mo/uni/fabric/leportp-MyLPSelectorProf.json
{
"fabricLePortP" : {
"attributes" : {
"status" : "deleted"
}
}
}
DELETE http://apic-ip-address/api/mo/uni/fabric/leportp-MyLPSelectorProf.json
GET http://apic-ip-address/api/mo/topology/pod-1/node-1/sys/ch/bslot/board/sensor-3.json
{
"imdata" :
[{
"eqptSensor" : {
"attributes" : {
"instanceId" : "0:0",
"childAction" : "",
"dn" : "topology/pod-1/node-1/sys/ch/bslot/board/sensor-3",
"id" : "3",
"majorThresh" : "0",
"mfgTm" : "not-applicable",
"minorThresh" : "0",
"model" : "",
"monPolDn" : "",
"rev" : "0",
"ser" : "",
"status" : "",
"type" : "dimm",
"vendor" : "Cisco Systems, Inc."
}
}
}
]
}
GET http://apic-ip-address/api/class/firmware:CtrlrFwStatusCont.json?
query-target=subtree
&
target-subtree-class=firmwareCtrlrRunning
{
"imdata" : [{
"firmwareCtrlrRunning" : {
"attributes" : {
"instanceId" : "0:0",
"applId" : "3",
"childAction" : "",
"dn" : "Ctrlrfwstatuscont/ctrlrrunning-3",
"lcOwn" : "local",
"replTs" : "never",
"rn" : "",
"status" : "",
"ts" : "2012-12-31T16:00:00.000",
"type" : "ifc",
"version" : "1.1"
}
}
}, {
"firmwareCtrlrRunning" : {
"attributes" : {
"instanceId" : "0:0",
"applId" : "1",
"childAction" : "",
"dn" : "ctrlrfwstatuscont/ctrlrrunning-1",
"lcOwn" : "local",
"replTs" : "never",
"rn" : "",
"status" : "",
"ts" : "2012-12-31T16:00:00.000",
"type" : "ifc",
"version" : "1.1"
}
}
}, {
"firmwareCtrlrRunning" : {
"attributes" : {
"instanceId" : "0:0",
"applId" : "2",
"childAction" : "",
"dn" : "ctrlrfwstatuscont/ctrlrrunning-2",
"lcOwn" : "local",
"replTs" : "never",
"rn" : "",
"status" : "",
"ts" : "2012-12-31T16:00:00.000",
"type" : "ifc",
"version" : "1.1"
}
}
}
]
}
This response describes three running instances of APIC firmware version 1.1.
Example: Using the JSON API to Get Top Level System Elements
This example shows how to query the APIC to determine what system devices are present.
General information about the system elements (APICs, spines, and leafs) is contained in an object of class
top:System.
This example shows the API query message:
GET http://apic-ip-address/api/class/topSystem.json
{
"imdata" :
[{
"topSystem" : {
"attributes" : {
"instanceId" : "0:0",
"address" : "10.0.0.32",
"childAction" : "",
"currentTime" : "2013-06-14T04:13:05.584",
"currentTimeZone" : "",
"dn" : "topology/pod-1/node-17/sys",
"fabricId" : "0",
"id" : "17",
"inbMgmtAddr" : "0.0.0.0",
"lcOwn" : "local",
"mode" : "unspecified",
"name" : "leaf0",
"nodeId" : "0",
"oobMgmtAddr" : "0.0.0.0",
"podId" : "1",
"replTs" : "never",
"role" : "leaf",
"serial" : "FOX-270308",
"status" : "",
"systemUpTime" : "00:00:02:03"
}
}
}, {
"topSystem" : {
"attributes" : {
"instanceId" : "0:0",
"address" : "10.0.0.1",
"childAction" : "",
"currentTime" : "2013-06-14T04:13:29.301",
"currentTimeZone" : "PDT",
"dn" : "topology/pod-1/node-1/sys",
"fabricId" : "0",
"id" : "1",
"inbMgmtAddr" : "0.0.0.0",
"lcOwn" : "local",
"mode" : "unspecified",
"name" : "apic0",
"nodeId" : "0",
"oobMgmtAddr" : "0.0.0.0",
"podId" : "0",
"replTs" : "never",
"role" : "apic",
"serial" : "",
"status" : "",
"systemUpTime" : "00:00:02:26"
}
}
}
]
}
This response indicates that the system consists of one APIC (node-1) and one leaf (node-17).
Example: Using the XML API and OwnerTag to Add Audit Log Information to Actions
This example shows how to use the ownerTag or ownerKey property to add custom audit log information
when an object is created or modified.
All configurable objects contain the properties ownerTag and ownerKey, which are user-configurable string
properties. When any configurable object is created or modified by a user action, an audit log record object
(aaa:ModLR) is automatically created to contain information about the change to be reported in the audit
log. The audit log record object includes a list (the changeSet property) of the configured object's properties
that were changed by the action. In the command to create or modify the configurable object, you can add
your own specific tracking information, such as a job ticket number or the name of the person making the
change, to the ownerTag or ownerKey property of the configurable object. This tracking information will
then be included in the audit log record along with the details of the change.
Note The ownerTag information will appear in the log only when the ownerTag contents have been changed.
To include the same information in a subsequent configuration change, you can clear the ownerTag
contents before making the next configuration change. This condition applies also to the ownerKey
property.
In the following example, a domain reference is added to a tenant configuration. As part of the command, the
operator's name is entered as the ownerKey and a job number is entered as the ownerTag.
POST https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
In this case, two aaa:ModLR records are generated one for the fv:Tenant object and one for the
aaa:DomainRef object. Unless the ownerKey or ownerTag properties are unchanged from a previous
configuration, their new values will appear in the changeSet list of the aaa:ModLR records, and this
information will appear in the audit log record that reports this configuration change.
Procedure
Use an XML query, such as the following example, to get a list of endpoints with the IP and MAC address
for each one:
Example:
GET https://apic-ip-address/api/node/class/fvCEp.xml
XML Example: Get the Current List of Faults in the Fabric That Were Caused by a Failed Configuration
You can also use the fault Inst class with filters to limit the response to faults that were caused by a failed
configuration, with XML such as this example:
GET https://apic-ip-address/api/node/class/faultInst.xml?
query-target-filter=and(e(stultification,"config-failure"))
Procedure
By using a script or a browser-based REST client, you can send an API POST or GET message of the form:
https://apic-ip-address/api/api-message-url
Use the out-of-band management IP address that you configured during the initial setup.
Note Only https is enabled by default. By default, http and http-to-https redirection are disabled.
You must send an authentication message to initiate an API session. Use the administrator login
name and password that you configured during the initial setup.
body of the response message contains a JSON or XML structure that contains requested data, confirmation
of a requested action, or error information.
Note The root element of the response structure is imdata. This element is merely a container for the response;
it is not a class in the management information model (MIM).
Note For security, only HTTPS is enabled as the default mode for API communications. HTTP and
HTTP-to-HTTPS redirection can be enabled if desired, but are less secure. For simplicity, this document
refers to HTTP in descriptions of protocol components and interactions.
Request Methods
The API supports HTTP POST, GET, and DELETE request methods as follows:
An API command to create or update an MO, or to execute a method, is sent as an HTTP POST message.
An API query to read the properties and status of an MO, or to discover objects, is sent as an HTTP
GET message.
An API command to delete an MO is sent as either an HTTP POST or DELETE message. In most cases,
you can delete an MO by setting its status to deleted in a POST operation.
Note Although the DELETE method is supported, the HTTP header might show only these:
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content Type
The API supports either JSON or XML data structures in the HTML body of an API request or response. You
must specify the content type by terminating the URI pathname with a suffix of either .json or .xml to indicate
the format to be used. The HTTP Content-Type and Accept headers are ignored by the API.
Procedure
Configuring a Custom Certificate for Cisco ACI HTTPS Access Using the GUI
CAUTION: PERFORM THIS TASK ONLY DURING A MAINTENANCE WINDOW AS THERE IS A
POTENTIAL FOR DOWNTIME. The downtime affects access to the APIC cluster and switches from external
users or systems and not the APIC to switch connectivity. The NGINX process on the switches will also be
impacted but that will be only for external connectivity and not for the fabric data plane. Access to the APIC,
configuration, management, troubleshooting and such will be impacted. Expect a restart of all web servers in
the fabric during this operation.
Procedure
What to Do Next
You must remain aware of the expiration date of the certificate and take action before it expires. To preserve
the same key pair for the renewed certificate, you must preserve the CSR as it contains the public key that
pairs with the private key in the key ring. Before the certificate expires, the same CSR must be resubmitted.
Do not delete or create a new key ring as deleting the key ring will delete the private key stored internally on
the APIC.
You can call the authentication methods using this syntax, specifying either JSON or XML data structures:
This example shows a user login message that uses a JSON data structure:
POST https://apic-ip-address/api/aaaLogin.json
{
"aaaUser" : {
"attributes" : {
"name" : "georgewa",
"pwd" : "paSSword1"
}
}
}
This example shows part of the response upon a successful login, including the token and the refresh timeout
period:
RESPONSE:
{
"imdata" : [{
"aaaLogin" : {
"attributes" : {
"token" :
"GkZl5NLRZJl5+jqChouaZ9CYjgE58W/pMccR+LeXmdO0obG9NB
Iwo1VBo7+YC1oiJL9mS6I9qh62BkX+Xddhe0JYrTmSG4JcKZ4t3
bcP2Mxy3VBmgoJjwZ76ZOuf9V9AD6Xl83lyoR4bLBzqbSSU1R2N
IgUotCGWjZt5JX6CJF0=",
"refreshTimeoutSeconds" : "300",
"lastName" : "Washington",
"firstName" : "George"
},
"children" : [{
...
[TRUNCATED]
...
}
In the preceding example, the refreshTimeoutSeconds attribute indicates that the session timeout period is
300 seconds.
This example shows how to request a list of valid login domains:
GET https://apic-ip-address/api/aaaListDomains.json
RESPONSE:
{
"imdata": [{
"name": "ExampleRadius"
},
{
"name": "local",
"guiBanner": "San Jose Fabric"
}]
}
In the preceding example, the response data shows two possible login domains, 'ExampleRadius' and 'local.'
The following example shows a user login message for the ExampleRadius login domain:
POST https://apic-ip-address/api/aaaLogin.json
{
"aaaUser" : {
"attributes" : {
"name" : "apic:ExampleRadius\\georgewa",
"pwd" : "paSSword1"
}
}
}
To initiate a session that requires a challenge token, include the URI parameter statement
?gui-token-request=yes in your login message, as shown in this example:
POST https://192.0.20.123/api/aaaLogin.json?gui-token-request=yes
The response message body contains an attribute of the form "urlToken":"token", where token is a long
string of characters representing the challenge token. All subsequent messages to the API during this session
must include the challenge token, as shown in this example where it is sent as a 'challenge' URI parameter:
GET https://192.0.20.123/api/class/aaaUser.json?challenge=fa47e44df54562c24fef6601dc...
This example shows how the challenge token is sent as an 'APIC-challenge' field in the HTTP header:
GET //api/class/aaaUser.json
HTTP/1.1
Host: 192.0.20.123
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml,application/json
APIC-challenge: fa47e44df54562c24fef6601dcff72259299a077336aecfc5b012b036797ab0f
.
.
.
Logging In
You can log in to the APIC REST API by sending a valid username and password in a data structure to the
aaaLogin API method, as described in Authenticating and Maintaining an API Session, on page 34. Following
a successful login, you must periodically refresh the session.
The following examples show how to log in as an administrator, refresh the session during configuration, and
log out using XML and JSON.
Note At this time, the aaaLogout method returns a response but does not end a session. Your session ends after
a refresh timeout when you stop sending aaaRefresh messages.
Note Using these methods, you can change the credentials only for the account under which you are logged in.
The message body of each method contains the properties of the object to be modified. The properties are
shown in the Cisco APIC Management Information Model Reference.
This example, when sent by User1, changes the password for User1.
POST http://192.0.20.123/api/changeSelfPassword.json
{
"aaaChangePassword" : {
"attributes" : {
"userName" : "User1",
"oldPassword" : "p@$sw0rd",
"newPassword" : "dr0ws$@p"
}
}
}
{
"totalCount" : "0",
"imdata" : []
}
This example, when sent by User1, changes the SSH key for User1.
POST http://192.0.20.123/api/changeSelfSshKey.json
{
"aaaChangeSshKey" : {
"attributes" : {
"userName" : "User1",
"name" : "A",
"data" : "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuKxY5E4we6uCR2z== key@example.com"
}
}
}
This example, when sent by User1, changes the X.509 certificate for User1.
POST http://192.0.20.123/api/changeSelfX509Cert.json
{
"aaaChangeX509Cert" : {
"attributes" : {
"userName" : "User1",
"name" : "A",
"data" : "-----BEGIN CERTIFICATE-----\nMIIE2TCCA8GgAwIBAgIKamlnsw
[EXAMPLE TRUNCATED]
1BCIolblPFft6QKoSJFjB6thJksaE5/k3Npf\n-----END CERTIFICATE-----"
}
}
}
POST http://192.0.20.123/api/changeSelfSshKey.json
{
"aaaChangeSshKey" : {
"attributes" : {
"userName" : "User1",
"name" : "A",
"data" : ""
}
}
}
See the following figure for an example of how an administrator can use the MIM to research an object in the
MIT.
Procedure
Step 4 In the Filters toolbar of the API Inspector window, choose the types of API log messages to display.
The displayed messages are color-coded according to the selected message types. This table shows the available
message types:
Name Description
trace Displays trace messages.
debug Displays debug messages. This type includes most API commands and responses.
info Displays informational messages.
warn Displays warning messages.
error Displays error messages.
fatal Displays fatal messages.
all Checking this checkbox causes all other checkboxes to become checked. Unchecking any
other checkbox causes this checkbox to be unchecked.
Step 5 In the Search toolbar, you can search the displayed messages for an exact string or by a regular expression.
This table shows the search controls:
Name Description
Search In this text box, enter a string for a direct search or enter a regular expression for a regex
search. As you type, the first matched field in the log list is highlighted.
Reset Click this button to clear the contents of the Search text box.
Regex Check this checkbox to use the contents of the Search text box as a regular expression for
a search.
Match case Check this checkbox to make the search case sensitive.
Disable Check this checkbox to disable the search and clear the highlighting of search matches in
the log list.
Next Click this button to cause the log list to scroll to the next matched entry. This button
appears only when a search is active.
Previous Click this button to cause the log list to scroll to the previous matched entry. This button
appears only when a search is active.
Name Description
Filter Check this checkbox to hide nonmatched lines. This checkbox appears only when a search
is active.
Highlight all Check this checkbox to highlight all matched fields. This checkbox appears only when a
search is active.
Step 6 In the Options toolbar, you can arrange the displayed messages.
This table shows the available options:
Name Description
Log Check this checkbox to enable logging.
Wrap Check this checkbox to enable wrapping of lines to avoid horizontal scrolling of the log
list
Newest at the Check this checkbox to display log entries in reverse chronological order.
top
Scroll to latest Check this checkbox to scroll immediately to the latest log entry.
Clear Click this button to clear the log list.
Close Click this button to close the API Inspector.
Example
This example shows two debug messages in the API Inspector window:
Using a Browser
To test an API request, you can assemble an HTTP message, send it, and inspect the response using a browser
add-on utility. RESTful API clients, which are available as add-ons for most popular browsers, provide a
user-friendly interface for interacting with the API. Clients include the following:
For Firefox/MozillaPoster, RESTClient
For ChromeAdvanced REST client, Postman
Browser add-ons pass the session token as a cookie so that there is no need to include the token in the payload
data structure.
You must specify the name of your descriptor file and the URI of the API operation.
Note Make sure to include the "@" symbol before the descriptor filename.
This example creates a new tenant named ExampleCorp using the JSON data structure in the file
"newtenant.json":
Note When testing with cURL, you must log in to the API, store the authentication token, and include the token
in subsequent API operations.
Related Topics
Example: Using the JSON API to Add a User with cURL
Note Only the Firefox, Chrome, and Safari browsers are supported for Visore access.
Filter Area
The filter form is case sensitive. This area supports all simple APIC REST API query operations.
Name Description
Class or DN field Object class name or fully distinguished name of a managed object.
Property field The property of the managed object on which you want to filter the
results. If you leave the Property field empty, the search returns all
instances of the specific class.
Op drop-down list Operator for the values of the property on which you want to filter the
results. The following are valid operators:
== (equal to)
!= (not equal to)
< (less than)
> (greater than)
(less than or equal to)
(greater than or equal to)
between
wildcard
anybit
allbits
Val1 field The first value for the property on which you want to filter.
Results Area
You can bookmark any query results page in your browser to view the results again because the query is
encoded in the URL.
Note Many of the managed objects are only used internally and are not generally applicable to APIC REST
API program development.
Name Description
Pink background Separates individual managed object instances and displays the class
name of the object below it.
Blue or green background Indicates the property names of the managed object.
dn link When clicked, displays all managed objects with that dn.
Class name link When clicked, displays all managed objects of that class.
Left arrow When clicked, takes you to the parent object of the managed object.
Right arrow When clicked, takes you to the child objects of the managed object.
Question mark Links you to the XML API documentation for the managed object.
Accessing Visore
Procedure
Step 1 Open a supported browser and enter the URL of the APIC followed by /visore.html.
Example:
https://apic-ip-address/visore.html
Step 2 When prompted, log in using the same credentials you would use to log in to the APIC CLI or GUI user
interfaces.
You can use a read-only account.
Procedure
Step 4 (Optional) Click the Display URI of last query link to display the API call that executed the query.
Step 5 (Optional) Click the Display last response link to display the API response data structure from the query.
Step 6 (Optional) In the dn field of the MO description table, click the < and > icons to retrieve the parent and child
classes of the displayed MO.
Clicking > sends a query to the APIC for the children of the MO. Clicking < sends a query for the parent of
the MO.
Step 7 (Optional) In the dn field of the MO description table, click the additional icons to display statistics, faults,
or health information for the MO.
Note We recommend that you configure either in-band or out-of-band static management or in-band and
out-of-band dynamic management. Do not combine the two methods in your deployments.
IPv4 and IPv6 addresses are supported for in-band management access. IPv6 configurations are
supported using static configurations (for both in-band and out-of-band). IPv4 and IPv6 dual in-band
and out-of-band configurations are supported only through static configuration. For more information,
see the KB article,Configuring Static Management Access in Cisco APIC.
Using log directive on filters in management contracts is not supported. Setting the log directive will
cause zoning-rule deployment failure.
Procedure
Example:
POST
https://apic-ip-address/api/mo/uni.xml
Example:
POST
https://apic-ip-address/api/mo/uni.xml
Example:
POST
https://apic-ip-address/api/mo/uni.xml
<infraNodeP name="apicConnectedNodes">
<infraLeafS name="leafS" type="range">
<infraNodeBlk name="single0" from_="101" to_="102"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-apicConnectedPorts"/>
</infraNodeP>
<infraFuncP>
<infraAccPortGrp name="inband">
<infraRsAttEntP tDn="uni/infra/attentp-inband"/>
</infraAccPortGrp>
</infraFuncP>
<infraAttEntityP name="inband">
<infraRsDomP tDn="uni/phys-inband"/>
</infraAttEntityP>
</infraInfra>
</polUni>
Step 4 Configure an in-band bridge domain and endpoint group (EPG).
Example:
POST https://apic-ip-address/api/mo/uni.xml
<mgmtMgmtP name="default">
<!-- Configure the encap on which APICs will communicate on the
in-band network. -->
<mgmtInB name="default" encap="vlan-10">
<fvRsProv tnVzBrCPName="default"/>
</mgmtInB>
</mgmtMgmtP>
</fvTenant>
</polUni>
Step 5 Create an address pool.
Example:
POST
https://apic-ip-address/api/mo/uni.xml
Example:
POST
https://apic-ip-address/api/mo/uni.xml
Procedure
Example:
<?xml version="1.0" encoding="UTF-8"?>
<!-- api/policymgr/mo/uni.xml -->
<polUni>
<infraInfra>
<!-- Static VLAN range -->
<fvnsVlanInstP name="inband" allocMode="static">
<fvnsEncapBlk name="encap" from="vlan-10" to="vlan-11"/>
</fvnsVlanInstP>
</infraInfra>
</polUni>
Step 2 Create a physical domain.
Example:
<?xml version="1.0" encoding="UTF-8"?>
<!-- api/policymgr/mo/uni.xml -->
<polUni>
<physDomP name="inband">
<infraRsVlanNs tDn="uni/infra/vlanns-inband-static"/>
</physDomP>
</polUni>
Step 3 Create selectors for the in-band management.
Example:
<?xml version="1.0" encoding="UTF-8"?>
<!-- api/policymgr/mo/.xml -->
<polUni>
<infraInfra>
<infraNodeP name="vmmNodes">
<infraLeafS name="leafS" type="range">
<infraNodeBlk name="single0" from_="101" to_="101"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-vmmPorts"/>
</infraNodeP>
fromPort="40" toPort="40"/>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-inband" />
</infraHPortS>
</infraAccPortP>
<infraNodeP name="apicConnectedNodes">
<infraLeafS name="leafS" type="range">
<infraNodeBlk name="single0" from_="101" to_="102"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-apicConnectedPorts"/>
</infraNodeP>
<infraFuncP>
<infraAccPortGrp name="inband">
<infraRsAttEntP tDn="uni/infra/attentp-inband"/>
</infraAccPortGrp>
</infraFuncP>
<infraAttEntityP name="inband">
<infraRsDomP tDn="uni/phys-inband"/>
</infraAttEntityP>
</infraInfra>
</polUni>
Step 4 Configure an in-band bridge domain and endpoint group (EPG).
Example:
<?xml version="1.0" encoding="UTF-8"?>
<!-- api/policymgr/mo/.xml -->
<polUni>
<fvTenant name="mgmt">
<!-- Configure the in-band management gateway address on the
in-band BD. -->
<fvBD name="inb">
<fvSubnet ip="<subnet_ip_address>"/>
</fvBD>
<mgmtMgmtP name="default">
<!-- Configure the encap on which APICs will communicate on the
in-band network. -->
<mgmtInB name="default" encap="vlan-10">
<fvRsProv tnVzBrCPName="default"/>
</mgmtInB>
</mgmtMgmtP>
</fvTenant>
</polUni>
Step 5 Create static in-band management IP addresses and assign them to node IDs.
Example:
<polUni>
<fvTenant name="mgmt">
<mgmtMgmtP name="default">
<mgmtInB name="default">
<mgmtRsInBStNode tDn="topology/pod-1/node-101"
addr="<ip_address_1>"
gw="<gw_address>
v6Addr = <ip6_address_1>
v6Gw = <ip6_gw_address>"/>
<mgmtRsInBStNode tDn="topology/pod-1/node-102"
addr="<ip_address_2>"
gw="<gw_address>
v6Addr = <ip6_address_2>"
v6Gw = <ip6_gw_address>"/>
<mgmtRsInBStNode tDn="topology/pod-1/node-103"
addr="<ip_address_3>"
gw="<gw_address>
v6Addr = <ip6_address_3>"
v6Gw = <ip6_gw_address>"/>
<mgmtRsInBStNode tDn="topology/pod-1/node-104"
addr="<ip_address_4>"
gw="<gw_address>
v6Addr = <ip6_address_4>"
v6Gw = <ip6_gw_address>"/>
<mgmtRsInBStNode tDn="topology/pod-1/node-105"
addr="<ip_address_5>"
gw="<gw_address>
v6Addr = <ip6_address_5>"
v6Gw = <ip6_gw_address>"/>
</mgmtInB>
</mgmtMgmtP>
</fvTenant>
</polUni>
Procedure
Example:
POST https://apic-ip-address/api/mo/uni.xml
<polUni>
<fvTenant name="mgmt">
<!-- Contract -->
<vzOOBBrCP name="oob-default">
<vzSubj name="oob-default">
<vzRsSubjFiltAtt tnVzFilterName="default" />
</vzSubj>
</vzOOBBrCP>
</fvTenant>
</polUni>
Example:
POST https://apic-ip-address/api/mo/uni.xml
<polUni>
<fvTenant name="mgmt">
<mgmtMgmtP name="default">
<mgmtOoB name="default">
<mgmtRsOoBProv tnVzOOBBrCPName="oob-default" />
</mgmtOoB>
</mgmtMgmtP>
</fvTenant>
</polUni>
Example:
POST https://apic-ip-address/api/mo/uni.xml
<polUni>
<fvTenant name="mgmt">
<mgmtExtMgmtEntity name="default">
<mgmtInstP name="oob-mgmt-ext">
<mgmtRsOoBCons tnVzOOBBrCPName="oob-default" />
<!-- SUBNET from where switches are managed -->
<mgmtSubnet ip="10.0.0.0/8" />
</mgmtInstP>
</mgmtExtMgmtEntity>
</fvTenant>
</polUni>
Example:
POST https://apic-ip-address/api/mo/uni.xml
<polUni>
<fvTenant name="mgmt">
<fvnsAddrInst name="switchOoboobaddr" addr="172.23.48.1/21">
<fvnsUcastAddrBlk from="172.23.49.240" to="172.23.49.244"/>
</fvnsAddrInst>
</fvTenant>
</polUni>
Example:
POST https://apic-ip-address/api/mo/uni.xml
<polUni>
<infraInfra>
<infraFuncP>
<mgmtGrp name="switchOob">
<mgmtOoBZone name="default">
<mgmtRsAddrInst tDn="uni/tn-mgmt/addrinst-switchOoboobaddr" />
<mgmtRsOobEpg tDn="uni/tn-mgmt/mgmtp-default/oob-default" />
</mgmtOoBZone>
</mgmtGrp>
</infraFuncP>
<mgmtNodeGrp name="switchOob">
<mgmtRsGrp tDn="uni/infra/funcprof/grp-switchOob" />
<infraNodeBlk name="default" from_="101" to_="103" />
</mgmtNodeGrp>
</infraInfra>
</polUni>
Note You can configure the APIC server to use out-of-band management connectivity as the default
connectivity mode.
POST https://apic-ip-address/api/node/mo/.xml
<polUni>
<fabricInst>
<mgmtConnectivityPrefs interfacePref=ooband"/>
</fabricInst>
</polUni>
Procedure
Example:
<polUni>
<fvTenant name="mgmt">
<!-- Contract -->
<vzOOBBrCP name="oob-default">
<vzSubj name="oob-default">
<vzRsSubjFiltAtt tnVzFilterName="default" />
</vzSubj>
</vzOOBBrCP>
</fvTenant>
</polUni>
Example:
<polUni>
<fvTenant name="mgmt">
<mgmtMgmtP name="default">
<mgmtOoB name="default">
<mgmtRsOoBProv tnVzOOBBrCPName="oob-default" />
</mgmtOoB>
</mgmtMgmtP>
</fvTenant>
</polUni>
Example:
<polUni>
<fvTenant name="mgmt">
<mgmtExtMgmtEntity name="default">
<mgmtInstP name="oob-mgmt-ext">
<mgmtRsOoBCons tnVzOOBBrCPName="oob-default" />
<!-- SUBNET from where switches are managed -->
<mgmtSubnet ip="<mgmt_subnet_ip_address>" />
</mgmtInstP>
</mgmtExtMgmtEntity>
</fvTenant>
</polUni>
Step 4 Create static out-of-band management IP addresses and assign them to node IDs.
CHECK IP Addresses
Example:
<polUni>
<fvTenant name="mgmt">
<mgmtMgmtP name="default">
<mgmtOoB name="default">
<mgmtRsOoBStNode tDn="topology/pod-1/node-101"
addr="<ip_address_1>"
gw="<gw_address>"/>
<mgmtRsOoBStNode tDn="topology/pod-1/node-102"
addr="<ip_address_2>"
gw="<gw_address>"/>
<mgmtRsOoBStNode tDn="topology/pod-1/node-103"
addr="<ip_address_3>"
gw="<gw_address>"/>
</mgmtOoB>
</mgmtMgmtP>
</fvTenant>
</polUni>
Overview
This topic provides information on:
How to use configuration Import and Export to recover configuration states to the last known good state
using the Cisco APIC
How to encrypt secure properties of Cisco APIC configuration files
You can do both scheduled and on-demand backups of user configuration. Recovering configuration states
(also known as "roll-back") allows you to go back to a known state that was good before. The option for that
is called an Atomic Replace. The configuration import policy (configImportP) supports atomic + replace
(importMode=atomic, importType=replace). When set to these values, the imported configuration overwrites
the existing configuration, and any existing configuration that is not present in the imported file is deleted.
As long as you do periodic configuration backups and exports, or explicitly trigger export with a known good
configuration, then you can later restore back to this configuration using the following procedures for the CLI,
REST API, and GUI.
For more detailed conceptual information about recovering configuration states using the Cisco APIC, please
refer to the Cisco Application Centric Infrastructure Fundamentals Guide.
The following section provides conceptual information about encrypting secure properties of configuration
files:
Note Up to five configJob objects are kept under a single job container at a time, with each new job triggered.
The oldest job is removed to ensure this.
The configJob object contains the following information:
Execution time
Name of the file being processed/generated
Status, as follows:
Pending
Running
Failed
Fail-no-data
Success
Success-with-warnings
targetDnThe domain name (DN) of the specific object you want to export. (Empty means everything.)
snapshotWhen true, the file is stored on the controller; no remote location configuration is needed.
includeSecureFieldsSet to true by default, this indicates whether the encrypted fields (passwords,
etc.) should be included in the export archive.
Note The configSnapshot object is created holding the information about this snapshot. (See the Snapshots
section.)
Scheduling Exports
An export policy can be linked with a scheduler, which triggers the export automatically based on a
preconfigured schedule. This is done through the configRsExportScheduler relation from the policy to a
trigSchedP object. (See the Sample Configuration section.)
Note A scheduler is optional. A policy can be triggered at any time by setting the adminSt to triggered.
Note If the object is not present on the controller, none of the children of the object get
configured. Best-effort mode attempts to configure the children of the object.
Atomic mode: configuration is applied by whole shards. A single error causes the whole shard to
be rolled back to its original state.
importType
ReplaceCurrent system configuration is replaced with the contents or the archive being imported.
(Only atomic mode is supported.)
MergeNothing is deleted, and archive content is applied on top the existing system configuration.
snapshotWhen true, the file is taken from the controller and no remote location configuration is
needed.
failOnDecryptErrors(true by default) The file fails to import if the archive was encrypted with a
different key than the one that is currently set up in the system.
Troubleshooting
The following scenarios may need troubleshooting:
If the generated archive could not be downloaded from the remote location, refer to the Connectivity
Issues section.
If the import succeeded with warnings, check the details.
If a file could not be parsed, refer to the following scenarios:
If the file is not a valid XML or JSON file, check whether the files from the exported archive were
manually modified.
If an object property has an unknown property or property value, it may be because:
The property was removed or an unknown property value was manually entered.
The model type range was modified (non-backward compatible model change).
The naming property list was modified.
Note Reverse compatibility is not supported; configurations exported from ACI fabrics that
have enabled AES encryption cannot be imported into older versions of the APIC
software.
Always enable AES encryption when performing fabric backup configuration exports. Doing so will
assure that all the secure properties of the configuration will be successfully imported when restoring
the fabric.
Note If a fabric backup configuration is exported without AES encryption enabled, none of
the secure properties will be included in the export. Since such an unencrypted backup
would not include any of the secure properties, it is possible that importing such a file
to restore a system could result in the administrator along with all users of the fabric
being locked out of the system.
The AES passphrase that generates the encryption keys cannot be recovered or read by an ACI
administrator or any other user. The AES passphrase is not stored. The APIC uses the AES passphrase
to generate the AES keys, then discards the passphrase. The AES keys are not exported. The AES keys
cannot be recovered since they are not exported and cannot be retrieved via the REST API.
The same AES-256 passphrase always generates the same AES-256 keys. Configuration export files
can be imported into other ACI fabrics that use the same AES passphrase.
For troubleshooting purposes, export a configuration file that does not contain the encrypted data of the
secure properties. Temporarily turning off encryption before performing the configuration export removes
the values of all secure properties from the exported configuration. To import such a configuration file
that has all secure properties removed, use the import merge mode; do not use the import replace mode.
Using the import merge mode will preserve the existing secure properties in the ACI fabric.
By default, the APIC rejects configuration imports of files that contain fields that cannot be decrypted.
Use caution when turning off this setting. Performing a configuration import inappropriately when this
default setting is turned off could result in all the passwords of the ACI fabric to be removed upon the
import of a configuration file that does not match the AES encryption settings of the fabric.
Note Failure to observe this guideline could result in all users, including fabric administrations,
being locked out of the system.
Username
Password
Note The password must be resubmitted every time changes are made.
Sample Configuration
The following is a sample configuration:
Under fabricInst (uni/fabric), enter:
Note When providing a remote location, if you set the snapshot to True, the backup ignores the remote path
and stores the file on the controller.
Procedure
Create a configuration export policy by sending a POST request with XML such as the following example.
Example:
<configExportP name="policy-name" format="xml" targetDn="/some/dn or empty which means
everything"
snapshot="false" adminSt="triggered">
<configRsRemotePath tnFileRemotePathName="some remote path name" />
<configRsExportScheduler tnTrigSchedPName="some scheduler name" />
</configExportP>
Procedure
Configure a configuration file import policy, send a post with XML such as the following example:
Example:
<configImportP name="policy-name" fileName="someexportfile.tgz" importMode="atomic"
importType="replace" snapshot="false" adminSt="triggered">
<configRsRemotePath tnFileRemotePathName="some remote path name" />
</configImportP>
Procedure
To encrypt a configuration file using the REST API, send a post with XML such as the following example:
Example:
https://apic-ip-address/api/mo/uni/fabric.xml
<pkiExportEncryptionKey passphrase="abcdefghijklmnopqrstuvwxyz"
strongEncryptionEnabled="true"/>
Snapshots
Snapshots are configuration backup archives, stored (and replicated) in a controller managed folder. To create
one, an export can be performed with the snapshot property set to true. In this case, no remote path
configuration is needed. An object of configSnapshot type is created to expose the snapshot to the user.
configSnapshot objects provide the following:
file name
file size
creation date
root DN indicating what the snapshot is of (fabric, infra, specific tenant, and so on)
ability to remove a snapshot (by setting the retire field to true)
To import a snapshot, set the import policy snapshot property to true and provide the name of the snapshot
file (from configSnapshot).
About Rollbacks
The configRollbackP policy is used to undo the changes made between two snapshots. Managed Objects
(MOs) are processed as follows:
Deleted MOs are recreated.
Created MOs are deleted.
Modified MOs are reverted.
Note The rollback feature operates only on snapshots. Remote archives are not supported. If you want to use
the data in a remote archive, use the snapshot manager to create a snapshot from from the data for the
rollback. The policy does not require a remote path configuration.
Rollback Workflow
The policy snapshotOneDN and snapshotTwoDn fields must be set and the first snapshot (S1) must precede
snapshot two (S2). Once triggered, snapshots are extracted and analyzed, and the difference between them is
calculated and applied.
MOs are located that are:
Present in S1 but not present in S2These MOs are deleted and rollback re-creates them.
Not present in S1 but not present in S2These MOs are created after S1 and rollback deletes them if:
These MOs are not modified after S2 is taken.
None of the MO descendants are created or modified after S2 is taken.
Present in both S1 and S2, but with different property valuesThese MO properties are reverted to S1,
unless the property was modified to a different value after S2 is taken. In this case, it is left as is.
The rollback feature also generates a diff file that contains the configuration generated as a result of
these calculations. Applying this configuration is the last step of the rollback process. The content of
this file can be retrieved through a special REST API called readiff:
apichost/mqapi2/snapshots.readiff.xml?jobdn=SNAPSHOT_JOB_DN.
Rollback (which is difficult to predict) also has a preview mode (set preview to true), which prevents
rollback from making any actual changes. It calculates and generates the diff file, allowing you to preview
what exactly is going to happen once the rollback is actually performed.
Diff Tool
Another special REST API is available, which provides diff functionality between two snapshots:
apichost/mqapi2/snapshots.diff.xml?s1dn=SNAPSHOT_ONE_DN&s2dn=SNAPSHOT_TWO_DN.
Procedure
To download or upload a snapshot policy, send a POST request with XML such as the following:
Example:
<configSnapshotManagerP name="policy-name" fileName="someexportfile.tgz"
mode="upload|download" adminSt="triggered">
<configRsRemotePath tnFileRemotePathName="some remote path name" />
</configSnapshotManagerP>
Procedure
To configure and execute a rollback, send a POST request with XML such as the following:
Example:
<configRollbackP name="policy-name" snapshotOneDn="dn/of/snapshot/one"
snapshotOneDn="dn/of/snapshot/two" preview="false" adminSt="triggered" />
Configuration Zones
Configuration zones divide the ACI fabric into different zones that can be updated with configuration changes
at different times. This limits the risk of deploying a faulty fabric-wide configuration that might disrupt traffic
or even bring the fabric down. An administrator can deploy a configuration to a non-critical zone, and then
deploy it to critical zones when satisfied that it is suitable.
The following policies specify configuration zone actions:
infrazone:ZoneP is automatically created upon system upgrade. It cannot be deleted or modified.
infrazone:Zone contains one or more pod groups (PodGrp) or one or more node groups (NodeGrp).
Note You can only choose PodGrp or NodeGrp; both cannot be chosen.
A node can be part of only one zone (infrazone:Zone). NodeGrp has two properties: name, and
deployment mode. The deployment mode property can be:
enabled - Pending updates are sent immediately.
disabled - New updates are postponed.
triggered - pending updates are sent immediately, and the deployment mode is automatically
reset to the value it had before the change to triggered.
When a policy on a given set of nodes is created, modified, or deleted, updates are sent to each node where
the policy is deployed. Based on policy class and infrazone configuration the following happens:.
For policies that do not follow infrazone configuration, the APIC sends updates immediately to all the
fabric nodes.
For policies that follow infrazone configuration, the update proceeds according to the infrazone
configuration:
If a node is part of an infrazone:Zone, the update is sent immediately if the deployment mode of
the zone is set to enabled; otherwise the update is postponed.
If a node is not part of aninfrazone:Zone, the update is done immediately, which is the ACI fabric
default behavior.
fabric:SFPortS
fabric:SpCardP
fabric:SpCardPGrp
fabric:SpCardS
fabric:SpNodePGrp
fabric:SpPortP
fabric:SpPortPGrp
fc:DomP
fc:FabricPol
fc:IfPol
fc:InstPol
file:RemotePath
fvns:McastAddrInstP
fvns:VlanInstP
fvns:VsanInstP
fvns:VxlanInstP
infra:AccBaseGrp
infra:AccBndlGrp
infra:AccBndlPolGrp
infra:AccBndlSubgrp
infra:AccCardP
infra:AccCardPGrp
infra:AccNodePGrp
infra:AccPortGrp
infra:AccPortP
infra:AttEntityP
infra:CardS
infra:ConnFexBlk
infra:ConnFexS
infra:ConnNodeS
infra:DomP
infra:FexBlk
infra:FexBndlGrp
infra:FexGrp
infra:FexP
infra:FuncP
infra:HConnPortS
infra:HPathS
infra:HPortS
infra:LeafS
infra:NodeBlk
infra:NodeGrp
infra:NodeP
infra:OLeafS
infra:OSpineS
infra:PodBlk
infra:PodGrp
infra:PodP
infra:PodS
infra:PolGrp
infra:PortBlk
infra:PortP
infra:PortS
infra:PortTrackPol
infra:Profile
infra:SHPathS
infra:SHPortS
infra:SpAccGrp
infra:SpAccPortGrp
infra:SpAccPortP
infra:SpineP
infra:SpineS
isis:DomPol
l2ext:DomP
l2:IfPol
l2:InstPol
l2:PortSecurityPol
l3ext:DomP
lacp:IfPol
lacp:LagPol
lldp:IfPol
lldp:InstPol
mcp:IfPol
mcp:InstPol
mgmt:NodeGrp
mgmt:PodGrp
mon:FabricPol
mon:InfraPol
phys:DomP
psu:InstPol
qos:DppPol
snmp:Pol
span:Dest
span:DestGrp
span:SpanProv
span:SrcGrp
span:SrcTargetShadow
span:SrcTargetShadowBD
span:SrcTargetShadowCtx
span:TaskParam
span:VDest
span:VDestGrp
span:VSpanProv
span:VSrcGrp
stormctrl:IfPol
stp:IfPol
stp:InstPol
stp:MstDomPol
stp:MstRegionPol
trig:SchedP
vmm:DomP
vpc:InstPol
vpc:KAPol
Procedure
Create a configuration zone using the REST API leaf switch or pod examples below.
Example:
Creating a Config Zone with Leaf Switches
<infraInfra>
<infrazoneZoneP name="default">
<infrazoneZone name="Group1" deplMode="disabled">
<infrazoneNodeGrp name="nodeGroup">
<infraNodeBlk name="nodeblk1" from_=101 to_=101/>
<infraNodeBlk name="nodeblk2" from_=103 to_=103/>
</infrazoneNodeGrp>
</infrazoneZone>
<infrazoneZone name="Group2" deplMode="enabled">
<infrazoneNodeGrp name="nodeGroup2">
<infraNodeBlk name="nodeblk" from_=102 to_=102/>
</infrazoneNodeGrp>
</infrazoneZone>
</infrazoneZoneP>
</infraInfra>
Example:
Accounting
ACI fabric accounting is handled by these two managed objects (MO) that are processed by the same mechanism
as faults and events:
The aaaSessionLR MO tracks user account login and logout sessions on the APIC and switches, and
token refresh. The ACI fabric session alert feature stores information such as the following:
Username
IP address initiating the session
Type (telnet, https, REST etc.)
Session time and length
Token refresh a user account login event generates a valid active token which is required in order
for the user account to exercise its rights in the ACI fabric.
Note Token expiration is independent of login; a user could log out but the token expires
according to the duration of the timer value it contains.
The aaaModLR MO tracks the changes users make to objects and when the changes occurred.
If the AAA server is not pingable, it is marked unavailable and a fault is seen.
Both the aaaSessionLR and aaaModLR event logs are stored in APIC shards. Once the data exceeds the pre-set
storage allocation size, it overwrites records on a first-in first-out basis.
Note In the event of a destructive event such as a disk crash or a fire that destroys an APIC cluster node, the
event logs are lost; event logs are not replicated across the cluster.
The aaaModLR and aaaSessionLR MOs can be queried by class or by distinguished name (DN). A class query
provides all the log records for the whole fabric. All aaaModLR records for the whole fabric are available from
the GUI at the Fabric > Inventory > POD > History > Audit Log section, The APIC GUI History > Audit
Log options enable viewing event logs for a specific object identified in the GUI.
The standard syslog, callhome, REST query, and CLI export mechanisms are fully supported for aaaModLR
and aaaSessionLR MO query data. There is no default policy to export this data.
There are no pre-configured queries in the APIC that report on aggregations of data across a set of objects or
for the entire system. A fabric administrator can configure export policies that periodically export aaaModLR
and aaaSessionLR query data to a syslog server. Exported data can be archived periodically and used to
generate custom reports from portions of the system or across the entire set of system logs.
The ACI fabric manages access privileges at the managed object (MO) level. A privilege is an MO that enables
or restricts access to a particular function within the system. For example, fabric-equipment is a privilege bit.
This bit is set by the Application Policy Infrastructure Controller (APIC) on all objects that correspond to
equipment in the physical fabric.
A role is a collection of privilege bits. For example, because an admin role is configured with privilege bits
for fabric-equipment and tenant-security, the admin role has access to all objects that correspond to
equipment of the fabric and tenant security.
A security domain is a tag associated with a certain subtree in the ACI MIT object hierarchy. For example,
the default tenant common has a domain tag common. Similarly, the special domain tag all includes the
entire MIT object tree. An administrator can assign custom domain tags to the MIT object hierarchy. For
example, an administrator could assign the solar domain tag to the tenant named solar. Within the MIT, only
certain objects can be tagged as security domains. For example, a tenant can be tagged as a security domain
but objects within a tenant cannot.
Creating a user and assigning a role to that user does not enable access rights. It is necessary to also assign
the user to one or more security domains. By default, the ACI fabric includes two special pre-created domains:
Allallows access to the entire MIT
Infra allows access to fabric infrastructure objects/subtrees, such as fabric access policies
Note For read operations to the managed objects that a user's credentials do not allow, a "DN/Class Not Found"
error is returned, not "DN/Class Unauthorized to read." For write operations to a managed object that a
user's credentials do not allow, an HTTP 401 Unauthorized error is returned. In the GUI, actions that a
user's credentials do not allow, either they are not presented, or they are grayed out.
A set of predefined managed object classes can be associated with domains. These classes should not have
overlapping containment. Examples of classes that support domain association are as follows:
Layer 2 and Layer 3 network managed objects
Network profiles (such as physical, Layer 2, Layer 3, management)
QoS policies
When an object that can be associated with a domain is created, the user must assign domain(s) to the object
within the limits of the user's access rights. Domain assignment can be modified at any time.
If a virtual machine management (VMM) domain is tagged as a security domain, the users contained in the
security domain can access the correspondingly tagged VMM domain. For example, if a tenant named solar
is tagged with the security domain called sun and a VMM domain is also tagged with the security domain
called sun, then users in the solar tenant can access the VMM domain according to their access rights.
Procedure
To configure a custom role, send a POST request with XML as in the following example:
Example:
<aaaRoleresetToFactory="no"
priv="aaa,access-connectivity-l1,access-connectivity-l2,access-connectivity-l3,access-connectivity-mgmt,
access-connectivity-util,access-equipment,access-protocol-l1,access-protocol-l2,access-protocol-l3,access-protocol-mgmt,
access-protocol-ops,access-protocol-util,access-qos,fabric-connectivity-l1,fabric-connectivity-l2,
fabric-connectivity-l3,fabric-connectivity-mgmt,fabric-connectivity-util,fabric-equipment,
fabric-protocol-l1,fabric-protocol-l2,fabric-protocol-l3,fabric-protocol-mgmt,fabric-protocol-ops,
fabric-protocol-util,nw-svc-device,nw-svc-devshare,nw-svc-policy,ops,tenant-connectivity-l1,
tenant-connectivity-l2,tenant-connectivity-l3,tenant-connectivity-mgmt,tenant-connectivity-util,
tenant-epg,tenant-ext-connectivity-l1,tenant-ext-connectivity-l2,tenant-ext-connectivity-l3,
tenant-ext-connectivity-mgmt,tenant-ext-connectivity-util,tenant-ext-protocol-l1,tenant-ext-protocol-l2,
tenant-ext-protocol-l3,tenant-ext-protocol-mgmt,tenant-ext-protocol-util,tenant-network-profile,
tenant-protocol-l1,tenant-protocol-l2,tenant-protocol-l3,tenant-protocol-mgmt,tenant-protocol-ops,
tenant-protocol-util,tenant-qos,tenant-security,vmm-connectivity,vmm-ep,vmm-policy,vmm-protocol-ops,
Procedure
Example:
URL: https://apic-ip-address/api/policymgr/mo/uni/userext.xml
POST CONTENT:
<aaaUser name="operations" phone="" pwd="<strong_password>" >
<aaaUserDomain childAction="" descr="" name="all" rn="userdomain-all" status="">
Note When an APIC is in minority (disconnected from the cluster), remote logins can fail because the ACI is
a distributed system and the user information is distributed across APICS. Local logins, however, continue
to work because they are local to the APIC.
To configure a remote user authenticated through an external authentication provider, you must meet the
following prerequisites:
The DNS configuration should have already been resolved with the hostname of the RADIUS server.
You must configure the management subnet.
Procedure
Example:
URL: https://apic-ip-address/api/policymgr/mo/uni/userext/radiusext.xml
POST Content:
<aaaRadiusProvider name="radius-auth-server.org.com" key="test123" />
Step 2 Create a login domain.
Example:
URL: https://apic-ip-address/api/policymgr/mo/uni/userext.xml
POST Content:
<aaaLoginDomain name="rad"> <aaaDomainAuth realm="radius"/> </aaaLoginDomain>
Before you can use X.509 certificate-based signatures for authentication, verify that the following pre-requisite
tasks are completed:
1 Create an X.509 certificate and private key using OpenSSL or a similar tool.
2 Create a local user on the APIC. (If a local user is already available, this task is optional).
3 Add the X.509 certificate to the local user on the APIC.
Procedure
Step 1 Concatenate the HTTP method, REST API URI, and payload together in this order and save them to a file.
This concatenated data must be saved to a file for OpenSSL to calculate the signature. In this example, we
use a filename of payload.txt. Remember that the private key is in a file called userabc.key.
Example:
GET example:
GET http://10.10.10.1/api/class/fvTenant.json?rsp-subtree=children
POST example:
POST http://10.10.10.1/api/mo/tn-test.json{"fvTenant": {"attributes": {"status": "deleted",
"name": "test"}}}
Step 2 Calculate a signature using the private key and the payload file using OpenSSL.
Example:
openssl dgst -sha256 -sign userabc.key payload.txt > payload_sig.bin
The resulting file has the signature printed on multiple lines.
Step 3 Strip the signature of the new lines using Bash.
Example:
$ tr -d '\n' < payload_sig.base64
P+OTqK0CeAZjl7+Gute2R1Ww8OGgtzE0wsLlx8fIXXl4V79Zl7
Ou8IdJH9CB4W6CEvdICXqkv3KaQszCIC0+Bn07o3qF//BsIplZmYChD6gCX3f7q
IcjGX+R6HAqGeK7k97cNhXlWEoobFPe/oajtPjOu3tdOjhf/9ujG6Jv6Ro=
Note This is the signature that will be sent to the APIC for this specific request. Other requests will require
to have their own signatures calculated.
Step 4 Place the signature inside a string to enable the APIC to verify the signature against the payload.
This complete signature is sent to the APIC as a cookie in the header of the request.
Example:
APIC-Request-Signature=P+OTqK0CeAZjl7+Gute2R1Ww8OGgtzE0wsLlx8f
IXXl4V79Zl7Ou8IdJH9CB4W6CEvdICXqkv3KaQszCIC0+Bn07o3qF//BsIplZmYChD6gCX3f
7qIcjGX+R6HAqGeK7k97cNhXlWEoobFPe/oajtPjOu3tdOjhf/9ujG6Jv6Ro=;
APIC-Certificate-Algorithm=v1.0; APIC-Certificate-Fingerprint=fingerprint;
APIC-Certificate-DN=uni/userext/user-userabc/usercert-userabc.crt
Note The DN used here must match the DN of the user certified object containing the x509 certificate in
the next step.
Step 5 Use the CertSession class in the Python SDK to communicate with an APIC using signatures.
The following script is an example of how to use the CertSession class in the ACI Python SDK to make
requests to an APIC using signatures.
Example:
#!/usr/bin/env python
# It is assumed the user has the X.509 certificate already added to
# their local user configuration on the APIC
from cobra.mit.session import CertSession
from cobra.mit.access import MoDirectory
pkey = readFile("/tmp/userabc.key")
csession = CertSession("https://ApicIPOrHostname/",
"uni/userext/user-userabc/usercert-userabc.crt", pkey)
modir = MoDirectory(csession)
resp = modir.lookupByDn('uni/fabric')
pring resp.dn
# End of script
Note The DN used in the earlier step must match the DN of the user certified object containing the x509
certificate in this step.
Creating a Local User and Adding a User Certificate Using the REST API
Procedure
Example:
method: POST
url: http://apic/api/node/mo/uni/userext/user-userabc.json
payload:
{
"aaaUser": {
"attributes": {
"name": "userabc",
"firstName": "Adam",
"lastName": "BC",
"phone": "408-525-4766",
"email": "userabc@cisco.com",
},
"children": [{
"aaaUserCert": {
"attributes": {
"name": "userabc.crt",
"data": "-----BEGIN CERTIFICATE-----\nMIICjjCCAfegAwIBAgIJAMQnbE
<snipped content> ==\n-----END CERTIFICATE-----",
},
"children": []
},
"aaaUserDomain": {
"attributes": {
"name": "all",
},
"children": [{
"aaaUserRole": {
"attributes": {
"name": "aaa",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "access-admin",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "admin",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "fabric-admin",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "nw-svc-admin",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "ops",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "read-all",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "tenant-admin",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "tenant-ext-admin",
"privType": "writePriv",
},
"children": []
}
}, {
"aaaUserRole": {
"attributes": {
"name": "vmm-admin",
"privType": "writePriv",
},
"children": []
}
}]
}
}]
}
}
Tenants Overview
A tenant contains policies that enable qualified users domain-based access control. Qualified users can
access privileges such as tenant administration and networking administration.
A user requires read/write privileges for accessing and configuring policies in a domain. A tenant user
can have specific privileges into one or more domains.
In a multitenancy environment, a tenant provides group user access privileges so that resources are
isolated from one another (such as for endpoint groups and networking). These privileges also enable
different users to manage different tenants.
Tenant Creation
A tenant contains primary elements such as filters, contracts, bridge domains, and application profiles that
you can create after you first create a tenant.
Adding a Tenant
A tenant is a policy owner in the virtual fabric. A tenant can be either a private or a shared entity. For example,
you can create a securely partitioned private tenant or a tenant with contexts and bridge domains shared by
other tenants. A shared type of tenant is typically named common, default, or infra.
In the management information model, a tenant is represented by a managed object (MO) of class fv:Tenant.
According to the Cisco APIC Management Information Model Reference, an object of the fv:Tenant class is
a child of the policy resolution universe (uni) class and has a distinguished name (DN) format of uni/tn-[name].
The following examples show how to add a new tenant named ExampleCorp using XML and JSON.
POST https://apic-ip-address/api/mo/uni.json
{
"fvTenant" : {
"attributes" : {
"name" : "ExampleCorp"
}
}
}
Alternatively, you can name the tenant in the URI, as in this example:
POST https://apic-ip-address/api/mo/uni/tn-ExampleCorp.json
{
"fvTenant" : {
"attributes" : {
}
}
}
If a response is requested (by appending ?rsp-subtree=modified to the POST URI), a successful operation
returns the following response body:
{
"imdata" :
[{
"fvTenant" : {
"attributes" : {
"instanceId" : "0:0",
"childAction" : "deleteNonPresent",
"dn" : "uni/tn-ExampleCorp",
"lcOwn" : "local",
"name" : "ExampleCorp",
"replTs" : "never",
"rn" : "",
"status" : "created"
}
}
}
]
}
DELETE https://apic-ip-address/api/mo/uni/tn-ExampleCorp.json
Alternatively, you can send an HTTP POST message with sufficient naming information and with "status"
: "deleted" in the fv:Tenant attributes, as in this example:
POST https://apic-ip-address/api/mo/uni.json
{
"fvTenant" : {
"attributes" : {
"name" : "ExampleCorp",
"status" : "deleted"
}
}
}
POST https://apic-ip-address/api/mo/uni.xml
<fvTenant name="ExampleCorp"/>
Alternatively, you can name the tenant in the URI, as in this example:
POST https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
<fvTenant />
If a response is requested (by appending ?rsp-subtree=modified to the POST URI), a successful operation
returns the following response body:
<imdata>
<fvTenant
instanceId="0:0"
childAction="deleteNonPresent"
dn="uni/tn-ExampleCorp"
lcOwn="local"
name="ExampleCorp"
replTs="never"
rn=""
status="created"
/>
</imdata>
DELETE https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
Alternatively, you can send an HTTP POST message with sufficient naming information and with
status="deleted" in the fv:Tenant attributes, as in this example:
POST https://apic-ip-address/api/mo/uni.xml
The ACI fabric is unaware of the presence of the external router and the APIC statically assigns the leaf switch
interface to its EPG.
Creating a Tenant, VRF, and Bridge Domain Using the REST API
Procedure
Example:
POST https://apic-ip-address/api/mo/uni.xml
<fvTenant name="ExampleCorp"/>
When the POST succeeds, you see the object that you created in the output.
Step 2 Create a VRF and bridge domain.
Note The Gateway Address can be an IPv4 or an IPv6 address. For more about details IPv6 gateway
address, see the related KB article, KB: Creating a Tenant, VRF, and Bridge Domain with IPv6
Neighbor Discovery .
Example:
URL for POST: https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
<fvTenant name="ExampleCorp">
<fvCtx name="pvn1"/>
<fvBD name="bd1">
<fvRsCtx tnFvCtxName="pvn1"/>
<fvSubnet ip="10.10.100.1/24"/>
</fvBD>
</fvTenant>
Note If you have a public subnet when you configure the routed outside, you must associate the bridge
domain with the outside configuration.
Ports
Deploying an EPG on a Specific Port with APIC Using the REST API
Before You Begin
The tenant where you deploy the EPG is created.
Procedure
Example:
<fvTenant name="<tenant_name>" dn="uni/tn-test1" >
<fvCtx name="<network_name>" pcEnfPref="enforced" knwMcastAct="permit"/>
<fvBD name="<bridge_domain_name>" unkMcastAct="flood" >
<fvRsCtx tnFvCtxName="<network_name>"/>
</fvBD>
<fvAp name="<application_profile>" >
<fvAEPg name="<epg_name>" >
<fvRsPathAtt tDn="topology/pod-1/paths-1017/pathep-[eth1/13]" mode="regular"
instrImedcy="immediate" encap="vlan-20"/>
</fvAEPg>
</fvAp>
</fvTenant>
Creating Domains, Attach Entity Profiles, and VLANs to Deploy an EPG on a Specific Port
This topic provides a typical example of how to create physical domains, Attach Entity Profiles (AEP), and
VLANs that are mandatory to deploy an EPG on a specific port.
Note All endpoint groups (EPGs) require a domain. Interface policy groups must also be associated with Attach
Entity Profile (AEP), and the AEP must be associated with a domain, if the AEP and EPG have to be in
same domain. Based on the association of EPGs to domains and of interface policy groups to domains,
the ports and VLANs that the EPG uses are validated. The following domain types associate with EPGs:
Application EPGs
Layer 3 external outside network instance EPGs
Layer 2 external outside network instance EPGs
Management EPGs for out-of-band and in-band access
The APIC checks if an EPG is associated with one or more of these types of domains. If the EPG is not
associated, the system accepts the configuration but raises a fault. The deployed configuration may not
function properly if the domain association is not valid. For example, if the VLAN encapsulation is not
valid for use with the EPG, the deployed configuration may not function properly.
Creating AEP, Domains, and VLANs to Deploy an EPG on a Specific Port Using the REST API
Before You Begin
The tenant where you deploy the EPG is already created.
Procedure
Step 1 Create the interface profile, switch profile and the Attach Entity Profile (AEP).
Example:
<infraInfra>
<infraAccPortP name="<interface_profile_name>"
dn="uni/infra/accportprof-<interface_profile_name>" >
<infraHPortS name="portSelector" type="range">
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-<port_group_name>"
fexId="101"/>
<infraPortBlk name="block2" toPort="13" toCard="1" fromPort="11"
fromCard="1"/>
</infraHPortS>
</infraAccPortP>
<infraAccPortGrp name="<port_group_name>"
dn="uni/infra/funcprof/accportgrp-<port_group_name>" >
<infraRsAttEntP tDn="uni/infra/attentp-<attach_entity_profile_name>"/>
<infraRsHIfPol tnFabricHIfPolName="1GHifPol"/>
</infraAccPortGrp>
<infraAttEntityP name="<attach_entity_profile_name>"
dn="uni/infra/attentp-<attach_entity_profile_name>" >
<infraRsDomP tDn="uni/phys-<physical_domain_name>"/>
</infraAttEntityP>
<infraInfra>
Step 2 Create a domain.
Example:
<physDomP name="<physical_domain_name>" dn="uni/phys-<physical_domain_name>">
<infraRsVlanNs tDn="uni/infra/vlanns-[<vlan_pool_name>]-static"/>
</physDomP>
Step 3 Create a VLAN range.
Example:
<fvnsVlanInstP name="<vlan_pool_name>" dn="uni/infra/vlanns-[<vlan_pool_name>]-static"
allocMode="static">
<fvnsEncapBlk name="" descr="" to="vlan-25" from="vlan-10"/>
</fvnsVlanInstP>
Step 4 Associate the EPG with the domain.
Example:
<fvTenant name="<tenant_name>" dn="uni/tn-" >
<fvAEPg prio="unspecified" name="<epg_name>" matchT="AtleastOne"
dn="uni/tn-test1/ap-AP1/epg-<epg_name>" descr="">
<fvRsDomAtt tDn="uni/phys-<physical_domain_name>" instrImedcy="immediate"
resImedcy="immediate"/>
</fvAEPg>
</fvTenant>
Configuring Layer 3 Outside for Tenant Networks Using the REST API
The external routed network configured in the example can also be extended to support IPv4. Both IPv4 and
IPv6 routes can be advertised to and learned from the external routed network.
Procedure
Configure L3 Outside for tenant networks and associate the bridge domain with the Layer3 Outside.
Example:
<fvTenant name='TenantName'>
<l3extOut name="L3Out1" enforceRtctrl="import,export">
<l3extRsL3DomAtt tDn="uni/l3dom-l3DomP"/>
<l3extLNodeP name="LNodeP1" >
<l3extRsNodeL3OutAtt rtrId="1.2.3.4" tDn="topology/pod-1/node-101">
<l3extLoopBackIfP addr="10.10.11.1" />
<l3extLoopBackIfP addr="2000::3" />
</l3extRsNodeL3OutAtt>
<l3extLIfP name="IFP1" >
<l3extRsPathL3OutAtt addr="10.11.12.10/24" ifInstT="l3-port"
tDn="topology/pod-1/paths-103/pathep-[eth1/17]" />
</l3extLIfP>
<l3extLIfP name="IFP2" >
<l3extRsPathL3OutAtt addr="2001::3/64" ifInstT="l3-port"
tDn="topology/pod-1/paths-103/pathep-[eth1/17]" />
</l3extLIfP>
</l3extLNodeP>
<l3extRsEctx tnFvCtxName="VRF1"/>
<l3extInstP name="InstP1" >
<l3extSubnet ip="192.168.1.0/24" scope="import-security" aggregate=""/>
<l3extSubnet ip="0.0.0.0/0" scope="export-rtctrl,import-rtctrl,import-security"
aggregate="export-rtctrl,import-rtctrl"/>
<l3extSubnet ip="192.168.2.0/24" scope="export-rtctrl" aggregate=""/>
<l3extSubnet ip="::/0" scope="import-rtctrl,import-security"
aggregate="import-rtctrl"/>
<l3extSubnet ip="2001:17a::/64" scope="export-rtctrl" aggregate=""/>
</l3extInstP>
</l3extOut>
</fvTenant>
APIC
Monitoring APIC CPU and Memory Usage Using the REST API
The easiest way to quickly verify the health of the controllers is the APIC. Controllers provide information
regarding the current status of CPU and memory utilization by creating instances of the procEntity class. The
procEntity is a container of processes in the system. This object holds detailed information about various
processes running on the APIC. The procEntity objects contain the following useful properties:
cpuPctCPU utilization
maxMemAllocThe maximum memory allocated for the system
memFreeThe maximum amount of available memory for the system
Procedure
Retrieve information about CPU and memory usage using the following REST API call:
Example:
https://apic-ip-address/api/node/class/procEntity.xml?
Procedure
Monitor the disk and file systems on the APIC, by sending a REST API post, such as the following:
Example:
https://apic-ip-address/api/node/class/eqptStorage.xml?
Monitoring Physical Interface Statistics and Link State Using the REST API
You can use the REST API interface to poll for interface statistics. Several counters are available (for example,
RX/TX, input/output / duplex, 30 second rates, 5 minute rate, unicast packets, multicast packets). Using the
parent managed object, the children can be derived from it. To do this, you must have a good understanding
of the object model and be able to navigate through the model to obtain the information desired using the
example below.
Procedure
Step 1 Use the following base API call to get physical interface statistics:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/phys-[eth1/1].json
Step 2 To determine the total ingress bytes on Leaf 101 port Eth1/1, you can issue the following API call:
Example:
/topology/pod-1/node-101/sys/phys-[eth1/1].json
Step 3 Visore allows you to dig deeper into the hierarchical tree. From the prior command, the operator can see
children of the interface object, such as ingress and egress bytes. The child objects include the following:
Example:
/topology/pod-1/node-101/sys/phys-[eth1/1]/dbgEtherStats
Fabric
Monitoring LLDP and CDP Neighbor Status Using the REST API
The APIC enables you to determine all LLDP or CDP neighbors in a fabric, using the REST API.
Procedure
Step 1 To determine the LLDP neighbors, send a POST such as the following:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/lldp/inst/if-[eth1/1]
Step 2 To determine the CDP neighbors, send a POST such as the following:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/cdp/inst/if-[eth1/1]
The bond interfaces rely on underlying physical interfaces. It is important to note that the REST API provides
link information for both the physical and logical bond interfaces.
Procedure
Collect information about both the bond interfaces by sending a POST request such as the following example:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1/node-1/sys.json?querytarget=
subtree&target-subtree-class=l3EncRtdIf
Procedure
To monitor the traffic for a new project for the epg-web-epg, send a POST request such as the following
example:
Example:
https://apic-ip-address/api/node/mo/uni/tn-newproject/ap-app1/epg-web-epg.xml?querytarget=
self&rsp-subtree-include=stats
Switches
The following example shows how to use these classes for monitoring:
Procedure
To view the average CPU utilization of all of the fabric switches over the last day, use XML such as in the
following example:
Example:
https://apic-ip-address//api/node/class/procSysCPU1d.xml?
Procedure
To retrieve the status of the fan trays on the leaf switches, use XML such as the following example:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/ch/ftslot-1
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/ch/ftslot-2
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/ch/ftslot-3
Procedure
To monitor memory over the last day, use the following REST call:
Example:
https://apic-ip-address/api/node/class/procSysMem1d.xml?
Procedure
To monitor the state of the supervisor and the module, use a REST API call such as the following:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/ch/supslot-1/sup
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/ch/lcslot-1/lc
Procedure
To monitor the state of the power supplies on a leaf switch, use XML such as the following example:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/ch/psuslot-1
https://apic-ip-address/api/node/mo/topology/pod-1/node-101/sys/ch/psuslot-2
Note that there are 2 power supplies on this particular switch.
Procedure
To retrieve switch hardware information, use the REST API as shown in the following example:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1.json?query-target=children&target-subtree-class=fabricNode
Procedure
Step 1 Set the remote destination for a technical support file using the REST API, by sending a POST with XML
such as the following example:
Example:
<fileRemotePath userName="" remotePort="22" remotePath="" protocol="sftp" name="ToSupport"
host="192.168.200.2"
dn="uni/fabric/path-ToSupport" descr="">
<fileRsARemoteHostToEpg tDn="uni/tn-mgmt/mgmtp-default/oob-default"/>
</fileRemotePath>
Step 2 Generate an on-demand technical support file using the REST API by sending a POST with XML such as the
following:
Example:
<dbgexpTechSupOnD upgradeLogs="no" startTime="unspecified" name="Tech_Support_9-20-16"
exportToController="no"
endTime="unspecified" dn="uni/fabric/tsod-Tech_Support_9-20-16" descr="" compression="gzip"
category="forwarding" adminSt="untriggered">
<dbgexpRsExportDest tDn="uni/fabric/path-ToSupport"/>
<dbgexpRsTsSrc tDn="topology/pod-1/node-102/sys"/>
<dbgexpRsTsSrc tDn="topology/pod-1/node-103/sys"/>
<dbgexpRsTsSrc tDn="topology/pod-1/node-101/sys"/>
<dbgexpRsData tDn="uni/fabric/tscont"/>
</dbgexpTechSupOnD>
Atomic Counters
Atomic Counters are useful for troubleshooting connectivity between endpoints, EPGs, or an application
within the fabric. A user reporting application may be experiencing slowness, or atomic counters may be
needed for monitoring any traffic loss between two endpoints. One capability provided by atomic counters is
the ability to place a trouble ticket into a proactive monitoring mode, for example when the problem is
intermittent, and not necessarily happening at the time the operator is actively working the ticket.
Atomic counters can help detect packet loss in the fabric and allow the quick isolation of the source of
connectivity issues. Atomic counters require NTP to be enabled on the fabric.
Leaf-to-leaf (TEP to TEP) atomic counters can provide the following:
Counts of drops, admits, and excess packets
Short-term data collection such as the last 30 seconds, and long-term data collection such as 5 minutes,
15 minutes, or more
A breakdown of per-spine traffic (available when the number of TEPs, leaf or VPC, is less than 64)
Ongoing monitoring
Leaf-to-leaf (TEP to TEP) atomic counters are cumulative and cannot be cleared. However, because 30 second
atomic counters reset at 30 second intervals, they can be used to isolate intermittent or recurring problems.
Tenant atomic counters can provide the following:
Application-specific counters for traffic across the fabric, including drops, admits, and excess packets
Modes include the following:
Endpoint to endpoint MAC address, or endpoint to endpoint IP address. Note that a single target endpoint
could have multiple IP addresses associated with it.
EPG to EPG with optional drill down
EPG to endpoint
EPG to * (any)
Endpoint to external IP address
Note Atomic counters track the amount packets of between the two endpoints and use this as a measurement.
They do not take into account drops or error counters in a hardware level.
Dropped packets are calculated when there are less packets received by the destination than transmitted by
the source.
Excess packets are calculated when there are more packets received by the destination than transmitted by
the source.
Procedure
Step 1 To create an EP_to_EP policy using the REST API, use XML such as the following example:
Example:
<dbgacEpToEp name="EP_to_EP_Policy" ownerTag="" ownerKey=""
dn="uni/tn-Tenant64/acEpToEp-EP_to_EP_Policy" descr="" adminSt="enabled">
<dbgacFilter name="EP_to_EP_Filter" ownerTag="" ownerKey="" descr=""
srcPort="https" prot="tcp" dstPort="https"/>
</dbgacEpToEp>
Step 2 To create an EP_to_EPG policy using the REST API, use XML such as the following example:
Example:
<dbgacEpToEpg name="EP_to_EPG_Pol" ownerTag="" ownerKey=""
dn="uni/tn-Tenant64/epToEpg-EP_to_EPG_Pol" descr="" adminSt="enabled">
<dbgacFilter name="EP_to_EPG_Filter" ownerTag="" ownerKey="" descr=""
srcPort="http" prot="tcp" dstPort="http"/>
<dbgacRsToAbsEpg tDn="uni/tn-Tenant64/ap-VRF64_app_prof/epg-EPG64"/>
</dbgacEpToEpg>
Procedure
Step 1 To get a list of the endpoint-to-endpoint atomic counters deployed within the fabric and the associated details
such as dropped packet statistics and packet counts, use the dbgEpToEpTsIt class in XML such as the
following example:
Example:
https://apic-ip-address/api/node/class/dbgEpToEpRslt.xml
Step 2 To get a list of external IP-to-endpoint atomic counters and the associated details, use the dbgacExtToEp
class in XML such as the following example:
Example:
https://apic-ip-address/api/node/class/dbgExtToEpRslt.xml
Faults, events, and statistics in the ACI fabric are represented as a collection of Managed Objects (MOs)
within the overall ACI Object Model/Management Information Tree (MIT). All objects within ACI can be
queried, including faults. In this model, a fault is represented as a mutable, stateful, and persistent MO.
When a specific condition occurs, such as a component failure or an alarm, the system creates a fault MO as
a child object to the MO that is primarily associated with the fault. For a fault object class, the fault conditions
are defined by the fault rules of the parent object class. Fault MOs appear as regular MOs in MIT; they have
a parent, a DN, RN, and so on. The Fault "code" is an alphanumerical string in the form FXXX. For more
information about fault codes, see the Cisco APIC Faults, Events, and System Messages Management Guide.
In most cases, a fault MO is automatically created, escalated, de-escalated, and deleted by the system as
specific conditions are detected. There can be at most one fault with a given code under an MO. If the same
condition is detected multiple times while the corresponding fault MO is active, no additional instances of
the fault MO are created. For example, if the same condition is detected multiple times for the same affected
object, only one fault is raised while a counter for the recurrence of that fault will be incremented.
A fault MO remains in the system until the fault condition is cleared. For a fault to be removed, the condition
raising the fault must be cleared, whether by configuration or a change in the run time state of the fabric. An
exception to this is if the fault is in the cleared or retained state, in which case the fault can be deleted by the
user by acknowledging it.
Severity provides an indication of the estimated impact of the condition on the capability of the system or
component to provide service.
Possible values are:
Warning (possibly no impact)
Minor
Major
Critical (system or component completely unusable)
Note You can set fault thresholds on statistical measurements such as health scores, data traffic, or temperatures.
Procedure
Step 1 To retrieve the health score for a tenant named "3tierapp", send a REST query to the fabric such as the
following:
Example:
https://apic-ip-address/api/node/mo/uni/tn-3tierapp.xml?query-target=self&rsp-subtreeinclude=
health
Step 2 To retrieve statistics for a tenant named "3tierapp", send a REST query to the fabric such as the following:
Example:
https://apic-ip-address/api/node/mo/uni/tn-3tierapp.xml?query-target=self&rsp-subtreeinclude=
stats
Step 3 To retrieve the faults for a leaf node, send a REST query to the fabric such as the following:
Example:
https://apic-ip-address/api/node/mo/topology/pod-1/node-103.xml?query-target=self&rspsubtree-
include=faults
Statistics
Procedure
Step 1 To create a stats collection policy using the REST API, send a POST request with XML such as the following:
Example:
<monEPGPol name="MonPol1" dn="uni/tn-tenant64/monepg-MonPol1">
<monEPGTarget name="" descr="" scope="eventSevAsnP"/>
<monEPGTarget name="" descr="" scope="faultSevAsnP"/>
<monEPGTarget name="" descr="" scope="fvBD">
<statsHierColl name="" descr="" histRet="inherited" granularity="5min"
adminState="inherited"/>
</monEPGTarget>
<monEPGTarget name="" descr="" scope="syslogRsDestGroup"/>
<monEPGTarget name="" descr="" scope="syslogSrc"/>
<monEPGTarget name="" descr="" scope="fvCtx"/>
<statsHierColl name="" descr="" histRet="none" granularity="1w" adminState="enabled"/>
<statsHierColl name="" descr="" histRet="none" granularity="1qtr" adminState="enabled"/>
<statsHierColl name="" descr="" histRet="1w" granularity="1h" adminState="enabled"/>
<statsHierColl name="" descr="" histRet="1d" granularity="15min" adminState="enabled"/>
<statsHierColl name="" descr="" histRet="none" granularity="1year" adminState="enabled"/>
<statsHierColl name="" descr="" histRet="none" granularity="1mo" adminState="enabled"/>
<statsHierColl name="" descr="" histRet="1h" granularity="5min" adminState="enabled"/>
<statsHierColl name="" descr="" histRet="10d" granularity="1d" adminState="enabled"/>
<syslogSrc name="VRF64_SyslogSource" descr="" minSev="warnings" incl="faults">
<syslogRsDestGroup tDn="uni/fabric/slgroup-tenant64_SyslogDest"/>
</syslogSrc>
</monEPGPol>
Step 2 To configure a stats export policy send a post with XML such as the following (you can use either JSON or
XML format):
Example:
<statsExportP
name="" descr="" frequency="stream" format="xml" compression="gzip">
<statsDestP name="tenant64_statsExportDest" descr="" userName="" remotePort="0"
remotePath="192.168.100.20" protocol="sftp" host="192.168.100.1">
<fileRsARemoteHostToEpg tDn="uni/tn-mgmt/mgmtp-default/oob-default"/>
</statsDestP>
</statsExportP>
Note In the following examples, the assumption is that 1/49 is one of the leaf ports connecting to the spine.
Procedure
Step 1 Clear the blacklist policy from the APIC (using the REST API).
Example:
$APIC_Address/api/policymgr/mo/.xml
<polUni>
<fabricInst>
<fabricOOServicePol>
<fabricRsOosPath tDn="topology/pod-1/paths-$LEAF_Id/pathep-[eth1/49]"
lc="blacklist" status ="deleted" />
</fabricOOServicePol>
</fabricInst>
</polUni>
Step 2 Post a local task to the node itself to bring up the interfaces you want using l1EthIfSetInServiceLTask.
Example:
$LEAF_Address/api/node/mo/topology/pod-1/node-$LEAF_Id/sys/action.xml
<actionLSubj oDn="sys/phys-[eth1/49]">
<l1EthIfSetInServiceLTask adminSt='start'/>
</actionLSubj>
Troubleshooting Contracts and Taboo Contracts with Permit and Deny Logging
Verifying Contracts, Taboo Contracts, and Filters Using the REST API
This topic provides the REST API XML to verify contracts, taboo contracts, and filters.
Procedure
Step 1 Verify a contract for an EPG or an external network with XML such as the following example for a provider:
Example:
QUERY https://apic-ip-address/api/node/class/fvRsProv.xml
Step 2 Verify a contract on an EPG with XML such as the following example for a consumer:
Example:
QUERY https://apic-ip-address/api/node/class/fvRsCons.xml
Step 3 Verify exported contracts using XML such as the following example:
Example:
QUERY https://apic-ip-address/api/node/class/vzCPif.xml
Step 4 Verify contracts for a VRF with XML such as the following example:
Example:
QUERY https://apic-ip-address/api/node/class/vzBrCP.xml
Step 5 Verify taboo contracts with XML such as the following example:
Example:
QUERY https://apic-ip-address/api/node/class/vzTaboo.xml
For taboo contracts for an EPG, use the same query as for contracts for EPGs.
Example:
QUERY https://apic-ip-address/api/node/class/vzFilter.xml
Viewing ACL Permit and Deny Logs Using the REST API
The following example shows how to view permit and deny log data for traffic flows, using the REST API:
Procedure
Procedure
The following example shows how to view DOM statistics on a physical interface, eth1/25 on node-104, using
a REST API query:
GET
https://apic-ip-address/api/node/mo/topology/pod-1/node-104/sys/phys-[eth1/25]/phys/domstats.xml?
query-target=children&target-subtree-class=ethpmDOMRxPwrStats&subscription=yes
The following response is returned:
response : {
"totalCount":"1",
"subscriptionId":"72057611234705430",
"imdata":[
{"ethpmDOMRxPwrStats":{
"attributes":{
"alert":"none",
"childAction":"",
"dn":"topology/pod-1/node-104/sys/phys[eth1/25]/phys/domstats/rxpower",
"hiAlarm":"0.158490",
"hiWarn":"0.079430",
"loAlarm":"0.001050",
"loWarn":"0.002630",
"modTs":"never",
"status":"",
"value":"0.139170"}}}]}
Note In the advanced GUI, port tracking is located under Fabric > Access Policies > Global Policies > Port
Tracking.
In the basic GUI, port tracking is located under System > System Settings > Port Tracking.
Depending on the model of leaf switch, each leaf switch can have 6, 8, or 12 uplink connections to each spine
switch. The port tracking policy specifies the number of uplink connections that trigger the policy, and a delay
timer for bringing the leaf switch access ports back up after the number of specified uplinks is exceeded.
The following example illustrates how a port tracking policy behaves:
The leaf switches each have 6 active uplink connections to the spine switches.
The port tracking policy specifies that the threshold of active uplink connections each leaf switch that
triggers the policy is 2.
The port tracking policy triggers when the number of active uplink connections from the leaf switch to
the spine switches drops to 2.
Each leaf switch monitors its uplink connections and triggers the port tracking policy according to the
threshold specified in the policy.
When the uplink connections come back up, the leaf switch waits for the delay timer to expire before
bringing its access ports back up. This gives the fabric time to reconverge before allowing traffic to
resume on leaf switch access ports. Large fabrics may need the delay timer to be set for a longer time.
Note Use caution when configuring this policy. If the port tracking setting for the number of active spine links
that triggers port tracking is too high, all leaf switch access ports will be brought down.
Procedure
Step 1 Turn on the Port Tracking feature using the REST API as follows (admin state: on):
<polUni>
<infraInfra dn="uni/infra">
<infraPortTrackPol name="default" delay="5" minlinks="4" adminSt="on">
</infraPortTrackPol>
</infraInfra>
</polUni>
Step 2 Turn off the Port Tracking feature using the REST API as follows (admin state: off):
<polUni>
<infraInfra dn="uni/infra">
<infraPortTrackPol name="default" delay="5" minlinks="4" adminSt=off">
</infraPortTrackPol>
</infraInfra>
</polUni>
Procedure
Step 1 Log on to a user account with write access to the object to be removed.
Step 2 Send a POST to the API such as the following example:
POST https://192.168.20.123/api/mo/uni.xml
Payload:<infraAccPortGrp dn="uni/infra/funcprof/accportgrp-__ui_l101_eth1--31"
status="deleted"/>
Note Prior to initiating a change to the cluster, always verify its health. When performing planned changes to
the cluster, all controllers in the cluster should be healthy. If one or more of the APIC controllers' health
status in the cluster is not "fully fit", remedy that situation before proceeding. Also, assure that cluster
controllers added to the APIC are running the same version of firmware as the other controllers in the
APIC cluster. See the Cisco APIC Troubleshooting Guide for more information on resolving APIC cluster
health issues.
cluster, which will require doing a wipe of the controller, then a cluster synchronization to restore a valid
copy of the APIC cluster database from the other APIC controllers in the cluster.
When an APIC cluster is split into two or more groups, the ID of a node is changed and the changes are
not synchronized across all APICs. This can cause inconsistency in the node IDs between APICs and
also the affected leaf nodes may not appear in the inventory in the APIC GUI. When you split an APIC
cluster, decommission the affected leaf nodes from APIC and register them again, so that the inconsistency
in the node IDs is resolved and the health status of the APICs in a cluster are in a fully fit state
Note Cluster expansion stops if an existing APIC controller becomes unavailable. Resolve
this issue before attempting to proceed with the cluster expansion.
Depending on the amount of data the APIC must synchronize upon the addition of each appliance, the
time required to complete the expansion could be more than 10 minutes per appliance. Upon successful
expansion of the cluster, the APIC operational size and the target size will be equal.
Note Allow the APIC to complete the cluster expansion before making additional changes
to the cluster.
During cluster expansion, regardless of in which order you physically connect the APIC controllers, the
discovery and expansion takes place sequentially based on the APIC ID numbers. For example, APIC2 is
discovered after APIC1, and APIC3 is discovered after APIC2 and so on until you add all the desired APICs
to the cluster. As each sequential APIC is discovered, a single data path or multiple data paths are established,
and all the switches along the path join the fabric. The expansion process continues until the operational cluster
size reaches the equivalent of the administrative cluster size.
Procedure
Step 1 Set the target cluster size to expand the APIC cluster size.
Example:
POST
https://<IP address>/api/node/mo/uni/controller.xml
<infraClusterPol name='default' size=3/>
Step 2 Physically connect the APIC controllers that you want to add to the cluster.
Procedure
Step 1 Set the target cluster size so as to contract the APIC cluster size.
Example:
POST
https://<IP address>/api/node/mo/uni/controller.xml
<infraClusterPol name='default' size=1/>
Step 2 Decommission APIC3 on APIC1 for cluster contraction.
Example:
POST
https://<IP address>/api/node/mo/topology/pod-1/node-1/av.xml
<infraWiNode id=3 adminSt='out-of-service'/>
Step 3 Decommission APIC2 on APIC1 for cluster contraction.
Example:
POST
https://<IP address>/api/node/mo/topology/pod-1/node-1/av.xml
<infraWiNode id=2 adminSt='out-of-service'/>
After switching over a standby APIC to active, if it was the only standby, you must configure a new
standby.
The following limitations are observed for retaining out of band address for standby APIC after a fail
over.
Standby(new active) APIC may not retain its out of band address if more than 1 active APICs are
down or unavailable.
Standby(new active) APIC may not retain its out of band address if it is in a different subnet than
active APIC.
Standby(new active) APIC may not retain its IPv6 out of band address.
Note In case you observe any of the limitations, in order to retain standby APICs out of band
address, you must manually change the OOB policy for replaced APIC after the replace
operation is completed successfully.
It is recommended to keep standby APICs in same POD as the active APICs it may replace.
Switching Over Active APIC with Standby APIC Using REST API
Use this procedure to switch over an active APIC with standby APIC using REST API.
Procedure
Example:
https://ip address/api/node/mo/topology/pod-1/node-1/av.xml
<infraWiNode id=2 targetMbSn=FCH1750V00Q/>
Creating a Tenant, VRF, and Bridge Domain Using the REST API
Procedure
Example:
POST https://apic-ip-address/api/mo/uni.xml
<fvTenant name="ExampleCorp"/>
When the POST succeeds, you see the object that you created in the output.
Step 2 Create a VRF and bridge domain.
Note The Gateway Address can be an IPv4 or an IPv6 address. For more about details IPv6 gateway
address, see the related KB article, KB: Creating a Tenant, VRF, and Bridge Domain with IPv6
Neighbor Discovery .
Example:
URL for POST: https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
<fvTenant name="ExampleCorp">
<fvCtx name="pvn1"/>
<fvBD name="bd1">
<fvRsCtx tnFvCtxName="pvn1"/>
<fvSubnet ip="10.10.100.1/24"/>
</fvBD>
</fvTenant>
Note If you have a public subnet when you configure the routed outside, you must associate the bridge
domain with the outside configuration.
Disadvantages:
Tenant address space must be unique
Configuring Multiple Private Networks with Inter-Tenant Communication Using the REST API
Configure the Cisco-1 and Cisco-2 private networks, with communication between them, using the REST
API in the following steps:
Procedure
Step 1 Configure Cisco-1 tenant using the following XML posted to the APIC REST API:
Example:
<fvTenant dn="uni/tn-Cisco1" name="Cisco1">
<fvRsBd tnFvBDName="CiscoBD"/>
<fvRsProv matchT="AtleastOne" tnVzBrCPName="ICMP"/>
</fvAEPg>
</fvAp>
</fvTenant>
<fvRsBd tnFvBDName="CiscoBD"/>
<fvRsProv matchT="AtleastOne" tnVzBrCPName="ICMP"/>
</fvAEPg>
</fvAp>
</fvTenant>
Step 2 Configure Cisco-2 tenanat using the following XML posted to the APIC REST API:
Example:
<fvTenant dn="uni/tn-Cisco2" name="Cisco2">
<fvCtx knwMcastAct="permit" name="CiscoCtx" pcEnfPref="enforced"/>
<fvBD arpFlood="yes" mac="00:22:BD:F8:19:FF" name="CiscoBD2" unicastRoute="yes"
unkMacUcastAct="flood" unkMcastAct="flood">
<fvRsCtx tnFvCtxName="CiscoCtx"/>
</fvBD>
<fvBD arpFlood="yes" name="CiscoBD" unicastRoute="yes" unkMacUcastAct="flood"
unkMcastAct="flood">
<fvRsCtx tnFvCtxName="CiscoCtx"/>
</fvBD>
<fvAp name="CCO">
<fvAEPg matchT="AtleastOne" name="EPG2">
<fvRsPathAtt encap="vlan-1202" instrImedcy="immediate" mode="native"
tDn="topology/pod-1/paths-201/pathep-[eth1/2]"/>
<fvSubnet ip="172.16.1.1/24" scope="private,shared"/>
<fvRsBd tnFvBDName="CiscoBD"/>
<fvRsConsIf matchT="AtleastOne" tnVzBrCPIfName="ICMP"/>
</fvAEPg>
</fvAp>
</fvTenant>
Disadvantages:
EPGs residing in overlapping subnets cannot have policy applied between one another
The object containment for this particular setup can be depicted as shown below:
Configuring Multiple Tenants with Intra-Tenant Communication Using the REST API
Procedure
Configure the Tenant Cisco, with Cisco-1 and Cisco-2 networks, using the following XML posted to the APIC
REST API:
Example:
<fvTenant dn="uni/tn-Cisco" name="Cisco">
<vzBrCP name="ICMP" scope="tenant">
<vzSubj consMatchT="AtleastOne" name="icmp" provMatchT="AtleastOne"
revFltPorts="yes">
<vzRsSubjFiltAtt tnVzFilterName="icmp"/>
</vzSubj>
</vzBrCP>
<fvCtx knwMcastAct="permit" name="CiscoCtx" pcEnfPref="enforced"/>
<fvCtx knwMcastAct="permit" name="CiscoCtx2" pcEnfPref="enforced"/>
<fvBD arpFlood="yes" mac="00:22:BD:F8:19:FF" name="CiscoBD2" unicastRoute="yes"
unkMacUcastAct="flood" unkMcastAct="flood">
<fvRsCtx tnFvCtxName="CiscoCtx2"/>
</fvBD>
<fvBD arpFlood="yes" mac="00:22:BD:F8:19:FF" name="CiscoBD" unicastRoute="yes"
unkMacUcastAct="flood" unkMcastAct="flood">
<fvRsCtx tnFvCtxName="CiscoCtx"/>
</fvBD>
<fvAp name="CCO">
<fvAEPg matchT="AtleastOne" name="Web">
<fvRsCons tnVzBrCPName="ICMP"/>
<fvRsPathAtt encap="vlan-1201" instrImedcy="immediate" mode="native"
tDn="topology/pod-1/paths-201/pathep-[eth1/16]"/>
<fvSubnet ip="172.16.2.1/24" scope="private,shared"/>
<fvRsDomAtt instrImedcy="lazy" resImedcy="lazy" tDn="uni/phys-
PhysDomainforCisco"/>
<fvRsBd tnFvBDName="CiscoBD2"/>
</fvAEPg>
<fvAEPg matchT="AtleastOne" name="App">
<fvRsPathAtt encap="vlan-1202" instrImedcy="immediate" mode="native"
tDn="topology/pod-1/paths-202/pathep-[eth1/2]"/>
<fvSubnet ip="172.16.1.1/24" scope="private,shared"/>
<fvRsDomAtt instrImedcy="lazy" resImedcy="lazy" tDn="uni/phys-
PhysDomainforCisco"/>
<fvRsBd tnFvBDName="CiscoBD"/>
<fvRsProv matchT="AtleastOne" tnVzBrCPName="ICMP"/>
</fvAEPg>
</fvAp>
</fvTenant>
model constructs are rendered into the XML code. The following figure provides an overview of the tenant
policy example.
In the figure, according to the contract called webCtrct and the EPG labels, the green-labeled EPG:web1 can
communicate with green-labeled EPG:app using both http and https, the red -abeled EPG:web2 can
communicate with the red-labeled EPG:db using only https.
<vzFilter name="Http">
<vzEntry name="e1"
etherT="ipv4"
prot="tcp"
dFromPort="80"
dToPort="80"/>
</vzFilter>
<vzFilter name="Https">
<vzEntry name="e1"
etherT="ipv4"
prot="tcp"
dFromPort="443"
dToPort="443"/>
</vzFilter>
<vzBrCP name="webCtrct">
<vzSubj name="http" revFltPorts="true" provmatchT="All">
<vzRsSubjFiltAtt tnVzFilterName="Http"/>
<vzRsSubjGraphAtt graphName="G1" termNodeName="TProv"/>
<vzProvSubjLbl name="openProv"/>
<vzConsSubjLbl name="openCons"/>
</vzSubj>
<vzSubj name="https" revFltPorts="true" provmatchT="All">
<vzProvSubjLbl name="secureProv"/>
<vzConsSubjLbl name="secureCons"/>
< vzRsSubjFiltAtt tnVzFilterName="Https"/>
<vzRsOutTermGraphAtt graphName="G2" termNodeName="TProv"/>
</vzSubj>
</vzBrCP>
<fvCtx name="solarctx1"/>
<fvBD name="solarBD1">
<fvRsCtx tnFvCtxName="solarctx1" />
<fvSubnet ip="11.22.22.20/24">
<fvRsBDSubnetToProfile
tnL3extOutName="rout1"
tnRtctrlProfileName="profExport"/>
</fvSubnet>
<fvSubnet ip="11.22.22.211/24">
<fvRsBDSubnetToProfile
tnL3extOutName="rout1"
tnRtctrlProfileName="profExport"/>
</fvSubnet>
</fvBD>
<fvAp name="sap">
<fvAEPg name="web1">
<fvRsBd tnFvBDName="solarBD1" />
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-mininet" />
<fvRsProv tnVzBrCPName="webCtrct" matchT="All">
<vzProvSubjLbl name="openProv"/>
<vzProvSubjLbl name="secureProv"/>
<vzProvLbl name="green"/>
</fvRsProv>
</fvAEPg>
<fvAEPg name="web2">
<fvRsBd tnFvBDName="solarBD1" />
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-mininet" />
<fvRsProv tnVzBrCPName="webCtrct" matchT="All">
<vzProvSubjLbl name="secureProv"/>
<vzProvLbl name="red"/>
</fvRsProv>
</fvAEPg>
<fvAEPg name="app">
<fvRsBd tnFvBDName="solarBD1" />
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-mininet" />
<fvRsCons tnVzBrCPName="webCtrct">
<vzConsSubjLbl name="openCons"/>
<vzConsSubjLbl name="secureCons"/>
<vzConsLbl name="green"/>
</fvRsCons>
</fvAEPg>
<fvAEPg name="db">
<fvRsBd tnFvBDName="solarBD1" />
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-mininet" />
<fvRsCons tnVzBrCPName="webCtrct">
<vzConsSubjLbl name="secureCons"/>
<vzConsLbl name="red"/>
</fvRsCons>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
Policy Universe
The policy universe contains all the tenant-managed objects where the policy for each tenant is defined.
<polUni>
This starting tag, <polUni>, in the first line indicates the beginning of the policy universe element. This tag
is matched with </polUni> at the end of the policy. Everything in between is the policy definition.
All of the policies for this tenant are defined in this element. The name of the tenant in this example is solar.
The tenant name must be unique in the system. The primary elements that the tenant contains are filters,
contracts, outside networks, bridge domains, and application profiles that contain EPGs.
Filters
The filter element starts with a <vzFilter> tag and contains elements that are indicated with a <vzEntry>
tag.
The following example defines "Http" and "Https" filters. The first attribute of the filter is its name and the
value of the name attribute is a string that is unique to the tenant. These names can be reused in different
tenants. These filters are used in the subject elements within contracts later on in the example.
<vzFilter name="Http">
<vzEntry name="e1" etherT="ipv4" prot="tcp" dFromPort="80" dToPort="80"/>
</vzFilter>
<vzFilter name="Https">
<vzEntry name="e1" etherT="ipv4" prot="tcp" dFromPort="443" dToPort="443"/>
</vzFilter>
This example defines these two filters: Http and Https. The first attribute of the filter is its name and the value
of the name attribute is a string that is unique to the tenant, i.e. these names can be reused in different tenants.
These filters will be used in the subject elements within contracts later on in the example.
Each filter can have one or more entries where each entry describes a set of Layer 4 TCP or UDP port numbers.
Some of the possible attributes of the <vzEntry> element are as follows:
name
prot
dFromPort
dToPort
sFromPort
sToPort
etherT
ipFlags
arpOpc
tcpRules
In this example, each entrys name attribute is specified. The name is an ASCII string that must be unique
within the filter but can be reused in other filters. Because this example does not refer to a specific entry later
on, it is given a simple name of e1.
The EtherType attribute, etherT, is next. It is assigned the value of ipv4 to specify that the filter is for IPv4
packets. There are many other possible values for this attribute. Common ones include ARP, RARP, andIPv6.
The default is unspecified so it is important to assign it a value.
Following the EtherType attribute is the prot attribute that is set to tcp to indicate that this filter is for TCP
traffic. Alternate protocol attributes include udp, icmp, and unspecified (default).
After the protocol, the destination TCP port number is assigned to be in the range from 80 to 80 (exactly TCP
port 80) with the dFromPort and dToPort attributes. If the from and to are different, they specify a range of
port numbers.
In this example, these destination port numbers are specified with the attributes dFromPort and dToPort.
However, when they are used in the contract, they should be used for the destination port from the TCP client
to the server and as the source port for the return traffic. See the attribute revFltPorts later in this example
for more information.
The second filter does essentially the same thing, but for port 443 instead.
Filters are referred to by subjects within contracts by their target distinguished name, tDn. The tDn name is
constructed as follows:
uni/tn-<tenant name>/flt-<filter name>
For example, the tDn of the first filter above is uni/tn-coke/flt-Http. The second filter has the name
uni/tn-coke/flt-Https. In both cases, solar comes from the tenant name.
Contracts
The contract element is tagged vzBrCP and it has a name attribute.
<vzBrCP name="webCtrct">
<vzSubj name="http" revFltPorts="true" provmatchT="All">
<vzRsSubjFiltAtt tnVzFilterName="Http"/>
<vzRsSubjGraphAtt graphName="G1" termNodeName="TProv"/>
<vzProvSubjLbl name="openProv"/>
<vzConsSubjLbl name="openCons"/>
</vzSubj>
<vzSubj name="https" revFltPorts="true" provmatchT="All">
<vzProvSubjLbl name="secureProv"/>
<vzConsSubjLbl name="secureCons"/>
<vzRsFiltAtt tnVzFilterName="Https "/>
<vzRsOutTermGraphAtt graphName="G2" termNodeName="TProv"/>
</vzSubj>
</vzBrCP>
Contracts are the policy elements between EPGs. They contain all of the filters that are applied between EPGs
that produce and consume the contract. The contract element is tagged vzBrCP and it has a name attribute.
Refer to the object model reference documentation for other attributes that can be used in the contract element.
This example has one contract named webCtrct.
The contract contains multiple subject elements where each subject contains a set of filters. In this example,
the two subjects are http and https.
The contract is later referenced by EPGs that either provide or consume it. They reference it by its name in
in the following manner:
uni/tn-[tenant-name]/brc-[contract-name]
tenant-name is the name of the tenant, solar in this example, and the contract-name is the name of the
contract. For this example, the tDn name of the contract is uni/tn-solar/brc-webCtrct.
Subjects
The subject element starts with the tag vzSubj and has three attributes: name, revFltPorts, and matchT. The
name is simply the ASCII name of the subject.
revFltPorts is a flag that indicates that the Layer 4 source and destination ports in the filters of this subject
should be used as specified in the filter description in the forward direction (that is, in the direction of from
consumer to producer EPG), and should be used in the opposite manner for the reverse direction. In this
example, the http subject contains the Http filter that defined TCP destination port 80 and did not specify
the source port. Because the revFltPorts flag is set to true, the policy will be TCP destination port 80 and
any source port for traffic from the consumer to the producer, and it will be TCP destination port any and
source port 80 for traffic from the producer to the consumer. The assumption is that the consumer initiates
the TCP connection to the producer (the consumer is the client and the producer is the server).
The default value for the revFltPrts attribute is false if it is not specified.
Labels
The match type attribute, provmatchT (for provider matching) and consmatchT (for consumer matching)
determines how the subject labels are compared to determine if the subject applies for a given pair of consumers
and producers. The following match type values are available:
All
AtLeastOne (default)
None
ExactlyOne
When deciding whether a subject applies to the traffic between a producer and consumer EPG, the match
attribute determines how the subject labels that are defined (or not) in those EPGs should be compared to the
labels in the subject. If the match attribute value is set to All, it only applies to the providers whose provider
subject labels, vzProvSubjLbl, match all of the vzProvSubjLbl labels that are defined in the subject. If two
labels are defined, both must also be in the provider. If a provider EPG has 10 labels, as long as all of the
provider labels in the subject are present, a match is confirmed. A similar criteria is used for the consumers
that use the vzConsSubjLbl. If the matchT attribute value is AtLeastOne, only one of the labels must match.
If the matchT attribute is None, the match only occurs if none of the provider labels in the subject match the
provider labels of the provider EPGs and similarly for the consumer.
If the producer or consumer EPGs do not have any subject labels and the subject does not have any labels, a
match occurs for All, AtLeastOne, and None (if you do not use labels, the subject is used and the matchT
attribute does not matter).
An optional attribute of the subject not shown in the example is prio where the priority of the traffic that
matches the filter is specified. Possible values are gold, silver, bronze, or unspecified (default).
In the example, the subject element contains references to filter elements, subject label elements, and graph
elements. <vzRsSubjFiltAtt tDn=uni/tn-coke/flt-Http/> is a reference to a previously defined filter.
This element is identified by the vzRsSubjFiltAtt tag.
<vzRsSubjGraphAtt graphName=G1 termNodeName=TProv/> defines a terminal connection.
<vzProvSubjLbl name=openProv/> defines a provider label named openProv. The label is used to qualify
or filter which subjects get applied to which EPGs. This particular one is a provider label and the corresponding
consumer label is identified by the tag vzConsSubjLbl. These labels are matched with the corresponding label
of the provider or consumer EPG that is associated with the current contract. If a match occurs according to
the matchT criteria described above, a particular subject applies to the EPG. If no match occurs, the subject
is ignored.
Multiple provider and consumer subject labels can be added to a subject to allow more complicated matching
criteria. In this example, there is just one label of each type on each subject. However, the labels on the first
subject are different from the labels on the second subject, which allows these two subjects to be handled
differently depending on the labels of the corresponding EPGs. The order of the elements within the subject
element does not matter.
VRF
The Virtual Routing and Forwarding (VRF) (also known as a context or private network) is identified by the
fvCtx tag and contains a name attribute.
A tenant can contain multiple VRFs. For this example, the tenant uses one VRF named solartx1. The name
must be unique within the tenant.
The VRF defines a Layer 3 address domain. All of the endpoints within the Layer 3 domain must have unique
IPv4 or IPv6 addresses, because it is possible to directly forward packets between these devices if the policy
allows it.
Although a VRF defines a unique IP address space, the corresponding subnets are defined within bridge
domains. Each bridge domain is then associated with the VRF.
Bridge Domains
The bridge domain element is identified with the fvBD tag and has a name attribute.
<fvBD name="solarBD1">
<fvRsCtx tnFvCtxName="solarctx1" />
<fvSubnet ip="11.22.22.20/24">
<fvRsBDSubnetToProfile
tnL3extOutName="rout1"
tnRtctrlProfileName="profExport" />
</fvSubnet>
<fvSubnet ip="11.22.23.211/24">
<fvRsBDSubnetToProfile
tnL3extOutName="rout1"
tnRtctrlProfileName="profExport"/>
</fvSubnet>
</fvBD>
Within the bridge domain element, subnets are defined and a reference is made to the corresponding Virtual
Routing and Forwarding (VRF) instance (also known as a context or private network). Each bridge domain
must be linked to a VRF and have at least one subnet.
This example uses one bridge domain named solarBD1. In this example, the solarctx1 VRF is referenced
by using the element tagged fvRsCtx and the tnFvCtxName attribute is given the value solarctx1. This name
comes from the VRF defined above.
The subnets are contained within the bridge domain and a bridge domain can contain multiple subnets. This
example defines two subnets. All of the addresses used within a bridge domain must fall into one of the address
ranges that is defined by the subnets. However, the subnet can also be a supernet which is a very large subnet
that includes many addresses that might never be used. Specifying one giant subnet that covers all current
future addresses can simplify the bridge domain specification. However, different subnets must not overlap
within a bridge domain or with subnets defined in other bridge domains that are associated with the same
VRF. Subnets can overlap with other subnets that are associated with other VRFs.
The subnets described above are 11.22.22.xx/24 and 11.22.23.xx/24. However, the full 32 bits of the address
is given even though the mask says that only 24 are used, because this IP attribute also identifies the full IP
address for the router in that subnet. In the first case, the router IP address (default gateway) is 11.22.22.20
and for the second subnet, it is 11.22.23.211.
The entry 11.22.22.20/24 is equivalent to the following, but in compact form:
Subnet: 11.22.22.00
Subnet Mask: 255.255.255.0
Default gateway: 11.22.22.20
Application Profiles
The start of the application profile is indicated by the fvAp tag and has a name attribute.
<fvAp name="sap">
This example has one application network profile and it is named sap.
The application profile is a container that holds the EPGs. EPGs can communicate with other EPGs in the
same application profile and with EPGs in other application profiles. The application profile is simply a
convenient container that is used to hold multiple EPGs that are logically related to one another. They can be
organized by the application they provide such as sap, by the function they provide such as infrastructure,
by where they are in the structure of the data center such as DMZ, or whatever organizing principle the
administrator chooses to use.
The primary object that the application profile contains is an endpoint group (EPG). In this example, the sap
application profile contains 4 EPGs: web1, web2, app, and db.
<fvAEPg name="web1">
<fvRsBd tnFvBDName="solarBD1" />
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-mininet" />
<fvRsProv tnVzBrCPName="webCtrct" matchT ="All">
<vzProvSubjLbl name="openProv"/>
<vzProvSubjLbl name="secureProv"/>
<vzProvLbl name="green"/>
</fvRsProv>
</fvAEPg>
The EPG is the most important fundamental object in the policy model. It represents a collection of endpoints
that are treated in the same fashion from a policy perspective. Rather than configure and manage those endpoints
individually, they are placed within an EPG and are managed as a collection or group.
The EPG object is where labels are defined that govern what policies are applied and which other EPGs can
communicate with this EPG. It also contains a reference to the bridge domain that the endpoints within the
EPG are associated with as well as which virtual machine manager (VMM) domain they are associated with.
VMM allows virtual machine mobility between two VM servers instantaneously with no application downtime.
The first EPG in the example is named web1. The fvRsBd element within the EPG defines which bridge
domain that it is associated with. The bridge domain is identified by the value of the tnFxBDName attribute.
This EPG is associated with the solarBD1 bridge domain named in the Bridge Domain section above. The
binding to the bridge domain is used by the system to understand what the default gateway address should be
for the endpoints in this EPG. It does not imply that the endpoints are all in the same subnet or that they can
only communicate through bridging. Whether an endpoints packets are bridged or routed is determined by
whether the source endpoint sends the packet to its default gateway or the final destination desired. If it sends
the packet to the default gateway, the packet is routed.
The VMM domain used by this EPG is identified by the fvRsDomAtt tag. This element references the VMM
domain object defined elsewhere. The VMM domain object is identified by its tDn name attribute. This
example shows only one VMM domain called uni/vmmp-VMware/dom-mininet.
The next element in the web1 EPG defines which contract this EPG provides and is identified by the fvRsProv
tag. If web1 were to provide multiple contracts, there would be multiple fvRsProv elements. Similarly, if it
were to consume one or more contracts, there would be fvRsCons elements as well.
The fvRsProv element has a required attribute that is the name of the contract that is being provided. web1
is providing the contract webCtrct that was defined earlier that was called tDn=uni/tn-coke/brc-webCtrct.
The next attribute is the matchT attribute, which has the same semantics for matching provider or consumer
labels as it did in the contract for subject labels (it can take on the values of All, AtLeastOne, or None). This
criteria applies to the provider labels as they are compared to the corresponding consumer labels. A match of
the labels implies that the consumer and provider can communicate if the contract between them allows it. In
other words, the contract has to allow communication and the consumer and provider labels have to match
using the match criteria specified at the provider.
The consumer has no corresponding match criteria. The match type used is always determined by the provider.
Inside the provider element, fvRsProv, an administrator needs to specify the labels that are to be used. There
are two kinds of labels, provider labels and provider subject labels. The provider labels, vzProvLbl, are used
to match consumer labels in other EPGs that use the matchT criteria described earlier. The provider subject
labels, vzProvSubjLbl, are used to match the subject labels that are specified in the contract. The only attribute
of the label is its name attribute.
In the web1 EPG, two provider subject labels, openProv and secureProv, are specified to match with the
http and https subjects of the webCtrct contract. One provider label, green is specified with a match
criteria of All that will match with the same label in the App EPG.
The next EPG in the example, web2, is very similar to web1 except that there is only one vzProvSubjLbl
and the labels themselves are different.
The third EPG is one called app and it is defined as follows:
<fvAEPg name="app">
<fvRsBd tnFvBDName="solarBD1" />
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-mininet" />
<fvRsCons tnVzBrCPName="webCtrct">
<vzConsSubjLbl name="openCons"/>
<vzConsSubjLbl name="secureCons"/>
<vzConsLbl name="green"/>
</fvRsCons>
</fvAEPg>
The first part is nearly the same as the web1 EPG. The major difference is that this EPG is a consumer of
the webCtrct and has the corresponding consumer labels and consumer subject labels. The syntax is nearly
the same except that Prov is replaced by Cons in the tags. There is no match attribute in the FvRsCons
element because the match type for matching the provider with consumer labels is specified in the provider.
In the last EPG, db is very similar to the app EPG in that it is purely a consumer.
While in this example, the EPGs were either consumers or producers of a single contract, it is typical for an
EPG to be at once a producer of multiple contracts and a consumer of multiple contracts.
Closing
</fvAp>
</fvTenant>
</polUni>
The final few lines complete the policy.
The four EPGs are named EPG:web1, EPG:web2, EPG:app, and EPG:db. EPG:web1 and EPG:web2 provide
a contract called webCtrct. EPG:app and EPG:db consume that same contract.
EPG:web1 can only communicate with EPG:app and EPG:web2 can only communicate with EPG:db. This
interaction is controlled through the provider and consumer labels green and red.
When EPG:web1 communicates with EPG:app, they use the webCtrct contract. EPG:app can initiate connections
to EPG:web1 because it consumes the contract that EPG:web1 provides.
The subjects that EPG:web1 and EPG:app can use to communicate are both http and https because EPG:web1
has the provider subject label openProv and the http subject also has it. EPG:web1 has the provider subject
label secureProv as does the subject https. In a similar fashion, EPG:app has subject labels openCons and
secureCons that subjects http and https have.
When EPG:web2 communicates with EPG:db, they can only use the https subject because only the https
subject carries the provider and consumer subject labels. EPG:db can initiate the TCP connection to EPG:web2
because EPG:db consumes the contract provided by EPG:web2.
The example policy specifies the relationship between EPGs, application profiles, bridge domains, and Layer
3 Virtual Routing and Forwarding (VRF) instances in the following manner: the EPGs EPG:web1, EPG:web2,
EPG:app, and EPG:db are all members of the application profile called sap.
These EPGs are also linked to the bridge domain solarBD1. solarBD1 has two subnets, 11.22.22.XX/24 and
11.22.23.XX/24. The endpoints in the four EPGs must be within these two subnet ranges. The IP address of
the default gateway in those two subnets will be 11.22.22.20 and 11.22.23.211. The solarBD1 bridge domain
is linked to the solarctx1 Layer 3 VRF.
All these policy details are contained within a tenant called solar.
EPGs
Deploying an Application EPG through an AEP or Interface Policy Group to Multiple Ports
Through the APIC Advanced GUI and REST API, you can associate attached entity profiles directly with
application EPGs. By doing so, you deploy the associated application EPGs to all those ports associated with
the attached entity profile in a single configuration.
Through the APIC REST API or the NX-OS style CLI, you can deploy an application EPG to multiple ports
through an Interface Policy Group.
Deploying an EPG on a Specific Port with APIC Using the REST API
Before You Begin
The tenant where you deploy the EPG is created.
Procedure
Example:
<fvTenant name="<tenant_name>" dn="uni/tn-test1" >
<fvCtx name="<network_name>" pcEnfPref="enforced" knwMcastAct="permit"/>
<fvBD name="<bridge_domain_name>" unkMcastAct="flood" >
<fvRsCtx tnFvCtxName="<network_name>"/>
</fvBD>
<fvAp name="<application_profile>" >
<fvAEPg name="<epg_name>" >
<fvRsPathAtt tDn="topology/pod-1/paths-1017/pathep-[eth1/13]" mode="regular"
instrImedcy="immediate" encap="vlan-20"/>
</fvAEPg>
</fvAp>
</fvTenant>
Deploying an EPG through an AEP to Multiple Interfaces Using the REST API
The interface selectors in the AEP enable you to configure multiple paths for an AEPg. The following can be
selected:
1 A node or a group of nodes
2 An interface or a group of interfaces
The interfaces consume an interface policy group (and so an infra:AttEntityP).
3 The infra:AttEntityP is associated to the AEPg, thus specifying the VLANs to use.
An infra:AttEntityP can be associated with multiple AEPgs with different VLANs.
When you associate the infra:AttEntityP with the AEPg, as in 3, this deploys the AEPg on the nodes selected
in 1, on the interfaces in 2, with the VLAN provided by 3.
In this example, the AEPg uni/tn-Coke/ap-AP/epg-EPG1 is deployed on interfaces 1/10, 1/11, and 1/12 of
nodes 101 and 102, with vlan-102.
Procedure
To deploy an AEPg on selected nodes and interfaces, send a post with XML such as the following:
Example:
<infraInfra dn="uni/infra">
<infraNodeP name=NodeProfile">
<infraLeafS name=NodeSelector" type="range">
<infraNodeBlk name=NodeBlok" from_="101" to_=102/>
<infraRsAccPortP tDn="uni/infra/accportprof-InterfaceProfile"/>
</infraLeafS>
</<infraNodeP>
<infraAccPortP name="InterfaceProfile">
<infraHPortS name="InterfaceSelector" type="range">
<infraPortBlk name= InterfaceBlock" fromCard="1" toCard="1" fromPort="10"
toPort=12"/>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-PortGrp" />
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccPortGrp name="PortGrp>
<infraRsAttEntP tDn="uni/infra/attentp-AttEntityProfile"/>
</infraAccPortGrp>
</infraFuncP>
Creating AEP, Domains, and VLANs to Deploy an EPG on a Specific Port Using the REST API
Before You Begin
The tenant where you deploy the EPG is already created.
An EPG is statically deployed on a specific port.
Procedure
Step 1 Create the interface profile, switch profile and the Attach Entity Profile (AEP).
Example:
<infraInfra>
<infraAccPortP name="<interface_profile_name>"
dn="uni/infra/accportprof-<interface_profile_name>" >
<infraHPortS name="portSelector" type="range">
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-<port_group_name>"
fexId="101"/>
<infraPortBlk name="block2" toPort="13" toCard="1" fromPort="11"
fromCard="1"/>
</infraHPortS>
</infraAccPortP>
<infraAccPortGrp name="<port_group_name>"
dn="uni/infra/funcprof/accportgrp-<port_group_name>" >
<infraRsAttEntP tDn="uni/infra/attentp-<attach_entity_profile_name>"/>
<infraRsHIfPol tnFabricHIfPolName="1GHifPol"/>
</infraAccPortGrp>
<infraAttEntityP name="<attach_entity_profile_name>"
dn="uni/infra/attentp-<attach_entity_profile_name>" >
<infraRsDomP tDn="uni/phys-<physical_domain_name>"/>
</infraAttEntityP>
<infraInfra>
Step 2 Create a domain.
Example:
<physDomP name="<physical_domain_name>" dn="uni/phys-<physical_domain_name>">
<infraRsVlanNs tDn="uni/infra/vlanns-[<vlan_pool_name>]-static"/>
</physDomP>
Step 3 Create a VLAN range.
Example:
<fvnsVlanInstP name="<vlan_pool_name>" dn="uni/infra/vlanns-[<vlan_pool_name>]-static"
allocMode="static">
<fvnsEncapBlk name="" descr="" to="vlan-25" from="vlan-10"/>
</fvnsVlanInstP>
Step 4 Associate the EPG with the domain.
Example:
<fvTenant name="<tenant_name>" dn="uni/tn-" >
<fvAEPg prio="unspecified" name="<epg_name>" matchT="AtleastOne"
dn="uni/tn-test1/ap-AP1/epg-<epg_name>" descr="">
<fvRsDomAtt tDn="uni/phys-<physical_domain_name>" instrImedcy="immediate"
resImedcy="immediate"/>
</fvAEPg>
</fvTenant>
Intra-EPG Isolation
Servers behind a load balancer have the same communication requirements, but isolating them from
each other protects against a server that is compromised or infected.
Bare metal EPG isolation is enforced at the leaf switch. Bare metal servers use VLAN encapsulation. All
unicast, multicast and broadcast traffic is dropped (denied) within isolation enforced EPGs. ACI bridge-domains
can have a mix of isolated and regular EPGs. Each Isolated EPG can have multiple VLANs where intra-vlan
traffic is denied.
Configuring Intra-EPG Isolation for Bare Metal Servers Using the REST API
Before You Begin
The port the EPG uses must be associated with a bare metal server interface in the physical domain.
Procedure
Step 1 Send this HTTP POST message to deploy the application using the XML API.
Example:
POST https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
Step 2 Include this XML structure in the body of the POST message.
Example:
<fvTenant name="Tenant_BareMetal" >
<fvAp name="Web">
<fvAEPg name="IntraEPGDeny" pcEnfPref="enforced">
<!-- pcEnfPref="enforced" ENABLES ISOLATION-->
<fvRsBd tnFvBDName="bd" />
Note When intra-EPG isolation is not enforced, the VLAN-pri value is ignored even if it is specified in the
configuration.
VLAN-pri/VLAN-sec pairs for the vDS switch are selected per VMM domain during the EPG-to-domain
association. The port group created for the intra-EPG isolation EPGs uses the VLAN-sec tagged with type
set to PVLAN. The vDS and fabric swap the VLAN-pri/VLAN-sec encapsulation:
Communication from the ACI fabric to the vDS switch uses VLAN-pri.
Communication from the vDS switch to the ACI fabric uses VLAN-sec.
Related Topics
For information on configuring intra-EPG isolation in a Cisco AVS environment, see Intra-EPG Isolation
Enforcement for Cisco AVS.
Configuring Intra-EPG Isolation for VMware vDS using the REST API
Before You Begin
Procedure
Step 1 Send this HTTP POST message to deploy the application using the XML API.
Example:
POST https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
Step 2 For a VMware vDS VMM deployment, include this XML structure in the body of the POST message.
Example:
<fvTenant name="Tenant_VMM" >
<fvAp name="Web">
<fvAEPg name="IntraEPGDeny" pcEnfPref="enforced">
<!-- pcEnfPref="enforced" ENABLES ISOLATION-->
<fvRsBd tnFvBDName="bd" />
<fvRsPathAtt tDn="topology/pod-1/paths-1017/pathep-[eth1/2]" encap="vlan-51"
primaryEncap="vlan-100" instrImedcy='immediate'/>
<!-- STATIC ENCAP ASSOCIATION TO VMM DOMAIN-->
<fvRsDomAtt encap="vlan-2001" instrImedcy="lazy" primaryEncap="vlan-2002"
resImedcy="immediate" tDn="uni/vmmp-VMware/dom-DVS1>
</fvAEPg>
</fvAp>
</fvTenant>
Note Using intra-EPG isolation on a Cisco AVS microsegment (uSeg) EPG is not currently supported.
Communication will be possible between two endpoints that reside in separate uSeg EPGs if either has
intra-EPG isolation enforced, regardless of any contract that exists between the two EPGs.
Configuring Intra-EPG Isolation for Cisco AVS Using the REST API
Before You Begin
Make sure that Cisco AVS is in VXLAN mode.
Procedure
Step 1 Send this HTTP POST message to deploy the application using the XML API.
Example:
POST
https://192.0.20.123/api/mo/uni/tn-ExampleCorp.xml
Step 2 For a VMM deployment, include the XML structure in the following example in the body of the POST
message.
Example:
Example:
<fvTenant name="Tenant_VMM" >
<fvAp name="Web">
<fvAEPg name="IntraEPGDeny" pcEnfPref="enforced">
<!-- pcEnfPref="enforced" ENABLES ISOLATION-->
<fvRsBd tnFvBDName="bd" />
<fvRsDomAtt encap="vlan-2001" tDn="uni/vmmp-VMware/dom-DVS1>
</fvAEPg>
</fvAp>
</fvTenant>
What to Do Next
You can select statistics and view them to help diagnose problems involving the endpoint. See the sections
"Choosing Statistics to View for Isolated Endpoints" and "Viewing Statistics for Isolated Endpoints" in the
Cisco AVS Configuration Guide or the Cisco APIC Layer 2 Configuration Guide.
Microsegmentation
Procedure
Example:
The following example configures a microsegment named 41-subnet using an IP-based attribute.
<polUni>
<fvTenant dn="uni/tn-User-T1" name="User-T1">
<fvAp dn="uni/tn-User-T1/ap-Base-EPG" name="Base-EPG">
<fvAEPg dn="uni/tn-User-T1/ap-Base-EPG/epg-41-subnet" name="41-subnet"
isAttrBasedEPg="yes" >
<fvRsBd tnFvBDName="BD1" />
<fvCrtrn name="Security1">
<fvIpAttr name="41-filter" ip="12.41.0.0/16"/>
</fvCrtrn>
<fvRsDomAtt tDn="uni/vmmp-Microsoft/dom-cli-vmm1"/> / <fvRsDomAtt
tDn="uni/vmmp-VMware/dom-cli-vmm1"/>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
<polUni>
<fvTenant dn="uni/tn-User-T1" name="User-T1">
<fvAp dn="uni/tn-User-T1/ap-Base-EPG" name="Base-EPG">
<fvAEPg dn="uni/tn-User-T1/ap-Base-EPG/epg-41-subnet" name="41-subnet"
pcEnfPref="enforced isAttrBasedEPg="yes" >
<fvRsBd tnFvBDName="BD1" />
<fvCrtrn name="Security1">
<fvIpAttr name="41-filter" ip="12.41.0.0/16"/>
</fvCrtrn>
<fvRsDomAtt tDn="uni/vmmp-Microsoft/dom-cli-vmm1"/> / <fvRsDomAtt
tDn="uni/vmmp-VMware/dom-cli-vmm1"/>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
Note isAttrBasedEPg="yes" is required in Cisco APIC Release
1.2(1).
Example:
This example is for base EPG.
<polUni>
<fvTenant dn="uni/tn-User-T1" name="User-T1">
<fvAp dn="uni/tn-User-T1/ap-Base-EPG" name="Base-EPG">
Configuring an IP-based Microsegmented EPG as a Shared Resource Using the REST API
You can configure a microsegmented EPG with an IP-Address with 32 bit mask as a shared service, accessible
by clients outside of the VRF and the current fabric.
Procedure
To configure an IP address-attribute microsegmented EPG epg3 with a shared subnet, with an IP address and
32-bit mask, send a post with XML such as the following example. In the IP attributes, the attribute usefvSubnet
is set to "yes."
Example:
<fvAEPg descr="" dn="uni/tn-t0/ap-a0/epg-epg3" fwdCtrl=""
isAttrBasedEPg="yes" matchT="AtleastOne" name="epg3" pcEnfPref="unenforced"
prefGrMemb="exclude"prio="unspecified">
<fvRsCons prio="unspecified" tnVzBrCPName="ip-epg"/>
<fvRsNodeAtt descr="" encap="unknown" instrImedcy="immediate" mode="regular"
tDn="topology/pod-2/node-106"/>
<fvSubnet ctrl="" descr="" ip="56.4.0.2/32" name="" preferred="no"
scope="public,shared" virtual="no"/>
<fvRsDomAtt classPref="encap" delimiter="" encap="unknown" encapMode="auto"
instrImedcy="immediate"
primaryEncap="unknown" resImedcy="immediate" tDn="uni/phys-vpc"/>
<fvRsCustQosPol tnQosCustomPolName=""/>
<fvRsBd tnFvBDName="b2"/>
<fvCrtrn descr="" match="any" name="default" ownerKey="" ownerTag="" prec="0">
<fvIpAttr descr="" ip="1.1.1.3" name="ipv4" ownerKey="" ownerTag=""
usefvSubnet="yes/>
</fvCrtrn>
<fvRsProv matchT="AtleastOne" prio="unspecified" tnVzBrCPName="ip-epg"/>
<fvRsProv matchT="AtleastOne" prio="unspecified" tnVzBrCPName="shared-svc"/>
</fvAEPg>
Procedure
Example:
A: The following example configures a microsegment named 41-subnet using an IP-based attribute.
<polUni>
<fvTenant dn="uni/tn-User-T1" name="User-T1">
<fvAp dn="uni/tn-User-T1/ap-Base-EPG" name="Base-EPG">
<fvAEPg dn="uni/tn-User-T1/ap-Base-EPG/epg-41-subnet" name="41-subnet"
pcEnfPref="enforced isAttrBasedEPg="yes" >
<fvRsBd tnFvBDName="BD1" />
<fvCrtrn name="Security1">
<fvIpAttr name="41-filter" ip="12.41.0.0/16"/>
</fvCrtrn>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
Example:
This example is for base EPG for Example A: .
<polUni>
<fvTenant dn="uni/tn-User-T1" name="User-T1">
<fvAp dn="uni/tn-User-T1/ap-Base-EPG" name="Base-EPG">
<fvAEPg dn="uni/tn-User-T1/ap-Base-EPG/baseEPG name=baseEPG pcEnfPref="enforced
>
<fvRsBd tnFvBDName="BD1" />
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
Example:
B: The following example configures a microsegment named useg-epg using a MAC-based attribute.
<polUni>
<fvTenant name="User-T1">
<fvAp name="customer">
<fvAEPg name="useg-epg" isAttrBasedEPg="true">
<fvRsBd tnFvBDName="BD1"/>
<fvRsDomAtt instrImedcy="immediate" resImedcy="immediate" tDn="uni/phys-phys"
/>
<fvRsNodeAtt tDn="topology/pod-1/node-101" instrImedcy="immediate" />
<fvCrtrn name="default">
<fvMacAttr name="mac" mac="00:11:22:33:44:55" />
</fvCrtrn>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
Application Profiles
Contracts are policies that enable inter-End Point Group (inter-EPG) communication. These policies are the
rules that specify communication between application tiers. If no contract is attached to the EPG, inter-EPG
communication is disabled by default. No contract is required for intra-EPG communication because intra-EPG
communication is always allowed.
Application profiles enable you to model application requirements that the APIC then automatically renders
in the network and data center infrastructure. The application profiles enable administrators to approach the
resource pool in terms of applications rather than infrastructure building blocks. The application profile is a
container that holds EPGs that are logically related to one another. EPGs can communicate with other EPGs
in the same application profile and with EPGs in other application profiles.
To deploy an application policy, you must create the required application profiles, filters, and contracts.
Typically, the APIC fabric hosts a three-tier application within a tenant network. In this example, the application
is implemented by using three servers (a web server, an application server, and a database server). See the
following figure for an example of a three-tier application.
The web server has the HTTP filter, the application server has the Remote Method Invocation (RMI) filter,
and the database server has the Structured Query Language (SQL) filter. The application server consumes the
SQL contract to communicate with the database server. The web server consumes the RMI contract to
communicate with the application server. The traffic enters from the web server and communicates with the
application server. The application server then communicates with the database server, and the traffic can
also communicate externally.
Number of Entries 2
Protocol tcp
tcp
Number of Entries 1 1
Ethertype IP IP
Procedure
Step 1 Send this HTTP POST message to deploy the application using the XML API.
Example:
POST https://apic-ip-address/api/mo/uni/tn-ExampleCorp.xml
Step 2 Include this XML structure in the body of the POST message.
Example:
<fvTenant name="ExampleCorp">
<fvAp name="OnlineStore">
<fvAEPg name="web">
<fvRsBd tnFvBDName="bd1"/>
<fvRsCons tnVzBrCPName="rmi"/>
<fvRsProv tnVzBrCPName="web"/>
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-datacenter"delimiter=@/>
</fvAEPg>
<fvAEPg name="db">
<fvRsBd tnFvBDName="bd1"/>
<fvRsProv tnVzBrCPName="sql"/>
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-datacenter"/>
</fvAEPg>
<fvAEPg name="app">
<fvRsBd tnFvBDName="bd1"/>
<fvRsProv tnVzBrCPName="rmi"/>
<fvRsCons tnVzBrCPName="sql"/>
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-datacenter"/>
</fvAEPg>
</fvAp>
<vzBrCP name="rmi">
<vzSubj name="rmi">
<vzRsSubjFiltAtt tnVzFilterName="rmi"/>
</vzSubj>
</vzBrCP>
<vzBrCP name="sql">
<vzSubj name="sql">
<vzRsSubjFiltAtt tnVzFilterName="sql"/>
</vzSubj>
</vzBrCP>
</fvTenant>
In the XML structure, the first line modifies, or creates if necessary, the tenant named ExampleCorp.
<fvTenant name="ExampleCorp">
<fvAp name="OnlineStore">
The elements within the application network profile create three endpoint groups, one for each of the three
servers. The following lines create an endpoint group named web and associate it with an existing bridge
domain named bd1. This endpoint group is a consumer, or destination, of the traffic allowed by the binary
contract named rmi and is a provider, or source, of the traffic allowed by the binary contract named web. The
endpoint group is associated with the VMM domain named datacenter.
<fvAEPg name="web">
<fvRsBd tnFvBDName="bd1"/>
<fvRsCons tnVzBrCPName="rmi"/>
<fvRsProv tnVzBrCPName="web"/>
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-datacenter"/>
</fvAEPg>
The remaining two endpoint groups, for the application server and the database server, are created in a similar
way.
The following lines define a traffic filter named http that specifies TCP traffic of types HTTP (port 80) and
HTTPS (port 443).
The remaining two filters, for application data and database (sql) data, are created in a similar way.
The following lines create a binary contract named web that incorporates the filter named http:
<vzBrCP name="web">
<vzSubj name="web">
<vzRsSubjFiltAtt tnVzFilterName="http"/>
</vzSubj>
</vzBrCP>
The remaining two contracts, for rmi and sql data protocols, are created in a similar way.
The final line closes the structure:
</fvTenant>
Note Multicast and external router subnets always result in a hit on the ingress leaf switch. Security policy
enforcement occurs as soon as the destination EPG is known by the ingress leaf switch.
A miss result in the forwarding table causes the packet to be sent to the forwarding proxy in the spine switch.
The forwarding proxy then performs a forwarding table lookup. If it is a miss, the packet is dropped. If it is
a hit, the packet is sent to the egress leaf switch that contains the destination endpoint. Because the egress leaf
switch knows the EPG of the destination, it performs the security policy enforcement. The egress leaf switch
must also know the EPG of the packet source. The fabric header enables this process because it carries the
EPG from the ingress leaf switch to the egress leaf switch. The spine switch preserves the original EPG in
the packet when it performs the forwarding proxy function.
On the egress leaf switch, the source IP address, source VTEP, and source EPG information are stored in the
local forwarding table through learning. Because most flows are bidirectional, a return packet populates the
forwarding table on both sides of the flow, which enables the traffic to be ingress filtered in both directions.
The contract is constructed in a hierarchical manner. It consists of one or more subjects, each subject contains
one or more filters, and each filter can define one or more protocols.
For example, you may define a filter called HTTP that specifies TCP port 80 and port 8080 and another filter
called HTTPS that specifies TCP port 443. You might then create a contract called webCtrct that has two sets
of subjects. openProv and openCons are the subjects that contain the HTTP filter. secureProv and secureCons
are the subjects that contain the HTTPS filter. This webCtrct contract can be used to allow both secure and
non-secure web traffic between EPGs that provide the web service and EPGs that contain endpoints that want
to consume that service.
These same constructs also apply for policies that govern virtual machine hypervisors. When an EPG is placed
in a virtual machine manager (VMM) domain, the APIC downloads all of the policies that are associated with
the EPG to the leaf switches with interfaces connecting to the VMM domain. For a full explanation of VMM
domains, see the Virtual Machine Manager Domains chapter of Application Centric Infrastructure
Fundamentals. When this policy is created, the APIC pushes it (pre-populates it) to a VMM domain that
specifies which switches allow connectivity for the endpoints in the EPGs. The VMM domain defines the set
of switches and ports that allow endpoints in an EPG to connect to. When an endpoint comes on-line, it is
associated with the appropriate EPGs. When it sends a packet, the source EPG and destination EPG are derived
from the packet and the policy defined by the corresponding contract is checked to see if the packet is allowed.
If yes, the packet is forwarded. If no, the packet is dropped.
Contracts consist of 1 or more subjects. Each subject contains 1 or more filters. Each filter contains 1 or more
entries. Each entry is equivalent to a line in an Access Control List (ACL) that is applied on the Leaf switch
to which the endpoint within the endpoint group is attached.
In detail, contracts are comprised of the following items:
NameAll contracts that are consumed by a tenant must have different names (including contracts
created under the common tenant or the tenant itself).
SubjectsA group of filters for a specific application or service.
FiltersUsed to classify traffic based upon layer 2 to layer 4 attributes (such as Ethernet type, protocol
type, TCP flags and ports).
ActionsAction to be taken on the filtered traffic. The following actions are supported:
Permit the traffic (regular contracts, only)
Mark the traffic (DSCP/CoS) (regular contracts, only)
Redirect the traffic (regular contracts, only, through a service graph)
Copy the traffic (regular contracts, only, through a service graph or SPAN)
Block the traffic (taboo contracts, only)
Log the traffic (taboo contracts, only)
Aliases(Optional) A changeable name for an object. Although the name of an object, once created,
cannot be changed, the Alias is a property that can be changed.
Thus, the contract allows more complex actions than just allow or deny. The contract can specify that traffic
that matches a given subject can be re-directed to a service, can be copied, or can have its QoS level modified.
With pre-population of the access policy in the concrete model, endpoints can move, new ones can come
on-line, and communication can occur even if the APIC is off-line or otherwise inaccessible. The APIC is
removed from being a single point of failure for the network. Upon packet ingress to the ACI fabric, security
policies are enforced by the concrete model running in the switch.
Contracts
In addition to EPGs, contracts (vzBrCP) are key objects in the policy model. EPGs can only communicate
with other EPGs according to contract rules. The following figure shows the location of contracts in the
management information tree (MIT) and their relation to other objects in the tenant.
An administrator uses a contract to select the type(s) of traffic that can pass between EPGs, including the
protocols and ports allowed. If there is no contract, inter-EPG communication is disabled by default. There
is no contract required for intra-EPG communication; intra-EPG communication is always implicitly allowed.
You can also configure contract preferred groups that enable greater control of communication between EPGs
in a VRF. If most of the EPGs in the VRF should have open communication, but a few should only have
limited communication with the other EPGs, you can configure a combination of a contract preferred group
and contracts with filters to control communication precisely.
Contracts govern the following types of endpoint group communications:
Between ACI fabric application EPGs (fvAEPg), both intra-tenant and inter-tenant
Note In the case of a shared service mode, a contract is required for inter-tenant
communication. A contract is used to specify static routes across VRFs, even though
the tenant VRF does not enforce a policy.
Between ACI fabric application EPGs and Layer 2 external outside network instance EPGs (l2extInstP)
Between ACI fabric application EPGs and Layer 3 external outside network instance EPGs (l3extInstP)
Between ACI fabric out-of-band (mgmtOoB) or in-band (mgmtInB) management EPGs
Contracts govern the communication between EPGs that are labeled providers, consumers, or both. EPG
providers expose contracts with which a would-be consumer EPG must comply. The relationship between an
EPG and a contract can be either a provider or consumer. When an EPG provides a contract, communication
with that EPG can be initiated from other EPGs as long as the communication complies with the provided
contract. When an EPG consumes a contract, the endpoints in the consuming EPG may initiate communication
with any endpoint in an EPG that is providing that contract.
Note An EPG can both provide and consume the same contract. An EPG can also provide and consume multiple
contracts simultaneously.
Procedure
Configure a contract using an XML POST request similar to the following example:
Example:
<fvAp name="VRF64_app_prof" prio="unspecified" ownerTag="" ownerKey=""
dn="uni/tn-Tenant64/ap-VRF64_app_prof" descr="">
<fvRsApMonPol tnMonEPGPolName="default"/>
<fvAEPg name="EPG64" prio="unspecified" descr="" prefGrMemb="exclude" pcEnfPref="unenforced"
Procedure
To create a taboo contract with the REST API, use XML such as in the following example:
Example:
<vzTaboo ownerTag="" ownerKey="" name="VRF64_Taboo_Contract"
dn="uni/tn-Tenant64/taboo-VRF64_Taboo_Contract" descr=""><vzTSubj
name="EPG_subject" descr=""><vzRsDenyRule tnVzFilterName="default"
directives="log"/>
</vzTSubj>
</vzTaboo>
The contract preferred group feature enables greater control of communication between EPGs in a VRF. If
most of the EPGs in the VRF should have open communication, but a few should only have limited
communication with the other EPGs, you can configure a combination of a contract preferred group and
contracts with filters to control intra-EPG communication precisely.
EPGs that are excluded from the preferred group can only communicate with other EPGs if there is a contract
in place to override the source-any-destination-any-deny default rule.
Procedure
Create a contract preferred group by sending a post, with XML such as the example:
Example:
<polUni>
<fvTenant name="tenant64">
<fvCtx name="vrf64"> <vzAny prefGrMemb="enabled"/> </fvCtx>
<fvBD name="bd64"> <fvRsCtx tnFvCtxName="vrf64"/> </fvBD>
<fvAp name="app-lldp">
<fvAEPg name="epg-ldap" prefGrMemb="include">
<fvRsBd tnFvBDName="bd64"/>
<fvRsPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/3]" encap="vlan-113"
instrImedcy="immediate"/>
</fvAEPg>
<fvAEPg name="mail" prefGrMemb="include">
<fvRsBd tnFvBDName="bd64"/>
<fvRsPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/4]" encap="vlan-114"
instrImedcy="immediate"/>
</fvAEPg>
<fvAEPg name="radius" prefGrMemb="exclude">
<fvRsBd tnFvBDName="bd64"/>
<fvRsPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/5]" encap="vlan-115"
instrImedcy="immediate"/>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
What to Do Next
Create a contract governing the communication of the radius EPG with other EPGs.
DHCP
Configuring a DHCP Server Policy for the APIC Infrastructure Using the REST API
This task is a prerequisite for users who want to create a vShield Domain Profile.
The port and the encapsulation used by the application EPG must belong to a physical or VM Manager
(VMM) domain. If no such association with a domain is established, the APIC continues to deploy the
EPG but raises a fault.
Cisco APIC supports DHCP relay for both IPv4 and IPv6 tenant subnets. DHCP server addresses can
be IPv4 or IPv6. DHCPv6 relay will occur only if IPv6 is enabled on the fabric interface and one or
more DHCPv6 relay servers are configured.
Procedure
Configure the APIC as the DHCP server policy for the infrastructure tenant.
Note This relay policy will be pushed to all the leaf ports that are connected hypervisors using the attach
entity profile configuration. For details about configuring with attach entity profile, see the examples
related to creating VMM domain profiles.
Example:
<!-- api/policymgr/mo/.xml -->
<polUni>
POST https://apic-ip-address/api/mo/uni.xml
<fvTenant name="infra">
<fvBD name="default">
<dhcpLbl name="DhcpRelayP" owner="tenant"/>
</fvBD>
</fvTenant>
</polUni>
</fvBD>
<!-- L3Out EPG DHCP -->
<l3extOut name="L3OUT">
<l3extRsEctx tnFvCtxName="dhcp"/>
<l3extInstP name="l3extInstP-1">
<!-- Allowed routes to L3out to send traffic -->
<l3extSubnet ip="100.100.100.0/24" />
</l3extInstP>
<l3extLNodeP name="l3extLNodeP-pc">
<!-- VRF External loopback interface on node -->
<l3extRsNodeL3OutAtt
tDn="topology/pod-1/node-1018"
rtrId="10.10.10.1" />
<l3extLIfP name='l3extLIfP-pc'>
<l3extRsPathL3OutAtt
tDn="topology/pod-1/paths-1018/pathep-[eth1/7]"
encap='vlan-900'
ifInstT='sub-interface'
addr="100.100.100.50/24"
mtu="1500"/>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
<!-- Static DHCP Client Configuration -->
<fvAp name="cons2">
<fvAEPg name="APP">
<fvRsBd tnFvBDName="cons2"/>
<fvRsDomAtt tDn="uni/phys-mininet"/>
<fvRsPathAtt
tDn="topology/pod-1/paths-1017/pathep-[eth1/3]"
encap="vlan-1000"
instrImedcy='immediate'
mode='native'/>
</fvAEPg>
</fvAp>
<!-- DHCP Server Configuration -->
<dhcpRelayP
name="DhcpRelayP"
owner="tenant"
mode="visible">
<dhcpRsProv
tDn="uni/tn-tenant1/out-L3OUT/instP-l3extInstP-1"
addr="100.100.100.1"/>
</dhcpRelayP>
</fvTenant>
</polUni>
This sample policy provides an example of a consumer tenant L2extOut DHCP relay configuration:
<fvTenant
dn="uni/tn-dhcpl2Out"
name="dhcpl2Out">
<fvCtx name="dhcpl2Out"/>
<!-- bridge domain -->
<fvBD name="provBD">
<fvRsCtx tnFvCtxName="dhcpl2Out" />
<fvSubnet ip="100.100.100.50/24" scope="shared"/>
</fvBD>
<vzSubj name="app">
<vzRsSubjFiltAtt tnVzFilterName="t0f0"/>
</vzSubj>
</vzBrCP>
<l2extOut name="l2Out">
<l2extLNodeP name='l2ext'>
<l2extLIfP name='l2LifP'>
<l2extRsPathL2OutAtt tDn="topology/pod-1/paths-1018/pathep-[eth1/7]"/>
</l2extLIfP>
</l2extLNodeP>
<l2extInstP name='l2inst'>
<fvRsProv tnVzBrCPName="webCtrct"/>
</l2extInstP>
<l2extRsEBd tnFvBDName="provBD" encap='vlan-900'/>
</l2extOut>
<fvAp name="cons2">
<fvAEPg name="APP">
<fvRsBd tnFvBDName="cons2" />
<fvRsDomAtt tDn="uni/phys-mininet" />
<fvRsBd tnFvBDName="SolarBD2" />
<fvRsPathAtt tDn="topology/pod-1/paths-1018/pathep-[eth1/48]"
encap="vlan-1000" instrImedcy='immediate' mode='native'/>
</fvAEPg>
</fvAp>
<dhcpRelayP name="DhcpRelayP" owner="tenant" mode="visible">
<dhcpRsProv tDn="uni/tn-dhcpl2Out/l2out-l2Out/instP-l2inst" addr="100.100.100.1"/>
</dhcpRelayP>
</fvTenant>
DNS
DNS
The ACI fabric DNS service is contained in the fabric managed object. The fabric global default DNS profile
can be accessed throughout the fabric. The figure below shows the logical relationships of the DNS-managed
objects within the fabric.
A VRF (context) must contain a dnsLBL object in order to use the global default DNS service. Label matching
enables tenant VRFs to consume the global DNS provider. Because the name of the global DNS profile is
default, the VRF label name is "default" (dnsLBL name = default).
Configuring a DNS Service Policy to Connect with DNS Providers Using the REST API
Before You Begin
Make sure that Layer 2 or Layer 3 management connectivity is configured.
Procedure
Example:
POST URL :
https://apic-IP-address/api/node/mo/uni/fabric.xml
<dnsProfile name="default">
<dnsRsProfileToEpg tDn="uni/tn-mgmt/mgmtp-default/oob-default"/>
</dnsProfile>
Step 2 Configure the DNS label under the out-of-band management tenant.
Example:
POST URL: https://apic-IP-address/api/node/mo/uni/tn-mgmt/ctx-oob.xml
<dnsLbl name="default" tag="yellow-green"/>
Associate the profile with the tenant that will consume it:
<!-- /api/policymgr/mo/.xml -->
<polUni>
<fvTenant name=t1>
<fvCtx name=ctx0>
<dnsLbl name=default/>
</fvCtx>
</fvTenant>
</polUni>
NTP
Procedure
Example:
POST url: https://APIC-IP/api/node/mo/uni/fabric/time-test.xml
<imdata totalCount="1">
<datetimePol adminSt="enabled" authSt="disabled" descr="" dn="uni/fabric/time-CiscoNTPPol"
name="CiscoNTPPol" ownerKey="" ownerTag="">
<datetimeNtpProv descr="" keyId="0" maxPoll="6" minPoll="4" name="10.10.10.11"
preferred="yes">
<datetimeRsNtpProvToEpg tDn="uni/tn-mgmt/mgmtp-default/inb-default"/>
</datetimeNtpProv>
</datetimePol>
</imdata>
Step 2 Add the default Date Time Policy to the pod policy group.
Example:
POST url: https://APIC-IP/api/node/mo/uni/fabric/funcprof/podpgrp-calo1/rsTimePol.xml
</fabricRsTimePol>
</imdata>
Step 3 Add the pod policy group to the default pod profile.
Example:
POST url:
https://APIC-IP/api/node/mo/uni/fabric/podprof-default/pods-default-typ-ALL/rspodPGrp.xml
Tetration
Overview
This article provides examples of how to configure Cisco Tetration Analytics when using the Cisco APIC.
The following information applies when configuring Cisco Tetration Analytics.
An inband management IP address must be configured on each leaf where the Cisco Tetration Analytics
agent is active.
Define an analytics policy and specify the destination IP address of the Cisco Tetration Analytics server.
Create a switch profile and include the policy group created in the previous step.
Procedure
Example:
<analyticsCluster name="tetration" >
<analyticsCfgSrv name="srv1" ip="10.30.30.7" >
</analyticsCfgSrv>
</analyticsCluster>
Step 2 Associate analytics with the policy group.
Example:
<fabricLeNodePGrp descr="" name="mypolicy6" ownerKey="" ownerTag="" rn="lenodepgrp-mypolicy6"
status="">
<fabricRsNodeCfgSrv rn="rsnodeProv" status=""
tDn="uni/fabric/analytics/cluster-tetration/cfgsrv-srv1" />
</fabricLeNodePGrp>
Step 3 Associate the policy group with the switch.
Example:
<fabricLeafP name="leafs" rn="leprof-leafs" status="" >
<fabricLeafS name="sw" rn="leaves-sw-typ-range" status="">
<fabricRsLeNodePGrp rn="rsleNodePGrp" tDn="uni/fabric/funcprof/lenodepgrp-mypolicy6"/>
NetFlow
About NetFlow
The NetFlow technology provides the metering base for a key set of applications, including network traffic
accounting, usage-based network billing, network planning, as well as denial of services monitoring, network
monitoring, outbound marketing, and data mining for both service providers and enterprise customers. Cisco
provides a set of NetFlow applications to collect NetFlow export data, perform data volume reduction, perform
post-processing, and provide end-user applications with easy access to NetFlow data. If you have enabled
NetFlow monitoring of the traffic flowing through your datacenters, this feature enables you to perform the
same level of monitoring of the traffic flowing through the Cisco Application Centric Infrastructure (Cisco
ACI) fabric.
Instead of hardware directly exporting the records to a collector, the records are processed in the supervisor
engine and are exported to standard NetFlow collectors in the required format.
For information about configuring NetFlow with virtual machine networking, see the Cisco ACI Virtualization
Guide.
Configuring a NetFlow Exporter Policy for VM Networking Using the REST API
The following example XML shows how to configure a NetFlow exporter policy for VM networking using
the REST API:
<polUni>
<infraInfra>
<netflowVmmExporterPol name=vmExporter1 dstAddr=2.2.2.2 dstPort=1234
srcAddr=4.4.4.4/>
</infraInfra>
</polUni>
<!-- Access Port Policy Group - to setup Netflow Monitor Policy /-->
<infraAccPortGrp name="infraAccPortGrp" >
<!--One Monitor Policy per address family (ipv4, ipv6, ce) /-->
<infraRsNetflowMonitorPol tnNetflowMonitorPolName='monitor_policy1'
fltType='ipv4'/>
<infraRsNetflowMonitorPol tnNetflowMonitorPolName='monitor_policy2'
fltType='ipv6'/>
<infraRsNetflowMonitorPol tnNetflowMonitorPolName=monitor_policy2' fltType=ce'/>
</infraAccPortGrp>
</infraFuncP>
</infraInfra>
The following example XML shows how to configure the NetFlow tenant hierarchy using the REST API:
<?xml version="1.0" encoding="UTF-8"?>
<!--One Monitor Policy per address family (ipv4, ipv6, ce) /-->
<fvRsBDToNetflowMonitorPol tnNetflowMonitorPolName='monitor_policy1'
fltType='ipv4'/>
<fvRsBDToNetflowMonitorPol tnNetflowMonitorPolName='monitor_policy2'
fltType='ipv6'/>
<fvRsBDToNetflowMonitorPol tnNetflowMonitorPolName=monitor_policy2' fltType='ce'/>
</fvBD>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/40]"
ifInstT='sub-interface' encap='vlan-40' />
Consuming a NetFlow Exporter Policy Under a VMM Domain Using the REST API
The following example XML shows how to consume a NetFlow exporter policy under a VMM domain using
the REST API:
<polUni>
<vmmProvP vendor=VMware>
<vmmDomP name=mininet>
<vmmVSwitchPolicyCont>
<vmmRsVswitchExporterPol tDn=uni/infra/vmmexporterpol-vmExporter1
activeFlowTimeOut=62 idleFlowTimeOut=16 samplingRate=1/>
</vmmVSwitchPolicyCont>
</vmmDomP>
</vmmProvP>
</polUni>
Configuring the NetFlow or Tetration Analytics Priority Using the REST API
You can specify whether to use the NetFlow or Cisco Tetration Analytics feature by setting the FeatureSel
attribute of the <fabricNodeControl> element. The FeatureSel attribute can have one of the following values:
The following example REST API post specifies for the switch "test1" to use the NetFlow feature:
http://192.168.10.1/api/node/mo/uni/fabric.xml
<fabricNodeControl name="test1" FeatureSel="netflow" />
Procedure
To enable ACL deny logging, post data such as the follow example:
POST https://192.0.20.123/api/node/mo/uni/tn-sgladwin_t1/taboo-TCP_Taboo_Contract.json
{
"vzTaboo":{
"attributes":{
"dn":"uni/tn-sgladwin_t1/taboo-TCP_Taboo_Contract",
"name":"TCP_Taboo_Contract",
"rn":"taboo-TCP_Taboo_Contract",
"status":"created"},
"children":[{
"vzTSubj":{
"attributes":{
"dn":"uni/tn-sgladwin_t1/taboo-TCP_Taboo_Contract/tsubj-TCP_Filter_Subject",
"name":"TCP_Filter_Subject",
"rn":"tsubj-TCP_Filter_Subject",
"status":"created"},
"children":[{
"vzRsDenyRule":{
"attributes":{
"tnVzFilterName":"TCP_Filter",
"directives":"log",
"status":"created"},
"children":[]}}]}}]}}
response: {"totalCount":"0","imdata":[]}
DOM Statistics
Procedure
Step 1 Create a fabric node control policy (fabricNodeControlPolicy) as in the following example:
</fabricLeNodePGrp>
Step 3 Associate a policy group to a switch (in the following example, the switch is 103) as follows:
<dn>uni/fabric/leprof-leafSwitchProfile/leaves-test-typ-range/nodeblk-09533c1d228097da</dn>
<from_>103</from_>
<to_>103</to_>
<name>09533c1d228097da</name>
<rn>nodeblk-09533c1d228097da</rn>
<status>created,modified</status>
</attributes>
</fabricNodeBlk>
</children>
<children>
<fabricRsLeNodePGrp>
<attributes>
<tDn>uni/fabric/funcprof/lenodepgrp-nodegrp2</tDn>
<status>created</status>
</attributes>
</fabricRsLeNodePGrp>
</children>
</fabricLeafS>
</children>
</fabricLeafP>
Syslog
About Syslog
During operation, a fault or event in the Cisco Application Centric Infrastructure (ACI) system can trigger
the sending of a system log (syslog) message to the console, to a local file, and to a logging server on another
system. A system log message typically contains a subset of information about the fault or event. A system
log message can also contain audit log and session log entries.
Note For a list of syslog messages that the APIC and the fabric nodes can generate, see http://www.cisco.com/
c/en/us/td/docs/switches/datacenter/aci/apic/sw/1-x/syslog/guide/aci_syslog/ACI_SysMsg.html.
Many system log messages are specific to the action that a user is performing or the object that a user is
configuring or administering. These messages can be the following:
Informational messages, providing assistance and tips about the action being performed
Warning messages, providing information about system errors related to an object, such as a user account
or service profile, that the user is configuring or administering
In order to receive and monitor system log messages, you must specify a syslog destination, which can be the
console, a local file, or one or more remote hosts running a syslog server. In addition, you can specify the
minimum severity level of messages to be displayed on the console or captured by the file or host. The local
file for receiving syslog messages is /var/log/external/messages.
A syslog source can be any object for which an object monitoring policy can be applied. You can specify the
minimum severity level of messages to be sent, the items to be included in the syslog messages, and the syslog
destination.
You can change the display format for the Syslogs to NX-OS style format.
Additional details about the faults or events that generate these system messages are described in the Cisco
APIC Faults, Events, and System Messages Management Guide, and system log messages are listed in the
Cisco ACI System Messages Reference Guide.
Note Not all system log messages indicate problems with your system. Some messages are purely informational,
while others may help diagnose problems with communications lines, internal hardware, or the system
software.
Procedure
To create a syslog group and destination using the REST API, send a post with XML such as the following
example:
Example:
<syslogGroup name name="tenant64_SyslogDest" format="aci"
dn="uni/fabric/slgroup-tenant64_SyslogDest">
<syslogConsole name="" format="aci" severity="alerts" adminState="enabled"/>
<syslogFile name="" format="aci" severity="information" adminState="enabled"/>
<syslogProf name="syslog" adminState="enabled"/>
<syslogRemoteDest name="Syslog_remoteDest" format="aci" severity="warnings"
adminState="enabled" port="514" host="192.168.100.20" forwardingFacility="local7">
<fileRsARemoteHostToEpg tDn="uni/tn-mgmt/mgmtp-default/oob-default"/>
</syslogRemoteDest>
</syslogGroup>
Procedure
To create a syslog source, send a POST request with XML such as the following example:
Example:
<syslogSrc
name="VRF64_SyslogSource" minSev="warnings" incl="faults"
dn="uni/tn-tenant64/monepg-MonPol1/slsrc-VRF64_SyslogSource">
<syslogRsDestGroup tDn="uni/fabric/slgroup-tenant64_SyslogDest"/>
</syslogSrc>
Enabling Syslog to Display in NX-OS CLI Format, Using the REST API
By default the Syslog format is RFC 5424 compliant. You can change the default display of Syslogs to NX-OS
type format, similar to the following example:
apic1# moquery -c "syslogRemoteDest"
Total Objects shown: 1
# syslog.RemoteDest
host : 172.23.49.77
adminState : enabled
childAction :
descr :
dn : uni/fabric/slgroup-syslog-mpod/rdst-172.23.49.77
epgDn :
format : nxos
forwardingFacility : local7
ip :
lcOwn : local
modTs : 2016-05-17T16:51:57.231-07:00
monPolDn : uni/fabric/monfab-default
name : syslog-dest
operState : unknown
port : 514
rn : rdst-172.23.49.77
severity : information
status :
uid : 15374
vrfId : 0
vrfName :
To enable the Syslogs to display in NX-OS type format, perform the following steps, using the REST API.
Procedure
Step 1 Enable the Syslogs to display in NX-OS type format, as in the following example:
POST https://192.168.20.123/api/node/mo/uni/fabric.xml
<syslogGroup name="DestGrp77" format="nxos">
<syslogRemoteDest name="slRmtDest77" host="172.31.138.20" severity="debugging"/>
</syslogGroup>
The syslogGroup is the Syslog monitoring destination group, the sysLogRemoteDest is the name you previously
configured for your Syslog server, and the host is the IP address for the previously configured Syslog server.
Step 2 Set the Syslog format back to the default RFC 5424 format, as in the following example:
POST https://192.168.20.123/api/node/mo/uni/fabric.xml
<syslogGroup name="DestGrp77" format="aci">
<syslogRemoteDest name="slRmtDest77" host="172.31.138.20" severity="debugging"/>
</syslogGroup>
Overview
This article provides an example of how to configure Data Plane Policing.
Use data plane policing (DPP) to manage bandwidth consumption on ACI fabric access interfaces. DPP
policies can apply to egress traffic, ingress traffic, or both. DPP monitors the data rates for a particular interface.
When the data rate exceeds user-configured values, marking or dropping of packets occurs immediately.
Policing does not buffer the traffic; therefore, the transmission delay is not affected. When traffic exceeds the
data rate, the ACI fabric can either drop the packets or mark QoS fields in them.
DPP policies can be single-rate, dual-rate, and color-aware. Single-rate policies monitor the committed
information rate (CIR) of traffic. Dual-rate policers monitor both CIR and peak information rate (PIR) of
traffic. In addition, the system monitors associated burst sizes. Three colors, or conditions, are determined by
the policer for each packet depending on the data rate parameters supplied: conform (green), exceed (yellow),
or violate (red).
Typically, DPP policies are applied to physical or virtual layer 2 connections for virtual or physical devices
such as servers or hypervisors, and on layer 3 connections for routers. DPP policies applied to leaf switch
access ports are configured in the fabric access (infra) portion of the ACI fabric, and must be configured by
a fabric administrator. DPP policies applied to interfaces on border leaf switch access ports (l3extOut or
l2extOut) are configured in the tenant (fvTenant) portion of the ACI fabric, and can be configured by a tenant
administrator.
Only one action can be configured for each condition. For example, a DPP policy can to conform to the data
rate of 256000 bits per second, with up to 200 millisecond bursts. The system applies the conform action to
traffic that falls within this rate, and it would apply the violate action to traffic that exceeds this rate. Color-aware
policies assume that traffic has been previously marked with a color. This information is then used in the
actions taken by this type of policer.
<infraAccPortGrp name="portSet2">
<infraRsQosIngressDppIfPol tnQosDppPolName="infradpp5"/>
</infraAccPortGrp>
</infraFuncP>
</infraInfra>
To police the L2 traffic going out of the Leaf:
<!-- api/node/mo/uni/.xml -->
<infraInfra>
<qosDppPol name="infradpp2" burst="4000" rate="4000"/>
<!--
List of nodes. Contains leaf selectors. Each leaf selector contains list of node blocks
-->
<infraNodeP name="leaf1">
<infraLeafS name="leaf1" type="range">
<infraNodeBlk name="leaf1" from_="101" to_="101"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-portselector2"/>
</infraNodeP>
<!--
PortP contains port selectors. Each port selector contains list of ports. It
also has association to port group policies
-->
<infraAccPortP name="portselector2">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk" fromCard="1" toCard="1" fromPort="37" toPort="38"></infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-portSet2"/>
</infraHPortS>
</infraAccPortP>
<!-- FuncP contains access bundle group policies -->
<infraFuncP>
<infraAccPortGrp name="portSet2">
<infraRsQosEgressDppIfPol tnQosDppPolName="infradpp2"/>
</infraAccPortGrp>
</infraFuncP>
</infraInfra>
To police the L3 traffic coming in to the Leaf:
<!-- api/node/mo/uni/.xml -->
<fvTenant name="dppTenant">
<qosDppPol name="gmeo" burst="2000" rate="2000"/>
<l3extOut name="Outside">
<l3extInstP name="extroute"/>
<l3extLNodeP name="borderLeaf">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId="10.0.0.1">
<ipRouteP ip="0.0.0.0">
<ipNexthopP nhAddr="192.168.62.2"/>
</ipRouteP>
</l3extRsNodeL3OutAtt>
<l3extLIfP name="portProfile">
<l3extRsPathL3OutAtt addr="192.168.40.1/30" ifInstT="l3-port"
tDn="topology/pod-1/paths-101/pathep-[eth1/40]"/>
<l3extRsPathL3OutAtt addr="192.168.41.1/30" ifInstT="l3-port"
tDn="topology/pod-1/paths-101/pathep-[eth1/41]"/>
<l3extRsIngressQosDppPol tnQosDppPolName="gmeo"/>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
To police the L3 traffic going out of the Leaf:
<!-- api/node/mo/uni/.xml -->
<fvTenant name="dppTenant">
<qosDppPol name="gmeo" burst="2000" rate="2000"/>
<l3extOut name="Outside">
<l3extInstP name="extroute"/>
<l3extLNodeP name="borderLeaf">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId="10.0.0.1">
<ipRouteP ip="0.0.0.0">
<ipNexthopP nhAddr="192.168.62.2"/>
</ipRouteP>
</l3extRsNodeL3OutAtt>
<l3extLIfP name="portProfile">
In the body of the POST message, Include the following JSON payload structure to specify the policy by
percentage of available bandwidth:
{"stormctrlIfPol":
{"attributes":
{"dn":"uni/infra/stormctrlifp-MyStormPolicy",
"name":"MyStormPolicy",
"rate":"75",
"burstRate":"85",
"rn":"stormctrlifp-MyStormPolicy",
"status":"created"
},
"children":[]
}
}
In the body of the POST message, Include the following JSON payload structure to specify the policy by
packets per second:
{"stormctrlIfPol":
{"attributes":
{"dn":"uni/infra/stormctrlifp-MyStormPolicy",
"name":"MyStormPolicy",
"ratePps":"12000",
"burstPps":"15000",
"rn":"stormctrlifp-MyStormPolicy",
"status":"created"
},
"children":[]
}
}
Networking Domains
A fabric administrator creates domain policies that configure ports, protocols, VLAN pools, and encapsulation.
These policies can be used exclusively by a single tenant, or shared. Once a fabric administrator configures
domains in the ACI fabric, tenant administrators can associate tenant endpoint groups (EPGs) to domains.
These networking domain profiles can be configured:
VMM domain profiles (vmmDomP) are required for virtual machine hypervisor integration.
Physical domain profiles (physDomP) are typically used for bare metal server attachment and management
access.
Bridged outside network domain profiles (l2extDomP) are typically used to connect a bridged external
network trunk switch to a leaf switch in the ACI fabric.
Routed outside network domain profiles (l3extDomP) are used to connect a router to a leaf switch in the
ACI fabric.
A domain is configured to be associated with a VLAN pool. EPGs are then configured to use the VLANs
associated with a domain.
Note EPG port and VLAN configurations must match those specified in the domain infrastructure configuration
with which the EPG associates. If not, the APIC will raise a fault. When such a fault occurs, verify that
the domain infrastructure configuration matches the EPG port and VLAN configurations.
Procedure
Configure a physical domain by sending a post with XML such as the following example:
Example:
<physDomP dn="uni/phys-bsprint-PHY" lcOwn="local"
modTs="2015-02-23T16:13:21.906-08:00" monPolDn="uni/fabric/monfab-default"
name="bsprint-PHY" ownerKey="" ownerTag="" status="" uid="8131">
<infraRsVlanNs childAction="" forceResolve="no" lcOwn="local" modTs="2015-02-
23T16:13:22.065-08:00" monPolDn="uni/fabric/monfab-default" rType="mo" rn="rsvlanNs"
state="formed" stateQual="none" status="" tCl="fvnsVlanInstP" tDn="uni/infra/vlanns-
[bsprint-vlan-pool]-static" tType="mo" uid="8131"/>
<infraRsVlanNsDef forceResolve="no" lcOwn="local" modTs="2015-02-
23T16:13:22.065-08:00" rType="mo" rn="rsvlanNsDef" state="formed" stateQual="none"
status="" tCl="fvnsAInstP" tDn="uni/infra/vlanns-[bsprint-vlan-pool]-static"
tType="mo"/>
<infraRtDomP lcOwn="local" modTs="2015-02-23T16:13:52.945-08:00"
rn="rtdomP-[uni/infra/attentp-bsprint-AEP]" status="" tCl="infraAttEntityP"
tDn="uni/infra/attentp-bsprint-AEP"/>
</physDomP>
classify packets into the different EPGs, using identifiers like VLANs, VXLAN, NVGRE, physical port IDs,
virtual port IDs.
Note When creating a VPC domain between two leaf switches, both switches must be in the same switch
generation, one of the following:
Generation 1 - Cisco Nexus N9K switches without EX on the end of the switch name; for example,
N9K-9312TX
Generation 2 Cisco Nexus N9K switches with EX on the end of the switch model name; for
example, N9K-93108TC-EX
Switches such as these two are not compatible VPC peers. Instead, use switches of the same generation
An Attachable Entity Profile (AEP) represents a group of external entities with similar infrastructure policy
requirements. The infrastructure policies consist of physical interface policies that configure various protocol
options, such as Cisco Discovery Protocol (CDP), Link Layer Discovery Protocol (LLDP), or Link Aggregation
Control Protocol (LACP).
An AEP is required to deploy VLAN pools on leaf switches. Encapsulation blocks (and associated VLANs)
are reusable across leaf switches. An AEP implicitly provides the scope of the VLAN pool to the physical
infrastructure.
The following AEP requirements and dependencies must be accounted for in various configuration scenarios,
including network connectivity, VMM domains, and multipod configuration:
The AEP defines the range of allowed VLANS but it does not provision them. No traffic flows unless
an EPG is deployed on the port. Without defining a VLAN pool in an AEP, a VLAN is not enabled on
the leaf port even if an EPG is provisioned.
A particular VLAN is provisioned or enabled on the leaf port that is based on EPG events either statically
binding on a leaf port or based on VM events from external controllers such as VMware vCenter or
Microsoft Azure Service Center Virtual Machine Manager (SCVMM).
Attached entity profiles can be associated directly with application EPGs, which deploy the associated
application EPGs to all those ports associated with the attached entity profile. The AEP has a configurable
generic function (infraGeneric), which contains a relation to an EPG (infraRsFuncToEpg) that is deployed
on all interfaces that are part of the selectors that are associated with the attachable entity profile.
A virtual machine manager (VMM) domain automatically derives physical interface policies from the interface
policy groups of an AEP.
An override policy at the AEP can be used to specify a different physical interface policy for a VMM domain.
This policy is useful in scenarios where a VM controller is connected to the leaf switch through an intermediate
Layer 2 node, and a different policy is desired at the leaf switch and VM controller physical ports. For example,
you can configure LACP between a leaf switch and a Layer 2 node. At the same time, you can disable LACP
between the VM controller and the Layer 2 switch by disabling LACP under the AEP override policy.
status=""/>
<infraAssocDomP childAction="" dompDn="uni/l2dom-JC-L2-Domain" lcOwn="local"
modTs="2015-02-25T11:35:33.570-08:00" rn="assocdomp-[uni/l2dom-JC-L2-Domain]"
status=""/>
</infraContDomP>
<infraContNS childAction="" lcOwn="local" modTs="2015-02-23T16:13:52.874-08:00"
monPolDn="uni/fabric/monfab-default" rn="nscont" status="">
<infraRsToEncapInstDef childAction="" deplSt="" forceResolve="no" lcOwn="local"
modTs="2015-02-23T16:13:52.961-08:00" monPolDn="uni/fabric/monfabdefault"
rType="mo" rn="rstoEncapInstDef-[allocencap-[uni/infra]/encapnsdef-
[uni/infra/vlanns-[bsprint-vlan-pool]-static]]" state="formed" stateQual="none"
status="" tCl="stpEncapInstDef" tDn="allocencap-[uni/infra]/encapnsdef-
[uni/infra/vlanns-[bsprint-vlan-pool]-static]" tType="mo">
<fabricCreatedBy childAction="" creatorDn="uni/l2dom-JC-L2-Domain"
deplSt="" domainDn="uni/l2dom-JC-L2-Domain" lcOwn="local" modTs="2015-02-
25T11:35:33.570-08:00" monPolDn="uni/fabric/monfab-default" profileDn=""
rn="source-[uni/l2dom-JC-L2-Domain]" status=""/>
<fabricCreatedBy childAction="" creatorDn="uni/phys-bsprint-PHY" deplSt=""
domainDn="uni/phys-bsprint-PHY" lcOwn="local"
modTs="2015-02-23T16:13:52.961-08:00"
monPolDn="uni/fabric/monfab-default" profileDn=""
rn="source-[uni/phys-bsprint-PHY]"
status=""/>
</infraRsToEncapInstDef>
</infraContNS>
<infraRtAttEntP childAction="" lcOwn="local" modTs="2015-02-24T11:59:37.980-08:00"
rn="rtattEntP-[uni/infra/funcprof/accportgrp-bsprint-AccessPort]" status=""
tCl="infraAccPortGrp" tDn="uni/infra/funcprof/accportgrp-bsprint-AccessPort"/>
<infraRsDomP childAction="" forceResolve="no" lcOwn="local" modTs="2015-02-
25T11:35:33.570-08:00" monPolDn="uni/fabric/monfab-default" rType="mo"
rn="rsdomP-[uni/l2dom-JC-L2-Domain]" state="formed" stateQual="none" status=""
tCl="l2extDomP" tDn="uni/l2dom-JC-L2-Domain" tType="mo" uid="8754"/>
<infraRsDomP childAction="" forceResolve="no" lcOwn="local"
modTs="2015-02-23T16:13:52.961-08:00" monPolDn="uni/fabric/monfab-default" rType="mo"
Interfaces
Procedure
To create the port channel, send a post with XML such as the following:
Example:
<infraInfra dn="uni/infra">
<infraNodeP name=test">
<infraLeafS name="leafs" type="range">
<infraNodeBlk name="nblk from_=17" to_=18/>
<infraNodeBlk name="nblk from_=20" to_=20/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-test"/>
</infraNodeP>
<infraAccPortP name="test">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1
fromCard="1" toCard="1"
fromPort="10" toPort=15/>
<infraPortBlk name="blk2"
fromCard="1" toCard="1"
fromPort=20" toPort=25/>
<infraRsAccBaseGrp
tDn="uni/infra/funcprof/accbundle-bndlgrp"/>
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccBndlGrp name="bndlgrp" lagT="link">
<infraRsHIfPol tnFabricHIfPolName=default"/>
<infraRsCdpIfPol tnCdpIfPolName=default/>
<infraRsLacpPol tnLacpLagPolName=default"/>
</infraAccBndlGrp>
</infraFuncP>
</infraInfra>
Configuring a Single Virtual Port Channel Across Two Switches Using the REST API
The two steps for creating a virtual port channel across two switches are as follows:
Create a fabricExplicitGEp: this policy specifies the leaf switch that pairs to form the virtual port
channel.
Use the infra selector to specify the interface configuration.
The APIC performs several validations of the fabricExplicitGEp and faults are raised when any of these
validations fail. A leaf can be paired with only one other leaf. The APIC rejects any configuration that breaks
this rule. When creating a fabricExplicitGEp, an administrator must provide the IDs of both of the leaf
switches to be paired. The APIC rejects any configuration which breaks this rule. Both switches must be up
when fabricExplicitGEp is created. If one switch is not up, the APIC accepts the configuration but raises a
fault. Both switches must be leaf switches. If one or both switch IDs corresponds to a spine, the APIC accepts
the configuration but raises a fault.
An APIC fabric administrator account is available that will enable creating the necessary fabric
infrastructure configurations.
The target leaf switch and protocol(s) are configured and available.
Procedure
To create the fabricExplicitGEp policy and use the intra selector to specify the interface, send a post with
XML such as the following example:
Example:
<fabricProtPol pairT="explicit">
<fabricExplicitGEp name="tG" id="2">
<fabricNodePEp id=18/>
<fabricNodePEp id=25"/>
</fabricExplicitGEp>
</fabricProtPol>
Configuring Two Port Channels Applied to Multiple Switches Using the REST API
This example creates two port channels (PCs) on leaf switch 17, another port channel on leaf switch 18, and
a third one on leaf switch 20. On each leaf switch, the same interfaces will be part of the PC (interface 1/10
to 1/15 for port channel 1 and 1/20 to 1/25 for port channel 2). The policy uses two switch blocks because
each a switch block can contain only one group of consecutive switch IDs. All these PCs will have the same
configuration.
Note Even though the PC configurations are the same, this example uses two different interface policy groups.
Each Interface Policy Group represents a PC on a switch. All interfaces associated with a given interface
policy group are part of the same PCs.
Procedure
To create the two PCs, send a post with XML such as the following:
Example:
<infraInfra dn="uni/infra">
<infraNodeP name=test">
<infraLeafS name="leafs" type="range">
<infraNodeBlk name="nblk
from_=17" to_=18/>
<infraNodeBlk name="nblk
from_=20" to_=20/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-test1"/>
<infraRsAccPortP tDn="uni/infra/accportprof-test2"/>
</infraNodeP>
<infraAccPortP name="test1">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1
fromCard="1" toCard="1"
fromPort="10" toPort=15/>
<infraRsAccBaseGrp
tDn="uni/infra/funcprof/accbundle-bndlgrp1"/>
</infraHPortS>
</infraAccPortP>
<infraAccPortP name="test2">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1
fromCard="1" toCard="1"
fromPort=20" toPort=25/>
<infraRsAccBaseGrp
tDn="uni/infra/funcprof/accbundle-bndlgrp2" />
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccBndlGrp name="bndlgrp1" lagT="link">
<infraRsHIfPol tnFabricHIfPolName=default"/>
<infraRsCdpIfPol tnCdpIfPolName=default/>
<infraRsLacpPol tnLacpLagPolName=default"/>
</infraAccBndlGrp>
</infraInfra>
Configuring a Virtual Port Channel on Selected Port Blocks of Two Switches Using the REST API
This policy creates a single virtual port channel (VPC) on leaf switches 18 and 25, using interfaces 1/10 to
1/15 on leaf 18, and interfaces 1/20 to 1/25 on leaf 25.
Note When creating a VPC domain between two leaf switches, both switches must be in the same switch
generation, one of the following:
Generation 1 - Cisco Nexus N9K switches without EX on the end of the switch name; for example,
N9K-9312TX
Generation 2 Cisco Nexus N9K switches with EX on the end of the switch model name; for
example, N9K-93108TC-EX
Switches such as these two are not compatible VPC peers. Instead, use switches of the same generation.
Procedure
To create the VPC send a post with XML such as the following example:
Example:
<infraInfra dn="uni/infra">
<infraNodeP name=test1">
<infraLeafS name="leafs" type="range">
<infraNodeBlk name="nblk
from_=18" to_=18/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-test1"/>
</infraNodeP>
<infraNodeP name=test2">
<infraLeafS name="leafs" type="range">
<infraNodeBlk name="nblk
from_=25" to_=25/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-test2"/>
</infraNodeP>
<infraAccPortP name="test1">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1
fromCard="1" toCard="1"
fromPort="10" toPort=15/>
<infraRsAccBaseGrp
tDn="uni/infra/funcprof/accbundle-bndlgrp" />
</infraHPortS>
</infraAccPortP>
<infraAccPortP name="test2">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1
fromCard="1" toCard="1"
fromPort=20" toPort=25/>
<infraRsAccBaseGrp
tDn="uni/infra/funcprof/accbundle-bndlgrp" />
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccBndlGrp name="bndlgrp" lagT=node">
<infraRsHIfPol tnFabricHIfPolName=default"/>
<infraRsCdpIfPol tnCdpIfPolName=default/>
<infraRsLacpPol tnLacpLagPolName=default"/>
</infraAccBndlGrp>
</infraFuncP>
</infraInfra>
Configuring a Virtual Port Channel and Applying it to a Static Port Using the REST API
Procedure
Step 1 To build vPCs, send a post with XML such as the following example:
Example:
https://apic-ip-address/api/policymgr/mo/.xml
<polUni>
<infraInfra>
<infraNodeP name="switchProfileforVPC_201">
<infraLeafS name="switchProfileforVPC_201" type="range">
<infraNodeBlk name="nodeBlk" from_="201" to_="201"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-intProfileforVPC_201"/>
</infraNodeP>
<infraNodeP name="switchProfileforVPC_202">
<infraLeafS name="switchProfileforVPC_202" type="range">
<infraNodeBlk name="nodeBlk" from_="202" to_="202"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-intProfileforVPC_202"/>
</infraNodeP>
<infraAccPortP name="intProfileforVPC_201">
<infraHPortS name="vpc201-202" type="range">
<infraPortBlk name="vpcPort1-15" fromCard="1" toCard="1" fromPort="15"
toPort="15"/>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-intPolicyGroupforVPC"/>
</infraHPortS>
</infraAccPortP>
<infraAccPortP name="intProfileforVPC_202">
<infraHPortS name="vpc201-202" type="range">
<infraPortBlk name="vpcPort1-1" fromCard="1" toCard="1" fromPort="1"
toPort="1"/>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-intPolicyGroupforVPC"/>
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccBndlGrp name="intPolicyGroupforVPC" lagT="node">
<infraRsAttEntP tDn="uni/infra/attentp-AttEntityProfileforCisco"/>
<infraRsCdpIfPol tnCdpIfPolName="CDP_ON" />
<infraRsLacpPol tnLacpLagPolName="LACP_ACTIVE" />
<infraRsHIfPol tnFabricHIfPolName="10GigAuto" />
</infraAccBndlGrp>
</infraFuncP>
</infraInfra>
</polUni>
Step 2 To attach the VPC to static port bindings, send a post with XML such as the following:
Example:
https://apic-ip-address/api/node/mo/uni.xml
<polUni>
<fvTenant dn="uni/tn-Cisco" name="Cisco" ownerKey="" ownerTag="">
<fvAp name="CCO" ownerKey="" ownerTag="" prio="unspecified">
<fvAEPg matchT="AtleastOne" name="Web" prio="unspecified">
<fvRsPathAtt encap="vlan-1201" instrImedcy="immediate" mode="native"
tDn="topology/pod-1/protpaths-201-202/pathep-[vpc201-202] />
</fvAEPg>
<fvAEPg matchT="AtleastOne" name="App" prio="unspecified">
<fvRsPathAtt encap="vlan-1202" instrImedcy="immediate" mode="native"
tDn="topology/pod-1/protpaths-201-202/pathep-[vpc201-202] />
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
Interface Speed
2 Reference the link speed policy within an interface policy group, as in this example:
<infraAccPortGrp name=myGroup>
<infraRsHIfPol tnFabricHIfPolName=SpeedPol/>
</infraAccPortGrp>
MAC Pinning
MAC pinning is used for pinning VM traffic in a round-robin fashion to each uplink based on the MAC
address of the VM. In a normal virtual port channel (vPC), a hash algorithm uses the source and destination
MAC address to determine which uplink will carry a packet. In a vPC with MAC pinning, VM1 might be
pinned to the first uplink, VM2 pinned to the second uplink, and so on.
MAC pinning is the recommended option for channeling when connecting to upstream switches that do not
support Multichassis EtherChannel (MEC).
Consider these guidelines and restrictions when configuring MAC pinning:
When a host is connected to two leaf switches using a vPC with MAC pinning, reloading one of the two
leaf switches can result in a few minutes of traffic disruption.
In the API, MAC pinning is selected in the LACP policy by setting lacp:LagPol:mode to mac-pin. When
the policy is applied to a vPC, the vPC status as shown in pc:AggrIf:pcMode and in
pc:AggrIf:operChannelMode is displayed as active, not as mac-pin.
Procedure
To set the speed for a set of interfaces, send a post with XML such as the following example:
Example:
<infraInfra dn="uni/infra">
<infraNodeP name=test1">
<infraLeafS name="leafs" type="range">
<infraNodeBlk name="nblk from_=18" to_=18/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-test1"/>
</infraNodeP>
<infraNodeP name=test2">
<infraLeafS name="leafs" type="range">
<infraNodeBlk name="nblk from_=25" to_=25/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-test2"/>
</infraNodeP>
<infraAccPortP name="test1">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1
fromCard="1" toCard="1"
fromPort="10" toPort=15/>
<infraRsAccBaseGrp
tDn="uni/infra/funcprof/accbundle-bndlgrp" />
</infraHPortS>
</infraAccPortP>
<infraAccPortP name="test2">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1
fromCard="1" toCard="1"
fromPort=20" toPort=25/>
<infraRsAccBaseGrp
tDn="uni/infra/funcprof/accbundle-bndlgrp" />
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccBndlGrp name="bndlgrp" lagT=node">
<infraRsHIfPol tnFabricHIfPolName=default"/>
<infraRsCdpIfPol tnCdpIfPolName=default/>
<infraRsLacpPol tnLacpLagPolName=default"/>
</infraAccBndlGrp>
</infraFuncP>
</infraInfra>
FEXs
Note When creating a VPC domain between two leaf switches, both switches must be in the same switch
generation, one of the following:
Generation 1 - Cisco Nexus N9K switches without EX on the end of the switch name; for example,
N9K-9312TX
Generation 2 Cisco Nexus N9K switches with EX on the end of the switch model name; for
example, N9K-93108TC-EX
Switches such as these two are not compatible VPC peers. Instead, use switches of the same generation.
Procedure
To create the policy linking the FEX through a VPC to two switches, send a post with XML such as the
following example:
Example:
<polUni>
<infraInfra dn="uni/infra">
<infraNodeP name="fexNodeP105">
<infraNodeP name="fexNodeP101">
<infraLeafS name="leafs" type="range">
<infraNodeBlk name="test" from_="101" to_="101"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-fex113nif101" />
</infraNodeP>
<infraAccPortP name="fex116nif105">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1"
fromCard="1" toCard="1" fromPort="45" toPort="48" >
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/fexprof-fexHIF116/fexbundle-fex116" fexId="116" />
</infraHPortS>
</infraAccPortP>
<infraAccPortP name="fex113nif101">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk1"
fromCard="1" toCard="1" fromPort="45" toPort="48" >
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/fexprof-fexHIF113/fexbundle-fex113" fexId="113" />
</infraHPortS>
</infraAccPortP>
<infraFexP name="fexHIF113">
<infraFexBndlGrp name="fex113"/>
<infraHPortS name="pselc-fexPC" type="range">
<infraPortBlk name="blk"
fromCard="1" toCard="1" fromPort="15" toPort="16" >
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-fexPCbundle" />
</infraHPortS>
<infraHPortS name="pselc-fexVPC" type="range">
<infraPortBlk name="blk"
fromCard="1" toCard="1" fromPort="1" toPort="8" >
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-fexvpcbundle" />
</infraHPortS>
<infraHPortS name="pselc-fexaccess" type="range">
<infraPortBlk name="blk"
fromCard="1" toCard="1" fromPort="47" toPort="47">
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-fexaccport" />
</infraHPortS>
</infraFexP>
<infraFexP name="fexHIF116">
<infraFexBndlGrp name="fex116"/>
<infraHPortS name="pselc-fexPC" type="range">
<infraPortBlk name="blk"
fromCard="1" toCard="1" fromPort="17" toPort="18" >
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-fexPCbundle" />
</infraHPortS>
<infraHPortS name="pselc-fexVPC" type="range">
<infraPortBlk name="blk"
fromCard="1" toCard="1" fromPort="1" toPort="8" >
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-fexvpcbundle" />
</infraHPortS>
<infraHPortS name="pselc-fexaccess" type="range">
<infraPortBlk name="blk"
fromCard="1" toCard="1" fromPort="47" toPort="47">
</infraPortBlk>
</infraFexP>
<infraFuncP>
<infraAccBndlGrp name="fexPCbundle" lagT="link">
<infraRsLacpPol tnLacpLagPolName='staticLag'/>
<infraRsHIfPol tnFabricHIfPolName="1GHIfPol" />
<infraRsAttEntP tDn="uni/infra/attentp-fexvpcAttEP"/>
</infraAccBndlGrp>
<lacpLagPol dn="uni/infra/lacplagp-staticLag"
ctrl="susp-individual,graceful-conv"
minLinks="2"
maxLinks="16">
</lacpLagPol>
FCoE
One or more ACI leaf switches configured through FC SAN policies to function as an NPV backbone
Selected interfaces on the NPV-configured leaf switches configured to function as F ports.
F ports accommodate FCoE traffic to and from hosts running SAN management or SAN-consuming
applications.
Selected interfaces on the NPV-configured leaf switches to function as NP ports.
NP ports accommodate FCoE traffic to and from an FCF bridge.
The FCF bridge receives FC traffic from fibre channel links typically connecting SAN storage devices and
encapsulates the FC packets into FCoE frames for transmission over the ACI fabric to the SAN management
or SAN Data-consuming hosts. It receives FCoE traffic and repackages it back to FC for transmission over
the fibre channel network.
Note In the above ACI topology, FCoE traffic support requires direct connections between the hosts and F ports
and direct connections between the FCF device and NP port.
APIC servers enable an operator to configure and monitor the FCoE traffic through the APIC Basic GUI, the
APIC Advanced GUI, the APIC NX-OS style CLI, or through application calls to the APIC REST API.
Procedure
Step 1 To create a VSAN pool, send a post with XML such as the following example.
The example creates VSAN pool vsanPool1 and specifies the range of VSANs to be included.
Example:
https://apic-ip-address/api/mo/uni/infra/vsanns-[vsanPool1]-static.xml
Example:
https://apic-ip-address/api/mo/uni/infra/vlanns-[vlanPool1]-static.xml
Example:
https://apic-ip-address/api/mo/uni/infra/vsanattrp-[vsanattr1].xml
<fcVsanAttrP name="vsanattr1">
Example:
https://apic-ip-address/api/mo/uni/fc-vsanDom1.xml
<!-- Vsan-domain -->
<fcDomP name="vsanDom1">
<fcRsVsanAttr tDn="uni/infra/vsanattrp-[vsanattr1]"/>
<infraRsVlanNs tDn="uni/infra/vlanns-[vlanPool1]-static"/>
<fcRsVsanNs tDn="uni/infra/vsanns-[vsanPool1]-static"/>
</fcDomP>
Step 5 To create the tenant, application profile, EPG and associate the FCoE bridge domain with the EPG, send a
post with XML such as the following example.
The example creates a bridge domain bd1 under a target tenant configured to support FCoE and an application
EPG epg1. It associates the EPG with VSAN domain vsanDom1 and a Fibre Channel path (to interface 1/39
on leaf switch 101. It deletes a Fibre channel path to interface 1/40 by assigning the <fvRsFcPathAtt> object
with "deleted" status. Each interface is associated with a VSAN.
Note Two other possible alternative vFC deployments are also displayed. One sample deploys vFC on a
port channel. The other sample deploys vFC on a virtual port channel.
Example:
https://apic-ip-address/api/mo/uni/tn-tenant1.xml
<fvTenant
name="tenant1">
<fvCtx name="vrf1"/>
<fvAp name="app1">
<fvAEPg name="epg1">
<fvRsBd tnFvBDName="bd1" />
<fvRsDomAtt tDn="uni/fc-vsanDom1" />
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/39]"
vsan="vsan-11" vsanMode="native"/>
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/40]"
</fvAp>
</fvTenant>
Step 6 To create a port policy group and an AEP, send a post with XML such as the following example.
The example executes the following requests:
Creates a policy group portgrp1 that includes an FC interface policy fcIfPol1, a priority flow control
policy pfcIfPol1 and a slow-drain policy sdIfPol1.
Creates an attached entity profile (AEP) AttEntP1 that associates the ports in VSAN domain vsanDom1
with the settings to be specified for fcIfPol1, pfcIfPol1, and sdIfPol1.
Example:
https://apic-ip-address/api/mo/uni.xml
<polUni>
<infraInfra>
<infraFuncP>
<infraAccPortGrp name="portgrp1">
<infraRsFcIfPol tnFcIfPolName="fcIfPol1"/>
<infraRsAttEntP tDn="uni/infra/attentp-AttEntP1" />
<infraRsQosPfcIfPol tnQosPfcIfPolName="pfcIfPol1"/>
<infraRsQosSdIfPol tnQosSdIfPolName="sdIfPol1"/>
</infraAccPortGrp>
</infraFuncP>
<infraAttEntityP name="AttEntP1">
<infraRsDomP tDn="uni/fc-vsanDom1"/>
</infraAttEntityP>
<qosPfcIfPol dn="uni/infra/pfc-pfcIfPol1" adminSt="on">
</qosPfcIfPol>
<qosSdIfPol dn="uni/infra/qossdpol-sdIfPol1" congClearAction="log"
congDetectMult="5" flushIntvl="100" flushAdminSt="enabled">
</qosSdIfPol>
<fcIfPol dn="uni/infra/fcIfPol-fcIfPol1" portMode="np">
</fcIfPol>
</infraInfra>
</polUni>
Step 7 To create a node selector and a port selector, send a post with XML such as the following example.
The example executes the following requests:
Creates node selector leafsel1 that specifies leaf node 101.
Creates port selector portsel1 that specifies port 1/39.
Example:
https://apic-ip-address/api/mo/uni.xml
<polUni>
<infraInfra>
<infraNodeP name="nprof1">
<infraLeafS name="leafsel1" type="range">
<infraNodeBlk name="nblk1" from_="101" to_="101"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-pprof1"/>
</infraNodeP>
<infraAccPortP name="pprof1">
<infraHPortS name="portsel1" type="range">
<infraPortBlk name="blk"
fromCard="1" toCard="1" fromPort="39" toPort="39">
</infraPortBlk>
</infraAccPortP>
</infraInfra>
</polUni>
Step 8 To create a vPC, send a post with XML such as the following example.
Example:
https://apic-ip-address/api/mo/uni.xml
<polUni>
<fabricInst>
</fabricInst>
</polUni>
Procedure
Example:
<infraInfra dn="uni/infra">
<infraNodeP name="nprof1">
<infraLeafS name="leafsel1" type="range">
<infraNodeBlk name="nblk1" from_="101" to_="101"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-pprof1" />
</infraNodeP>
<infraAccPortP name="pprof1">
<infraHPortS name="portsel1" type="range">
<infraPortBlk name="blk"
fromCard="1" toCard="1" fromPort="17" toPort="17"></infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/fexprof-fexprof1/fexbundle-fexbundle1" fexId="110"
/>
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccPortGrp name="portgrp1">
<infraRsAttEntP tDn="uni/infra/attentp-attentp1" />
</infraAccPortGrp>
</infraFuncP>
<infraFexP name="fexprof1">
<infraFexBndlGrp name="fexbundle1"/>
<infraHPortS name="portsel2" type="range">
<infraPortBlk name="blk2"
fromCard="1" toCard="1" fromPort="20" toPort="20"></infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-portgrp1"/>
</infraHPortS>
</infraFexP>
<infraAttEntityP name="attentp1">
<infraRsDomP tDn="uni/fc-vsanDom1"/>
</infraAttEntityP>
</infraInfra>
Step 2 Tenant configuration:
Example:
fvTenant name="tenant1">
<fvCtx name="vrf1"/>
<fvAp name="app1">
<fvAEPg name="epg1">
<fvRsBd tnFvBDName="bd1" />
<fvRsDomAtt tDn="uni/fc-vsanDom1" />
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/extpaths-110/pathep-[eth1/17]" vsan="vsan-11"
vsanMode="native"/>
</fvAEPg>
</fvAp>
</fvTenant>
Step 3 Configure FCoE over FEX (Selectors): Port-Channel:
Example:
<infraInfra dn="uni/infra">
<infraNodeP name="nprof1">
<infraLeafS name="leafsel1" type="range">
<infraNodeBlk name="nblk1" from_="101" to_="101"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-pprof1" />
</infraNodeP>
<infraAccPortP name="pprof1">
<infraHPortS name="portsel1" type="range">
<infraPortBlk name="blk1"
fromCard="1" toCard="1" fromPort="18" toPort="18"></infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/fexprof-fexprof1/fexbundle-fexbundle1" fexId="111"
/>
</infraHPortS>
</infraAccPortP>
<infraFexP name="fexprof1">
<infraFexBndlGrp name="fexbundle1"/>
<infraHPortS name="portsel1" type="range">
<infraPortBlk name="blk1"
fromCard="1" toCard="1" fromPort="20" toPort="20"></infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-pc1"/>
</infraHPortS>
</infraFexP>
<infraFuncP>
<infraAccBndlGrp name="pc1">
<infraRsAttEntP tDn="uni/infra/attentp-attentp1" />
</infraAccBndlGrp>
</infraFuncP>
<infraAttEntityP name="attentp1">
<infraRsDomP tDn="uni/fc-vsanDom1"/>
</infraAttEntityP>
</infraInfra>
Step 4 Tenant configuration:
Example:
<fvTenant name="tenant1">
<fvCtx name="vrf1"/>
<fvAp name="app1">
<fvAEPg name="epg1">
<fvRsBd tnFvBDName="bd1" />
<fvRsDomAtt tDn="uni/fc-vsanDom1" />
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/extpaths-111/pathep-[pc1]" vsan="vsan-11"
vsanMode="native" />
</fvAEPg>
</fvAp>
</fvTenant>
Step 5 Configure FCoE over FEX (Selectors): VPC:
Example:
<polUni>
<fabricInst>
<vpcInstPol name="vpc1" />
<fabricProtPol pairT="explicit" >
<fabricExplicitGEp name="vpc1" id="100" >
<fabricNodePEp id="101"/>
<fabricNodePEp id="102"/>
<fabricRsVpcInstPol tnVpcInstPolName="vpc1" />
</fabricExplicitGEp>
</fabricProtPol>
</fabricInst>
</polUni>
Step 6 Tenant configuration:
Example:
<fvTenant name="tenant1">
<fvCtx name="vrf1"/>
<fvAp name="app1">
<fvAEPg name="epg1">
<fvRsBd tnFvBDName="bd1" />
<fvRsDomAtt tDn="uni/fc-vsanDom1" />
<fvRsFcPathAtt vsanMode="native" vsan="vsan-11"
tDn="topology/pod-1/protpaths-101-102/extprotpaths-111-111/pathep-[vpc1]" />
</fvAEPg>
</fvAp>
</fvTenant>
Step 7 Selector configuration:
Example:
<polUni>
<infraInfra>
<infraNodeP name="nprof1">
<infraLeafS name="leafsel1" type="range">
<infraNodeBlk name="nblk1" from_="101" to_="101"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-pprof1" />
</infraNodeP>
<infraNodeP name="nprof2">
<infraLeafS name="leafsel2" type="range">
<infraNodeBlk name="nblk2" from_="102" to_="102"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-pprof2" />
</infraNodeP>
<infraAccPortP name="pprof1">
<infraHPortS name="portsel1" type="range">
<infraPortBlk name="blk1"
fromCard="1" toCard="1" fromPort="18" toPort="18">
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/fexprof-fexprof1/fexbundle-fexbundle1" fexId="111" />
</infraHPortS>
</infraAccPortP>
<infraAccPortP name="pprof2">
<infraHPortS name="portsel2" type="range">
<infraPortBlk name="blk2"
fromCard="1" toCard="1" fromPort="18" toPort="18">
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/fexprof-fexprof2/fexbundle-fexbundle2" fexId="111" />
</infraHPortS>
</infraAccPortP>
<infraFexP name="fexprof1">
<infraFexBndlGrp name="fexbundle1"/>
<infraHPortS name="portsel1" type="range">
<infraPortBlk name="blk1"
fromCard="1" toCard="1" fromPort="20" toPort="20">
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-vpc1"/>
</infraHPortS>
</infraFexP>
<infraFexP name="fexprof2">
<infraFexBndlGrp name="fexbundle2"/>
<infraHPortS name="portsel2" type="range">
<infraPortBlk name="blk2"
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-vpc1"/>
</infraHPortS>
</infraFexP>
<infraFuncP>
<infraAccBndlGrp name="vpc1" lagT="node">
<infraRsAttEntP tDn="uni/infra/attentp-attentp1" />
</infraAccBndlGrp>
</infraFuncP>
<infraAttEntityP name="attentp1">
<infraRsDomP tDn="uni/fc-vsanDom1"/>
</infraAttEntityP>
</infraInfra>
</polUni>
Object Description
<fvRsFcPathAtt> (Fibre Channel Path) The Fibre Channel path specifies the vFC path to the actual
interface. Deleting each object of this type removes the deployment
from that object's associated interfaces.
<fcVsanAttrpP> (VSAN/VLAN map) The VSAN/VLAN map maps the VSANs to their associated
VLANs deleting this object removes the association between the
VSANs that support FCoE connectivity and their underlying
VSANs.
<fvnsVsanInstP> (VSAN pool) The VSAN pool specifies the set of VSANs available to suport
FCoE connectivity. Deleting this pool removes those VSANs.
<fvnsVlanIsntP> ((VLAN pool) The VLAN pool specifies the set of VLANs available for VSAN
mapping. Deleting the associated VLAN pool cleans up after an
FCoE undeployment, removing the underlying VLAN entities over
which the VSAN entities ran.
<fcDomP> (VSAN or Fibre Channel The Fibre Channel domain includes all the VSANs and their
domain) mappings. Deleting this object undeploys vFC from all interfaces
associated with this domain.
<fvAEPg> (application EPG) The application EPG associated with the FCoE connectivity. If the
purpose of the application EPGs was only to support FCoE-related
activity, you might consider deleting this object.
<fvAp> (application profile) The application profile associated with the FCoE connectivity. If
the purpose of the application profile was only to support
FCoE-related activity, you might consider deleting this object.
Object Description
<fvTenant> (tenant) The tenant associated with the FCoE connectivity. If the purpose
of the tenant was only to support FCoE-related activity, you might
consider deleting this object.
Note If during clean up you delete the Ethernet configuration object (infraHPortS) for a vFC port, the default
vFC properties remain associated with that interface. For example it the interface configuration for vFC
NP port 1/20 is deleted, that port remains a vFC port but with default F port setting rather than non-default
NP port setting applied.
The following steps undeploy FCoE-enabled interfaces and EPGs accessing those interfaces using the FCoE
protocol.
Procedure
Step 1 To delete the associated Fibre Channel path objects, send a post with XML such as the following example.
The example deletes all instances of the Fibre Channel path object <fvRsFcPathAtt>.
Note Deleting the Fibre Channel paths undeploys the vFC from the ports/VSANs that used
them.
Example:
https://apic-ip-address/api/mo/uni/tn-tenant1.xml
<fvTenant
name="tenant1">
<fvCtx name="vrf1"/>
<fvAp name="app1">
<fvAEPg name="epg1">
<fvRsBd tnFvBDName="bd1" />
<fvRsDomAtt tDn="uni/fc-vsanDom1" />
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/39]"
vsan="vsan-11" vsanMode="native" status="deleted"/>
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/40]"
vsan="vsan-10" vsanMode="regular" status="deleted"/>
</fvAEPg>
</fvAp>
</fvTenant>
Step 2 To delete the associated VSAN/VLAN map, send a post such as the following example.
The example deletes the VSAN/VLAN map vsanattri1 and its associated <fcVsanAttrpP> object.
Example:
https://apic-ip-address/api/mo/uni/infra/vsanattrp-[vsanattr1].xml
Example:
https://apic-ip-address/api/mo/uni/infra/vsanns-[vsanPool1]-static.xml
Example:
https://apic-ip-address/api/mo/uni/infra/vlanns-[vlanPool1]-static.xml
Example:
https://apic-ip-address/api/mo/uni/fc-vsanDom1.xml
<!-- Vsan-domain -->
<fcDomP name="vsanDom1" status="deleted">
<fcRsVsanAttr tDn="uni/infra/vsanattrp-[vsanattr1]"/>
<infraRsVlanNs tDn="uni/infra/vlanns-[vlanPool1]-static"/>
<fcRsVsanNs tDn="uni/infra/vsanns-[vsanPool1]-static"/>
</fcDomP>
Step 6 Optional: If appropriate, you can delete the associated application EPG, the associated application profile,
or the associated tenant.
Example:
In the following sample, the associated application EPG epg1 and its associated <fvAEPg> object is deleted.
https://apic-ip-address/api/mo/uni/tn-tenant1.xml
<fvTenant
name="tenant1"/>
<fvCtx name="vrf1"/>
<fvAp name="app1">
<fvAEPg name="epg1" status= "deleted">
<fvRsBd tnFvBDName="bd1" />
<fvRsDomAtt tDn="uni/fc-vsanDom1" />
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/39]"
vsan="vsan-11" vsanMode="native" status="deleted"/>
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/40]"
vsan="vsan-10" vsanMode="regular" status="deleted"/>
</fvAEPg>
</fvAp>
</fvTenant>
Example:
In the following example, the associated application profile app1 and its associated <fvAp> object is deleted.
https://apic-ip-address/api/mo/uni/tn-tenant1.xml
<fvTenant
name="tenant1">
<fvCtx name="vrf1"/>
</fvAp>
</fvTenant>
Example:
In the following example, the entire tenant tenant1 and its associated <fvTenant> object is deleted.
https://apic-ip-address/api/mo/uni/tn-tenant1.xml
<fvTenant
name="tenant1" status="deleted">
<fvCtx name="vrf1"/>
<fvAp name="app1">
<fvAEPg name="epg1" status= "deleted">
<fvRsBd tnFvBDName="bd1" />
<fvRsDomAtt tDn="uni/fc-vsanDom1" />
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/39]"
vsan="vsan-11" vsanMode="native" status="deleted"/>
<fvRsFcPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/40]"
vsan="vsan-10" vsanMode="regular" status="deleted"/>
</fvAEPg>
</fvAp>
</fvTenant>
802.1Q Tunnels
CDP and LLDP tunneling with more than two interfaces floods packets on all interfaces.
ACI leaf switches do not perform any action in response to STP TCN packets and TCN packets
can only be tunneled.
If a PC or VPC is the only interface in a dot1q-tunnel and it is deleted and reconfigured, remove the
association of the PC/VPC to the dot1q-tunnel and reconfigure it.
The Ethertypes for double-tagged frames must be 0x9100 followed by 0x8100.
You can configure multiple ports (even across leaf switches) in a dot1q-tunnel. A port may only be
part of one tunnel.
Regular EPGs are not supported in tunnels.
FEX interfaces are not supported as members of a dot1q-tunnel.
Interface-level statistics are supported for interfaces in dot1q-tunnels, but statistics at the tunnel level
are not supported.
Procedure
Step 1 Create a dot1q-tunnel using the REST API with XML such as the following:
Example:
<fvTnlEPg name="VRF64_dot1q_tunnel" qiqL2ProtTunMask="lldp" >
<fvRsTnlpathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/13]"/>
</fvTnlEPg>
Step 2 Configure a Layer 2 Interface policy with static binding with XML such as the following:
Example:
<l2IfPol name="VRF64_L2_int_pol" qinq="edgePort" />
Step 3 Apply the Layer 2 Interface policy to a Leaf Access Port Policy Group with XML such as the following:
Example:
<infraAccPortGrp name="VRF64_L2_Port_Pol_Group" >
<infraRsL2IfPol tnL2IfPolName="VRF64_L2_int_pol"/>
</infraAccPortGrp>
Step 4 Configure a Leaf Profile with an Interface Selector with XML such as the following example:
Example:
<infraAccPortP name="VRF64_dot1q_leaf_profile" >
<infraHPortS name="vrf64_access_port_selector" type="range">
<infraPortBlk name="block2" toPort="15" toCard="1" fromPort="13" fromCard="1"/>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-VRF64_L2_Port_Pol_Group" />
</infraHPortS>
</infraAccPortP>
Procedure
Step 1 Create an dot1q-tunnel using the REST API with XML such as the following:
Example:
<fvTnlEPg name="WEB" qiqL2ProtTunMask=lldp>
<fvRsTnlpathAtt tDn="topology/pod-1/paths-101/pathep-[po2]"/>
</fvTnlEPg>
Step 2 Configure a Layer 2 Interface policy with static binding with XML such as the following:
Example:
<l2IfPol name="testL2IfPol" qinq="edgePort"/>
Step 3 Apply the Layer 2 Interface policy to a Leaf Access Port Policy Group with XML such as the following:
Example:
<infraAccBndlGrp name="po2" lagT="link">
<infraRsL2IfPol tnL2IfPolName="testL2IfPol"/>
</infraAccBndlGrp>
Step 4 Configure a Leaf Profile with an Interface Selector with XML such as the following example:
Example:
<infraAccPortP name="PC">
<infraHPortS name="allow" type="range">
<infraPortBlk name="block2" fromCard="1" toCard="1" fromPort="10" toPort="11" />
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-po2"/>
</infraHPortS>
</infraAccPortP>
Procedure
Step 1 Create an 802.1Q tunnel using the REST API with XML such as the following:
Example:
<fvTnlEPg name="WEB" qiqL2ProtTunMask=lldp>
<fvRsTnlpathAtt tDn="topology/pod-1/protpaths-101-102/pathep-[po4]" />
</fvTnlEPg>
Step 2 Configure a Layer 2 Interface policy with static binding with XML such as the following:
Example:
<l2IfPol name="testL2IfPol" qinq="edgePort"/>
Step 3 Apply the Layer 2 Interface policy to a Leaf Access Port Policy Group with XML such as the following:
Example:
<infraAccBndlGrp name="po4" lagT="node">
<infraRsL2IfPol tnL2IfPolName="testL2IfPol"/>
</infraAccBndlGrp>
Step 4 Configure a Leaf Profile with an Interface Selector with XML such as the following example:
Example:
<infraAccPortP name="VPC">
<infraHPortS name="allow" type="range">
<infraPortBlk name="block2" fromCard="1" toCard="1" fromPort="10" toPort="11" />
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-po4"/>
</infraHPortS>
</infraAccPortP>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-shipping1"/>
</infraNodeP>
<infraNodeP name="bLeaf2">
<infraLeafS name="leafs" type="range">
<infraNodeBlk name="nblk" from_="102" to_="102">
</infraNodeBlk>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-shipping2"/>
</infraNodeP>
<infraAccPortP name="shipping1">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk" fromCard="1" toCard="1" fromPort="4" toPort="4"/>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-accountingLag1" />
</infraHPortS>
</infraAccPortP>
<infraAccPortP name="shipping2">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk" fromCard="1" toCard="1" fromPort="2" toPort="2"/>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accbundle-accountingLag2" />
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccBndlGrp name="accountingLag1" lagT='node'>
<infraRsAttEntP tDn="uni/infra/attentp-default"/>
<infraRsLacpPol tnLacpLagPolName='accountingLacp1'/>
<infraRsL2IfPol tnL2IfPolName="testL2IfPol"/>
</infraAccBndlGrp>
<infraAccBndlGrp name="accountingLag2" lagT='node'>
<infraRsAttEntP tDn="uni/infra/attentp-default"/>
<infraRsLacpPol tnLacpLagPolName='accountingLacp1'/>
<infraRsL2IfPol tnL2IfPolName="testL2IfPol"/>
</infraAccBndlGrp>
</infraFuncP>
<lacpLagPol name='accountingLacp1' ctrl='15' descr='accounting' maxLinks='14' minLinks='1'
mode='active' />
<l2IfPol name='testL2IfPol' qinq='edgePort'/>
<infraAttEntityP name="default">
</infraAttEntityP>
</infraInfra>
XML with Post 3:
<polUni>
<fvTenant dn="uni/tn-Coke" name="Coke">
<!-- bridge domain -->
<fvTnlEPg name="WEB6">
<fvRsTnlpathAtt tDn="topology/pod-1/protpaths-101-102/pathep-[accountingLag2]"/>
</fvTnlEPg>
</fvTenant>
</polUni>
Breakout Ports
Note This feature is supported only on the access facing ports of the N9K-C9332PQ switch.
100GE breakout ports are currently not supported.
You can configure 40GE ports for dynamic breakout using the Basic or Advanced mode APIC GUI, the
NX-OS style CLI, or the REST API.
Procedure
Step 1 Configure a breakout policy group for the breakout port with JSON, such as the following example:
Example:
In this example, we create an interface profile 'brkouttest' with the only port 44 underneath its port selector.
The port selector is pointed to a breakout policy group 'new-brkoutPol'.
{
"infraAccPortP": {
"attributes": {
"dn":"uni/infra/accportprof-brkouttest",
"name":"brkouttest",
"rn":"accportprof-brkouttest",
"status":"created,modified"
},
"children":[ {
"infraHPortS": {
"attributes": {
"dn":"uni/infra/accportprof-brkouttest/hports-tst1-typ-range",
"name":"tst1",
"rn":"hports-tst1-typ-range",
"status":"created,modified"
},
"children":[ {
"infraPortBlk": {
"attributes": {
"dn":"uni/infra/accportprof-brkouttest/hports-tst1-typ-range/portblk-block2",
"fromPort":"44",
"toPort":"44",
"name":"block2",
"rn":"portblk-block2",
"status":"created,modified"
},
"children":[] }
}, {
"infraRsAccBaseGrp": {
"attributes":{
"tDn":"uni/infra/funcprof/brkoutportgrp-new-brkoutPol",
"status":"created,modified"
},
"children":[]
}
}
]
}
}
]
}
}
Step 2 Create a new switch profile and associate it with the port profile, previously created, with JSON such as the
following example:
Example:
In this example, we create a new switch profile 'leaf1017' with switch 1017 as the only node. We associate
this new switch profile with the port profile 'brkouttest' created above. After this, the port 44 on switch 1017
will have 4 sub ports.
Example:
{
"infraNodeP": {
"attributes": {
"dn":"uni/infra/nprof-leaf1017",
"name":"leaf1017","rn":"nprof-leaf1017",
"status":"created,modified"
},
"children": [ {
"infraLeafS": {
"attributes": {
"dn":"uni/infra/nprof-leaf1017/leaves-1017-typ-range",
"type":"range",
"name":"1017",
"rn":"leaves-1017-typ-range",
"status":"created"
},
"children": [ {
"infraNodeBlk": {
"attributes": {
"dn":"uni/infra/nprof-leaf1017/leaves-1017-typ-range/nodeblk-102bf7dc60e63f7e",
"from_":"1017","to_":"1017",
"name":"102bf7dc60e63f7e",
"rn":"nodeblk-102bf7dc60e63f7e",
"status":"created"
},
"children": [] }
}
]
}
}, {
"infraRsAccPortP": {
"attributes": {
"tDn":"uni/infra/accportprof-brkouttest",
"status":"created,modified"
},
"children": [] }
}
]
}
}
Step 3 Configure the subports.
Example:
This example configures subports 1/44/1, 1/44/2, 1/44/3, 1/44/4 on switch 1017, for instance, in the example
below, we configure interface 1/41/3. It also creates the infraSubPortBlk object instead of the infraPortBlk
object.
{
"infraAccPortP": {
"attributes": {
"dn":"uni/infra/accportprof-brkouttest1",
"name":"brkouttest1",
"rn":"accportprof-brkouttest1",
"status":"created,modified"
},
"children": [{
"infraHPortS": {
"attributes": {
"dn":"uni/infra/accportprof-brkouttest1/hports-sel1-typ-range",
"name":"sel1",
"rn":"hports-sel1-typ-range",
"status":"created,modified"
},
"children": [{
"infraSubPortBlk": {
"attributes": {
"dn":"uni/infra/accportprof-brkouttest1/hports-sel1-typ-range/subportblk-block2",
"fromPort":"44",
"toPort":"44",
"fromSubPort":"3",
"toSubPort":"3",
"name":"block2",
"rn":"subportblk-block2",
"status":"created"
},
"children":[]}
},
{
"infraRsAccBaseGrp": {
"attributes": {
"tDn":"uni/infra/funcprof/accportgrp-p1",
"status":"created,modified"
},
"children":[]}
}
]
}
}
]
}
}
IGMP Snooping
Note We recommend that you do not disable IGMP snooping on the bridge domain. If you disable IGMP
snooping, you might see reduced multicast performance because of excessive false flooding within the
bridge domain.
IGMP snooping software examines Layer 2 IP multicast traffic within a bridge domain to discover the ports
where interested receivers reside. Using the port information, IGMP snooping can reduce bandwidth
consumption in a multi-access bridge domain environment to avoid flooding the entire bridge domain. By
default, IGMP snooping is enabled on the bridge domain.
This figure shows the IGMP routing functions and IGMP snooping functions both contained on an ACI leaf
switch with connectivity to a host. The IGMP snooping feature snoops the IGMP membership reports and
Leave messages and forwards them only when necessary to the IGMP router function.
IGMP snooping operates upon IGMPv1, IGMPv2, and IGMPv3 control plane packets where Layer 3 control
plane packets are intercepted and influence the Layer 2 forwarding behavior.
IGMP snooping has the following proprietary features:
Source filtering that allows forwarding of multicast packets based on destination and source IP addresses
Multicast forwarding based on IP addresses rather than the MAC address
Multicast forwarding alternately based on the MAC address
Note For more information about IGMP snooping, see RFC 4541.
Virtualization Support
You can define multiple virtual routing and forwarding (VRF) instances for IGMP snooping.
On leaf switches, you can use the show commands with a VRF argument to provide a context for the information
displayed. The default VRF is used if no VRF argument is supplied.
Configuring and Assigning an IGMP Snoop Policy to a Bridge Domain using the REST API
Procedure
To configure an IGMP Snooping policy and assign it to a bridge domain, send a post with XML such as the
following example:
Example:
https://apic-ip-address/api/node/mo/uni/.xml
<fvTenant name="mcast_tenant1">
<!-- Create an IGMP snooping template, and provide the options -->
<igmpSnoopPol name="igmp_snp_bd_21"
adminSt="enabled"
lastMbrIntvl="1"
queryIntvl="125"
rspIntvl="10"
startQueryCnt="2"
startQueryIntvl="31"
/>
<fvCtx name="ip_video"/>
<fvBD name="bd_21">
<fvRsCtx tnFvCtxName="ip_video"/>
Procedure
Example:
Enabling IGMP Layer 2 Multicast on Static Ports Using the REST API
You can enable IGMP snoop and layer 2 multicast processing on ports that have been statically assigned to
an EPG. You can create and assign access groups of users that are permitted or denied access to the IGMP
snoop and multicast traffic enabled on those ports.
Procedure
To configure applicaton EPGs with static ports, enable those ports to receive and process IGMP snoop and
layer 2 multicast traffic, and assign groups to access or be denied access to that traffic, send a post with XML
such as the following example.
In the following example, IGMP snoop is enabled on leaf 102 interface 1/10 on VLAN 202. Multicast IP
addressses 224.1.1.1 and 225.1.1.1 are associated with this port.
Example:
https://apic-ip-address/api/node/mo/uni/.xml
<fvTenant name="tenant_A">
<fvAp name="appplication_A">
<fvAEPg name="epg_A">
<fvRsPathAtt encap="vlan-202" instrImedcy="immediate" mode="regular"
tDn="topology/pod-1/paths-102/pathep-[eth1/10]">
<!-- IGMP snooping static group case -->
<igmpSnoopStaticGroup group="224.1.1.1" source="0.0.0.0"/>
<igmpSnoopStaticGroup group="225.1.1.1" source="2.2.2.2"/>
</fvRsPathAtt>
</fvAEPg>
</fvAp>
</fvTenant>
Proxy ARP
To enable Proxy ARP, intra-EPG endpoint isolation must be enabled on the EPG see the following figure for
details. For more information about intra-EPG isolation and Cisco ACI, see the Cisco ACI Virtualization
Guide.
Proxy ARP within the Cisco ACI fabric is different from the traditional proxy ARP. As an example of the
communication process, when proxy ARP is enabled on an EPG, if an endpoint A sends an ARP request for
endpoint B and if endpoint B is learned within the fabric, then endpoint A will receive a proxy ARP response
from the bridge domain (BD) MAC. If endpoint A sends an ARP request for endpoint B, and if endpoint B
is not learned within the ACI fabric already, then the fabric will send a proxy ARP request within the BD.
Endpoint B will respond to this proxy ARP request back to the fabric. At this point, the fabric does not send
a proxy ARP response to endpoint A, but endpoint B is learned within the fabric. If endpoint A sends another
ARP request to endpoint B, then the fabric will send a proxy ARP response from the BD MAC.
The following example describes the proxy ARP resolution steps for communication between clients VM1
and VM2:
1 VM1 to VM2 communication is desired.
Device State
VM1 IP = * MAC = *
VM2 IP = * MAC = *
Figure 24: VM1 sends an ARP Request with a Broadcast MAC address to VM2
Device State
VM1 IP = VM2 IP; MAC = ?
VM2 IP = * MAC = *
3 The ACI fabric floods the proxy ARP request within the bridge domain (BD).
Figure 25: ACI Fabric Floods the Proxy ARP Request within the BD
Device State
VM1 IP = VM2 IP; MAC = ?
Device State
VM1 IP = VM2 IP; MAC = ?
5 VM2 is learned.
Device State
VM1 IP = VM2 IP; MAC = ?
Figure 28: VM1 Sends an ARP Request with a Broadcast MAC Address to VM2
Device State
VM1 IP = VM2 IP MAC = ?
Device State
VM1 IP = VM2 IP; MAC = BD MAC
Proxy ARP is supported only on isolated EPGs. If an EPG is not isolated, a fault will be raised. For
communication to happen within isolated EPGs with proxy ARP enabled, you must configure uSeg
EPGs. For example, within the isolated EPG, there could be multiple VMs with different IP addresses,
and you can configure a uSeg EPG with IP attributes matching the IP address range of these VMs.
ARP requests from isolated endpoints to regular endpoints and from regular endpoints to isolated
endpoints do not use proxy ARP. In such cases, endpoints communicate using the real MAC addresses
of destination VMs.
Procedure
Example:
<polUni>
<fvTenant name="Tenant1" status="">
<fvCtx name="EngNet"/>
<!-- bridge domain -->
<fvBD name="BD1">
<fvRsCtx tnFvCtxName="EngNet" />
<fvSubnet ip="1.1.1.1/24"/>
</fvBD>
<fvAp name="Tenant1_app">
<fvAEPg name="Tenant1_epg" pcEnfPref-"enforced" fwdCtrl="proxy-arp">
<fvRsBd tnFvBDName="BD1" />
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-dom9"/>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
Configuring Layer 3 Outside for Tenant Networks Using the REST API
The external routed network configured in the example can also be extended to support IPv4. Both IPv4 and
IPv6 routes can be advertised to and learned from the external routed network.
Procedure
Configure L3 Outside for tenant networks and associate the bridge domain with the Layer3 Outside.
Example:
<fvTenant name='TenantName'>
<l3extOut name="L3Out1" enforceRtctrl="import,export">
<l3extRsL3DomAtt tDn="uni/l3dom-l3DomP"/>
<l3extLNodeP name="LNodeP1" >
<l3extRsNodeL3OutAtt rtrId="1.2.3.4" tDn="topology/pod-1/node-101">
<l3extLoopBackIfP addr="10.10.11.1" />
<l3extLoopBackIfP addr="2000::3" />
</l3extRsNodeL3OutAtt>
<l3extLIfP name="IFP1" >
<l3extRsPathL3OutAtt addr="10.11.12.10/24" ifInstT="l3-port"
tDn="topology/pod-1/paths-103/pathep-[eth1/17]" />
</l3extLIfP>
<l3extLIfP name="IFP2" >
<l3extRsPathL3OutAtt addr="2001::3/64" ifInstT="l3-port"
tDn="topology/pod-1/paths-103/pathep-[eth1/17]" />
</l3extLIfP>
</l3extLNodeP>
<l3extRsEctx tnFvCtxName="VRF1"/>
<l3extInstP name="InstP1" >
<l3extSubnet ip="192.168.1.0/24" scope="import-security" aggregate=""/>
<l3extSubnet ip="0.0.0.0/0" scope="export-rtctrl,import-rtctrl,import-security"
aggregate="export-rtctrl,import-rtctrl"/>
<l3extSubnet ip="192.168.2.0/24" scope="export-rtctrl" aggregate=""/>
<l3extSubnet ip="::/0" scope="import-rtctrl,import-security"
aggregate="import-rtctrl"/>
<l3extSubnet ip="2001:17a::/64" scope="export-rtctrl" aggregate=""/>
</l3extInstP>
</l3extOut>
</fvTenant>
<polUni>
<fvTenant name='t0'>
<fvCtx name="o1">
<fvRsOspfCtxPol tnOspfCtxPolName="ospfCtxPol"/>
</fvCtx>
<fvCtx name="o2">
</fvCtx>
<fvBD name="bd1">
<fvRsBDToOut tnL3extOutName='T0-o1-L3OUT-1'/>
<fvSubnet ip='10.16.1.1/24' scope='public'/>
<fvRsCtx tnFvCtxName="o1"/>
</fvBD>
<fvAp name="AP1">
<fvAEPg name="bd1-epg1">
<fvRsCons tnVzBrCPName="vzBrCP-1">
</fvRsCons>
<fvRsProv tnVzBrCPName="vzBrCP-1">
</fvRsProv>
<fvSubnet ip='10.16.2.1/24' scope='private'/>
<fvSubnet ip='10.16.3.1/24' scope='private'/>
<fvRsBd tnFvBDName="bd1"/>
<fvRsDomAtt tDn="uni/phys-physDomP"/>
<fvRsPathAtt
tDn="topology/pod-1/paths-101/pathep-[eth1/40]"
encap='vlan-100'
mode='regular'
instrImedcy='immediate' />
</fvAEPg>
<fvAEPg name="bd1-epg2">
<fvRsCons tnVzBrCPName="vzBrCP-1">
</fvRsCons>
<fvRsProv tnVzBrCPName="vzBrCP-1">
</fvRsProv>
<fvSubnet ip='10.16.4.1/24' scope='private'/>
<fvSubnet ip='10.16.5.1/24' scope='private'/>
<fvRsBd tnFvBDName="bd1"/>
<fvRsDomAtt tDn="uni/phys-physDomP"/>
<fvRsPathAtt
tDn="topology/pod-1/paths-101/pathep-[eth1/41]"
encap='vlan-200'
mode='regular'
instrImedcy='immediate'/>
</fvAEPg>
</fvAp>
<l3extOut name="T0-o1-L3OUT-1">
<l3extRsEctx tnFvCtxName="o1"/>
<ospfExtP areaId='60'/>
<l3extInstP name="l3extInstP-1">
<fvRsCons tnVzBrCPName="vzBrCP-1">
</fvRsCons>
<fvRsProv tnVzBrCPName="vzBrCP-1">
</fvRsProv>
<l3extSubnet ip="192.5.1.0/24" />
<l3extSubnet ip="192.5.2.0/24" />
<l3extSubnet ip="192.6.0.0/16" />
<l3extSubnet ip="199.0.0.0/8" />
</l3extInstP>
<l3extLNodeP name="l3extLNodeP-1">
<l3extRsNodeL3OutAtt
tDn=topology/pod-1/node-101" rtrId="10.17.1.1">
<ipRouteP ip="10.16.101.1/32">
<ipNexthopP nhAddr="10.17.1.99"/>
</ipRouteP>
<ipRouteP ip="10.16.102.1/32">
<ipNexthopP nhAddr="10.17.1.99"/>
</ipRouteP>
<ipRouteP ip="10.17.1.3/32">
<ipNexthopP nhAddr="10.11.2.2"/>
</ipRouteP>
</l3extRsNodeL3OutAtt >
<l3extLIfP name='l3extLIfP-1'>
<l3extRsPathL3OutAtt
tDn=topology/pod-1/paths-101/pathep-[eth1/25]"
encap='vlan-1001'
ifInstT='sub-interface'
addr="10.11.2.1/24"
mtu="1500"/>
<ospfIfP>
<ospfRsIfPol tnOspfIfPolName='ospfIfPol'/>
</ospfIfP>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
<vzFilter name="vzFilter-in-1">
<vzEntry name="vzEntry-in-1"/>
</vzFilter>
<vzFilter name="vzFilter-out-1">
<vzEntry name="vzEntry-out-1"/>
</vzFilter>
<vzBrCP name="vzBrCP-1">
<vzSubj name="vzSubj-1">
<vzInTerm>
<vzRsFiltAtt tnVzFilterName="vzFilter-in-1"/>
</vzInTerm>
<vzOutTerm>
<vzRsFiltAtt tnVzFilterName="vzFilter-out-1"/>
</vzOutTerm>
</vzSubj>
</vzBrCP>
</fvTenant>
</polUni>
Route Controls
Configuring a Route Control Protocol to Use Import and Export Controls, With the REST API
This example assumes that you have configured the Layer 3 outside network connections using BGP. It is
also possible to perform these tasks for a network using OSPF.
Procedure
Configure the route control protocol using import and export controls.
Example:
<l3extOut descr="" dn="uni/tn-Ten_ND/out-L3Out1" enforceRtctrl="export" name="L3Out1"
ownerKey="" ownerTag="" targetDscp="unspecified">
<l3extLNodeP descr="" name="LNodeP1" ownerKey="" ownerTag="" tag="yellow-green"
targetDscp="unspecified">
<l3extRsNodeL3OutAtt rtrId="1.2.3.4" rtrIdLoopBack="yes"
tDn="topology/pod-1/node-101">
All tenant WAN connections use a single session on the spine switches where the WAN routers are connected.
This aggregation of tenant BGP sessions towards the Data Center Interconnect Gateway (DCIG) improves
control plane scale by reducing the number of tenant BGP sessions and the amount of configuration required
for all of them. The network is extended out using l3-subinterfaces configured on spine fabric ports. Transit
routing with shared services using Layer 3 EVPN services over fabric WAN is not supported.
A Layer 3 external outside network (L3extOut) for EVPN physical connectivity for a spine switch is specified
under the infra tenant, and includes the following:
All regular tenants use the above-defined physical connectivity. The L3extOut defined in regular tenants only
needs the following:
An l3extConsLbl consumer label that must be matched with the same provider label of an L3extOut
for EVPN in the infra tenant. Label matching enables application EPGs in other tenants to consume
the LNodeP external L3extOut EPG.
An l3extInstP with subnets and contracts. The scope of the subnet is used to control import/export
route control and security policies.
The BGP EVPN session in the matching provider L3extOut in the infra tenant advertises the tenant
routes defined in this L3extOut.
Observe the following Layer 3 EVPN services for fabric WAN guidelines and limitations:
At this time, only a single Layer 3 EVPN Services Over Fabric WAN provider policy can be deployed
on spine switch interfaces for the whole fabric.
Up to APIC release 2.0(2), Layer 3 EVPN is not supported with multipod. In release 2.0 (2) the two
features are supported in the same fabric only over Cisco Nexus N9000K switches without EX on the
end of the switch name; for example, N9K-9312TX. Since the 2.1(1) release, the two features can be
deployed together over all the switches used in the multipod and EVPN topologies.
When configuring Layer 3 EVPN connectivity on a spine switch, wait for the control plane to converge
before configuring Layer 3 EVPN on another spine.
A spine switch can be added to multiple provider Layer 3 EVPN Outs but the provider labels have to
be different for each Layer 3 EVPN Out. Also, in this case, the OSPF Area has to be different on each
of the L3extOuts and use different loopback addresses.
The BGP EVPN session in the matching provider L3extOut in the infra tenant advertises the tenant
routes defined in this L3extOut.
When deploying three L3 EVPN Outs, if only 1 has a provider/consumer label for L3 EVPN, and 0/0
export aggregation, APIC will export all routes. This is the same as existing L3extOut on leaf switches
for tenants.
If there is direct peering between a spine switch and a data center interconnect (DCI) router, the transit
routes from leaf switches to the ASR have the next hop as the PTEP of the leaf. In this case, define a
static route on the ASR for the TEP range of that ACI pod. Also, if the DCI is dual-homed to the same
pod, then the precedence (administrative distance) of the static route should be the same as the route
received through the other link.
The default bgpPeerPfxPol policy restricts routes to 20, 000. For Layer 3 EVPN peers, increase this
as needed.
In a deployment scenario where there are two L3extOuts on one spine, and one of them has the provider
label prov1 and peers with the DCI 1, the second L3extOut peers with DCI 2 with provider label prov2.
If the tenant VRF has a consumer label pointing to any 1 of the provider labels (either prov1 or prov2),
the tenant route will be sent out both DCI 1 and DCI 2.
Configuring Layer 3 EVPN for WAN Services Using the REST API
Procedure
Step 1 The following example shows how to deploy nodes and spine switch interfaces for L3 EVPN for WAN
services using the REST API:
Example:
POST
https://192.0.20.123/api/mo/uni/golf.xml
Step 2 The XML below configures the spine switch interfaces and infra tenant provider of the Layer 3 EVPN WAN
service. Include this XML structure in the body of the POST message.
Example:
<l3extOut descr="" dn="uni/tn-infra/out-golf" enforceRtctrl="export,import"
name="golf"
ownerKey="" ownerTag="" targetDscp="unspecified">
<l3extRsEctx tnFvCtxName="overlay-1"/>
<l3extProvLbl descr="" name="golf"
ownerKey="" ownerTag="" tag="yellow-green"/>
<l3extLNodeP configIssues="" descr=""
name="bLeaf" ownerKey="" ownerTag=""
tag="yellow-green" targetDscp="unspecified">
<l3extRsNodeL3OutAtt rtrId="10.10.3.3" rtrIdLoopBack="no"
tDn="topology/pod-1/node-111">
<l3extInfraNodeP descr="" fabricExtCtrlPeering="yes" name=""/>
<l3extLoopBackIfP addr="10.10.3.3" descr="" name=""/>
</l3extRsNodeL3OutAtt>
<l3extRsNodeL3OutAtt rtrId="10.10.3.4" rtrIdLoopBack="no"
tDn="topology/pod-1/node-112">
<l3extInfraNodeP descr="" fabricExtCtrlPeering="yes" name=""/>
<l3extLoopBackIfP addr="10.10.3.4" descr="" name=""/>
</l3extRsNodeL3OutAtt>
<l3extLIfP descr="" name="portIf-spine1-3"
ownerKey="" ownerTag="" tag="yellow-green">
<ospfIfP authKeyId="1" authType="none" descr="" name="">
<ospfRsIfPol tnOspfIfPolName="ospfIfPol"/>
</ospfIfP>
<l3extRsNdIfPol tnNdIfPolName=""/>
<l3extRsIngressQosDppPol tnQosDppPolName=""/>
<l3extRsEgressQosDppPol tnQosDppPolName=""/>
<l3extRsPathL3OutAtt addr="7.2.1.1/24" descr=""
encap="vlan-4"
encapScope="local"
ifInstT="sub-interface"
llAddr="::" mac="00:22:BD:F8:19:FF"
mode="regular"
mtu="1500"
tDn="topology/pod-1/paths-111/pathep-[eth1/12]"
targetDscp="unspecified"/>
</l3extLIfP>
<l3extLIfP descr="" name="portIf-spine2-1"
ownerKey=""
ownerTag=""
tag="yellow-green">
<ospfIfP authKeyId="1"
authType="none"
descr=""
name="">
<ospfRsIfPol tnOspfIfPolName="ospfIfPol"/>
</ospfIfP>
<l3extRsNdIfPol tnNdIfPolName=""/>
<l3extRsIngressQosDppPol tnQosDppPolName=""/>
<l3extRsEgressQosDppPol tnQosDppPolName=""/>
<l3extRsPathL3OutAtt addr="7.1.0.1/24" descr=""
encap="vlan-4"
encapScope="local"
ifInstT="sub-interface"
llAddr="::" mac="00:22:BD:F8:19:FF"
mode="regular"
mtu="9000"
tDn="topology/pod-1/paths-112/pathep-[eth1/11]"
targetDscp="unspecified"/>
</l3extLIfP>
<l3extLIfP descr="" name="portif-spine2-2"
ownerKey=""
ownerTag=""
tag="yellow-green">
<ospfIfP authKeyId="1"
authType="none" descr=""
name="">
<ospfRsIfPol tnOspfIfPolName="ospfIfPol"/>
</ospfIfP>
<l3extRsNdIfPol tnNdIfPolName=""/>
<l3extRsIngressQosDppPol tnQosDppPolName=""/>
<l3extRsEgressQosDppPol tnQosDppPolName=""/>
<l3extRsPathL3OutAtt addr="7.2.2.1/24" descr=""
encap="vlan-4"
encapScope="local"
ifInstT="sub-interface"
llAddr="::" mac="00:22:BD:F8:19:FF"
mode="regular"
mtu="1500"
tDn="topology/pod-1/paths-112/pathep-[eth1/12]"
targetDscp="unspecified"/>
</l3extLIfP>
<l3extLIfP descr="" name="portIf-spine1-2"
ownerKey="" ownerTag="" tag="yellow-green">
<ospfIfP authKeyId="1" authType="none" descr="" name="">
<ospfRsIfPol tnOspfIfPolName="ospfIfPol"/>
</ospfIfP>
<l3extRsNdIfPol tnNdIfPolName=""/>
<l3extRsIngressQosDppPol tnQosDppPolName=""/>
<l3extRsEgressQosDppPol tnQosDppPolName=""/>
<l3extRsPathL3OutAtt addr="9.0.0.1/24" descr=""
encap="vlan-4"
encapScope="local"
ifInstT="sub-interface"
llAddr="::" mac="00:22:BD:F8:19:FF"
mode="regular"
mtu="9000"
tDn="topology/pod-1/paths-111/pathep-[eth1/11]"
targetDscp="unspecified"/>
</l3extLIfP>
<l3extLIfP descr="" name="portIf-spine1-1"
ownerKey="" ownerTag="" tag="yellow-green">
<ospfIfP authKeyId="1" authType="none" descr="" name="">
<ospfRsIfPol tnOspfIfPolName="ospfIfPol"/>
</ospfIfP>
<l3extRsNdIfPol tnNdIfPolName=""/>
<l3extRsIngressQosDppPol tnQosDppPolName=""/>
<l3extRsEgressQosDppPol tnQosDppPolName=""/>
<l3extRsPathL3OutAtt addr="7.0.0.1/24" descr=""
encap="vlan-4"
encapScope="local"
ifInstT="sub-interface"
llAddr="::" mac="00:22:BD:F8:19:FF"
mode="regular"
mtu="1500"
tDn="topology/pod-1/paths-111/pathep-[eth1/10]"
targetDscp="unspecified"/>
</l3extLIfP>
<bgpInfraPeerP addr="10.10.3.2"
allowedSelfAsCnt="3"
ctrl="send-com,send-ext-com"
Step 3 The XML below configures the tenant consumer of the infra Layer 3 EVPN WAN service. Include this XML
structure in the body of the POST message.
Example:
<fvTenant descr="" dn="uni/tn-pep6" name="pep6" ownerKey="" ownerTag="">
<vzBrCP descr="" name="webCtrct"
ownerKey="" ownerTag="" prio="unspecified"
scope="global" targetDscp="unspecified">
<vzSubj consMatchT="AtleastOne" descr=""
name="http" prio="unspecified" provMatchT="AtleastOne"
revFltPorts="yes" targetDscp="unspecified">
<vzRsSubjFiltAtt directives="" tnVzFilterName="default"/>
</vzSubj>
</vzBrCP>
<vzBrCP descr="" name="webCtrct-pod2"
ownerKey="" ownerTag="" prio="unspecified"
scope="global" targetDscp="unspecified">
<vzSubj consMatchT="AtleastOne" descr=""
name="http" prio="unspecified"
provMatchT="AtleastOne" revFltPorts="yes"
targetDscp="unspecified">
<vzRsSubjFiltAtt directives=""
tnVzFilterName="default"/>
</vzSubj>
</vzBrCP>
<fvCtx descr="" knwMcastAct="permit"
name="ctx6" ownerKey="" ownerTag=""
pcEnfDir="ingress" pcEnfPref="enforced">
<bgpRtTargetP af="ipv6-ucast"
descr="" name="" ownerKey="" ownerTag="">
<bgpRtTarget descr="" name="" ownerKey="" ownerTag=""
rt="route-target:as4-nn2:100:1256"
type="export"/>
</fvBD>
<vnsSvcCont/>
<fvRsTenantMonPol tnMonEPGPolName=""/>
<fvAp descr="" name="AP1"
ownerKey="" ownerTag="" prio="unspecified">
<fvAEPg descr=""
isAttrBasedEPg="no"
matchT="AtleastOne"
name="epg107"
pcEnfPref="unenforced" prio="unspecified">
<fvRsCons prio="unspecified"
tnVzBrCPName="webCtrct-pod2"/>
<fvRsPathAtt descr=""
encap="vlan-1256"
instrImedcy="immediate"
mode="regular" primaryEncap="unknown"
tDn="topology/pod-2/paths-107/pathep-[eth1/48]"/>
<fvRsDomAtt classPref="encap" delimiter=""
encap="unknown"
instrImedcy="immediate"
primaryEncap="unknown"
resImedcy="lazy" tDn="uni/phys-phys"/>
<fvRsCustQosPol tnQosCustomPolName=""/>
<fvRsBd tnFvBDName="bd107"/>
<fvRsProv matchT="AtleastOne"
prio="unspecified"
tnVzBrCPName="default"/>
</fvAEPg>
<fvAEPg descr=""
isAttrBasedEPg="no"
matchT="AtleastOne"
name="epg103"
pcEnfPref="unenforced" prio="unspecified">
<fvRsCons prio="unspecified" tnVzBrCPName="default"/>
<fvRsCons prio="unspecified" tnVzBrCPName="webCtrct"/>
<fvRsPathAtt descr="" encap="vlan-1256"
instrImedcy="immediate"
mode="regular" primaryEncap="unknown"
tDn="topology/pod-1/paths-103/pathep-[eth1/48]"/>
<fvRsDomAtt classPref="encap" delimiter=""
encap="unknown"
instrImedcy="immediate"
primaryEncap="unknown"
resImedcy="lazy" tDn="uni/phys-phys"/>
<fvRsCustQosPol tnQosCustomPolName=""/>
<fvRsBd tnFvBDName="bd103"/>
</fvAEPg>
</fvAp>
<l3extOut descr=""
enforceRtctrl="export"
name="routAccounting-pod2"
ownerKey="" ownerTag="" targetDscp="unspecified">
<l3extRsEctx tnFvCtxName="ctx6"/>
<l3extInstP descr=""
matchT="AtleastOne"
name="accountingInst-pod2"
prio="unspecified" targetDscp="unspecified">
<l3extSubnet aggregate="export-rtctrl,import-rtctrl"
descr="" ip="::/0" name=""
scope="export-rtctrl,import-rtctrl,import-security"/>
<l3extSubnet aggregate="export-rtctrl,import-rtctrl"
descr=""
ip="0.0.0.0/0" name=""
scope="export-rtctrl,import-rtctrl,import-security"/>
<fvRsCustQosPol tnQosCustomPolName=""/>
<fvRsProv matchT="AtleastOne"
prio="unspecified" tnVzBrCPName="webCtrct-pod2"/>
</l3extInstP>
<l3extConsLbl descr=""
name="golf2"
owner="infra"
ownerKey="" ownerTag="" tag="yellow-green"/>
</l3extOut>
<l3extOut descr=""
enforceRtctrl="export"
name="routAccounting"
ownerKey="" ownerTag="" targetDscp="unspecified">
<l3extRsEctx tnFvCtxName="ctx6"/>
<l3extInstP descr=""
matchT="AtleastOne"
name="accountingInst"
prio="unspecified" targetDscp="unspecified">
<l3extSubnet aggregate="export-rtctrl,import-rtctrl" descr=""
ip="0.0.0.0/0" name=""
scope="export-rtctrl,import-rtctrl,import-security"/>
<fvRsCustQosPol tnQosCustomPolName=""/>
<fvRsProv matchT="AtleastOne" prio="unspecified" tnVzBrCPName="webCtrct"/>
</l3extInstP>
<l3extConsLbl descr=""
name="golf"
owner="infra"
ownerKey="" ownerTag="" tag="yellow-green"/>
</l3extOut>
</fvTenant>
Enabling Distributing BGP EVPN Type-2 Host Routes to a DCIG Using the REST API
Enable distributing BGP EVPN type-2 host routes using the REST API, as follows:
Procedure
Step 1 Configure the Host Route Leak policy, with a POST containing XML such as in the following example:
Example:
<bgpCtxAfPol descr="" ctrl="host-rt-leak" name="bgpCtxPol_0 status=""/>
Step 2 Apply the policy to the VRF BGP Address Family Context Policy for one or both of the address families
using a POST containing XML such as in the following example:
Example:
<fvCtx name="vni-10001">
<fvRsCtxToBgpCtxAfPol af="ipv4-ucast" tnBgpCtxAfPolName="bgpCtxPol_0"/>
<fvRsCtxToBgpCtxAfPol af="ipv6-ucast" tnBgpCtxAfPolName="bgpCtxPol_0"/>
</fvCtx>
Multipod
Multipod
Multipod enables provisioning a more fault tolerant fabric comprised of multiple pods with isolated control
plane protocols. Also, multipod provides more flexibility with regard to the full mesh cabling between leaf
and spine switches. For example, if leaf switches are spread across different floors or different buildings,
multipod enables provisioning multiple pods per floor or building and providing connectivity between pods
through spine switches.
Multipod uses MP-BGP EVPN as the control-plane communication protocol between the ACI spines in
different Pods. WAN routers can be provisioned in the IPN, directly connected to spine switches, or connected
to border leaf switches. Multipod uses a single APIC cluster for all the pods; all the pods act as a single fabric.
Individual APIC controllers are placed across the pods but they are all part of a single APIC cluster.
For control plane isolation, IS-IS and COOP are not extended across pods. Endpoints synchronize across pods
using BGP EVPN over the IPN between the pods. Two spines in each pod are configured to have BGP EVPN
sessions with spines of other pods. The spines connected to the IPN get the endpoints and multicast groups
from COOP within a pod, but they advertise them over the IPN EVPN sessions between the pods. On the
receiving side, BGP gives them back to COOP and COOP synchs them across all the spines in the pod. WAN
routes are exchanged between the pods using BGP VPNv4/VPNv6 address families; they are not exchanged
using the EVPN address family.
There are two modes of setting up the spine switches for communicating across pods as peers and route
reflectors:
Automatic
Automatic mode is a route reflector based mode that does not support a full mesh where all spines
peer with each other. The administrator must post an existing BGP route reflector policy and select
interpod aware (EVPN) route reflectors. All the peer/client settings are automated by the APIC.
The administrator does not have an option to choose route reflectors that dont belong to the fabric
(for example, in the IPN).
Manual
The administrator has the option to configure full mesh where all spines peer with each other
without route reflectors.
In manual mode, the administrator must post the already existing BGP peer policy.
OSPF is deployed on ACI spine switches and IPN switches to provide reachability between PODs. L3
subinterfaces are created on spines to connect to IPN switches. OSPF is enabled on these L3 subinterfaces
and per POD TEP prefixes are advertised over OSPF. There is one subinterface created on each external
spine link. Provision many external links on each spine if the expectation is that the amount of east-west
traffic between PODs will be large. Currently, ACI spine switches support up to 64 external links on
each spine, and each subinterface can be configured for OSPF. Spine proxy TEP addresses are advertised
in OSPF over all the subinterfaces leading to a maximum of 64 way ECMP on the IPN switch for proxy
TEP addresses. Similarly, spines would receive proxy TEP addresses of other PODs from IPN switches
over OSPF and the spine can have up to 64 way ECMP for remote pod proxy TEP addresses. In this
way, traffic between PODs spread over all these external links provides the desired bandwidth.
When the all fabric links of a spine switch are down, OSPF advertises the TEP routes with the maximum
metric. This will force the IPN switch to remove the spine switch from ECMP which will prevent the
IPN from forwarding traffic to the down spine switch. Traffic will be received by other spines that have
up fabric links.
Up to APIC release 2.0(2), multipod is not supported with Layer 3 EVPN. In release 2.0 (2) the two
features are supported in the same fabric only over Cisco Nexus N9000K switches without EX on the
end of the switch name; for example, N9K-9312TX. Since the 2.1(1) release, the two features can be
deployed together over all the switches used in the multipod and EVPN topologies.
In a multipod fabric, if a spine in POD1 uses the infra tenant L3extOut-1, the TORs for the other pods
( POD2, POD3) cannot use the same infra L3extOut (L3extOut-1) for Layer 3 EVPN control plane
connectivity. Each POD must use their own spine switch and infra L3extOut.
No filtering is done for limiting the routes exchanged across pods. All end-point and WAN routes present
in each pod are exported to other pods.
Inband management across pods is automatically configured by a self tunnel on every spine.
Procedure
Step 1 Login:
Example:
http://<apic-name/ip>:80/api/aaaLogin.xml
Example:
http://<apic-name/ip>:80/api/policymgr/mo/uni/controller.xml
<fabricSetupPol status=''>
<fabricSetupP podId="1" tepPool="10.0.0.0/16" />
<fabricSetupP podId="2" tepPool="10.1.0.0/16" status='' />
</fabricSetupPol>
Step 3 Configure the node ID policy:
Example:
http://<apic-name/ip>:80/api/node/mo/uni/controller.xml
<fabricNodeIdentPol>
<fabricNodeIdentP serial="SAL1819RXP4" name="ifav4-leaf1" nodeId="101" podId="1"/>
<fabricNodeIdentP serial="SAL1803L25H" name="ifav4-leaf2" nodeId="102" podId="1"/>
<fabricNodeIdentP serial="SAL1934MNY0" name="ifav4-leaf3" nodeId="103" podId="1"/>
<fabricNodeIdentP serial="SAL1934MNY3" name="ifav4-leaf4" nodeId="104" podId="1"/>
<fabricNodeIdentP serial="SAL1748H56D" name="ifav4-spine1" nodeId="201" podId="1"/>
<fabricNodeIdentP serial="SAL1938P7A6" name="ifav4-spine3" nodeId="202" podId="1"/>
<fabricNodeIdentP serial="SAL1938PHBB" name="ifav4-leaf5" nodeId="105" podId="2"/>
<fabricNodeIdentP serial="SAL1942R857" name="ifav4-leaf6" nodeId="106" podId="2"/>
<fabricNodeIdentP serial="SAL1931LA3B" name="ifav4-spine2" nodeId="203" podId="2"/>
<fabricNodeIdentP serial="FGE173400A9" name="ifav4-spine4" nodeId="204" podId="2"/>
</fabricNodeIdentPol>
Step 4 Configure infra L3Out and external connectivity profile:
Example:
http://<apic-name/ip>:80/api/node/mo/uni.xml
<polUni>
<l3extLNodeP name="bSpine">
<l3extRsNodeL3OutAtt rtrId="201.201.201.201" rtrIdLoopBack="no"
tDn="topology/pod-1/node-201">
<l3extInfraNodeP descr="" fabricExtCtrlPeering="yes" name=""/>
<l3extLoopBackIfP addr="201::201/128" descr="" name=""/>
<l3extLoopBackIfP addr="201.201.201.201/32" descr="" name=""/>
</l3extRsNodeL3OutAtt>
<l3extLIfP name='portIf'>
<l3extRsPathL3OutAtt descr='asr' tDn="topology/pod-1/paths-201/pathep-[eth1/1]"
encap='vlan-4' ifInstT='sub-interface' addr="201.1.1.1/30" />
<l3extRsPathL3OutAtt descr='asr' tDn="topology/pod-1/paths-201/pathep-[eth1/2]"
encap='vlan-4' ifInstT='sub-interface' addr="201.2.1.1/30" />
<l3extRsPathL3OutAtt descr='asr' tDn="topology/pod-1/paths-202/pathep-[eth1/2]"
encap='vlan-4' ifInstT='sub-interface' addr="202.1.1.1/30" />
<l3extRsPathL3OutAtt descr='asr' tDn="topology/pod-2/paths-203/pathep-[eth1/1]"
encap='vlan-4' ifInstT='sub-interface' addr="203.1.1.1/30" />
<l3extRsPathL3OutAtt descr='asr' tDn="topology/pod-2/paths-203/pathep-[eth1/2]"
encap='vlan-4' ifInstT='sub-interface' addr="203.2.1.1/30" />
<l3extRsPathL3OutAtt descr='asr' tDn="topology/pod-2/paths-204/pathep-[eth4/31]"
encap='vlan-4' ifInstT='sub-interface' addr="204.1.1.1/30" />
<ospfIfP>
<ospfRsIfPol tnOspfIfPolName='ospfIfPol'/>
</ospfIfP>
</l3extLIfP>
</l3extLNodeP>
HSRP
About HSRP
HSRP is a first-hop redundancy protocol (FHRP) that allows a transparent failover of the first-hop IP router.
HSRP provides first-hop routing redundancy for IP hosts on Ethernet networks configured with a default
router IP address. You use HSRP in a group of routers for selecting an active router and a standby router. In
a group of routers, the active router is the router that routes packets, and the standby router is the router that
takes over when the active router fails or when preset conditions are met.
Many host implementations do not support any dynamic router discovery mechanisms but can be configured
with a default router. Running a dynamic router discovery mechanism on every host is not practical for many
reasons, including administrative overhead, processing overhead, and security issues. HSRP provides failover
services to such hosts.
When you use HSRP, you configure the HSRP virtual IP address as the default router of the host (instead of
the IP address of the actual router). The virtual IP address is an IPv4 or IPv6 address that is shared among a
group of routers that run HSRP.
When you configure HSRP on a network segment, you provide a virtual MAC address and a virtual IP address
for the HSRP group. You configure the same virtual address on each HSRP-enabled interface in the group.
You also configure a unique IP address and MAC address on each interface that acts as the real address. HSRP
selects one of these interfaces to be the active router. The active router receives and routes packets destined
for the virtual MAC address of the group.
HSRP detects when the designated active router fails. At that point, a selected standby router assumes control
of the virtual MAC and IP addresses of the HSRP group. HSRP also selects a new standby router at that time.
HSRP uses a priority designator to determine which HSRP-configured interface becomes the default active
router. To configure an interface as the active router, you assign it with a priority that is higher than the priority
of all the other HSRP-configured interfaces in the group. The default priority is 100, so if you configure just
one interface with a higher priority, that interface becomes the default active router.
Interfaces that run HSRP send and receive multicast User Datagram Protocol (UDP)-based hello messages
to detect a failure and to designate active and standby routers. When the active router fails to send a hello
message within a configurable period of time, the standby router with the highest priority becomes the active
router. The transition of packet forwarding functions between the active and standby router is completely
transparent to all hosts on the network.
You can configure multiple HSRP groups on an interface. The virtual router does not physically exist but
represents the common default router for interfaces that are configured to provide backup to each other. You
do not need to configure the hosts on the LAN with the IP address of the active router. Instead, you configure
them with the IP address of the virtual router (virtual IP address) as their default router. If the active router
fails to send a hello message within the configurable period of time, the standby router takes over, responds
to the virtual addresses, and becomes the active router, assuming the active router duties. From the host
perspective, the virtual router remains the same.
Note Packets received on a routed port destined for the HSRP virtual IP address terminate on the local router,
regardless of whether that router is the active HSRP router or the standby HSRP router. This process
includes ping and Telnet traffic. Packets received on a Layer 2 (VLAN) interface destined for the HSRP
virtual IP address terminate on the active router.
Procedure
Example:
<polUni>
<infraInfra dn="uni/infra">
<infraNodeP name="TenantNode_101">
<infraLeafS name="leafselector" type="range">
<infraNodeBlk name="nodeblk" from_="101" to_="101">
</infraNodeBlk>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-TenantPorts_101"/>
</infraNodeP>
<infraAccPortP name="TenantPorts_101">
<infraHPortS name="portselector" type="range">
<infraPortBlk name="portblk" fromCard="1" toCard="1" fromPort="41" toPort="41">
</infraPortBlk>
<infraRsAccBaseGrp tDn="uni/infra/funcprof/accportgrp-TenantPortGrp_101"/>
</infraHPortS>
</infraAccPortP>
<infraFuncP>
<infraAccPortGrp name="TenantPortGrp_101">
<infraRsAttEntP tDn="uni/infra/attentp-AttEntityProfTenant"/>
<infraRsHIfPol tnFabricHIfPolName="default"/>
</infraAccPortGrp>
</infraFuncP>
</infraInfra>
</polUni>
Example:
<polUni>
<fvTenant name="t9" dn="uni/tn-t9" descr="">
<fvCtx name="t9_ctx1" pcEnfPref="unenforced">
</fvCtx>
<fvBD name="t9_bd1" unkMacUcastAct="flood" arpFlood="yes">
<fvRsCtx tnFvCtxName="t9_ctx1"/>
<fvSubnet ip="101.9.1.1/24" scope="shared"/>
</fvBD>
<l3extOut dn="uni/tn-t9/out-l3extOut1" enforceRtctrl="export" name="l3extOut1">
<l3extLNodeP name="Node101">
<l3extRsNodeL3OutAtt rtrId="210.210.121.121" rtrIdLoopBack="no"
tDn="topology/pod-1/node-101"/>
</l3extLNodeP>
<l3extRsEctx tnFvCtxName="t9_ctx1"/>
<l3extRsL3DomAtt tDn="uni/l3dom-dom1"/>
<l3extInstP matchT="AtleastOne" name="extEpg" prio="unspecified"
targetDscp="unspecified">
<l3extSubnet aggregate="" descr="" ip="176.21.21.21/21" name=""
scope="import-security"/>
</l3extInstP>
</l3extOut>
</fvTenant>
</polUni>
Step 3 Create an HSRP interface policy.
Example:
<polUni>
<fvTenant name="t9" dn="uni/tn-t9" descr="">
<hsrpIfPol name="hsrpIfPol" ctrl="bfd" delay="4" reloadDelay="11"/>
</fvTenant>
</polUni>
Step 4 Create an HSRP group policy.
Example:
<polUni>
<fvTenant name="t9" dn="uni/tn-t9" descr="">
<hsrpIfPol name="hsrpIfPol" ctrl="bfd" delay="4" reloadDelay="11"/>
</fvTenant>
</polUni>
Step 5 Create an HSRP interface profile and an HSRP group profile.
Example:
<polUni>
<fvTenant name="t9" dn="uni/tn-t9" descr="">
<l3extOut dn="uni/tn-t9/out-l3extOut1" enforceRtctrl="export" name="l3extOut1">
<l3extLNodeP name="Node101">
<l3extLIfP name="eth1-41-v6" ownerKey="" ownerTag="" tag="yellow-green">
<hsrpIfP name="eth1-41-v6" version="v2">
<hsrpRsIfPol tnHsrpIfPolName="hsrpIfPol"/>
<hsrpGroupP descr="" name="HSRPV6-2" groupId="330" groupAf="ipv6" ip="fe80::3"
mac="00:00:0C:18:AC:01" ipObtainMode="admin">
<hsrpRsGroupPol tnHsrpGroupPolName="G1"/>
</hsrpGroupP>
</hsrpIfP>
<l3extRsPathL3OutAtt addr="2002::100/64" descr="" encap="unknown" encapScope="local"
ifInstT="l3-port" llAddr="::" mac="00:22:BD:F8:19:FF" mode="regular" mtu="inherit"
tDn="topology/pod-1/paths-101/pathep-[eth1/41]" targetDscp="unspecified">
<l3extIp addr="2004::100/64"/>
</l3extRsPathL3OutAtt>
</l3extLIfP>
<l3extLIfP name="eth1-41-v4" ownerKey="" ownerTag="" tag="yellow-green">
<hsrpIfP name="eth1-41-v4" version="v1">
<hsrpRsIfPol tnHsrpIfPolName="hsrpIfPol"/>
<hsrpGroupP descr="" name="HSRPV4-2" groupId="51" groupAf="ipv4" ip="177.21.21.21"
mac="00:00:0C:18:AC:01" ipObtainMode="admin">
<hsrpRsGroupPol tnHsrpGroupPolName="G1"/>
</hsrpGroupP>
</hsrpIfP>
<l3extRsPathL3OutAtt addr="177.21.21.11/24" descr="" encap="unknown"
encapScope="local" ifInstT="l3-port" llAddr="::" mac="00:22:BD:F8:19:FF" mode="regular"
mtu="inherit" tDn="topology/pod-1/paths-101/pathep-[eth1/41]" targetDscp="unspecified">
<l3extIp addr="177.21.23.11/24"/>
</l3extRsPathL3OutAtt>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
</polUni>
IP Multicast
Layer 3 Multicast
All external connectivity to the ACI fabric is maintained through border leaf switches. This holds true for
unicast peering and for multicast routing. In most cases, the unicast routing and multicast routing operates
together on the same border leaf switches with the multicast protocol operating over the unicast routing
protocols.
In this architecture, only the border leaf switches run the full Protocol Independent Multicast (PIM) protocol.
Non-border leaf switches run PIM in a passive mode on the interfaces. They do not peer with any other PIM
routers. The border leaf switches peer with other PIM routers connected to them over L3 Outs and also with
each other.
The following figure shows the border leaf (BL) switches (BL1 and BL2) connecting to routers (R1 and R2)
in the multicast cloud. Each virtual routing and forwarding (VRF) in the fabric that requires multicast routing
will peer separately with external multicast routers.
Bidirectional PIM, Rendezvous Point (RP) within the ACI fabric, and PIM IPv6 are currently not
supported.
IGMP snooping cannot be disabled on pervasive bridge domains with multicast routing enabled.
Multicast routers are not supported in pervasive bridge domains.
The Layer 3 multicast feature is currently supported on the N9K-93180YC-EX model leaf switch.
Layer 3 Out ports and sub-interfaces are supported while external SVIs are not supported. Since external
SVIs are not supported, PIM cannot be enabled in L3-VPC.
For Layer 3 multicast support for multipod, when the ingress leaf switch receives a packet from a source
attached on a bridge domain that is enabled for multicast routing, the ingress leaf switch sends only a
routed VRF copy to the fabric (routed implies that the TTL is decremented by 1, and the source-mac is
rewritten with a pervasive subnet MAC). The egress leaf switch also routes the packet into receivers in
all the relevant bridge domains. Therefore, if a receiver is on the same bridge domain as the source, but
on a different leaf switch than the source, that receiver continues to get a routed copy, even though it is
in the same bridge domain.
For more information, see details about layer 3 multicast support for multipod that leverages existing
Layer 2 design, at the following link Adding Pods.
Procedure
Example:
<fvTenant dn="uni/tn-PIM_Tenant" name="PIM_Tenant">
<fvCtx knwMcastAct="permit" name="ctx1">
<pimCtxP mtu="1500">
</pimCtxP>
</fvCtx>
</fvTenant>
Example:
<l3extOut enforceRtctrl="export" name="l3out-pim_l3out1">
<l3extRsEctx tnFvCtxName="ctx1"/>
<l3extLNodeP configIssues="" name="bLeaf-CTX1-101">
<l3extRsNodeL3OutAtt rtrId="200.0.0.1" rtrIdLoopBack="yes"
tDn="topology/pod-1/node-101"/>
<l3extLIfP name="if-PIM_Tenant-CTX1" tag="yellow-green">
<igmpIfP/>
<pimIfP>
<pimRsIfPol tDn="uni/tn-PIM_Tenant/pimifpol-pim_pol1"/>
</pimIfP>
<l3extRsPathL3OutAtt addr="131.1.1.1/24" ifInstT="l3-port" mode="regular"
mtu="1500" tDn="topology/pod-1/paths-101/pathep-[eth1/46]"/>
</l3extLIfP>
</l3extLNodeP>
<l3extRsL3DomAtt tDn="uni/l3dom-l3outDom"/>
<l3extInstP name="l3out-PIM_Tenant-CTX1-1topo" >
</l3extInstP>
Step 3 Configure BD under tenant and enable multicast and IGMP on BD.
Example:
<fvTenant dn="uni/tn-PIM_Tenant" name="PIM_Tenant">
<fvBD arpFlood="yes" mcastAllow="yes" multiDstPktAct="bd-flood" name="bd2" type="regular"
unicastRoute="yes" unkMacUcastAct="flood" unkMcastAct="flood">
<igmpIfP/>
<fvRsBDToOut tnL3extOutName="l3out-pim_l3out1"/>
<fvRsCtx tnFvCtxName="ctx1"/>
<fvRsIgmpsn/>
<fvSubnet ctrl="" ip="41.1.1.254/24" preferred="no" scope="private" virtual="no"/>
</fvBD>
</fvTenant>
Example:
<fvTenant dn="uni/tn-PIM_Tenant" name="PIM_Tenant">
<igmpIfPol grpTimeout="260" lastMbrCnt="2" lastMbrRespTime="1" name="igmp_pol"
querierTimeout="255" queryIntvl="125" robustFac="2" rspIntvl="10" startQueryCnt="2"
startQueryIntvl="125" ver="v2">
</igmpIfPol>
<fvBD arpFlood="yes" mcastAllow="yes" name="bd2">
<igmpIfP>
<igmpRsIfPol tDn="uni/tn-PIM_Tenant/igmpIfPol-igmp_pol"/>
</igmpIfP>
</fvBD>
</fvTenant>
Example:
<fvTenant dn="uni/tn-PIM_Tenant" name="PIM_Tenant">
<pimRouteMapPol name="rootMap">
<pimRouteMapEntry action="permit" grp="224.0.0.0/4" order="10" rp="0.0.0.0"
src="0.0.0.0/0"/>
</pimRouteMapPol>
<fvCtx knwMcastAct="permit" name="ctx1">
<pimCtxP ctrl="" mtu="1500">
<pimStaticRPPol>
<pimStaticRPEntryPol rpIp="131.1.1.2">
<pimRPGrpRangePol>
<rtdmcRsFilterToRtMapPol tDn="uni/tn-PIM_Tenant/rtmap-rootMap"/>
</pimRPGrpRangePol>
</pimStaticRPEntryPol>
</pimStaticRPPol>
</pimCtxP>
</fvCtx>
</fvTenant>
Example:
<fvTenant dn="uni/tn-PIM_Tenant" name="PIM_Tenant">
<pimIfPol authKey="" authT="none" ctrl="" drDelay="60" drPrio="1" helloItvl="30000"
itvl="60" name="pim_pol1"/>
<l3extOut enforceRtctrl="export" name="l3out-pim_l3out1" targetDscp="unspecified">
<l3extRsEctx tnFvCtxName="ctx1"/>
<l3extLNodeP name="bLeaf-CTX1-101">
<l3extRsNodeL3OutAtt rtrId="200.0.0.1" rtrIdLoopBack="yes"
tDn="topology/pod-1/node-101"/>
<l3extLIfP name="if-SIRI_VPC_src_recv-CTX1" tag="yellow-green">
<pimIfP>
<pimRsIfPol tDn="uni/tn-tn-PIM_Tenant/pimifpol-pim_pol1"/>
</pimIfP>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
Pervasive Gateway
The per-bridge domain common pervasive gateway configuration requirements are as follows:
The bridge domain MAC (mac) values for each fabric must be unique.
Note The default bridge domain MAC (mac) address values are the same for all ACI fabrics.
The common pervasive gateway requires an administrator to configure the bridge domain
MAC (mac) values to be unique for each ACI fabric.
The bridge domain virtual MAC (vmac) address and the subnet virtual IP address must be the same
across all ACI fabrics for that bridge domain. Multiple bridge domains can be configured to communicate
across connected ACI fabrics. The virtual MAC address and the virtual IP address can be shared across
bridge domains.
Procedure
Example:
<!-Things that are bolded only matters-->
<?xml version="1.0" encoding="UTF-8"?>
<!-- api/policymgr/mo/.xml -->
<polUni>
<fvTenant name="test">
<fvCtx name="test"/>
<fvAp name="test">
<fvAEPg name="web">
<fvRsBd tnFvBDName="test"/>
<fvRsPathAtt tDn="topology/pod-1/paths-101/pathep-[eth1/3]" encap="vlan-1002"/>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
Note The subnet in the BD must be marked public for the subnet to be advertised out.
Specifying a subnet in the l3extInstP with export/import route control for advertising transit and external
networks.
Note The explicit prefix list feature is supported for import and export route control only for BGP in the current
Cisco APIC software release 2.1(x).
Explicit prefix list is defined through a new match type that is called match route destination
(rtctrlMatchRtDest). An example usage is provided in the API example that follows.
Note For detailed information about route maps, route import and export, route summarization, and route
community match, see the Cisco Application Centric Infrastructure Fundamentals.
Additional information about match rules, set rules when using explicit prefix list are as follows:
Match Rules
Under the tenant (fvTenant), you can create match profiles (rtctrlSubjP) for route map filtering. Each
match profile can contain one or more match rules. Match rule supports multiple match types. Prior to
Cisco APIC release 2.1(x), match types supported were explicit prefix list and community list.
Starting with Cisco APIC release 2.1(x), explicit prefix match or match route destination
(rtctrlMatchRtDest) is supported.
Match prefix list (rtctrlMatchRtDest) supports one or more subnets with an optional aggregate flag.
Aggregate flags are used for allowing prefix matches with multiple masks starting with the mask
mentioned in the configuration till the maximum mask allowed for the address family of the prefix .
This is the equivalent of the "le " option in the prefix-list in NX-OS software (example, 10.0.0.0/8 le
32).
The prefix list can be used for covering the following cases:
Allow all ( 0.0.0.0/0 with aggregate flag. equivalent of "0.0.0.0/0 le 32" )
One or more of specific prefixes (example: 10.1.1.0/24)
One or more of prefixes with aggregate flag (example, equivalent of 10.1.1.0/24 le 32).
The explicit prefix match rules can contain one of more subnets, and these subnets can be bridge domain
public subnets or external networks. Subnets can also be aggregated up to the maximum subnet mask
(/32 for IPv4 and /128 for IPv6).
When multiple match rules of different types are present (such as match community and explicit prefix
match), the match rule is allowed only when the match statements of all individual match types match.
This is the equivalent of the AND filter. The explicit prefix match is contained by the subject profile
(rtctrlSubjP) and will form a logical AND if other match rules are present under the subject profile.
Within a given match type (such as match prefix list), at least one of the match rules statement must
match. Multiple explicit prefix match (rtctrlMatchRtDest) can be defined under the same subject profile
(rtctrlSubjP) which will form a logical OR.
Set Rules
Set policies must be created to define set rules that are carried with the explicit prefixes such as set
community, set tag.
Note When explicit prefix list is used, the type of the route profile should be set to "match routing policy
only".
Explicit prefix list is currently supported only for BGP Layer 3 Out route-control.
After the match and set profiles are defined, the route map must be created in the Layer 3 Out. Route maps
can be created using one of the following methods:
Create a "default-export" route map for export route control, and a "default-import" route map for import
route control.
Create other route maps (not named default-export or default-import) and setup the relation from one
or more l3extInstPs or subnets under the l3extInstP.
In either case, match the route map on explicit prefix list by pointing to the rtctrlSubjP within the route
map.
In the export and import route map, the set and match rules are grouped together along with the relative
sequence across the groups (rtctrlCtxP)). Additionally, under each group of match and set statements (rtctrlCtxP)
the relation to one or more match profiles are available (rtctrlSubjP).
Any protocol enabled on Layer 3 Out (for example BGP protocol), will use the export and import route map
for route filtering.
Configuring Route Map/Profile with Explicit Prefix List Using REST API
Before You Begin
Tenant and VRF must be configured.
Procedure
Example:
<fvTenant name="PM" status="">
<rtctrlAttrP name="set_dest">
<rtctrlSetComm community="regular:as2-nn2:5:24"/>
</rtctrlAttrP>
<rtctrlSubjP name="match_dest">
<rtctrlMatchRtDest ip="192.169.0.0/24"/>
<rtctrlMatchCommTerm name="term1">
<rtctrlMatchCommFactor community="regular:as2-nn2:5:24" status=""/>
<rtctrlMatchCommFactor community="regular:as2-nn2:5:25" status=""/>
</rtctrlMatchCommTerm>
<fvCtx name="ctx">
</fvCtx>
<bgpExtP />
<ospfExtP areaId="0.0.0.59" areaType="nssa" status=""/>
</l3extInstP>
</rtctrlProfile>
</l3extOut>
<fvBD name="testBD">
<fvRsBDToOut tnL3extOutName="L3Out_1" />
<fvRsCtx tnFvCtxName="ctx" />
<fvSubnet ip="40.1.1.12/24" scope="public" />
<fvSubnet ip="40.1.1.2/24" scope="private" />
<fvSubnet ip="2003::4/64" scope="public" />
</fvBD>
</fvTenant>
Overview
The IP aging policy tracks and ages unused IPs on an endpoint. Tracking is performed using the endpoint
retention policy configured for the BD to send ARP requests (for IPv4) and neighbor solicitations (for IPv6)
at 75% of the local endpoint aging interval. When no response is received from an IP, that IP is aged out.
This document explains how to configure the IP aging policy.
Procedure
Example:
<epIpAgingP adminSt="enabled" descr="" dn="uni/infra/ipAgingP-default" name="default"
ownerKey="" ownerTag=""/>
Step 2 To disable the IP aging policy:
Example:
<epIpAgingP adminSt="disabled" descr="" dn="uni/infra/ipAgingP-default" name="default"
ownerKey="" ownerTag=""/>
Route Summarization
Configuring Route Summarization for BGP, OSPF, and EIGRP Using the REST API
Procedure
Step 1 Configure BGP route summarization using the REST API as follows:
Example:
<fvTenant name="common">
<fvCtx name="vrf1"/>
<bgpRtSummPol name=bgp_rt_summ cntrl=as-set'/>
<l3extOut name=l3_ext_pol >
<l3extLNodeP name="bLeaf">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId=20.10.1.1"/>
<l3extLIfP name='portIf'>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/31]"
ifInstT=l3-port addr=10.20.1.3/24/>
</l3extLIfP>
</l3extLNodeP>
<bgpExtP />
<l3extInstP name="InstP" >
<l3extSubnet ip="10.0.0.0/8" scope=export-rtctrl">
<l3extRsSubnetToRtSumm tDn=uni/tn-common/bgprtsum-bgp_rt_summ/>
<l3extRsSubnetToProfile tnRtctrlProfileName=rtprof"/>
</l3extSubnet>
</l3extInstP>
<l3extRsEctx tnFvCtxName=vrf1/>
</l3extOut>
</fvTenant>
Step 2 Configure OSPF inter-area and external summarization using the following REST API:
Example:
<?xml version="1.0" encoding="utf-8"?>
<fvTenant name="t20">
<!--Ospf Inter External route summarization Policy-->
<ospfRtSummPol cost="unspecified" interAreaEnabled="no" name="ospfext"/>
<!--Ospf Inter Area route summarization Policy-->
<ospfRtSummPol cost="16777215" interAreaEnabled="yes" name="interArea"/>
<fvCtx name="ctx0" pcEnfDir="ingress" pcEnfPref="enforced"/>
<!-- L3OUT backbone Area-->
<l3extOut enforceRtctrl="export" name="l3_1" ownerKey="" ownerTag=""
targetDscp="unspecified">
<l3extRsEctx tnFvCtxName="ctx0"/>
<l3extLNodeP name="node-101">
<l3extRsNodeL3OutAtt rtrId="20.1.3.2" rtrIdLoopBack="no" tDn="topology/pod-1/node-101"/>
<l3extLIfP name="intf-1">
<l3extRsPathL3OutAtt addr="20.1.5.2/24" encap="vlan-1001" ifInstT="sub-interface"
tDn="topology/pod-1/paths-101/pathep-[eth1/33]"/>
</l3extLIfP>
</l3extLNodeP>
<l3extInstP name="l3InstP1">
<fvRsProv tnVzBrCPName="default"/>
<!--Ospf External Area route summarization-->
<l3extSubnet aggregate="" ip="193.0.0.0/8" name="" scope="export-rtctrl">
<l3extRsSubnetToRtSumm tDn="uni/tn-t20/ospfrtsumm-ospfext"/>
</l3extSubnet>
</l3extInstP>
<ospfExtP areaCost="1" areaCtrl="redistribute,summary" areaId="backbone"
areaType="regular"/>
</l3extOut>
<!-- L3OUT Regular Area-->
<l3extOut enforceRtctrl="export" name="l3_2">
<l3extRsEctx tnFvCtxName="ctx0"/>
<l3extLNodeP name="node-101">
<l3extRsNodeL3OutAtt rtrId="20.1.3.2" rtrIdLoopBack="no" tDn="topology/pod-1/node-101"/>
<l3extLIfP name="intf-2">
<l3extRsPathL3OutAtt addr="20.1.2.2/24" encap="vlan-1014" ifInstT="sub-interface"
tDn="topology/pod-1/paths-101/pathep-[eth1/11]"/>
</l3extLIfP>
</l3extLNodeP>
<l3extInstP matchT="AtleastOne" name="l3InstP2">
<fvRsCons tnVzBrCPName="default"/>
<!--Ospf Inter Area route summarization-->
<l3extSubnet aggregate="" ip="197.0.0.0/8" name="" scope="export-rtctrl">
<l3extRsSubnetToRtSumm tDn="uni/tn-t20/ospfrtsumm-interArea"/>
</l3extSubnet>
</l3extInstP>
<ospfExtP areaCost="1" areaCtrl="redistribute,summary" areaId="0.0.0.57"
areaType="regular"/>
</l3extOut>
</fvTenant>
Example:
<fvTenant name="exampleCorp">
<l3extOut name="out1">
<l3extInstP name="eigrpSummInstp" >
<l3extSubnet aggregate="" descr="" ip="197.0.0.0/8" name="" scope="export-rtctrl">
<l3extRsSubnetToRtSumm/>
</l3extSubnet>
</l3extInstP>
</l3extOut>
<eigrpRtSummPol name="pol1" />
Note There is no route summarization policy to be configured for EIGRP. The only configuration needed
for enabling EIGRP summarization is the summary subnet under the InstP.
Configuring Route Summarization for BGP, OSPF, and EIGRP Using the REST API
Procedure
Step 1 Configure BGP route summarization using the REST API as follows:
Example:
<fvTenant name="common">
<fvCtx name="vrf1"/>
<bgpRtSummPol name=bgp_rt_summ cntrl=as-set'/>
<l3extOut name=l3_ext_pol >
<l3extLNodeP name="bLeaf">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId=20.10.1.1"/>
<l3extLIfP name='portIf'>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/31]"
ifInstT=l3-port addr=10.20.1.3/24/>
</l3extLIfP>
</l3extLNodeP>
<bgpExtP />
<l3extInstP name="InstP" >
<l3extSubnet ip="10.0.0.0/8" scope=export-rtctrl">
<l3extRsSubnetToRtSumm tDn=uni/tn-common/bgprtsum-bgp_rt_summ/>
<l3extRsSubnetToProfile tnRtctrlProfileName=rtprof"/>
</l3extSubnet>
</l3extInstP>
<l3extRsEctx tnFvCtxName=vrf1/>
</l3extOut>
</fvTenant>
Step 2 Configure OSPF inter-area and external summarization using the following REST API:
Example:
<?xml version="1.0" encoding="utf-8"?>
<fvTenant name="t20">
<!--Ospf Inter External route summarization Policy-->
<ospfRtSummPol cost="unspecified" interAreaEnabled="no" name="ospfext"/>
<!--Ospf Inter Area route summarization Policy-->
<ospfRtSummPol cost="16777215" interAreaEnabled="yes" name="interArea"/>
<fvCtx name="ctx0" pcEnfDir="ingress" pcEnfPref="enforced"/>
<!-- L3OUT backbone Area-->
<l3extOut enforceRtctrl="export" name="l3_1" ownerKey="" ownerTag=""
targetDscp="unspecified">
<l3extRsEctx tnFvCtxName="ctx0"/>
<l3extLNodeP name="node-101">
<l3extRsNodeL3OutAtt rtrId="20.1.3.2" rtrIdLoopBack="no" tDn="topology/pod-1/node-101"/>
<l3extLIfP name="intf-1">
<l3extRsPathL3OutAtt addr="20.1.5.2/24" encap="vlan-1001" ifInstT="sub-interface"
tDn="topology/pod-1/paths-101/pathep-[eth1/33]"/>
</l3extLIfP>
</l3extLNodeP>
<l3extInstP name="l3InstP1">
<fvRsProv tnVzBrCPName="default"/>
<!--Ospf External Area route summarization-->
<l3extSubnet aggregate="" ip="193.0.0.0/8" name="" scope="export-rtctrl">
<l3extRsSubnetToRtSumm tDn="uni/tn-t20/ospfrtsumm-ospfext"/>
</l3extSubnet>
</l3extInstP>
<ospfExtP areaCost="1" areaCtrl="redistribute,summary" areaId="backbone"
areaType="regular"/>
</l3extOut>
<!-- L3OUT Regular Area-->
<l3extOut enforceRtctrl="export" name="l3_2">
<l3extRsEctx tnFvCtxName="ctx0"/>
<l3extLNodeP name="node-101">
<l3extRsNodeL3OutAtt rtrId="20.1.3.2" rtrIdLoopBack="no" tDn="topology/pod-1/node-101"/>
<l3extLIfP name="intf-2">
<l3extRsPathL3OutAtt addr="20.1.2.2/24" encap="vlan-1014" ifInstT="sub-interface"
tDn="topology/pod-1/paths-101/pathep-[eth1/11]"/>
</l3extLIfP>
</l3extLNodeP>
<l3extInstP matchT="AtleastOne" name="l3InstP2">
<fvRsCons tnVzBrCPName="default"/>
<!--Ospf Inter Area route summarization-->
<l3extSubnet aggregate="" ip="197.0.0.0/8" name="" scope="export-rtctrl">
<l3extRsSubnetToRtSumm tDn="uni/tn-t20/ospfrtsumm-interArea"/>
</l3extSubnet>
</l3extInstP>
<ospfExtP areaCost="1" areaCtrl="redistribute,summary" areaId="0.0.0.57"
areaType="regular"/>
</l3extOut>
</fvTenant>
Example:
<fvTenant name="exampleCorp">
<l3extOut name="out1">
<l3extInstP name="eigrpSummInstp" >
<l3extSubnet aggregate="" descr="" ip="197.0.0.0/8" name="" scope="export-rtctrl">
<l3extRsSubnetToRtSumm/>
</l3extSubnet>
</l3extInstP>
</l3extOut>
<eigrpRtSummPol name="pol1" />
Note There is no route summarization policy to be configured for EIGRP. The only configuration needed
for enabling EIGRP summarization is the summary subnet under the InstP.
Overview
This topic provides a typical example of how to configure an interleak of external routes such as OSPF or
EIGRP into BGP when using Cisco APIC.
Interleak from EIGRP or OSPF has been available in earlier releases. The feature now enables the user to set
attributes, such as community, preference, and metric for route leaking from EIGRP or OSPF to BGP.
Procedure
Example:
<l3extOut descr="" enforceRtctrl="export" name="out1" ownerKey="" ownerTag=""
targetDscp="unspecified">
<l3extLNodeP configIssues="" descr="" name="Lnodep1" ownerKey="" ownerTag=""
tag="yellow-green" targetDscp="unspecified">
<l3extRsNodeL3OutAtt rtrId="1.2.3.4" rtrIdLoopBack="yes"
tDn="topology/pod-1/node-101"/>
<l3extLIfP descr="" name="lifp1" ownerKey="" ownerTag="" tag="yellow-green">
<ospfIfP authKeyId="1" authType="none" descr="" name="">
<ospfRsIfPol tnOspfIfPolName=""/>
</ospfIfP>
<l3extRsNdIfPol tnNdIfPolName=""/>
<l3extRsIngressQosDppPol tnQosDppPolName=""/>
<l3extRsEgressQosDppPol tnQosDppPolName=""/>
<l3extRsPathL3OutAtt addr="12.12.7.16/24" descr="" encap="unknown"
encapScope="local" ifInstT="l3-port" llAddr="::" mac="00:22:BD:F8:19:FF" mode="regular"
mtu="inherit" tDn="topology/pod-1/paths-101/pathep-[eth1/11]" targetDscp="unspecified"/>
</l3extLIfP>
</l3extLNodeP>
<l3extRsEctx tnFvCtxName="ctx1"/>
<l3extRsInterleakPol tnRtctrlProfileName="interleak"/>
<l3extRsL3DomAtt tDn="uni/l3dom-Domain"/>
<l3extInstP descr="" matchT="AtleastOne" name="InstP1" prio="unspecified"
targetDscp="unspecified">
<fvRsCustQosPol tnQosCustomPolName=""/>
<l3extSubnet aggregate="" descr="" ip="14.15.16.0/24" name=""
scope="export-rtctrl,import-security"/>
</l3extInstP>
<ospfExtP areaCost="1" areaCtrl="redistribute,summary" areaId="0.0.0.1" areaType="nssa"
descr=""/>
</l3extOut>
Routing Protocols
if the route has the same route-tag (in comparison with the route-tag policy) of the VRF, it will not be
installed in the routing table even if the source is from BGP or OSPF.
Configuring EIGRP and BGP for the same Layer 3 outside is not supported.
The number of BGP communities and extended communities must be restricted to a maximum of 32 in
the route map. The same restriction applies to community lists and extended community lists in addition
to route maps.
Table 11:
Procedure
Example:
POST https://apic-ip-address/api/policymgr/mo/uni/fabric.xml
<bgpInstPol name="default">
<bgpAsP asn="1" />
<bgpRRP>
<bgpRRNodePEp id=<spine_id1>/>
<bgpRRNodePEp id=<spine_id2>/>
</bgpRRP>
</bgpInstPol>
Example:
For the FuncP setup
POST https://apic-ip-address/api/policymgr/mo/uni.xml
<fabricFuncP>
<fabricPodPGrp name="bgpRRPodGrp>
<fabricRsPodPGrpBGPRRP tnBgpInstPolName="default" />
</fabricPodPGrp>
</fabricFuncP>
Example:
For the PodP setup
POST https://apic-ip-address/api/policymgr/mo/uni.xml
<fabricPodP name="default">
<fabricPodS name="default" type="ALL">
<fabricRsPodPGrp tDn="uni/fabric/funcprof/podpgrp-bgpRRPodGrp"/>
</fabricPodS>
</fabricPodP>
Procedure
The following shows how to configure the BGP external routed network using the REST API:
Example:
<l3extOut descr="" dn="uni/tn-t1/out-l3out-bgp" enforceRtctrl="export" name="l3out-bgp"
Procedure
Step 1 The following example shows the interface configuration for bidirectional forwarding detection (BFD):
Example:
<fvTenant name="ExampleCorp">
<bfdIfPol name=bfdIfPol" minTxIntvl="400" minRxIntvl="400" detectMult="5" echoRxIntvl="400"
echoAdminSt="disabled"/>
<l3extOut name="l3-out">
<l3extLNodeP name="leaf1">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId="2.2.2.2"/>
<l3extLIfP name='portIpv4'>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/11]"
ifInstT='l3-port' addr="10.0.0.1/24" mtu="1500"/>
<bfdIfP type=sha1 key=password">
<bfdRsIfPol tnBfdIfPolName=bfdIfPol'/>
</bfdIfP>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
Step 2 The following example shows the interface configuration for enabling BFD on OSPF and EIGRP:
Example:
<fvTenant name=ExampleCorp">
<ospfIfPol name="ospf_intf_pol" cost="10" ctrl="bfd/>
<eigrpIfPol ctrl="nh-self,split-horizon,bfd"
dn="uni/tn-Coke/eigrpIfPol-eigrp_if_default"
</fvTenant>
Step 3 The following example shows the interface configuration for enabling BFD on BGP:
Example:
<fvTenant name="ExampleCorp">
<l3extOut name="l3-out">
<l3extLNodeP name="leaf1">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId="2.2.2.2"/>
<l3extLIfP name='portIpv4'>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/11]"
ifInstT='l3-port' addr="10.0.0.1/24" mtu="1500">
<bgpPeerP addr="4.4.4.4/24" allowedSelfAsCnt="3" ctrl="bfd" descr=""
name="" peerCtrl="" ttl="1">
<bgpRsPeerPfxPol tnBgpPeerPfxPolName=""/>
<bgpAsP asn="3" descr="" name=""/>
</bgpPeerP>
</l3extRsPathL3OutAtt>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
Step 4 The following example shows the interface configuration for enabling BFD on Static Routes:
Example:
<fvTenant name="ExampleCorp">
<l3extOut name="l3-out">
<l3extLNodeP name="leaf1">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId="2.2.2.2">
<ipRouteP ip=192.168.3.4" rtCtrl="bfd">
<ipNexthopP nhAddr="192.168.62.2"/>
</ipRouteP>
</l3extRsNodeL3OutAtt>
<l3extLIfP name='portIpv4'>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/3]"
ifInstT='l3-port' addr="10.10.10.2/24" mtu="1500" status="created,modified" />
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
Procedure
The following REST API shows the global configuration for bidirectional forwarding detection (BFD):
Example:
<polUni>
<infraInfra>
<bfdIpv4InstPol name="default" echoSrcAddr="1.2.3.4" slowIntvl="1000" minTxIntvl="150"
minRxIntvl="250" detectMult="5" echoRxIntvl="200"/>
<bfdIpv6InstPol name="default" echoSrcAddr="34::1/64" slowIntvl="1000" minTxIntvl="150"
minRxIntvl="250" detectMult="5" echoRxIntvl="200"/>
</infraInfra>
</polUni>
Procedure
The following REST API shows the interface override configuration for bidirectional forwarding detection
(BFD):
Example:
<fvTenant name="ExampleCorp">
<l3extLIfP name='portIpv4'>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/11]"
ifInstT='l3-port' addr="10.0.0.1/24" mtu="1500"/>
<bfdIfP type=sha1 key=password">
<bfdRsIfPol tnBfdIfPolName=bfdIfPol'/>
</bfdIfP>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
OSPF
Layer 3 Outside connections are supported for the routed interfaces, routed sub-interfaces, and SVIs. The
SVIs are used when there is a need to share the physical connect for both L2 and L3 traffic. The SVIs are
supported on ports, port-channels, and VPC port-channels.
When an SVI is used for an Layer 3 Outside connection, an external bridge domain is created on the border
leaf switches. The external bridge domain allows connectivity between the two VPC switches across the ACI
fabric. This allows both the VPC switches to establish the OSPF adjacencies with each other and the external
OSPF device.
When running OSPF over a broadcast network, the time to detect a failed neighbor is the dead time interval
(default 40 seconds). Reestablishing the neighbor adjacencies after a failure may also take longer due to
designated router (DR) election.
Note A link or port-channel failure to one VPC Node does not cause an OSPF adjacency to go down. The OSPF
adjacency can stay up via the external BD accessible through the other VPC node.
Creating OSPF External Routed Network for Management Tenant Using REST API
You must verify that the router ID and the logical interface profile IP address are different and do not
overlap.
The following steps are for creating an OSPF external routed network for a management tenant. To
create an OSPF external routed network for a tenant, you must choose a tenant and create a VRF for the
tenant.
For more details, see also the KB article about Transit Routing.
Procedure
Example:
POST: https://apic-ip-address/api/mo/uni/tn-mgmt.xml
<fvTenant name="mgmt">
<fvBD name="bd1">
<fvRsBDToOut tnL3extOutName="RtdOut" />
<fvSubnet ip="1.1.1.1/16" />
<fvSubnet ip="1.2.1.1/16" />
<fvSubnet ip="40.1.1.1/24" scope="public" />
<fvRsCtx tnFvCtxName="inb" />
</fvBD>
<fvCtx name="inb" />
<l3extOut name="RtdOut">
<l3extRsL3DomAtt tDn="uni/l3dom-extdom"/>
<l3extInstP name="extMgmt">
</l3extInstP>
<l3extLNodeP name="borderLeaf">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId="10.10.10.10"/>
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-102" rtrId="10.10.10.11"/>
<l3extLIfP name='portProfile'>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/40]"
ifInstT='l3-port' addr="192.168.62.1/24"/>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-102/pathep-[eth1/40]"
ifInstT='l3-port' addr="192.168.62.5/24"/>
<ospfIfP/>
</l3extLIfP>
</l3extLNodeP>
<l3extRsEctx tnFvCtxName="inb"/>
<ospfExtP areaId="57" />
</l3extOut>
</fvTenant>
EIGRP
Overview
This article provides a typical example of how to configure Enhanced Interior Gateway Routing Protocol
(EIGRP) when using the Cisco APIC. The following information applies when configuring EIGRP:
The tenant, VRF, and bridge domain must already be created.
The Layer 3 outside tenant network must already be configured.
The route control profile under routed outside must already be configured.
The EIGRP VRF policy is the same as the EIGRP family context policy.
EIGRP supports only export route control profile. The configuration related to route controls is common
across all the protocols.
You can configure EIGRP to perform automatic summarization of subnet routes (route summarization) into
network-level routes. For example, you can configure subnet 131.108.1.0 to be advertised as 131.108.0.0 over
interfaces that have subnets of 192.31.7.0 configured. Automatic summarization is performed when there are
two or more network router configuration commands configured for the EIGRP process. By default, this
feature is enabled.
For more information about route summarization, see the Cisco Application Centric Infrastructure
Fundamentals Guide.
Procedure
Example:
<polUni>
<fvTenant name="cisco_6">
<eigrpCtxAfPol actIntvl="3" descr="" dn="uni/tn-cisco_6/eigrpCtxAfP-eigrp_default_pol"
extDist="170"
intDist="90" maxPaths="8" metricStyle="narrow" name="eigrp_default_pol" ownerKey=""
ownerTag=""/>
</fvTenant>
</polUni>
Example:
<polUni>
<fvTenant name="cisco_6">
<eigrpIfPol bw="10" ctrl="nh-self,split-horizon" delay="10" delayUnit="tens-of-micro"
descr="" dn="uni/tn-cisco_6/eigrpIfPol-eigrp_if_default"
helloIntvl="5" holdIntvl="15" name="eigrp_if_default" ownerKey="" ownerTag=""/>
</fvTenant>
</polUni>
Example:
IPv4:
<polUni>
<fvTenant name="cisco_6">
<fvCtx name="dev">
<fvRsCtxToEigrpCtxAfPol tnEigrpCtxAfPolName="eigrp_ctx_pol_v4" af="1"/>
</fvCtx>
</fvTenant>
</polUni>
IPv6:
<polUni>
<fvTenant name="cisco_6">
<fvCtx name="dev">
<fvRsCtxToEigrpCtxAfPol tnEigrpCtxAfPolName="eigrp_ctx_pol_v6" af="ipv6-ucast"/>
</fvCtx>
</fvTenant>
</polUni>
Example:
IPv4
<polUni>
<fvTenant name="cisco_6">
<l3extOut name="ext">
<eigrpExtP asn="4001"/>
<l3extLNodeP name="node1">
<l3extLIfP name="intf_v4">
<l3extRsPathL3OutAtt addr="201.1.1.1/24" ifInstT="l3-port"
tDn="topology/pod-1/paths-101/pathep-[eth1/4]"/>
<eigrpIfP name="eigrp_ifp_v4">
<eigrpRsIfPol tnEigrpIfPolName="eigrp_if_pol_v4"/>
</eigrpIfP>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
</polUni>
IPv6
<polUni>
<fvTenant name="cisco_6">
<l3extOut name="ext">
<eigrpExtP asn="4001"/>
<l3extLNodeP name="node1">
<l3extLIfP name="intf_v6">
<l3extRsPathL3OutAtt addr="2001::1/64" ifInstT="l3-port"
tDn="topology/pod-1/paths-101/pathep-[eth1/4]"/>
<eigrpIfP name="eigrp_ifp_v6">
<eigrpRsIfPol tnEigrpIfPolName="eigrp_if_pol_v6"/>
</eigrpIfP>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
</polUni>
IPv4 and IPv6
<polUni>
<fvTenant name="cisco_6">
<l3extOut name="ext">
<eigrpExtP asn="4001"/>
<l3extLNodeP name="node1">
<l3extLIfP name="intf_v4">
<l3extRsPathL3OutAtt addr="201.1.1.1/24" ifInstT="l3-port"
tDn="topology/pod-1/paths-101/pathep-[eth1/4]"/>
<eigrpIfP name="eigrp_ifp_v4">
<eigrpRsIfPol tnEigrpIfPolName="eigrp_if_pol_v4"/>
</eigrpIfP>
</l3extLIfP>
<l3extLIfP name="intf_v6">
<l3extRsPathL3OutAtt addr="2001::1/64" ifInstT="l3-port"
tDn="topology/pod-1/paths-101/pathep-[eth1/4]"/>
<eigrpIfP name="eigrp_ifp_v6">
<eigrpRsIfPol tnEigrpIfPolName="eigrp_if_pol_v6"/>
</eigrpIfP>
</l3extLIfP>
</l3extLNodeP>
</l3extOut>
</fvTenant>
</polUni>
Example:
<polUni>
<fvTenant name="cisco_6">
<eigrpIfPol bw="1000000" ctrl="nh-self,split-horizon" delay="10"
delayUnit="tens-of-micro" helloIntvl="5" holdIntvl="15" name="default"/>
</fvTenant>
</polUni>
The bandwidth (bw) attribute is defined in Kbps. The delayUnit attribute can be "tens of micro" or "pico".
Neighbor Discovery
Neighbor Discovery
The IPv6 Neighbor Discovery (ND) protocol is responsible for address autoconfiguration of nodes, discovery
of other nodes on the link, determining the link-layer addresses of other nodes, duplicate address detection,
finding available routers and DNS servers, address prefix discovery, and maintaining reachability information
about the paths to other active neighbor nodes.
ND-specific Neighbor Solicitation/Neighbor Advertisement (NS/NA) and Router Solicitation/Router
Advertisement (RS/RA) packet types are supported on all ACI fabric Layer 3 interfaces, including physical,
L3 Sub-if, and SVI (external and pervasive). RS/RA packets are used for autoconfiguration for all L3 interfaces
but are only configurable for pervasive SVIs. ACI bridge domain ND always operates in flood mode; unicast
mode is not supported.
The ACI fabric ND support includes the following:
Interface policies (nd:IfPol) control ND timers and behavior for NS/NA messages.
ND prefix policies (nd:PfxPol) controls RA messages.
Configuration of IPv6 subnets for ND (fv:Subnet).
ND interface policies for external networks.
Configurable ND subnets for external networks, and arbitrary subnet configurations for pervasive bridge
domains are not supported.
Per Interface
Control of ND packets (NS/NA)
Neighbor Solicitation Interval
Neighbor Solicitation Retry count
Control of RA packets
Suppress RA
Suppress RA MTU
RA Interval, RA Interval minimum, Retransmit time
Creating the Tenant, VRF, and Bridge Domain with IPv6 Neighbor Discovery Using the REST
API
Procedure
Create a tenant, VRF, bridge domain with a neighbor discovery interface policy and a neighbor discovery
prefix policy.
Example:
<fvTenant descr="" dn="uni/tn-ExampleCorp" name="ExampleCorp" ownerKey="" ownerTag="">
<ndIfPol name="NDPol001" ctrl="managed-cfg descr="" hopLimit="64" mtu="1500"
nsIntvl="1000" nsRetries=3" ownerKey="" ownerTag="" raIntvl="600" raLifetime="1800"
reachableTime="0" retransTimer="0"/>
<fvCtx descr="" knwMcastAct="permit" name="pvn1" ownerKey="" ownerTag=""
pcEnfPref="enforced">
</fvCtx>
<fvBD arpFlood="no" descr="" mac="00:22:BD:F8:19:FF" multiDstPktAct="bd-flood" name="bd1"
ownerKey="" ownerTag="" unicastRoute="yes" unkMacUcastAct="proxy" unkMcastAct="flood">
<fvRsBDToNdP tnNdIfPolName="NDPol001"/>
<fvRsCtx tnFvCtxName="pvn1"/>
<fvSubnet ctrl="nd" descr="" ip="34::1/64" name="" preferred="no" scope="private">
<fvRsNdPfxPol tnNdPfxPolName="NDPfxPol001"/>
</fvSubnet>
<fvSubnet ctrl="nd" descr="" ip="33::1/64" name="" preferred="no" scope="private">
<fvRsNdPfxPol tnNdPfxPolName="NDPfxPol002"/>
</fvSubnet>
</fvBD>
<ndPfxPol ctrl="auto-cfg,on-link" descr="" lifetime="1000" name="NDPfxPol001" ownerKey=""
ownerTag="" prefLifetime="1000"/>
<ndPfxPol ctrl="auto-cfg,on-link" descr="" lifetime="4294967295" name="NDPfxPol002"
ownerKey="" ownerTag="" prefLifetime="4294967295"/>
</fvTenant>
Note If you have a public subnet when you configure the routed outside, you must associate the bridge
domain with the outside configuration.
You must perform the following tasks to deploy Layer 4 to Layer 7 services:
1 Import a Device Package .
Only the provider administrator can import the device package.
2 Register the device and the logical interfaces.
This task also registers concrete devices and concrete interfaces, and configures concrete device parameters.
3 Create a Logical Device.
4 Configure device parameters.
5 Optional. If you are configuring an ASA Firewall service, enable trunking on the device.
6 Configure a Device Selection Policy.
7 Configure a Service Graph Template.
a Select the default service graph template parameters from an application profile.
b Configure additional service graph template parameters, if needed.
For more information about deploying Layer 4 to Layer 7 services, see the Cisco APIC Layer 4 to Layer 7
Services Deployment Guide.
Configure In-Band Connectivity to Devices Using Tenant's VRF Using the REST API
The following is an example of using REST APIs to configure in-band connectivity to devices using tenant's
VRF:
1 Define the EPG that is to be used for management.
Note Ensure to open up the ports to the domain mappings using the appropriate selectors configuration.
In the following, the EPG "services" is used for the management of the Services Devices/VMs subnet that
is used for Tenant vrf devicemanagement (3.3.3.0/24).
<polUni>
<fvTenant name="tenant1">
<fvCtx name="mgmt_ctx1"/>
<vnsCtrlrMgmtPol ctxDn="uni/tn-tenant1/ctx-mgmt_ctx1">
<vnsRsMgmtAddr tDn="uni/tn-tenant1/ap-services/epg-ifc/CtrlrAddrInst-ifc"/>
</vnsCtrlrMgmtPol>
<fvBD name="mgmt_ServicesMgmtBD">
<fvRsCtx tnFvCtxName="mgmt_ctx1"/>
<fvSubnet ip="3.3.3.3/24"/>
</fvBD>
<fvAp name="services">
<fvAEPg name="ifc">
<fvRsBd tnFvBDName="mgmt_ServicesMgmtBD"/>
<vnsAddrInst name="ifc">
<fvnsUcastAddrBlk from="3.3.3.100/24" to="3.3.3.200/24"/>
</vnsAddrInst>
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-mininet"/>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
2 Associate the EPG to the LDevVip.
<polUni>
<fvTenant name="tenant1">
<vnsLDevVip name="ADCCluster1"
funcType="GoTo" devtype="VIRTUAL">
<vnsRsMDevAtt tDn="uni/infra/mDev-Citrix-NetScaler-10.5"/>
<vnsRsALDevToDomP tDn="uni/vmmp-VMware/dom-mininet"/>
<vnsRsDevEpg tDn="uni/tn-tenant1/ap-services/epg-ifc"/>
<vnsCMgmt name="devMgmt"
host="3.3.3.180"
port="80"/>
<vnsCCred name="username"
value="nsroot"/>
<vnsCCredSecret name="password"
value="nsroot"/>
</vnsLDevVip>
</fvTenant>
</polUni>
Configuring In-Band Connectivity to Devices Using Management Tenant VRF Using the REST
API
The following is an example of using REST APIs to configure in-band connectivity to devices using
management tenant VRF:
1 Create an EPG l4l7MgmtEpg in tenant management.
<polUni>
<fvTenant dn="uni/tn-mgmt">
<fvAp name="services">
<fvAEPg name="l4l7MgmtEpg">
<fvRsBd tnFvBDName="access" />
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-mininet" />
<fvRsCons tnVzBrCPName='contract1'>
</fvRsCons>
</fvAEPg>
</fvAp>
<fvBD name="access">
<fvSubnet ip="3.3.3.3/24" />
<fvRsCtx tnFvCtxName="inb"/>
</fvBD>
<vzFilter name='all'>
<vzEntry name='all' ></vzEntry>
</vzFilter>
<vzBrCP name="contract1" scope="tenant">
<vzSubj name='subj1'>
<vzInTerm>
<vzRsFiltAtt tnVzFilterName="all" />
</vzInTerm>
<vzOutTerm>
<vzRsFiltAtt tnVzFilterName="all" />
</vzOutTerm>
</vzSubj>
</vzBrCP>
</fvTenant>
</polUni>
2 Ensure that the Service Device/VM has the mgmt IP address in the subnet 3.3.3.0/24.
This is the same subnet that tn-mgmt access BD has been configured with. (See configuration in earlier
step.)
3 Add the following to the LDevVip:
Note This points to the EPG that was created in the earlier step
<vnsRsDevEpg tDn="uni/tn-mgmt/ap-services/epg-l4l7MgmtEpg"/>.
<polUni>
<fvTenant name="mgmt">
<vnsLDevVip name="ADCCluster1"
funcType="GoTo" devtype="VIRTUAL">
<vnsRsMDevAtt tDn="uni/infra/mDev-Citrix-NetScaler-10.5"/>
<vnsRsALDevToDomP tDn="uni/vmmp-VMware/dom-mininet"/>
<vnsRsDevEpg tDn="uni/tn-mgmt/ap-services/epg-l4l7MgmtEpg"/>
<vnsCMgmt name="devMgmt"
host="3.3.3.180"
port="80"/>
<vnsCCred name="username"
value="nsroot"/>
<vnsCCredSecret name="password"
value="nsroot"/>
</vnsLDevVip>
</fvTenant>
</polUni>
4 Add the route in service Device/VM to point to the IFC inband gateway.
For example, on the route on netScaler, add route 3.0.0.0 255.255.255.0 3.3.3.3, where 3.0.0.0/24 is the
IFC inband subnet and 3.3.3.3 is the SVI IP for l4l7MgmtEpg.
5 Verify the following:
The route table on IFC has an entry for ifc inband IP.
The IFC can ping the l4l7MgmtEpg gateway on the leaf.
The service node can ping the l4l7MgmtEpg SVI gateway and IFC inb SVI Ip.
Device Packages
The URI path contains 'ppi' (package programming interface) instead of 'api', and the command is sent as a
POST operation with the device package file as the body of the message. The device package file is a zip file.
This example shows an API operation that uploads a device package file:
POST https://192.0.20.123/ppi/node/mo/.json
For more information about installing L4-L7 service device packages, see Cisco APIC Layer 4 to Layer 7
Services Deployment Guide.
Procedure
If HTTPS is enabled on the APIC, the URL for the POST is as follows:
https://10.10.10.10/ppi/node/mo/.xml
Trunking
About Trunking
You can enable trunking for a Layer 4 to Layer 7 virtual ASA device, which uses trunk port groups to aggregate
the traffic of endpoint groups. Without trunking, a virtual service device can have only 1 VLAN per interface
and up to 10 service graphs. With trunking enabled, the virtual service device can have an unlimited number
of service graphs.
For more information about trunk port groups, see the Cisco ACI Virtualization Guide.
Trunking is supported only on a virtual ASA device. The ASA device package must be version 1.2.7.8 or
later.
Enabling Trunking on a Layer 4 to Layer 7 Virtual ASA device Using the REST APIs
The following procedure provides an example of enabling trunking on a Layer 4 to Layer 7 virtual ASA device
using the REST APIs.
Procedure
<!-- The connector name C4, C5, etc.. should match the
Function connector name used in the service graph template -->
<vnsLIfCtx connNameOrLbl=C4">
<vnsRsLIfCtxToLIf tDn="uni/tn-acme/lDevVip-ADCCluster1/LIf-ext"/>
</vnsLIfCtx>
<vnsLIfCtx connNameOrLbl=C5">
<vnsRsLIfCtxToLIf tDn="uni/tn-acme/lDevVip-ADCCluster1/LIf-int"/>
</vnsLIfCtx>
</vnsLDevCtx>
</fvTenant>
</polUni>
<!-- The LIF name defined here (such as e.g., ext, or int) should match the
vnsRsLIfCtxToLIf tDn' defined in LifCtx -->
<vnsLIf name=ext">
<vnsRsMetaIf tDn="uni/infra/mDev-Acme-ADC-1.0/mIfLbl-outside"/>
<vnsRsCIfAtt tDn="uni/tn-acme/lDevVip-ADCCluster1/cDev-ADC1/cIf-ext"/>
</vnsLIf>
<vnsLIf name=int">
<vnsRsMetaIf tDn="uni/infra/mDev-Acme-ADC-1.0/mIfLbl-inside"/>
<vnsRsCIfAtt tDn="uni/tn-acme/lDevVip-ADCCluster1/cDev-ADC1/cIf-int"/>
</vnsLIf>
</vnsLDevVip>
</fvTenant>
</polUni>
</fvAEPg>
<fvAEPg dn="uni/tn-acme/ap-MyAP/epg-MySRVR" name="MySRVR">
<fvRsBd tnFvBDName="MyClntBD" />
<fvRsDomAtt tDn="uni/vmmp-Vendor1/dom-MyVMs" />
<fvRsCons tnVzBrCPName="webCtrct">
</fvRsCons>
<fvRsPathAtt tDn="topology/pod-1/paths-17/pathep-[eth1/21]" encap="vlan-203"/>
</fvAEPg>
</fvAp>
</fvTenant>
</polUni>
name="monitor1">
<vnsRsFolderInstToMFolder tDn="uni/infra/mDev-Acme-ADC-1.0/mDevCfg/mFolder-Monitor"/>
name="Service1">
<vnsParamInst name="servicename" key="servicename" value="crpvgrtst02-8010"/>
<vnsParamInst name="servicetype" key="servicetype" value="TCP"/>
<vnsParamInst name="servername" key="servername" value="s192.168.100.100"/>
<vnsParamInst name="serveripaddress" key="serveripaddress" value="192.168.100.100"/>
name="Network">
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="G2" nodeNameOrLbl="any" key="vip"
name="vip">
<vnsParamInst name="vipaddress1" key="vipaddress" value="10.10.10.200"/>
</vnsFolderInst>
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="G2" nodeNameOrLbl="any"
devCtxLbl="C1" key="snip" name="snip1">
<vnsParamInst name="snipaddress" key="snipaddress" value="192.168.1.200"/>
</vnsFolderInst>
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="G2" nodeNameOrLbl="any"
devCtxLbl="C2" key="snip" name="snip2">
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="G1" nodeNameOrLbl="any" key="Network"
name="Network">
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="G1" nodeNameOrLbl="any" key="vip"
name="vip">
<vnsParamInst name="vipaddress1" key="vipaddress" value="10.10.10.100"/>
</vnsFolderInst>
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="G1" nodeNameOrLbl="any"
devCtxLbl="C1" key="snip" name="snip1">
<vnsParamInst name="snipaddress" key="snipaddress" value="192.168.1.100"/>
</vnsFolderInst>
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="G1" nodeNameOrLbl="any"
devCtxLbl="C2" key="snip" name="snip2">
<vnsParamInst name="snipaddress" key="snipaddress" value="192.168.1.101"/>
</vnsFolderInst>
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="G1" nodeNameOrLbl="any"
devCtxLbl="C3" key="snip" name="snip3">
<vnsParamInst name="snipaddress" key="snipaddress" value="192.168.1.102"/>
</vnsFolderInst>
</vnsFolderInst>
name="VServer">
<!-- Virtual Server Configuration -->
<vnsParamInst name="port" key="port" value="8010"/>
<vnsParamInst name="vip" key="vip" value="10.10.10.100"/>
<vnsParamInst name="vservername" key="vservername" value="crpvgrtst02-vip-8010"/>
<vnsParamInst name="servicename" key="servicename" value="crpvgrtst02-8010"/>
<vnsFolderInst ctrctNameOrLbl="any" graphNameOrLbl="any" nodeNameOrLbl="any"
key="VServerGlobalConfig" name="VServerGlobalConfig">
<vnsCfgRelInst name="ServiceConfig" key="ServiceConfig" targetName="Service1"/>
</vnsMFolder>
</vnsMFolder>
Example XML POST for an Abstract Function Node With Configuration Parameters
The following XML POST example shows an abstract function node with configuration parameters:
<vnsAbsNode name = "SLB" funcType="GoTo" >
<vnsRsDefaultScopeToTerm tDn="uni/tn-tenant1/AbsGraph-G3/AbsTermNode-Output1/outtmnl"/>
<vnsAbsDevCfg>
<vnsAbsFolder key="Network" name="Network" scopedBy="epg">
<!-- Following scopes this folder to input terminal or Src Epg -->
<vnsRsScopeToTerm tDn="uni/tn-tenant1/AbsGraph-G3/AbsTermNode-Output1/outtmnl"/>
</vnsAbsFolder>
<vnsAbsFuncCfg>
<vnsAbsFolder key="VServer" name="VServer" scopedBy="epg">
<vnsRsScopeToTerm tDn="uni/tn-tenant1/AbsGraph-G3/AbsTermNode-Output1/outtmnl"/>
Example XML POST for an Abstract Function Profile With Configuration Parameters
The following XML POST example shows an abstract function profile with configuration parameters:
<vnsAbsFuncProfContr name = "NP">
<vnsAbsFuncProfGrp name = "Grp1">
<vnsAbsFuncProf name = "P1">
<vnsRsProfToMFunc tDn="uni/infra/mDev-Acme-ADC-1.0/mFunc-SLB"/>
<vnsAbsDevCfg name="D1">
<vnsAbsFolder key="Service" name="Service-Default" cardinality="n">
<vnsAbsParam name="servicetype" key="servicetype" value="TCP"/>
Copy Services
Note When you configure a copy device, the context aware parameter is not used. The context aware parameter
has a default value of single context, which can be ignored.
Procedure
Example:
<vnsLDevVip contextAware="single-Context" devtype="PHYSICAL" funcType="None" isCopy="yes"
managed="no"
mode="legacy-Mode" name="copy0" packageModel="" svcType="COPY" trunking="no">
<vnsRsALDevToPhysDomP tDn="uni/phys-phys_scale_copy"/>
<vnsCDev devCtxLbl="" name="copy_Dyn_Device_0" vcenterName="" vmName="">
<vnsCIf name="int1" vnicName="">
<vnsRsCIfPathAtt tDn="topology/pod-1/paths-104/pathep-[eth1/15]"/>
</vnsCIf>
<vnsCIf name="int2" vnicName="">
<vnsRsCIfPathAtt tDn="topology/pod-1/paths-105/pathep-[eth1/15]"/>
</vnsCIf>
</vnsCDev>
<vnsLIf encap="vlan-3540" name="TAP">
<vnsRsCIfAttN tDn="uni/tn-t22/lDevVip-copy0/cDev-copy_Dyn_Device_0/cIf-[int2]"/>
<vnsRsCIfAttN tDn="uni/tn-t22/lDevVip-copy0/cDev-copy_Dyn_Device_0/cIf-[int1]"/>
</vnsLIf>
</vnsLDevVip>
Step 2 Create a logical device context (also known as a device selection policy).
Example:
<vnsLDevCtx ctrctNameOrLbl="c0" descr="" graphNameOrLbl="g0" name="" nodeNameOrLbl="CP1">
<vnsRsLDevCtxToLDev tDn="uni/tn-t22/lDevVip-copy0"/>
<vnsLIfCtx connNameOrLbl="copy" descr="" name="">
<vnsRsLIfCtxToLIf tDn="uni/tn-t22/lDevVip-copy0/lIf-TAP"/>
</vnsLIfCtx>
</vnsLDevCtx>
Step 3 Create and apply the copy graph template.
Example:
<vnsAbsGraph descr="" name="g0" ownerKey="" ownerTag="" uiTemplateType="UNSPECIFIED">
<vnsAbsTermNodeCon descr="" name="T1" ownerKey="" ownerTag="">
<vnsAbsTermConn attNotify="no" descr="" name="1" ownerKey="" ownerTag=""/>
<vnsInTerm descr="" name=""/>
<vnsOutTerm descr="" name=""/>
</vnsAbsTermNodeCon>
<vnsAbsTermNodeProv descr="" name="T2" ownerKey="" ownerTag="">
<vnsAbsTermConn attNotify="no" descr="" name="1" ownerKey="" ownerTag=""/>
<vnsInTerm descr="" name=""/>
<vnsOutTerm descr="" name=""/>
</vnsAbsTermNodeProv>
<vnsAbsConnection adjType="L2" connDir="provider" connType="external" descr="" name="C1"
<vnsRsAbsCopyConnection tDn="uni/tn-t22/AbsGraph-g0/AbsNode-CP1/AbsFConn-copy"/>
</vnsAbsConnection>
<vnsAbsNode descr="" funcTemplateType="OTHER" funcType="None" isCopy="yes" managed="no"
Example:
<vzBrCP descr="" name="c0" ownerKey="" ownerTag="" prio="unspecified" scope="tenant"
targetDscp="unspecified">
<vzSubj consMatchT="AtleastOne" descr="" name="Subject" prio="unspecified"
provMatchT="AtleastOne"
revFltPorts="yes" targetDscp="unspecified">
<vzRsSubjFiltAtt directives="" tnVzFilterName="default"/>
<vzRsSubjGraphAtt directives="" tnVnsAbsGraphName="g0"/>
</vzSubj>
</vzBrCP>
Step 5 Attach the contract to the endpoint group.
Example:
<fvAEPg name="epg2860">
<fvRsCons tnVzBrCPName="c0"/>
<fvRsBd tnFvBDName="bd0"/>
<fvRsDomAtt tDn="uni/phys-phys_scale_SB"/>
<fvRsPathAtt tDn="topology/pod-1/paths-104/pathep-[PC_int2_g1]" encap="vlan-2860"
instrImedcy="immediate"/>
</fvAEPg>
<fvAEPg name="epg2861">
<fvRsProv tnVzBrCPName="c0"/>
<fvRsBd tnFvBDName="bd0"/>
<fvRsDomAtt tDn="uni/phys-phys_scale_SB"/>
<fvRsPathAtt tDn="topology/pod-1/paths-105/pathep-[PC_policy]" encap="vlan-2861"
instrImedcy="immediate"/>
</fvAEPg>
Developing Automation
<!L3 Network-->
<fvCtx name="MyNetwork"/>
<vnsCCred name="username"value="admin"/>
</fvTenant>
</polUni>
The following REST request creates a device cluster context:
<polUni>
<fvTenant dn="uni/tn-acme" name="acme">
<vnsLDevCtx ctrctNameOrLbl="webCtrct" graphNameOrLbl="G1" nodeNameOrLbl="Node1">
<vnsRsLDevCtxToLDev tDn="uni/tn-acme/lDevVip-ADCCluster1"/>
<vnsLIfCtx connNameOrLbl="ssl-inside">
<vnsRsLIfCtxToLIf tDn="uni/tn-acme/lDevVip-ADCCluster1/lIf-int"/>
</vnsLIfCtx>
<vnsLIfCtx connNameOrLbl="any">
<vnsRsLIfCtxToLIf tDn="uni/tn-acme/lDevVip-ADCCluster1/lIf-ext"/>
</vnsLIfCtx>
</vnsLDevCtx>
</fvTenant>
</polUni>
The following REST request creates a device cluster context used in route peering:
<polUni>
<fvTenant dn="uni/tn-coke{{tenantId}}" name="coke{{tenantId}}">
<vnsRtrCfg name="Dev1Ctx1" rtrId="180.0.0.12"/>
<vnsLDevCtx ctrctNameOrLbl="webCtrct1" graphNameOrLbl="WebGraph"
nodeNameOrLbl="FW">
<vnsRsLDevCtxToLDev tDn="uni/tn-tenant1/lDevVip-Firewall"/>
<vnsRsLDevCtxToRtrCfg tnVnsRtrCfgName="FwRtrCfg"/>
<vnsLIfCtx connNameOrLbl="internal">
<vnsRsLIfCtxToInstP tDn="uni/tn-tenant1/out-OspfInternal/instP-IntInstP"
status="created,modified"/>
<vnsRsLIfCtxToLIf tDn="uni/tn-tenant1/lDevVip-Firewall/lIf-internal"/>
</vnsLIfCtx>
<vnsLIfCtx connNameOrLbl="external">
<vnsRsLIfCtxToInstP tDn="uni/tn-common/out-OspfExternal/instP-ExtInstP"
status="created,modified"/>
<vnsRsLIfCtxToLIf tDn="uni/tn-tenant1/lDevVip-Firewall/lIf-external"/>
</vnsLIfCtx>
</vnsLDevCtx>
</fvTenant>
</polUni>
Note For information about configuring external connectivity for tenants (a Layer 3 outside), see the Cisco
APIC Basic Configuration Guide.
</fvTenant>
</polUni>
The following REST request adds a concrete device in a virtual device cluster:
<polUni>
<fvTenant dn="uni/tn-coke5" name="coke5">
<vnsLDevVip name="Firewall5" devtype="VIRTUAL">
<vnsCDev name="ASA5" vcenterName="vcenter1" vmName="ifav16-ASAv-scale-05">
<vnsCIf name="Gig0/0" vnicName="Network adapter 2"/>
<vnsCIf name="Gig0/1" vnicName="Network adapter 3"/>
<vnsCIf name="Gig0/2" vnicName="Network adapter 4"/>
<vnsCIf name="Gig0/3" vnicName="Network adapter 5"/>
<vnsCIf name="Gig0/4" vnicName="Network adapter 6"/>
<vnsCIf name="Gig0/5" vnicName="Network adapter 7"/>
<vnsCIf name="Gig0/6" vnicName="Network adapter 8"/>
<vnsCIf name="Gig0/7" vnicName="Network adapter 9"/>
<vnsCMgmt name="devMgmt" host="3.5.3.170" port="443"/>
<vnsCCred name="username" value="admin"/>
<vnsCCredSecret name="password" value="insieme"/>
</vnsCDev>
</vnsLDevVip>
</fvTenant>
</polUni>
The following REST request creates a service graph in managed mode:
<polUni>
<fvTenant name="acme">
<vnsAbsGraph name = "G1">
<vnsRsConnToLIf tDn="uni/tn-acme/lDevVip-ADCCluster1/lIf-C4"/>
</vnsAbsFuncConn>
<vnsRsConnToLIf tDn="uni/tn-acme/lDevVip-ADCCluster1/lIf-C5"/>
</vnsAbsFuncConn>
<vnsRsNodeToMFunc tDn="uni/infra/mDev-Acme-ADC-1.0/mFunc-SLB"/>
</vnsAbsNode>
</vnsAbsGraph>
</fvTenant>
</polUni>
The following REST request creates a service graph in unmanaged mode:
<polUni>
<fvTenant name="HA_Tenant1">
<vnsAbsGraph name="g1">
<vnsAbsTermNodeProv name="Input1">
<vnsAbsTermConn name="C1">
</vnsAbsTermConn>
</vnsAbsTermNodeProv>
<vnsAbsTermNodeCon name="Output1">
<vnsAbsTermConn name="C6">
</vnsAbsTermConn>
</vnsAbsTermNodeCon>
</vnsAbsGraph>
</fvTenant>
</polUni>
The following REST request creates a security policy (contract):
<polUni>
<fvTenant dn="uni/tn-acme" name="acme">
<vzFilter name="HttpIn">
<vzEntry name="e1" prot="6" dToPort="80"/>
</vzFilter>
<vzBrCP name="webCtrct">
<vzSubj name="http">
<vzRsSubjFiltAtt tnVzFilterName="HttpIn"/>
</vzSubj>
</vzBrCP>
</fvTenant>
</polUni>
The following REST request provides graph configuration parameters from an application EPG:
<polUni>
<fvTenant dn="uni/tn-acme" name="acme">
<fvRsBd tnFvBDName="MyClntBD"/>
<fvRsDomAtt tDn="uni/vmmp-Vendor1/dom-MyVMs"/>
<fvRsProv tnVzBrCPName="webCtrct">
</fvRsProv>
<fvRsPathAtt tDn="topology/pod-1/paths-17/pathep-[eth1/20]" encap="vlan-201"/>
Procedure
Step 1 Create a Layer 4 to Layer 7 ASAv device package model, using XML such as the following example:
Example:
<vnsLDevVip trunking="no" svcType="FW"
packageModel="ASAv" name="ASAv" mode="legacy-Mode"
managed="yes" isCopy="no" funcType="GoTo"
dn="uni/tn-Tenant-test/lDevVip-ASAv" devtype="VIRTUAL"
contextAware="single-Context">
Example:
<vnsAbsGraph uiTemplateType="UNSPECIFIED" ownerTag="" ownerKey="" name="FW-Graph"
dn="uni/tn-Tenant-test/AbsGraph-FW-Graph" descr="">
<vnsRsNodeToLDev tDn="uni/tn-Tenant-test/lDevVip-ASAv"/>
<vnsRsNodeToMFunc tDn="uni/infra/mDev-CISCO-ASA-1.2/mFunc-Firewall"/>
</vnsAbsNode>
</vnsAbsGraph>
Step 3 Create a device selection policy, using XML such as the following example:
Example:
<vnsLDevCtx nodeNameOrLbl="N1" name="" graphNameOrLbl="FW-Graph"
dn="uni/tn-Tenant-test/ldevCtx-c-Client-to-Web-g-FW-Graph-n-N1" descr=""
ctrctNameOrLbl="Client-to-Web">
<vnsRsLDevCtxToLDev tDn="uni/tn-Tenant-test/lDevVip-ASAv"/>
Example:
<vzBrCP targetDscp="unspecified" scope="tenant" prio="unspecified" ownerTag=""
ownerKey="" name="Client-to-Web" dn="uni/tn-Tenant-test/brc-Client-to-Web" descr="">
Example:
<fvAEPg prio="unspecified" pcEnfPref="unenforced" name="Client"
matchT="AtleastOne" isAttrBasedEPg="no" fwdCtrl="" dn="uni/tn-Tenant-test/ap-ANP/epg-Client"
descr="">
<fvRsCons prio="unspecified" tnVzBrCPName="Client-to-Web"/>
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-ACI_vDS" resImedcy="lazy" primaryEncap="unknown"
instrImedcy="lazy" encap="unknown" delimiter="" classPref="encap"/>
<fvRsBd tnFvBDName="BD1"/>
<fvRsCustQosPol tnQosCustomPolName=""/>
</fvAEPg>
Step 6 Create the Web EPG, using XML such as the following example:
Example:
-<fvAEPg prio="unspecified" pcEnfPref="unenforced" name="Web" matchT="AtleastOne"
isAttrBasedEPg="no" fwdCtrl="" dn="uni/tn-Tenant-test/ap-ANP/epg-Web" descr="">
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-ACI_vDS" resImedcy="lazy" primaryEncap="unknown"
instrImedcy="lazy" encap="unknown" delimiter="" classPref="encap"/>
<fvRsBd tnFvBDName="BD2"/>
<fvRsCustQosPol tnQosCustomPolName=""/>
To configure the entire Layer 4 to Layer 7 ASAv firewall services for a tenant, use XML such as the following
example;
<fvTenant ownerTag="" ownerKey="" name="Tenant-test" dn="uni/tn-Tenant-test" descr="">
provMatchT="AtleastOne" consMatchT="AtleastOne">
<vzRsSubjFiltAtt tnVzFilterName="default" directives=""/>
<vzRsSubjGraphAtt directives="" tnVnsAbsGraphName="FW-Graph"/>
</vzSubj>
</vzBrCP>
<vnsRsMConnAtt tDn="uni/infra/mDev-CISCO-ASA-1.2/mFunc-Firewall/mConn-internal"/>
</vnsAbsFuncConn>
<vnsRsNodeToAbsFuncProf
tDn="uni/infra/mDev-CISCO-ASA-1.2/absFuncProfContr/absFuncProfGrp-WebServiceProfileGroup/absFuncProf-WebPolicyForRoutedMode"/>
<vnsRsNodeToLDev tDn="uni/tn-Tenant-test/lDevVip-ASAv"/>
<vnsRsNodeToMFunc tDn="uni/infra/mDev-CISCO-ASA-1.2/mFunc-Firewall"/>
</vnsAbsNode>
</vnsAbsGraph>
knwMcastAct="permit">
<fvRsBgpCtxPol tnBgpCtxPolName=""/>
<fvRsCtxToExtRouteTagPol tnL3extRouteTagPolName=""/>
<fvRsOspfCtxPol tnOspfCtxPolName=""/>
<vzAny name="" descr="" matchT="AtleastOne"/>
<fvRsCtxToEpRet tnFvEpRetPolName=""/>
</fvCtx>
<vnsSvcCont/>
mandatory="no" targetName="internalIf"/>
</vnsFolderInst>
mandatory="no" targetName="externalIf"/>
</vnsFolderInst>
devCtxLbl="" cardinality="unspecified">
<vnsParamInst name="action-permit" locked="no" key="action" cardinality="unspecified"
value="permit" validation="" mandatory="no"/>
<vnsParamInst name="order1" locked="no" key="order" cardinality="unspecified" value="10"
validation="" mandatory="no"/>
validation="" mandatory="no"/>
</vnsFolderInst>
cardinality="unspecified">
<vnsParamInst name="any" locked="no" key="any" cardinality="unspecified" value="any"
validation="" mandatory="no"/>
</vnsFolderInst>
validation="" mandatory="no"/>
</vnsFolderInst>
</vnsFolderInst>
</vnsFolderInst>
<fvRsProv prio="unspecified" matchT="AtleastOne" tnVzBrCPName="Client-to-Web"/>
</fvAEPg>
isAttrBasedEPg="no" fwdCtrl="">
<fvRsCons prio="unspecified" tnVzBrCPName="Client-to-Web"/>
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-ACI_vDS" resImedcy="lazy" primaryEncap="unknown"
instrImedcy="lazy" encap="unknown" delimiter="" classPref="encap"/>
<fvRsBd tnFvBDName="BD1"/>
<fvRsCustQosPol tnQosCustomPolName=""/>
</fvAEPg>
</fvAp>
<fvRsTenantMonPol tnMonEPGPolName=""/>
</vnsCDev>
Procedure
Step 1 To configure OspfInternal on eth1/23, send a post with XML similar to the following example:
Example:
<?xml version="1.0" encoding="UTF-8?>
<!-- /api/policymgr/mo.xml -->
<polUni>
<fvTenant name="coke{{tenantId}}">
{% if status is not defined %}
{% set status = "created,modified" %}
{% endif %}
<l3extLNodeP name="bLeaf-101">
<l3extRsNodeL3OutAtt tDn="topology/pod-1/node-101" rtrId="180.0.0.11"/>
<l3extLifP name='portIf''>
<l3extRsPathL3OutAtt tDn="topology/pod-1/paths-101/pathep-[eth1/23]"
ifInstT='ext-svi' encap='vlan-3844' addr="30.30.30.100/28" mtu='1500'/>
</l3extLNodeP>
<l3extInstP name="OspfInternalInstP">
<l3extSubnet ip="30.30.30.100/28" scope="import"/>
<l3extSubnet ip="20.20.20.0/24" scope="import"/>
<l3extSubnet ip="10.10.10.0/24" scope="export"/>
</l3extInstP>
<l3extRsEctx tnFvCtxName="cokectx1"/>
</l3extOut>
Step 2 To configure OspfExternal on eth1/25, send a post with XML similar to the following example:
Example:
<?xml version="1.0" encoding="UTF-8?>
<!-- /api/policymgr/mo.xml -->
<polUni>
<fvTenant name="common">
<fvCtx name="commonctx"/>
<l3extInstP name="OspfExternalInstP">
<l3extSubnet ip="40.40.40.100/28" scope="import"/>
<l3extSubnet ip="10.10.10.0/24" scope="import"/>
<l3extSubnet ip="20.20.20.0/24" scope="export"/>
</l3extInstP>
<l3extRsEctx tnfvCtxName="commonctx"/>
</l3extOut>
The l3extInstP object specifies that prefixes 40.40.40.100/28 and 10.10.10.0/24 are to be used for prefix
based endpoint association and indicate that the L4-L7 device should advertise these routes.
<vnsRsLDevCtxToLDev tDn="uni/tn-solar{{tenantId}}/lDevVip-Firewall"/>
<vnsLIfCtx connNameOrLbl="internal">
{% if L3ExtOutInternal is not defined %}
<fvSubnet ip="10.10.10.10/24"/>
{% endif %}
<vnsRsLIfCtxToBD tDn="uni/tn-solar{{tenantId}}/BD-solarBD1"/>
<vnsRsLIfCtxToLIf tDn="uni/tn-solar{{tenantId}}/lDevVip-Firewall/lIf-internal"/>
{% if L3ExtOutInternal is defined %}
<vnsRsLIfCtxToInstP
tDn="uni/tn-solar{{tenantId}}/out-OspfInternal/instP-OspfInternalInstP"
status={{L3ExtOutInternal}}"/>
{% endif %}
</vnsLIfCtx>
<vnsLIfCtx connNameOrLbl="external">
{% if L3ExtOutExternal is not defined %}
<fvSubnet ip="40.40.40.40/24"/>
{% endif %}
<vnsRsLIfCtxToBD tDn="uni/tn-solar{{tenantId}}/BD-solarBD4"/>
<vnsRsLIfCtxToLIf tDn="uni/tn-solar{{tenantId}}/lDevVip-Firewall/lIf-external"/>
{% if L3ExtOutExternal is defined %}
<vnsRsLIfCtxToInstP
tDn="uni/tn-solar{{tenantId}}/out-OspfExternal/instP-OspfExternalInstP"
status={{L3ExtOutExternal}}"/>
{% endif %}
</vnsLIfCtx>
</vnsLDevCtx>
The associated concrete device needs to have a vnsRsCIfPathAtt that deploys it to the same fabric leaf as
shown in the following example:
<vnsCDev name="ASA">
<vnsRsLDevCtxToLDev tDn="uni/tn-solar{{tenantId}}/lDevVip-Firewall"/>
<vnsCIf name="Gig0/0">
<vnsRsCIfPathAtt tDn="topology/pod-1/paths-101/pathep-[eht1/23]"/>
</vnsCIf>
<vnsCIf name="Gig0/1">
<vnsRsCIfPathAtt tDn="topology/pod-1/paths-101/pathep-[eht1/25]"/>
</vnsCIf>
<vnsCMgmt name="devMgmt" host="{{asaIp}}" port="443" />
<vnsCCred name="username" value="admin" />
<vnsCCredSecret name="password" value="insieme" />
</vnsCDev>
In this 2-leaf, 1-spine topology, the linux web server is at IP 10.10.10.101/24 and is hosted on an ESX server
connected to dev2-leaf1. A service graph is deployed consisting of a two-arm firewall that is also connected
to dev2-leaf1. The service graph is associated with a contract that binds an external l3extOut L3OutInternet
with the provider EPG (Web VM). Two internal l3extOut policies, an L3OutExternal, and an L3OutInteral
are also deployed to the leaf ports where the service device is connected.
CoS Preservation
Preserving QoS CoS priority settings is not supported when traffic is flowing from an EPG with
isolation enforced to an EPG without isolation enforced.
A DSCP QoS policy is configured on a VLAN EPG and the packet has an IP header. DSCP marking
can be set at the filter level on the following with the precedence order from the innermost to the
outermost:
Contract
Subject
In Term
Out Term
Note When specifying vzAny for a contract, external EPG DSCP values are not honored
because vzAny is a collection of all EPGs in a VRF, and EPG specific configuration
cannot be applied. If EPG specific target DSCP values are required, then the external
EPG should not use vzAny.
Procedure
Step 1 Enable CoS preservation, using a REST API POST statement, similar to the following:
Example:
post https://192.0.20.123/api/node/mo/uni/infra/qosinst-default.xml
<imdata totalCount="1">
</imdata>
Step 2 Disable CoS preservation, using a POST statement, such as the following example, which leaves the ctrl
property empty:
Example:
post https://192.0.20.123/api/node/mo/uni/infra/qosinst-default.xml
<imdata totalCount="1">
</imdata>
Multipod QoS
Note You can alternatively use CoS Preservation where you want to preserve the QoS priority settings of 802.1P
traffic entering POD 1 and egressing out of POD 2, but you are not concerned with preserving the
CoS/DSCP settings in interpod network (IPN) traffic between the pods. For more information, see
Preserving 802.1P Class of Service Settings, on page 313.
As illustrated in this figure, traffic between pods in a multipod topology passes through an IPN, which may
not be under APIC management. When an 802.1P frame is sent from a spine or leaf switch in POD 1, the
devices in the IPN may not preserve the CoS setting in 802.1P frames. In this situation, when the frame reaches
a POD 2 spine or leaf switch, it has the CoS level assigned by the IPN device, instead of the level assigned
at the source in POD 1. Use a DSCP policy to ensure that the QoS priority levels are preserved in this case.
Configure a DSCP policy to preserve the QoS priority settings in a multipod topology, where there is a need
to do deterministic mapping from CoS to DSCP levels for different traffic types, and you want to prevent the
devices in the IPN from changing the configured levels. With a DSCP policy enabled, APIC converts the CoS
level to a DSCP level, according to the mapping you configure. When a frame is sent from POD 1 (with the
PCP level mapped to a DSCP level), when it reaches POD 2, the mapped DSCP level is then mapped back
to the original PCP CoS level.
Procedure
Step 1 Configure and enable a DSCP policy with a post, such as the following:
Example:
post https://192.0.20.123/api/node/mo/uni/tn-infra/dscptranspol-default.xml
<imdata totalCount="1">
</imdata>
Step 2 Disable the DSCP policy with a post such as the following:
Example:
post https://192.0.20.123/api/node/mo/uni/tn-infra/dscptranspol-default.xml
<imdata totalCount="1">
</imdata>
802.1P CoS translation is not supported when the following configuration options are enabled:
Translating QoS Ingress Markings to Egress Markings Using the REST API
Create a custom QoS policy and then associate the policy with an EPG.
Procedure
Step 1 Create a custom QoS policy by sending a post with XML such as the following example:
Example:
<qosCustomPol name="vrfQos001" dn="uni/tn-t001/qoscustom-vrfQos001">
<qosDscpClass to="AF31" targetCos="6"
target="unspecified" prio="unspecified" from="AF23"/>
<qosDot1PClass to="1" targetCos="6" target="unspecified"
prio="unspecified" from="0"/>
</qosCustomPol>
Step 2 Associate the policy with an EPG that will consume it by sending a post with XML such as the following
example:
Example:
<fvAEPg
prio="unspecified" prefGrMemb="exclude" pcEnfPref="unenforced"
name="ep2" matchT="AtleastOne" isAttrBasedEPg="no" fwdCtrl=""
dn="uni/tn-t001/ap-ap2/epg-ep2">
<fvRsDomAtt tDn="uni/vmmp-VMware/dom-vs1" resImedcy="lazy"
primaryEncap="unknown" netflowPref="disabled" instrImedcy="lazy" encapMode="auto"
encap="unknown" delimiter="" classPref="encap"/>
<fvRsCustQosPol tnQosCustomPolName="vrfQos001"/>
<fvRsBd tnFvBDName="default"/>
</fvAEPg>
Problem Solution
Unable to update a configured QoS policy.
1 Invoke the following API to ensure that
qospDscpRule is present on the leaf.
GET
https://192.0.20.123/api/node/class/qospDscpRule.xml
2 Ensure that the QoS rules are accurately
configured and associated to the EPG ID to which
the policy is attached.
Use the following NX-OS style CLI commands
to verify the configuration.
leaf1# show vlan
leaf1# show system internal aclqos qos policy
detail
apic1# show running-config tenant
tenant-name policy-map type qos
custom-qos-policy-name
apic1# show running-config tenant
tenant-name application application-name epg
epg-name
Overview
This article provides step by step instructions on how to enable RADIUS, TACACS+, and LDAP users access
the APIC. It assumes the reader is thoroughly familiar with the Cisco Application Centric Infrastructure
Fundamentals manual, especially the User Access, Authentication, and Accounting chapter.
Guidelines
When configuring an external authentication server to access the Cisco APIC, follow these guidelines:
Whenever a .
While configuring .
By definition, .
This configuration task is applicable for .
The user must configure .
The autonomous system feature can only be .
Procedure
Step 1 Configure the TACACS+ Provider by sending a POST request with XML such as the following example:
Example:
<aaaTacacsPlusProvider timeout="5" retries="1" port="49" name="192.168.200.1"
monitoringUser="test" monitorServer="disabled"
dn="uni/userext/tacacsext/tacacsplusprovider-192.168.200.1" authProtocol="pap"/>
Step 2 Configure the TACACS+ Provider Group by sending a POST request with XML such as the following
example:
Example:
<aaaTacacsPlusProviderGroup name="TENANT64_TACACS_provGrp"
dn="uni/userext/tacacsext/tacacsplusprovidergroup-TENANT64_TACACS_provGrp"/>
Step 3 Configure the TACACS+ Login Domain by sending a POST request with XML such as the following example:
Example:
<aaaLoginDomain name="TENANT64_TACACS_LoginDom"
dn="uni/userext/logindomain-TENANT64_TACACS_LoginDom"/>
The entire configuration can be sent in one POST request, with XML such as this example:
<aaaTacacsPlusProvider timeout="5" retries="1" port="49"
name="192.168.200.1" monitoringUser="test" monitorServer="disabled"
dn="uni/userext/tacacsext/tacacsplusprovider-192.168.200.1" authProtocol="pap"/>
<aaaTacacsPlusProviderGroup name="TENANT64_TACACS_provGrp"
dn="uni/userext/tacacsext/tacacsplusprovidergroup-TENANT64_TACACS_provGrp"/>
<aaaLoginDomain name="TENANT64_TACACS_LoginDom"
dn="uni/userext/logindomain-TENANT64_TACACS_LoginDom"/>
Procedure
Step 1 Configure the RADIUS Provider by sending a POST request with XML such as the following example:
Example:
<aaaRadiusProvider timeout="5" retries="1" name="TENANT64_RADIUS-host.com"
monitoringUser="test" monitorServer="disabled"
dn="uni/userext/radiusext/radiusprovider-TENANT64_RADIUS-host.com" authProtocol="pap"
authPort="1812"/>
Step 2 Configure the RADIUS Provider Group by sending a POST request with XML such as the following example:
Example:
<aaaRadiusProviderGroup name="TENANT64_RADIUS_provGrp"
dn="uni/userext/radiusext/radiusprovidergroup-TENANT64_RADIUS_provGrp"/>
Step 3 Configure the RADIUS Login Domain by sending a POST request with XML such as the following example:
Example:
<aaaLoginDomain name="TENANT64_RADIUSLoginDom"
dn="uni/userext/logindomain-TENANT64_RADIUSLoginDom"/>
The entire configuration can be sent as one POST request, with XML such as this example:
<aaaRadiusProvider
timeout="5" retries="1" name="TENANT64_RADIUS-host.com" monitoringUser="test"
monitorServer="disabled"
dn="uni/userext/radiusext/radiusprovider-TENANT64_RADIUS-host.com" authProtocol="pap"
authPort="1812"/>
<aaaRadiusProviderGroup
name="TENANT64_RADIUS_provGrp"
dn="uni/userext/radiusext/radiusprovidergroup-TENANT64_RADIUS_provGrp"/>
<aaaLoginDomain
name="TENANT64_RADIUSLoginDom" dn="uni/userext/logindomain-TENANT64_RADIUSLoginDom"/>
Procedure
Step 1 Configure the LDAP Provider by sending a POST request with XML such as the following example:
Example:
<aaaLdapProvider timeout="30" rootdn="" retries="1" port="389" name="TENANT64_LDAP-host.com"
Example:
<aaaLdapProviderGroup name="TENANT64_LDAP-ProvGrp"
dn="uni/userext/ldapext/ldapprovidergroup-TENANT64_LDAP-ProvGrp"/>
Step 3 Configure the LDAP Login Domain by sending a POST request with XML such as the following example:
Example:
<aaaDomainAuth realm="ldap" providerGroup="TENANT64_LDAP-ProvGrp"
dn="uni/userext/logindomain-TENANT64_LDAPLoginDom/domainauth"/>
The entire configuration can be sent in one POST request, with XML such as the following example:
<aaaLdapProvider
timeout="30" rootdn="" retries="1" port="389" name="TENANT64_LDAP-host.com"
monitoringUser="test" monitorServer="disabled" filter="cn=$userid" enableSSL="yes"
dn="uni/userext/ldapext/ldapprovider-TENANT64_LDAP-host.com" descr="" basedn=""
attribute="CiscoAVPair" SSLValidationLevel="strict"/>
<aaaLdapProviderGroup
name="TENANT64_LDAP-ProvGrp"dn="uni/userext/ldapext/ldapprovidergroup-TENANT64_LDAP-ProvGrp"/>
<aaaDomainAuth
realm="ldap" providerGroup="TENANT64_LDAP-ProvGrp"
dn="uni/userext/logindomain-TENANT64_LDAPLoginDom/domainauth"/>
Configuring FIPS
Procedure
Example:
https://apic1.cisco.com/api/node/mo/uni/userext.xml
<aaaFabricSec fipsMode="enable" />
Note You must reboot to complete the configuration. Anytime you change the mode, you must reboot to
complete the configuration.
Does not enforce serial number based authorization Enforces serial number authorization.
.
Procedure
Step 1 To enable strict mode, send a POST request with XML such as the following example:
Example:
POST https://apic-ip-address/api/node/mo/uni.xml?
<pkiFabricCommunicationEp mode="strict"/>
Step 2 To enable permissive mode, send a POST request with XML such as the following example:
Example:
POST https://apic-ip-address/api/node/mo/uni.xml?
<pkiFabricCommunicationEp mode="permissive"/>
Step 3 To authorize a controller, send a POST request with XML such as the following example:
Example:
POST https://apic-ip-address/api/mo/uni/controller.xml?
<fabricNodeIdentPol>
<fabricCtrlrIdentP serial=TEP-1-1/>
</fabricNodeIdentPol>
Step 4 To reject a controller, send a POST request with XML such as the following example:
Example:
POST https://apic-ip-address/api/mo/uni/controller.xml?
<fabricNodeIdentPol>
<fabricCtrlrIdentP serial="FCH1750V025" reject=yes"/>
</fabricNodeIdentPol>
Enabling RBAC
The ACI fabric manages access privileges at the managed object (MO) level. A privilege is an MO that enables
or restricts access to a particular function within the system. For example, fabric-equipment is a privilege bit.
This bit is set by the Application Policy Infrastructure Controller (APIC) on all objects that correspond to
equipment in the physical fabric.
A role is a collection of privilege bits. For example, because an admin role is configured with privilege bits
for fabric-equipment and tenant-security, the admin role has access to all objects that correspond to
equipment of the fabric and tenant security.
A security domain is a tag associated with a certain subtree in the ACI MIT object hierarchy. For example,
the default tenant common has a domain tag common. Similarly, the special domain tag all includes the
entire MIT object tree. An administrator can assign custom domain tags to the MIT object hierarchy. For
example, an administrator could assign the solar domain tag to the tenant named solar. Within the MIT, only
certain objects can be tagged as security domains. For example, a tenant can be tagged as a security domain
but objects within a tenant cannot.
Creating a user and assigning a role to that user does not enable access rights. It is necessary to also assign
the user to one or more security domains. By default, the ACI fabric includes two special pre-created domains:
Allallows access to the entire MIT
Infra allows access to fabric infrastructure objects/subtrees, such as fabric access policies
Note For read operations to the managed objects that a user's credentials do not allow, a "DN/Class Not Found"
error is returned, not "DN/Class Unauthorized to read." For write operations to a managed object that a
user's credentials do not allow, an HTTP 401 Unauthorized error is returned. In the GUI, actions that a
user's credentials do not allow, either they are not presented, or they are grayed out.
A set of predefined managed object classes can be associated with domains. These classes should not have
overlapping containment. Examples of classes that support domain association are as follows:
Layer 2 and Layer 3 network managed objects
Network profiles (such as physical, Layer 2, Layer 3, management)
QoS policies
When an object that can be associated with a domain is created, the user must assign domain(s) to the object
within the limits of the user's access rights. Domain assignment can be modified at any time.
If a virtual machine management (VMM) domain is tagged as a security domain, the users contained in the
security domain can access the correspondingly tagged VMM domain. For example, if a tenant named solar
is tagged with the security domain called sun and a VMM domain is also tagged with the security domain
called sun, then users in the solar tenant can access the VMM domain according to their access rights.
admin admin Provides full access to all of the features of the fabric.
The admin privilege can be considered to be a union
of all other privileges.
Role: access-admin
Privilege Description
access-connectivity-l1 Used for Layer 1 configuration under infra. Example: selectors and
port Layer 1 policy configurations.
access-connectivity-l3 Used for Layer 3 configuration under infra and static route
configurations under a tenant's L3Out.
Role: access-admin
Privilege Description
access-connectivity-util Used for tenant ERSPAN policies.
access-protocol-mgmt Used for fabric-wide policies for NTP, SNMP, DNS, and image
management.
Role:fabric-admin
Privilege Description
fabric-connectivity-l1 Used for Layer 1 configuration under the fabric. Example: selectors
and port Layer 1 policy and vPC protection.
fabric-connectivity-l2 Used in firmware and deployment policies for raising warnings for
estimating policy deployment impact.
fabric-connectivity-l3 Used for Layer 3 configuration under the fabric. Example: Fabric
IPv4, IPv6, and MAC protection groups.
fabric-connectivity-mgmt Used for atomic counter and diagnostic policies on leaf switches and
spine switches.
fabric-connectivity-util Used for atomic counter, diagnostic, and image management policies
on leaf switches and spine switches.
fabric-equipment Used for atomic counter, diagnostic, and image management policies
on leaf switches and spine switches.
Role:fabric-admin
Privilege Description
fabric-protocol-mgmt Used for fabric-wide policies for NTP, SNMP, DNS, and image
management.
tenant-connectivity-util Used for atomic counter, diagnostic, and image management policies
on leaf switches and spine switches.
Role: ops
Privilege Description
ops Used for operational policies including monitoring
and troubleshooting policies such as atomic counter,
SPAN, TSW, tech support, traceroute, analytics, and
core policies.
Role: read-all
Privilege Description
access-connectivity-l1 Used for Layer 1 configuration under infra. Example: selectors and
port Layer 1 policy configurations.
access-connectivity-l3 Used for Layer 3 configuration under infra and static route
configurations under a tenant's L3Out.
access-protocol-mgmt Used for fabric-wide policies for NTP, SNMP, DNS, and image
management.
access-protocol-ops Used for operations-related access policies such as cluster policy and
firmware policies.
fabric-connectivity-l1 Used for Layer 1 configuration under the fabric. Example: selectors
and port Layer 1 policy and vPC protection.
fabric-connectivity-l2 Used in firmware and deployment policies for raising warnings for
estimating policy deployment impact.
fabric-connectivity-l3 Used for Layer 3 configuration under the fabric. Example: Fabric
IPv4, IPv6, and MAC protection groups.
Role: read-all
Privilege Description
nw-svc-params Used for managing Layer 4 to Layer 7 service policies.
tenant-connectivity-util Used for atomic counter, diagnostic, and image management policies
on leaf switches and spine switches.
tenant-connectivity-l2 Used for Layer 2 connectivity changes, including bridge domains and
subnets.
tenant-ext-protocol-l1 Used for managing tenant external Layer 1 protocols. Generally only
used for write access for firmware policies.
tenant-ext-protocol-l2 Used for managing tenant external Layer 2 protocols. Generally only
used for write access for firmware policies.
tenant-ext-protocol-l3 Used for managing tenant external Layer 3 protocols such as BGP,
OSPF, PIM, and IGMP.
Role: read-all
Privilege Description
tenant-network-profile Used for managing tenant configurations, such as deleting and creating
network profiles, and deleting and creating endpoint groups.
tenant-protocol-l1 Used for managing configurations for Layer 1 protocols under a tenant.
tenant-protocol-l2 Used for managing configurations for Layer 2 protocols under a tenant.
tenant-protocol-l3 Used for managing configurations for Layer 3 protocols under a tenant.
vmm-connectivity Used to read all the objects in APIC's VMM inventory required for
virtual machine connectivity.
vmm-ep Used to read virtual machine and hypervisor endpoints in the APIC's
VMM inventory.
vmm-security Used for managing authentication policies for VMM, such as the
username and password for VMware vCenter.
Role: tenant-admin
Privilege Description
aaa Used for configuring authentication, authorization, accouting and
import/export policies.
access-connectivity-l1 Used for Layer 1 configuration under infra. Example: selectors and
port Layer 1 policy configurations.
access-connectivity-l3 Used for Layer 3 configuration under infra and static route
configurations under a tenant's L3Out.
Role: tenant-admin
Privilege Description
access-connectivity-mgmt Used for management infra policies.
access-protocol-mgmt Used for fabric-wide policies for NTP, SNMP, DNS, and image
management.
access-protocol-ops Used for operations-related access policies such as cluster policy and
firmware policies.
fabric-connectivity-l1 Used for Layer 1 configuration under the fabric. Example: selectors
and port Layer 1 policy and vPC protection.
fabric-connectivity-l2 Used in firmware and deployment policies for raising warnings for
estimating policy deployment impact.
fabric-connectivity-l3 Used for Layer 3 configuration under the fabric. Example: Fabric
IPv4, IPv6, and MAC protection groups.
fabric-connectivity-mgmt Used for atomic counter and diagnostic policies on leaf switches and
spine switches.
fabric-connectivity-util Used for atomic counter, diagnostic, and image management policies
on leaf switches and spine switches.
fabric-equipment Used for atomic counter, diagnostic, and image management policies
on leaf switches and spine switches.
fabric-protocol-mgmt Used for fabric-wide policies for NTP, SNMP, DNS, and image
management.
Role: tenant-admin
Privilege Description
fabric-protocol-ops Used for ERSPAN and health score policies.
tenant-connectivity-util Used for atomic counter, diagnostic, and image management policies
on leaf switches and spine switches.
tenant-connectivity-l2 Used for Layer 2 connectivity changes, including bridge domains and
subnets.
tenant-ext-protocol-l1 Used for managing tenant external Layer 1 protocols. Generally only
used for write access for firmware policies.
Role: tenant-admin
Privilege Description
tenant-ext-protocol-l2 Used for managing tenant external Layer 2 protocols. Generally only
used for write access for firmware policies.
tenant-ext-protocol-l3 Used for managing tenant external Layer 3 protocols such as BGP,
OSPF, PIM, and IGMP.
tenant-network-profile Used for managing tenant configurations, such as deleting and creating
network profiles, and deleting and creating endpoint groups.
tenant-protocol-l1 Used for managing configurations for Layer 1 protocols under a tenant.
tenant-protocol-l2 Used for managing configurations for Layer 2 protocols under a tenant.
tenant-protocol-l3 Used for managing configurations for Layer 3 protocols under a tenant.
vmm-connectivity Used to read all the objects in APIC's VMM inventory required for
virtual machine connectivity.
vmm-ep Used to read virtual machine and hypervisor endpoints in the APIC's
VMM inventory.
vmm-security Used for managing authentication policies for VMM, such as the
username and password for VMware vCenter.
Role: tenant-ext-admin
Privilege Description
tenant-connectivity-util Used for atomic counter, diagnostic, and image management policies
on leaf switches and spine switches.
tenant-connectivity-l2 Used for Layer 2 connectivity changes, including bridge domains and
subnets.
tenant-ext-protocol-l1 Used for managing tenant external Layer 1 protocols. Generally only
used for write access for firmware policies.
tenant-ext-protocol-l2 Used for managing tenant external Layer 2 protocols. Generally only
used for write access for firmware policies.
tenant-ext-protocol-l3 Used for managing tenant external Layer 3 protocols such as BGP,
OSPF, PIM, and IGMP.
tenant-network-profile Used for managing tenant configurations, such as deleting and creating
network profiles, and deleting and creating endpoint groups.
tenant-protocol-l1 Used for managing configurations for Layer 1 protocols under a tenant.
tenant-protocol-l2 Used for managing configurations for Layer 2 protocols under a tenant.
Role: tenant-ext-admin
Privilege Description
tenant-protocol-l3 Used for managing configurations for Layer 3 protocols under a tenant.
vmm-connectivity Used to read all the objects in APIC's VMM inventory required for
virtual machine connectivity.
vmm-ep Used to read virtual machine and hypervisor endpoints in the APIC's
VMM inventory.
vmm-security Used for managing authentication policies for VMM, such as the
username and password for VMware vCenter.
Role: vmm-admin
Privilege Description
vmm-connectivity Used to read all the objects in APIC's VMM inventory required for
virtual machine connectivity.
vmm-ep Used to read virtual machine and hypervisor endpoints in the APIC's
VMM inventory.
vmm-security Used for managing authentication policies for a VMM, such as the
username and password for VMware vCenter.
Custom Roles
You can create custom roles and assign privileges to the roles. The interface internally assigns one or more
privileges to all managed object classes. In an XML model, privileges are assigned in an access attribute.
Privilege bits are assigned at compile time and apply per class, and not per instance or object of the class.
In addition to the 45 privilege bits, the "aaa" privilege bit applies to all AAA-subsystem configuration and
read operations. The following table provides a matrix of the supported privilege combinations. The rows in
the table represent Cisco Application Centric Infrastructure (ACI) modules and the columns represent
functionality for a given module. A value of "Yes" in a cell indicates that the functionality for the module is
accessible and there exists a privilege bit to access that functionality. An empty cell indicates that the particular
functionality for module is not accessible by any privilege bit. See the privilege bit descriptions to learn what
each bit does.
The following two RBAC rules enable the consumer tenant to post the consumer postman query in the JSON
file below.
<aaaRbacEp>
<aaaRbacRule objectDn="uni/vmmp-VMware/dom-Datacenter" domain="cons1"/>
<aaaRbacRule objectDn="uni/tn-prov1/brc-webCtrct" domain="cons1"/>
</aaaRbacEp>
"url":"http://http://solar.local:8000/api/aaaLogin.json",
"method":"POST",
"headers":"",
"data":
"{\"aaaUser\":{\"attributes\":{\"name\": \"prov1\", \"pwd\": \"secret!\"}}}",
"dataMode":"raw","timestamp":0,"version":2,"time":1398807562828},
{"collectionId":"ac62a200-9210-f53b-7114-a8f4cffb9a36","id":"56e46db0-77ea-743f-a64e-c5f7b1f59807",
"name":"Root login",
"description":"",
"url":"http://http://solar.local:8000/api/aaaLogin.json",
"method":"POST",
"headers":"",
"data":
"{\"aaaUser\":{\"attributes\":{\"name\": \"admin\", \"pwd\": \"secret!\"}}}",
"dataMode":"raw","timestamp":0,"responses":[],"version":2},
{"collectionId":"ac62a200-9210-f53b-7114-a8f4cffb9a36","id":"804893f1-0915-6d35-169d-3af0eb3e64ec",
"name":"consumer tenant only",
"description":"",
"url":"http://http://solar.local:8000/api/policymgr/mo/uni/tn-cons1.xml",
"method":"POST",
"headers":"",
"data":
"<fvTenant name=\"cons1\">
<aaaDomainRef name=\"cons1\"/>\n
</fvTenant>\n",
"dataMode":"raw","timestamp":0,"version":2,"time":1398968007487},
{"collectionId":"ac62a200-9210-f53b-7114-a8f4cffb9a36","id":"85802d50-8089-bf8b-4481-f149bec258c8",
"name":"login as cons1",
"description":"",
"url":"http://solar.local:8000/api/aaaLogin.json",
"method":"POST",
"headers":"",
"data":
"{\"aaaUser\":{\"attributes\":{\"name\": \"cons1\", \"pwd\": \"secret!\"}}}",
"dataMode":"raw","timestamp":0,"version":2,"time":1398807575531},
{"collectionId":"ac62a200-9210-f53b-7114-a8f4cffb9a36","id":"a2739d92-5f9d-f16c-8894-0f64b6f967a3",
"name":"consumer",
"description":"",
"url":"http://solar.local:8000/api/policymgr/mo/uni/tn-cons1.xml",
"method":"POST","headers":"","data":
"<fvTenant name=\"cons1\" status=\"modified\">\n
<fvCtx name=\"cons1\"/>\n
<!-- bridge domain -->\n
<fvBD name=\"cons1\">\n
<fvRsCtx tnFvCtxName=\"cons1\" />\n
<fvSubnet ip=\"10.0.2.128/24\" scope='shared'/>\n
</fvBD>\n
\n <!-- DNS Shared Service Contract Interface-->\n
<vzCPIf name=\"consIf\">\n
<vzRsIf tDn=\"uni/tn-prov1/brc-webCtrct\" >\n
</vzRsIf>\n
</vzCPIf>\n \n
<fvAp name=\"cons1\">\n
<fvAEPg name=\"APP\">\n
<fvRsBd tnFvBDName=\"cons1\" />\n
<fvRsNodeAtt tDn=\"topology/pod-1/node-101\" encap=\"vlan-4000\" instrImedcy=\"immediate\"
mode=\"regular\"/>\n
<fvRsDomAtt tDn=\"uni/vmmp-VMware/dom-Datacenter\"/>\n
<fvRsConsIf tnVzCPIfName=\"consIf\"/>\n
</fvAEPg>\n
</fvAp>\n
</fvTenant>\n",
"dataMode":"raw","timestamp":0,"version":2,"time":1398818639692},
{"collectionId":"ac62a200-9210-f53b-7114-a8f4cffb9a36","id":"c0bd866d-600a-4f45-46ec-6986398cbf78",
"name":"provider tenant only",
"description":"",
"url":"http://solar.local:8000/api/policymgr/mo/uni/tn-prov1.xml",
"method":"POST",
"headers":"",
"data":
"<fvTenant name=\"prov1\"><aaaDomainRef name=\"prov1\"/>
\n
</fvTenant>\n",
"dataMode":"raw","timestamp":0,"version":2,"time":1398818137518},
{"collectionId":"ac62a200-9210-f53b-7114-a8f4cffb9a36","id":"d433a213-e95d-646d-895e-3a9e2e2b7ba3",
"name":"create RbacRule",
"description":"",
"url":"http://solar.local:8000/api/policymgr/mo/uni.xml",
"method":"POST",
"headers":"",
"data":
"<aaaRbacEp>\n
<aaaRbacRule objectDn=\"uni/vmmp-VMware/dom-Datacenter\" domain=\"cons1\"/>\n
<aaaRbacRule objectDn=\"uni/tn-prov1/brc-webCtrct\" domain=\"cons1\"/>\n
</aaaRbacEp>\n",
"dataMode":"raw","timestamp":0,"version":2,"time":1414195420515},
{"collectionId":"ac62a200-9210-f53b-7114-a8f4cffb9a36","id":"d5c5d580-a11a-7c61-34ac-cbdac249157f",
"name":"provider",
"description":"",
"url":"http://solar.local:8000/api/policymgr/mo/uni/tn-prov1.xml",
"method":"POST",
"headers":"",
"data":
"<fvTenant name=\"prov1\" status=\"modified\">\n
<fvCtx name=\"prov1\"/>\n
\n <!-- bridge domain -->\n
<fvBD name=\"prov1\">\n
<fvRsCtx tnFvCtxName=\"prov1\" />\n
</fvBD>\n \n
<vzFilter name='t0f0' >\n
<vzEntry etherT='ip' dToPort='10' prot='6' name='t0f0e9' dFromPort='10'>
</vzEntry>\n
</vzFilter>\n \n
<vzFilter name='t0f1'>\n
<vzEntry etherT='ip' dToPort='209' prot='6' name='t0f1e8' dFromPort='109'>
</vzEntry>\n
</vzFilter>\n \n
<vzBrCP name=\"webCtrct\" scope=\"global\">\n
<vzSubj name=\"app\">\n
<vzRsSubjFiltAtt tnVzFilterName=\"t0f0\"/>\n
<vzRsSubjFiltAtt tnVzFilterName=\"t0f1\"/>\n
</vzSubj>\n
</vzBrCP>\n \n
<fvAp name=\"prov1AP\">\n
<fvAEPg name=\"Web\">\n
<fvRsBd tnFvBDName=\"prov1\" />\n
<fvRsNodeAtt tDn=\"topology/pod-1/node-17\" encap=\"vlan-4000\"
instrImedcy=\"immediate\" mode=\"regular\"/>\n
<fvRsProv tnVzBrCPName=\"webCtrct\"/>\n
<fvRsDomAtt tDn=\"uni/vmmp-VMware/dom-Datacenter\"/>\n
<fvSubnet ip=\"10.0.1.128/24\" scope='shared'/>\n
</fvAEPg>\n
</fvAp>\n
</fvTenant>\n",
"dataMode":"raw","timestamp":0,"version":2,"time":1398818660457},
{"collectionId":"ac62a200-9210-f53b-7114-a8f4cffb9a36","id":"e8866493-2188-8893-8e0c-4ca0903b18b8",
"name":"add user prov1",
"description":"",
"url":"http://solar.local:8000/api/policymgr/mo/uni/userext.xml",
"method":"POST",
"headers":"",
"data":
"<aaaUserEp>\n
<aaaUser name=\"prov1\" pwd=\"secret!\">
<aaaUserDomain name=\"prov1\">
<aaaUserRole name=\"tenant-admin\" privType=\"writePriv\"/>
<aaaUserRole name=\"vmm-admin\" privType=\"writePriv\"/>
</aaaUserDomain>
</aaaUser>\n
<aaaUser name=\"cons1\" pwd=\"secret!\">
<aaaUserDomain name=\"cons1\">
<aaaUserRole name=\"tenant-admin\" privType=\"writePriv\"/>
<aaaUserRole name=\"vmm-admin\" privType=\"writePriv\"/>
</aaaUserDomain>
</aaaUser>\n
<aaaDomain name=\"prov1\"/>\n
<aaaDomain name=\"cons1\"/>\n
</aaaUserEp>\n",
"dataMode":"raw","timestamp":0,"version":2,"time":1398820966635}]}
If the limit is not reached, the endpoint is learned and a verification is made to see if the limit is reached
because of this new endpoint. If the limit is reached, and the learn disable action is configured, learning will
be disabled in the hardware on that interface (on the physical interface or on a port channel or vPC). If the
limit is reached and the learn disable action is not configured, the endpoint will be installed in hardware with
a drop action. Such endpoints are aged normally like any other endpoints.
When the limit is reached for the first time, the operational state of the port security policy object is updated
to reflect it. A static rule is defined to raise a fault so that the user is alerted. A syslog is also raised when the
limit is reached.
In case of vPC, when the MAC limit is reached, the peer leaf switch is also notified so learning can be disabled
on the peer. As the vPC peer can be rebooted any time or vPC legs can become unoperational or restart, this
state will be reconciled with the peer so vPC peers do not go out of sync with this state. If they get out of sync,
there can be a situation where learning is enabled on one leg and disabled on the other leg.
By default, once the limit is reached and learning is disabled, it will not be automatically re-enabled and there
is no automatic recovery policy. As this is a security violation, the administrator must rectify the problem and
toggle the action to clear the hardware state so that learning is enabled again.
Protect Mode
The protect mode prevents further port security violations from occurring. Once the MAC limit exceeds the
maximum configured value on a port, all traffic from excess MAC addresses will be dropped and further
learning is disabled.
Procedure
Example:
<polUni>
<infraInfra>
<infraNodeP name="test">
<infraLeafS name="test" type="range">
<infraNodeBlk name="test" from_="101" to_="102"/>
</infraLeafS>
<infraRsAccPortP tDn="uni/infra/accportprof-test"/>
</infraNodeP>
<infraAccPortP name="test">
<infraHPortS name="pselc" type="range">
<infraPortBlk name="blk"
<infraFuncP>
<infraAccPortGrp name="testPortG">
<infraRsL2PortSecurityPol tnL2PortSecurityPolName="testL2PortSecurityPol"/>
<infraAttEntityP name="test">
<infraRsDomP tDn="uni/phys-mininet"/>
</infraAttEntityP>
</infraInfra>
</polUni>
Overview
Council of Oracle Protocol (COOP) is used to communicate the mapping information (location and identity)
to the spine proxy. A leaf switch forwards endpoint address information to the spine switch 'Oracle' using
Zero Message Queue (ZMQ). COOP running on the spine nodes will ensure all spine nodes maintain a
consistent copy of endpoint address and location information and additionally maintain the distributed hash
table (DHT) repository of endpoint identity to location mapping database.
COOP data path communication provides high priority to transport using secured connections. COOP is
enhanced to leverage the MD5 option to protect COOP messages from malicious traffic injection. The APIC
controller and switches support COOP protocol authentication.
COOP protocol is enhanced to support two ZMQ authentication modes: strict and compatible.
Strict mode: COOP allows MD5 authenticated ZMQ connections only.
Compatible mode: COOP accepts both MD5 authenticated and non-authenticated ZMQ connections for
message transportation.
Procedure
Example:
https://172.23.53.xx/api/node/mo/uni/fabric/pol-default.xml
<coopPol type="strict">
</coopPol>