Skip to content

Upgrade Procedures

Those guides describes the changes required to upgrade your Catalyst Center Terraform module version. Each upgrade procedure covers the changes necessary to move between two consecutive releases (subsequent versions).

After completing all the changes below, your data model will be compatible with Catalyst Center Terraform module version 0.3.0. Make sure to:

  1. Handle the Terraform state changes for Provision Device resources (resource renamed)
  2. Update RF Profile schema for radio type C (6GHz) properties
  3. Update Discovery snmp_mode enum values
  4. Review new optional features available in this version

1. Provision Device Resource Rename (Breaking Change)

Section titled “1. Provision Device Resource Rename (Breaking Change)”

The Terraform resource catalystcenter_fabric_provision_device has been renamed to catalystcenter_provision_device. This is a breaking change that requires manual Terraform state management. When upgrading, Terraform will show errors like:

Error: no schema available for module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["DEVICE_NAME"] while reading state

Execute the following command to find all provision device resources in your state:

Terminal window
terraform state list | grep catalystcenter_fabric_provision_device

Example output:

module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["BR10"]
module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["EDGE01"]
module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["FIAB"]
module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["Transit-CP-1"]
Step 2: Run Terraform Plan to Get Device and Site IDs
Section titled “Step 2: Run Terraform Plan to Get Device and Site IDs”

Run terraform plan to see the planned creation of new resources. Note the network_device_id and site_id values for each device:

Terminal window
terraform plan

Example output:

# module.catalyst_center.catalystcenter_provision_device.provision_device["BR10"] will be created
+ resource "catalystcenter_provision_device" "provision_device" {
+ id = (known after apply)
+ network_device_id = "e7869917-cf34-44ed-998a-e72ef9866eeb"
+ reprovision = false
+ site_id = "d3fa2852-cbca-4387-93c9-f1e47b6f7340"
}

Save the site_id and network_device_id values for each device for the import step.

Remove all identified resources from the Terraform state:

Terminal window
terraform state rm 'module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["BR10"]'
terraform state rm 'module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["EDGE01"]'
terraform state rm 'module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["FIAB"]'
terraform state rm 'module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["Transit-CP-1"]'

Import each device using the new resource name with the site_id and network_device_id values from Step 2:

Terminal window
terraform import 'module.catalyst_center.catalystcenter_provision_device.provision_device["BR10"]' "<site_id>,<network_device_id>"

Example:

Terminal window
terraform import 'module.catalyst_center.catalystcenter_provision_device.provision_device["BR10"]' "d3fa2852-cbca-4387-93c9-f1e47b6f7340,e7869917-cf34-44ed-998a-e72ef9866eeb"
terraform import 'module.catalyst_center.catalystcenter_provision_device.provision_device["EDGE01"]' "d3fa2852-cbca-4387-93c9-f1e47b6f7340,7ef492ca-b008-479a-9de4-7e40438c7d10"
terraform import 'module.catalyst_center.catalystcenter_provision_device.provision_device["FIAB"]' "944b4c7e-e9ed-4ec3-8d1f-e8d065a8c4b3,28a9f0f0-2834-4f12-8409-26d34a7f5bbb"
terraform import 'module.catalyst_center.catalystcenter_provision_device.provision_device["Transit-CP-1"]' "944b4c7e-e9ed-4ec3-8d1f-e8d065a8c4b3,e9272b6f-6ef0-487c-92dd-bce5c21747d7"

The import format is: "<site_id>,<network_device_id>"

Run terraform plan to verify the state is correct. You should see only in-place updates for other resources (like adding parent_id to areas/buildings/floors), not recreations of provision devices.

Terminal window
terraform plan
terraform apply

2. RF Profile Radio Type C (6GHz) Schema Changes

Section titled “2. RF Profile Radio Type C (6GHz) Schema Changes”

The RF Profile schema for radio type C (6GHz) has been significantly enhanced with new properties. The enable_radio_type_c attribute is now required (previously optional).

