Skip to content

Commit 5636cc1

Browse files
Terraform Team Automationsagarp337
authored andcommitted
Added - Support for DNS Secondary Egress and creating DNS zones from zone files
1 parent 487e156 commit 5636cc1

12 files changed

+904
-58
lines changed

examples/dns/global/zone.tf

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,35 @@ resource "oci_dns_zone" "zone1" {
1717
zone_type = "PRIMARY"
1818
}
1919

20-
resource "oci_dns_zone" "zone3" {
21-
compartment_id = var.compartment_ocid
22-
name = "${data.oci_identity_tenancy.tenancy.name}-${random_string.random_prefix.result}-tf-example3-primary.oci-dns1"
23-
zone_type = "PRIMARY"
24-
}
25-
2620
resource "oci_dns_tsig_key" "test_tsig_key" {
2721
algorithm = "hmac-sha1"
2822
compartment_id = var.compartment_ocid
29-
name = "${random_string.random_prefix.result}-test_tsig_key-name"
23+
name = "${random_string.random_prefix.result}-test-tsig-key-name"
3024
secret = "c2VjcmV0"
3125
}
3226

3327
resource "oci_dns_zone" "zone2" {
3428
compartment_id = var.compartment_ocid
35-
name = "${data.oci_identity_tenancy.tenancy.name}-${random_string.random_prefix.result}-tf-example-secondary.oci-dns2"
36-
zone_type = "SECONDARY"
29+
name = "${data.oci_identity_tenancy.tenancy.name}-${random_string.random_prefix.result}-tf-example2-primary.oci-dns2"
30+
zone_type = "PRIMARY"
3731

38-
external_masters {
32+
external_downstreams {
3933
address = "77.64.12.1"
4034
tsig_key_id = oci_dns_tsig_key.test_tsig_key.id
4135
}
4236

43-
external_masters {
37+
external_downstreams {
4438
address = "77.64.12.2"
4539
tsig_key_id = oci_dns_tsig_key.test_tsig_key.id
4640
}
4741
}
4842

43+
resource "oci_dns_zone" "zone3" {
44+
compartment_id = var.compartment_ocid
45+
name = "${data.oci_identity_tenancy.tenancy.name}-${random_string.random_prefix.result}-tf-example3-primary.oci-dns1"
46+
zone_type = "PRIMARY"
47+
}
48+
4949
data "oci_dns_zones" "zs" {
5050
compartment_id = var.compartment_ocid
5151
name_contains = "example"

examples/dns/zone_file/provider.tf

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
/*
5+
* Provider config for dns sample
6+
*/
7+
8+
variable "tenancy_ocid" {
9+
}
10+
11+
variable "user_ocid" {
12+
}
13+
14+
variable "fingerprint" {
15+
}
16+
17+
variable "private_key_path" {
18+
}
19+
20+
variable "compartment_ocid" {
21+
}
22+
23+
variable "region" {
24+
}
25+
26+
provider "oci" {
27+
region = var.region
28+
tenancy_ocid = var.tenancy_ocid
29+
user_ocid = var.user_ocid
30+
fingerprint = var.fingerprint
31+
private_key_path = var.private_key_path
32+
}
33+

examples/dns/zone_file/zone.tf

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
/*
5+
* This file demonstrates creating a zone from a zone file using terraform.
6+
*/
7+
8+
/*
9+
* Step 1: Create the zone from the zone file.
10+
* Run Terraform plan/apply and wait until the zone has been created. Note the OCID of the zone.
11+
* Step 2: Uncomment the oci_dns_zone below, and comment out the oci_dns_action_create_zone_from_zone_file
12+
Run `terraform import oci_dns_zone.zone ZONE_OCID`, replacing ZONE_OCID with the OCID of the zone from step 1.
13+
* Step 3: Run Terraform plan/apply.
14+
Terraform will show that it is deleting the oci_dns_action_create_zone_from_zone_file resource, but the zone will not be deleted. The zone is now fully managed by the oci_dns_zone resource.
15+
*/
16+
17+
resource "random_string" "random_prefix" {
18+
length = 4
19+
number = false
20+
special = false
21+
}
22+
23+
data "oci_identity_tenancy" "tenancy" {
24+
tenancy_id = var.tenancy_ocid
25+
}
26+
27+
locals {
28+
zone_name = "${data.oci_identity_tenancy.tenancy.name}-${random_string.random_prefix.result}-tf-example-primary.oci-dns1"
29+
}
30+
31+
resource "oci_dns_action_create_zone_from_zone_file" "zonefile" {
32+
compartment_id = var.compartment_ocid
33+
create_zone_from_zone_file_details = "$ORIGIN ${local.zone_name}.\n$TTL 3600\n${local.zone_name}. IN SOA ns1.${local.zone_name}. admin.${local.zone_name}. ( 1 7200 3600 14400 3600)\n${local.zone_name}. IN NS ns1.${local.zone_name}."
34+
}
35+
36+
#resource "oci_dns_zone" "zone" {
37+
# name = local.zone_name
38+
# compartment_id = var.compartment_ocid
39+
# zone_type = "PRIMARY"
40+
#}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package integrationtest
5+
6+
import (
7+
"fmt"
8+
"strconv"
9+
"testing"
10+
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
13+
14+
"github.com/oracle/terraform-provider-oci/httpreplay"
15+
"github.com/oracle/terraform-provider-oci/internal/acctest"
16+
"github.com/oracle/terraform-provider-oci/internal/resourcediscovery"
17+
18+
"github.com/oracle/terraform-provider-oci/internal/utils"
19+
)
20+
21+
var (
22+
DnsActionCreateZoneFromZoneFileRequiredOnlyResource = acctest.GenerateResourceFromRepresentationMap("oci_dns_action_create_zone_from_zone_file", "test_action_create_zone_from_zone_file", acctest.Required, acctest.Create, DnsActionCreateZoneFromZoneFileRepresentation)
23+
24+
DnsActionCreateZoneFromZoneFileRepresentation = map[string]interface{}{
25+
"create_zone_from_zone_file_details": acctest.Representation{RepType: acctest.Required, Create: `createZoneFromZoneFileDetails`},
26+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
27+
"scope": acctest.Representation{RepType: acctest.Optional, Create: `GLOBAL`},
28+
}
29+
)
30+
31+
// issue-routing-tag: dns/default
32+
func TestDnsActionCreateZoneFromZoneFileResource_basic(t *testing.T) {
33+
t.Skip("This test will not work as the oci_dns_action_create_zone_from_zone_file must be imported to a oci_dns_zone resource to manage the zone beyond creation")
34+
httpreplay.SetScenario("TestDnsActionCreateZoneFromZoneFileResource_basic")
35+
defer httpreplay.SaveScenario()
36+
37+
config := acctest.ProviderTestConfig()
38+
39+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
40+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
41+
42+
resourceName := "oci_dns_action_create_zone_from_zone_file.test_action_create_zone_from_zone_file"
43+
44+
var resId string
45+
// Save TF content to Create resource with optional properties. This has to be exactly the same as the config part in the "create with optionals" step in the test.
46+
acctest.SaveConfigContent(config+compartmentIdVariableStr+
47+
acctest.GenerateResourceFromRepresentationMap("oci_dns_action_create_zone_from_zone_file", "test_action_create_zone_from_zone_file", acctest.Optional, acctest.Create, DnsActionCreateZoneFromZoneFileRepresentation), "dns", "actionCreateZoneFromZoneFile", t)
48+
49+
acctest.ResourceTest(t, nil, []resource.TestStep{
50+
// verify Create
51+
{
52+
Config: config + compartmentIdVariableStr +
53+
acctest.GenerateResourceFromRepresentationMap("oci_dns_action_create_zone_from_zone_file", "test_action_create_zone_from_zone_file", acctest.Required, acctest.Create, DnsActionCreateZoneFromZoneFileRepresentation),
54+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
55+
resource.TestCheckResourceAttr(resourceName, "create_zone_from_zone_file_details", "createZoneFromZoneFileDetails"),
56+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
57+
),
58+
},
59+
60+
// delete before next Create
61+
{
62+
Config: config + compartmentIdVariableStr,
63+
},
64+
// verify Create with optionals
65+
{
66+
Config: config + compartmentIdVariableStr +
67+
acctest.GenerateResourceFromRepresentationMap("oci_dns_action_create_zone_from_zone_file", "test_action_create_zone_from_zone_file", acctest.Optional, acctest.Create, DnsActionCreateZoneFromZoneFileRepresentation),
68+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
69+
resource.TestCheckResourceAttr(resourceName, "create_zone_from_zone_file_details", "createZoneFromZoneFileDetails"),
70+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
71+
resource.TestCheckResourceAttr(resourceName, "scope", "GLOBAL"),
72+
73+
func(s *terraform.State) (err error) {
74+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
75+
if isEnableExportCompartment, _ := strconv.ParseBool(utils.GetEnvSettingWithDefault("enable_export_compartment", "true")); isEnableExportCompartment {
76+
if errExport := resourcediscovery.TestExportCompartmentWithResourceName(&resId, &compartmentId, resourceName); errExport != nil {
77+
return errExport
78+
}
79+
}
80+
return err
81+
},
82+
),
83+
},
84+
})
85+
}

internal/integrationtest/dns_zone_resource_test.go

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,22 @@ var (
4848
})
4949

