diff --git a/CHANGELOG.md b/CHANGELOG.md index bd08926f..be44cb7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ - Add `load_balancing_flow_src_dst_mac` and `load_balancing_flow_src_dst_ip` attributes to `iosxr_l2vpn` resource and data source - Add `iosxr_l2vpn_pw_class` resource and data source - Add `igp_sync_delay` and `label_local_allocate` attributes to `iosxr_mpls_ldp` resource and data source +- Add `iosxr_router_hsrp_interface` resource and data source +- Add `iosxr_router_hsrp_interface_address_family_ipv4` resource and data source + ## 0.2.3 diff --git a/docs/data-sources/router_hsrp_interface.md b/docs/data-sources/router_hsrp_interface.md new file mode 100644 index 00000000..9224d71a --- /dev/null +++ b/docs/data-sources/router_hsrp_interface.md @@ -0,0 +1,41 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "iosxr_router_hsrp_interface Data Source - terraform-provider-iosxr" +subcategory: "HSRP" +description: |- + This data source can read the Router HSRP Interface configuration. +--- + +# iosxr_router_hsrp_interface (Data Source) + +This data source can read the Router HSRP Interface configuration. + +## Example Usage + +```terraform +data "iosxr_router_hsrp_interface" "example" { + interface_name = "GigabitEthernet0/0/0/1" +} +``` + + +## Schema + +### Required + +- `interface_name` (String) HSRP interface configuration subcommands + +### Optional + +- `device` (String) A device name from the provider configuration. + +### Read-Only + +- `hsrp_bfd_minimum_interval` (Number) Hello interval +- `hsrp_bfd_multiplier` (Number) Detect multiplier +- `hsrp_delay_minimum` (Number) Set minimum delay on every interface up event +- `hsrp_delay_reload` (Number) Set reload delay for first interface up event +- `hsrp_mac_refresh` (Number) HSRP MGO subordinate MAC refresh rate +- `hsrp_redirects_disable` (Boolean) Disable HSRP filtered ICMP redirects +- `hsrp_use_bia` (Boolean) Use burned-in address +- `id` (String) The path of the retrieved object. diff --git a/docs/data-sources/router_hsrp_interface_address_family_ipv4.md b/docs/data-sources/router_hsrp_interface_address_family_ipv4.md new file mode 100644 index 00000000..bd46cb04 --- /dev/null +++ b/docs/data-sources/router_hsrp_interface_address_family_ipv4.md @@ -0,0 +1,132 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "iosxr_router_hsrp_interface_address_family_ipv4 Data Source - terraform-provider-iosxr" +subcategory: "HSRP" +description: |- + This data source can read the Router HSRP Interface Address Family IPv4 configuration. +--- + +# iosxr_router_hsrp_interface_address_family_ipv4 (Data Source) + +This data source can read the Router HSRP Interface Address Family IPv4 configuration. + +## Example Usage + +```terraform +data "iosxr_router_hsrp_interface_address_family_ipv4" "example" { + interface_name = "GigabitEthernet0/0/0/1" +} +``` + + +## Schema + +### Required + +- `interface_name` (String) HSRP interface configuration subcommands + +### Optional + +- `device` (String) A device name from the provider configuration. + +### Read-Only + +- `group_number_version_1s` (Attributes List) group number version 1 (see [below for nested schema](#nestedatt--group_number_version_1s)) +- `group_number_version_2s` (Attributes List) group number version 2 (see [below for nested schema](#nestedatt--group_number_version_2s)) +- `id` (String) The path of the retrieved object. + + +### Nested Schema for `group_number_version_1s` + +Read-Only: + +- `address_ipv4_address` (String) Hot standby IP address +- `address_learn` (Boolean) Learn virtual IP address from peer +- `bfd_fast_detect_peer_interface` (String) Select an interface over which to run BFD +- `bfd_fast_detect_peer_ipv4` (String) BFD peer interface IPv4 address +- `group_number_version_1_id` (Number) group number version 1 +- `mac_address` (String) Use specified mac address for the virtual router +- `name` (String) MGO session name +- `preempt_delay` (Number) Wait before preempting +- `priority` (Number) Priority level +- `secondary_ipv4_addresses` (Attributes List) Set secondary hot standby IP address (see [below for nested schema](#nestedatt--group_number_version_1s--secondary_ipv4_addresses)) +- `timers_hold_time` (Number) Hold time in seconds +- `timers_hold_time2` (Number) Hold time in seconds +- `timers_msec` (Number) Specify hellotime in milliseconds +- `timers_msec2` (Number) Specify hold time in milliseconds +- `track_interfaces` (Attributes List) Configure tracking (see [below for nested schema](#nestedatt--group_number_version_1s--track_interfaces)) +- `track_objects` (Attributes List) Object tracking (see [below for nested schema](#nestedatt--group_number_version_1s--track_objects)) + + +### Nested Schema for `group_number_version_1s.secondary_ipv4_addresses` + +Read-Only: + +- `address` (String) Set secondary hot standby IP address + + + +### Nested Schema for `group_number_version_1s.track_interfaces` + +Read-Only: + +- `priority_decrement` (Number) Priority decrement +- `track_name` (String) Configure tracking + + + +### Nested Schema for `group_number_version_1s.track_objects` + +Read-Only: + +- `object_name` (String) Object tracking +- `priority_decrement` (Number) Priority decrement + + + + +### Nested Schema for `group_number_version_2s` + +Read-Only: + +- `address_ipv4_address` (String) Hot standby IP address +- `address_learn` (Boolean) Learn virtual IP address from peer +- `bfd_fast_detect_peer_interface` (String) Select an interface over which to run BFD +- `bfd_fast_detect_peer_ipv4` (String) BFD peer interface IPv4 address +- `group_number_version_2_id` (Number) group number version 2 +- `mac_address` (String) Use specified mac address for the virtual router +- `name` (String) MGO session name +- `preempt_delay` (Number) Wait before preempting +- `priority` (Number) Priority level +- `secondary_ipv4_addresses` (Attributes List) Set secondary hot standby IP address (see [below for nested schema](#nestedatt--group_number_version_2s--secondary_ipv4_addresses)) +- `timers_hold_time` (Number) Hold time in seconds +- `timers_hold_time2` (Number) Hold time in seconds +- `timers_msec` (Number) Specify hellotime in milliseconds +- `timers_msec2` (Number) Specify hold time in milliseconds +- `track_interfaces` (Attributes List) Configure tracking (see [below for nested schema](#nestedatt--group_number_version_2s--track_interfaces)) +- `track_objects` (Attributes List) Object tracking (see [below for nested schema](#nestedatt--group_number_version_2s--track_objects)) + + +### Nested Schema for `group_number_version_2s.secondary_ipv4_addresses` + +Read-Only: + +- `address` (String) Set secondary hot standby IP address + + + +### Nested Schema for `group_number_version_2s.track_interfaces` + +Read-Only: + +- `priority_decrement` (Number) Priority decrement +- `track_name` (String) Configure tracking + + + +### Nested Schema for `group_number_version_2s.track_objects` + +Read-Only: + +- `object_name` (String) Object tracking +- `priority_decrement` (Number) Priority decrement diff --git a/docs/guides/changelog.md b/docs/guides/changelog.md index 8183271f..cfbd060f 100644 --- a/docs/guides/changelog.md +++ b/docs/guides/changelog.md @@ -17,6 +17,9 @@ description: |- - Add `load_balancing_flow_src_dst_mac` and `load_balancing_flow_src_dst_ip` attributes to `iosxr_l2vpn` resource and data source - Add `iosxr_l2vpn_pw_class` resource and data source - Add `igp_sync_delay` and `label_local_allocate` attributes to `iosxr_mpls_ldp` resource and data source +- Add `iosxr_router_hsrp_interface` resource and data source +- Add `iosxr_router_hsrp_interface_address_family_ipv4` resource and data source + ## 0.2.3 diff --git a/docs/resources/router_hsrp_interface.md b/docs/resources/router_hsrp_interface.md new file mode 100644 index 00000000..24c4c027 --- /dev/null +++ b/docs/resources/router_hsrp_interface.md @@ -0,0 +1,63 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "iosxr_router_hsrp_interface Resource - terraform-provider-iosxr" +subcategory: "HSRP" +description: |- + This resource can manage the Router HSRP Interface configuration. +--- + +# iosxr_router_hsrp_interface (Resource) + +This resource can manage the Router HSRP Interface configuration. + +## Example Usage + +```terraform +resource "iosxr_router_hsrp_interface" "example" { + interface_name = "GigabitEthernet0/0/0/1" + hsrp_use_bia = true + hsrp_redirects_disable = true + hsrp_delay_minimum = 500 + hsrp_delay_reload = 700 + hsrp_bfd_minimum_interval = 20000 + hsrp_bfd_multiplier = 40 + hsrp_mac_refresh = 5000 +} +``` + + +## Schema + +### Required + +- `interface_name` (String) HSRP interface configuration subcommands + +### Optional + +- `delete_mode` (String) Configure behavior when deleting/destroying the resource. Either delete the entire object (YANG container) being managed, or only delete the individual resource attributes configured explicitly and leave everything else as-is. Default value is `all`. + - Choices: `all`, `attributes` +- `device` (String) A device name from the provider configuration. +- `hsrp_bfd_minimum_interval` (Number) Hello interval + - Range: `3`-`30000` +- `hsrp_bfd_multiplier` (Number) Detect multiplier + - Range: `2`-`50` +- `hsrp_delay_minimum` (Number) Set minimum delay on every interface up event + - Range: `0`-`10000` +- `hsrp_delay_reload` (Number) Set reload delay for first interface up event + - Range: `0`-`10000` +- `hsrp_mac_refresh` (Number) HSRP MGO subordinate MAC refresh rate + - Range: `0`-`10000` +- `hsrp_redirects_disable` (Boolean) Disable HSRP filtered ICMP redirects +- `hsrp_use_bia` (Boolean) Use burned-in address + +### Read-Only + +- `id` (String) The path of the object. + +## Import + +Import is supported using the following syntax: + +```shell +terraform import iosxr_router_hsrp_interface.example "Cisco-IOS-XR-um-router-hsrp-cfg:/router/hsrp/interfaces/interface[interface-name=GigabitEthernet0/0/0/1]" +``` diff --git a/docs/resources/router_hsrp_interface_address_family_ipv4.md b/docs/resources/router_hsrp_interface_address_family_ipv4.md new file mode 100644 index 00000000..68943446 --- /dev/null +++ b/docs/resources/router_hsrp_interface_address_family_ipv4.md @@ -0,0 +1,211 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "iosxr_router_hsrp_interface_address_family_ipv4 Resource - terraform-provider-iosxr" +subcategory: "HSRP" +description: |- + This resource can manage the Router HSRP Interface Address Family IPv4 configuration. +--- + +# iosxr_router_hsrp_interface_address_family_ipv4 (Resource) + +This resource can manage the Router HSRP Interface Address Family IPv4 configuration. + +## Example Usage + +```terraform +resource "iosxr_router_hsrp_interface_address_family_ipv4" "example" { + interface_name = "GigabitEthernet0/0/0/1" + group_number_version_1s = [ + { + group_number_version_1_id = 123 + address_ipv4_address = "22.22.1.1" + address_learn = false + priority = 124 + name = "NAME11" + preempt_delay = 3200 + bfd_fast_detect_peer_ipv4 = "44.44.4.4" + bfd_fast_detect_peer_interface = "GigabitEthernet0/0/0/7" + track_interfaces = [ + { + track_name = "GigabitEthernet0/0/0/1" + priority_decrement = 166 + } + ] + track_objects = [ + { + object_name = "OBJECT1" + priority_decrement = 177 + } + ] + } + ] + group_number_version_2s = [ + { + group_number_version_2_id = 2345 + address_ipv4_address = "33.33.33.3" + address_learn = false + priority = 133 + name = "NAME22" + preempt_delay = 3100 + bfd_fast_detect_peer_ipv4 = "45.45.45.4" + track_interfaces = [ + { + track_name = "GigabitEthernet0/0/0/7" + priority_decrement = 66 + } + ] + track_objects = [ + { + object_name = "OBJECT2" + priority_decrement = 77 + } + ] + } + ] +} +``` + + +## Schema + +### Required + +- `interface_name` (String) HSRP interface configuration subcommands + +### Optional + +- `device` (String) A device name from the provider configuration. +- `group_number_version_1s` (Attributes List) group number version 1 (see [below for nested schema](#nestedatt--group_number_version_1s)) +- `group_number_version_2s` (Attributes List) group number version 2 (see [below for nested schema](#nestedatt--group_number_version_2s)) + +### Read-Only + +- `id` (String) The path of the object. + + +### Nested Schema for `group_number_version_1s` + +Required: + +- `group_number_version_1_id` (Number) group number version 1 + - Range: `0`-`255` + +Optional: + +- `address_ipv4_address` (String) Hot standby IP address +- `address_learn` (Boolean) Learn virtual IP address from peer +- `bfd_fast_detect_peer_interface` (String) Select an interface over which to run BFD +- `bfd_fast_detect_peer_ipv4` (String) BFD peer interface IPv4 address +- `mac_address` (String) Use specified mac address for the virtual router +- `name` (String) MGO session name +- `preempt_delay` (Number) Wait before preempting + - Range: `0`-`3600` +- `priority` (Number) Priority level + - Range: `0`-`255` +- `secondary_ipv4_addresses` (Attributes List) Set secondary hot standby IP address (see [below for nested schema](#nestedatt--group_number_version_1s--secondary_ipv4_addresses)) +- `timers_hold_time` (Number) Hold time in seconds + - Range: `1`-`255` +- `timers_hold_time2` (Number) Hold time in seconds + - Range: `1`-`255` +- `timers_msec` (Number) Specify hellotime in milliseconds + - Range: `100`-`3000` +- `timers_msec2` (Number) Specify hold time in milliseconds + - Range: `100`-`3000` +- `track_interfaces` (Attributes List) Configure tracking (see [below for nested schema](#nestedatt--group_number_version_1s--track_interfaces)) +- `track_objects` (Attributes List) Object tracking (see [below for nested schema](#nestedatt--group_number_version_1s--track_objects)) + + +### Nested Schema for `group_number_version_1s.secondary_ipv4_addresses` + +Required: + +- `address` (String) Set secondary hot standby IP address + + + +### Nested Schema for `group_number_version_1s.track_interfaces` + +Required: + +- `priority_decrement` (Number) Priority decrement + - Range: `1`-`255` +- `track_name` (String) Configure tracking + + + +### Nested Schema for `group_number_version_1s.track_objects` + +Required: + +- `object_name` (String) Object tracking +- `priority_decrement` (Number) Priority decrement + - Range: `1`-`255` + + + + +### Nested Schema for `group_number_version_2s` + +Required: + +- `group_number_version_2_id` (Number) group number version 2 + - Range: `0`-`4095` + +Optional: + +- `address_ipv4_address` (String) Hot standby IP address +- `address_learn` (Boolean) Learn virtual IP address from peer +- `bfd_fast_detect_peer_interface` (String) Select an interface over which to run BFD +- `bfd_fast_detect_peer_ipv4` (String) BFD peer interface IPv4 address +- `mac_address` (String) Use specified mac address for the virtual router +- `name` (String) MGO session name +- `preempt_delay` (Number) Wait before preempting + - Range: `0`-`3600` +- `priority` (Number) Priority level + - Range: `0`-`255` +- `secondary_ipv4_addresses` (Attributes List) Set secondary hot standby IP address (see [below for nested schema](#nestedatt--group_number_version_2s--secondary_ipv4_addresses)) +- `timers_hold_time` (Number) Hold time in seconds + - Range: `1`-`255` +- `timers_hold_time2` (Number) Hold time in seconds + - Range: `1`-`255` +- `timers_msec` (Number) Specify hellotime in milliseconds + - Range: `100`-`3000` +- `timers_msec2` (Number) Specify hold time in milliseconds + - Range: `100`-`3000` +- `track_interfaces` (Attributes List) Configure tracking (see [below for nested schema](#nestedatt--group_number_version_2s--track_interfaces)) +- `track_objects` (Attributes List) Object tracking (see [below for nested schema](#nestedatt--group_number_version_2s--track_objects)) + + +### Nested Schema for `group_number_version_2s.secondary_ipv4_addresses` + +Required: + +- `address` (String) Set secondary hot standby IP address + + + +### Nested Schema for `group_number_version_2s.track_interfaces` + +Required: + +- `priority_decrement` (Number) Priority decrement + - Range: `1`-`255` +- `track_name` (String) Configure tracking + + + +### Nested Schema for `group_number_version_2s.track_objects` + +Required: + +- `object_name` (String) Object tracking +- `priority_decrement` (Number) Priority decrement + - Range: `1`-`255` + +## Import + +Import is supported using the following syntax: + +```shell +terraform import iosxr_router_hsrp_interface_address_family_ipv4.example "Cisco-IOS-XR-um-router-hsrp-cfg:router/hsrp/interfaces/interface[interface-name=GigabitEthernet0/0/0/1]/address-family/ipv4/hsrp" +``` diff --git a/examples/data-sources/iosxr_router_hsrp_interface/data-source.tf b/examples/data-sources/iosxr_router_hsrp_interface/data-source.tf new file mode 100644 index 00000000..79665816 --- /dev/null +++ b/examples/data-sources/iosxr_router_hsrp_interface/data-source.tf @@ -0,0 +1,3 @@ +data "iosxr_router_hsrp_interface" "example" { + interface_name = "GigabitEthernet0/0/0/1" +} diff --git a/examples/data-sources/iosxr_router_hsrp_interface_address_family_ipv4/data-source.tf b/examples/data-sources/iosxr_router_hsrp_interface_address_family_ipv4/data-source.tf new file mode 100644 index 00000000..32421468 --- /dev/null +++ b/examples/data-sources/iosxr_router_hsrp_interface_address_family_ipv4/data-source.tf @@ -0,0 +1,3 @@ +data "iosxr_router_hsrp_interface_address_family_ipv4" "example" { + interface_name = "GigabitEthernet0/0/0/1" +} diff --git a/examples/resources/iosxr_router_hsrp_interface/import.sh b/examples/resources/iosxr_router_hsrp_interface/import.sh new file mode 100644 index 00000000..6b4f9755 --- /dev/null +++ b/examples/resources/iosxr_router_hsrp_interface/import.sh @@ -0,0 +1 @@ +terraform import iosxr_router_hsrp_interface.example "Cisco-IOS-XR-um-router-hsrp-cfg:/router/hsrp/interfaces/interface[interface-name=GigabitEthernet0/0/0/1]" diff --git a/examples/resources/iosxr_router_hsrp_interface/resource.tf b/examples/resources/iosxr_router_hsrp_interface/resource.tf new file mode 100644 index 00000000..78240111 --- /dev/null +++ b/examples/resources/iosxr_router_hsrp_interface/resource.tf @@ -0,0 +1,10 @@ +resource "iosxr_router_hsrp_interface" "example" { + interface_name = "GigabitEthernet0/0/0/1" + hsrp_use_bia = true + hsrp_redirects_disable = true + hsrp_delay_minimum = 500 + hsrp_delay_reload = 700 + hsrp_bfd_minimum_interval = 20000 + hsrp_bfd_multiplier = 40 + hsrp_mac_refresh = 5000 +} diff --git a/examples/resources/iosxr_router_hsrp_interface_address_family_ipv4/import.sh b/examples/resources/iosxr_router_hsrp_interface_address_family_ipv4/import.sh new file mode 100644 index 00000000..839b70b4 --- /dev/null +++ b/examples/resources/iosxr_router_hsrp_interface_address_family_ipv4/import.sh @@ -0,0 +1 @@ +terraform import iosxr_router_hsrp_interface_address_family_ipv4.example "Cisco-IOS-XR-um-router-hsrp-cfg:router/hsrp/interfaces/interface[interface-name=GigabitEthernet0/0/0/1]/address-family/ipv4/hsrp" diff --git a/examples/resources/iosxr_router_hsrp_interface_address_family_ipv4/resource.tf b/examples/resources/iosxr_router_hsrp_interface_address_family_ipv4/resource.tf new file mode 100644 index 00000000..8c3d5c0b --- /dev/null +++ b/examples/resources/iosxr_router_hsrp_interface_address_family_ipv4/resource.tf @@ -0,0 +1,50 @@ +resource "iosxr_router_hsrp_interface_address_family_ipv4" "example" { + interface_name = "GigabitEthernet0/0/0/1" + group_number_version_1s = [ + { + group_number_version_1_id = 123 + address_ipv4_address = "22.22.1.1" + address_learn = false + priority = 124 + name = "NAME11" + preempt_delay = 3200 + bfd_fast_detect_peer_ipv4 = "44.44.4.4" + bfd_fast_detect_peer_interface = "GigabitEthernet0/0/0/7" + track_interfaces = [ + { + track_name = "GigabitEthernet0/0/0/1" + priority_decrement = 166 + } + ] + track_objects = [ + { + object_name = "OBJECT1" + priority_decrement = 177 + } + ] + } + ] + group_number_version_2s = [ + { + group_number_version_2_id = 2345 + address_ipv4_address = "33.33.33.3" + address_learn = false + priority = 133 + name = "NAME22" + preempt_delay = 3100 + bfd_fast_detect_peer_ipv4 = "45.45.45.4" + track_interfaces = [ + { + track_name = "GigabitEthernet0/0/0/7" + priority_decrement = 66 + } + ] + track_objects = [ + { + object_name = "OBJECT2" + priority_decrement = 77 + } + ] + } + ] +} diff --git a/gen/definitions/router_hsrp_interface.yaml b/gen/definitions/router_hsrp_interface.yaml new file mode 100644 index 00000000..41717fc5 --- /dev/null +++ b/gen/definitions/router_hsrp_interface.yaml @@ -0,0 +1,21 @@ +--- +name: Router HSRP Interface +path: Cisco-IOS-XR-um-router-hsrp-cfg:/router/hsrp/interfaces/interface[interface-name=%s] +doc_category: HSRP +attributes: + - yang_name: interface-name + example: GigabitEthernet0/0/0/1 + - yang_name: hsrp/use-bia + example: true + - yang_name: hsrp/redirects/disable + example: true + - yang_name: hsrp/delay/minimum + example: 500 + - yang_name: hsrp/delay/reload + example: 700 + - yang_name: hsrp/bfd/minimum-interval + example: 20000 + - yang_name: hsrp/bfd/multiplier + example: 40 + - yang_name: hsrp/mac-refresh + example: 5000 \ No newline at end of file diff --git a/gen/definitions/router_hsrp_interface_address_family_ipv4.yaml b/gen/definitions/router_hsrp_interface_address_family_ipv4.yaml new file mode 100644 index 00000000..184eecb6 --- /dev/null +++ b/gen/definitions/router_hsrp_interface_address_family_ipv4.yaml @@ -0,0 +1,137 @@ +--- +name: Router HSRP Interface Address Family IPv4 +path: Cisco-IOS-XR-um-router-hsrp-cfg:router/hsrp/interfaces/interface[interface-name=%s]/address-family/ipv4/hsrp +no_delete_attributes: true +doc_category: HSRP +attributes: + - yang_name: interface-name + example: GigabitEthernet0/0/0/1 + - yang_name: group-number-version-1s/group-number-version-1 + tf_name: group_number_version_1s + type: List + attributes: + - yang_name: group-number-version-1-id + id: true + example: 123 + - yang_name: address/ipv4-address + example: 22.22.1.1 + - yang_name: address/learn + example: false + - yang_name: priority + example: 124 + - yang_name: mac-address + example: 20.11.11 + exclude_test: true + - yang_name: name + example: NAME11 + - yang_name: preempt/delay + example: 3200 + - yang_name: timers/msec + example: 100 + exclude_test: true + - yang_name: timers/msec2 + example: 234 + exclude_test: true + - yang_name: timers/hold-time + example: 22 + exclude_test: true + - yang_name: timers/hold-time2 + example: 234 + exclude_test: true + - yang_name: bfd/fast-detect/peer/ipv4 + example: 44.44.4.4 + - yang_name: bfd/fast-detect/peer/interface + example: GigabitEthernet0/0/0/7 + + - yang_name: address/secondary-ipv4-addresses/secondary-ipv4-address + tf_name: secondary_ipv4_addresses + type: List + exclude_test: true + attributes: + - yang_name: address + id: true + example: 2.2.2.2 + + - yang_name: track-interfaces/track-interface + tf_name: track_interfaces + type: List + attributes: + - yang_name: track-name + id: true + example: GigabitEthernet0/0/0/1 + - yang_name: priority-decrement + example: 166 + - yang_name: track-objects/track-object + tf_name: track_objects + type: List + attributes: + - yang_name: object-name + id: true + example: OBJECT1 + - yang_name: priority-decrement + example: 177 + - yang_name: group-number-version-2s/group-number-version-2 + tf_name: group_number_version_2s + type: List + attributes: + - yang_name: group-number-version-2-id + id: true + example: 2345 + - yang_name: address/ipv4-address + example: 33.33.33.3 + - yang_name: address/learn + example: false + - yang_name: priority + example: 133 + - yang_name: mac-address + example: 40.41.42 + exclude_test: true + - yang_name: name + example: NAME22 + - yang_name: preempt/delay + example: 3100 + - yang_name: timers/msec + example: 100 + exclude_test: true + - yang_name: timers/msec2 + example: 234 + exclude_test: true + - yang_name: timers/hold-time + example: 22 + exclude_test: true + - yang_name: timers/hold-time2 + example: 234 + exclude_test: true + - yang_name: bfd/fast-detect/peer/ipv4 + example: 45.45.45.4 + - yang_name: bfd/fast-detect/peer/interface + example: GigabitEthernet0/0/0/9 + exclude_test: true + + - yang_name: address/secondary-ipv4-addresses/secondary-ipv4-address + tf_name: secondary_ipv4_addresses + type: List + exclude_test: true + attributes: + - yang_name: address + id: true + example: 10.10.1.2 + + - yang_name: track-interfaces/track-interface + tf_name: track_interfaces + type: List + attributes: + - yang_name: track-name + id: true + example: GigabitEthernet0/0/0/7 + - yang_name: priority-decrement + example: 66 + - yang_name: track-objects/track-object + tf_name: track_objects + type: List + attributes: + - yang_name: object-name + id: true + example: OBJECT2 + - yang_name: priority-decrement + example: 77 \ No newline at end of file diff --git a/gen/load_models.go b/gen/load_models.go index 42de1644..664ce147 100644 --- a/gen/load_models.go +++ b/gen/load_models.go @@ -47,6 +47,7 @@ var models = []string{ "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-policymap-classmap-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-pce-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-cfg-mibs-cfg.yang", + "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-router-hsrp-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-traps-entity-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-error-disable-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-line-cfg.yang", @@ -71,7 +72,7 @@ var models = []string{ "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-traps-fru-ctrl-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-router-isis-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-router-bgp-cfg.yang", - "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-ntp-cfg.yang", + "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-um-ntp-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-segment-routing-srv6-datatypes.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-segment-routing-srv6-cfg.yang", "https://raw.githubusercontent.com/YangModels/yang/main/vendor/cisco/xr/761/Cisco-IOS-XR-segment-routing-ms-cfg.yang", diff --git a/internal/provider/data_source_iosxr_router_hsrp_interface.go b/internal/provider/data_source_iosxr_router_hsrp_interface.go new file mode 100644 index 00000000..18987e16 --- /dev/null +++ b/internal/provider/data_source_iosxr_router_hsrp_interface.go @@ -0,0 +1,134 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "context" + "fmt" + + "github.com/CiscoDevNet/terraform-provider-iosxr/internal/provider/client" + "github.com/hashicorp/terraform-plugin-framework/datasource" + "github.com/hashicorp/terraform-plugin-framework/datasource/schema" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-log/tflog" +) + +// Ensure the implementation satisfies the expected interfaces. +var ( + _ datasource.DataSource = &RouterHSRPInterfaceDataSource{} + _ datasource.DataSourceWithConfigure = &RouterHSRPInterfaceDataSource{} +) + +func NewRouterHSRPInterfaceDataSource() datasource.DataSource { + return &RouterHSRPInterfaceDataSource{} +} + +type RouterHSRPInterfaceDataSource struct { + client *client.Client +} + +func (d *RouterHSRPInterfaceDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_router_hsrp_interface" +} + +func (d *RouterHSRPInterfaceDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { + resp.Schema = schema.Schema{ + // This description is used by the documentation generator and the language server. + MarkdownDescription: "This data source can read the Router HSRP Interface configuration.", + + Attributes: map[string]schema.Attribute{ + "device": schema.StringAttribute{ + MarkdownDescription: "A device name from the provider configuration.", + Optional: true, + }, + "id": schema.StringAttribute{ + MarkdownDescription: "The path of the retrieved object.", + Computed: true, + }, + "interface_name": schema.StringAttribute{ + MarkdownDescription: "HSRP interface configuration subcommands", + Required: true, + }, + "hsrp_use_bia": schema.BoolAttribute{ + MarkdownDescription: "Use burned-in address", + Computed: true, + }, + "hsrp_redirects_disable": schema.BoolAttribute{ + MarkdownDescription: "Disable HSRP filtered ICMP redirects", + Computed: true, + }, + "hsrp_delay_minimum": schema.Int64Attribute{ + MarkdownDescription: "Set minimum delay on every interface up event", + Computed: true, + }, + "hsrp_delay_reload": schema.Int64Attribute{ + MarkdownDescription: "Set reload delay for first interface up event", + Computed: true, + }, + "hsrp_bfd_minimum_interval": schema.Int64Attribute{ + MarkdownDescription: "Hello interval", + Computed: true, + }, + "hsrp_bfd_multiplier": schema.Int64Attribute{ + MarkdownDescription: "Detect multiplier", + Computed: true, + }, + "hsrp_mac_refresh": schema.Int64Attribute{ + MarkdownDescription: "HSRP MGO subordinate MAC refresh rate", + Computed: true, + }, + }, + } +} + +func (d *RouterHSRPInterfaceDataSource) Configure(_ context.Context, req datasource.ConfigureRequest, _ *datasource.ConfigureResponse) { + if req.ProviderData == nil { + return + } + + d.client = req.ProviderData.(*client.Client) +} + +func (d *RouterHSRPInterfaceDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { + var config RouterHSRPInterfaceData + + // Read config + diags := req.Config.Get(ctx, &config) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Read", config.getPath())) + + getResp, diags := d.client.Get(ctx, config.Device.ValueString(), config.getPath()) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + config.fromBody(ctx, getResp.Notification[0].Update[0].Val.GetJsonIetfVal()) + config.Id = types.StringValue(config.getPath()) + + tflog.Debug(ctx, fmt.Sprintf("%s: Read finished successfully", config.getPath())) + + diags = resp.State.Set(ctx, &config) + resp.Diagnostics.Append(diags...) +} diff --git a/internal/provider/data_source_iosxr_router_hsrp_interface_address_family_ipv4.go b/internal/provider/data_source_iosxr_router_hsrp_interface_address_family_ipv4.go new file mode 100644 index 00000000..2c9ed2ef --- /dev/null +++ b/internal/provider/data_source_iosxr_router_hsrp_interface_address_family_ipv4.go @@ -0,0 +1,314 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "context" + "fmt" + + "github.com/CiscoDevNet/terraform-provider-iosxr/internal/provider/client" + "github.com/hashicorp/terraform-plugin-framework/datasource" + "github.com/hashicorp/terraform-plugin-framework/datasource/schema" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-log/tflog" +) + +// Ensure the implementation satisfies the expected interfaces. +var ( + _ datasource.DataSource = &RouterHSRPInterfaceAddressFamilyIPv4DataSource{} + _ datasource.DataSourceWithConfigure = &RouterHSRPInterfaceAddressFamilyIPv4DataSource{} +) + +func NewRouterHSRPInterfaceAddressFamilyIPv4DataSource() datasource.DataSource { + return &RouterHSRPInterfaceAddressFamilyIPv4DataSource{} +} + +type RouterHSRPInterfaceAddressFamilyIPv4DataSource struct { + client *client.Client +} + +func (d *RouterHSRPInterfaceAddressFamilyIPv4DataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_router_hsrp_interface_address_family_ipv4" +} + +func (d *RouterHSRPInterfaceAddressFamilyIPv4DataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { + resp.Schema = schema.Schema{ + // This description is used by the documentation generator and the language server. + MarkdownDescription: "This data source can read the Router HSRP Interface Address Family IPv4 configuration.", + + Attributes: map[string]schema.Attribute{ + "device": schema.StringAttribute{ + MarkdownDescription: "A device name from the provider configuration.", + Optional: true, + }, + "id": schema.StringAttribute{ + MarkdownDescription: "The path of the retrieved object.", + Computed: true, + }, + "interface_name": schema.StringAttribute{ + MarkdownDescription: "HSRP interface configuration subcommands", + Required: true, + }, + "group_number_version_1s": schema.ListNestedAttribute{ + MarkdownDescription: "group number version 1", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "group_number_version_1_id": schema.Int64Attribute{ + MarkdownDescription: "group number version 1", + Computed: true, + }, + "address_ipv4_address": schema.StringAttribute{ + MarkdownDescription: "Hot standby IP address", + Computed: true, + }, + "address_learn": schema.BoolAttribute{ + MarkdownDescription: "Learn virtual IP address from peer", + Computed: true, + }, + "priority": schema.Int64Attribute{ + MarkdownDescription: "Priority level", + Computed: true, + }, + "mac_address": schema.StringAttribute{ + MarkdownDescription: "Use specified mac address for the virtual router", + Computed: true, + }, + "name": schema.StringAttribute{ + MarkdownDescription: "MGO session name", + Computed: true, + }, + "preempt_delay": schema.Int64Attribute{ + MarkdownDescription: "Wait before preempting", + Computed: true, + }, + "timers_msec": schema.Int64Attribute{ + MarkdownDescription: "Specify hellotime in milliseconds", + Computed: true, + }, + "timers_msec2": schema.Int64Attribute{ + MarkdownDescription: "Specify hold time in milliseconds", + Computed: true, + }, + "timers_hold_time": schema.Int64Attribute{ + MarkdownDescription: "Hold time in seconds", + Computed: true, + }, + "timers_hold_time2": schema.Int64Attribute{ + MarkdownDescription: "Hold time in seconds", + Computed: true, + }, + "bfd_fast_detect_peer_ipv4": schema.StringAttribute{ + MarkdownDescription: "BFD peer interface IPv4 address", + Computed: true, + }, + "bfd_fast_detect_peer_interface": schema.StringAttribute{ + MarkdownDescription: "Select an interface over which to run BFD", + Computed: true, + }, + "secondary_ipv4_addresses": schema.ListNestedAttribute{ + MarkdownDescription: "Set secondary hot standby IP address", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "address": schema.StringAttribute{ + MarkdownDescription: "Set secondary hot standby IP address", + Computed: true, + }, + }, + }, + }, + "track_interfaces": schema.ListNestedAttribute{ + MarkdownDescription: "Configure tracking", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "track_name": schema.StringAttribute{ + MarkdownDescription: "Configure tracking", + Computed: true, + }, + "priority_decrement": schema.Int64Attribute{ + MarkdownDescription: "Priority decrement", + Computed: true, + }, + }, + }, + }, + "track_objects": schema.ListNestedAttribute{ + MarkdownDescription: "Object tracking", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "object_name": schema.StringAttribute{ + MarkdownDescription: "Object tracking", + Computed: true, + }, + "priority_decrement": schema.Int64Attribute{ + MarkdownDescription: "Priority decrement", + Computed: true, + }, + }, + }, + }, + }, + }, + }, + "group_number_version_2s": schema.ListNestedAttribute{ + MarkdownDescription: "group number version 2", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "group_number_version_2_id": schema.Int64Attribute{ + MarkdownDescription: "group number version 2", + Computed: true, + }, + "address_ipv4_address": schema.StringAttribute{ + MarkdownDescription: "Hot standby IP address", + Computed: true, + }, + "address_learn": schema.BoolAttribute{ + MarkdownDescription: "Learn virtual IP address from peer", + Computed: true, + }, + "priority": schema.Int64Attribute{ + MarkdownDescription: "Priority level", + Computed: true, + }, + "mac_address": schema.StringAttribute{ + MarkdownDescription: "Use specified mac address for the virtual router", + Computed: true, + }, + "name": schema.StringAttribute{ + MarkdownDescription: "MGO session name", + Computed: true, + }, + "preempt_delay": schema.Int64Attribute{ + MarkdownDescription: "Wait before preempting", + Computed: true, + }, + "timers_msec": schema.Int64Attribute{ + MarkdownDescription: "Specify hellotime in milliseconds", + Computed: true, + }, + "timers_msec2": schema.Int64Attribute{ + MarkdownDescription: "Specify hold time in milliseconds", + Computed: true, + }, + "timers_hold_time": schema.Int64Attribute{ + MarkdownDescription: "Hold time in seconds", + Computed: true, + }, + "timers_hold_time2": schema.Int64Attribute{ + MarkdownDescription: "Hold time in seconds", + Computed: true, + }, + "bfd_fast_detect_peer_ipv4": schema.StringAttribute{ + MarkdownDescription: "BFD peer interface IPv4 address", + Computed: true, + }, + "bfd_fast_detect_peer_interface": schema.StringAttribute{ + MarkdownDescription: "Select an interface over which to run BFD", + Computed: true, + }, + "secondary_ipv4_addresses": schema.ListNestedAttribute{ + MarkdownDescription: "Set secondary hot standby IP address", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "address": schema.StringAttribute{ + MarkdownDescription: "Set secondary hot standby IP address", + Computed: true, + }, + }, + }, + }, + "track_interfaces": schema.ListNestedAttribute{ + MarkdownDescription: "Configure tracking", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "track_name": schema.StringAttribute{ + MarkdownDescription: "Configure tracking", + Computed: true, + }, + "priority_decrement": schema.Int64Attribute{ + MarkdownDescription: "Priority decrement", + Computed: true, + }, + }, + }, + }, + "track_objects": schema.ListNestedAttribute{ + MarkdownDescription: "Object tracking", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "object_name": schema.StringAttribute{ + MarkdownDescription: "Object tracking", + Computed: true, + }, + "priority_decrement": schema.Int64Attribute{ + MarkdownDescription: "Priority decrement", + Computed: true, + }, + }, + }, + }, + }, + }, + }, + }, + } +} + +func (d *RouterHSRPInterfaceAddressFamilyIPv4DataSource) Configure(_ context.Context, req datasource.ConfigureRequest, _ *datasource.ConfigureResponse) { + if req.ProviderData == nil { + return + } + + d.client = req.ProviderData.(*client.Client) +} + +func (d *RouterHSRPInterfaceAddressFamilyIPv4DataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { + var config RouterHSRPInterfaceAddressFamilyIPv4Data + + // Read config + diags := req.Config.Get(ctx, &config) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Read", config.getPath())) + + getResp, diags := d.client.Get(ctx, config.Device.ValueString(), config.getPath()) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + config.fromBody(ctx, getResp.Notification[0].Update[0].Val.GetJsonIetfVal()) + config.Id = types.StringValue(config.getPath()) + + tflog.Debug(ctx, fmt.Sprintf("%s: Read finished successfully", config.getPath())) + + diags = resp.State.Set(ctx, &config) + resp.Diagnostics.Append(diags...) +} diff --git a/internal/provider/data_source_iosxr_router_hsrp_interface_address_family_ipv4_test.go b/internal/provider/data_source_iosxr_router_hsrp_interface_address_family_ipv4_test.go new file mode 100644 index 00000000..c1af648f --- /dev/null +++ b/internal/provider/data_source_iosxr_router_hsrp_interface_address_family_ipv4_test.go @@ -0,0 +1,112 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" +) + +func TestAccDataSourceIosxrRouterHSRPInterfaceAddressFamilyIPv4(t *testing.T) { + var checks []resource.TestCheckFunc + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.group_number_version_1_id", "123")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.address_ipv4_address", "22.22.1.1")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.address_learn", "false")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.priority", "124")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.name", "NAME11")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.preempt_delay", "3200")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.bfd_fast_detect_peer_ipv4", "44.44.4.4")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.bfd_fast_detect_peer_interface", "GigabitEthernet0/0/0/7")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.track_interfaces.0.track_name", "GigabitEthernet0/0/0/1")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.track_interfaces.0.priority_decrement", "166")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.track_objects.0.object_name", "OBJECT1")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.track_objects.0.priority_decrement", "177")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.group_number_version_2_id", "2345")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.address_ipv4_address", "33.33.33.3")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.address_learn", "false")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.priority", "133")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.name", "NAME22")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.preempt_delay", "3100")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.bfd_fast_detect_peer_ipv4", "45.45.45.4")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.track_interfaces.0.track_name", "GigabitEthernet0/0/0/7")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.track_interfaces.0.priority_decrement", "66")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.track_objects.0.object_name", "OBJECT2")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.track_objects.0.priority_decrement", "77")) + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceIosxrRouterHSRPInterfaceAddressFamilyIPv4Config(), + Check: resource.ComposeTestCheckFunc(checks...), + }, + }, + }) +} + +func testAccDataSourceIosxrRouterHSRPInterfaceAddressFamilyIPv4Config() string { + config := `resource "iosxr_router_hsrp_interface_address_family_ipv4" "test" {` + "\n" + config += ` interface_name = "GigabitEthernet0/0/0/1"` + "\n" + config += ` group_number_version_1s = [{` + "\n" + config += ` group_number_version_1_id = 123` + "\n" + config += ` address_ipv4_address = "22.22.1.1"` + "\n" + config += ` address_learn = false` + "\n" + config += ` priority = 124` + "\n" + config += ` name = "NAME11"` + "\n" + config += ` preempt_delay = 3200` + "\n" + config += ` bfd_fast_detect_peer_ipv4 = "44.44.4.4"` + "\n" + config += ` bfd_fast_detect_peer_interface = "GigabitEthernet0/0/0/7"` + "\n" + config += ` track_interfaces = [{` + "\n" + config += ` track_name = "GigabitEthernet0/0/0/1"` + "\n" + config += ` priority_decrement = 166` + "\n" + config += ` }]` + "\n" + config += ` track_objects = [{` + "\n" + config += ` object_name = "OBJECT1"` + "\n" + config += ` priority_decrement = 177` + "\n" + config += ` }]` + "\n" + config += ` }]` + "\n" + config += ` group_number_version_2s = [{` + "\n" + config += ` group_number_version_2_id = 2345` + "\n" + config += ` address_ipv4_address = "33.33.33.3"` + "\n" + config += ` address_learn = false` + "\n" + config += ` priority = 133` + "\n" + config += ` name = "NAME22"` + "\n" + config += ` preempt_delay = 3100` + "\n" + config += ` bfd_fast_detect_peer_ipv4 = "45.45.45.4"` + "\n" + config += ` track_interfaces = [{` + "\n" + config += ` track_name = "GigabitEthernet0/0/0/7"` + "\n" + config += ` priority_decrement = 66` + "\n" + config += ` }]` + "\n" + config += ` track_objects = [{` + "\n" + config += ` object_name = "OBJECT2"` + "\n" + config += ` priority_decrement = 77` + "\n" + config += ` }]` + "\n" + config += ` }]` + "\n" + config += `}` + "\n" + + config += ` + data "iosxr_router_hsrp_interface_address_family_ipv4" "test" { + interface_name = "GigabitEthernet0/0/0/1" + depends_on = [iosxr_router_hsrp_interface_address_family_ipv4.test] + } + ` + return config +} diff --git a/internal/provider/data_source_iosxr_router_hsrp_interface_test.go b/internal/provider/data_source_iosxr_router_hsrp_interface_test.go new file mode 100644 index 00000000..0c423836 --- /dev/null +++ b/internal/provider/data_source_iosxr_router_hsrp_interface_test.go @@ -0,0 +1,69 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" +) + +func TestAccDataSourceIosxrRouterHSRPInterface(t *testing.T) { + var checks []resource.TestCheckFunc + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface.test", "hsrp_use_bia", "true")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface.test", "hsrp_redirects_disable", "true")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface.test", "hsrp_delay_minimum", "500")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface.test", "hsrp_delay_reload", "700")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface.test", "hsrp_bfd_minimum_interval", "20000")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface.test", "hsrp_bfd_multiplier", "40")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxr_router_hsrp_interface.test", "hsrp_mac_refresh", "5000")) + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceIosxrRouterHSRPInterfaceConfig(), + Check: resource.ComposeTestCheckFunc(checks...), + }, + }, + }) +} + +func testAccDataSourceIosxrRouterHSRPInterfaceConfig() string { + config := `resource "iosxr_router_hsrp_interface" "test" {` + "\n" + config += ` delete_mode = "attributes"` + "\n" + config += ` interface_name = "GigabitEthernet0/0/0/1"` + "\n" + config += ` hsrp_use_bia = true` + "\n" + config += ` hsrp_redirects_disable = true` + "\n" + config += ` hsrp_delay_minimum = 500` + "\n" + config += ` hsrp_delay_reload = 700` + "\n" + config += ` hsrp_bfd_minimum_interval = 20000` + "\n" + config += ` hsrp_bfd_multiplier = 40` + "\n" + config += ` hsrp_mac_refresh = 5000` + "\n" + config += `}` + "\n" + + config += ` + data "iosxr_router_hsrp_interface" "test" { + interface_name = "GigabitEthernet0/0/0/1" + depends_on = [iosxr_router_hsrp_interface.test] + } + ` + return config +} diff --git a/internal/provider/model_iosxr_router_hsrp_interface.go b/internal/provider/model_iosxr_router_hsrp_interface.go new file mode 100644 index 00000000..3286074b --- /dev/null +++ b/internal/provider/model_iosxr_router_hsrp_interface.go @@ -0,0 +1,214 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "context" + "fmt" + "strconv" + + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/tidwall/gjson" + "github.com/tidwall/sjson" +) + +type RouterHSRPInterface struct { + Device types.String `tfsdk:"device"` + Id types.String `tfsdk:"id"` + DeleteMode types.String `tfsdk:"delete_mode"` + InterfaceName types.String `tfsdk:"interface_name"` + HsrpUseBia types.Bool `tfsdk:"hsrp_use_bia"` + HsrpRedirectsDisable types.Bool `tfsdk:"hsrp_redirects_disable"` + HsrpDelayMinimum types.Int64 `tfsdk:"hsrp_delay_minimum"` + HsrpDelayReload types.Int64 `tfsdk:"hsrp_delay_reload"` + HsrpBfdMinimumInterval types.Int64 `tfsdk:"hsrp_bfd_minimum_interval"` + HsrpBfdMultiplier types.Int64 `tfsdk:"hsrp_bfd_multiplier"` + HsrpMacRefresh types.Int64 `tfsdk:"hsrp_mac_refresh"` +} + +type RouterHSRPInterfaceData struct { + Device types.String `tfsdk:"device"` + Id types.String `tfsdk:"id"` + InterfaceName types.String `tfsdk:"interface_name"` + HsrpUseBia types.Bool `tfsdk:"hsrp_use_bia"` + HsrpRedirectsDisable types.Bool `tfsdk:"hsrp_redirects_disable"` + HsrpDelayMinimum types.Int64 `tfsdk:"hsrp_delay_minimum"` + HsrpDelayReload types.Int64 `tfsdk:"hsrp_delay_reload"` + HsrpBfdMinimumInterval types.Int64 `tfsdk:"hsrp_bfd_minimum_interval"` + HsrpBfdMultiplier types.Int64 `tfsdk:"hsrp_bfd_multiplier"` + HsrpMacRefresh types.Int64 `tfsdk:"hsrp_mac_refresh"` +} + +func (data RouterHSRPInterface) getPath() string { + return fmt.Sprintf("Cisco-IOS-XR-um-router-hsrp-cfg:/router/hsrp/interfaces/interface[interface-name=%s]", data.InterfaceName.ValueString()) +} + +func (data RouterHSRPInterfaceData) getPath() string { + return fmt.Sprintf("Cisco-IOS-XR-um-router-hsrp-cfg:/router/hsrp/interfaces/interface[interface-name=%s]", data.InterfaceName.ValueString()) +} + +func (data RouterHSRPInterface) toBody(ctx context.Context) string { + body := "{}" + if !data.InterfaceName.IsNull() && !data.InterfaceName.IsUnknown() { + body, _ = sjson.Set(body, "interface-name", data.InterfaceName.ValueString()) + } + if !data.HsrpUseBia.IsNull() && !data.HsrpUseBia.IsUnknown() { + if data.HsrpUseBia.ValueBool() { + body, _ = sjson.Set(body, "hsrp.use-bia", map[string]string{}) + } + } + if !data.HsrpRedirectsDisable.IsNull() && !data.HsrpRedirectsDisable.IsUnknown() { + if data.HsrpRedirectsDisable.ValueBool() { + body, _ = sjson.Set(body, "hsrp.redirects.disable", map[string]string{}) + } + } + if !data.HsrpDelayMinimum.IsNull() && !data.HsrpDelayMinimum.IsUnknown() { + body, _ = sjson.Set(body, "hsrp.delay.minimum", strconv.FormatInt(data.HsrpDelayMinimum.ValueInt64(), 10)) + } + if !data.HsrpDelayReload.IsNull() && !data.HsrpDelayReload.IsUnknown() { + body, _ = sjson.Set(body, "hsrp.delay.reload", strconv.FormatInt(data.HsrpDelayReload.ValueInt64(), 10)) + } + if !data.HsrpBfdMinimumInterval.IsNull() && !data.HsrpBfdMinimumInterval.IsUnknown() { + body, _ = sjson.Set(body, "hsrp.bfd.minimum-interval", strconv.FormatInt(data.HsrpBfdMinimumInterval.ValueInt64(), 10)) + } + if !data.HsrpBfdMultiplier.IsNull() && !data.HsrpBfdMultiplier.IsUnknown() { + body, _ = sjson.Set(body, "hsrp.bfd.multiplier", strconv.FormatInt(data.HsrpBfdMultiplier.ValueInt64(), 10)) + } + if !data.HsrpMacRefresh.IsNull() && !data.HsrpMacRefresh.IsUnknown() { + body, _ = sjson.Set(body, "hsrp.mac-refresh", strconv.FormatInt(data.HsrpMacRefresh.ValueInt64(), 10)) + } + return body +} + +func (data *RouterHSRPInterface) updateFromBody(ctx context.Context, res []byte) { + if value := gjson.GetBytes(res, "hsrp.use-bia"); !data.HsrpUseBia.IsNull() { + if value.Exists() { + data.HsrpUseBia = types.BoolValue(true) + } else { + data.HsrpUseBia = types.BoolValue(false) + } + } else { + data.HsrpUseBia = types.BoolNull() + } + if value := gjson.GetBytes(res, "hsrp.redirects.disable"); !data.HsrpRedirectsDisable.IsNull() { + if value.Exists() { + data.HsrpRedirectsDisable = types.BoolValue(true) + } else { + data.HsrpRedirectsDisable = types.BoolValue(false) + } + } else { + data.HsrpRedirectsDisable = types.BoolNull() + } + if value := gjson.GetBytes(res, "hsrp.delay.minimum"); value.Exists() && !data.HsrpDelayMinimum.IsNull() { + data.HsrpDelayMinimum = types.Int64Value(value.Int()) + } else { + data.HsrpDelayMinimum = types.Int64Null() + } + if value := gjson.GetBytes(res, "hsrp.delay.reload"); value.Exists() && !data.HsrpDelayReload.IsNull() { + data.HsrpDelayReload = types.Int64Value(value.Int()) + } else { + data.HsrpDelayReload = types.Int64Null() + } + if value := gjson.GetBytes(res, "hsrp.bfd.minimum-interval"); value.Exists() && !data.HsrpBfdMinimumInterval.IsNull() { + data.HsrpBfdMinimumInterval = types.Int64Value(value.Int()) + } else { + data.HsrpBfdMinimumInterval = types.Int64Null() + } + if value := gjson.GetBytes(res, "hsrp.bfd.multiplier"); value.Exists() && !data.HsrpBfdMultiplier.IsNull() { + data.HsrpBfdMultiplier = types.Int64Value(value.Int()) + } else { + data.HsrpBfdMultiplier = types.Int64Null() + } + if value := gjson.GetBytes(res, "hsrp.mac-refresh"); value.Exists() && !data.HsrpMacRefresh.IsNull() { + data.HsrpMacRefresh = types.Int64Value(value.Int()) + } else { + data.HsrpMacRefresh = types.Int64Null() + } +} + +func (data *RouterHSRPInterfaceData) fromBody(ctx context.Context, res []byte) { + if value := gjson.GetBytes(res, "hsrp.use-bia"); value.Exists() { + data.HsrpUseBia = types.BoolValue(true) + } else { + data.HsrpUseBia = types.BoolValue(false) + } + if value := gjson.GetBytes(res, "hsrp.redirects.disable"); value.Exists() { + data.HsrpRedirectsDisable = types.BoolValue(true) + } else { + data.HsrpRedirectsDisable = types.BoolValue(false) + } + if value := gjson.GetBytes(res, "hsrp.delay.minimum"); value.Exists() { + data.HsrpDelayMinimum = types.Int64Value(value.Int()) + } + if value := gjson.GetBytes(res, "hsrp.delay.reload"); value.Exists() { + data.HsrpDelayReload = types.Int64Value(value.Int()) + } + if value := gjson.GetBytes(res, "hsrp.bfd.minimum-interval"); value.Exists() { + data.HsrpBfdMinimumInterval = types.Int64Value(value.Int()) + } + if value := gjson.GetBytes(res, "hsrp.bfd.multiplier"); value.Exists() { + data.HsrpBfdMultiplier = types.Int64Value(value.Int()) + } + if value := gjson.GetBytes(res, "hsrp.mac-refresh"); value.Exists() { + data.HsrpMacRefresh = types.Int64Value(value.Int()) + } +} + +func (data *RouterHSRPInterface) getDeletedListItems(ctx context.Context, state RouterHSRPInterface) []string { + deletedListItems := make([]string, 0) + return deletedListItems +} + +func (data *RouterHSRPInterface) getEmptyLeafsDelete(ctx context.Context) []string { + emptyLeafsDelete := make([]string, 0) + if !data.HsrpUseBia.IsNull() && !data.HsrpUseBia.ValueBool() { + emptyLeafsDelete = append(emptyLeafsDelete, fmt.Sprintf("%v/hsrp/use-bia", data.getPath())) + } + if !data.HsrpRedirectsDisable.IsNull() && !data.HsrpRedirectsDisable.ValueBool() { + emptyLeafsDelete = append(emptyLeafsDelete, fmt.Sprintf("%v/hsrp/redirects/disable", data.getPath())) + } + return emptyLeafsDelete +} + +func (data *RouterHSRPInterface) getDeletePaths(ctx context.Context) []string { + var deletePaths []string + if !data.HsrpUseBia.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/hsrp/use-bia", data.getPath())) + } + if !data.HsrpRedirectsDisable.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/hsrp/redirects/disable", data.getPath())) + } + if !data.HsrpDelayMinimum.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/hsrp/delay/minimum", data.getPath())) + } + if !data.HsrpDelayReload.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/hsrp/delay/reload", data.getPath())) + } + if !data.HsrpBfdMinimumInterval.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/hsrp/bfd/minimum-interval", data.getPath())) + } + if !data.HsrpBfdMultiplier.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/hsrp/bfd/multiplier", data.getPath())) + } + if !data.HsrpMacRefresh.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/hsrp/mac-refresh", data.getPath())) + } + return deletePaths +} diff --git a/internal/provider/model_iosxr_router_hsrp_interface_address_family_ipv4.go b/internal/provider/model_iosxr_router_hsrp_interface_address_family_ipv4.go new file mode 100644 index 00000000..64a63b4b --- /dev/null +++ b/internal/provider/model_iosxr_router_hsrp_interface_address_family_ipv4.go @@ -0,0 +1,1201 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "context" + "fmt" + "reflect" + "strconv" + + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/tidwall/gjson" + "github.com/tidwall/sjson" +) + +type RouterHSRPInterfaceAddressFamilyIPv4 struct { + Device types.String `tfsdk:"device"` + Id types.String `tfsdk:"id"` + InterfaceName types.String `tfsdk:"interface_name"` + GroupNumberVersion1s []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1s `tfsdk:"group_number_version_1s"` + GroupNumberVersion2s []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2s `tfsdk:"group_number_version_2s"` +} + +type RouterHSRPInterfaceAddressFamilyIPv4Data struct { + Device types.String `tfsdk:"device"` + Id types.String `tfsdk:"id"` + InterfaceName types.String `tfsdk:"interface_name"` + GroupNumberVersion1s []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1s `tfsdk:"group_number_version_1s"` + GroupNumberVersion2s []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2s `tfsdk:"group_number_version_2s"` +} +type RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1s struct { + GroupNumberVersion1Id types.Int64 `tfsdk:"group_number_version_1_id"` + AddressIpv4Address types.String `tfsdk:"address_ipv4_address"` + AddressLearn types.Bool `tfsdk:"address_learn"` + Priority types.Int64 `tfsdk:"priority"` + MacAddress types.String `tfsdk:"mac_address"` + Name types.String `tfsdk:"name"` + PreemptDelay types.Int64 `tfsdk:"preempt_delay"` + TimersMsec types.Int64 `tfsdk:"timers_msec"` + TimersMsec2 types.Int64 `tfsdk:"timers_msec2"` + TimersHoldTime types.Int64 `tfsdk:"timers_hold_time"` + TimersHoldTime2 types.Int64 `tfsdk:"timers_hold_time2"` + BfdFastDetectPeerIpv4 types.String `tfsdk:"bfd_fast_detect_peer_ipv4"` + BfdFastDetectPeerInterface types.String `tfsdk:"bfd_fast_detect_peer_interface"` + SecondaryIpv4Addresses []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sSecondaryIpv4Addresses `tfsdk:"secondary_ipv4_addresses"` + TrackInterfaces []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sTrackInterfaces `tfsdk:"track_interfaces"` + TrackObjects []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sTrackObjects `tfsdk:"track_objects"` +} +type RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2s struct { + GroupNumberVersion2Id types.Int64 `tfsdk:"group_number_version_2_id"` + AddressIpv4Address types.String `tfsdk:"address_ipv4_address"` + AddressLearn types.Bool `tfsdk:"address_learn"` + Priority types.Int64 `tfsdk:"priority"` + MacAddress types.String `tfsdk:"mac_address"` + Name types.String `tfsdk:"name"` + PreemptDelay types.Int64 `tfsdk:"preempt_delay"` + TimersMsec types.Int64 `tfsdk:"timers_msec"` + TimersMsec2 types.Int64 `tfsdk:"timers_msec2"` + TimersHoldTime types.Int64 `tfsdk:"timers_hold_time"` + TimersHoldTime2 types.Int64 `tfsdk:"timers_hold_time2"` + BfdFastDetectPeerIpv4 types.String `tfsdk:"bfd_fast_detect_peer_ipv4"` + BfdFastDetectPeerInterface types.String `tfsdk:"bfd_fast_detect_peer_interface"` + SecondaryIpv4Addresses []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sSecondaryIpv4Addresses `tfsdk:"secondary_ipv4_addresses"` + TrackInterfaces []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sTrackInterfaces `tfsdk:"track_interfaces"` + TrackObjects []RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sTrackObjects `tfsdk:"track_objects"` +} +type RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sSecondaryIpv4Addresses struct { + Address types.String `tfsdk:"address"` +} +type RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sTrackInterfaces struct { + TrackName types.String `tfsdk:"track_name"` + PriorityDecrement types.Int64 `tfsdk:"priority_decrement"` +} +type RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sTrackObjects struct { + ObjectName types.String `tfsdk:"object_name"` + PriorityDecrement types.Int64 `tfsdk:"priority_decrement"` +} +type RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sSecondaryIpv4Addresses struct { + Address types.String `tfsdk:"address"` +} +type RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sTrackInterfaces struct { + TrackName types.String `tfsdk:"track_name"` + PriorityDecrement types.Int64 `tfsdk:"priority_decrement"` +} +type RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sTrackObjects struct { + ObjectName types.String `tfsdk:"object_name"` + PriorityDecrement types.Int64 `tfsdk:"priority_decrement"` +} + +func (data RouterHSRPInterfaceAddressFamilyIPv4) getPath() string { + return fmt.Sprintf("Cisco-IOS-XR-um-router-hsrp-cfg:router/hsrp/interfaces/interface[interface-name=%s]/address-family/ipv4/hsrp", data.InterfaceName.ValueString()) +} + +func (data RouterHSRPInterfaceAddressFamilyIPv4Data) getPath() string { + return fmt.Sprintf("Cisco-IOS-XR-um-router-hsrp-cfg:router/hsrp/interfaces/interface[interface-name=%s]/address-family/ipv4/hsrp", data.InterfaceName.ValueString()) +} + +func (data RouterHSRPInterfaceAddressFamilyIPv4) toBody(ctx context.Context) string { + body := "{}" + if len(data.GroupNumberVersion1s) > 0 { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1", []interface{}{}) + for index, item := range data.GroupNumberVersion1s { + if !item.GroupNumberVersion1Id.IsNull() && !item.GroupNumberVersion1Id.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"group-number-version-1-id", strconv.FormatInt(item.GroupNumberVersion1Id.ValueInt64(), 10)) + } + if !item.AddressIpv4Address.IsNull() && !item.AddressIpv4Address.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"address.ipv4-address", item.AddressIpv4Address.ValueString()) + } + if !item.AddressLearn.IsNull() && !item.AddressLearn.IsUnknown() { + if item.AddressLearn.ValueBool() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"address.learn", map[string]string{}) + } + } + if !item.Priority.IsNull() && !item.Priority.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"priority", strconv.FormatInt(item.Priority.ValueInt64(), 10)) + } + if !item.MacAddress.IsNull() && !item.MacAddress.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"mac-address", item.MacAddress.ValueString()) + } + if !item.Name.IsNull() && !item.Name.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"name", item.Name.ValueString()) + } + if !item.PreemptDelay.IsNull() && !item.PreemptDelay.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"preempt.delay", strconv.FormatInt(item.PreemptDelay.ValueInt64(), 10)) + } + if !item.TimersMsec.IsNull() && !item.TimersMsec.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"timers.msec", strconv.FormatInt(item.TimersMsec.ValueInt64(), 10)) + } + if !item.TimersMsec2.IsNull() && !item.TimersMsec2.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"timers.msec2", strconv.FormatInt(item.TimersMsec2.ValueInt64(), 10)) + } + if !item.TimersHoldTime.IsNull() && !item.TimersHoldTime.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"timers.hold-time", strconv.FormatInt(item.TimersHoldTime.ValueInt64(), 10)) + } + if !item.TimersHoldTime2.IsNull() && !item.TimersHoldTime2.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"timers.hold-time2", strconv.FormatInt(item.TimersHoldTime2.ValueInt64(), 10)) + } + if !item.BfdFastDetectPeerIpv4.IsNull() && !item.BfdFastDetectPeerIpv4.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"bfd.fast-detect.peer.ipv4", item.BfdFastDetectPeerIpv4.ValueString()) + } + if !item.BfdFastDetectPeerInterface.IsNull() && !item.BfdFastDetectPeerInterface.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"bfd.fast-detect.peer.interface", item.BfdFastDetectPeerInterface.ValueString()) + } + if len(item.SecondaryIpv4Addresses) > 0 { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"address.secondary-ipv4-addresses.secondary-ipv4-address", []interface{}{}) + for cindex, citem := range item.SecondaryIpv4Addresses { + if !citem.Address.IsNull() && !citem.Address.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"address.secondary-ipv4-addresses.secondary-ipv4-address"+"."+strconv.Itoa(cindex)+"."+"address", citem.Address.ValueString()) + } + } + } + if len(item.TrackInterfaces) > 0 { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"track-interfaces.track-interface", []interface{}{}) + for cindex, citem := range item.TrackInterfaces { + if !citem.TrackName.IsNull() && !citem.TrackName.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"track-interfaces.track-interface"+"."+strconv.Itoa(cindex)+"."+"track-name", citem.TrackName.ValueString()) + } + if !citem.PriorityDecrement.IsNull() && !citem.PriorityDecrement.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"track-interfaces.track-interface"+"."+strconv.Itoa(cindex)+"."+"priority-decrement", strconv.FormatInt(citem.PriorityDecrement.ValueInt64(), 10)) + } + } + } + if len(item.TrackObjects) > 0 { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"track-objects.track-object", []interface{}{}) + for cindex, citem := range item.TrackObjects { + if !citem.ObjectName.IsNull() && !citem.ObjectName.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"track-objects.track-object"+"."+strconv.Itoa(cindex)+"."+"object-name", citem.ObjectName.ValueString()) + } + if !citem.PriorityDecrement.IsNull() && !citem.PriorityDecrement.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-1s.group-number-version-1"+"."+strconv.Itoa(index)+"."+"track-objects.track-object"+"."+strconv.Itoa(cindex)+"."+"priority-decrement", strconv.FormatInt(citem.PriorityDecrement.ValueInt64(), 10)) + } + } + } + } + } + if len(data.GroupNumberVersion2s) > 0 { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2", []interface{}{}) + for index, item := range data.GroupNumberVersion2s { + if !item.GroupNumberVersion2Id.IsNull() && !item.GroupNumberVersion2Id.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"group-number-version-2-id", strconv.FormatInt(item.GroupNumberVersion2Id.ValueInt64(), 10)) + } + if !item.AddressIpv4Address.IsNull() && !item.AddressIpv4Address.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"address.ipv4-address", item.AddressIpv4Address.ValueString()) + } + if !item.AddressLearn.IsNull() && !item.AddressLearn.IsUnknown() { + if item.AddressLearn.ValueBool() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"address.learn", map[string]string{}) + } + } + if !item.Priority.IsNull() && !item.Priority.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"priority", strconv.FormatInt(item.Priority.ValueInt64(), 10)) + } + if !item.MacAddress.IsNull() && !item.MacAddress.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"mac-address", item.MacAddress.ValueString()) + } + if !item.Name.IsNull() && !item.Name.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"name", item.Name.ValueString()) + } + if !item.PreemptDelay.IsNull() && !item.PreemptDelay.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"preempt.delay", strconv.FormatInt(item.PreemptDelay.ValueInt64(), 10)) + } + if !item.TimersMsec.IsNull() && !item.TimersMsec.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"timers.msec", strconv.FormatInt(item.TimersMsec.ValueInt64(), 10)) + } + if !item.TimersMsec2.IsNull() && !item.TimersMsec2.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"timers.msec2", strconv.FormatInt(item.TimersMsec2.ValueInt64(), 10)) + } + if !item.TimersHoldTime.IsNull() && !item.TimersHoldTime.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"timers.hold-time", strconv.FormatInt(item.TimersHoldTime.ValueInt64(), 10)) + } + if !item.TimersHoldTime2.IsNull() && !item.TimersHoldTime2.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"timers.hold-time2", strconv.FormatInt(item.TimersHoldTime2.ValueInt64(), 10)) + } + if !item.BfdFastDetectPeerIpv4.IsNull() && !item.BfdFastDetectPeerIpv4.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"bfd.fast-detect.peer.ipv4", item.BfdFastDetectPeerIpv4.ValueString()) + } + if !item.BfdFastDetectPeerInterface.IsNull() && !item.BfdFastDetectPeerInterface.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"bfd.fast-detect.peer.interface", item.BfdFastDetectPeerInterface.ValueString()) + } + if len(item.SecondaryIpv4Addresses) > 0 { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"address.secondary-ipv4-addresses.secondary-ipv4-address", []interface{}{}) + for cindex, citem := range item.SecondaryIpv4Addresses { + if !citem.Address.IsNull() && !citem.Address.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"address.secondary-ipv4-addresses.secondary-ipv4-address"+"."+strconv.Itoa(cindex)+"."+"address", citem.Address.ValueString()) + } + } + } + if len(item.TrackInterfaces) > 0 { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"track-interfaces.track-interface", []interface{}{}) + for cindex, citem := range item.TrackInterfaces { + if !citem.TrackName.IsNull() && !citem.TrackName.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"track-interfaces.track-interface"+"."+strconv.Itoa(cindex)+"."+"track-name", citem.TrackName.ValueString()) + } + if !citem.PriorityDecrement.IsNull() && !citem.PriorityDecrement.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"track-interfaces.track-interface"+"."+strconv.Itoa(cindex)+"."+"priority-decrement", strconv.FormatInt(citem.PriorityDecrement.ValueInt64(), 10)) + } + } + } + if len(item.TrackObjects) > 0 { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"track-objects.track-object", []interface{}{}) + for cindex, citem := range item.TrackObjects { + if !citem.ObjectName.IsNull() && !citem.ObjectName.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"track-objects.track-object"+"."+strconv.Itoa(cindex)+"."+"object-name", citem.ObjectName.ValueString()) + } + if !citem.PriorityDecrement.IsNull() && !citem.PriorityDecrement.IsUnknown() { + body, _ = sjson.Set(body, "group-number-version-2s.group-number-version-2"+"."+strconv.Itoa(index)+"."+"track-objects.track-object"+"."+strconv.Itoa(cindex)+"."+"priority-decrement", strconv.FormatInt(citem.PriorityDecrement.ValueInt64(), 10)) + } + } + } + } + } + return body +} + +func (data *RouterHSRPInterfaceAddressFamilyIPv4) updateFromBody(ctx context.Context, res []byte) { + for i := range data.GroupNumberVersion1s { + keys := [...]string{"group-number-version-1-id"} + keyValues := [...]string{strconv.FormatInt(data.GroupNumberVersion1s[i].GroupNumberVersion1Id.ValueInt64(), 10)} + + var r gjson.Result + gjson.GetBytes(res, "group-number-version-1s.group-number-version-1").ForEach( + func(_, v gjson.Result) bool { + found := false + for ik := range keys { + if v.Get(keys[ik]).String() == keyValues[ik] { + found = true + continue + } + found = false + break + } + if found { + r = v + return false + } + return true + }, + ) + if value := r.Get("group-number-version-1-id"); value.Exists() && !data.GroupNumberVersion1s[i].GroupNumberVersion1Id.IsNull() { + data.GroupNumberVersion1s[i].GroupNumberVersion1Id = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].GroupNumberVersion1Id = types.Int64Null() + } + if value := r.Get("address.ipv4-address"); value.Exists() && !data.GroupNumberVersion1s[i].AddressIpv4Address.IsNull() { + data.GroupNumberVersion1s[i].AddressIpv4Address = types.StringValue(value.String()) + } else { + data.GroupNumberVersion1s[i].AddressIpv4Address = types.StringNull() + } + if value := r.Get("address.learn"); !data.GroupNumberVersion1s[i].AddressLearn.IsNull() { + if value.Exists() { + data.GroupNumberVersion1s[i].AddressLearn = types.BoolValue(true) + } else { + data.GroupNumberVersion1s[i].AddressLearn = types.BoolValue(false) + } + } else { + data.GroupNumberVersion1s[i].AddressLearn = types.BoolNull() + } + if value := r.Get("priority"); value.Exists() && !data.GroupNumberVersion1s[i].Priority.IsNull() { + data.GroupNumberVersion1s[i].Priority = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].Priority = types.Int64Null() + } + if value := r.Get("mac-address"); value.Exists() && !data.GroupNumberVersion1s[i].MacAddress.IsNull() { + data.GroupNumberVersion1s[i].MacAddress = types.StringValue(value.String()) + } else { + data.GroupNumberVersion1s[i].MacAddress = types.StringNull() + } + if value := r.Get("name"); value.Exists() && !data.GroupNumberVersion1s[i].Name.IsNull() { + data.GroupNumberVersion1s[i].Name = types.StringValue(value.String()) + } else { + data.GroupNumberVersion1s[i].Name = types.StringNull() + } + if value := r.Get("preempt.delay"); value.Exists() && !data.GroupNumberVersion1s[i].PreemptDelay.IsNull() { + data.GroupNumberVersion1s[i].PreemptDelay = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].PreemptDelay = types.Int64Null() + } + if value := r.Get("timers.msec"); value.Exists() && !data.GroupNumberVersion1s[i].TimersMsec.IsNull() { + data.GroupNumberVersion1s[i].TimersMsec = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].TimersMsec = types.Int64Null() + } + if value := r.Get("timers.msec2"); value.Exists() && !data.GroupNumberVersion1s[i].TimersMsec2.IsNull() { + data.GroupNumberVersion1s[i].TimersMsec2 = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].TimersMsec2 = types.Int64Null() + } + if value := r.Get("timers.hold-time"); value.Exists() && !data.GroupNumberVersion1s[i].TimersHoldTime.IsNull() { + data.GroupNumberVersion1s[i].TimersHoldTime = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].TimersHoldTime = types.Int64Null() + } + if value := r.Get("timers.hold-time2"); value.Exists() && !data.GroupNumberVersion1s[i].TimersHoldTime2.IsNull() { + data.GroupNumberVersion1s[i].TimersHoldTime2 = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].TimersHoldTime2 = types.Int64Null() + } + if value := r.Get("bfd.fast-detect.peer.ipv4"); value.Exists() && !data.GroupNumberVersion1s[i].BfdFastDetectPeerIpv4.IsNull() { + data.GroupNumberVersion1s[i].BfdFastDetectPeerIpv4 = types.StringValue(value.String()) + } else { + data.GroupNumberVersion1s[i].BfdFastDetectPeerIpv4 = types.StringNull() + } + if value := r.Get("bfd.fast-detect.peer.interface"); value.Exists() && !data.GroupNumberVersion1s[i].BfdFastDetectPeerInterface.IsNull() { + data.GroupNumberVersion1s[i].BfdFastDetectPeerInterface = types.StringValue(value.String()) + } else { + data.GroupNumberVersion1s[i].BfdFastDetectPeerInterface = types.StringNull() + } + for ci := range data.GroupNumberVersion1s[i].SecondaryIpv4Addresses { + keys := [...]string{"address"} + keyValues := [...]string{data.GroupNumberVersion1s[i].SecondaryIpv4Addresses[ci].Address.ValueString()} + + var cr gjson.Result + r.Get("address.secondary-ipv4-addresses.secondary-ipv4-address").ForEach( + func(_, v gjson.Result) bool { + found := false + for ik := range keys { + if v.Get(keys[ik]).String() == keyValues[ik] { + found = true + continue + } + found = false + break + } + if found { + cr = v + return false + } + return true + }, + ) + if value := cr.Get("address"); value.Exists() && !data.GroupNumberVersion1s[i].SecondaryIpv4Addresses[ci].Address.IsNull() { + data.GroupNumberVersion1s[i].SecondaryIpv4Addresses[ci].Address = types.StringValue(value.String()) + } else { + data.GroupNumberVersion1s[i].SecondaryIpv4Addresses[ci].Address = types.StringNull() + } + } + for ci := range data.GroupNumberVersion1s[i].TrackInterfaces { + keys := [...]string{"track-name"} + keyValues := [...]string{data.GroupNumberVersion1s[i].TrackInterfaces[ci].TrackName.ValueString()} + + var cr gjson.Result + r.Get("track-interfaces.track-interface").ForEach( + func(_, v gjson.Result) bool { + found := false + for ik := range keys { + if v.Get(keys[ik]).String() == keyValues[ik] { + found = true + continue + } + found = false + break + } + if found { + cr = v + return false + } + return true + }, + ) + if value := cr.Get("track-name"); value.Exists() && !data.GroupNumberVersion1s[i].TrackInterfaces[ci].TrackName.IsNull() { + data.GroupNumberVersion1s[i].TrackInterfaces[ci].TrackName = types.StringValue(value.String()) + } else { + data.GroupNumberVersion1s[i].TrackInterfaces[ci].TrackName = types.StringNull() + } + if value := cr.Get("priority-decrement"); value.Exists() && !data.GroupNumberVersion1s[i].TrackInterfaces[ci].PriorityDecrement.IsNull() { + data.GroupNumberVersion1s[i].TrackInterfaces[ci].PriorityDecrement = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].TrackInterfaces[ci].PriorityDecrement = types.Int64Null() + } + } + for ci := range data.GroupNumberVersion1s[i].TrackObjects { + keys := [...]string{"object-name"} + keyValues := [...]string{data.GroupNumberVersion1s[i].TrackObjects[ci].ObjectName.ValueString()} + + var cr gjson.Result + r.Get("track-objects.track-object").ForEach( + func(_, v gjson.Result) bool { + found := false + for ik := range keys { + if v.Get(keys[ik]).String() == keyValues[ik] { + found = true + continue + } + found = false + break + } + if found { + cr = v + return false + } + return true + }, + ) + if value := cr.Get("object-name"); value.Exists() && !data.GroupNumberVersion1s[i].TrackObjects[ci].ObjectName.IsNull() { + data.GroupNumberVersion1s[i].TrackObjects[ci].ObjectName = types.StringValue(value.String()) + } else { + data.GroupNumberVersion1s[i].TrackObjects[ci].ObjectName = types.StringNull() + } + if value := cr.Get("priority-decrement"); value.Exists() && !data.GroupNumberVersion1s[i].TrackObjects[ci].PriorityDecrement.IsNull() { + data.GroupNumberVersion1s[i].TrackObjects[ci].PriorityDecrement = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion1s[i].TrackObjects[ci].PriorityDecrement = types.Int64Null() + } + } + } + for i := range data.GroupNumberVersion2s { + keys := [...]string{"group-number-version-2-id"} + keyValues := [...]string{strconv.FormatInt(data.GroupNumberVersion2s[i].GroupNumberVersion2Id.ValueInt64(), 10)} + + var r gjson.Result + gjson.GetBytes(res, "group-number-version-2s.group-number-version-2").ForEach( + func(_, v gjson.Result) bool { + found := false + for ik := range keys { + if v.Get(keys[ik]).String() == keyValues[ik] { + found = true + continue + } + found = false + break + } + if found { + r = v + return false + } + return true + }, + ) + if value := r.Get("group-number-version-2-id"); value.Exists() && !data.GroupNumberVersion2s[i].GroupNumberVersion2Id.IsNull() { + data.GroupNumberVersion2s[i].GroupNumberVersion2Id = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].GroupNumberVersion2Id = types.Int64Null() + } + if value := r.Get("address.ipv4-address"); value.Exists() && !data.GroupNumberVersion2s[i].AddressIpv4Address.IsNull() { + data.GroupNumberVersion2s[i].AddressIpv4Address = types.StringValue(value.String()) + } else { + data.GroupNumberVersion2s[i].AddressIpv4Address = types.StringNull() + } + if value := r.Get("address.learn"); !data.GroupNumberVersion2s[i].AddressLearn.IsNull() { + if value.Exists() { + data.GroupNumberVersion2s[i].AddressLearn = types.BoolValue(true) + } else { + data.GroupNumberVersion2s[i].AddressLearn = types.BoolValue(false) + } + } else { + data.GroupNumberVersion2s[i].AddressLearn = types.BoolNull() + } + if value := r.Get("priority"); value.Exists() && !data.GroupNumberVersion2s[i].Priority.IsNull() { + data.GroupNumberVersion2s[i].Priority = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].Priority = types.Int64Null() + } + if value := r.Get("mac-address"); value.Exists() && !data.GroupNumberVersion2s[i].MacAddress.IsNull() { + data.GroupNumberVersion2s[i].MacAddress = types.StringValue(value.String()) + } else { + data.GroupNumberVersion2s[i].MacAddress = types.StringNull() + } + if value := r.Get("name"); value.Exists() && !data.GroupNumberVersion2s[i].Name.IsNull() { + data.GroupNumberVersion2s[i].Name = types.StringValue(value.String()) + } else { + data.GroupNumberVersion2s[i].Name = types.StringNull() + } + if value := r.Get("preempt.delay"); value.Exists() && !data.GroupNumberVersion2s[i].PreemptDelay.IsNull() { + data.GroupNumberVersion2s[i].PreemptDelay = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].PreemptDelay = types.Int64Null() + } + if value := r.Get("timers.msec"); value.Exists() && !data.GroupNumberVersion2s[i].TimersMsec.IsNull() { + data.GroupNumberVersion2s[i].TimersMsec = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].TimersMsec = types.Int64Null() + } + if value := r.Get("timers.msec2"); value.Exists() && !data.GroupNumberVersion2s[i].TimersMsec2.IsNull() { + data.GroupNumberVersion2s[i].TimersMsec2 = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].TimersMsec2 = types.Int64Null() + } + if value := r.Get("timers.hold-time"); value.Exists() && !data.GroupNumberVersion2s[i].TimersHoldTime.IsNull() { + data.GroupNumberVersion2s[i].TimersHoldTime = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].TimersHoldTime = types.Int64Null() + } + if value := r.Get("timers.hold-time2"); value.Exists() && !data.GroupNumberVersion2s[i].TimersHoldTime2.IsNull() { + data.GroupNumberVersion2s[i].TimersHoldTime2 = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].TimersHoldTime2 = types.Int64Null() + } + if value := r.Get("bfd.fast-detect.peer.ipv4"); value.Exists() && !data.GroupNumberVersion2s[i].BfdFastDetectPeerIpv4.IsNull() { + data.GroupNumberVersion2s[i].BfdFastDetectPeerIpv4 = types.StringValue(value.String()) + } else { + data.GroupNumberVersion2s[i].BfdFastDetectPeerIpv4 = types.StringNull() + } + if value := r.Get("bfd.fast-detect.peer.interface"); value.Exists() && !data.GroupNumberVersion2s[i].BfdFastDetectPeerInterface.IsNull() { + data.GroupNumberVersion2s[i].BfdFastDetectPeerInterface = types.StringValue(value.String()) + } else { + data.GroupNumberVersion2s[i].BfdFastDetectPeerInterface = types.StringNull() + } + for ci := range data.GroupNumberVersion2s[i].SecondaryIpv4Addresses { + keys := [...]string{"address"} + keyValues := [...]string{data.GroupNumberVersion2s[i].SecondaryIpv4Addresses[ci].Address.ValueString()} + + var cr gjson.Result + r.Get("address.secondary-ipv4-addresses.secondary-ipv4-address").ForEach( + func(_, v gjson.Result) bool { + found := false + for ik := range keys { + if v.Get(keys[ik]).String() == keyValues[ik] { + found = true + continue + } + found = false + break + } + if found { + cr = v + return false + } + return true + }, + ) + if value := cr.Get("address"); value.Exists() && !data.GroupNumberVersion2s[i].SecondaryIpv4Addresses[ci].Address.IsNull() { + data.GroupNumberVersion2s[i].SecondaryIpv4Addresses[ci].Address = types.StringValue(value.String()) + } else { + data.GroupNumberVersion2s[i].SecondaryIpv4Addresses[ci].Address = types.StringNull() + } + } + for ci := range data.GroupNumberVersion2s[i].TrackInterfaces { + keys := [...]string{"track-name"} + keyValues := [...]string{data.GroupNumberVersion2s[i].TrackInterfaces[ci].TrackName.ValueString()} + + var cr gjson.Result + r.Get("track-interfaces.track-interface").ForEach( + func(_, v gjson.Result) bool { + found := false + for ik := range keys { + if v.Get(keys[ik]).String() == keyValues[ik] { + found = true + continue + } + found = false + break + } + if found { + cr = v + return false + } + return true + }, + ) + if value := cr.Get("track-name"); value.Exists() && !data.GroupNumberVersion2s[i].TrackInterfaces[ci].TrackName.IsNull() { + data.GroupNumberVersion2s[i].TrackInterfaces[ci].TrackName = types.StringValue(value.String()) + } else { + data.GroupNumberVersion2s[i].TrackInterfaces[ci].TrackName = types.StringNull() + } + if value := cr.Get("priority-decrement"); value.Exists() && !data.GroupNumberVersion2s[i].TrackInterfaces[ci].PriorityDecrement.IsNull() { + data.GroupNumberVersion2s[i].TrackInterfaces[ci].PriorityDecrement = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].TrackInterfaces[ci].PriorityDecrement = types.Int64Null() + } + } + for ci := range data.GroupNumberVersion2s[i].TrackObjects { + keys := [...]string{"object-name"} + keyValues := [...]string{data.GroupNumberVersion2s[i].TrackObjects[ci].ObjectName.ValueString()} + + var cr gjson.Result + r.Get("track-objects.track-object").ForEach( + func(_, v gjson.Result) bool { + found := false + for ik := range keys { + if v.Get(keys[ik]).String() == keyValues[ik] { + found = true + continue + } + found = false + break + } + if found { + cr = v + return false + } + return true + }, + ) + if value := cr.Get("object-name"); value.Exists() && !data.GroupNumberVersion2s[i].TrackObjects[ci].ObjectName.IsNull() { + data.GroupNumberVersion2s[i].TrackObjects[ci].ObjectName = types.StringValue(value.String()) + } else { + data.GroupNumberVersion2s[i].TrackObjects[ci].ObjectName = types.StringNull() + } + if value := cr.Get("priority-decrement"); value.Exists() && !data.GroupNumberVersion2s[i].TrackObjects[ci].PriorityDecrement.IsNull() { + data.GroupNumberVersion2s[i].TrackObjects[ci].PriorityDecrement = types.Int64Value(value.Int()) + } else { + data.GroupNumberVersion2s[i].TrackObjects[ci].PriorityDecrement = types.Int64Null() + } + } + } +} + +func (data *RouterHSRPInterfaceAddressFamilyIPv4Data) fromBody(ctx context.Context, res []byte) { + if value := gjson.GetBytes(res, "group-number-version-1s.group-number-version-1"); value.Exists() { + data.GroupNumberVersion1s = make([]RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1s, 0) + value.ForEach(func(k, v gjson.Result) bool { + item := RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1s{} + if cValue := v.Get("group-number-version-1-id"); cValue.Exists() { + item.GroupNumberVersion1Id = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("address.ipv4-address"); cValue.Exists() { + item.AddressIpv4Address = types.StringValue(cValue.String()) + } + if cValue := v.Get("address.learn"); cValue.Exists() { + item.AddressLearn = types.BoolValue(true) + } else { + item.AddressLearn = types.BoolValue(false) + } + if cValue := v.Get("priority"); cValue.Exists() { + item.Priority = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("mac-address"); cValue.Exists() { + item.MacAddress = types.StringValue(cValue.String()) + } + if cValue := v.Get("name"); cValue.Exists() { + item.Name = types.StringValue(cValue.String()) + } + if cValue := v.Get("preempt.delay"); cValue.Exists() { + item.PreemptDelay = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("timers.msec"); cValue.Exists() { + item.TimersMsec = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("timers.msec2"); cValue.Exists() { + item.TimersMsec2 = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("timers.hold-time"); cValue.Exists() { + item.TimersHoldTime = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("timers.hold-time2"); cValue.Exists() { + item.TimersHoldTime2 = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("bfd.fast-detect.peer.ipv4"); cValue.Exists() { + item.BfdFastDetectPeerIpv4 = types.StringValue(cValue.String()) + } + if cValue := v.Get("bfd.fast-detect.peer.interface"); cValue.Exists() { + item.BfdFastDetectPeerInterface = types.StringValue(cValue.String()) + } + if cValue := v.Get("address.secondary-ipv4-addresses.secondary-ipv4-address"); cValue.Exists() { + item.SecondaryIpv4Addresses = make([]RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sSecondaryIpv4Addresses, 0) + cValue.ForEach(func(ck, cv gjson.Result) bool { + cItem := RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sSecondaryIpv4Addresses{} + if ccValue := cv.Get("address"); ccValue.Exists() { + cItem.Address = types.StringValue(ccValue.String()) + } + item.SecondaryIpv4Addresses = append(item.SecondaryIpv4Addresses, cItem) + return true + }) + } + if cValue := v.Get("track-interfaces.track-interface"); cValue.Exists() { + item.TrackInterfaces = make([]RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sTrackInterfaces, 0) + cValue.ForEach(func(ck, cv gjson.Result) bool { + cItem := RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sTrackInterfaces{} + if ccValue := cv.Get("track-name"); ccValue.Exists() { + cItem.TrackName = types.StringValue(ccValue.String()) + } + if ccValue := cv.Get("priority-decrement"); ccValue.Exists() { + cItem.PriorityDecrement = types.Int64Value(ccValue.Int()) + } + item.TrackInterfaces = append(item.TrackInterfaces, cItem) + return true + }) + } + if cValue := v.Get("track-objects.track-object"); cValue.Exists() { + item.TrackObjects = make([]RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sTrackObjects, 0) + cValue.ForEach(func(ck, cv gjson.Result) bool { + cItem := RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion1sTrackObjects{} + if ccValue := cv.Get("object-name"); ccValue.Exists() { + cItem.ObjectName = types.StringValue(ccValue.String()) + } + if ccValue := cv.Get("priority-decrement"); ccValue.Exists() { + cItem.PriorityDecrement = types.Int64Value(ccValue.Int()) + } + item.TrackObjects = append(item.TrackObjects, cItem) + return true + }) + } + data.GroupNumberVersion1s = append(data.GroupNumberVersion1s, item) + return true + }) + } + if value := gjson.GetBytes(res, "group-number-version-2s.group-number-version-2"); value.Exists() { + data.GroupNumberVersion2s = make([]RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2s, 0) + value.ForEach(func(k, v gjson.Result) bool { + item := RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2s{} + if cValue := v.Get("group-number-version-2-id"); cValue.Exists() { + item.GroupNumberVersion2Id = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("address.ipv4-address"); cValue.Exists() { + item.AddressIpv4Address = types.StringValue(cValue.String()) + } + if cValue := v.Get("address.learn"); cValue.Exists() { + item.AddressLearn = types.BoolValue(true) + } else { + item.AddressLearn = types.BoolValue(false) + } + if cValue := v.Get("priority"); cValue.Exists() { + item.Priority = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("mac-address"); cValue.Exists() { + item.MacAddress = types.StringValue(cValue.String()) + } + if cValue := v.Get("name"); cValue.Exists() { + item.Name = types.StringValue(cValue.String()) + } + if cValue := v.Get("preempt.delay"); cValue.Exists() { + item.PreemptDelay = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("timers.msec"); cValue.Exists() { + item.TimersMsec = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("timers.msec2"); cValue.Exists() { + item.TimersMsec2 = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("timers.hold-time"); cValue.Exists() { + item.TimersHoldTime = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("timers.hold-time2"); cValue.Exists() { + item.TimersHoldTime2 = types.Int64Value(cValue.Int()) + } + if cValue := v.Get("bfd.fast-detect.peer.ipv4"); cValue.Exists() { + item.BfdFastDetectPeerIpv4 = types.StringValue(cValue.String()) + } + if cValue := v.Get("bfd.fast-detect.peer.interface"); cValue.Exists() { + item.BfdFastDetectPeerInterface = types.StringValue(cValue.String()) + } + if cValue := v.Get("address.secondary-ipv4-addresses.secondary-ipv4-address"); cValue.Exists() { + item.SecondaryIpv4Addresses = make([]RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sSecondaryIpv4Addresses, 0) + cValue.ForEach(func(ck, cv gjson.Result) bool { + cItem := RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sSecondaryIpv4Addresses{} + if ccValue := cv.Get("address"); ccValue.Exists() { + cItem.Address = types.StringValue(ccValue.String()) + } + item.SecondaryIpv4Addresses = append(item.SecondaryIpv4Addresses, cItem) + return true + }) + } + if cValue := v.Get("track-interfaces.track-interface"); cValue.Exists() { + item.TrackInterfaces = make([]RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sTrackInterfaces, 0) + cValue.ForEach(func(ck, cv gjson.Result) bool { + cItem := RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sTrackInterfaces{} + if ccValue := cv.Get("track-name"); ccValue.Exists() { + cItem.TrackName = types.StringValue(ccValue.String()) + } + if ccValue := cv.Get("priority-decrement"); ccValue.Exists() { + cItem.PriorityDecrement = types.Int64Value(ccValue.Int()) + } + item.TrackInterfaces = append(item.TrackInterfaces, cItem) + return true + }) + } + if cValue := v.Get("track-objects.track-object"); cValue.Exists() { + item.TrackObjects = make([]RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sTrackObjects, 0) + cValue.ForEach(func(ck, cv gjson.Result) bool { + cItem := RouterHSRPInterfaceAddressFamilyIPv4GroupNumberVersion2sTrackObjects{} + if ccValue := cv.Get("object-name"); ccValue.Exists() { + cItem.ObjectName = types.StringValue(ccValue.String()) + } + if ccValue := cv.Get("priority-decrement"); ccValue.Exists() { + cItem.PriorityDecrement = types.Int64Value(ccValue.Int()) + } + item.TrackObjects = append(item.TrackObjects, cItem) + return true + }) + } + data.GroupNumberVersion2s = append(data.GroupNumberVersion2s, item) + return true + }) + } +} + +func (data *RouterHSRPInterfaceAddressFamilyIPv4) getDeletedListItems(ctx context.Context, state RouterHSRPInterfaceAddressFamilyIPv4) []string { + deletedListItems := make([]string, 0) + for i := range state.GroupNumberVersion1s { + keys := [...]string{"group-number-version-1-id"} + stateKeyValues := [...]string{strconv.FormatInt(state.GroupNumberVersion1s[i].GroupNumberVersion1Id.ValueInt64(), 10)} + + emptyKeys := true + if !reflect.ValueOf(state.GroupNumberVersion1s[i].GroupNumberVersion1Id.ValueInt64()).IsZero() { + emptyKeys = false + } + if emptyKeys { + continue + } + + found := false + for j := range data.GroupNumberVersion1s { + found = true + if state.GroupNumberVersion1s[i].GroupNumberVersion1Id.ValueInt64() != data.GroupNumberVersion1s[j].GroupNumberVersion1Id.ValueInt64() { + found = false + } + if found { + for ci := range state.GroupNumberVersion1s[i].SecondaryIpv4Addresses { + ckeys := [...]string{"address"} + cstateKeyValues := [...]string{state.GroupNumberVersion1s[i].SecondaryIpv4Addresses[ci].Address.ValueString()} + + cemptyKeys := true + if !reflect.ValueOf(state.GroupNumberVersion1s[i].SecondaryIpv4Addresses[ci].Address.ValueString()).IsZero() { + cemptyKeys = false + } + if cemptyKeys { + continue + } + + found := false + for cj := range data.GroupNumberVersion1s[j].SecondaryIpv4Addresses { + found = true + if state.GroupNumberVersion1s[i].SecondaryIpv4Addresses[ci].Address.ValueString() != data.GroupNumberVersion1s[j].SecondaryIpv4Addresses[cj].Address.ValueString() { + found = false + } + if found { + break + } + } + if !found { + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + stateKeyValues[ki] + "]" + } + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + cstateKeyValues[cki] + "]" + } + deletedListItems = append(deletedListItems, fmt.Sprintf("%v/group-number-version-1s/group-number-version-1%v/address/secondary-ipv4-addresses/secondary-ipv4-address%v", state.getPath(), keyString, ckeyString)) + } + } + for ci := range state.GroupNumberVersion1s[i].TrackInterfaces { + ckeys := [...]string{"track-name"} + cstateKeyValues := [...]string{state.GroupNumberVersion1s[i].TrackInterfaces[ci].TrackName.ValueString()} + + cemptyKeys := true + if !reflect.ValueOf(state.GroupNumberVersion1s[i].TrackInterfaces[ci].TrackName.ValueString()).IsZero() { + cemptyKeys = false + } + if cemptyKeys { + continue + } + + found := false + for cj := range data.GroupNumberVersion1s[j].TrackInterfaces { + found = true + if state.GroupNumberVersion1s[i].TrackInterfaces[ci].TrackName.ValueString() != data.GroupNumberVersion1s[j].TrackInterfaces[cj].TrackName.ValueString() { + found = false + } + if found { + break + } + } + if !found { + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + stateKeyValues[ki] + "]" + } + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + cstateKeyValues[cki] + "]" + } + deletedListItems = append(deletedListItems, fmt.Sprintf("%v/group-number-version-1s/group-number-version-1%v/track-interfaces/track-interface%v", state.getPath(), keyString, ckeyString)) + } + } + for ci := range state.GroupNumberVersion1s[i].TrackObjects { + ckeys := [...]string{"object-name"} + cstateKeyValues := [...]string{state.GroupNumberVersion1s[i].TrackObjects[ci].ObjectName.ValueString()} + + cemptyKeys := true + if !reflect.ValueOf(state.GroupNumberVersion1s[i].TrackObjects[ci].ObjectName.ValueString()).IsZero() { + cemptyKeys = false + } + if cemptyKeys { + continue + } + + found := false + for cj := range data.GroupNumberVersion1s[j].TrackObjects { + found = true + if state.GroupNumberVersion1s[i].TrackObjects[ci].ObjectName.ValueString() != data.GroupNumberVersion1s[j].TrackObjects[cj].ObjectName.ValueString() { + found = false + } + if found { + break + } + } + if !found { + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + stateKeyValues[ki] + "]" + } + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + cstateKeyValues[cki] + "]" + } + deletedListItems = append(deletedListItems, fmt.Sprintf("%v/group-number-version-1s/group-number-version-1%v/track-objects/track-object%v", state.getPath(), keyString, ckeyString)) + } + } + break + } + } + if !found { + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + stateKeyValues[ki] + "]" + } + deletedListItems = append(deletedListItems, fmt.Sprintf("%v/group-number-version-1s/group-number-version-1%v", state.getPath(), keyString)) + } + } + for i := range state.GroupNumberVersion2s { + keys := [...]string{"group-number-version-2-id"} + stateKeyValues := [...]string{strconv.FormatInt(state.GroupNumberVersion2s[i].GroupNumberVersion2Id.ValueInt64(), 10)} + + emptyKeys := true + if !reflect.ValueOf(state.GroupNumberVersion2s[i].GroupNumberVersion2Id.ValueInt64()).IsZero() { + emptyKeys = false + } + if emptyKeys { + continue + } + + found := false + for j := range data.GroupNumberVersion2s { + found = true + if state.GroupNumberVersion2s[i].GroupNumberVersion2Id.ValueInt64() != data.GroupNumberVersion2s[j].GroupNumberVersion2Id.ValueInt64() { + found = false + } + if found { + for ci := range state.GroupNumberVersion2s[i].SecondaryIpv4Addresses { + ckeys := [...]string{"address"} + cstateKeyValues := [...]string{state.GroupNumberVersion2s[i].SecondaryIpv4Addresses[ci].Address.ValueString()} + + cemptyKeys := true + if !reflect.ValueOf(state.GroupNumberVersion2s[i].SecondaryIpv4Addresses[ci].Address.ValueString()).IsZero() { + cemptyKeys = false + } + if cemptyKeys { + continue + } + + found := false + for cj := range data.GroupNumberVersion2s[j].SecondaryIpv4Addresses { + found = true + if state.GroupNumberVersion2s[i].SecondaryIpv4Addresses[ci].Address.ValueString() != data.GroupNumberVersion2s[j].SecondaryIpv4Addresses[cj].Address.ValueString() { + found = false + } + if found { + break + } + } + if !found { + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + stateKeyValues[ki] + "]" + } + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + cstateKeyValues[cki] + "]" + } + deletedListItems = append(deletedListItems, fmt.Sprintf("%v/group-number-version-2s/group-number-version-2%v/address/secondary-ipv4-addresses/secondary-ipv4-address%v", state.getPath(), keyString, ckeyString)) + } + } + for ci := range state.GroupNumberVersion2s[i].TrackInterfaces { + ckeys := [...]string{"track-name"} + cstateKeyValues := [...]string{state.GroupNumberVersion2s[i].TrackInterfaces[ci].TrackName.ValueString()} + + cemptyKeys := true + if !reflect.ValueOf(state.GroupNumberVersion2s[i].TrackInterfaces[ci].TrackName.ValueString()).IsZero() { + cemptyKeys = false + } + if cemptyKeys { + continue + } + + found := false + for cj := range data.GroupNumberVersion2s[j].TrackInterfaces { + found = true + if state.GroupNumberVersion2s[i].TrackInterfaces[ci].TrackName.ValueString() != data.GroupNumberVersion2s[j].TrackInterfaces[cj].TrackName.ValueString() { + found = false + } + if found { + break + } + } + if !found { + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + stateKeyValues[ki] + "]" + } + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + cstateKeyValues[cki] + "]" + } + deletedListItems = append(deletedListItems, fmt.Sprintf("%v/group-number-version-2s/group-number-version-2%v/track-interfaces/track-interface%v", state.getPath(), keyString, ckeyString)) + } + } + for ci := range state.GroupNumberVersion2s[i].TrackObjects { + ckeys := [...]string{"object-name"} + cstateKeyValues := [...]string{state.GroupNumberVersion2s[i].TrackObjects[ci].ObjectName.ValueString()} + + cemptyKeys := true + if !reflect.ValueOf(state.GroupNumberVersion2s[i].TrackObjects[ci].ObjectName.ValueString()).IsZero() { + cemptyKeys = false + } + if cemptyKeys { + continue + } + + found := false + for cj := range data.GroupNumberVersion2s[j].TrackObjects { + found = true + if state.GroupNumberVersion2s[i].TrackObjects[ci].ObjectName.ValueString() != data.GroupNumberVersion2s[j].TrackObjects[cj].ObjectName.ValueString() { + found = false + } + if found { + break + } + } + if !found { + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + stateKeyValues[ki] + "]" + } + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + cstateKeyValues[cki] + "]" + } + deletedListItems = append(deletedListItems, fmt.Sprintf("%v/group-number-version-2s/group-number-version-2%v/track-objects/track-object%v", state.getPath(), keyString, ckeyString)) + } + } + break + } + } + if !found { + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + stateKeyValues[ki] + "]" + } + deletedListItems = append(deletedListItems, fmt.Sprintf("%v/group-number-version-2s/group-number-version-2%v", state.getPath(), keyString)) + } + } + return deletedListItems +} + +func (data *RouterHSRPInterfaceAddressFamilyIPv4) getEmptyLeafsDelete(ctx context.Context) []string { + emptyLeafsDelete := make([]string, 0) + for i := range data.GroupNumberVersion1s { + keys := [...]string{"group-number-version-1-id"} + keyValues := [...]string{strconv.FormatInt(data.GroupNumberVersion1s[i].GroupNumberVersion1Id.ValueInt64(), 10)} + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + keyValues[ki] + "]" + } + if !data.GroupNumberVersion1s[i].AddressLearn.IsNull() && !data.GroupNumberVersion1s[i].AddressLearn.ValueBool() { + emptyLeafsDelete = append(emptyLeafsDelete, fmt.Sprintf("%v/group-number-version-1s/group-number-version-1%v/address/learn", data.getPath(), keyString)) + } + for ci := range data.GroupNumberVersion1s[i].SecondaryIpv4Addresses { + ckeys := [...]string{"address"} + ckeyValues := [...]string{data.GroupNumberVersion1s[i].SecondaryIpv4Addresses[ci].Address.ValueString()} + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + ckeyValues[cki] + "]" + } + } + for ci := range data.GroupNumberVersion1s[i].TrackInterfaces { + ckeys := [...]string{"track-name"} + ckeyValues := [...]string{data.GroupNumberVersion1s[i].TrackInterfaces[ci].TrackName.ValueString()} + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + ckeyValues[cki] + "]" + } + } + for ci := range data.GroupNumberVersion1s[i].TrackObjects { + ckeys := [...]string{"object-name"} + ckeyValues := [...]string{data.GroupNumberVersion1s[i].TrackObjects[ci].ObjectName.ValueString()} + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + ckeyValues[cki] + "]" + } + } + } + for i := range data.GroupNumberVersion2s { + keys := [...]string{"group-number-version-2-id"} + keyValues := [...]string{strconv.FormatInt(data.GroupNumberVersion2s[i].GroupNumberVersion2Id.ValueInt64(), 10)} + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + keyValues[ki] + "]" + } + if !data.GroupNumberVersion2s[i].AddressLearn.IsNull() && !data.GroupNumberVersion2s[i].AddressLearn.ValueBool() { + emptyLeafsDelete = append(emptyLeafsDelete, fmt.Sprintf("%v/group-number-version-2s/group-number-version-2%v/address/learn", data.getPath(), keyString)) + } + for ci := range data.GroupNumberVersion2s[i].SecondaryIpv4Addresses { + ckeys := [...]string{"address"} + ckeyValues := [...]string{data.GroupNumberVersion2s[i].SecondaryIpv4Addresses[ci].Address.ValueString()} + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + ckeyValues[cki] + "]" + } + } + for ci := range data.GroupNumberVersion2s[i].TrackInterfaces { + ckeys := [...]string{"track-name"} + ckeyValues := [...]string{data.GroupNumberVersion2s[i].TrackInterfaces[ci].TrackName.ValueString()} + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + ckeyValues[cki] + "]" + } + } + for ci := range data.GroupNumberVersion2s[i].TrackObjects { + ckeys := [...]string{"object-name"} + ckeyValues := [...]string{data.GroupNumberVersion2s[i].TrackObjects[ci].ObjectName.ValueString()} + ckeyString := "" + for cki := range ckeys { + ckeyString += "[" + ckeys[cki] + "=" + ckeyValues[cki] + "]" + } + } + } + return emptyLeafsDelete +} + +func (data *RouterHSRPInterfaceAddressFamilyIPv4) getDeletePaths(ctx context.Context) []string { + var deletePaths []string + for i := range data.GroupNumberVersion1s { + keys := [...]string{"group-number-version-1-id"} + keyValues := [...]string{strconv.FormatInt(data.GroupNumberVersion1s[i].GroupNumberVersion1Id.ValueInt64(), 10)} + + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + keyValues[ki] + "]" + } + deletePaths = append(deletePaths, fmt.Sprintf("%v/group-number-version-1s/group-number-version-1%v", data.getPath(), keyString)) + } + for i := range data.GroupNumberVersion2s { + keys := [...]string{"group-number-version-2-id"} + keyValues := [...]string{strconv.FormatInt(data.GroupNumberVersion2s[i].GroupNumberVersion2Id.ValueInt64(), 10)} + + keyString := "" + for ki := range keys { + keyString += "[" + keys[ki] + "=" + keyValues[ki] + "]" + } + deletePaths = append(deletePaths, fmt.Sprintf("%v/group-number-version-2s/group-number-version-2%v", data.getPath(), keyString)) + } + return deletePaths +} diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 07dad5e1..64750c05 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -376,6 +376,8 @@ func (p *iosxrProvider) Resources(ctx context.Context) []func() resource.Resourc NewRouterBGPVRFResource, NewRouterBGPVRFAddressFamilyResource, NewRouterBGPVRFNeighborAddressFamilyResource, + NewRouterHSRPInterfaceResource, + NewRouterHSRPInterfaceAddressFamilyIPv4Resource, NewRouterISISResource, NewRouterISISAddressFamilyResource, NewRouterISISInterfaceResource, @@ -470,6 +472,8 @@ func (p *iosxrProvider) DataSources(ctx context.Context) []func() datasource.Dat NewRouterBGPVRFDataSource, NewRouterBGPVRFAddressFamilyDataSource, NewRouterBGPVRFNeighborAddressFamilyDataSource, + NewRouterHSRPInterfaceDataSource, + NewRouterHSRPInterfaceAddressFamilyIPv4DataSource, NewRouterISISDataSource, NewRouterISISAddressFamilyDataSource, NewRouterISISInterfaceDataSource, diff --git a/internal/provider/resource_iosxr_router_hsrp_interface.go b/internal/provider/resource_iosxr_router_hsrp_interface.go new file mode 100644 index 00000000..82d18177 --- /dev/null +++ b/internal/provider/resource_iosxr_router_hsrp_interface.go @@ -0,0 +1,301 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "context" + "fmt" + "regexp" + + "github.com/CiscoDevNet/terraform-provider-iosxr/internal/provider/client" + "github.com/CiscoDevNet/terraform-provider-iosxr/internal/provider/helpers" + "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" + "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" + "github.com/hashicorp/terraform-plugin-framework/path" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-log/tflog" +) + +func NewRouterHSRPInterfaceResource() resource.Resource { + return &RouterHSRPInterfaceResource{} +} + +type RouterHSRPInterfaceResource struct { + client *client.Client +} + +func (r *RouterHSRPInterfaceResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_router_hsrp_interface" +} + +func (r *RouterHSRPInterfaceResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) { + resp.Schema = schema.Schema{ + // This description is used by the documentation generator and the language server. + MarkdownDescription: "This resource can manage the Router HSRP Interface configuration.", + + Attributes: map[string]schema.Attribute{ + "device": schema.StringAttribute{ + MarkdownDescription: "A device name from the provider configuration.", + Optional: true, + }, + "id": schema.StringAttribute{ + MarkdownDescription: "The path of the object.", + Computed: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.UseStateForUnknown(), + }, + }, + "delete_mode": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Configure behavior when deleting/destroying the resource. Either delete the entire object (YANG container) being managed, or only delete the individual resource attributes configured explicitly and leave everything else as-is. Default value is `all`.").AddStringEnumDescription("all", "attributes").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.OneOf("all", "attributes"), + }, + }, + "interface_name": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("HSRP interface configuration subcommands").String, + Required: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`[a-zA-Z0-9.:_/-]+`), ""), + }, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + }, + "hsrp_use_bia": schema.BoolAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Use burned-in address").String, + Optional: true, + }, + "hsrp_redirects_disable": schema.BoolAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Disable HSRP filtered ICMP redirects").String, + Optional: true, + }, + "hsrp_delay_minimum": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Set minimum delay on every interface up event").AddIntegerRangeDescription(0, 10000).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(0, 10000), + }, + }, + "hsrp_delay_reload": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Set reload delay for first interface up event").AddIntegerRangeDescription(0, 10000).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(0, 10000), + }, + }, + "hsrp_bfd_minimum_interval": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Hello interval").AddIntegerRangeDescription(3, 30000).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(3, 30000), + }, + }, + "hsrp_bfd_multiplier": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Detect multiplier").AddIntegerRangeDescription(2, 50).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(2, 50), + }, + }, + "hsrp_mac_refresh": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("HSRP MGO subordinate MAC refresh rate").AddIntegerRangeDescription(0, 10000).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(0, 10000), + }, + }, + }, + } +} + +func (r *RouterHSRPInterfaceResource) Configure(_ context.Context, req resource.ConfigureRequest, _ *resource.ConfigureResponse) { + if req.ProviderData == nil { + return + } + + r.client = req.ProviderData.(*client.Client) +} + +func (r *RouterHSRPInterfaceResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + var plan RouterHSRPInterface + + // Read plan + diags := req.Plan.Get(ctx, &plan) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + var ops []client.SetOperation + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Create", plan.getPath())) + + // Create object + body := plan.toBody(ctx) + ops = append(ops, client.SetOperation{Path: plan.getPath(), Body: body, Operation: client.Update}) + + emptyLeafsDelete := plan.getEmptyLeafsDelete(ctx) + tflog.Debug(ctx, fmt.Sprintf("List of empty leafs to delete: %+v", emptyLeafsDelete)) + + for _, i := range emptyLeafsDelete { + ops = append(ops, client.SetOperation{Path: i, Body: "", Operation: client.Delete}) + } + + _, diags = r.client.Set(ctx, plan.Device.ValueString(), ops...) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + plan.Id = types.StringValue(plan.getPath()) + + tflog.Debug(ctx, fmt.Sprintf("%s: Create finished successfully", plan.getPath())) + + diags = resp.State.Set(ctx, &plan) + resp.Diagnostics.Append(diags...) +} + +func (r *RouterHSRPInterfaceResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + var state RouterHSRPInterface + + // Read state + diags := req.State.Get(ctx, &state) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Read", state.Id.ValueString())) + + getResp, diags := r.client.Get(ctx, state.Device.ValueString(), state.Id.ValueString()) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + state.updateFromBody(ctx, getResp.Notification[0].Update[0].Val.GetJsonIetfVal()) + + tflog.Debug(ctx, fmt.Sprintf("%s: Read finished successfully", state.Id.ValueString())) + + diags = resp.State.Set(ctx, &state) + resp.Diagnostics.Append(diags...) +} + +func (r *RouterHSRPInterfaceResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + var plan, state RouterHSRPInterface + + // Read plan + diags := req.Plan.Get(ctx, &plan) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + // Read state + diags = req.State.Get(ctx, &state) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + var ops []client.SetOperation + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Update", plan.Id.ValueString())) + + // Update object + body := plan.toBody(ctx) + ops = append(ops, client.SetOperation{Path: plan.getPath(), Body: body, Operation: client.Update}) + + deletedListItems := plan.getDeletedListItems(ctx, state) + tflog.Debug(ctx, fmt.Sprintf("List items to delete: %+v", deletedListItems)) + + for _, i := range deletedListItems { + ops = append(ops, client.SetOperation{Path: i, Body: "", Operation: client.Delete}) + } + + emptyLeafsDelete := plan.getEmptyLeafsDelete(ctx) + tflog.Debug(ctx, fmt.Sprintf("List of empty leafs to delete: %+v", emptyLeafsDelete)) + + for _, i := range emptyLeafsDelete { + ops = append(ops, client.SetOperation{Path: i, Body: "", Operation: client.Delete}) + } + + _, diags = r.client.Set(ctx, plan.Device.ValueString(), ops...) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Update finished successfully", plan.Id.ValueString())) + + diags = resp.State.Set(ctx, &plan) + resp.Diagnostics.Append(diags...) +} + +func (r *RouterHSRPInterfaceResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + var state RouterHSRPInterface + + // Read state + diags := req.State.Get(ctx, &state) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Delete", state.Id.ValueString())) + var ops []client.SetOperation + deleteMode := "all" + if state.DeleteMode.ValueString() == "all" { + deleteMode = "all" + } else if state.DeleteMode.ValueString() == "attributes" { + deleteMode = "attributes" + } + + if deleteMode == "all" { + ops = append(ops, client.SetOperation{Path: state.Id.ValueString(), Body: "", Operation: client.Delete}) + } else { + deletePaths := state.getDeletePaths(ctx) + tflog.Debug(ctx, fmt.Sprintf("Paths to delete: %+v", deletePaths)) + + for _, i := range deletePaths { + ops = append(ops, client.SetOperation{Path: i, Body: "", Operation: client.Delete}) + } + } + + _, diags = r.client.Set(ctx, state.Device.ValueString(), ops...) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Delete finished successfully", state.Id.ValueString())) + + resp.State.RemoveResource(ctx) +} + +func (r *RouterHSRPInterfaceResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { + resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp) +} diff --git a/internal/provider/resource_iosxr_router_hsrp_interface_address_family_ipv4.go b/internal/provider/resource_iosxr_router_hsrp_interface_address_family_ipv4.go new file mode 100644 index 00000000..5dc7b4cd --- /dev/null +++ b/internal/provider/resource_iosxr_router_hsrp_interface_address_family_ipv4.go @@ -0,0 +1,566 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "context" + "fmt" + "regexp" + + "github.com/CiscoDevNet/terraform-provider-iosxr/internal/provider/client" + "github.com/CiscoDevNet/terraform-provider-iosxr/internal/provider/helpers" + "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" + "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" + "github.com/hashicorp/terraform-plugin-framework/path" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-log/tflog" +) + +func NewRouterHSRPInterfaceAddressFamilyIPv4Resource() resource.Resource { + return &RouterHSRPInterfaceAddressFamilyIPv4Resource{} +} + +type RouterHSRPInterfaceAddressFamilyIPv4Resource struct { + client *client.Client +} + +func (r *RouterHSRPInterfaceAddressFamilyIPv4Resource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_router_hsrp_interface_address_family_ipv4" +} + +func (r *RouterHSRPInterfaceAddressFamilyIPv4Resource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) { + resp.Schema = schema.Schema{ + // This description is used by the documentation generator and the language server. + MarkdownDescription: "This resource can manage the Router HSRP Interface Address Family IPv4 configuration.", + + Attributes: map[string]schema.Attribute{ + "device": schema.StringAttribute{ + MarkdownDescription: "A device name from the provider configuration.", + Optional: true, + }, + "id": schema.StringAttribute{ + MarkdownDescription: "The path of the object.", + Computed: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.UseStateForUnknown(), + }, + }, + "interface_name": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("HSRP interface configuration subcommands").String, + Required: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`[a-zA-Z0-9.:_/-]+`), ""), + }, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + }, + "group_number_version_1s": schema.ListNestedAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("group number version 1").String, + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "group_number_version_1_id": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("group number version 1").AddIntegerRangeDescription(0, 255).String, + Required: true, + Validators: []validator.Int64{ + int64validator.Between(0, 255), + }, + }, + "address_ipv4_address": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Hot standby IP address").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?`), ""), + stringvalidator.RegexMatches(regexp.MustCompile(`[0-9\.]*`), ""), + }, + }, + "address_learn": schema.BoolAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Learn virtual IP address from peer").String, + Optional: true, + }, + "priority": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Priority level").AddIntegerRangeDescription(0, 255).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(0, 255), + }, + }, + "mac_address": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Use specified mac address for the virtual router").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}`), ""), + }, + }, + "name": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("MGO session name").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.LengthBetween(1, 800), + stringvalidator.RegexMatches(regexp.MustCompile(`[\w\-\.:,_@#%$\+=\|;]+`), ""), + }, + }, + "preempt_delay": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Wait before preempting").AddIntegerRangeDescription(0, 3600).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(0, 3600), + }, + }, + "timers_msec": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Specify hellotime in milliseconds").AddIntegerRangeDescription(100, 3000).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(100, 3000), + }, + }, + "timers_msec2": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Specify hold time in milliseconds").AddIntegerRangeDescription(100, 3000).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(100, 3000), + }, + }, + "timers_hold_time": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Hold time in seconds").AddIntegerRangeDescription(1, 255).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(1, 255), + }, + }, + "timers_hold_time2": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Hold time in seconds").AddIntegerRangeDescription(1, 255).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(1, 255), + }, + }, + "bfd_fast_detect_peer_ipv4": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("BFD peer interface IPv4 address").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?`), ""), + stringvalidator.RegexMatches(regexp.MustCompile(`[0-9\.]*`), ""), + }, + }, + "bfd_fast_detect_peer_interface": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Select an interface over which to run BFD").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`[a-zA-Z0-9.:_/-]+`), ""), + }, + }, + "secondary_ipv4_addresses": schema.ListNestedAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Set secondary hot standby IP address").String, + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "address": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Set secondary hot standby IP address").String, + Required: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?`), ""), + stringvalidator.RegexMatches(regexp.MustCompile(`[0-9\.]*`), ""), + }, + }, + }, + }, + }, + "track_interfaces": schema.ListNestedAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Configure tracking").String, + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "track_name": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Configure tracking").String, + Required: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`[a-zA-Z0-9.:_/-]+`), ""), + }, + }, + "priority_decrement": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Priority decrement").AddIntegerRangeDescription(1, 255).String, + Required: true, + Validators: []validator.Int64{ + int64validator.Between(1, 255), + }, + }, + }, + }, + }, + "track_objects": schema.ListNestedAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Object tracking").String, + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "object_name": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Object tracking").String, + Required: true, + Validators: []validator.String{ + stringvalidator.LengthBetween(1, 800), + stringvalidator.RegexMatches(regexp.MustCompile(`[\w\-\.:,_@#%$\+=\|;]+`), ""), + }, + }, + "priority_decrement": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Priority decrement").AddIntegerRangeDescription(1, 255).String, + Required: true, + Validators: []validator.Int64{ + int64validator.Between(1, 255), + }, + }, + }, + }, + }, + }, + }, + }, + "group_number_version_2s": schema.ListNestedAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("group number version 2").String, + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "group_number_version_2_id": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("group number version 2").AddIntegerRangeDescription(0, 4095).String, + Required: true, + Validators: []validator.Int64{ + int64validator.Between(0, 4095), + }, + }, + "address_ipv4_address": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Hot standby IP address").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?`), ""), + stringvalidator.RegexMatches(regexp.MustCompile(`[0-9\.]*`), ""), + }, + }, + "address_learn": schema.BoolAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Learn virtual IP address from peer").String, + Optional: true, + }, + "priority": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Priority level").AddIntegerRangeDescription(0, 255).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(0, 255), + }, + }, + "mac_address": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Use specified mac address for the virtual router").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}`), ""), + }, + }, + "name": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("MGO session name").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.LengthBetween(1, 800), + stringvalidator.RegexMatches(regexp.MustCompile(`[\w\-\.:,_@#%$\+=\|;]+`), ""), + }, + }, + "preempt_delay": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Wait before preempting").AddIntegerRangeDescription(0, 3600).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(0, 3600), + }, + }, + "timers_msec": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Specify hellotime in milliseconds").AddIntegerRangeDescription(100, 3000).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(100, 3000), + }, + }, + "timers_msec2": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Specify hold time in milliseconds").AddIntegerRangeDescription(100, 3000).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(100, 3000), + }, + }, + "timers_hold_time": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Hold time in seconds").AddIntegerRangeDescription(1, 255).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(1, 255), + }, + }, + "timers_hold_time2": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Hold time in seconds").AddIntegerRangeDescription(1, 255).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(1, 255), + }, + }, + "bfd_fast_detect_peer_ipv4": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("BFD peer interface IPv4 address").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?`), ""), + stringvalidator.RegexMatches(regexp.MustCompile(`[0-9\.]*`), ""), + }, + }, + "bfd_fast_detect_peer_interface": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Select an interface over which to run BFD").String, + Optional: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`[a-zA-Z0-9.:_/-]+`), ""), + }, + }, + "secondary_ipv4_addresses": schema.ListNestedAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Set secondary hot standby IP address").String, + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "address": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Set secondary hot standby IP address").String, + Required: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?`), ""), + stringvalidator.RegexMatches(regexp.MustCompile(`[0-9\.]*`), ""), + }, + }, + }, + }, + }, + "track_interfaces": schema.ListNestedAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Configure tracking").String, + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "track_name": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Configure tracking").String, + Required: true, + Validators: []validator.String{ + stringvalidator.RegexMatches(regexp.MustCompile(`[a-zA-Z0-9.:_/-]+`), ""), + }, + }, + "priority_decrement": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Priority decrement").AddIntegerRangeDescription(1, 255).String, + Required: true, + Validators: []validator.Int64{ + int64validator.Between(1, 255), + }, + }, + }, + }, + }, + "track_objects": schema.ListNestedAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Object tracking").String, + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "object_name": schema.StringAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Object tracking").String, + Required: true, + Validators: []validator.String{ + stringvalidator.LengthBetween(1, 800), + stringvalidator.RegexMatches(regexp.MustCompile(`[\w\-\.:,_@#%$\+=\|;]+`), ""), + }, + }, + "priority_decrement": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Priority decrement").AddIntegerRangeDescription(1, 255).String, + Required: true, + Validators: []validator.Int64{ + int64validator.Between(1, 255), + }, + }, + }, + }, + }, + }, + }, + }, + }, + } +} + +func (r *RouterHSRPInterfaceAddressFamilyIPv4Resource) Configure(_ context.Context, req resource.ConfigureRequest, _ *resource.ConfigureResponse) { + if req.ProviderData == nil { + return + } + + r.client = req.ProviderData.(*client.Client) +} + +func (r *RouterHSRPInterfaceAddressFamilyIPv4Resource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + var plan RouterHSRPInterfaceAddressFamilyIPv4 + + // Read plan + diags := req.Plan.Get(ctx, &plan) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + var ops []client.SetOperation + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Create", plan.getPath())) + + // Create object + body := plan.toBody(ctx) + ops = append(ops, client.SetOperation{Path: plan.getPath(), Body: body, Operation: client.Update}) + + emptyLeafsDelete := plan.getEmptyLeafsDelete(ctx) + tflog.Debug(ctx, fmt.Sprintf("List of empty leafs to delete: %+v", emptyLeafsDelete)) + + for _, i := range emptyLeafsDelete { + ops = append(ops, client.SetOperation{Path: i, Body: "", Operation: client.Delete}) + } + + _, diags = r.client.Set(ctx, plan.Device.ValueString(), ops...) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + plan.Id = types.StringValue(plan.getPath()) + + tflog.Debug(ctx, fmt.Sprintf("%s: Create finished successfully", plan.getPath())) + + diags = resp.State.Set(ctx, &plan) + resp.Diagnostics.Append(diags...) +} + +func (r *RouterHSRPInterfaceAddressFamilyIPv4Resource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + var state RouterHSRPInterfaceAddressFamilyIPv4 + + // Read state + diags := req.State.Get(ctx, &state) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Read", state.Id.ValueString())) + + getResp, diags := r.client.Get(ctx, state.Device.ValueString(), state.Id.ValueString()) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + state.updateFromBody(ctx, getResp.Notification[0].Update[0].Val.GetJsonIetfVal()) + + tflog.Debug(ctx, fmt.Sprintf("%s: Read finished successfully", state.Id.ValueString())) + + diags = resp.State.Set(ctx, &state) + resp.Diagnostics.Append(diags...) +} + +func (r *RouterHSRPInterfaceAddressFamilyIPv4Resource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + var plan, state RouterHSRPInterfaceAddressFamilyIPv4 + + // Read plan + diags := req.Plan.Get(ctx, &plan) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + // Read state + diags = req.State.Get(ctx, &state) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + var ops []client.SetOperation + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Update", plan.Id.ValueString())) + + // Update object + body := plan.toBody(ctx) + ops = append(ops, client.SetOperation{Path: plan.getPath(), Body: body, Operation: client.Update}) + + deletedListItems := plan.getDeletedListItems(ctx, state) + tflog.Debug(ctx, fmt.Sprintf("List items to delete: %+v", deletedListItems)) + + for _, i := range deletedListItems { + ops = append(ops, client.SetOperation{Path: i, Body: "", Operation: client.Delete}) + } + + emptyLeafsDelete := plan.getEmptyLeafsDelete(ctx) + tflog.Debug(ctx, fmt.Sprintf("List of empty leafs to delete: %+v", emptyLeafsDelete)) + + for _, i := range emptyLeafsDelete { + ops = append(ops, client.SetOperation{Path: i, Body: "", Operation: client.Delete}) + } + + _, diags = r.client.Set(ctx, plan.Device.ValueString(), ops...) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Update finished successfully", plan.Id.ValueString())) + + diags = resp.State.Set(ctx, &plan) + resp.Diagnostics.Append(diags...) +} + +func (r *RouterHSRPInterfaceAddressFamilyIPv4Resource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + var state RouterHSRPInterfaceAddressFamilyIPv4 + + // Read state + diags := req.State.Get(ctx, &state) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Delete", state.Id.ValueString())) + var ops []client.SetOperation + deleteMode := "all" + + if deleteMode == "all" { + ops = append(ops, client.SetOperation{Path: state.Id.ValueString(), Body: "", Operation: client.Delete}) + } else { + deletePaths := state.getDeletePaths(ctx) + tflog.Debug(ctx, fmt.Sprintf("Paths to delete: %+v", deletePaths)) + + for _, i := range deletePaths { + ops = append(ops, client.SetOperation{Path: i, Body: "", Operation: client.Delete}) + } + } + + _, diags = r.client.Set(ctx, state.Device.ValueString(), ops...) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Delete finished successfully", state.Id.ValueString())) + + resp.State.RemoveResource(ctx) +} + +func (r *RouterHSRPInterfaceAddressFamilyIPv4Resource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { + resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp) +} diff --git a/internal/provider/resource_iosxr_router_hsrp_interface_address_family_ipv4_test.go b/internal/provider/resource_iosxr_router_hsrp_interface_address_family_ipv4_test.go new file mode 100644 index 00000000..f8b07ff1 --- /dev/null +++ b/internal/provider/resource_iosxr_router_hsrp_interface_address_family_ipv4_test.go @@ -0,0 +1,123 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "os" + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" +) + +func TestAccIosxrRouterHSRPInterfaceAddressFamilyIPv4(t *testing.T) { + var checks []resource.TestCheckFunc + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.group_number_version_1_id", "123")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.address_ipv4_address", "22.22.1.1")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.address_learn", "false")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.priority", "124")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.name", "NAME11")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.preempt_delay", "3200")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.bfd_fast_detect_peer_ipv4", "44.44.4.4")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.bfd_fast_detect_peer_interface", "GigabitEthernet0/0/0/7")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.track_interfaces.0.track_name", "GigabitEthernet0/0/0/1")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.track_interfaces.0.priority_decrement", "166")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.track_objects.0.object_name", "OBJECT1")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_1s.0.track_objects.0.priority_decrement", "177")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.group_number_version_2_id", "2345")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.address_ipv4_address", "33.33.33.3")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.address_learn", "false")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.priority", "133")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.name", "NAME22")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.preempt_delay", "3100")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.bfd_fast_detect_peer_ipv4", "45.45.45.4")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.track_interfaces.0.track_name", "GigabitEthernet0/0/0/7")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.track_interfaces.0.priority_decrement", "66")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.track_objects.0.object_name", "OBJECT2")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface_address_family_ipv4.test", "group_number_version_2s.0.track_objects.0.priority_decrement", "77")) + var steps []resource.TestStep + if os.Getenv("SKIP_MINIMUM_TEST") == "" { + steps = append(steps, resource.TestStep{ + Config: testAccIosxrRouterHSRPInterfaceAddressFamilyIPv4Config_minimum(), + }) + } + steps = append(steps, resource.TestStep{ + Config: testAccIosxrRouterHSRPInterfaceAddressFamilyIPv4Config_all(), + Check: resource.ComposeTestCheckFunc(checks...), + }) + steps = append(steps, resource.TestStep{ + ResourceName: "iosxr_router_hsrp_interface_address_family_ipv4.test", + ImportState: true, + ImportStateId: "Cisco-IOS-XR-um-router-hsrp-cfg:router/hsrp/interfaces/interface[interface-name=GigabitEthernet0/0/0/1]/address-family/ipv4/hsrp", + }) + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: steps, + }) +} + +func testAccIosxrRouterHSRPInterfaceAddressFamilyIPv4Config_minimum() string { + config := `resource "iosxr_router_hsrp_interface_address_family_ipv4" "test" {` + "\n" + config += ` interface_name = "GigabitEthernet0/0/0/1"` + "\n" + config += `}` + "\n" + return config +} + +func testAccIosxrRouterHSRPInterfaceAddressFamilyIPv4Config_all() string { + config := `resource "iosxr_router_hsrp_interface_address_family_ipv4" "test" {` + "\n" + config += ` interface_name = "GigabitEthernet0/0/0/1"` + "\n" + config += ` group_number_version_1s = [{` + "\n" + config += ` group_number_version_1_id = 123` + "\n" + config += ` address_ipv4_address = "22.22.1.1"` + "\n" + config += ` address_learn = false` + "\n" + config += ` priority = 124` + "\n" + config += ` name = "NAME11"` + "\n" + config += ` preempt_delay = 3200` + "\n" + config += ` bfd_fast_detect_peer_ipv4 = "44.44.4.4"` + "\n" + config += ` bfd_fast_detect_peer_interface = "GigabitEthernet0/0/0/7"` + "\n" + config += ` track_interfaces = [{` + "\n" + config += ` track_name = "GigabitEthernet0/0/0/1"` + "\n" + config += ` priority_decrement = 166` + "\n" + config += ` }]` + "\n" + config += ` track_objects = [{` + "\n" + config += ` object_name = "OBJECT1"` + "\n" + config += ` priority_decrement = 177` + "\n" + config += ` }]` + "\n" + config += ` }]` + "\n" + config += ` group_number_version_2s = [{` + "\n" + config += ` group_number_version_2_id = 2345` + "\n" + config += ` address_ipv4_address = "33.33.33.3"` + "\n" + config += ` address_learn = false` + "\n" + config += ` priority = 133` + "\n" + config += ` name = "NAME22"` + "\n" + config += ` preempt_delay = 3100` + "\n" + config += ` bfd_fast_detect_peer_ipv4 = "45.45.45.4"` + "\n" + config += ` track_interfaces = [{` + "\n" + config += ` track_name = "GigabitEthernet0/0/0/7"` + "\n" + config += ` priority_decrement = 66` + "\n" + config += ` }]` + "\n" + config += ` track_objects = [{` + "\n" + config += ` object_name = "OBJECT2"` + "\n" + config += ` priority_decrement = 77` + "\n" + config += ` }]` + "\n" + config += ` }]` + "\n" + config += `}` + "\n" + return config +} diff --git a/internal/provider/resource_iosxr_router_hsrp_interface_test.go b/internal/provider/resource_iosxr_router_hsrp_interface_test.go new file mode 100644 index 00000000..1c0749e8 --- /dev/null +++ b/internal/provider/resource_iosxr_router_hsrp_interface_test.go @@ -0,0 +1,80 @@ +// Copyright © 2023 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by "gen/generator.go"; DO NOT EDIT. + +package provider + +import ( + "os" + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" +) + +func TestAccIosxrRouterHSRPInterface(t *testing.T) { + var checks []resource.TestCheckFunc + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface.test", "interface_name", "GigabitEthernet0/0/0/1")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface.test", "hsrp_use_bia", "true")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface.test", "hsrp_redirects_disable", "true")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface.test", "hsrp_delay_minimum", "500")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface.test", "hsrp_delay_reload", "700")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface.test", "hsrp_bfd_minimum_interval", "20000")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface.test", "hsrp_bfd_multiplier", "40")) + checks = append(checks, resource.TestCheckResourceAttr("iosxr_router_hsrp_interface.test", "hsrp_mac_refresh", "5000")) + var steps []resource.TestStep + if os.Getenv("SKIP_MINIMUM_TEST") == "" { + steps = append(steps, resource.TestStep{ + Config: testAccIosxrRouterHSRPInterfaceConfig_minimum(), + }) + } + steps = append(steps, resource.TestStep{ + Config: testAccIosxrRouterHSRPInterfaceConfig_all(), + Check: resource.ComposeTestCheckFunc(checks...), + }) + steps = append(steps, resource.TestStep{ + ResourceName: "iosxr_router_hsrp_interface.test", + ImportState: true, + ImportStateId: "Cisco-IOS-XR-um-router-hsrp-cfg:/router/hsrp/interfaces/interface[interface-name=GigabitEthernet0/0/0/1]", + }) + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: steps, + }) +} + +func testAccIosxrRouterHSRPInterfaceConfig_minimum() string { + config := `resource "iosxr_router_hsrp_interface" "test" {` + "\n" + config += ` interface_name = "GigabitEthernet0/0/0/1"` + "\n" + config += `}` + "\n" + return config +} + +func testAccIosxrRouterHSRPInterfaceConfig_all() string { + config := `resource "iosxr_router_hsrp_interface" "test" {` + "\n" + config += ` interface_name = "GigabitEthernet0/0/0/1"` + "\n" + config += ` hsrp_use_bia = true` + "\n" + config += ` hsrp_redirects_disable = true` + "\n" + config += ` hsrp_delay_minimum = 500` + "\n" + config += ` hsrp_delay_reload = 700` + "\n" + config += ` hsrp_bfd_minimum_interval = 20000` + "\n" + config += ` hsrp_bfd_multiplier = 40` + "\n" + config += ` hsrp_mac_refresh = 5000` + "\n" + config += `}` + "\n" + return config +} diff --git a/templates/guides/changelog.md.tmpl b/templates/guides/changelog.md.tmpl index 8183271f..cfbd060f 100644 --- a/templates/guides/changelog.md.tmpl +++ b/templates/guides/changelog.md.tmpl @@ -17,6 +17,9 @@ description: |- - Add `load_balancing_flow_src_dst_mac` and `load_balancing_flow_src_dst_ip` attributes to `iosxr_l2vpn` resource and data source - Add `iosxr_l2vpn_pw_class` resource and data source - Add `igp_sync_delay` and `label_local_allocate` attributes to `iosxr_mpls_ldp` resource and data source +- Add `iosxr_router_hsrp_interface` resource and data source +- Add `iosxr_router_hsrp_interface_address_family_ipv4` resource and data source + ## 0.2.3