Skip to content

Commit 6357ad5

Browse files
Mohini LimbodiaJulia3072
authored andcommitted
Bug fix - purge_trigger and purge_queue bugs in Queue provider
1 parent 0e3e7dd commit 6357ad5

File tree

5 files changed

+53
-24
lines changed

5 files changed

+53
-24
lines changed

examples/queue/main.tf

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,35 +25,36 @@ resource "oci_queue_queue" "test_queue1" {
2525
#Optional
2626
custom_encryption_key_id = var.queue_custom_encryption_key_id # We can have dependency on the oci_kms_key and get the key id from that
2727
dead_letter_queue_delivery_count = var.queue_dead_letter_queue_delivery_count
28+
purge_trigger = var.purge_trigger
29+
purge_type = var.purge_type
2830
freeform_tags = var.queue_freeform_tags
2931
retention_in_seconds = var.queue_retention_in_seconds
3032
timeout_in_seconds = var.queue_timeout_in_seconds
3133
visibility_in_seconds = var.queue_visibility_in_seconds
3234
channel_consumption_limit = var.queue_channel_consumption_limit
3335
}
3436

35-
# Purging the queue immediately after create if requried. We are using the purge queue optional parameter
37+
# Purging the queue immediately after create if required. Queue is purged if purge trigger is set to any integer value. We are using the purge trigger and purge type optional parameter.
38+
# We are purging the queue immediately after create.
3639
resource "oci_queue_queue" "test_queue2" {
3740
#Required
3841
compartment_id = var.compartment_id
3942
display_name = var.queue_display_name
4043

4144
#Optional
42-
purge_queue = true
45+
purge_trigger = 1
4346
purge_type = "normal"
4447

4548
}
4649

47-
# Normal queue creation if purge queue parameter is set to false. This will not trigger the purge queue operation. In addition, presence of purge type if purge queue is false or absent is a no-op.
50+
# Normal queue creation if purge trigger parameter is unset. This will not trigger the purge queue operation. In addition, presence of purge type if purge trigger is unset is a no-op.
4851
resource "oci_queue_queue" "test_queue3" {
4952
#Required
5053
compartment_id = var.compartment_id
5154
display_name = var.queue_display_name
5255

5356
#Optional
54-
purge_queue = false
5557
purge_type = "normal"
56-
5758
}
5859

