Skip to content

Commit 8d63d39

Browse files
Terraform Team Automationsagarp337
authored andcommitted
Added - Support for Create oci_dns_rrsets data source
1 parent f8daea2 commit 8d63d39

File tree

9 files changed

+342
-5
lines changed

9 files changed

+342
-5
lines changed

examples/dns/global/rrset.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,8 @@ data "oci_dns_rrset" "test_rrset" {
5050
zone_name_or_id = oci_dns_zone.zone3.id
5151
}
5252

53+
data "oci_dns_rrsets" "test_rrsets" {
54+
domain = "el.${oci_dns_zone.zone3.name}"
55+
rtype = "CNAME"
56+
zone_name_or_id = oci_dns_zone.zone3.id
57+
}

examples/dns/private/rrset/rrset.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,10 @@ data "oci_dns_rrset" "test_rrset" {
6565
view_id = oci_dns_view.test_view.id
6666
}
6767

68+
data "oci_dns_rrsets" "test_rrsets" {
69+
domain = "el.${oci_dns_zone.zone3.name}"
70+
rtype = "CNAME"
71+
zone_name_or_id = oci_dns_zone.zone3.id
72+
scope = "PRIVATE"
73+
view_id = oci_dns_view.test_view.id
74+
}

internal/integrationtest/dns_rrset_test.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,16 @@ var (
3939
"view_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_dns_view.test_view.id}`},
4040
}
4141