catalyst_center:
wireless:
rf_profiles:
- name: CUSTOM_RF_PROFILE
enable_radio_type_a: true
enable_radio_type_b: true
enable_radio_type_c: false # Was optional
enable_custom: true
catalyst_center:
wireless:
rf_profiles:
- name: CUSTOM_RF_PROFILE
enable_radio_type_a: true
enable_radio_type_b: true
enable_radio_type_c: true # Now required
enable_custom: true
radio_type_c_properties:
parent_profile: CUSTOM
enable_standard_power_service: true
psc_enforcing_enabled: true
discovery_frames_6ghz: Broadcast Probe Response
broadcast_probe_response_interval: 20
min_dbs_width: 20
max_dbs_width: 320
preamble_puncture: true
multi_bssid_properties:
dot11ax_parameters:
ofdma_down_link: true
ofdma_up_link: true
mu_mimo_up_link: true
mu_mimo_down_link: true
dot11be_parameters:
ofdma_down_link: true
ofdma_up_link: true
mu_mimo_up_link: true
mu_mimo_down_link: true
ofdma_multi_ru: true
target_wake_time: true
twt_broadcast_support: true
fra_properties_c:
client_reset_count: 5
client_utilization_threshold: 50
PropertyTypeDescription
enable_standard_power_serviceboolEnable standard power service
psc_enforcing_enabledboolEnable PSC enforcing
discovery_frames_6ghzenumNone, Broadcast Probe Response, FILS Discovery
broadcast_probe_response_intervalint (5-25)Broadcast probe response interval
min_dbs_widthenum20, 40, 80, 160, 320
max_dbs_widthenum20, 40, 80, 160, 320
preamble_punctureboolEnable preamble puncture
multi_bssid_propertiesobjectMulti-BSSID configuration
fra_properties_cobjectFRA properties for 6GHz

The snmp_mode enum values in discovery configurations have been updated to use different casing.

catalyst_center:
inventory:
discovery:
- name: Discovery_1
snmp_mode: AUTHPRIV
catalyst_center:
inventory:
discovery:
- name: Discovery_1
snmp_mode: AuthPriv
0.2.00.3.0
AUTHPRIVAuthPriv
AUTHNOPRIVAuthNoPriv
NOAUTHNOPRIVNoAuthNoPriv

4. New Features in 0.3.0 (No Migration Required)

Section titled “4. New Features in 0.3.0 (No Migration Required)”

The following new features are available in version 0.3.0. No migration is required for existing configurations, but you may want to leverage these new capabilities:

catalyst_center:
fabric:
fabric_sites:
- name: Global/Site1
multicast:
virtual_networks:
- name: Campus
ip_pool_name: CampusVN-IPPool
multicast_rps:
- name: RP1
rp_location: FABRIC
is_default_v4_rp: true
fabric_rps:
- Border-Device-1.example.com
- Border-Device-2.example.com
catalyst_center:
fabric:
extranet_policies:
- name: Shared_Services
provider_virtual_network: Shared
subscriber_virtual_networks:
- Campus
- Guest
fabric_sites:
- Global/Site1
  • Access Point Provisioning: Provision access points with RF profiles
catalyst_center:
inventory:
devices:
- name: AP_FLOOR1
type: AccessPoint
rf_profile: BASIC_PROFILE_1
state: PROVISION
site: Global/Site1/Building1/Floor1
  • Embedded Wireless Controller Node: New fabric role
catalyst_center:
inventory:
devices:
- name: SWITCH_EWLC
fabric_roles:
- EDGE_NODE
- EMBEDDED_WIRELESS_CONTROLLER_NODE
enable_wireless: true
enable_rolling_ap_upgrade: true
ap_reboot_percentage: 15
catalyst_center:
inventory:
devices:
- name: EDGE01
port_assignments:
- interfaces_range: GigabitEthernet1/0/1-1/0/10
interface_description: User Access Ports
connected_device_type: USER_DEVICE
data_vlan_name: Campus_Data
  • Group-Based Policy Enforcement: For EXTENDED_NODE pool types
catalyst_center:
fabric:
fabric_sites:
- name: Global/Site1
anycast_gateways:
- ip_pool_name: ExtendedNode-IPPool
pool_type: EXTENDED_NODE
group_based_policy_enforcement_enabled: true
  • TCP MSS Adjustment: Configure TCP MSS for anycast gateways
