Skip to content

Commit f7139c4

Browse files
authored
feat: The following DA variables have been renamed<br>- admin_pass_secret_manager_secret_name -> admin_pass_secrets_manager_secret_name<br>- use_existing_admin_pass_secret_manager_secret_group -> use_existing_admin_pass_secrets_manager_secret_group<br>- admin_pass_secret_manager_secret_group -> admin_pass_secrets_manager_secret_group<br>- skip_mongodb_secret_manager_auth_policy -> skip_mongodb_secrets_manager_auth_policy (#549)
1 parent caab970 commit f7139c4

File tree

7 files changed

+81
-43
lines changed

7 files changed

+81
-43
lines changed

examples/complete/main.tf

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
##############################################################################
44

55
locals {
6-
secret_manager_guid = var.existing_secret_manager_instance_guid == null ? module.secrets_manager[0].secrets_manager_guid : var.existing_secret_manager_instance_guid
7-
secret_manager_region = var.existing_secret_manager_instance_region == null ? var.region : var.existing_secret_manager_instance_region
6+
secrets_manager_guid = var.existing_secrets_manager_instance_guid == null ? module.secrets_manager[0].secrets_manager_guid : var.existing_secrets_manager_instance_guid
7+
secrets_manager_region = var.existing_secrets_manager_instance_region == null ? var.region : var.existing_secrets_manager_instance_region
88
service_credential_names = {
99
"es_admin" : "Administrator",
1010
"es_operator" : "Operator",
@@ -131,7 +131,7 @@ module "icd_mongodb" {
131131

132132
# Create Secrets Manager Instance (if not using existing one)
133133
module "secrets_manager" {
134-
count = var.existing_secret_manager_instance_guid == null ? 1 : 0
134+
count = var.existing_secrets_manager_instance_guid == null ? 1 : 0
135135
source = "terraform-ibm-modules/secrets-manager/ibm"
136136
version = "2.2.6"
137137
resource_group_id = module.resource_group.resource_group_id
@@ -146,8 +146,8 @@ module "secrets_manager" {
146146
module "secrets_manager_secrets_group" {
147147
source = "terraform-ibm-modules/secrets-manager-secret-group/ibm"
148148
version = "1.3.4"
149-
region = local.secret_manager_region
150-
secrets_manager_guid = local.secret_manager_guid
149+
region = local.secrets_manager_region
150+
secrets_manager_guid = local.secrets_manager_guid
151151
#tfsec:ignore:general-secrets-no-plaintext-exposure
152152
secret_group_name = "${var.prefix}-es-secrets"
153153
secret_group_description = "service secret-group" #tfsec:ignore:general-secrets-no-plaintext-exposure
@@ -158,8 +158,8 @@ module "secrets_manager_service_credentials_user_pass" {
158158
source = "terraform-ibm-modules/secrets-manager-secret/ibm"
159159
version = "1.7.0"
160160
for_each = local.service_credential_names
161-
region = local.secret_manager_region
162-
secrets_manager_guid = local.secret_manager_guid
161+
region = local.secrets_manager_region
162+
secrets_manager_guid = local.secrets_manager_guid
163163
secret_group_id = module.secrets_manager_secrets_group.secret_group_id
164164
secret_name = "${var.prefix}-${each.key}-credentials"
165165
secret_description = "MongoDB Service Credentials for ${each.key}"
@@ -172,8 +172,8 @@ module "secrets_manager_service_credentials_user_pass" {
172172
module "secrets_manager_service_credentials_cert" {
173173
source = "terraform-ibm-modules/secrets-manager-secret/ibm"
174174
version = "1.7.0"
175-
region = local.secret_manager_region
176-
secrets_manager_guid = local.secret_manager_guid
175+
region = local.secrets_manager_region
176+
secrets_manager_guid = local.secrets_manager_guid
177177
secret_group_id = module.secrets_manager_secrets_group.secret_group_id
178178
secret_name = "${var.prefix}-es-cert"
179179
secret_description = "MongoDB Service Credential Certificate"

examples/complete/variables.tf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ variable "plan" {
4747
default = "enterprise"
4848
}
4949

50-
variable "existing_secret_manager_instance_guid" {
50+
variable "existing_secrets_manager_instance_guid" {
5151
type = string
5252
description = "Existing Secrets Manager GUID. If not provided an new instance will be provisioned"
5353
default = null
5454
}
5555

56-
variable "existing_secret_manager_instance_region" {
56+
variable "existing_secrets_manager_instance_region" {
5757
type = string
58-
description = "Required if value is passed into var.existing_secret_manager_instance_guid"
58+
description = "Required if value is passed into var.existing_secrets_manager_instance_guid"
5959
default = null
6060
}
6161

ibm_catalog.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,16 +226,16 @@
226226
"key": "admin_pass"
227227
},
228228
{
229-
"key": "admin_pass_secret_manager_secret_group"
229+
"key": "admin_pass_secrets_manager_secret_group"
230230
},
231231
{
232-
"key": "admin_pass_secret_manager_secret_name"
232+
"key": "admin_pass_secrets_manager_secret_name"
233233
},
234234
{
235235
"key": "existing_mongodb_instance_crn"
236236
},
237237
{
238-
"key": "use_existing_admin_pass_secret_manager_secret_group"
238+
"key": "use_existing_admin_pass_secrets_manager_secret_group"
239239
},
240240
{
241241
"key": "users"
@@ -292,7 +292,7 @@
292292
"key": "service_credential_secrets"
293293
},
294294
{
295-
"key": "skip_mongodb_secret_manager_auth_policy"
295+
"key": "skip_mongodb_secrets_manager_auth_policy"
296296
}
297297
]
298298
}

solutions/standard/main.tf

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@ module "resource_group" {
99
existing_resource_group_name = var.use_existing_resource_group == true ? var.resource_group_name : null
1010
}
1111

12-
1312
#######################################################################################################################
1413
# KMS encryption key
1514
#######################################################################################################################
1615

1716
locals {
18-
create_new_kms_key = var.existing_mongodb_instance_crn == null && !var.use_ibm_owned_encryption_key && var.existing_kms_key_crn == null ? 1 : 0 # no need to create any KMS resources if passing an existing key, or using IBM owned keys
17+
create_new_kms_key = var.existing_mongodb_instance_crn == null && !var.use_ibm_owned_encryption_key && var.existing_kms_key_crn == null ? true : false # no need to create any KMS resources if passing an existing key, or using IBM owned keys
1918
mongodb_key_name = var.prefix != null ? "${var.prefix}-${var.key_name}" : var.key_name
2019
mongodb_key_ring_name = var.prefix != null ? "${var.prefix}-${var.key_ring_name}" : var.key_ring_name
2120
}
@@ -24,7 +23,7 @@ module "kms" {
2423
providers = {
2524
ibm = ibm.kms
2625
}
27-
count = local.create_new_kms_key
26+
count = local.create_new_kms_key ? 1 : 0
2827
source = "terraform-ibm-modules/kms-all-inclusive/ibm"
2928
version = "5.0.2"
3029
create_key_protect_instance = false
@@ -89,7 +88,6 @@ locals {
8988
create_cross_account_kms_auth_policy = var.existing_mongodb_instance_crn == null && var.ibmcloud_kms_api_key != null && !var.use_ibm_owned_encryption_key
9089
create_cross_account_backup_kms_auth_policy = var.existing_mongodb_instance_crn == null && var.ibmcloud_kms_api_key != null && !var.use_ibm_owned_encryption_key && var.existing_backup_kms_key_crn != null
9190

92-
9391
# If KMS encryption enabled (and existing ES instance is not being passed), parse details from the existing key if being passed, otherwise get it from the key that the DA creates
9492
kms_account_id = var.existing_mongodb_instance_crn != null || var.use_ibm_owned_encryption_key ? null : var.existing_kms_key_crn != null ? module.kms_key_crn_parser[0].account_id : module.kms_instance_crn_parser[0].account_id
9593
kms_service = var.existing_mongodb_instance_crn != null || var.use_ibm_owned_encryption_key ? null : var.existing_kms_key_crn != null ? module.kms_key_crn_parser[0].service_name : module.kms_instance_crn_parser[0].service_name
@@ -98,7 +96,6 @@ locals {
9896
kms_key_id = var.existing_mongodb_instance_crn != null || var.use_ibm_owned_encryption_key ? null : var.existing_kms_key_crn != null ? module.kms_key_crn_parser[0].resource : module.kms[0].keys[format("%s.%s", local.mongodb_key_ring_name, local.mongodb_key_name)].key_id
9997
kms_region = var.existing_mongodb_instance_crn != null || var.use_ibm_owned_encryption_key ? null : var.existing_kms_key_crn != null ? module.kms_key_crn_parser[0].region : module.kms_instance_crn_parser[0].region
10098

101-
10299
# If creating KMS cross account policy for backups, parse backup key details from passed in key CRN
103100
backup_kms_account_id = local.create_cross_account_backup_kms_auth_policy ? module.kms_backup_key_crn_parser[0].account_id : local.kms_account_id
104101
backup_kms_service = local.create_cross_account_backup_kms_auth_policy ? module.kms_backup_key_crn_parser[0].service_name : local.kms_service
@@ -223,8 +220,6 @@ locals {
223220
# elseif _ replace first char with K
224221
# else use asis
225222
generated_admin_password = startswith(random_password.admin_password[0].result, "-") ? "J${substr(random_password.admin_password[0].result, 1, -1)}" : startswith(random_password.admin_password[0].result, "_") ? "K${substr(random_password.admin_password[0].result, 1, -1)}" : random_password.admin_password[0].result
226-
227-
228223
# admin password to use
229224
admin_pass = var.admin_pass == null ? local.generated_admin_password : var.admin_pass
230225
}
@@ -315,21 +310,20 @@ locals {
315310
#######################################################################################################################
316311

317312
locals {
318-
create_secret_manager_auth_policy = var.skip_mongodb_secret_manager_auth_policy || var.existing_secrets_manager_instance_crn == null ? 0 : 1
313+
create_secrets_manager_auth_policy = var.skip_mongodb_secrets_manager_auth_policy || var.existing_secrets_manager_instance_crn == null ? 0 : 1
319314
}
320315

321316
# Parse the Secrets Manager CRN
322-
module "secret_manager_instance_crn_parser" {
317+
module "secrets_manager_instance_crn_parser" {
323318
count = var.existing_secrets_manager_instance_crn != null ? 1 : 0
324319
source = "terraform-ibm-modules/common-utilities/ibm//modules/crn-parser"
325320
version = "1.1.0"
326321
crn = var.existing_secrets_manager_instance_crn
327322
}
328323

329-
330324
# create a service authorization between Secrets Manager and the target service (Databases for MongoDB)
331325
resource "ibm_iam_authorization_policy" "secrets_manager_key_manager" {
332-
count = local.create_secret_manager_auth_policy
326+
count = local.create_secrets_manager_auth_policy
333327
depends_on = [module.mongodb]
334328
source_service_name = "secrets-manager"
335329
source_resource_instance_id = local.existing_secrets_manager_instance_guid
@@ -341,7 +335,7 @@ resource "ibm_iam_authorization_policy" "secrets_manager_key_manager" {
341335

342336
# workaround for https://github.com/IBM-Cloud/terraform-provider-ibm/issues/4478
343337
resource "time_sleep" "wait_for_mongodb_authorization_policy" {
344-
count = local.create_secret_manager_auth_policy
338+
count = local.create_secrets_manager_auth_policy
345339
depends_on = [ibm_iam_authorization_policy.secrets_manager_key_manager]
346340
create_duration = "30s"
347341
}
@@ -371,10 +365,10 @@ locals {
371365

372366
# Build the structure of the arbitrary credential type secret for admin password
373367
admin_pass_secret = [{
374-
secret_group_name = (var.prefix != null && var.prefix != "") && var.admin_pass_secret_manager_secret_group != null ? "${var.prefix}-${var.admin_pass_secret_manager_secret_group}" : var.admin_pass_secret_manager_secret_group
375-
existing_secret_group = var.use_existing_admin_pass_secret_manager_secret_group
368+
secret_group_name = (var.prefix != null && var.prefix != "") && var.admin_pass_secrets_manager_secret_group != null ? "${var.prefix}-${var.admin_pass_secrets_manager_secret_group}" : var.admin_pass_secrets_manager_secret_group
369+
existing_secret_group = var.use_existing_admin_pass_secrets_manager_secret_group
376370
secrets = [{
377-
secret_name = (var.prefix != null && var.prefix != "") && var.admin_pass_secret_manager_secret_name != null ? "${var.prefix}-${var.admin_pass_secret_manager_secret_name}" : var.admin_pass_secret_manager_secret_name
371+
secret_name = (var.prefix != null && var.prefix != "") && var.admin_pass_secrets_manager_secret_name != null ? "${var.prefix}-${var.admin_pass_secrets_manager_secret_name}" : var.admin_pass_secrets_manager_secret_name
378372
secret_type = "arbitrary"
379373
secret_payload_password = local.admin_pass
380374
}
@@ -384,8 +378,8 @@ locals {
384378
# Concatinate into 1 secrets object
385379
secrets = concat(local.service_credential_secrets, local.admin_pass_secret)
386380
# Parse Secrets Manager details from the CRN
387-
existing_secrets_manager_instance_guid = var.existing_secrets_manager_instance_crn != null ? module.secret_manager_instance_crn_parser[0].service_instance : null
388-
existing_secrets_manager_instance_region = var.existing_secrets_manager_instance_crn != null ? module.secret_manager_instance_crn_parser[0].region : null
381+
existing_secrets_manager_instance_guid = var.existing_secrets_manager_instance_crn != null ? module.secrets_manager_instance_crn_parser[0].service_instance : null
382+
existing_secrets_manager_instance_region = var.existing_secrets_manager_instance_crn != null ? module.secrets_manager_instance_crn_parser[0].region : null
389383
}
390384

391385
module "secrets_manager_service_credentials" {

solutions/standard/variables.tf

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ variable "kms_endpoint_type" {
192192
type = string
193193
description = "The type of endpoint to use for communicating with the Key Protect or Hyper Protect Crypto Services instance. Possible values: `public`, `private`. Applies only if `existing_kms_key_crn` is not specified."
194194
default = "private"
195+
195196
validation {
196197
condition = can(regex("public|private", var.kms_endpoint_type))
197198
error_message = "The kms_endpoint_type value must be 'public' or 'private'."
@@ -304,6 +305,7 @@ variable "existing_secrets_manager_endpoint_type" {
304305
type = string
305306
description = "The endpoint type to use if `existing_secrets_manager_instance_crn` is specified. Possible values: public, private."
306307
default = "private"
308+
307309
validation {
308310
condition = contains(["public", "private"], var.existing_secrets_manager_endpoint_type)
309311
error_message = "Only \"public\" and \"private\" are allowed values for 'existing_secrets_endpoint_type'."
@@ -350,41 +352,42 @@ variable "service_credential_secrets" {
350352
}
351353
}
352354

353-
variable "skip_mongodb_secret_manager_auth_policy" {
355+
variable "skip_mongodb_secrets_manager_auth_policy" {
354356
type = bool
355357
description = "Whether an IAM authorization policy is created for Secrets Manager instance to create a service credential secrets for Databases for MongoDB. If set to false, the Secrets Manager instance passed by the user is granted the Key Manager access to the MongoDB instance created by the Deployable Architecture. Set to `true` to use an existing policy. The value of this is ignored if any value for 'existing_secrets_manager_instance_crn' is not passed."
356358
default = false
357359
}
358360

359-
variable "admin_pass_secret_manager_secret_group" {
361+
variable "admin_pass_secrets_manager_secret_group" {
360362
type = string
361363
description = "The name of a new or existing secrets manager secret group for admin password. To use existing secret group, `use_existing_admin_pass_secrets_manager_secret_group` must be set to `true`. If a prefix input variable is specified, the prefix is added to the name in the `<prefix>-<name>` format."
362364
default = "mongodb-secrets"
363365

364366
validation {
365367
condition = (
366368
var.existing_secrets_manager_instance_crn == null ||
367-
var.admin_pass_secret_manager_secret_group != null
369+
var.admin_pass_secrets_manager_secret_group != null
368370
)
369-
error_message = "`admin_pass_secret_manager_secret_group` is required when `existing_secrets_manager_instance_crn` is set."
371+
error_message = "`admin_pass_secrets_manager_secret_group` is required when `existing_secrets_manager_instance_crn` is set."
370372
}
371373
}
372374

373-
variable "use_existing_admin_pass_secret_manager_secret_group" {
375+
variable "use_existing_admin_pass_secrets_manager_secret_group" {
374376
type = bool
375377
description = "Whether to use an existing secrets manager secret group for admin password."
376378
default = false
377379
}
378380

379-
variable "admin_pass_secret_manager_secret_name" {
381+
variable "admin_pass_secrets_manager_secret_name" {
380382
type = string
381383
description = "The name of a new mongodb administrator secret. If a prefix input variable is specified, the prefix is added to the name in the `<prefix>-<name>` format."
382384
default = "mongodb-admin-password"
385+
383386
validation {
384387
condition = (
385388
var.existing_secrets_manager_instance_crn == null ||
386-
var.admin_pass_secret_manager_secret_name != null
389+
var.admin_pass_secrets_manager_secret_name != null
387390
)
388-
error_message = "`admin_pass_secret_manager_secret_name` is required when `existing_secrets_manager_instance_crn` is set."
391+
error_message = "`admin_pass_secrets_manager_secret_name` is required when `existing_secrets_manager_instance_crn` is set."
389392
}
390393
}

tests/other_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
package test
33

44
import (
5+
"crypto/rand"
6+
"encoding/base64"
57
"fmt"
68

79
"testing"
810

911
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
1013
"github.com/terraform-ibm-modules/ibmcloud-terratest-wrapper/testhelper"
1114
)
1215

@@ -55,3 +58,41 @@ func TestRunRestoredDBExample(t *testing.T) {
5558
assert.Nil(t, err, "This should not have errored")
5659
assert.NotNil(t, output, "Expected some output")
5760
}
61+
62+
func TestRunCompleteExample(t *testing.T) {
63+
t.Parallel()
64+
65+
options := testhelper.TestOptionsDefaultWithVars(&testhelper.TestOptions{
66+
Testing: t,
67+
TerraformDir: "examples/complete",
68+
Prefix: "mongodb-upg",
69+
BestRegionYAMLPath: regionSelectionPath,
70+
ResourceGroup: resourceGroup,
71+
TerraformVars: map[string]interface{}{
72+
"mongodb_version": "6.0", // Always lock to the lowest supported MongoDB version
73+
"plan": "standard",
74+
"users": []map[string]interface{}{
75+
{
76+
"name": "testuser",
77+
"password": GetRandomAdminPassword(t),
78+
"type": "database",
79+
},
80+
},
81+
"admin_pass": GetRandomAdminPassword(t),
82+
},
83+
CloudInfoService: sharedInfoSvc,
84+
})
85+
86+
output, err := options.RunTestConsistency()
87+
assert.Nil(t, err, "This should not have errored")
88+
assert.NotNil(t, output, "Expected some output")
89+
}
90+
91+
func GetRandomAdminPassword(t *testing.T) string {
92+
// Generate a 15 char long random string for the admin_pass
93+
randomBytes := make([]byte, 13)
94+
_, randErr := rand.Read(randomBytes)
95+
require.Nil(t, randErr) // do not proceed if we can't gen a random password
96+
randomPass := "A1" + base64.URLEncoding.EncodeToString(randomBytes)[:13]
97+
return randomPass
98+
}

tests/pr_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ func TestRunStandardSolutionSchematics(t *testing.T) {
103103
{Name: "service_credential_names", Value: "{\"admin_test\": \"Administrator\", \"editor_test\": \"Editor\"}", DataType: "map(string)"},
104104
{Name: "existing_secrets_manager_instance_crn", Value: permanentResources["secretsManagerCRN"], DataType: "string"},
105105
{Name: "service_credential_secrets", Value: serviceCredentialSecrets, DataType: "list(object)"},
106-
{Name: "admin_pass_secret_manager_secret_group", Value: options.Prefix, DataType: "string"},
107-
{Name: "admin_pass_secret_manager_secret_name", Value: options.Prefix, DataType: "string"},
106+
{Name: "admin_pass_secrets_manager_secret_group", Value: options.Prefix, DataType: "string"},
107+
{Name: "admin_pass_secrets_manager_secret_name", Value: options.Prefix, DataType: "string"},
108108
{Name: "provider_visibility", Value: "private", DataType: "string"},
109109
{Name: "prefix", Value: options.Prefix, DataType: "string"},
110110
}

0 commit comments

Comments
 (0)