5050
zoneRepresentationPrimaryDefault = map[string]interface{}{
51-
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
52-
"name": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_tenancy.test_tenancy.name}.{{.token}}.oci-zone-test`},
53-
"zone_type": acctest.Representation{RepType: acctest.Required, Create: `PRIMARY`},
54-
"defined_tags": acctest.Representation{RepType: acctest.Optional, Create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`, Update: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue")}`},
55-
"external_masters": acctest.RepresentationGroup{RepType: acctest.Optional, Group: DnsZoneExternalMastersRepresentation},
56-
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"freeformTags": "freeformTags"}, Update: map[string]string{"freeformTags2": "freeformTags2"}},
51+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
52+
"name": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_tenancy.test_tenancy.name}.{{.token}}.oci-zone-test`},
53+
"zone_type": acctest.Representation{RepType: acctest.Required, Create: `PRIMARY`},
54+
"defined_tags": acctest.Representation{RepType: acctest.Optional, Create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`, Update: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue")}`},
55+
"external_downstreams": acctest.RepresentationGroup{RepType: acctest.Optional, Group: zoneExternalDownstreamsRepresentation},
56+
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"freeformTags": "freeformTags"}, Update: map[string]string{"freeformTags2": "freeformTags2"}},
5757
}
5858

5959
zoneRepresentationDefault = acctest.GetUpdatedRepresentationCopy("zone_type", acctest.Representation{RepType: acctest.Required, Create: `SECONDARY`}, zoneRepresentationPrimaryDefault)
6060