catalyst_center:
fabric:
fabric_sites:
- name: Global/Site1
anycast_gateways:
- ip_pool_name: Campus-IPPool
tcp_mss_adjustment: 1360
  • Reconfigure Flag: Apply pending fabric configuration events
catalyst_center:
fabric:
fabric_sites:
- name: Global/Site1
reconfigure: true
catalyst_center:
system_settings:
authentication_and_policy_servers:
ise:
ip_address: 10.1.1.100
shared_secret: SecretKey123
username: admin
password: AdminPass
fqdn: ise.example.com
retries: 3
timeout: 5
protocols:
radius:
authentication_port: 1812
accounting_port: 1813
  • use_bulk_api: Enable bulk API operations for faster execution
  • bulk_site_provisioning: Site path for bulk device provisioning. When set with use_bulk_api=true, provisions all devices from this site and all child sites in a single bulk operation. Example: ‘Global/Poland’ will provision all devices under Poland hierarchy.

After completing all the above changes, your data model will be compatible with Catalyst Center Terraform module version 0.2.0. Make sure to:

  1. Update all deploy_state references to redeploy_template with appropriate values
  2. Replace name with ip_pool_name in Anycast Gateway configurations
  3. Handle the Terraform state changes for network profile assignments
  4. Handle the Terraform state changes for Fabric L3 Handoff IP Transit resources
  5. Update LAN Automation attribute names and IP pool structure
  6. Change hostname to fqdn_name in device inventory
  7. Update discovery configuration attribute names

In version 0.1.1, template deployment was controlled by the deploy_state attribute with two options:

  • DEPLOY - never redeploy template
  • REDEPLOY - always redeploy template regardless of content changes

In version 0.2.0, this has been replaced with redeploy_template offering more granular control:

  • NEVER - never redeploy template
  • ALWAYS - always redeploy template regardless of content changes
  • ON_CHANGE - redeploy template only when there is a content template change
inventory:
devices:
- name: DEVICE_1
dayn_templates:
regular:
- name: TEMP1
deploy_state: DEPLOY
inventory:
devices:
- name: DEVICE_1
dayn_templates:
regular:
- name: TEMP1
redeploy_template: NEVER

The redeploy_template parameter can be configured at multiple levels with the following precedence (highest to lowest):

  1. Device-specific template level:
catalyst_center:
inventory:
devices:
- name: DEVICE_1
dayn_templates:
regular:
- name: TEMP1
redeploy_template: NEVER
  1. Device-wide template level:
catalyst_center:
inventory:
devices:
- name: DEVICE_1
dayn_templates:
redeploy_template: NEVER
regular:
- name: TEMP1
  1. Global template level:
catalyst_center:
templates:
projects:
- name: Project_DayN
description: Project_DayN
dayn_templates:
- name: TEMPLATE_1
redeploy_template: ALWAYS
  1. Default level:
defaults:
catalyst_center:
templates:
redeploy_template: NEVER
redeploy_templateTemplate Content ChangeTemplate Redeployed
ALWAYSYesYes
ALWAYSNoYes
NEVERYesNo
NEVERNoNo
ON_CHANGEYesYes
ON_CHANGENoNo

2. Anycast Gateway Attribute Name Replacement

Section titled “2. Anycast Gateway Attribute Name Replacement”

The name attribute in Anycast Gateway configuration has been replaced with ip_pool_name to better reflect its purpose as a reference to IP pool reservations.

catalyst_center:
fabric:
fabric_sites:
- name: Global/AREA
anycast_gateways:
- name: IPPool_1
catalyst_center:
fabric:
fabric_sites:
- name: Global/AREA
anycast_gateways:
- ip_pool_name: IPPool_1

3. Network Profile Assignment Resource Change

Section titled “3. Network Profile Assignment Resource Change”

The Terraform resource catalystcenter_associate_site_to_network_profile has been replaced with catalystcenter_network_profile_for_site_assignments. This requires manual Terraform state management.

Execute the following command to find all network profile association resources:

Terminal window
terraform state list | grep catalystcenter_associate_site_to_network_profile

Example output:

module.catalyst_center.catalystcenter_associate_site_to_network_profile.site_to_network_profile["Global/Poland/Krakow#_#Krk_switchingProfile"]
module.catalyst_center.catalystcenter_associate_site_to_network_profile.site_to_wireless_network_profile["Global/Poland/Krakow#_#C9800_KRK_Profile"]

Remove the identified resources from the Terraform state:

Terminal window
terraform state rm 'module.catalyst_center.catalystcenter_associate_site_to_network_profile.site_to_network_profile["Global/Poland/Krakow#_#Krk_switchingProfile"]'
terraform state rm 'module.catalyst_center.catalystcenter_associate_site_to_network_profile.site_to_wireless_network_profile["Global/Poland/Krakow#_#C9800_KRK_Profile"]'

Execute terraform apply to create the new network profile assignment resources:

Terminal window
terraform apply

Expected output:

# module.catalyst_center.catalystcenter_network_profile_for_sites_assignments.site_to_network_profile["Krk_switchingProfile"] will be created
+ resource "catalystcenter_network_profile_for_sites_assignments" "site_to_network_profile" {
+ id = (known after apply)
+ items = [
+ {
+ id = "a8fbb587-887c-42be-aaad-395abd685ebf"
},
]
+ network_profile_id = "076013fa-322f-48cb-b278-8bde227ebed7"
}
# module.catalyst_center.catalystcenter_network_profile_for_sites_assignments.site_to_wireless_network_profile["C9800_KRK_Profile"] will be created
+ resource "catalystcenter_network_profile_for_sites_assignments" "site_to_wireless_network_profile" {
+ id = (known after apply)
+ items = [
+ {
+ id = "a8fbb587-887c-42be-aaad-395abd685ebf"
},
]
+ network_profile_id = "5304325b-0aac-4be9-90ea-90c5654033f7"
}

4. Fabric L3 Handoff IP Transit Resource Change

Section titled “4. Fabric L3 Handoff IP Transit Resource Change”

The Terraform resource catalystcenter_fabric_l3_handoff_ip_transit has been replaced with catalystcenter_fabric_l3_handoff_ip_transits (note the plural form). This change consolidates multiple IP transit handoffs under a single resource per network device, requiring manual Terraform state management.

Execute the following command to find all L3 handoff IP transit resources:

Terminal window
terraform state list | grep catalystcenter_fabric_l3_handoff_ip_transit

Example output:

module.catalyst_center.catalystcenter_fabric_l3_handoff_ip_transit.l3_handoff_ip_transit["Campus/GigabitEthernet1/0/3/BGP65002/BR10.cisco.eu"]

Run command to get the network_device_id and fabric_id values needed for the import step:

Terminal window
terraform state show 'module.catalyst_center.catalystcenter_fabric_l3_handoff_ip_transit.l3_handoff_ip_transit["Campus/GigabitEthernet1/0/3/BGP65002/BR10.cisco.eu"]'

Example output:

# module.catalyst_center.catalystcenter_fabric_l3_handoff_ip_transit.l3_handoff_ip_transit["Campus/GigabitEthernet1/0/3/BGP65002/BR10.cisco.eu"]:
resource "catalystcenter_fabric_l3_handoff_ip_transit" "l3_handoff_ip_transit" {
fabric_id = "aca2f40c-40a2-4bc2-9690-f59d758fd600"
id = "fbe1ad74-7df9-46a2-8746-8875f9cbbed4"
interface_name = "GigabitEthernet1/0/3"
local_ip_address = "172.16.100.1/24"
network_device_id = "8fbd4920-25d2-4b73-be25-2421c61e9605"
remote_ip_address = "172.16.100.2/24"
transit_network_id = "fc09acc4-dd6d-48f0-a446-6afe7d0867f4"
virtual_network_name = "Campus"
vlan_id = 100
}

Save the network_device_id and fabric_id values for the import step:

  • network_device_id: 8fbd4920-25d2-4b73-be25-2421c61e9605
  • fabric_id: aca2f40c-40a2-4bc2-9690-f59d758fd600

Remove the identified resources from the Terraform state:

