Chapter 9: Cisco Catalyst Center — Architecture and Day 0 Provisioning

Learning Objectives

9.1 Catalyst Center Architecture and APIs

Pre-Check — Section 9.1: Architecture and APIs

1. What does the term "Intent-Based Networking" mean in the context of Catalyst Center?

2. Which Catalyst Center API plane is used by external automation tools to issue configuration commands?

3. How long is a Catalyst Center authentication token valid by default?

4. When a Catalyst Center mutating operation (POST/PUT/DELETE) returns HTTP 202, what does the response body contain?

5. Which HTTP header must every Catalyst Center Intent API request include after authentication?

9.1.1 From DNA Center to Catalyst Center: Intent-Based Networking

Cisco Catalyst Center — formerly DNA Center — is Cisco's flagship Intent-Based Networking (IBN) controller. The exam treats "DNA Center" and "Catalyst Center" as synonymous. Traditional management works bottom-up: engineers configure each device with CLI. IBN inverts the relationship — you declare the outcome and the controller derives the per-device configuration.

Catalyst Center delivers IBN through three capabilities: Design (sites, IP pools, network settings), Policy (SD-Access segmentation, group-based policy), and Assurance (telemetry, AI/ML analytics, root-cause analysis).

9.1.2 Platform Architecture and Communication Planes

Catalyst Center exposes four communication planes. The southbound interface is hidden from automation engineers — you call the Northbound Intent API, and Catalyst Center translates that intent into NETCONF, SSH, SNMP, or OpenConfig as needed per device type.

PlaneInterfaceProtocolPurpose
NorthboundIntent APIREST/HTTPS + JSONExternal automation, orchestration
SouthboundDevice ConnectivityNETCONF/YANG, SSH, SNMP, OpenConfigConfigure and monitor managed devices
EastboundEvents & NotificationsWebSocket, WebhooksReal-time event streaming
WestboundIntegration APIRESTITSM integrations (ServiceNow, BMC)

Communication Planes at a Glance

Automation Tools
Catalyst
Center
Switches / Routers
ITSM (ServiceNow)
Access Points
Event Consumers
WLCs
→ Northbound (Intent API)
↔ Westbound (Integration)
← Eastbound (Events)
→ Southbound (Device)
flowchart TD subgraph External["External Systems"] AUTO["Automation / Orchestration"] ITSM["ITSM (ServiceNow, BMC)"] MON["Event Consumers"] end subgraph CC["Catalyst Center Controller"] NB["Northbound — Intent API\nREST/HTTPS + JSON"] WB["Westbound — Integration API\nREST"] EB["Eastbound — Events\nWebSocket / Webhooks"] SB["Southbound — Device Connectivity\nNETCONF · SSH · SNMP · OpenConfig"] end subgraph Devices["Managed Devices"] SW["Switches"] RT["Routers"] AP["Access Points"] WLC["Wireless Controllers"] end AUTO -->|"X-Auth-Token"| NB ITSM <-->|"ServiceNow integration"| WB EB -->|"Real-time events"| MON SB --> SW & RT & AP & WLC

9.1.3 The Intent API: Structure and Authentication

The Intent API exposes over 1,000 operations organized into functional domains. All calls use the base path /dna/intent/api/v1/ (v2 for some newer endpoints) and require an X-Auth-Token header.

Authentication uses a POST to /dna/system/api/v1/auth/token with Basic credentials encoded in Base64. The response contains a JWT-like token valid for 1 hour. The catalystcentersdk handles refresh automatically.

sequenceDiagram participant Client as Automation Client participant CC as Catalyst Center participant API as Intent API Client->>CC: POST /dna/system/api/v1/auth/token
Authorization: Basic base64(user:pass) CC-->>Client: 200 OK {"Token": "eyJhbGci..."} Note over Client: Token valid for 1 hour Client->>API: GET /dna/intent/api/v1/network-device
X-Auth-Token: eyJhbGci... API-->>Client: 200 OK [device list] Client->>API: POST .../pnp-device/site-claim
X-Auth-Token: eyJhbGci... API-->>Client: 202 Accepted {"taskId": "abc-123"} Note over Client: Poll taskId — re-auth after 60 min

