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