Terminal window
terraform state rm 'module.catalyst_center.catalystcenter_fabric_l3_handoff_ip_transit.l3_handoff_ip_transit["Campus/GigabitEthernet1/0/3/BGP65002/BR10.cisco.eu"]'

Import the new consolidated resource using the network device ID and fabric ID copied from Step 2:

Terminal window
terraform import 'module.catalyst_center.catalystcenter_fabric_l3_handoff_ip_transits.l3_handoff_ip_transits["BR10.cisco.eu"]' "8fbd4920-25d2-4b73-be25-2421c61e9605,aca2f40c-40a2-4bc2-9690-f59d758fd600"

The import format is: "<network_device_id>,<fabric_id>"

Several attributes in the LAN Automation data model have been updated for consistency and clarity.

0.1.10.2.0
peer_device_management_ip_addresssecondary_device_management_ip_address
redistribute_isis_to_bgpadvertise_lan_automation_routes_into_bgp

(0.2.0) Data Model:

catalyst_center:
lan_automation:
- name: Automate_Edge_Switches
secondary_device_management_ip_address: 198.18.130.11
advertise_lan_automation_routes_into_bgp: true

The ip_pools structure has been modified to use name and role instead of ip_pool_name and ip_pool_role.

catalyst_center:
lan_automation:
- name: Automate_Edge_Switches
ip_pools:
- ip_pool_name: MainPool
ip_pool_role: MAIN_POOL
catalyst_center:
lan_automation:
- name: Automate_Edge_Switches
ip_pools:
- name: MainPool
role: PRINCIPAL_IP_ADDRESS_POOL

Additionally the ip_pool_role values have been updated as follows:

0.1.10.2.0
MAIN_POOLPRINCIPAL_IP_ADDRESS_POOL
PHYSICAL_LINK_POOLLINK_OVERLAPPING_IP_POOL

The hostname attribute in device inventory has been replaced with fqdn_name to support fully qualified domain names.

catalyst_center:
inventory:
devices:
- name: DEVICE_1
hostname: DEVICE_1
catalyst_center:
inventory:
devices:
- name: DEVICE_1
fqdn_name: DEVICE_1.example.com

The attribute preferred_ip_method has been renamed to preferred_mgmt_ip_method in discovery configurations:

catalyst_center:
inventory:
discovery:
- name: Discovery_1
preferred_ip_method: UseLoopBack
catalyst_center:
inventory:
discovery:
- name: Discovery_1
preferred_mgmt_ip_method: UseLoopBack

After completing all the above changes, your data model will be compatible with Catalyst Center Terraform module version 0.1.1. Make sure to:

  1. Update authentication template number_of_hosts enum value from ‘Limited’ to ‘Single’
  2. Add L3 Virtual Networks structure at fabric level if using global L3 VNs
  3. Update device inventory managed AP locations structure
  4. Add new discovery configuration attributes if using advanced SNMP settings
  5. Remove deprecated RF profile attributes
  6. Update anycast gateway configurations with new optional attributes
  7. Remove deprecated border device attributes
  8. Handle the Terraform state changes for fabric provision device resource consolidation

1. Authentication Template Enum Value Update

Section titled “1. Authentication Template Enum Value Update”

The number_of_hosts attribute enum value has been updated for consistency.

catalyst_center:
authentication_templates:
- name: AUTH_TEMPLATE_1
number_of_hosts: Limited
catalyst_center:
authentication_templates:
- name: AUTH_TEMPLATE_1
number_of_hosts: Single

2. Fabric L3 Virtual Networks Structure Enhancement

Section titled “2. Fabric L3 Virtual Networks Structure Enhancement”

L3 Virtual Networks can now be defined at the global fabric level in addition to fabric site level, enabling better organization and reuse.

catalyst_center:
fabric:
l3_virtual_networks:
- name: GLOBAL_L3_VN_1
- name: GLOBAL_L3_VN_2
fabric_sites:
- name: Global/AREA
l3_virtual_networks:
- GLOBAL_L3_VN_1
- GLOBAL_L3_VN_2

3. Device Inventory Managed AP Locations Enhancement

Section titled “3. Device Inventory Managed AP Locations Enhancement”

The managed_ap_locations attribute has been split into primary_managed_ap_locations and secondary_managed_ap_locations for better AP management control.