5960
data "oci_queue_queues" "test_queues" {

examples/queue/variables.tf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,12 @@ variable "queue_visibility_in_seconds" {
4848

4949
variable "queue_channel_consumption_limit" {
5050
default = 10
51+
}
52+
53+
variable "purge_type" {
54+
default = "NORMAL"
55+
}
56+
57+
variable "purge_trigger" {
58+
default = 1
5159
}

internal/integrationtest/queue_queue_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,14 @@ func TestQueueQueueResource_basic(t *testing.T) {
182182
Config: config + compartmentIdVariableStr + customEncryptionKeyIdVariableStr + compartmentIdUVariableStr + QueueQueueResourceDependencies +
183183
acctest.GenerateResourceFromRepresentationMap("oci_queue_queue", "test_queue", acctest.Optional, acctest.Create,
184184
acctest.RepresentationCopyWithNewProperties(QueueQueueRepresentation, map[string]interface{}{
185-
"purge_queue": acctest.Representation{RepType: acctest.Required, Create: `true`},
186-
"purge_type": acctest.Representation{RepType: acctest.Required, Create: `normal`},
185+
"purge_trigger": acctest.Representation{RepType: acctest.Required, Create: `0`},
186+
"purge_type": acctest.Representation{RepType: acctest.Required, Create: `normal`},
187187
})),
188188
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
189189
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
190190
resource.TestCheckResourceAttrSet(resourceName, "custom_encryption_key_id"),
191-
resource.TestCheckResourceAttrSet(resourceName, "purge_queue"),
191+
resource.TestCheckResourceAttr(resourceName, "purge_trigger", "0"),
192+
resource.TestCheckResourceAttr(resourceName, "purge_type", "normal"),
192193
resource.TestCheckResourceAttr(resourceName, "dead_letter_queue_delivery_count", "10"),
193194
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName"),
194195
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
@@ -211,15 +212,16 @@ func TestQueueQueueResource_basic(t *testing.T) {
211212
),
212213
},
213214

214-
// verify updates to updatable parameters and we are not setting the purge queue related
215-
// parameters. So it should not trigger purge queue.
215+
// verify updates to updatable parameters and we are not setting the purge trigger and purge_type parameters.
216+
// so it should not trigger purge queue.
216217
{
217218
Config: config + compartmentIdVariableStr + customEncryptionKeyIdVariableStr + QueueQueueResourceDependencies +
218219
acctest.GenerateResourceFromRepresentationMap("oci_queue_queue", "test_queue", acctest.Optional, acctest.Update, QueueQueueRepresentation),
219220
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
220221
resource.TestCheckResourceAttr(resourceName, "channel_consumption_limit", "11"),
221222
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
222223
resource.TestCheckResourceAttrSet(resourceName, "custom_encryption_key_id"),
224+
resource.TestCheckResourceAttr(resourceName, "purge_trigger", "0"),
223225
resource.TestCheckResourceAttr(resourceName, "dead_letter_queue_delivery_count", "11"),
224226
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName2"),
225227
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
@@ -287,7 +289,7 @@ func TestQueueQueueResource_basic(t *testing.T) {
287289
ImportState: true,
288290
ImportStateVerify: true,
289291
ImportStateVerifyIgnore: []string{
290-
"purge_queue",
292+
"purge_trigger",
291293
"purge_type",
292294
},
293295
ResourceName: resourceName,

internal/service/queue/queue_queue_resource.go

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,11 @@ func QueueQueueResource() *schema.Resource {
8585
Optional: true,
8686
Computed: true,
8787
},
88-
"purge_queue": {
89-
Type: schema.TypeBool,
88+
"purge_trigger": {
89+
Type: schema.TypeInt,
9090
Optional: true,
9191
},
92+
// purge_type is an optional value that can be one of [NORMAL, DLQ, BOTH], default: normal
9293
"purge_type": {
9394
Type: schema.TypeString,
9495
Optional: true,
@@ -133,14 +134,16 @@ func createQueueQueue(d *schema.ResourceData, m interface{}) error {
133134
return e
134135
}
135136

136-
if value, ok := sync.D.GetOkExists("purge_queue"); ok && value.(bool) {
137+
// Purging the queue immediately after creating is optional and is done if purge_trigger is set
138+
// Call purge_queue if "purge_trigger" exists
139+
if _, ok := sync.D.GetOk("purge_trigger"); ok {
137140
err := sync.PurgeQueue()
138141
if err != nil {
139142
return err
140143
}
141144
}
142-
return nil
143145

146+
return nil
144147
}
145148

146149
func readQueueQueue(d *schema.ResourceData, m interface{}) error {
@@ -156,11 +159,20 @@ func updateQueueQueue(d *schema.ResourceData, m interface{}) error {
156159
sync.D = d
157160
sync.Client = m.(*client.OracleClients).QueueAdminClient()
158161

159-
// Checking only if the purge queue key exists in configuration and is set to true.
160-
if value, ok := sync.D.GetOkExists("purge_queue"); ok && value.(bool) {
161-
err := sync.PurgeQueue()
162-
if err != nil {
163-
return err
162+
// Check if purge_trigger has a change and call purge_queue if the new value is greater than old value
163+
if _, ok := sync.D.GetOk("purge_trigger"); ok && sync.D.HasChange("purge_trigger") {
164+
oldRaw, newRaw := sync.D.GetChange("purge_trigger")
165+
oldValue := oldRaw.(int)
166+
newValue := newRaw.(int)
167+
if newValue > oldValue {
168+
err := sync.PurgeQueue()
169+
if err != nil {
170+
return err
171+
}
172+
} else {
173+
// Set the value back to the old value in Terraform state
174+
sync.D.Set("purge_trigger", oldRaw)
175+
return fmt.Errorf("new value of purge_trigger should be greater than the old value to trigger purge")
164176
}
165177
}
166178

@@ -603,6 +615,13 @@ func (s *QueueQueueResourceCrud) PurgeQueue() error {
603615
request.PurgeType, _ = oci_queue.GetMappingPurgeQueueDetailsPurgeTypeEnum(purgeType.(string))
604616
}
605617

618+
// Check if "purge_type" exists in the state and set its value in the request, set default NORMAL
619+
if purgeType, ok := s.D.GetOk("purge_type"); ok {
620+
request.PurgeType, _ = oci_queue.GetMappingPurgeQueueDetailsPurgeTypeEnum(purgeType.(string))
621+
} else {
622+
request.PurgeType, _ = oci_queue.GetMappingPurgeQueueDetailsPurgeTypeEnum("NORMAL")
623+
}
624+
606625
idTmp := s.D.Id()
607626
request.QueueId = &idTmp
608627

@@ -617,9 +636,6 @@ func (s *QueueQueueResourceCrud) PurgeQueue() error {
617636
return waitErr
618637
}
619638

620-
val := s.D.Get("purge_queue")
621-
s.D.Set("purge_queue", val)
622-
623639
workId := response.OpcWorkRequestId
624640
return s.getQueueFromWorkRequest(workId, tfresource.GetRetryPolicy(s.DisableNotFoundRetries, "queue"), oci_queue.ActionTypeUpdated, s.D.Timeout(schema.TimeoutUpdate))
625641
}

website/docs/r/queue_queue.html.markdown

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ resource "oci_queue_queue" "test_queue" {
2525
channel_consumption_limit = var.queue_channel_consumption_limit
2626
custom_encryption_key_id = oci_kms_key.test_key.id
2727
dead_letter_queue_delivery_count = var.queue_dead_letter_queue_delivery_count
28+
purge_trigger = var.purge_trigger
29+
purge_type = var.purge_type
2830
defined_tags = {"foo-namespace.bar-key"= "value"}
2931
freeform_tags = {"bar-key"= "value"}
3032
retention_in_seconds = var.queue_retention_in_seconds
@@ -48,7 +50,7 @@ The following arguments are supported:
4850
* `timeout_in_seconds` - (Optional) (Updatable) The default polling timeout of the messages in the queue, in seconds.
4951
* `visibility_in_seconds` - (Optional) (Updatable) The default visibility timeout of the messages consumed from the queue, in seconds.
5052
* `purge_trigger` - (Optional) (Updatable) An optional property when incremented triggers Purge. Could be set to any integer value.
51-
53+
* `purge_type` - (Optional) (Updatable) An optional value that specifies the purge behavior for the Queue. Could be set to NORMAL, DLQ or BOTH. If unset, the default value is NORMAL
5254

5355
** IMPORTANT **
5456
Any change to a property that does not support update will force the destruction and recreation of the resource with the new property values

0 commit comments

Comments
 (0)