9.1.4 The Asynchronous Task Pattern

All mutating operations (POST, PUT, DELETE) are asynchronous. The response returns immediately with a taskId. You must poll GET /dna/intent/api/v1/task/{taskId} until endTime is set, then check isError and failureReason. Think of it like a delivery tracking number — you check the portal periodically rather than standing at the loading dock.

flowchart TD A["POST / PUT / DELETE"] --> B["202 Accepted\n{taskId: 'abc-123'}"] B --> C["GET /task/abc-123"] C --> D{endTime set?} D -- No --> E["Wait interval (5s)"] E --> F{Max attempts?} F -- No --> C F -- Yes --> G["Raise TimeoutError"] D -- Yes --> H{isError true?} H -- Yes --> I["Raise RuntimeError\nLog failureReason"] H -- No --> J["Operation Successful"]

Key Points — Section 9.1

Post-Check — Section 9.1: Architecture and APIs

1. An automation script POSTs to /dna/intent/api/v1/image/distribution and receives a 202 response. What should the script do next?

2. Which Catalyst Center plane is used for ServiceNow ITSM integration?

3. What is the correct endpoint to obtain a Catalyst Center authentication token?

4. A task poll returns {"endTime": 1700000000, "isError": true, "failureReason": "Device unreachable"}. What does this mean?

5. Why does Catalyst Center hide the southbound interface from automation engineers?

9.2 Controller-Based Day 0 Provisioning

Pre-Check — Section 9.2: Day 0 Provisioning

1. What is the primary DHCP option used to redirect a PnP-capable device to Catalyst Center?

2. Which PnP device state means the device contacted Catalyst Center but no admin action has been taken?

3. What is the correct order of the five Day 0 PnP provisioning steps?

4. Which API endpoint triggers the actual provisioning push during PnP Day 0?

5. A Cisco IOS-XE device boots with no persistent configuration. What mechanism activates PnP discovery?

9.2.1 Plug and Play Zero-Touch Provisioning

PnP allows a technician to unbox a device, connect cables, and walk away. Catalyst Center handles the rest. Every Cisco IOS-XE device ships with a PnP IOS Agent in its bootstrap startup config. When the device boots with no persistent configuration, the agent activates and discovers the controller via one of three methods:

MethodMechanismBest For
DHCP Option 43Device sends Option 60 "ciscopnp"; DHCP server returns controller IP in Option 43Preferred method; most reliable
DNS ResolutionDevice resolves pnpserver.<domain> A record pointing to controller VIPWhen DHCP scopes cannot be modified
Cisco PnP ConnectDevice contacts devicehelper.cisco.com; org registers controller in Smart Account portalLarge-scale greenfield; no DHCP/DNS changes possible

PnP Discovery Sequence

1
Device boots with no configFactory PnP IOS Agent activates automatically
2
DHCP DISCOVER with Option 60 "ciscopnp"Device signals it is PnP-capable to the DHCP server
3
DHCP OFFER with Option 43Server returns: 5A1D;B2;K4;I<CC-IP>;J443
4
Device connects to Catalyst Center HTTPSPnP agent opens TLS session to controller VIP:443
5
Device appears as "Unclaimed" in Catalyst CenterAdmin or automation claims device → provisioning begins

9.2.2 PnP Device States

stateDiagram-v2 [*] --> Planned : Admin pre-registers\nby serial number [*] --> Unclaimed : Device boots and contacts\nCatalyst Center Planned --> Unclaimed : Device contacts CC;\nmatched to pre-staged record Unclaimed --> Onboarding : Admin or automation\nclaims the device Onboarding --> Provisioned : Image push + template\napplied successfully Onboarding --> Error : Image or config\npush fails Error --> Onboarding : Admin resolves error;\nre-triggers claim Provisioned --> [*] : Device enters\nmanaged inventory