catalyst_center:
inventory:
devices:
- name: WLC_DEVICE_1
managed_ap_locations:
- Global/Area1/Building1/Floor1
- Global/Area1/Building1/Floor2
catalyst_center:
inventory:
devices:
- name: WLC_DEVICE_1
primary_managed_ap_locations:
- Global/Area1/Building1/Floor1
secondary_managed_ap_locations:
- Global/Area1/Building1/Floor2

New SNMP-related attributes have been added to discovery configurations for enhanced device discovery capabilities.

catalyst_center:
inventory:
discovery:
- name: DISCOVERY_1
cdp_level: 16
enable_password_list:
- enable_password_1
ip_filter_list:
- 192.168.1.0/24
netconf_port: "830"
retry: 3
user_name_list:
- admin
snmp_version: v3
snmp_user_name: snmp_user
snmp_rw_community_desc: "RW Community"
snmp_ro_community_desc: "RO Community"
snmp_ro_community: public
snmp_rw_community: private
snmp_priv_protocol: AES128
snmp_priv_passphrase: priv_pass
snmp_mode: AUTHPRIV
snmp_auth_protocol: SHA
snmp_auth_passphrase: auth_pass

Deprecated RF profile attributes channel_width and enable_brown_field have been removed from the schema.

Remove these attributes from your RF profile configurations:

  • channel_width
  • enable_brown_field

New optional attributes have been added to anycast gateway configurations for enhanced functionality.

catalyst_center:
fabric:
fabric_sites:
- name: Global/AREA
anycast_gateways:
- name: ANYCAST_GW_1
intra_subnet_routing_enabled: true
multiple_ip_to_mac_addresses: false
supplicant_based_extended_node_onboarding: true

The deprecated external_domain_routing_protocol_name attribute has been removed from border device configurations.

Remove the external_domain_routing_protocol_name attribute from your border device configurations.

8. Fabric Provision Device Resource Consolidation

Section titled “8. Fabric Provision Device Resource Consolidation”

Multiple device-specific provision resources have been consolidated into a single catalystcenter_fabric_provision_device resource. The following resources are now unified:

  • catalystcenter_fabric_provision_device.border_device
  • catalystcenter_fabric_provision_device.edge_device
  • catalystcenter_fabric_provision_device.non_fabric_device

All devices now use the single catalystcenter_fabric_provision_device.provision_device resource.

Execute the following command to find all fabric provision device resources:

Terminal window
terraform state list | grep catalystcenter_fabric_provision_device

Example output:

module.catalyst_center.catalystcenter_fabric_provision_device.border_device["BR10.cisco.eu"]
module.catalyst_center.catalystcenter_fabric_provision_device.edge_device["EDGE01.cisco.eu"]
module.catalyst_center.catalystcenter_fabric_provision_device.non_fabric_device["PNP_DEVICE.cisco.eu"]

Remove the identified resources from the Terraform state:

Terminal window
terraform state rm 'module.catalyst_center.catalystcenter_fabric_provision_device.border_device["BR10.cisco.eu"]'
terraform state rm 'module.catalyst_center.catalystcenter_fabric_provision_device.edge_device["EDGE01.cisco.eu"]'
terraform state rm 'module.catalyst_center.catalystcenter_fabric_provision_device.non_fabric_device["PNP_DEVICE.cisco.eu"]'

Import the new consolidated resources using the site ID and network device ID:

Terminal window
terraform import 'module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["BR10.cisco.eu"]' "662ed0df-861f-4753-9008-df85fe9a584e,e7869917-cf34-44ed-998a-e72ef9866eeb"
terraform import 'module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["EDGE01.cisco.eu"]' "662ed0df-861f-4753-9008-df85fe9a584e,7ef492ca-b008-479a-9de4-7e40438c7d10"
terraform import 'module.catalyst_center.catalystcenter_fabric_provision_device.provision_device["PNP_DEVICE.cisco.eu"]' "c2c12299-f7cc-4058-9d99-ffe57de50062,ce8d33e4-6d7b-4f2a-8ed6-0d95603305be"

The import format is: "<site_id>,<network_device_id>"