Skip to content

Commit 5608ee2

Browse files
Zoey Fengganbaras
authored andcommitted
Added - Support for Support resource locking for Email Delivery
1 parent b4eaf25 commit 5608ee2

20 files changed

+524
-1
lines changed

examples/email/emaildomain.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,7 @@ resource "oci_email_email_domain" "test_email_domain" {
1818

1919
depends_on = [random_id.random_email_domain]
2020
}
21+
22+
data "oci_email_email_domain" "test_email_domain" {
23+
email_domain_id = oci_email_email_domain.test_email_domain.id
24+
}

internal/integrationtest/email_email_domain_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/hashicorp/terraform-plugin-testing/terraform"
2222
"github.com/oracle/oci-go-sdk/v65/common"
2323
oci_email "github.com/oracle/oci-go-sdk/v65/email"
24+
emailpkg "github.com/oracle/terraform-provider-oci/internal/service/email"
2425

2526
"github.com/oracle/terraform-provider-oci/httpreplay"
2627
)
@@ -220,6 +221,74 @@ func TestEmailEmailDomainResource_basic(t *testing.T) {
220221
})
221222
}
222223

224+
func TestEmailEmailDomainDataSource_withLocks(t *testing.T) {
225+
resource := emailpkg.EmailEmailDomainsDataSource()
226+
227+
d := schema.TestResourceDataRaw(t, resource.Schema, map[string]interface{}{
228+
"compartment_id": "ocid1.compartment.oc1..mocked",
229+
"filter": []interface{}{
230+
map[string]interface{}{
231+
"name": "id",
232+
"values": []interface{}{"mocked-emaildomain-id"},
233+
},
234+
},
235+
})
236+
237+
mockedTime, _ := time.Parse(time.RFC3339Nano, "2023-09-19T17:29:12.144Z")
238+
239+
// Build one mocked domain item with one lock.
240+
item := map[string]interface{}{
241+
"id": "mocked-emaildomain-id",
242+
"name": "mocked.email.ap-mumbai-1.oci.oc-test.com",
243+
"compartment_id": "ocid1.compartment.oc1..mocked",
244+
"state": "ACTIVE",
245+
"locks": []interface{}{
246+
map[string]interface{}{
247+
"type": "FULL",
248+
"time_created": mockedTime.Format(time.RFC3339Nano),
249+
},
250+
},
251+
}
252+
253+
collection := []interface{}{
254+
map[string]interface{}{
255+
"items": []interface{}{item},
256+
},
257+
}
258+
259+
// Set the computed collection on the data source (allowed in unit tests via ResourceData).
260+
if err := d.Set("email_domain_collection", collection); err != nil {
261+
t.Fatalf("failed to set email_domain_collection: %v", err)
262+
}
263+
264+
// Assertions
265+
coll := d.Get("email_domain_collection").([]interface{})
266+
if len(coll) != 1 {
267+
t.Fatalf("expected 1 email_domain_collection, got %d", len(coll))
268+
}
269+
270+
items := coll[0].(map[string]interface{})["items"].([]interface{})
271+
if len(items) != 1 {
272+
t.Fatalf("expected 1 item, got %d", len(items))
273+
}
274+
275+
got := items[0].(map[string]interface{})
276+
locks := got["locks"].([]interface{})
277+
if len(locks) != 1 {
278+
t.Fatalf("expected 1 lock, got %d", len(locks))
279+
}
280+
281+
lock := locks[0].(map[string]interface{})
282+
check := func(key, expected string) {
283+
if actual, ok := lock[key]; !ok || actual != expected {
284+
t.Errorf("expected lock[%s] = %q, got %v", key, expected, actual)
285+
}
286+
}
287+
288+
check("type", "FULL")
289+
check("time_created", "2023-09-19T17:29:12.144Z")
290+
}
291+
223292
func testAccCheckEmailEmailDomainDestroy(s *terraform.State) error {
224293
noResourceFound := true
225294
client := acctest.TestAccProvider.Meta().(*tf_client.OracleClients).EmailClient()

internal/integrationtest/email_email_return_path_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"github.com/oracle/terraform-provider-oci/internal/resourcediscovery"
2323
"github.com/oracle/terraform-provider-oci/internal/tfresource"
2424
"github.com/oracle/terraform-provider-oci/internal/utils"
25+
26+
emailpkg "github.com/oracle/terraform-provider-oci/internal/service/email"
2527
)
2628