9.2.3 The Five-Step Day 0 Provisioning Workflow

flowchart TD S1["Step 1: Create Day 0 Template\nPOST .../template-programmer/project/{id}/template\nPOST .../template-programmer/template/version (commit)"] S2["Step 2: Create Network Profile\nPOST /api/v1/siteprofile\nAssociate template with device type"] S3["Step 3: Assign Sites to Network Profile\nPOST /api/v1/siteprofile/{profile_id}/site/{site_id}"] S4["Step 4: Import Device into PnP Inventory\nPOST .../onboarding/pnp-device/import\nPre-stage by serial number"] S5["Step 5: Claim the Device\nPOST .../onboarding/pnp-device/site-claim\nSite + template + variables → triggers push"] EXEC["Catalyst Center Executes:\n1. Image deployment (if needed)\n2. Template rendering with variables\n3. Configuration push\n4. Device registered in managed inventory"] S1 --> S2 --> S3 --> S4 --> S5 --> EXEC

The claim step (Step 5) is the trigger. Its payload bundles site ID, device ID, template ID, and per-device variable values (hostname, management IP, gateway, etc.). Catalyst Center executes image upgrade (if needed), renders the template, pushes the config, and adds the device to managed inventory — all asynchronously via a taskId.

Pre-staging (Step 4 done before the device ships) is a best practice: register the serial number in the PnP inventory so the device transitions directly from Unclaimed to Onboarding when it makes first contact, with zero human intervention required on-site.

Key Points — Section 9.2

Post-Check — Section 9.2: Day 0 Provisioning

1. What additional action must be taken on a Day 0 template before it can be referenced in a site-claim payload?

2. A branch device contacts Catalyst Center and was pre-staged by serial number. What state will it be in when first contact is made?

3. A network team cannot modify DHCP scopes at a new branch site but controls the DNS server. Which PnP discovery method should they configure?

4. In the site-claim payload, what is the purpose of the configParameters array?

5. What network prerequisite is required on the upstream switch port connected to a new PnP device?

9.3 Network Design Automation

Pre-Check — Section 9.3: Network Design and SWIM

1. What are the four levels of the Catalyst Center site hierarchy in order?

2. What does the SWIM distribute-then-activate two-phase approach achieve?

3. Which endpoint retrieves a list of all sites in the Catalyst Center hierarchy?

9.3.1 Site Hierarchy: The Organizing Principle

The site hierarchy is the primary key linking devices to configuration policies, IP pools, templates, and network settings. Every provisioning workflow requires resolving the correct siteId UUID first. The hierarchy follows four levels:

Global
└── Area          (geographic region, country, or logical grouping)
    └── Building  (physical facility)
        └── Floor (specific floor within a building)

Example: Global / US / San-Jose / HQ-Building-1 / Floor-2

The catalystcentersdk makes hierarchy creation straightforward. Call catalyst.sites.create_site(type="area" | "building" | "floor", site={...}) for each level, using parentName to position the node correctly.

9.3.2 Network Settings and IP Pools

Each site can have per-site DNS, NTP, DHCP, and AAA settings configured via POST /dna/intent/api/v1/network, plus IP address sub-pools reserved via POST /dna/intent/api/v1/reserve-ip-subpool. These settings propagate to all devices provisioned at that site, ensuring branch-wide consistency without per-device manual configuration.

9.3.3 Software Image Management (SWIM)

SWIM manages the full software image lifecycle: import approved images, tag a "golden" image per device platform, distribute to device flash, and activate. All SWIM operations are asynchronous.

OperationEndpointDescription
ImportPOST .../image/importation/source/urlPull image from URL into CC repository
QueryGET .../image/importationList images; filter by platform
Tag GoldenPOST .../image/importation/goldenMark image as standard for a device family
DistributePOST .../image/distributionCopy image to device flash (no reload)
ActivatePOST .../image/activation/deviceReload device to boot from distributed image

