diff --git a/README.md b/README.md index 94f19c3..b84967e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The following attributes and parameters are supported for all secret types: - `secret_type` : The type of the secret. - `secret_labels` : Any labels to attach to the secret. -The following attributes and paramters are supported when storing arbitrary secrets: +The following attributes and parameters are supported when storing arbitrary secrets: - `secret_payload_password`: The payload (for arbitrary secrets) or password (for username and password credentials) of the secret. @@ -80,7 +80,7 @@ module "secrets_manager_arbitrary_secret" { secrets_manager_guid = "42454b3b-5b06-407b-a4b3-34d9ef323901" secret_group_id = "432b91f1-ff6d-4b47-9f06-82debc236d90" secret_name = "example-arbitrary-secret" - secret_description = "Extended description for the arbirtary secret." + secret_description = "Extended description for the arbitrary secret." secret_type = "arbitrary" secret_payload_password = "secret-data" #pragma: allowlist secret } @@ -191,6 +191,7 @@ No modules. | Name | Type | |------|------| | [ibm_sm_arbitrary_secret.arbitrary_secret](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/sm_arbitrary_secret) | resource | +| [ibm_sm_custom_credentials_secret.custom_credentials_secret](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/sm_custom_credentials_secret) | resource | | [ibm_sm_imported_certificate.imported_cert](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/sm_imported_certificate) | resource | | [ibm_sm_kv_secret.kv_secret](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/sm_kv_secret) | resource | | [ibm_sm_service_credentials_secret.service_credentials_secret](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/sm_service_credentials_secret) | resource | @@ -200,11 +201,14 @@ No modules. | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| +| [custom\_credentials\_configurations](#input\_custom\_credentials\_configurations) | The name of the custom credentials secret configuration. | `string` | `null` | no | +| [custom\_credentials\_parameters](#input\_custom\_credentials\_parameters) | Whether to create parameters for custom credentials secret or not | `bool` | `false` | no | | [custom\_metadata](#input\_custom\_metadata) | Optional metadata to be added to the secret. | `map(string)` | `null` | no | | [endpoint\_type](#input\_endpoint\_type) | The endpoint type to communicate with the provided secrets manager instance. Possible values are `public` or `private` | `string` | `"public"` | no | | [imported\_cert\_certificate](#input\_imported\_cert\_certificate) | The TLS certificate to import. | `string` | `null` | no | | [imported\_cert\_intermediate](#input\_imported\_cert\_intermediate) | (optional) The intermediate certificate for the TLS certificate to import. | `string` | `null` | no | | [imported\_cert\_private\_key](#input\_imported\_cert\_private\_key) | (optional) The private key for the TLS certificate to import. | `string` | `null` | no | +| [job\_parameters](#input\_job\_parameters) | The parameters that are passed to the Code Engine job. |
object({
integer_values = optional(map(number))
string_values = optional(map(string))
boolean_values = optional(map(bool))
}) | `{}` | no |
| [region](#input\_region) | The region where the Secrets Manager instance is deployed. | `string` | n/a | yes |
| [secret\_auto\_rotation](#input\_secret\_auto\_rotation) | Whether to configure automatic rotation. Applies only to the `username_password` and `service_credentials` secret types. | `bool` | `true` | no |
| [secret\_auto\_rotation\_interval](#input\_secret\_auto\_rotation\_interval) | Specifies the rotation interval for the rotation unit. | `number` | `89` | no |
@@ -215,7 +219,7 @@ No modules.
| [secret\_labels](#input\_secret\_labels) | Labels of the secret to create. Up to 30 labels can be created. Labels can be 2 - 30 characters, including spaces. Special characters that are not permitted include the angled brackets (<>), comma (,), colon (:), ampersand (&), and vertical pipe character (\|). | `list(string)` | `[]` | no |
| [secret\_name](#input\_secret\_name) | Name of the secret to create. | `string` | n/a | yes |
| [secret\_payload\_password](#input\_secret\_payload\_password) | The payload (for arbitrary secrets) or password (for username and password credentials) of the secret. | `string` | `""` | no |
-| [secret\_type](#input\_secret\_type) | Type of secret to create, must be one of: arbitrary, username\_password, imported\_cert, service\_credentials | `string` | n/a | yes |
+| [secret\_type](#input\_secret\_type) | Type of secret to create, must be one of: arbitrary, username\_password, imported\_cert, service\_credentials, custom\_credentials | `string` | n/a | yes |
| [secret\_username](#input\_secret\_username) | Username of the secret to create. Applies only to `username_password` secret types. When `null`, an `arbitrary` secret is created. | `string` | `null` | no |
| [secrets\_manager\_guid](#input\_secrets\_manager\_guid) | The instance ID of the Secrets Manager instance where the secret will be added. | `string` | n/a | yes |
| [service\_credentials\_existing\_serviceid\_crn](#input\_service\_credentials\_existing\_serviceid\_crn) | The optional parameter 'serviceid\_crn' for creating service credentials. If not passed in, a new Service ID will be created. For more information see https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/sm_service_credentials_secret#parameters | `string` | `null` | no |
@@ -234,7 +238,7 @@ No modules.
| [secret\_id](#output\_secret\_id) | ID of the created Secret |
| [secret\_next\_rotation\_date](#output\_secret\_next\_rotation\_date) | Next rotation date for secret (if applicable) |
| [secret\_rotation](#output\_secret\_rotation) | Status of auto-rotation for secret |
-| [secret\_rotation\_interval](#output\_secret\_rotation\_interval) | Rotation frecuency for secret (if applicable) |
+| [secret\_rotation\_interval](#output\_secret\_rotation\_interval) | Rotation frequency for secret (if applicable) |
## Contributing
diff --git a/examples/complete/main.tf b/examples/complete/main.tf
index 1569e62..b3fc45c 100644
--- a/examples/complete/main.tf
+++ b/examples/complete/main.tf
@@ -260,3 +260,152 @@ data "ibm_sm_kv_secret" "kv_secret" {
region = local.sm_region
secret_id = module.secrets_manager_key_value_secret.secret_id
}
+
+##############################################################################
+# Example working with Custom Credential Engine
+##############################################################################
+##############################################################################
+# Code Engine Project
+##############################################################################
+module "code_engine_project" {
+ source = "terraform-ibm-modules/code-engine/ibm//modules/project"
+ version = "4.5.8"
+ name = "${var.prefix}-project"
+ resource_group_id = module.resource_group.resource_group_id
+}
+
+##############################################################################
+# Code Engine Secret
+##############################################################################
+module "code_engine_secret" {
+ source = "terraform-ibm-modules/code-engine/ibm//modules/secret"
+ version = "4.5.8"
+ name = "${var.prefix}-rs"
+ project_id = module.code_engine_project.id
+ format = "registry"
+ data = {
+ "server" = "private.us.icr.io",
+ "username" = "iamapikey",
+ "password" = var.ibmcloud_api_key,
+ }
+}
+
+##############################################################################
+# Container Registry Namespace
+##############################################################################
+resource "ibm_cr_namespace" "rg_namespace" {
+ name = "${var.prefix}-crn"
+ resource_group_id = module.resource_group.resource_group_id
+}
+
+##############################################################################
+# Code Engine Build
+##############################################################################
+locals {
+ output_image = "private.us.icr.io/${resource.ibm_cr_namespace.rg_namespace.name}/custom-engine-job"
+}
+
+module "code_engine_build" {
+ source = "terraform-ibm-modules/code-engine/ibm//modules/build"
+ version = "4.5.8"
+ name = "${var.prefix}-build"
+ ibmcloud_api_key = var.ibmcloud_api_key
+ project_id = module.code_engine_project.id
+ existing_resource_group_id = module.resource_group.resource_group_id
+ source_url = "https://github.com/IBM/secrets-manager-custom-credentials-providers"
+ source_context_dir = "ibmcloud-iam-user-apikey-provider-go"
+ strategy_type = "dockerfile"
+ output_secret = module.code_engine_secret.name
+ output_image = local.output_image
+}
+
+##############################################################################
+# Code Engine Job
+##############################################################################
+
+data "http" "job_config" {
+ url = "https://raw.githubusercontent.com/IBM/secrets-manager-custom-credentials-providers/refs/heads/main/ibmcloud-iam-user-apikey-provider-go/job_config.json"
+ request_headers = {
+ Accept = "application/json"
+ }
+}
+
+locals {
+ job_env_variables = jsondecode(data.http.job_config.response_body).job_env_variables
+}
+
+module "code_engine_job" {
+ depends_on = [module.code_engine_build]
+ source = "terraform-ibm-modules/code-engine/ibm//modules/job"
+ version = "4.5.8"
+ name = "${var.prefix}-job"
+ image_reference = local.output_image
+ image_secret = module.code_engine_secret.name
+ project_id = module.code_engine_project.id
+ run_env_variables = [
+ for env_var in local.job_env_variables : {
+ type = "literal"
+ name = env_var.name
+ value = tostring(env_var.value)
+ }
+ ]
+}
+
+##############################################################################
+# Custom Credential Engine and secret
+##############################################################################
+
+module "custom_credential_engine" {
+ depends_on = [module.code_engine_job]
+ source = "terraform-ibm-modules/secrets-manager-custom-credentials-engine/ibm"
+ version = "1.0.0"
+ secrets_manager_guid = local.sm_guid
+ secrets_manager_region = local.sm_region
+ custom_credential_engine_name = "${var.prefix}-test-custom-engine"
+ endpoint_type = "public"
+ code_engine_project_id = module.code_engine_project.project_id
+ code_engine_job_name = module.code_engine_job.name
+ code_engine_region = var.existing_sm_instance_region == null ? var.region : var.existing_sm_instance_region
+ task_timeout = "10m"
+ service_id_name = "${var.prefix}-test-service-id"
+ iam_credential_secret_name = "${var.prefix}-test-iam-secret"
+}
+
+resource "ibm_iam_api_key" "api_key" {
+ name = "${var.prefix}-api-key"
+ description = "created for secrets-manager-secret complete example"
+}
+
+# create arbitrary secret
+module "secrets_manager_custom_arbitrary_secret" {
+ source = "../.."
+ region = local.sm_region
+ secrets_manager_guid = local.sm_guid
+ secret_group_id = module.secrets_manager_group.secret_group_id
+ secret_name = "${var.prefix}-custom-arbitrary-secret"
+ secret_description = "created by secrets-manager-secret-module complete example"
+ secret_type = "arbitrary" #checkov:skip=CKV_SECRET_6
+ secret_payload_password = ibm_iam_api_key.api_key.apikey
+ secret_labels = local.secret_labels
+ custom_metadata = { "metadata_custom_key" : "metadata_custom_value" } # can add any custom metadata here
+}
+
+# create custom credentials secret
+module "secret_manager_custom_credential" {
+ depends_on = [module.custom_credential_engine]
+ source = "../.."
+ secret_type = "custom_credentials" #checkov:skip=CKV_SECRET_6
+ region = local.sm_region
+ secrets_manager_guid = local.sm_guid
+ secret_name = "${var.prefix}-custom-credentials"
+ secret_group_id = module.secrets_manager_group.secret_group_id
+ secret_description = "created by secrets-manager-secret-module complete example"
+ custom_credentials_configurations = module.custom_credential_engine.custom_config_engine_name
+ custom_metadata = { "metadata_custom_key" : "metadata_custom_value" } # can add any custom metadata here
+ custom_credentials_parameters = true
+ job_parameters = {
+ string_values = {
+ apikey_secret_id = module.secrets_manager_custom_arbitrary_secret.secret_id
+ }
+ }
+}
diff --git a/examples/complete/outputs.tf b/examples/complete/outputs.tf
index b669c54..f2b2793 100644
--- a/examples/complete/outputs.tf
+++ b/examples/complete/outputs.tf
@@ -105,3 +105,13 @@ output "kv_secret_payload" {
sensitive = true
description = "accessing key value secret"
}
+
+output "custom_credential_secret_id" {
+ description = "ID of the created custom_credential secret"
+ value = module.secret_manager_custom_credential.secret_id
+}
+
+output "custom_credential_secret_crn" {
+ description = "CRN of the created custom_credential secret"
+ value = module.secret_manager_custom_credential.secret_crn
+}
diff --git a/examples/complete/variables.tf b/examples/complete/variables.tf
index 207c86e..f71e29d 100644
--- a/examples/complete/variables.tf
+++ b/examples/complete/variables.tf
@@ -7,7 +7,7 @@ variable "ibmcloud_api_key" {
variable "prefix" {
type = string
description = "Prefix to use for naming of all resource created by this example"
- default = "test-sm-secret-module"
+ default = "sm-secret-complete"
}
variable "sm_service_plan" {
@@ -19,7 +19,7 @@ variable "sm_service_plan" {
variable "region" {
type = string
description = "Region to provision Secrets Manager in if not passing a value for var.existing_sm_instance_guid"
- default = "au-syd"
+ default = "us-south" # Region is defaulted to us-south so as to restrict the code engine project to be created in the same region and have a hardcoded output image as `private.us`
}
variable "resource_group" {
@@ -36,7 +36,7 @@ variable "resource_tags" {
variable "existing_sm_instance_guid" {
type = string
- description = "Existing Secrets Manager GUID. If not provided an new instance will be provisioned"
+ description = "Existing Secrets Manager GUID. If not provided an new instance will be provisioned. If existing_sm_instance_guid needs to be used make sure the instance passed belongs to us-south region"
default = null
validation {
diff --git a/examples/complete/version.tf b/examples/complete/version.tf
index f93bc67..bd47e88 100644
--- a/examples/complete/version.tf
+++ b/examples/complete/version.tf
@@ -9,5 +9,9 @@ terraform {
source = "hashicorp/tls"
version = ">= 4.0.4"
}
+ http = {
+ source = "hashicorp/http"
+ version = "3.2.1" # Use a compatible version
+ }
}
}
diff --git a/examples/private/main.tf b/examples/private/main.tf
index 63fdd88..0e4035b 100644
--- a/examples/private/main.tf
+++ b/examples/private/main.tf
@@ -264,3 +264,151 @@ data "ibm_sm_kv_secret" "kv_secret" {
secret_id = module.secrets_manager_key_value_secret.secret_id
endpoint_type = "private"
}
+
+##############################################################################
+# Example working with Custom Credential Engine
+##############################################################################
+##############################################################################
+# Code Engine Project
+##############################################################################
+module "code_engine_project" {
+ source = "terraform-ibm-modules/code-engine/ibm//modules/project"
+ version = "4.5.8"
+ name = "${var.prefix}-project"
+ resource_group_id = module.resource_group.resource_group_id
+}
+
+##############################################################################
+# Code Engine Secret
+##############################################################################
+module "code_engine_secret" {
+ source = "terraform-ibm-modules/code-engine/ibm//modules/secret"
+ version = "4.5.8"
+ name = "${var.prefix}-rs"
+ project_id = module.code_engine_project.id
+ format = "registry"
+ data = {
+ "server" = "private.uk.icr.io",
+ "username" = "iamapikey",
+ "password" = var.ibmcloud_api_key,
+ }
+}
+
+##############################################################################
+# Container Registry Namespace
+##############################################################################
+resource "ibm_cr_namespace" "rg_namespace" {
+ name = "${var.prefix}-crn"
+ resource_group_id = module.resource_group.resource_group_id
+}
+
+##############################################################################
+# Code Engine Build
+##############################################################################
+locals {
+ output_image = "private.uk.icr.io/${resource.ibm_cr_namespace.rg_namespace.name}/custom-engine-job"
+}
+
+module "code_engine_build" {
+ source = "terraform-ibm-modules/code-engine/ibm//modules/build"
+ version = "4.5.8"
+ name = "${var.prefix}-build"
+ ibmcloud_api_key = var.ibmcloud_api_key
+ region = var.existing_sm_instance_region == null ? var.region : var.existing_sm_instance_region
+ project_id = module.code_engine_project.id
+ existing_resource_group_id = module.resource_group.resource_group_id
+ source_url = "https://github.com/IBM/secrets-manager-custom-credentials-providers"
+ source_context_dir = "ibmcloud-iam-user-apikey-provider-go"
+ strategy_type = "dockerfile"
+ output_secret = module.code_engine_secret.name
+ output_image = local.output_image
+}
+
+##############################################################################
+# Code Engine Job
+##############################################################################
+
+data "http" "job_config" {
+ url = "https://raw.githubusercontent.com/IBM/secrets-manager-custom-credentials-providers/refs/heads/main/ibmcloud-iam-user-apikey-provider-go/job_config.json"
+ request_headers = {
+ Accept = "application/json"
+ }
+}
+
+locals {
+ job_env_variables = jsondecode(data.http.job_config.response_body).job_env_variables
+}
+
+module "code_engine_job" {
+ source = "terraform-ibm-modules/code-engine/ibm//modules/job"
+ version = "4.5.8"
+ name = "${var.prefix}-job"
+ image_reference = local.output_image
+ image_secret = module.code_engine_secret.name
+ project_id = module.code_engine_project.id
+ run_env_variables = [
+ for env_var in local.job_env_variables : {
+ type = "literal"
+ name = env_var.name
+ value = tostring(env_var.value)
+ }
+ ]
+}
+
+##############################################################################
+# Custom Credential Engine and secret
+##############################################################################
+
+module "custom_credential_engine" {
+ source = "terraform-ibm-modules/secrets-manager-custom-credentials-engine/ibm"
+ version = "1.0.0"
+ secrets_manager_guid = module.secrets_manager.secrets_manager_guid
+ secrets_manager_region = local.sm_region
+ custom_credential_engine_name = "${var.prefix}-test-custom-engine"
+ endpoint_type = "private"
+ code_engine_project_id = module.code_engine_project.project_id
+ code_engine_job_name = module.code_engine_job.name
+ code_engine_region = var.existing_sm_instance_region == null ? var.region : var.existing_sm_instance_region
+ task_timeout = "10m"
+ service_id_name = "${var.prefix}-test-service-id"
+ iam_credential_secret_name = "${var.prefix}-test-iam-secret"
+}
+
+resource "ibm_iam_api_key" "api_key" {
+ name = "${var.prefix}-api-key"
+ description = "created for secrets-manager-secret complete example"
+}
+
+module "secrets_manager_custom_arbitrary_secret" {
+ source = "../.."
+ region = local.sm_region
+ secrets_manager_guid = module.secrets_manager.secrets_manager_guid
+ secret_group_id = module.secrets_manager_group.secret_group_id
+ secret_name = "${var.prefix}-custom-arbitrary-secret"
+ secret_description = "created by secrets-manager-secret-module private example"
+ secret_type = "arbitrary" #checkov:skip=CKV_SECRET_6
+ secret_payload_password = ibm_iam_api_key.api_key.apikey
+ secret_labels = local.secret_labels
+ endpoint_type = "private"
+}
+
+# create custom credentials secret
+module "secret_manager_custom_credential" {
+ depends_on = [module.custom_credential_engine]
+ source = "../.."
+ secret_type = "custom_credentials" #checkov:skip=CKV_SECRET_6
+ region = local.sm_region
+ secrets_manager_guid = module.secrets_manager.secrets_manager_guid
+ secret_name = "${var.prefix}-custom-credentials"
+ secret_group_id = module.secrets_manager_group.secret_group_id
+ secret_description = "created by secrets-manager-secret-module private example"
+ custom_credentials_configurations = module.custom_credential_engine.custom_config_engine_name
+ custom_metadata = { "metadata_custom_key" : "metadata_custom_value" } # can add any custom metadata here
+ custom_credentials_parameters = true
+ job_parameters = {
+ string_values = {
+ apikey_secret_id = module.secrets_manager_custom_arbitrary_secret.secret_id
+ }
+ }
+ endpoint_type = "private"
+}
diff --git a/examples/private/outputs.tf b/examples/private/outputs.tf
index b669c54..f2b2793 100644
--- a/examples/private/outputs.tf
+++ b/examples/private/outputs.tf
@@ -105,3 +105,13 @@ output "kv_secret_payload" {
sensitive = true
description = "accessing key value secret"
}
+
+output "custom_credential_secret_id" {
+ description = "ID of the created custom_credential secret"
+ value = module.secret_manager_custom_credential.secret_id
+}
+
+output "custom_credential_secret_crn" {
+ description = "CRN of the created custom_credential secret"
+ value = module.secret_manager_custom_credential.secret_crn
+}
diff --git a/examples/private/provider.tf b/examples/private/provider.tf
index df45ef5..f5dc922 100644
--- a/examples/private/provider.tf
+++ b/examples/private/provider.tf
@@ -1,4 +1,4 @@
provider "ibm" {
ibmcloud_api_key = var.ibmcloud_api_key
- region = var.region
+ region = var.existing_sm_instance_region == null ? var.region : var.existing_sm_instance_region
}
diff --git a/examples/private/variables.tf b/examples/private/variables.tf
index fbf0c09..50165ab 100644
--- a/examples/private/variables.tf
+++ b/examples/private/variables.tf
@@ -7,7 +7,7 @@ variable "ibmcloud_api_key" {
variable "prefix" {
type = string
description = "Prefix to use for naming of all resource created by this example"
- default = "test-sm-secret-module"
+ default = "sm-secret-private"
}
variable "sm_service_plan" {
@@ -19,7 +19,7 @@ variable "sm_service_plan" {
variable "region" {
type = string
description = "Region to provision Secrets Manager in if not passing a value for var.existing_sm_instance_guid"
- default = "au-syd"
+ default = "eu-gb" # Region is defaulted to eu-gb so as to restrict the code engine project to be created in the same region and have a hardcoded output image as `private.uk`
}
variable "resource_group" {
@@ -36,7 +36,7 @@ variable "resource_tags" {
variable "existing_sm_instance_crn" {
type = string
- description = "An existing Secrets Manager instance CRN. If not provided an new instance will be provisioned."
+ description = "An existing Secrets Manager instance CRN. If not provided an new instance will be provisioned. If existing_sm_instance_guid needs to be used make sure the instance passed belongs to eu-gb region"
default = null
validation {
diff --git a/examples/private/version.tf b/examples/private/version.tf
index f93bc67..bd47e88 100644
--- a/examples/private/version.tf
+++ b/examples/private/version.tf
@@ -9,5 +9,9 @@ terraform {
source = "hashicorp/tls"
version = ">= 4.0.4"
}
+ http = {
+ source = "hashicorp/http"
+ version = "3.2.1" # Use a compatible version
+ }
}
}
diff --git a/main.tf b/main.tf
index d1a3dcc..b085251 100644
--- a/main.tf
+++ b/main.tf
@@ -6,6 +6,7 @@
locals {
auto_rotation_enabled = var.secret_auto_rotation == true ? [1] : []
+ parameters_enabled = var.custom_credentials_parameters == true ? [1] : []
}
resource "ibm_sm_arbitrary_secret" "arbitrary_secret" {
@@ -129,6 +130,36 @@ resource "ibm_sm_kv_secret" "kv_secret" {
custom_metadata = var.custom_metadata
}
+resource "ibm_sm_custom_credentials_secret" "custom_credentials_secret" {
+ count = var.secret_type == "custom_credentials" ? 1 : 0 #checkov:skip=CKV_SECRET_6
+ instance_id = var.secrets_manager_guid
+ region = var.region
+ name = var.secret_name
+ endpoint_type = var.endpoint_type
+ secret_group_id = var.secret_group_id
+ custom_metadata = var.custom_metadata
+ description = var.secret_description
+ labels = var.secret_labels
+ configuration = var.custom_credentials_configurations
+ dynamic "parameters" {
+ for_each = local.parameters_enabled
+ content {
+ integer_values = var.job_parameters.integer_values
+ string_values = var.job_parameters.string_values
+ boolean_values = var.job_parameters.boolean_values
+ }
+ }
+ dynamic "rotation" {
+ for_each = local.auto_rotation_enabled
+ content {
+ auto_rotate = var.secret_auto_rotation
+ interval = var.secret_auto_rotation_interval
+ unit = var.secret_auto_rotation_unit
+ }
+ }
+ ttl = var.service_credentials_ttl
+}
+
# Parse secret ID and generate data header for secrets
locals {
secret_id = (
@@ -136,21 +167,24 @@ locals {
var.secret_type == "imported_cert" ? ibm_sm_imported_certificate.imported_cert[0].secret_id :
var.secret_type == "service_credentials" ? ibm_sm_service_credentials_secret.service_credentials_secret[0].secret_id :
var.secret_type == "arbitrary" ? ibm_sm_arbitrary_secret.arbitrary_secret[0].secret_id :
- var.secret_type == "key_value" ? ibm_sm_kv_secret.kv_secret[0].secret_id : null
+ var.secret_type == "key_value" ? ibm_sm_kv_secret.kv_secret[0].secret_id :
+ var.secret_type == "custom_credentials" ? ibm_sm_custom_credentials_secret.custom_credentials_secret[0].secret_id : null
)
secret_crn = (
var.secret_type == "username_password" ? ibm_sm_username_password_secret.username_password_secret[0].crn :
var.secret_type == "imported_cert" ? ibm_sm_imported_certificate.imported_cert[0].crn :
var.secret_type == "service_credentials" ? ibm_sm_service_credentials_secret.service_credentials_secret[0].crn :
var.secret_type == "arbitrary" ? ibm_sm_arbitrary_secret.arbitrary_secret[0].crn :
- var.secret_type == "key_value" ? ibm_sm_kv_secret.kv_secret[0].crn : null
+ var.secret_type == "key_value" ? ibm_sm_kv_secret.kv_secret[0].crn :
+ var.secret_type == "custom_credentials" ? ibm_sm_custom_credentials_secret.custom_credentials_secret[0].crn : null
)
#tfsec:ignore:general-secrets-no-plaintext-exposure
secret_auto_rotation_frequency = var.secret_auto_rotation == true ? "${var.secret_auto_rotation_interval} ${var.secret_auto_rotation_unit}(s)" : null #tfsec:ignore:general-secrets-no-plaintext-exposure
secret_next_rotation_date = (
var.secret_auto_rotation == true ?
var.secret_type == "username_password" ? ibm_sm_username_password_secret.username_password_secret[0].next_rotation_date :
- var.secret_type == "service_credentials" ? ibm_sm_service_credentials_secret.service_credentials_secret[0].next_rotation_date : null : null
+ var.secret_type == "service_credentials" ? ibm_sm_service_credentials_secret.service_credentials_secret[0].next_rotation_date :
+ var.secret_type == "custom_credentials" ? ibm_sm_custom_credentials_secret.custom_credentials_secret[0].next_rotation_date : null : null
)
secret_auto_rotation = (var.secret_type == "username_password" || var.secret_type == "service_credentials") ? var.secret_auto_rotation : null
}
diff --git a/outputs.tf b/outputs.tf
index e592eb5..9ccf8e4 100644
--- a/outputs.tf
+++ b/outputs.tf
@@ -23,7 +23,7 @@ output "secret_rotation" {
}
output "secret_rotation_interval" {
- description = "Rotation frecuency for secret (if applicable)"
+ description = "Rotation frequency for secret (if applicable)"
value = local.secret_auto_rotation_frequency
}
diff --git a/tests/pr_test.go b/tests/pr_test.go
index ff7cfe1..6f03964 100644
--- a/tests/pr_test.go
+++ b/tests/pr_test.go
@@ -66,6 +66,13 @@ func setupOptions(t *testing.T, prefix string, dir string) *testhelper.TestOptio
},
})
+ // need to ignore because of a provider issue: https://github.com/IBM-Cloud/terraform-provider-ibm/issues/4719
+ options.IgnoreUpdates = testhelper.Exemptions{
+ List: []string{
+ "module.code_engine_job.ibm_code_engine_job.ce_job",
+ },
+ }
+
return options
}
@@ -119,6 +126,13 @@ func TestPrivateInSchematics(t *testing.T) {
{Name: "skip_iam_authorization_policy", Value: true, DataType: "bool"},
}
+ // need to ignore because of a provider issue: https://github.com/IBM-Cloud/terraform-provider-ibm/issues/4719
+ options.IgnoreUpdates = testhelper.Exemptions{
+ List: []string{
+ "module.code_engine_job.ibm_code_engine_job.ce_job",
+ },
+ }
+
err := options.RunSchematicTest()
assert.Nil(t, err, "This should not have errored")
}
diff --git a/variables.tf b/variables.tf
index 3592d82..b8eb68b 100644
--- a/variables.tf
+++ b/variables.tf
@@ -20,11 +20,11 @@ variable "secret_group_id" {
variable "secret_type" {
type = string
- description = "Type of secret to create, must be one of: arbitrary, username_password, imported_cert, service_credentials"
+ description = "Type of secret to create, must be one of: arbitrary, username_password, imported_cert, service_credentials, custom_credentials"
validation {
- condition = contains(["arbitrary", "username_password", "imported_cert", "key_value", "service_credentials"], var.secret_type) #checkov:skip=CKV_SECRET_6
- error_message = "Only supported secrets types are arbitrary, username_password, key_value , imported_cert, or service_credentials"
+ condition = contains(["arbitrary", "username_password", "imported_cert", "key_value", "service_credentials", "custom_credentials"], var.secret_type) #checkov:skip=CKV_SECRET_6
+ error_message = "Only supported secrets types are arbitrary, username_password, key_value , imported_cert, service_credentials or custom_credentials"
}
validation {
@@ -46,6 +46,11 @@ variable "secret_type" {
condition = var.secret_type == "service_credentials" ? var.service_credentials_source_service_crn != null && var.service_credentials_source_service_role_crn != null : true
error_message = "When creating a service_credentials secret, values for `service_credentials_source_service_crn` and `service_credentials_source_service_role_crn` are required."
}
+
+ validation {
+ condition = var.secret_type != "custom_credentials" || var.custom_credentials_configurations != null
+ error_message = "The 'custom_credentials_configurations' variable must be set when 'secret_type' is 'custom_credentials'."
+ }
}
variable "imported_cert_certificate" {
@@ -198,4 +203,25 @@ variable "custom_metadata" {
default = null
}
+variable "custom_credentials_configurations" {
+ type = string
+ description = "The name of the custom credentials secret configuration."
+ default = null
+}
+
+variable "custom_credentials_parameters" {
+ type = bool
+ description = "Whether to create parameters for custom credentials secret or not"
+ default = false
+}
+
+variable "job_parameters" {
+ description = "The parameters that are passed to the Code Engine job."
+ type = object({
+ integer_values = optional(map(number))
+ string_values = optional(map(string))
+ boolean_values = optional(map(bool))
+ })
+ default = {}
+}
##############################################################################