2729
var (
@@ -191,6 +193,75 @@ func TestEmailEmailReturnPathResource_basic(t *testing.T) {
191193
})
192194
}
193195

196+
func TestEmailReturnPathDataSource_withLocks(t *testing.T) {
197+
resource := emailpkg.EmailEmailReturnPathsDataSource()
198+
199+
mockedTime, _ := time.Parse(time.RFC3339, "2023-09-19T17:29:12.144Z")
200+
mockedSDKTime := common.SDKTime{Time: mockedTime}
201+
202+
mocked := oci_email.EmailReturnPathSummary{
203+
Id: common.String("mocked_id"),
204+
Name: common.String("tfrp.test.mock"),
205+
CompartmentId: common.String("ocid1.compartment.oc1..mocked"),
206+
LifecycleState: oci_email.EmailReturnPathLifecycleStateActive,
207+
Locks: []oci_email.ResourceLock{
208+
{
209+
Type: oci_email.ResourceLockTypeFull,
210+
TimeCreated: &mockedSDKTime,
211+
},
212+
},
213+
}
214+
215+
d := schema.TestResourceDataRaw(t, resource.Schema, map[string]interface{}{
216+
"compartment_id": "ocid1.compartment.oc1..mocked",
217+
})
218+
219+
domainCollection := []interface{}{
220+
map[string]interface{}{
221+
"items": []interface{}{
222+
map[string]interface{}{
223+
"id": *mocked.Id,
224+
"name": *mocked.Name,
225+
"compartment_id": *mocked.CompartmentId,
226+
"state": string(mocked.LifecycleState),
227+
"locks": []interface{}{
228+
map[string]interface{}{
229+
"type": string(mocked.Locks[0].Type),
230+
"time_created": mocked.Locks[0].TimeCreated.Format(time.RFC3339),
231+
},
232+
},
233+
},
234+
},
235+
},
236+
}
237+
d.Set("email_return_path_collection", domainCollection)
238+
239+
// Assertions
240+
coll := d.Get("email_return_path_collection").([]interface{})
241+
if len(coll) != 1 {
242+
t.Fatalf("Expected 1 email_return_path_collection, got %d", len(coll))
243+
}
244+
items := coll[0].(map[string]interface{})["items"].([]interface{})
245+
if len(items) != 1 {
246+
t.Fatalf("Expected 1 item, got %d", len(items))
247+
}
248+
item := items[0].(map[string]interface{})
249+
locks := item["locks"].([]interface{})
250+
if len(locks) != 1 {
251+
t.Fatalf("Expected 1 lock, got %d", len(locks))
252+
}
253+
254+
lock := locks[0].(map[string]interface{})
255+
check := func(k, expected string) {
256+
if lock[k] != expected {
257+
t.Errorf("Expected %s = %q, got %v", k, expected, lock[k])
258+
}
259+
}
260+
261+
check("type", "FULL")
262+
check("time_created", "2023-09-19T17:29:12Z") // Note: SDKTime drops fractional seconds
263+
}
264+
194265
func testAccCheckEmailEmailReturnPathDestroy(s *terraform.State) error {
195266
noResourceFound := true
196267
client := acctest.TestAccProvider.Meta().(*tf_client.OracleClients).EmailClient()

internal/integrationtest/email_sender_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
oci_email "github.com/oracle/oci-go-sdk/v65/email"
2424

2525
"github.com/oracle/terraform-provider-oci/httpreplay"
26+
emailpkg "github.com/oracle/terraform-provider-oci/internal/service/email"
2627
)
2728

2829
var (
@@ -215,6 +216,64 @@ func TestEmailSenderResource_basic(t *testing.T) {
215216
})
216217
}
217218

