Skip to content

Commit

Permalink
feat: SQS FIFO queues (experimental)
Browse files Browse the repository at this point in the history
Extends the work in #1503 to add FIFO queues as an option

As before, this should be considered experimental at this stage.

[#186768689](https://www.pivotaltracker.com/story/show/186768689)
  • Loading branch information
blgm committed Feb 2, 2024
1 parent 25953b2 commit d6be9ed
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 21 deletions.
2 changes: 1 addition & 1 deletion .envrc
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ export GSB_SERVICE_CSB_AWS_AURORA_MYSQL_PLANS='[{"name":"default","id":"10b2bd92
export GSB_SERVICE_CSB_AWS_MYSQL_PLANS='[{"name":"default","id":"0f3522b2-f040-443b-bc53-4aed25284840","description":"Default MySQL plan","display_name":"default","instance_class":"db.t3.micro","mysql_version":"8.0","storage_gb":100}]'
export GSB_SERVICE_CSB_AWS_REDIS_PLANS='[{"name":"default", "id":"c7f64994-a1d9-4e1f-9491-9d8e56bbf146","description":"Default Redis plan","display_name":"default","node_type":"cache.t3.medium","redis_version": "6.0"},{"name" : "example-with-flexible-node-type","id" : "2deb6c13-7ea1-4bad-a519-0ac9600e9a29","description" : "An example of a Redis plan for which node_type can be specified at provision time. Replace with your own plan configuration.","redis_version" : "6.x","node_count" : 2}]'
export GSB_SERVICE_CSB_AWS_MSSQL_PLANS='[{"name":"default","id":"7400cd8f-5f98-4457-8de0-03232ec12f62","description":"Default MSSQL plan","display_name":"default","engine":"sqlserver-se","mssql_version":"15.00","storage_gb":100, "instance_class":"db.r5.large" }]'
export GSB_SERVICE_CSB_AWS_SQS_PLANS='[{"name":"standard","id":"c2fdfc84-bf86-11ee-a4f5-8b0d531ce7e2","description":"Default SQS standard queue plan","display_name":"standard"}]'
export GSB_SERVICE_CSB_AWS_SQS_PLANS='[{"name":"standard","id":"c2fdfc84-bf86-11ee-a4f5-8b0d531ce7e2","description":"Default SQS standard queue plan","display_name":"standard"},{"name":"fifo","id":"093c1060-c1c0-11ee-8b97-ff07a1127dae","description":"Default SQS FIFO queue plan","display_name":"fifo","fifo":true}]'
export GSB_BROKERPAK_CONFIG='{"global_labels":[{"key": "key1", "value": "value1"},{"key": "key2", "value": "value2"}]}'
5 changes: 5 additions & 0 deletions aws-sqs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ provision:
- eu-west-1
pattern: ^[a-z][a-z0-9-]+$
prohibit_update: true
- field_name: fifo
type: boolean
details: Whether to create a FIFO queue. Cannot be altered once a queue is created.
prohibit_update: true
default: false
- field_name: aws_access_key_id
type: string
details: AWS access key
Expand Down
50 changes: 32 additions & 18 deletions integration-tests/sqs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,26 @@ const (
sqsServiceProviderDisplayName = "VMware"
sqsCustomStandardPlanName = "custom-standard"
sqsCustomStandardPlanID = "4c206ad6-bf89-11ee-8900-2f8e8940fc0d"
sqsCustomFIFOPlanName = "custom-fifo"
sqsCustomFIFOPlanID = "720feea2-c1bd-11ee-82ff-e3c9f193c356"
)

var customSQSPlans = []map[string]any{
customSQSPlan,
}

var customSQSPlan = map[string]any{
"name": sqsCustomStandardPlanName,
"id": sqsCustomStandardPlanID,
"description": "Custom SQS standard queue plan",
"metadata": map[string]any{
"displayName": "custom-standard",
{
"name": sqsCustomStandardPlanName,
"id": sqsCustomStandardPlanID,
"description": "Custom SQS standard queue plan",
"metadata": map[string]any{
"displayName": "custom-standard",
},
},
{
"name": sqsCustomFIFOPlanName,
"id": sqsCustomFIFOPlanID,
"description": "Custom SQS FIFO queue plan",
"metadata": map[string]any{
"displayName": "custom-fifo",
},
},
}

Expand All @@ -55,14 +63,16 @@ var _ = Describe("SQS", Label("SQS"), func() {
Expect(service.Metadata.ImageUrl).To(ContainSubstring("data:image/png;base64,"))
Expect(service.Metadata.SupportUrl).To(Equal(sqsServiceSupportURL))
Expect(service.Metadata.ProviderDisplayName).To(Equal(sqsServiceProviderDisplayName))
Expect(service.Plans).To(
ConsistOf(
MatchFields(IgnoreExtras, Fields{
Name: Equal(sqsCustomStandardPlanName),
ID: Equal(sqsCustomStandardPlanID),
}),
),
)
Expect(service.Plans).To(ConsistOf(
MatchFields(IgnoreExtras, Fields{
Name: Equal(sqsCustomStandardPlanName),
ID: Equal(sqsCustomStandardPlanID),
}),
MatchFields(IgnoreExtras, Fields{
Name: Equal(sqsCustomFIFOPlanName),
ID: Equal(sqsCustomFIFOPlanID),
}),
))
})

Describe("provisioning", func() {
Expand All @@ -79,7 +89,7 @@ var _ = Describe("SQS", Label("SQS"), func() {
),
)

It("should provision a plan", func() {
It("should provision a queue", func() {
instanceID, err := broker.Provision(sqsServiceName, sqsCustomStandardPlanName, nil)
Expect(err).NotTo(HaveOccurred())

Expand All @@ -91,6 +101,7 @@ var _ = Describe("SQS", Label("SQS"), func() {
"key2": Equal("value2"),
})),
HaveKeyWithValue("instance_name", fmt.Sprintf("csb-sqs-%s", instanceID)),
HaveKeyWithValue("fifo", BeFalse()),
HaveKeyWithValue("region", fakeRegion),
HaveKeyWithValue("aws_access_key_id", awsAccessKeyID),
HaveKeyWithValue("aws_secret_access_key", awsSecretAccessKey),
Expand All @@ -101,6 +112,7 @@ var _ = Describe("SQS", Label("SQS"), func() {
It("should allow properties to be set on provision", func() {
_, err := broker.Provision(sqsServiceName, sqsCustomStandardPlanName, map[string]any{
"region": "africa-north-4",
"fifo": true,
"aws_access_key_id": "fake-aws-access-key-id",
"aws_secret_access_key": "fake-aws-secret-access-key",
})
Expand All @@ -109,6 +121,7 @@ var _ = Describe("SQS", Label("SQS"), func() {
Expect(mockTerraform.FirstTerraformInvocationVars()).To(
SatisfyAll(
HaveKeyWithValue("region", "africa-north-4"),
HaveKeyWithValue("fifo", BeTrue()),
HaveKeyWithValue("aws_access_key_id", "fake-aws-access-key-id"),
HaveKeyWithValue("aws_secret_access_key", "fake-aws-secret-access-key"),
),
Expand Down Expand Up @@ -140,6 +153,7 @@ var _ = Describe("SQS", Label("SQS"), func() {
Expect(mockTerraform.ApplyInvocations()).To(HaveLen(initialProvisionInvocation))
},
Entry("update region", "region", "no-matter-what-region"),
Entry("update fifo", "fifo", true),
)

DescribeTable(
Expand Down
18 changes: 18 additions & 0 deletions terraform-tests/sqs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ var _ = Describe("SQS", Label("SQS-terraform"), Ordered, func() {
BeforeEach(func() {
defaultVars = map[string]any{
"instance_name": name,
"fifo": false,
"labels": map[string]string{"label1": "value1"},
"aws_access_key_id": awsAccessKeyID,
"aws_secret_access_key": awsSecretAccessKey,
Expand Down Expand Up @@ -62,4 +63,21 @@ var _ = Describe("SQS", Label("SQS-terraform"), Ordered, func() {
)
})
})

Context("FIFO queues", func() {
BeforeAll(func() {
plan = ShowPlan(terraformProvisionDir, buildVars(defaultVars, map[string]any{
"fifo": true,
}))
})

It("should create an SQS FIFO queue with the correct properties", func() {
Expect(AfterValuesForType(plan, "aws_sqs_queue")).To(
MatchKeys(IgnoreExtras, Keys{
"name": Equal(fmt.Sprintf("%s.fifo", name)),
"fifo_queue": BeTrue(),
}),
)
})
})
})
8 changes: 6 additions & 2 deletions terraform/sqs/provision/main.tf
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
resource "aws_sqs_queue" "queue" {
name = var.instance_name
fifo_queue = false
name = var.fifo ? "${var.instance_name}.fifo" : var.instance_name
fifo_queue = var.fifo
tags = var.labels

lifecycle {
prevent_destroy = true
}
}
1 change: 1 addition & 0 deletions terraform/sqs/provision/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ variable "region" { type = string }

variable "instance_name" { type = string }
variable "labels" { type = map(any) }
variable "fifo" { type = bool }

0 comments on commit d6be9ed

Please sign in to comment.