The distribute → activate split is key: distribute during business hours (device keeps running the old image), then activate (reload) during the maintenance window. This cuts the risk window from hours to the reload time only.

Key Points — Section 9.3

Post-Check — Section 9.3: Network Design and SWIM

1. A SWIM distribution task returns a taskId. The task completes with isError: false. What must happen next before the device runs the new image?

2. Why is resolving the siteId UUID the first step in virtually every Catalyst Center automation workflow?

3. An automation script creates a site hierarchy using catalyst.sites.create_site(). When creating a Building node, which field specifies where it sits in the hierarchy?

9.4 Practical Catalyst Center API Automation

Pre-Check — Section 9.4: SDK and Automation

1. What are the two package names for the Cisco Catalyst Center Python SDK?

2. What environment variable configures the Catalyst Center base URL for the SDK?

9.4.1 The catalystcentersdk Python Library

The SDK (pip install catalystcentersdk or legacy pip install dnacentersdk) is the primary automation interface for ENAUTO 300-435. Both packages are functionally equivalent; the legacy name persists due to broad adoption.

FeatureBehavior
Token managementObtains token on instantiation; silently refreshes on expiry
Rate-limit handlingCatches HTTP 429, retries with automatic backoff
Dot-notation accessJSON fields accessible as Python object attributes
IDE autocompletionMethod namespaces mirror API domain names
Custom callerCovers API endpoints not yet wrapped in named methods
Env var supportReads credentials from CATALYST_CENTER_* env vars

9.4.2 SDK Instantiation and Version Compatibility

Always instantiate using environment variables to avoid hard-coded credentials. Pin the SDK version in requirements.txt to match the controller deployment version — mismatches cause silent method signature failures.

from catalystcentersdk import api

# Zero hard-coded credentials (reads CATALYST_CENTER_* env vars)
catalyst = api.CatalystCenterAPI()

# Explicit instantiation for multi-controller scripts
catalyst = api.CatalystCenterAPI(
    username="devnetuser",
    password="Cisco123!",
    base_url="https://sandboxdnac.cisco.com:443",
    version="3.1.3.0",
    verify=False   # use True in production
)

9.4.3 Core Automation Patterns

Every Catalyst Center automation workflow follows the same pattern:

  1. Resolve UUIDs (site, template, device) by querying existing resources
  2. Execute the mutating operation (claim, distribute, discover, etc.)
  3. Extract the returned taskId
  4. Poll until endTime is set
  5. Check isError — raise/log if true, continue if false

The custom_caller pattern handles endpoints not yet wrapped in named SDK methods:

catalyst.custom_caller.add_api(
    "get_global_credentials",
    lambda cred_type: catalyst.custom_caller.call_api(
        "GET",
        "/dna/intent/api/v1/global-credential",
        params={"credentialSubType": cred_type}
    ).response
)

netconf_creds = catalyst.custom_caller.get_global_credentials("NETCONF")

9.4.4 Production Error Handling Principles

PrincipleImplementation
Never assume tasks succeedAlways poll taskId; check isError and failureReason
Validate resources firstCheck site/template/device existence before claim operations
Use environment variablesNever hard-code credentials; use CATALYST_CENTER_* env vars or secrets manager
Pin SDK versionsVersion mismatches cause silent method signature failures
Log task IDsAlways log taskId values for debugging failed automation runs

Key Points — Section 9.4

Post-Check — Section 9.4: SDK and Automation

1. An automation script uses catalystcentersdk version 2.3.7.6 against a Catalyst Center 3.1.3.0 appliance. What is the most likely outcome?

2. A development team wants to avoid hard-coding Catalyst Center credentials in their CI/CD pipeline scripts. What is the recommended approach?

3. The SDK's custom_caller pattern is used when:

Your Progress

Answer Explanations