219+
func TestEmailEmailSenderDataSource_withLocks(t *testing.T) {
220+
resource := emailpkg.EmailSendersDataSource()
221+
222+
d := schema.TestResourceDataRaw(t, resource.Schema, map[string]interface{}{
223+
"compartment_id": "ocid1.compartment.oc1..mocked",
224+
"filter": []interface{}{
225+
map[string]interface{}{
226+
"name": "id",
227+
"values": []interface{}{"mocked-sender-id"},
228+
},
229+
},
230+
})
231+
232+
mockedTime, _ := time.Parse(time.RFC3339Nano, "2023-09-19T17:29:12.144Z")
233+
234+
// Build one mocked sender with one lock.
235+
sender := map[string]interface{}{
236+
"id": "mocked-sender-id",
237+
"email_address": "[email protected]",
238+
"compartment_id": "ocid1.compartment.oc1..mocked",
239+
"state": "ACTIVE",
240+
"locks": []interface{}{
241+
map[string]interface{}{
242+
"type": "FULL",
243+
"time_created": mockedTime.Format(time.RFC3339Nano),
244+
},
245+
},
246+
}
247+
248+
// Inject into the data source's computed field.
249+
if err := d.Set("senders", []interface{}{sender}); err != nil {
250+
t.Fatalf("failed to set senders: %v", err)
251+
}
252+
253+
// Assertions
254+
senders := d.Get("senders").([]interface{})
255+
if len(senders) != 1 {
256+
t.Fatalf("expected 1 sender, got %d", len(senders))
257+
}
258+
259+
s := senders[0].(map[string]interface{})
260+
locks := s["locks"].([]interface{})
261+
if len(locks) != 1 {
262+
t.Fatalf("expected 1 lock, got %d", len(locks))
263+
}
264+
265+
lock := locks[0].(map[string]interface{})
266+
check := func(key, expected string) {
267+
if actual, ok := lock[key]; !ok || actual != expected {
268+
t.Errorf("expected lock[%s] = %q, got %v", key, expected, actual)
269+
}
270+
}
271+
272+
check("type", "FULL")
273+
check("time_created", "2023-09-19T17:29:12.144Z")
274+
275+
}
276+
218277
func testAccCheckEmailSenderDestroy(s *terraform.State) error {
219278
noResourceFound := true
220279
client := acctest.TestAccProvider.Meta().(*tf_client.OracleClients).EmailClient()

internal/service/email/email_email_domain_data_source.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ func (s *EmailEmailDomainDataSourceCrud) SetData() error {
9494
s.D.Set("is_spf", *s.Res.IsSpf)
9595
}
9696

97+
locks := []interface{}{}
98+
for _, item := range s.Res.Locks {
99+
locks = append(locks, ResourceLockToMap(item))
100+
}
101+
s.D.Set("locks", locks)
102+
97103
if s.Res.Name != nil {
98104
s.D.Set("name", *s.Res.Name)
99105
}

internal/service/email/email_email_domain_resource.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,40 @@ func EmailEmailDomainResource() *schema.Resource {
8080
Type: schema.TypeBool,
8181
Computed: true,
8282
},
83+
"locks": {
84+
Type: schema.TypeList,
85+
Computed: true,
86+
Elem: &schema.Resource{
87+
Schema: map[string]*schema.Schema{
88+
// Required
89+
90+
// Optional
91+
"compartment_id": {
92+
Type: schema.TypeString,
93+
Optional: true,
94+
Computed: true,
95+
},
96+
97+
// Computed
98+
"message": {
99+
Type: schema.TypeString,
100+
Computed: true,
101+
},
102+
"related_resource_id": {
103+
Type: schema.TypeString,
104+
Computed: true,
105+
},
106+
"time_created": {
107+
Type: schema.TypeString,
108+
Computed: true,
109+
},
110+
"type": {
111+
Type: schema.TypeString,
112+
Computed: true,
113+
},
114+
},
115+
},
116+
},
83117
"state": {
84118
Type: schema.TypeString,
85119
Computed: true,
@@ -387,6 +421,11 @@ func (s *EmailEmailDomainResourceCrud) Update() error {
387421
request.FreeformTags = tfresource.ObjectMapToStringMap(freeformTags.(map[string]interface{}))
388422
}
389423

424+
if isLockOverride, ok := s.D.GetOkExists("is_lock_override"); ok {
425+
tmp := isLockOverride.(bool)
426+
request.IsLockOverride = &tmp
427+
}
428+
390429
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(s.DisableNotFoundRetries, "email")
391430

392431
response, err := s.Client.UpdateEmailDomain(context.Background(), request)
@@ -404,6 +443,11 @@ func (s *EmailEmailDomainResourceCrud) Delete() error {
404443
tmp := s.D.Id()
405444
request.EmailDomainId = &tmp
406445

446+
if isLockOverride, ok := s.D.GetOkExists("is_lock_override"); ok {
447+
tmp := isLockOverride.(bool)
448+
request.IsLockOverride = &tmp
449+
}
450+
407451
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(s.DisableNotFoundRetries, "email")
408452

409453
response, err := s.Client.DeleteEmailDomain(context.Background(), request)
@@ -447,6 +491,12 @@ func (s *EmailEmailDomainResourceCrud) SetData() error {
447491
s.D.Set("is_spf", *s.Res.IsSpf)
448492
}
449493

494+
locks := []interface{}{}
495+
for _, item := range s.Res.Locks {
496+
locks = append(locks, ResourceLockToMap(item))
497+
}
498+
s.D.Set("locks", locks)
499+
450500
if s.Res.Name != nil {
451501
s.D.Set("name", *s.Res.Name)
452502
}
@@ -489,6 +539,12 @@ func EmailDomainSummaryToMap(obj oci_email.EmailDomainSummary) map[string]interf
489539
result["id"] = string(*obj.Id)
490540
}
491541

542+
locks := []interface{}{}
543+
for _, item := range obj.Locks {
544+
locks = append(locks, ResourceLockToMap(item))
545+
}
546+
result["locks"] = locks
547+
492548
if obj.Name != nil {
493549
result["name"] = string(*obj.Name)
494550
}
@@ -506,6 +562,30 @@ func EmailDomainSummaryToMap(obj oci_email.EmailDomainSummary) map[string]interf
506562
return result
507563
}
508564

565+
func ResourceLockToMap(obj oci_email.ResourceLock) map[string]interface{} {
566+
result := map[string]interface{}{}
567+
568+
if obj.CompartmentId != nil {
569+
result["compartment_id"] = string(*obj.CompartmentId)
570+
}
571+
572+
if obj.Message != nil {
573+
result["message"] = string(*obj.Message)
574+
}
575+
576+
if obj.RelatedResourceId != nil {
577+
result["related_resource_id"] = string(*obj.RelatedResourceId)
578+
}
579+
580+
if obj.TimeCreated != nil {
581+
result["time_created"] = obj.TimeCreated.String()
582+
}
583+
584+
result["type"] = string(obj.Type)
585+
586+
return result
587+
}
588+
509589
func (s *EmailEmailDomainResourceCrud) updateCompartment(compartment interface{}) error {
510590
changeCompartmentRequest := oci_email.ChangeEmailDomainCompartmentRequest{}
511591

@@ -515,6 +595,11 @@ func (s *EmailEmailDomainResourceCrud) updateCompartment(compartment interface{}
515595
idTmp := s.D.Id()
516596
changeCompartmentRequest.EmailDomainId = &idTmp
517597

598+
if isLockOverride, ok := s.D.GetOkExists("is_lock_override"); ok {
599+
tmp := isLockOverride.(bool)
600+
changeCompartmentRequest.IsLockOverride = &tmp
601+
}
602+
518603
changeCompartmentRequest.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(s.DisableNotFoundRetries, "email")
519604

520605
response, err := s.Client.ChangeEmailDomainCompartment(context.Background(), changeCompartmentRequest)

0 commit comments

Comments
 (0)