61+
zoneExternalDownstreamsRepresentation = map[string]interface{}{
62+
"address": acctest.Representation{RepType: acctest.Required, Create: `1.2.3.4`, Update: `2.3.4.5`},
63+
"port": acctest.Representation{RepType: acctest.Optional, Create: `53`},
64+
"tsig_key_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_dns_tsig_key.test_tsig_key.id}`},
65+
}
66+
6167
ZoneResourceDependenciesDefault = acctest.GenerateResourceFromRepresentationMap("oci_dns_tsig_key", "test_tsig_key", acctest.Required, acctest.Create, DnsTsigKeyRepresentation) +
6268
DefinedTagsDependencies + `
6369
data "oci_identity_tenancy" "test_tenancy" {
@@ -103,15 +109,15 @@ func TestDnsZoneResource_default(t *testing.T) {
103109
},
104110
{
105111
Config: tokenFn(config+compartmentIdVariableStr+ZoneResourceDependenciesDefault+
106-
acctest.GenerateResourceFromRepresentationMap("oci_dns_zone", "test_zone", acctest.Optional, acctest.Create, zoneRepresentationDefault), nil),
112+
acctest.GenerateResourceFromRepresentationMap("oci_dns_zone", "test_zone", acctest.Optional, acctest.Create, zoneRepresentationPrimaryDefault), nil),
107113
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
108114
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
109-
resource.TestCheckResourceAttr(resourceName, "external_masters.#", "1"),
110-
resource.TestCheckResourceAttr(resourceName, "external_masters.0.address", "77.64.12.1"),
111-
resource.TestCheckResourceAttr(resourceName, "external_masters.0.port", "53"),
112-
resource.TestCheckResourceAttrSet(resourceName, "external_masters.0.tsig_key_id"),
115+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.#", "1"),
116+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.address", "1.2.3.4"),
117+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.port", "53"),
118+
resource.TestCheckResourceAttrSet(resourceName, "external_downstreams.0.tsig_key_id"),
113119
resource.TestMatchResourceAttr(resourceName, "name", regexp.MustCompile("\\.oci-zone-test")),
114-
resource.TestCheckResourceAttr(resourceName, "zone_type", "SECONDARY"),
120+
resource.TestCheckResourceAttr(resourceName, "zone_type", "PRIMARY"),
115121

116122
func(s *terraform.State) (err error) {
117123
resId2, err = acctest.FromInstanceState(s, resourceName, "id")
@@ -131,10 +137,13 @@ func TestDnsZoneResource_default(t *testing.T) {
131137
// verify Create with optionals
132138
{
133139
Config: tokenFn(config+compartmentIdVariableStr+ZoneResourceDependenciesDefault+
134-
acctest.GenerateResourceFromRepresentationMap("oci_dns_zone", "test_zone", acctest.Optional, acctest.Create,
135-
acctest.RepresentationCopyWithRemovedProperties(zoneRepresentationPrimaryDefault, []string{"external_masters"})), nil),
140+
acctest.GenerateResourceFromRepresentationMap("oci_dns_zone", "test_zone", acctest.Optional, acctest.Create, zoneRepresentationPrimaryDefault), nil),
136141
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
137142
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
143+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.#", "1"),
144+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.address", "1.2.3.4"),
145+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.port", "53"),
146+
resource.TestCheckResourceAttrSet(resourceName, "external_downstreams.0.tsig_key_id"),
138147
resource.TestMatchResourceAttr(resourceName, "name", regexp.MustCompile("\\.oci-zone-test")),
139148
resource.TestCheckResourceAttr(resourceName, "zone_type", "PRIMARY"),
140149
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
@@ -163,11 +172,15 @@ func TestDnsZoneResource_default(t *testing.T) {
163172
{
164173
Config: tokenFn(config+compartmentIdVariableStr+compartmentIdUVariableStr+ZoneResourceDependenciesDefault+
165174
acctest.GenerateResourceFromRepresentationMap("oci_dns_zone", "test_zone", acctest.Optional, acctest.Create,
166-
acctest.RepresentationCopyWithNewProperties(acctest.RepresentationCopyWithRemovedProperties(zoneRepresentationPrimaryDefault, []string{"external_masters"}), map[string]interface{}{
175+
acctest.RepresentationCopyWithNewProperties(zoneRepresentationPrimaryDefault, map[string]interface{}{
167176
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id_for_update}`},
168177
})), nil),
169178
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
170179
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentIdU),
180+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.#", "1"),
181+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.address", "1.2.3.4"),
182+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.port", "53"),
183+
resource.TestCheckResourceAttrSet(resourceName, "external_downstreams.0.tsig_key_id"),
171184
resource.TestMatchResourceAttr(resourceName, "name", regexp.MustCompile("\\.oci-zone-test")),
172185
resource.TestCheckResourceAttr(resourceName, "zone_type", "PRIMARY"),
173186
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
@@ -194,10 +207,13 @@ func TestDnsZoneResource_default(t *testing.T) {
194207
// verify updates to updatable parameters
195208
{
196209
Config: tokenFn(config+compartmentIdVariableStr+ZoneResourceDependenciesDefault+
197-
acctest.GenerateResourceFromRepresentationMap("oci_dns_zone", "test_zone", acctest.Optional, acctest.Update,
198-
acctest.RepresentationCopyWithRemovedProperties(zoneRepresentationPrimaryDefault, []string{"external_masters"})), nil),
210+
acctest.GenerateResourceFromRepresentationMap("oci_dns_zone", "test_zone", acctest.Optional, acctest.Update, zoneRepresentationPrimaryDefault), nil),
199211
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
200212
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
213+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.#", "1"),
214+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.address", "2.3.4.5"),
215+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.port", "53"),
216+
resource.TestCheckResourceAttrSet(resourceName, "external_downstreams.0.tsig_key_id"),
201217
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
202218
resource.TestCheckResourceAttr(resourceName, "zone_type", "PRIMARY"),
203219
resource.TestMatchResourceAttr(resourceName, "name", regexp.MustCompile("\\.oci-zone-test")),
@@ -227,6 +243,10 @@ func TestDnsZoneResource_default(t *testing.T) {
227243
acctest.GenerateResourceFromRepresentationMap("oci_dns_zone", "test_zone", acctest.Required, acctest.Create, zoneRepresentationPrimaryDefault), nil),
228244
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
229245
resource.TestCheckResourceAttr(datasourceName, "compartment_id", compartmentId),
246+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.#", "1"),
247+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.address", "2.3.4.5"),
248+
resource.TestCheckResourceAttr(resourceName, "external_downstreams.0.port", "53"),
249+
resource.TestCheckResourceAttrSet(resourceName, "external_downstreams.0.tsig_key_id"),
230250
resource.TestCheckResourceAttr(datasourceName, "zones.#", "1"),
231251
resource.TestCheckResourceAttr(datasourceName, "zones.0.freeform_tags.%", "1"),
232252
resource.TestCheckResourceAttrSet(datasourceName, "zones.0.id"),

0 commit comments

Comments
 (0)