Repository: ovh/terraform-provider-ovh

Issue:
[FEATURE] add ovh_domain_zone_record  data source
### Description

I want to import an existing domain configuration to Terraform. 
[List record API](https://eu.api.ovh.com/console/?section=%2Fdomain&branch=v1#get-/domain/zone/-zoneName-/record) provide a list of Domain Zone records numeric Ids.
This list isn't human readable.

To ease import of existing DNS records in terraform state, please add two data sources for domain_zone records:

1. `ovh_domain_zone_record_ids` to list ids.
2. `ovh_domain_zone_record` to get a specific record data (at least the `subDomain`).

### Potential Terraform Configuration

```tf
data "ovh_domain_zone_record_ids" "example-com" {
  zone="example-com"
}

data "ovh_domain_zone_record" "example-com" {
  for_each = data.ovh_domain_zone_record_ids.example-com
  zone = "example.com"
  id     = each.key
}
```

### Additional context

The aim is to add human understandable zone data to Terraform  in order to ease importing existing records in a fresh terraform state.

Hints from issue comments:
@amstuta: Hello @landure, thanks for opening this issue.

I prepared a PR to add the datasources you need, they will be named `ovh_domain_zone_record` and `ovh_domain_zone_records`.

Solution patch:
diff --git a/.cds/terraform-provider-ovh.yml b/.cds/terraform-provider-ovh.yml
index 79a44f60..ecaa1033 100644
--- a/.cds/terraform-provider-ovh.yml
+++ b/.cds/terraform-provider-ovh.yml
@@ -695,7 +695,7 @@ workflow:
     environment: acctests
     one_at_a_time: true
     parameters:
-      testargs: -run TestAccIam
+      testargs: -run 'TestAccIam|TestAccResourceIam'
       skipthispipeline: "{{.workflow.terraform-provider-ovh.pip.skipthistest.iam}}"
     pipeline: terraform-provider-ovh-testacc
     when:
diff --git a/docs/data-sources/dedicated_server_orderable_bandwidth.md b/docs/data-sources/dedicated_server_orderable_bandwidth.md
index 850b2645..0f37c261 100644
--- a/docs/data-sources/dedicated_server_orderable_bandwidth.md
+++ b/docs/data-sources/dedicated_server_orderable_bandwidth.md
@@ -2,14 +2,14 @@
 subcategory : "Dedicated Server"
 ---
 
-# ovh_dedicated_server_order_bandwidth (Data Source)
+# ovh_dedicated_server_orderable_bandwidth (Data Source)
 
 Use this data source to get the list of orderable additional bandwidth for a dedicated server associated with your OVHcloud Account.
 
 ## Example Usage
 
 ```terraform
-data "ovh_dedicated_server_orderable_bandwidth" "bp" {
+data "ovh_dedicated_server_orderable_bandwidth" "spec" {
   service_name = "myserver"
 }
 ```
@@ -22,7 +22,7 @@ data "ovh_dedicated_server_orderable_bandwidth" "bp" {
 
 The following attributes are exported:
 
-* `orderable` - Wether or not additional bandwidth is orderable.
-* `platinium` - The list of orderable platinimum bandwidth in mbps.
-* `ultimate` - The list of orderable ultimate bandwidth in mbps.
-* `premium` - The list of orderable premium bandwidth in mbps.
+* `orderable` - Whether or not additional bandwidth is orderable
+* `platinium` - Additional orderable platinium bandwidth
+* `ultimate` - Additional orderable ultimate bandwidth
+* `premium` - Additional orderable premium bandwidth
\ No newline at end of file
diff --git a/docs/data-sources/dedicated_server_orderable_bandwidth_vrack.md b/docs/data-sources/dedicated_server_orderable_bandwidth_vrack.md
index 725a1cbe..7e0ad3d5 100644
--- a/docs/data-sources/dedicated_server_orderable_bandwidth_vrack.md
+++ b/docs/data-sources/dedicated_server_orderable_bandwidth_vrack.md
@@ -2,14 +2,14 @@
 subcategory : "Dedicated Server"
 ---
 
-# ovh_dedicated_server_order_bandwidth_vrack (Data Source)
+# ovh_dedicated_server_orderable_bandwidth_vrack (Data Source)
 
-Use this data source to get the list of orderable additional vrack bandwidth for a dedicated server associated with your OVHcloud Account.
+Use this data source to get the orderable vrack bandwidth information about a dedicated server associated with your OVHcloud Account.
 
 ## Example Usage
 
 ```terraform
-data "ovh_dedicated_server_orderable_bandwidth_vrack" "bp" {
+data "ovh_dedicated_server_orderable_bandwidth_vrack" "spec" {
   service_name = "myserver"
 }
 ```
@@ -22,5 +22,5 @@ data "ovh_dedicated_server_orderable_bandwidth_vrack" "bp" {
 
 The following attributes are exported:
 
-* `orderable` - Wether or not additional bandwidth is orderable.
-* `vrack` - The list of orderable vrack bandwidth in mbps.
+* `orderable` - Whether or not additional bandwidth is orderable
+* `vrack` - Additional orderable vrack bandwidth
\ No newline at end of file
diff --git a/docs/data-sources/domain_zone_record.md b/docs/data-sources/domain_zone_record.md
new file mode 100644
index 00000000..9d2848a1
--- /dev/null
+++ b/docs/data-sources/domain_zone_record.md
@@ -0,0 +1,32 @@
+---
+subcategory : "Domain names"
+---
+
+# ovh_domain_zone_record (Data Source)
+
+Get record object properties
+
+## Example Usage
+
+```terraform
+data "ovh_domain_zone_record" "record" {
+    zone_name = "<zone_name>"
+    id        = "<record_id>"
+}
+```
+
+<!-- schema generated by tfplugindocs -->
+## Schema
+
+### Required
+
+- `id` (Number) Record ID
+- `zone_name` (String) Zone name
+
+### Read-Only
+
+- `field_type` (String) Field type
+- `sub_domain` (String) Record subDomain
+- `target` (String) Target of the record
+- `ttl` (Number) TTL of the record
+- `zone` (String) Resource record zone
diff --git a/docs/data-sources/domain_zone_records.md b/docs/data-sources/domain_zone_records.md
new file mode 100644
index 00000000..c8479981
--- /dev/null
+++ b/docs/data-sources/domain_zone_records.md
@@ -0,0 +1,26 @@
+---
+subcategory : "Domain names"
+---
+
+# ovh_domain_zone_records (Data Source)
+
+List record
+
+## Example Usage
+
+```terraform
+data "ovh_domain_zone_records" "records" {
+    zone_name = "<zone_name>"
+}
+```
+
+<!-- schema generated by tfplugindocs -->
+## Schema
+
+### Required
+
+- `zone_name` (String) Zone name
+
+### Read-Only
+
+- `ids` (List of Number) IDs of the records in the zone
diff --git a/docs/resources/iam_resource_tags.md b/docs/resources/iam_resource_tags.md
index 84c3e439..f4f5067d 100644
--- a/docs/resources/iam_resource_tags.md
+++ b/docs/resources/iam_resource_tags.md
@@ -31,7 +31,7 @@ resource "ovh_iam_resource_tags" "project_tags" {
 
 ```terraform
 data "ovh_cloud_project" "my_project" {
-  service_name = "cef572b51c534a8f9fee73ac81957fbd"
+  service_name = "<public cloud project ID>"
 }
 
 resource "ovh_iam_resource_tags" "project_tags" {
diff --git a/examples/data-sources/ovh_domain_zone_record/data-source.tf b/examples/data-sources/ovh_domain_zone_record/data-source.tf
new file mode 100644
index 00000000..8d4fdea4
--- /dev/null
+++ b/examples/data-sources/ovh_domain_zone_record/data-source.tf
@@ -0,0 +1,4 @@
+data "ovh_domain_zone_record" "record" {
+    zone_name = "<zone_name>"
+    id        = "<record_id>"
+}
\ No newline at end of file
diff --git a/examples/data-sources/ovh_domain_zone_records/data-source.tf b/examples/data-sources/ovh_domain_zone_records/data-source.tf
new file mode 100644
index 00000000..113be6f7
--- /dev/null
+++ b/examples/data-sources/ovh_domain_zone_records/data-source.tf
@@ -0,0 +1,3 @@
+data "ovh_domain_zone_records" "records" {
+    zone_name = "<zone_name>"
+}
\ No newline at end of file
diff --git a/examples/resources/iam_resource_tags/example_1.tf b/examples/resources/iam_resource_tags/example_1.tf
index e04121d3..f70a3309 100644
--- a/examples/resources/iam_resource_tags/example_1.tf
+++ b/examples/resources/iam_resource_tags/example_1.tf
@@ -1,14 +1,13 @@
-# Basic example showing how to tag a cloud project
 data "ovh_cloud_project" "my_project" {
-  service_name = "01234567890123456798012345678901"
+  service_name = "<public cloud project ID>"
 }
 
 resource "ovh_iam_resource_tags" "project_tags" {
   urn = data.ovh_cloud_project.my_project.iam.urn
 
   tags = {
-    environment = "test"
-    team        = "perso"
-    managed_by  = "opentofu"
+    environment = "production"
+    team        = "platform"
+    managed_by  = "terraform"
   }
 }
diff --git a/examples/resources/iam_resource_tags/example_2.tf b/examples/resources/iam_resource_tags/example_2.tf
new file mode 100644
index 00000000..94d5e8a9
--- /dev/null
+++ b/examples/resources/iam_resource_tags/example_2.tf
@@ -0,0 +1,12 @@
+resource "ovh_iam_resource_tags" "project_tags" {
+  urn = "urn:v1:eu:resource:cloudProject:1234567890abcdef"
+  
+  tags = {
+    environment    = "staging"
+    cost_center    = "engineering"
+    project        = "web-app"
+    owner          = "team@example.com"
+    backup_policy  = "daily"
+    compliance     = "gdpr"
+  }
+}
\ No newline at end of file
diff --git a/examples/resources/iam_resource_tags/providers.tf b/examples/resources/iam_resource_tags/providers.tf
deleted file mode 100644
index e0f8f341..00000000
--- a/examples/resources/iam_resource_tags/providers.tf
+++ /dev/null
@@ -1,12 +0,0 @@
-# Configure the OVHcloud Provider
-terraform {
-  required_providers {
-    ovh = {
-      source = "ovh/ovh"
-      version = ">= 2.7.0"
-    }
-  }
-}
-
-provider "ovh" {
-}
diff --git a/ovh/data_domain_zone_record.go b/ovh/data_domain_zone_record.go
new file mode 100644
index 00000000..ffe0c4d0
--- /dev/null
+++ b/ovh/data_domain_zone_record.go
@@ -0,0 +1,70 @@
+package ovh
+
+import (
+	"context"
+	"fmt"
+	"net/url"
+	"strconv"
+
+	"github.com/hashicorp/terraform-plugin-framework/datasource"
+)
+
+var _ datasource.DataSourceWithConfigure = (*domainZoneRecordDataSource)(nil)
+
+func NewDomainZoneRecordDataSource() datasource.DataSource {
+	return &domainZoneRecordDataSource{}
+}
+
+type domainZoneRecordDataSource struct {
+	config *Config
+}
+
+func (d *domainZoneRecordDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
+	resp.TypeName = req.ProviderTypeName + "_domain_zone_record"
+}
+
+func (d *domainZoneRecordDataSource) Configure(_ context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) {
+	if req.ProviderData == nil {
+		return
+	}
+
+	config, ok := req.ProviderData.(*Config)
+	if !ok {
+		resp.Diagnostics.AddError(
+			"Unexpected Data Source Configure Type",
+			fmt.Sprintf("Expected *Config, got: %T. Please report this issue to the provider developers.", req.ProviderData),
+		)
+		return
+	}
+
+	d.config = config
+}
+
+func (d *domainZoneRecordDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
+	resp.Schema = DomainZoneRecordDataSourceSchema(ctx)
+}
+
+func (d *domainZoneRecordDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
+	var data DomainZoneRecordModel
+
+	// Read Terraform configuration data into the model
+	resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
+
+	if resp.Diagnostics.HasError() {
+		return
+	}
+
+	// Read API call logic
+	endpoint := "/domain/zone/" + url.PathEscape(data.ZoneName.ValueString()) + "/record/" + strconv.FormatInt(data.Id.ValueInt64(), 10)
+
+	if err := d.config.OVHClient.Get(endpoint, &data); err != nil {
+		resp.Diagnostics.AddError(
+			fmt.Sprintf("Error calling Get %s", endpoint),
+			err.Error(),
+		)
+		return
+	}
+
+	// Save data into Terraform state
+	resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
+}
diff --git a/ovh/data_domain_zone_record_gen.go b/ovh/data_domain_zone_record_gen.go
new file mode 100644
index 00000000..07e30cc3
--- /dev/null
+++ b/ovh/data_domain_zone_record_gen.go
@@ -0,0 +1,71 @@
+// Code generated by terraform-plugin-framework-generator DO NOT EDIT.
+
+package ovh
+
+import (
+	"context"
+
+	ovhtypes "github.com/ovh/terraform-provider-ovh/v2/ovh/types"
+
+	"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
+)
+
+func DomainZoneRecordDataSourceSchema(ctx context.Context) schema.Schema {
+	attrs := map[string]schema.Attribute{
+		"field_type": schema.StringAttribute{
+			CustomType:  ovhtypes.TfStringType{},
+			Computed:    true,
+			Description: "Field type",
+		},
+		"id": schema.Int64Attribute{
+			CustomType:  ovhtypes.TfInt64Type{},
+			Required:    true,
+			Description: "Record ID",
+		},
+		"sub_domain": schema.StringAttribute{
+			CustomType:          ovhtypes.TfStringType{},
+			Computed:            true,
+			Description:         "Record subDomain",
+			MarkdownDescription: "Record subDomain",
+		},
+		"target": schema.StringAttribute{
+			CustomType:          ovhtypes.TfStringType{},
+			Computed:            true,
+			Description:         "Target of the record",
+			MarkdownDescription: "Target of the record",
+		},
+		"ttl": schema.Int64Attribute{
+			CustomType:          ovhtypes.TfInt64Type{},
+			Computed:            true,
+			Description:         "TTL of the record",
+			MarkdownDescription: "TTL of the record",
+		},
+		"zone": schema.StringAttribute{
+			CustomType:          ovhtypes.TfStringType{},
+			Computed:            true,
+			Description:         "Resource record zone",
+			MarkdownDescription: "Resource record zone",
+		},
+		"zone_name": schema.StringAttribute{
+			CustomType:          ovhtypes.TfStringType{},
+			Required:            true,
+			Description:         "Zone name",
+			MarkdownDescription: "Zone name",
+		},
+	}
+
+	return schema.Schema{
+		Description: "Get record object properties",
+		Attributes:  attrs,
+	}
+}
+
+type DomainZoneRecordModel struct {
+	FieldType ovhtypes.TfStringValue `tfsdk:"field_type" json:"fieldType"`
+	Id        ovhtypes.TfInt64Value  `tfsdk:"id" json:"id"`
+	SubDomain ovhtypes.TfStringValue `tfsdk:"sub_domain" json:"subDomain"`
+	Target    ovhtypes.TfStringValue `tfsdk:"target" json:"target"`
+	Ttl       ovhtypes.TfInt64Value  `tfsdk:"ttl" json:"ttl"`
+	Zone      ovhtypes.TfStringValue `tfsdk:"zone" json:"zone"`
+	ZoneName  ovhtypes.TfStringValue `tfsdk:"zone_name" json:"zoneName"`
+}
diff --git a/ovh/data_domain_zone_records.go b/ovh/data_domain_zone_records.go
new file mode 100644
index 00000000..f3770287
--- /dev/null
+++ b/ovh/data_domain_zone_records.go
@@ -0,0 +1,69 @@
+package ovh
+
+import (
+	"context"
+	"fmt"
+	"net/url"
+
+	"github.com/hashicorp/terraform-plugin-framework/datasource"
+)
+
+var _ datasource.DataSourceWithConfigure = (*domainZoneRecordsDataSource)(nil)
+
+func NewDomainZoneRecordsDataSource() datasource.DataSource {
+	return &domainZoneRecordsDataSource{}
+}
+
+type domainZoneRecordsDataSource struct {
+	config *Config
+}
+
+func (d *domainZoneRecordsDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
+	resp.TypeName = req.ProviderTypeName + "_domain_zone_records"
+}
+
+func (d *domainZoneRecordsDataSource) Configure(_ context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) {
+	if req.ProviderData == nil {
+		return
+	}
+
+	config, ok := req.ProviderData.(*Config)
+	if !ok {
+		resp.Diagnostics.AddError(
+			"Unexpected Data Source Configure Type",
+			fmt.Sprintf("Expected *Config, got: %T. Please report this issue to the provider developers.", req.ProviderData),
+		)
+		return
+	}
+
+	d.config = config
+}
+
+func (d *domainZoneRecordsDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
+	resp.Schema = DomainZoneRecordsDataSourceSchema(ctx)
+}
+
+func (d *domainZoneRecordsDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
+	var data DomainZoneRecordsModel
+
+	// Read Terraform configuration data into the model
+	resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
+
+	if resp.Diagnostics.HasError() {
+		return
+	}
+
+	// Read API call logic
+	endpoint := "/domain/zone/" + url.PathEscape(data.ZoneName.ValueString()) + "/record"
+
+	if err := d.config.OVHClient.Get(endpoint, &data.IDs); err != nil {
+		resp.Diagnostics.AddError(
+			fmt.Sprintf("Error calling Get %s", endpoint),
+			err.Error(),
+		)
+		return
+	}
+
+	// Save data into Terraform state
+	resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
+}
diff --git a/ovh/data_domain_zone_records_gen.go b/ovh/data_domain_zone_records_gen.go
new file mode 100644
index 00000000..32d35019
--- /dev/null
+++ b/ovh/data_domain_zone_records_gen.go
@@ -0,0 +1,37 @@
+// Code generated by terraform-plugin-framework-generator DO NOT EDIT.
+
+package ovh
+
+import (
+	"context"
+
+	"github.com/hashicorp/terraform-plugin-framework/types"
+	ovhtypes "github.com/ovh/terraform-provider-ovh/v2/ovh/types"
+
+	"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
+)
+
+func DomainZoneRecordsDataSourceSchema(ctx context.Context) schema.Schema {
+	attrs := map[string]schema.Attribute{
+		"ids": schema.SetAttribute{
+			ElementType: types.Int64Type,
+			Computed:    true,
+			CustomType:  ovhtypes.NewTfListNestedType[ovhtypes.TfInt64Value](ctx),
+		},
+		"zone_name": schema.StringAttribute{
+			CustomType:  ovhtypes.TfStringType{},
+			Required:    true,
+			Description: "Zone name",
+		},
+	}
+
+	return schema.Schema{
+		Description: "List record",
+		Attributes:  attrs,
+	}
+}
+
+type DomainZoneRecordsModel struct {
+	IDs      ovhtypes.TfListNestedValue[ovhtypes.TfInt64Value] `tfsdk:"ids" json:"ids"`
+	ZoneName ovhtypes.TfStringValue                            `tfsdk:"zone_name" json:"zoneName"`
+}
diff --git a/ovh/provider_new.go b/ovh/provider_new.go
index 04381620..b10ea1c7 100644
--- a/ovh/provider_new.go
+++ b/ovh/provider_new.go
@@ -241,6 +241,8 @@ func (p *OvhProvider) DataSources(_ context.Context) []func() datasource.DataSou
 		NewDedicatedServerSpecificationsHardwareDataSource,
 		NewDedicatedServerSpecificationsNetworkDataSource,
 		NewDomainZoneDnssecDataSource,
+		NewDomainZoneRecordDataSource,
+		NewDomainZoneRecordsDataSource,
 		NewIpFirewallDataSource,
 		NewIpFirewallRuleDataSource,
 		NewIpMitigationDataSource,
diff --git a/templates/data-sources/dedicated_server_orderable_bandwidth.tmpl b/templates/data-sources/dedicated_server_orderable_bandwidth.md.tmpl
similarity index 82%
rename from templates/data-sources/dedicated_server_orderable_bandwidth.tmpl
rename to templates/data-sources/dedicated_server_orderable_bandwidth.md.tmpl
index 5c6da918..79918d13 100644
--- a/templates/data-sources/dedicated_server_orderable_bandwidth.tmpl
+++ b/templates/data-sources/dedicated_server_orderable_bandwidth.md.tmpl
@@ -8,7 +8,7 @@ For example, the {{ .SchemaMarkdown }} template can be used to replace manual sc
 
 # ovh_dedicated_server_orderable_bandwidth (Data Source)
 
-Use this data source to get the hardward information about a dedicated server associated with your OVHcloud Account.
+Use this data source to get the list of orderable additional bandwidth for a dedicated server associated with your OVHcloud Account.
 
 ## Example Usage
 
diff --git a/templates/data-sources/dedicated_server_orderable_bandwidth_vrack.tmpl b/templates/data-sources/dedicated_server_orderable_bandwidth_vrack.md.tmpl
similarity index 100%
rename from templates/data-sources/dedicated_server_orderable_bandwidth_vrack.tmpl
rename to templates/data-sources/dedicated_server_orderable_bandwidth_vrack.md.tmpl
diff --git a/templates/data-sources/domain_zone_record.md.tmpl b/templates/data-sources/domain_zone_record.md.tmpl
new file mode 100644
index 00000000..dd723bbf
--- /dev/null
+++ b/templates/data-sources/domain_zone_record.md.tmpl
@@ -0,0 +1,27 @@
+---
+subcategory : "Domain names"
+---
+
+# ovh_domain_zone_record (Data Source)
+
+Get record object properties
+
+## Example Usage
+
+{{tffile "examples/data-sources/ovh_domain_zone_record/data-source.tf"}}
+
+<!-- schema generated by tfplugindocs -->
+## Schema
+
+### Required
+
+- `id` (Number) Record ID
+- `zone_name` (String) Zone name
+
+### Read-Only
+
+- `field_type` (String) Field type
+- `sub_domain` (String) Record subDomain
+- `target` (String) Target of the record
+- `ttl` (Number) TTL of the record
+- `zone` (String) Resource record zone
diff --git a/templates/data-sources/domain_zone_records.md.tmpl b/templates/data-sources/domain_zone_records.md.tmpl
new file mode 100644
index 00000000..75052946
--- /dev/null
+++ b/templates/data-sources/domain_zone_records.md.tmpl
@@ -0,0 +1,22 @@
+---
+subcategory : "Domain names"
+---
+
+# ovh_domain_zone_records (Data Source)
+
+List record
+
+## Example Usage
+
+{{tffile "examples/data-sources/ovh_domain_zone_records/data-source.tf"}}
+
+<!-- schema generated by tfplugindocs -->
+## Schema
+
+### Required
+
+- `zone_name` (String) Zone name
+
+### Read-Only
+
+- `ids` (List of Number) IDs of the records in the zone
diff --git a/templates/resources/iam_resource_tags.md.tmpl b/templates/resources/iam_resource_tags.md.tmpl
new file mode 100644
index 00000000..1a2ab865
--- /dev/null
+++ b/templates/resources/iam_resource_tags.md.tmpl
@@ -0,0 +1,53 @@
+---
+subcategory : "Account Management (IAM)"
+---
+
+# ovh_iam_resource_tags
+
+Manages tags for OVHcloud IAM resources.
+
+This resource allows you to apply and manage tags on OVHcloud resources identified by their URN (Uniform Resource Name). Tags are key-value pairs that help organize and categorize your resources.
+
+## Example Usage
+
+### Basic Usage
+
+{{tffile "examples/resources/iam_resource_tags/example_2.tf"}}
+
+### Using with Data Source
+
+{{tffile "examples/resources/iam_resource_tags/example_1.tf"}}
+
+## Argument Reference
+
+The following arguments are supported:
+
+* `urn` - (Required, ForceNew) The URN (Uniform Resource Name) of the resource to manage tags for. Changing this forces a new resource to be created. The URN format is typically `urn:v1:{region}:resource:{resourceType}:{resourceId}`.
+
+* `tags` - (Optional) A map of tags to apply to the resource. Each tag consists of a key-value pair. Tag keys must match the pattern `^[a-zA-Z0-9_.:/=+@-]{1,128}$` (1-128 characters) and values must match `^[a-zA-Z0-9_.:/=+@-]{0,256}$` (0-256 characters). Both keys and values can contain alphanumeric characters, underscores, dots, colons, slashes, equals signs, plus signs, at signs, and hyphens. **Note:** Tags with keys prefixed by `ovh:` are managed by OVH and cannot be set via the API.
+
+## Attributes Reference
+
+In addition to all arguments above, the following attributes are exported:
+
+* `id` - The ID of the resource, which is the same as the `urn`.
+
+## Import
+
+IAM resource tags can be imported using the resource URN:
+
+```bash
+terraform import ovh_iam_resource_tags.my_tags "urn:v1:eu:resource:cloudProject:1234567890abcdef"
+```
+
+After importing, you should update your Terraform configuration to match the imported state. The import will bring in all tags currently applied to the resource, but only tags defined in your configuration will be managed by Terraform.
+
+## Notes
+
+* This resource only manages tags that are explicitly defined in the `tags` argument. Other tags on the resource that are not managed by this Terraform resource will not be affected.
+* When the resource is destroyed, only the tags defined in the configuration will be removed from the OVHcloud resource. The resource itself will not be deleted.
+* Tag keys and values are case-sensitive.
+* Empty tag values are allowed (minimum length is 0 characters for values).
+* If you need to remove all tags, set `tags = {}` in your configuration.
+* Tags prefixed with `ovh:` are system-managed and cannot be modified through this resource. They will be visible when reading the resource but attempting to set them will result in a validation error.
+* The resource uses the OVH API v2 `/iam/resource/{urn}` endpoint with PUT operations to update all tags in a single operation, preserving any unmanaged tags (including `ovh:` prefixed tags).



Test patch:
diff --git a/ovh/data_domain_zone_record_test.go b/ovh/data_domain_zone_record_test.go
new file mode 100644
index 00000000..195289c2
--- /dev/null
+++ b/ovh/data_domain_zone_record_test.go
@@ -0,0 +1,37 @@
+package ovh
+
+import (
+	"fmt"
+	"os"
+	"testing"
+
+	"github.com/hashicorp/terraform-plugin-testing/helper/resource"
+)
+
+func TestAccDomainZoneRecordDataSource_basic(t *testing.T) {
+	zoneName := os.Getenv("OVH_ZONE_TEST")
+
+	resource.Test(t, resource.TestCase{
+		PreCheck:                 func() { testAccPreCheckCredentials(t) },
+		ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
+		Steps: []resource.TestStep{
+			{
+				Config: fmt.Sprintf(`
+					data ovh_domain_zone_records recs {
+						zone_name = %q
+					}
+
+					data ovh_domain_zone_record rec {
+						zone_name = data.ovh_domain_zone_records.recs.zone_name
+						id        = data.ovh_domain_zone_records.recs.ids[0]
+					}`, zoneName),
+				Check: resource.ComposeTestCheckFunc(
+					resource.TestCheckResourceAttrSet("data.ovh_domain_zone_record.rec", "field_type"),
+					resource.TestCheckResourceAttrSet("data.ovh_domain_zone_record.rec", "target"),
+					resource.TestCheckResourceAttrSet("data.ovh_domain_zone_record.rec", "ttl"),
+					resource.TestCheckResourceAttrSet("data.ovh_domain_zone_record.rec", "zone"),
+				),
+			},
+		},
+	})
+}
diff --git a/ovh/data_domain_zone_records_test.go b/ovh/data_domain_zone_records_test.go
new file mode 100644
index 00000000..d17d69cf
--- /dev/null
+++ b/ovh/data_domain_zone_records_test.go
@@ -0,0 +1,27 @@
+package ovh
+
+import (
+	"fmt"
+	"os"
+	"testing"
+
+	"github.com/hashicorp/terraform-plugin-testing/helper/resource"
+)
+
+func TestAccDomainZoneRecordsDataSource_basic(t *testing.T) {
+	zoneName := os.Getenv("OVH_ZONE_TEST")
+
+	resource.Test(t, resource.TestCase{
+		PreCheck:                 func() { testAccPreCheckCredentials(t) },
+		ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
+		Steps: []resource.TestStep{
+			{
+				Config: fmt.Sprintf(`
+					data ovh_domain_zone_records recs {
+						zone_name = %q
+					}`, zoneName),
+				Check: resource.TestCheckResourceAttrSet("data.ovh_domain_zone_records.recs", "ids.#"),
+			},
+		},
+	})
+}