42-
dnsDomainName = utils.RandomString(5, utils.CharsetWithoutDigits) + ".token.oci-record-test"
42+
DnsDnsRrsetDataSourceRepresentation = map[string]interface{}{
43+
"domain": acctest.Representation{RepType: acctest.Required, Create: dnsDomainName},
44+
"zone_name_or_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_dns_zone.test_zone.id}`},
45+
"rtype": acctest.Representation{RepType: acctest.Required, Create: `A`},
46+
"scope": acctest.Representation{RepType: acctest.Required, Create: `PRIVATE`},
47+
"view_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_dns_view.test_view.id}`},
48+
}
49+
50+
dnsDomainName = utils.RandomString(5, utils.CharsetWithoutDigits) + ".token.oci-record-test"
51+
4352
DnsRrsetRepresentation = map[string]interface{}{
4453
"domain": acctest.Representation{RepType: acctest.Required, Create: dnsDomainName},
4554
"rtype": acctest.Representation{RepType: acctest.Required, Create: `A`},
@@ -75,7 +84,7 @@ func TestDnsRrsetResource_basic(t *testing.T) {
7584
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
7685

7786
resourceName := "oci_dns_rrset.test_rrset"
78-
87+
datasourceName := "data.oci_dns_rrsets.test_rrsets"
7988
singularDatasourceName := "data.oci_dns_rrset.test_rrset"
8089

8190
var resId, resId2 string
@@ -166,6 +175,31 @@ func TestDnsRrsetResource_basic(t *testing.T) {
166175
},
167176
),
168177
},
178+
// verify datasource
179+
{
180+
Config: config +
181+
acctest.GenerateDataSourceFromRepresentationMap("oci_dns_rrsets", "test_rrsets", acctest.Optional, acctest.Update, DnsDnsRrsetDataSourceRepresentation) +
182+
compartmentIdVariableStr + DnsRrsetResourceDependencies +
183+
acctest.GenerateResourceFromRepresentationMap("oci_dns_rrset", "test_rrset", acctest.Optional, acctest.Update, DnsRrsetRepresentation),
184+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
185+
186+
resource.TestCheckResourceAttr(datasourceName, "rrsets.#", "1"),
187+
resource.TestCheckResourceAttr(datasourceName, "rrsets.0.items.#", "1"),
188+
resource.TestCheckResourceAttr(datasourceName, "rrsets.0.domain", dnsDomainName),
189+
resource.TestCheckResourceAttr(datasourceName, "rrsets.0.rtype", "A"),
190+
acctest.CheckResourceSetContainsElementWithProperties(datasourceName, "rrsets.0.items", map[string]string{
191+
"domain": dnsDomainName,
192+
"rdata": "77.77.77.77",
193+
"rtype": "A",
194+
"ttl": "1000",
195+
},
196+
[]string{
197+
"is_protected",
198+
"record_hash",
199+
"rrset_version",
200+
}),
201+
),
202+
},
169203
// verify singular datasource
170204
{
171205
Config: config +

internal/service/dns/dns_export.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,8 @@ var exportDnsTsigKeyHints = &tf_export.TerraformResourceHints{
254254

255255
var exportDnsRrsetHints = &tf_export.TerraformResourceHints{
256256
ResourceClass: "oci_dns_rrset",
257-
DatasourceClass: "oci_dns_rrset",
257+
DatasourceClass: "oci_dns_rrsets",
258+
DatasourceItemsAttr: "rrsets",
258259
ResourceAbbreviation: "rrset",
259260
}
260261

internal/service/dns/dns_records_data_source.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func DnsRecordsDataSource() *schema.Resource {
2323
"zone_name_or_id": {
2424
Type: schema.TypeString,
2525
Required: true,
26-
Deprecated: tfresource.ResourceDeprecatedForAnother("oci_dns_records", "oci_dns_rrset"),
26+
Deprecated: tfresource.ResourceDeprecatedForAnother("oci_dns_records", "oci_dns_rrsets"),
2727
},
2828

2929
// Optional
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package dns
5+
6+
import (
7+
"context"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
oci_dns "github.com/oracle/oci-go-sdk/v65/dns"
11+
12+
"github.com/oracle/terraform-provider-oci/internal/client"
13+
"github.com/oracle/terraform-provider-oci/internal/tfresource"
14+
)
15+
16+
func DnsRrsetsDataSource() *schema.Resource {
17+
return &schema.Resource{
18+
Read: readDnsRrsets,
19+
Schema: map[string]*schema.Schema{
20+
"filter": tfresource.DataSourceFiltersSchema(),
21+
"domain": {
22+
Type: schema.TypeString,
23+
Optional: true,
24+
},
25+
"domain_contains": {
26+
Type: schema.TypeString,
27+
Optional: true,
28+
},
29+
"rtype": {
30+
Type: schema.TypeString,
31+
Optional: true,
32+
},
33+
"scope": {
34+
Type: schema.TypeString,
35+
Optional: true,
36+
},
37+
"view_id": {
38+
Type: schema.TypeString,
39+
Optional: true,
40+
},
41+
"zone_name_or_id": {
42+
Type: schema.TypeString,
43+
Required: true,
44+
},
45+
// Computed
46+
"rrsets": {
47+
Type: schema.TypeList,
48+
Computed: true,
49+
Elem: &schema.Resource{
50+
Schema: map[string]*schema.Schema{
51+
"domain": {
52+
Type: schema.TypeString,
53+
Required: true,
54+
DiffSuppressFunc: tfresource.EqualIgnoreCaseSuppressDiff,
55+
},
56+
"rtype": {
57+
Type: schema.TypeString,
58+
Required: true,
59+
},
60+
"items": {
61+
Type: schema.TypeList,
62+
Required: true,
63+
Elem: &schema.Resource{
64+
Schema: map[string]*schema.Schema{
65+
// Required
66+
"domain": {
67+
Type: schema.TypeString,
68+
Required: true,
69+
DiffSuppressFunc: tfresource.EqualIgnoreCaseSuppressDiff,
70+
},
71+
"rdata": {
72+
Type: schema.TypeString,
73+
Required: true,
74+
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
75+
rtype := d.Get("rtype").(string)
76+
return normalizeRData(rtype, new) == normalizeRData(rtype, old)
77+
},
78+
},
79+
"rtype": {
80+
Type: schema.TypeString,
81+
Required: true,
82+
},
83+
"ttl": {
84+
Type: schema.TypeInt,
85+
Required: true,
86+
},
87+
88+
// Optional
89+
90+
// Computed
91+
"is_protected": {
92+
Type: schema.TypeBool,
93+
Computed: true,
94+
},
95+
"record_hash": {
96+
Type: schema.TypeString,
97+
Computed: true,
98+
},
99+
"rrset_version": {
100+
Type: schema.TypeString,
101+
Computed: true,
102+
},
103+
},
104+
},
105+
},
106+
},
107+
},
108+
},
109+
},
110+
}
111+
}
112+
113+
func readDnsRrsets(d *schema.ResourceData, m interface{}) error {
114+
sync := &DnsRrsetsDataSourceCrud{}
115+
sync.D = d
116+
sync.Client = m.(*client.OracleClients).DnsClient()
117+
118+
return tfresource.ReadResource(sync)
119+
}
120+
121+
type DnsRrsetsDataSourceCrud struct {
122+
D *schema.ResourceData
123+
Client *oci_dns.DnsClient
124+
Res *oci_dns.GetZoneRecordsResponse
125+
}
126+
127+
func (s *DnsRrsetsDataSourceCrud) VoidState() {
128+
s.D.SetId("")
129+
}
130+
131+
func (s *DnsRrsetsDataSourceCrud) Get() error {
132+
request := oci_dns.GetZoneRecordsRequest{}
133+
134+
if domain, ok := s.D.GetOkExists("domain"); ok {
135+
tmp := domain.(string)
136+
request.Domain = &tmp
137+
}
138+
139+
if domainContains, ok := s.D.GetOkExists("domain_contains"); ok {
140+
tmp := domainContains.(string)
141+
request.DomainContains = &tmp
142+
}
143+
144+
if rtype, ok := s.D.GetOkExists("rtype"); ok {
145+
tmp := rtype.(string)
146+
request.Rtype = &tmp
147+
}
148+
149+
if scope, ok := s.D.GetOkExists("scope"); ok {
150+
request.Scope = oci_dns.GetZoneRecordsScopeEnum(scope.(string))
151+
}
152+
153+
if viewId, ok := s.D.GetOkExists("view_id"); ok {
154+
tmp := viewId.(string)
155+
request.ViewId = &tmp
156+
}
157+
158+
if zoneNameOrId, ok := s.D.GetOkExists("zone_name_or_id"); ok {
159+
tmp := zoneNameOrId.(string)
160+
request.ZoneNameOrId = &tmp
161+
}
162+
163+
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(false, "dns")
164+
165+
response, err := s.Client.GetZoneRecords(context.Background(), request)
166+
if err != nil {
167+
return err
168+
}
169+
170+
request.Page = response.OpcNextPage
171+
172+
for request.Page != nil {
173+
listResponse, err := s.Client.GetZoneRecords(context.Background(), request)
174+
if err != nil {
175+
return err
176+
}
177+
178+
response.Items = append(response.Items, listResponse.Items...)
179+
request.Page = listResponse.OpcNextPage
180+
}
181+
182+
s.Res = &response
183+
return nil
184+
}
185+
186+
func (s *DnsRrsetsDataSourceCrud) SetData() error {
187+
if s.Res == nil {
188+
return nil
189+
}
190+
191+
s.D.SetId(tfresource.GenerateDataSourceHashID("DnsRrsetsDataSource-", DnsRrsetsDataSource(), s.D))
192+
193+
rrsetMap := map[string]map[string][]oci_dns.Record{}
194+
195+
for _, record := range s.Res.Items {
196+
if _, ok := rrsetMap[*record.Domain]; !ok {
197+
rrsetMap[*record.Domain] = map[string][]oci_dns.Record{}
198+
}
199+
if _, ok := rrsetMap[*record.Domain][*record.Rtype]; !ok {
200+
rrsetMap[*record.Domain][*record.Rtype] = []oci_dns.Record{}
201+
}
202+
rrsetMap[*record.Domain][*record.Rtype] = append(rrsetMap[*record.Domain][*record.Rtype], record)
203+
}
204+
205+
rrsets := []interface{}{}
206+
for domain, domainRrsets := range rrsetMap {
207+
for rtype, rrset := range domainRrsets {
208+
rrsetMap := map[string]interface{}{}
209+
rrsetMap["domain"] = domain
210+
rrsetMap["rtype"] = rtype
211+
records := []interface{}{}
212+
for _, record := range rrset {
213+
records = append(records, RecordToMap(record))
214+
}
215+
rrsetMap["items"] = records
216+
rrsets = append(rrsets, rrsetMap)
217+
}
218+
}
219+
s.D.Set("rrsets", rrsets)
220+
221+
return nil
222+
}

internal/service/dns/register_datasource.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ func RegisterDatasource() {
1212
tfresource.RegisterDatasource("oci_dns_resolver_endpoints", DnsResolverEndpointsDataSource())
1313
tfresource.RegisterDatasource("oci_dns_resolvers", DnsResolversDataSource())
1414
tfresource.RegisterDatasource("oci_dns_rrset", DnsRrsetDataSource())
15+
tfresource.RegisterDatasource("oci_dns_rrsets", DnsRrsetsDataSource())
1516
tfresource.RegisterDatasource("oci_dns_steering_policies", DnsSteeringPoliciesDataSource())
1617
tfresource.RegisterDatasource("oci_dns_steering_policy", DnsSteeringPolicyDataSource())
1718
tfresource.RegisterDatasource("oci_dns_steering_policy_attachment", DnsSteeringPolicyAttachmentDataSource())

website/docs/d/dns_records.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ description: |-
99

1010
# Data Source: oci_dns_records
1111

12-
**Deprecated. Use [oci_dns_rrset](https://registry.terraform.io/providers/oracle/oci/latest/docs/data-sources/dns_rrset) instead.**
12+
**Deprecated. Use [oci_dns_rrsets](https://registry.terraform.io/providers/oracle/oci/latest/docs/data-sources/dns_rrsets) instead.**
1313

1414
This data source provides the list of Records in Oracle Cloud Infrastructure DNS service.
1515

0 commit comments

Comments
 (0)