diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml index 2f84d395ef..1e0c34e13c 100644 --- a/.github/workflows/issues.yml +++ b/.github/workflows/issues.yml @@ -8,7 +8,7 @@ jobs: steps: - uses: actions/checkout@v4.1.1 - name: Apply Issue Labels - uses: github/issue-labeler@v3.2 + uses: github/issue-labeler@v3.3 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" configuration-path: .github/labeler-issue.yml diff --git a/.secrets.baseline b/.secrets.baseline index abde119aa3..e66f38481c 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -3,7 +3,7 @@ "files": "go.mod|go.sum|.*.map|^.secrets.baseline$", "lines": null }, - "generated_at": "2023-10-18T18:46:12Z", + "generated_at": "2023-11-09T17:56:16Z", "plugins_used": [ { "name": "AWSKeyDetector" @@ -472,7 +472,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 44, + "line_number": 51, "type": "Secret Keyword", "verified_result": null } @@ -547,6 +547,16 @@ "verified_result": null } ], + "examples/ibm-project/main.tf": [ + { + "hashed_secret": "06d988e96c3d9325c9fbc7c0ef3c6c0f2b4eb8e7", + "is_secret": false, + "is_verified": false, + "line_number": 13, + "type": "Secret Keyword", + "verified_result": null + } + ], "examples/ibm-satellite/README.md": [ { "hashed_secret": "91199272d5d6a574a51722ca6f3d1148edb1a0e7", @@ -742,7 +752,7 @@ "hashed_secret": "731438016c5ab94431f61820f35e3ae5f8ad6004", "is_secret": false, "is_verified": false, - "line_number": 383, + "line_number": 402, "type": "Secret Keyword", "verified_result": null }, @@ -750,7 +760,7 @@ "hashed_secret": "12da2e35d6b50c902c014f1ab9e3032650368df7", "is_secret": false, "is_verified": false, - "line_number": 389, + "line_number": 408, "type": "Secret Keyword", "verified_result": null }, @@ -758,7 +768,7 @@ "hashed_secret": "813274ccae5b6b509379ab56982d862f7b5969b6", "is_secret": false, "is_verified": false, - "line_number": 1100, + "line_number": 1120, "type": "Base64 High Entropy String", "verified_result": null } @@ -768,7 +778,7 @@ "hashed_secret": "9184b0c38101bf24d78b2bb0d044deb1d33696fc", "is_secret": false, "is_verified": false, - "line_number": 130, + "line_number": 131, "type": "Secret Keyword", "verified_result": null }, @@ -776,7 +786,7 @@ "hashed_secret": "c427f185ddcb2440be9b77c8e45f1cd487a2e790", "is_secret": false, "is_verified": false, - "line_number": 1427, + "line_number": 1438, "type": "Base64 High Entropy String", "verified_result": null }, @@ -784,7 +794,7 @@ "hashed_secret": "1f7e33de15e22de9d2eaf502df284ed25ca40018", "is_secret": false, "is_verified": false, - "line_number": 1494, + "line_number": 1505, "type": "Secret Keyword", "verified_result": null }, @@ -792,7 +802,7 @@ "hashed_secret": "1f614c2eb6b3da22d89bd1b9fd47d7cb7c8fc670", "is_secret": false, "is_verified": false, - "line_number": 3250, + "line_number": 3298, "type": "Secret Keyword", "verified_result": null }, @@ -800,7 +810,7 @@ "hashed_secret": "7abfce65b8504403afc25c9790f358d513dfbcc6", "is_secret": false, "is_verified": false, - "line_number": 3263, + "line_number": 3311, "type": "Secret Keyword", "verified_result": null }, @@ -808,7 +818,7 @@ "hashed_secret": "0c2d85bf9a9b1579b16f220a4ea8c3d62b2e24b1", "is_secret": false, "is_verified": false, - "line_number": 3304, + "line_number": 3352, "type": "Secret Keyword", "verified_result": null } @@ -846,7 +856,7 @@ "hashed_secret": "c8b6f5ef11b9223ac35a5663975a466ebe7ebba9", "is_secret": false, "is_verified": false, - "line_number": 1779, + "line_number": 1797, "type": "Secret Keyword", "verified_result": null }, @@ -854,7 +864,7 @@ "hashed_secret": "8abf4899c01104241510ba87685ad4de76b0c437", "is_secret": false, "is_verified": false, - "line_number": 1785, + "line_number": 1803, "type": "Secret Keyword", "verified_result": null } @@ -2070,7 +2080,7 @@ "hashed_secret": "deab23f996709b4e3d14e5499d1cc2de677bfaa8", "is_secret": false, "is_verified": false, - "line_number": 1559, + "line_number": 1357, "type": "Secret Keyword", "verified_result": null }, @@ -2078,7 +2088,7 @@ "hashed_secret": "20a25bac21219ffff1904bde871ded4027eca2f8", "is_secret": false, "is_verified": false, - "line_number": 2212, + "line_number": 1944, "type": "Secret Keyword", "verified_result": null }, @@ -2086,7 +2096,7 @@ "hashed_secret": "b732fb611fd46a38e8667f9972e0cde777fbe37f", "is_secret": false, "is_verified": false, - "line_number": 2231, + "line_number": 1963, "type": "Secret Keyword", "verified_result": null }, @@ -2094,7 +2104,7 @@ "hashed_secret": "1f5e25be9b575e9f5d39c82dfd1d9f4d73f1975c", "is_secret": false, "is_verified": false, - "line_number": 2496, + "line_number": 2203, "type": "Secret Keyword", "verified_result": null } @@ -2104,7 +2114,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 726, + "line_number": 731, "type": "Secret Keyword", "verified_result": null } @@ -2114,7 +2124,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 189, + "line_number": 205, "type": "Secret Keyword", "verified_result": null } @@ -2124,7 +2134,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 779, + "line_number": 823, "type": "Secret Keyword", "verified_result": null } @@ -2144,7 +2154,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 199, + "line_number": 213, "type": "Secret Keyword", "verified_result": null } @@ -2154,7 +2164,7 @@ "hashed_secret": "68ab9ef0953865fef0558010a9f7afcef110d5b8", "is_secret": false, "is_verified": false, - "line_number": 199, + "line_number": 270, "type": "Secret Keyword", "verified_result": null }, @@ -2162,7 +2172,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 257, + "line_number": 335, "type": "Secret Keyword", "verified_result": null } @@ -2172,7 +2182,7 @@ "hashed_secret": "5667b8489a17faa9ef54941db31ed762be280bec", "is_secret": false, "is_verified": false, - "line_number": 141, + "line_number": 157, "type": "Secret Keyword", "verified_result": null }, @@ -2180,7 +2190,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 173, + "line_number": 189, "type": "Secret Keyword", "verified_result": null } @@ -2190,7 +2200,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 200, + "line_number": 214, "type": "Secret Keyword", "verified_result": null } @@ -2200,7 +2210,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 134, + "line_number": 150, "type": "Secret Keyword", "verified_result": null } @@ -2210,7 +2220,7 @@ "hashed_secret": "e407cbe1c64cadb886be6f42907e2dd1c06ca080", "is_secret": false, "is_verified": false, - "line_number": 626, + "line_number": 490, "type": "Secret Keyword", "verified_result": null }, @@ -2218,7 +2228,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 991, + "line_number": 658, "type": "Secret Keyword", "verified_result": null } @@ -2228,7 +2238,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 209, + "line_number": 223, "type": "Secret Keyword", "verified_result": null } @@ -2238,7 +2248,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 251, + "line_number": 272, "type": "Secret Keyword", "verified_result": null } @@ -2512,7 +2522,7 @@ "hashed_secret": "b02fa7fd7ca08b5dc86c2548e40f8a21171ef977", "is_secret": false, "is_verified": false, - "line_number": 259, + "line_number": 265, "type": "Secret Keyword", "verified_result": null }, @@ -2520,7 +2530,7 @@ "hashed_secret": "d4c3d66fd0c38547a3c7a4c6bdc29c36911bc030", "is_secret": false, "is_verified": false, - "line_number": 296, + "line_number": 302, "type": "Secret Keyword", "verified_result": null } @@ -2782,7 +2792,7 @@ "hashed_secret": "b732fb611fd46a38e8667f9972e0cde777fbe37f", "is_secret": false, "is_verified": false, - "line_number": 403, + "line_number": 402, "type": "Secret Keyword", "verified_result": null } @@ -2792,7 +2802,7 @@ "hashed_secret": "5df29b80b97dab81130058ac9af4a9b9d1c091b4", "is_secret": false, "is_verified": false, - "line_number": 247, + "line_number": 276, "type": "Secret Keyword", "verified_result": null } @@ -2802,7 +2812,7 @@ "hashed_secret": "b732fb611fd46a38e8667f9972e0cde777fbe37f", "is_secret": false, "is_verified": false, - "line_number": 292, + "line_number": 291, "type": "Secret Keyword", "verified_result": null } @@ -2812,7 +2822,7 @@ "hashed_secret": "5df29b80b97dab81130058ac9af4a9b9d1c091b4", "is_secret": false, "is_verified": false, - "line_number": 216, + "line_number": 239, "type": "Secret Keyword", "verified_result": null } @@ -2827,6 +2837,62 @@ "verified_result": null } ], + "ibm/service/project/data_source_ibm_project_config.go": [ + { + "hashed_secret": "3046d9f6cfaaeea6eed9bb7a4ab010fe49b0cfd4", + "is_secret": false, + "is_verified": false, + "line_number": 190, + "type": "Secret Keyword", + "verified_result": null + }, + { + "hashed_secret": "92f08f2d9a0dc3f0d4cb3796435a48508cf59ecd", + "is_secret": false, + "is_verified": false, + "line_number": 461, + "type": "Secret Keyword", + "verified_result": null + } + ], + "ibm/service/project/data_source_ibm_project_config_test.go": [ + { + "hashed_secret": "347cd9c53ff77d41a7b22aa56c7b4efaf54658e3", + "is_secret": false, + "is_verified": false, + "line_number": 58, + "type": "Secret Keyword", + "verified_result": null + } + ], + "ibm/service/project/resource_ibm_project_config.go": [ + { + "hashed_secret": "3046d9f6cfaaeea6eed9bb7a4ab010fe49b0cfd4", + "is_secret": false, + "is_verified": false, + "line_number": 92, + "type": "Secret Keyword", + "verified_result": null + }, + { + "hashed_secret": "92f08f2d9a0dc3f0d4cb3796435a48508cf59ecd", + "is_secret": false, + "is_verified": false, + "line_number": 693, + "type": "Secret Keyword", + "verified_result": null + } + ], + "ibm/service/project/resource_ibm_project_config_test.go": [ + { + "hashed_secret": "347cd9c53ff77d41a7b22aa56c7b4efaf54658e3", + "is_secret": false, + "is_verified": false, + "line_number": 61, + "type": "Secret Keyword", + "verified_result": null + } + ], "ibm/service/pushnotification/resource_ibm_push_notification_chrome.go": [ { "hashed_secret": "8a4036fbf3e13c7a84bac77ddae25de1cdfc4d43", @@ -3676,7 +3742,7 @@ "hashed_secret": "f855f5027fd8fdb2df3f6a6f1cf858fffcbedb0c", "is_secret": false, "is_verified": false, - "line_number": 93883, + "line_number": 96615, "type": "Secret Keyword", "verified_result": null }, @@ -3684,7 +3750,7 @@ "hashed_secret": "5fb0fa884132a8724a8d7cba55853737e442adbd", "is_secret": false, "is_verified": false, - "line_number": 116309, + "line_number": 119404, "type": "Secret Keyword", "verified_result": null }, @@ -3692,7 +3758,7 @@ "hashed_secret": "1e5c2f367f02e47a8c160cda1cd9d91decbac441", "is_secret": false, "is_verified": false, - "line_number": 147225, + "line_number": 151612, "type": "Secret Keyword", "verified_result": null } @@ -3962,7 +4028,7 @@ "hashed_secret": "d47dcacc720a39e236679ac3e311a0d58bb6519e", "is_secret": false, "is_verified": false, - "line_number": 153, + "line_number": 152, "type": "Secret Keyword", "verified_result": null }, @@ -3970,7 +4036,7 @@ "hashed_secret": "e66e7d67fdf3c596c435fc7828b13205e4950a0f", "is_secret": false, "is_verified": false, - "line_number": 155, + "line_number": 154, "type": "Secret Keyword", "verified_result": null } @@ -4172,7 +4238,7 @@ "hashed_secret": "10c28f9cf0668595d45c1090a7b4a2ae98edfa58", "is_secret": false, "is_verified": false, - "line_number": 488, + "line_number": 494, "type": "Secret Keyword", "verified_result": null }, @@ -4180,7 +4246,7 @@ "hashed_secret": "e407cbe1c64cadb886be6f42907e2dd1c06ca080", "is_secret": false, "is_verified": false, - "line_number": 553, + "line_number": 559, "type": "Secret Keyword", "verified_result": null }, @@ -4188,7 +4254,7 @@ "hashed_secret": "91199272d5d6a574a51722ca6f3d1148edb1a0e7", "is_secret": false, "is_verified": false, - "line_number": 577, + "line_number": 583, "type": "Secret Keyword", "verified_result": null } @@ -4223,16 +4289,6 @@ "verified_result": null } ], - "website/docs/r/en_destination_huawei.html.markdown": [ - { - "hashed_secret": "167a06dbc64c344aeb0bd749d1962d2ef9731f06", - "is_secret": false, - "is_verified": false, - "line_number": 24, - "type": "Secret Keyword", - "verified_result": null - } - ], "website/docs/r/en_destination_ios.html.markdown": [ { "hashed_secret": "e1e03a31507ee39abca8fc86cf37b8347dc32002", @@ -4413,6 +4469,16 @@ "verified_result": null } ], + "website/docs/r/project_config.html.markdown": [ + { + "hashed_secret": "06d988e96c3d9325c9fbc7c0ef3c6c0f2b4eb8e7", + "is_secret": false, + "is_verified": false, + "line_number": 23, + "type": "Secret Keyword", + "verified_result": null + } + ], "website/docs/r/resource_instance.html.markdown": [ { "hashed_secret": "d62552e3d0606ac398b6ee5cbd49e763ac9c3933", @@ -4438,7 +4504,7 @@ "hashed_secret": "d47dcacc720a39e236679ac3e311a0d58bb6519e", "is_secret": false, "is_verified": false, - "line_number": 104, + "line_number": 105, "type": "Secret Keyword", "verified_result": null }, @@ -4446,7 +4512,7 @@ "hashed_secret": "e66e7d67fdf3c596c435fc7828b13205e4950a0f", "is_secret": false, "is_verified": false, - "line_number": 106, + "line_number": 107, "type": "Secret Keyword", "verified_result": null } diff --git a/CHANGELOG.md b/CHANGELOG.md index cf3fc33d49..f833c365fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +# 1.60.0-beta0 (Nov 15, 2023) +Features +* Support for Projects + - **Datasources** + - ibm_project + - ibm_project_config + - **Resources** + - ibm_project + - ibm_project_config +Enhancements +* support offline restore for MongoDB EE PITR ([4601](https://github.com/IBM-Cloud/terraform-provider-ibm/pull/4601)) +* bump ContinuousDelivery Go SDK version ([4918](https://github.com/IBM-Cloud/terraform-provider-ibm/pull/4918)) +* Added nest conditions to rule.conditions IAM Policies ([4896](https://github.com/IBM-Cloud/terraform-provider-ibm/pull/4896)) +* Updates to SCC tool ([4920](https://github.com/IBM-Cloud/terraform-provider-ibm/pull/4920)) + +BugFixes +* resolved nil pointer issue on vpn gateway resource ([4903](https://github.com/IBM-Cloud/terraform-provider-ibm/pull/4903)) +* Private/direct COS endpoint settings conflicts with IBM Cloud docs, VPE options, and COS config endpoint ([4919](https://github.com/IBM-Cloud/terraform-provider-ibm/pull/4919)) +* add missing required argument name to the doc ([4909](https://github.com/IBM-Cloud/terraform-provider-ibm/pull/4909)) + + # 1.59.0 (Oct 30, 2023) Features diff --git a/examples/ibm-project/README.md b/examples/ibm-project/README.md index 010899110e..2c985f19d0 100644 --- a/examples/ibm-project/README.md +++ b/examples/ibm-project/README.md @@ -2,13 +2,14 @@ This example illustrates how to use the ProjectV1 -These types of resources are supported: +The following types of resources are supported: -* Project definition +* project_config +* project ## Usage -To run this example you need to execute: +To run this example, execute the following commands: ```bash $ terraform init @@ -21,25 +22,39 @@ Run `terraform destroy` when you don't need these resources. ## ProjectV1 resources -project_instance resource: +project_config resource: ```hcl -resource "project_instance" "project_instance" { - name = var.project_instance_name - description = var.project_instance_description - configs = var.project_instance_configs - resource_group = var.project_instance_resource_group - location = var.project_instance_location +resource "project_config" "project_config_instance" { + project_id = ibm_project.project_instance.project_id + definition = var.project_config_definition } ``` +project resource: -## ProjectV1 Data sources +```hcl +resource "project" "project_instance" { + location = var.project_location + resource_group = var.project_resource_group + definition = var.project_definition +} +``` + +## ProjectV1 data sources + +project_config data source: -project_event_notification data source: +```hcl +data "project_config" "project_config_instance" { + project_id = ibm_project.project_instance.id + project_config_id = ibm_project_config.project_config_instance.project_config_id +} +``` +project data source: ```hcl -data "project_event_notification" "project_event_notification_instance" { - id = var.project_event_notification_id +data "project" "project_instance" { + project_id = ibm_project.project_instance.id } ``` @@ -68,16 +83,19 @@ data "project_event_notification" "project_event_notification_instance" { | Name | Description | Type | Required | |------|-------------|------|---------| | ibmcloud\_api\_key | IBM Cloud API key | `string` | true | -| name | The project name. | `string` | true | -| description | A project's descriptive text. | `string` | false | -| configs | The project configurations. | `list()` | false | +| project_id | The unique project ID. | `string` | true | +| schematics | A schematics workspace associated to a project configuration. | `` | false | +| definition | The type and output of a project configuration. | `` | true | +| location | The IBM Cloud location where a resource is deployed. | `string` | true | | resource_group | The resource group where the project's data and tools are created. | `string` | true | -| location | The location where the project's data and tools are created. | `string` | true | +| definition | The definition of the project. | `` | true | +| project_id | The unique project ID. | `string` | true | +| project_config_id | The unique config ID. | `string` | true | | project_id | The unique project ID. | `string` | true | ## Outputs | Name | Description | |------|-------------| -| project_instance | project_instance object | -| project_event_notification | project_event_notification object | +| project_config | project_config object | +| project | project object | diff --git a/examples/ibm-project/main.tf b/examples/ibm-project/main.tf index d3348263c7..79837ee3fb 100644 --- a/examples/ibm-project/main.tf +++ b/examples/ibm-project/main.tf @@ -2,14 +2,16 @@ provider "ibm" { ibmcloud_api_key = var.ibmcloud_api_key } -// Provision project_instance resource instance -resource "ibm_project_instance" "project_instance" { - name = "My static website" - description = "Sample static website test using the IBM catalog deployable architecture" - configs { +// Provision project_config resource instance +resource "ibm_project_config" "project_config_instance" { + project_id = ibm_project.project_instance.project_id + definition { name = "static-website-dev" - labels = [ "env:dev", "billing:internal" ] description = "Website - development" + authorizations { + method = "api_key" + api_key = "" + } locator_id = "1082e7d2-5e2f-0a11-a3bc-f88a8e1931fc.145be7c1-9ec4-4719-b586-584ee52fbed0-global" input { name = "app_repo_name" @@ -19,15 +21,26 @@ resource "ibm_project_instance" "project_instance" { value = "static-website-dev-app-repo" } } - resource_group = "Default" - location = "us-south" } -// Data source is not linked to a resource instance -// Uncomment if an existing data source instance exists -/* -// Create project_event_notification data source -data "ibm_project_event_notification" "project_event_notification_instance" { - project_id = var.project_event_notification_id +// Provision project resource instance +resource "ibm_project" "project_instance" { + location = var.project_location + resource_group = var.project_resource_group + definition { + name = "My static website" + description = "Sample static website test using the IBM catalog deployable architecture" + destroy_on_delete = true + } +} + +// Create project_config data source +data "ibm_project_config" "project_config_instance" { + project_id = ibm_project_config.project_config_instance.project_id + project_config_id = ibm_project_config.project_config_instance.project_config_id +} + +// Create project data source +data "ibm_project" "project_instance" { + project_id = ibm_project.project_instance.id } -*/ diff --git a/examples/ibm-project/outputs.tf b/examples/ibm-project/outputs.tf index 8a59bbf786..277309cbec 100644 --- a/examples/ibm-project/outputs.tf +++ b/examples/ibm-project/outputs.tf @@ -1,6 +1,12 @@ -// This allows project_instance data to be referenced by other resources and the terraform CLI -// Modify this if only certain data should be exposed -output "ibm_project_instance" { - value = ibm_project_instance.project_instance - description = "project_instance resource instance" +// This output allows project_config data to be referenced by other resources and the terraform CLI +// Modify this output if only certain data should be exposed +output "ibm_project_config" { + value = ibm_project_config.project_config_instance + description = "project_config resource instance" +} +// This output allows project data to be referenced by other resources and the terraform CLI +// Modify this output if only certain data should be exposed +output "ibm_project" { + value = ibm_project.project_instance + description = "project resource instance" } diff --git a/examples/ibm-project/variables.tf b/examples/ibm-project/variables.tf index 240c070647..b32094d31b 100644 --- a/examples/ibm-project/variables.tf +++ b/examples/ibm-project/variables.tf @@ -3,31 +3,40 @@ variable "ibmcloud_api_key" { type = string } -// Resource arguments for project_instance -variable "project_instance_name" { - description = "The project name." +// Resource arguments for project_config +variable "project_config_project_id" { + description = "The unique project ID." + type = string + default = "project_id" +} + +// Resource arguments for project +variable "project_location" { + description = "The IBM Cloud location where a resource is deployed." type = string - default = "acme-microservice" + default = "us-south" } -variable "project_instance_description" { - description = "A project's descriptive text." +variable "project_resource_group" { + description = "The resource group where the project's data and tools are created." type = string - default = "A microservice to deploy on top of ACME infrastructure." + default = "Default" } -variable "project_instance_resource_group" { - description = "Group name of the customized collection of resources." + +// Data source arguments for project_config +variable "project_config_project_id" { + description = "The unique project ID." type = string - default = "resource_group" + default = "project_id" } -variable "project_instance_location" { - description = "Data center locations for resource deployment." +variable "project_config_id" { + description = "The unique config ID." type = string - default = "location" + default = "project_config_id" } -// Data source arguments for project_event_notification -variable "project_event_notification_id" { +// Data source arguments for project +variable "project_id" { description = "The unique project ID." type = string - default = "id" + default = "project_id" } diff --git a/examples/ibm-project/versions.tf b/examples/ibm-project/versions.tf index ee0f9705a2..d9b6f790b9 100644 --- a/examples/ibm-project/versions.tf +++ b/examples/ibm-project/versions.tf @@ -1,3 +1,3 @@ terraform { required_version = ">= 0.12" -} \ No newline at end of file +} diff --git a/go.mod b/go.mod index 8f6c7bf23a..d23d3de0b0 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/IBM-Cloud/bluemix-go v0.0.0-20231017073329-75ebe90c98ba - github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20230822142550-30562e113de9 + github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20231106114255-c50117860a3c github.com/IBM-Cloud/power-go-client v1.5.2 github.com/IBM/apigateway-go-sdk v0.0.0-20210714141226-a5d5d49caaca github.com/IBM/appconfiguration-go-admin-sdk v0.3.0 @@ -13,19 +13,19 @@ require ( github.com/IBM/cloudant-go-sdk v0.0.43 github.com/IBM/code-engine-go-sdk v0.0.0-20230606173928-4863db061918 github.com/IBM/container-registry-go-sdk v1.1.0 - github.com/IBM/continuous-delivery-go-sdk v1.2.1 + github.com/IBM/continuous-delivery-go-sdk v1.3.0 github.com/IBM/event-notifications-go-admin-sdk v0.2.7 github.com/IBM/eventstreams-go-sdk v1.4.0 github.com/IBM/go-sdk-core/v3 v3.2.4 - github.com/IBM/go-sdk-core/v5 v5.14.1 + github.com/IBM/go-sdk-core/v5 v5.15.0 github.com/IBM/ibm-cos-sdk-go v1.10.0 github.com/IBM/ibm-cos-sdk-go-config v1.2.0 github.com/IBM/ibm-hpcs-tke-sdk v0.0.0-20211109141421-a4b61b05f7d1 github.com/IBM/ibm-hpcs-uko-sdk v0.0.20-beta github.com/IBM/keyprotect-go-client v0.12.2 github.com/IBM/networking-go-sdk v0.42.2 - github.com/IBM/platform-services-go-sdk v0.52.0 - github.com/IBM/project-go-sdk v0.0.10 + github.com/IBM/platform-services-go-sdk v0.54.0 + github.com/IBM/project-go-sdk v0.0.99 github.com/IBM/push-notifications-go-sdk v0.0.0-20210310100607-5790b96c47f5 github.com/IBM/scc-go-sdk/v5 v5.1.3 github.com/IBM/schematics-go-sdk v0.2.2 @@ -40,7 +40,7 @@ require ( github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/go-openapi/strfmt v0.21.7 github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.3.0 github.com/hashicorp/go-uuid v1.0.3 github.com/hashicorp/go-version v1.6.0 @@ -70,6 +70,7 @@ require ( require ( cloud.google.com/go/kms v1.10.1 // indirect cloud.google.com/go/monitoring v1.13.0 // indirect + github.com/Bowery/prompt v0.0.0-20190916142128-fa8279994f75 // indirect github.com/Logicalis/asn1 v0.0.0-20190312173541-d60463189a56 // indirect github.com/PromonLogicalis/asn1 v0.0.0-20190312173541-d60463189a56 // indirect github.com/agext/levenshtein v1.2.2 // indirect @@ -86,6 +87,7 @@ require ( github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a // indirect + github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185 // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/eapache/go-resiliency v1.4.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect @@ -117,6 +119,7 @@ require ( github.com/google/gnostic v0.6.9 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -157,6 +160,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/kardianos/govendor v1.0.9 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1 // indirect github.com/leodido/go-urn v1.2.3 // indirect @@ -168,6 +172,8 @@ require ( github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.0 // indirect + github.com/mitchellh/gox v1.0.1 // indirect + github.com/mitchellh/iochan v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/spdystream v0.2.0 // indirect @@ -204,10 +210,13 @@ require ( go.uber.org/ratelimit v0.2.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.12.0 // indirect + golang.org/x/tools/cmd/cover v0.1.0-deprecated // indirect + golang.org/x/tools/go/vcs v0.1.0-deprecated // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect @@ -235,3 +244,5 @@ exclude ( k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible k8s.io/client-go v12.0.0+incompatible ) + +replace github.com/IBM-Cloud/power-go-client => /Users/michaelkad/git/power-go-client diff --git a/go.sum b/go.sum index c6cc71647e..46f5c7d91b 100644 --- a/go.sum +++ b/go.sum @@ -93,6 +93,8 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/Bowery/prompt v0.0.0-20190916142128-fa8279994f75 h1:xGHheKK44eC6K0u5X+DZW/fRaR1LnDdqPHMZMWx5fv8= +github.com/Bowery/prompt v0.0.0-20190916142128-fa8279994f75/go.mod h1:4/6eNcqZ09BZ9wLK3tZOjBA1nDj+B0728nlX5YRlSmQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -102,11 +104,9 @@ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3 github.com/DataDog/zstd v1.4.4/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/IBM-Cloud/bluemix-go v0.0.0-20231017073329-75ebe90c98ba h1:8U4HByOYJiaGWBpGjdRIzyzu0NBzjywh//CZnSbEsPw= github.com/IBM-Cloud/bluemix-go v0.0.0-20231017073329-75ebe90c98ba/go.mod h1:mt+O8ryLVANrBKlA4RxKdENp3q6Q7mKQIi2nkiibZbU= -github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20230822142550-30562e113de9 h1:sXRzCK3Glxpyu66Tu2NjztLdT5sDwj4qly+MJKRhdWY= -github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20230822142550-30562e113de9/go.mod h1:xUQL9SGAjoZFd4GNjrjjtEpjpkgU7RFXRyHesbKTjiY= +github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20231106114255-c50117860a3c h1:tRS4VuOG3lHNG+yrsh3vZZQDVNLuFJB0oZbTJp9YXds= +github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20231106114255-c50117860a3c/go.mod h1:xUQL9SGAjoZFd4GNjrjjtEpjpkgU7RFXRyHesbKTjiY= github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.5.3/go.mod h1:RiUvKuHKTBmBApDMUQzBL14pQUGKcx/IioKQPIcRQjs= -github.com/IBM-Cloud/power-go-client v1.5.2 h1:p8+vY9+wtr4BIa2+Y4EVI0jlvRg+FLWsbOpWYNlKXDw= -github.com/IBM-Cloud/power-go-client v1.5.2/go.mod h1:Vd8aSxWA30soUhE2U+tmzaYDUVNOmQE3/npny7BsN6Y= github.com/IBM-Cloud/softlayer-go v1.0.5-tf h1:koUAyF9b6X78lLLruGYPSOmrfY2YcGYKOj/Ug9nbKNw= github.com/IBM-Cloud/softlayer-go v1.0.5-tf/go.mod h1:6HepcfAXROz0Rf63krk5hPZyHT6qyx2MNvYyHof7ik4= github.com/IBM/apigateway-go-sdk v0.0.0-20210714141226-a5d5d49caaca h1:crniVcf+YcmgF03NmmfonXwSQ73oJF+IohFYBwknMxs= @@ -123,8 +123,8 @@ github.com/IBM/code-engine-go-sdk v0.0.0-20230606173928-4863db061918 h1:RfHezAVs github.com/IBM/code-engine-go-sdk v0.0.0-20230606173928-4863db061918/go.mod h1:IP6U/1NxgxzPeYdyiEwMaZyzelTw82JGHWl7bY78eQM= github.com/IBM/container-registry-go-sdk v1.1.0 h1:sYyknIod8R4RJZQqAheiduP6wbSTphE9Ag8ho28yXjc= github.com/IBM/container-registry-go-sdk v1.1.0/go.mod h1:4TwsCnQtVfZ4Vkapy/KPvQBKFc3VOyUZYkwRU4FTPrs= -github.com/IBM/continuous-delivery-go-sdk v1.2.1 h1:MVclWmjW6LevbYgrA7PGJzS+Dmqy3/JBYUpBp/ct+Vk= -github.com/IBM/continuous-delivery-go-sdk v1.2.1/go.mod h1:oW51tS5/MDCcEM7lUvjK1H9GFC/oKsRbyYfmvGyMGmw= +github.com/IBM/continuous-delivery-go-sdk v1.3.0 h1:WsILMVpNWD/5G40ltWeXbOj4y5ODQSq1hKXAnDJuNjw= +github.com/IBM/continuous-delivery-go-sdk v1.3.0/go.mod h1:oW51tS5/MDCcEM7lUvjK1H9GFC/oKsRbyYfmvGyMGmw= github.com/IBM/event-notifications-go-admin-sdk v0.2.7 h1:Y6YPiXZO3/oAhs7rY6ekowJAsf9J05g2UFq3wjFkuCs= github.com/IBM/event-notifications-go-admin-sdk v0.2.7/go.mod h1:iI6/TJt4GQBDsl8NYzoIYGnsNjMG0kOVIEl7mcM5v1E= github.com/IBM/eventstreams-go-sdk v1.4.0 h1:yS/Ns29sBOe8W2tynQmz9HTKqQZ0ckse4Py5Oy/F2rM= @@ -139,8 +139,8 @@ github.com/IBM/go-sdk-core/v5 v5.7.0/go.mod h1:+YbdhrjCHC84ls4MeBp+Hj4NZCni+tDAc github.com/IBM/go-sdk-core/v5 v5.9.2/go.mod h1:YlOwV9LeuclmT/qi/LAK2AsobbAP42veV0j68/rlZsE= github.com/IBM/go-sdk-core/v5 v5.9.5/go.mod h1:YlOwV9LeuclmT/qi/LAK2AsobbAP42veV0j68/rlZsE= github.com/IBM/go-sdk-core/v5 v5.10.2/go.mod h1:WZPFasUzsKab/2mzt29xPcfruSk5js2ywAPwW4VJjdI= -github.com/IBM/go-sdk-core/v5 v5.14.1 h1:WR1r0zz+gDW++xzZjF41r9ueY4JyjS2vgZjiYs8lO3c= -github.com/IBM/go-sdk-core/v5 v5.14.1/go.mod h1:MUvIr/1mgGh198ZXL+ByKz9Qs1JoEh80v/96x8jPXNY= +github.com/IBM/go-sdk-core/v5 v5.15.0 h1:AhFoWVk3i58f9vnDoEoZumI/zbtRoP5moWIz5YQOmZg= +github.com/IBM/go-sdk-core/v5 v5.15.0/go.mod h1:5Obavm/s1Tc2PxivEIfgCvj/HJ5h3QIOjLHS5y8QJf0= github.com/IBM/ibm-cos-sdk-go v1.3.1/go.mod h1:YLBAYobEA8bD27P7xpMwSQeNQu6W3DNBtBComXrRzRY= github.com/IBM/ibm-cos-sdk-go v1.10.0 h1:/2VIev2/jBei39OqU2+nSZQnoWJ+KtkiSAIDkqsd7uU= github.com/IBM/ibm-cos-sdk-go v1.10.0/go.mod h1:C8KRTRaoD3CWPPBOa6FCOpdh0ZMlUjKAAA4i3F+Q/sc= @@ -155,10 +155,10 @@ github.com/IBM/keyprotect-go-client v0.12.2 h1:Cjxcqin9Pl0xz3MnxdiVd4v/eIa79xL3h github.com/IBM/keyprotect-go-client v0.12.2/go.mod h1:yr8h2noNgU8vcbs+vhqoXp3Lmv73PI0zAc6VMgFvWwM= github.com/IBM/networking-go-sdk v0.42.2 h1:caqjx4jyFHi10Vlf3skHvlL6K3YJRVstsmCBmvdyqkA= github.com/IBM/networking-go-sdk v0.42.2/go.mod h1:lTUZwtUkMANMnrLHFIgRhHrkBfwASY/Iho1fabaPHxo= -github.com/IBM/platform-services-go-sdk v0.52.0 h1:hbf640xE8T0Rwy2IUf5Pu4OATabGS4IDMnEInXUXs4o= -github.com/IBM/platform-services-go-sdk v0.52.0/go.mod h1:6LxcUhIaSLP4SuQJXF9oLXBamSQogs5D9BcVwr4hmfU= -github.com/IBM/project-go-sdk v0.0.10 h1:vHSuemwZ4S4c6BEb22tzsEcPTs/5LnZ0yKpP3GG/GL8= -github.com/IBM/project-go-sdk v0.0.10/go.mod h1:lqe0M4cKvABI1iHR1b+KfasVcxQL6nl2VJ8eOyQs8Ig= +github.com/IBM/platform-services-go-sdk v0.54.0 h1:WjHWm9ZAJvlq07E1WXXtEe+d/B0sazWD6cEWVT7EMLU= +github.com/IBM/platform-services-go-sdk v0.54.0/go.mod h1:CWSprvsCsXWvujmBzbtoJSmbRZS9FVV3O594b0t/GiM= +github.com/IBM/project-go-sdk v0.0.99 h1:rQU/uQLW83OsAUfP/d8fFSIjp8ooEQIFjalYQD4i4aY= +github.com/IBM/project-go-sdk v0.0.99/go.mod h1:lqe0M4cKvABI1iHR1b+KfasVcxQL6nl2VJ8eOyQs8Ig= github.com/IBM/push-notifications-go-sdk v0.0.0-20210310100607-5790b96c47f5 h1:NPUhkoOCRuv3OFWt19PmwjXGGTKlvmbuPg9fUrBUNe4= github.com/IBM/push-notifications-go-sdk v0.0.0-20210310100607-5790b96c47f5/go.mod h1:b07XHUVh0XYnQE9s2mqgjYST1h9buaQNqN4EcKhOsX0= github.com/IBM/sarama v1.41.2 h1:ZDBZfGPHAD4uuAtSv4U22fRZBgst0eEwGFzLj0fb85c= @@ -360,6 +360,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a h1:saTgr5tMLFnmy/yg3qDTft4rE5DY2uJ/cCxCe3q0XTU= github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a/go.mod h1:Bw9BbhOJVNR+t0jCqx2GC6zv0TGBsShs56Y3gfSCvl0= +github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185 h1:3T8ZyTDp5QxTx3NU48JVb2u+75xc040fofcBaN+6jPA= +github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185/go.mod h1:cFRxtTwTOJkz2x3rQUNCYKWC93yP1VKjR8NUhqFxZNU= github.com/denisenkom/go-mssqldb v0.0.0-20190412130859-3b1d194e553a/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4= github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc h1:8WFBn63wegobsYAX0YjD+8suexZDga5CctH4CCTx2+8= @@ -705,8 +707,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-metrics-stackdriver v0.2.0 h1:rbs2sxHAPn2OtUj9JdR/Gij1YKGl0BTVD0augB+HEjE= github.com/google/go-metrics-stackdriver v0.2.0/go.mod h1:KLcPyp3dWJAFD+yHisGlJSZktIsTjb50eB72U2YZ9K0= @@ -735,6 +738,8 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230510103437-eeec1cb781c3 h1:2XF1Vzq06X+inNqgJ9tRnGuw+ZVCB3FazXODD6JE1R8= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -884,6 +889,7 @@ github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZ github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -1068,6 +1074,8 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kardianos/govendor v1.0.9 h1:WOH3FcVI9eOgnIZYg96iwUwrL4eOVx+aQ66oyX2R8Yc= +github.com/kardianos/govendor v1.0.9/go.mod h1:yvmR6q9ZZ7nSF5Wvh40v0wfP+3TwwL8zYQp+itoZSVM= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= @@ -1182,7 +1190,10 @@ github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/gox v1.0.1 h1:x0jD3dcHk9a9xPSDN6YEL4xL6Qz0dvNYm8yZqui5chI= +github.com/mitchellh/gox v1.0.1/go.mod h1:ED6BioOGXMswlXa2zxfh/xdd5QhwYliBFn9V18Ap4z4= github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -1298,8 +1309,8 @@ github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+q github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/onsi/gomega v1.28.0 h1:i2rg/p9n/UqIDAMFUJ6qIUUMcsqOuUHgbpbu235Vr1c= github.com/onsi/gomega v1.28.0/go.mod h1:A1H2JE76sI14WIP57LMKj7FVfCHx3g3BcZVjJG8bjX8= +github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= @@ -1932,8 +1943,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2060,6 +2071,10 @@ golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= +golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= +golang.org/x/tools/go/vcs v0.1.0-deprecated h1:cOIJqWBl99H1dH5LWizPa+0ImeeJq3t3cJjaeOWUAL4= +golang.org/x/tools/go/vcs v0.1.0-deprecated/go.mod h1:zUrvATBAvEI9535oC0yWYsLsHIV4Z7g63sNPVMtuBy8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/ibm/acctest/acctest.go b/ibm/acctest/acctest.go index 19b72beb82..7335b4bdeb 100644 --- a/ibm/acctest/acctest.go +++ b/ibm/acctest/acctest.go @@ -4,16 +4,25 @@ package acctest import ( + "context" "fmt" "os" "strconv" + "strings" + "sync" "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + terraformsdk "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/provider" ) +const ( + ProviderName = "ibm" + ProviderNameAlternate = "ibmalternate" +) + var ( AppIDTenantID string AppIDTestUserEmail string @@ -146,7 +155,6 @@ var ( IksClusterVpcID string IksClusterSubnetID string IksClusterResourceGroupID string - IcdDbRegion string IcdDbDeploymentId string IcdDbBackupId string IcdDbTaskId string @@ -306,9 +314,17 @@ var ( CeResourceKeyID string ) +// Satellite tests +var ( + SatelliteSSHPubKey string +) + // for IAM Identity var IamIdentityAssignmentTargetAccountId string +// Projects +var ProjectsConfigApiKey string + func init() { testlogger := os.Getenv("TF_LOG") if testlogger != "" { @@ -317,6 +333,11 @@ func init() { IamIdentityAssignmentTargetAccountId = os.Getenv("IAM_IDENTITY_ASSIGNMENT_TARGET_ACCOUNT") + ProjectsConfigApiKey = os.Getenv("IBM_PROJECTS_CONFIG_APIKEY") + if ProjectsConfigApiKey == "" { + fmt.Println("[WARN] Set the environment variable IBM_PROJECTS_CONFIG_APIKEY for testing IBM Projects Config resources, the tests will fail if this is not set") + } + AppIDTenantID = os.Getenv("IBM_APPID_TENANT_ID") if AppIDTenantID == "" { fmt.Println("[WARN] Set the environment variable IBM_APPID_TENANT_ID for testing AppID resources, AppID tests will fail if this is not set") @@ -850,12 +871,6 @@ func init() { fmt.Println("[INFO] Set the environment variable ISSnapshotCRN for ibm_is_snapshot resource else it is set to default value 'crn:v1:bluemix:public:is:ca-tor:a/xxxxxxxx::snapshot:xxxx-xxxxc-xxx-xxxx-xxxx-xxxxxxxxxx'") } - IcdDbRegion = os.Getenv("ICD_DB_REGION") - if IcdDbRegion == "" { - IcdDbRegion = "eu-gb" - fmt.Println("[INFO] Set the environment variable ICD_DB_REGION for testing ibm_cloud_databases else it is set to default value 'eu-gb'") - } - IcdDbDeploymentId = os.Getenv("ICD_DB_DEPLOYMENT_ID") if IcdDbDeploymentId == "" { IcdDbDeploymentId = "crn:v1:bluemix:public:databases-for-redis:au-syd:a/40ddc34a953a8c02f10987b59085b60e:5042afe1-72c2-4231-89cc-c949e5d56251::" @@ -1515,6 +1530,11 @@ func init() { CeResourceKeyID = "" fmt.Println("[WARN] Set the environment variable IBM_CODE_ENGINE_RESOURCE_KEY_ID with the ID of a resource key to access a service instance") } + + SatelliteSSHPubKey = os.Getenv("IBM_SATELLITE_SSH_PUB_KEY") + if SatelliteSSHPubKey == "" { + fmt.Println("[WARN] Set the environment variable IBM_SATELLITE_SSH_PUB_KEY with a ssh public key or ibm_satellite_* tests may fail") + } } var ( @@ -1522,10 +1542,18 @@ var ( TestAccProvider *schema.Provider ) +// testAccProviderConfigure ensures Provider is only configured once +// +// The PreCheck(t) function is invoked for every test and this prevents +// extraneous reconfiguration to the same values each time. However, this does +// not prevent reconfiguration that may happen should the address of +// Provider be errantly reused in ProviderFactories. +var testAccProviderConfigure sync.Once + func init() { TestAccProvider = provider.Provider() TestAccProviders = map[string]*schema.Provider{ - "ibm": TestAccProvider, + ProviderName: TestAccProvider, } } @@ -1549,6 +1577,13 @@ func TestAccPreCheck(t *testing.T) { if v := os.Getenv("IAAS_CLASSIC_USERNAME"); v == "" { t.Fatal("IAAS_CLASSIC_USERNAME must be set for acceptance tests") } + + testAccProviderConfigure.Do(func() { + diags := TestAccProvider.Configure(context.Background(), terraformsdk.NewResourceConfigRaw(nil)) + if diags.HasError() { + t.Fatalf("configuring provider: %s", diags[0].Summary) + } + }) } func TestAccPreCheckEnterprise(t *testing.T) { @@ -1688,3 +1723,52 @@ func TestAccPreCheckScc(t *testing.T) { t.Fatal("IBMCLOUD_SCC_REPORT_ID missing. Set the environment variable IBMCLOUD_SCC_REPORT_ID with a VALID REPORT_ID") } } + +func TestAccPreCheckSatelliteSSH(t *testing.T) { + TestAccPreCheck(t) + if SatelliteSSHPubKey == "" { + t.Fatal("IBM_SATELLITE_SSH_PUB_KEY missing. Set the environment variable IBM_SATELLITE_SSH_PUB_KEY with a VALID ssh public key") + } +} + +func TestAccProviderFactories() map[string]func() (*schema.Provider, error) { + return map[string]func() (*schema.Provider, error){ + ProviderName: func() (*schema.Provider, error) { return provider.Provider(), nil }, + ProviderNameAlternate: func() (*schema.Provider, error) { return provider.Provider(), nil }, + } +} + +func Region() string { + region, _ := schema.MultiEnvDefaultFunc([]string{"IC_REGION", "IBMCLOUD_REGION", "BM_REGION", "BLUEMIX_REGION"}, "us-south")() + + return region.(string) +} + +func RegionAlternate() string { + region, _ := schema.MultiEnvDefaultFunc([]string{"IC_REGION_ALTERNATE", "IBMCLOUD_REGION_ALTERNATE"}, "eu-gb")() + + return region.(string) +} + +func ConfigAlternateRegionProvider() string { + return configNamedRegionalProvider(ProviderNameAlternate, RegionAlternate()) +} + +// ConfigCompose can be called to concatenate multiple strings to build test configurations +func ConfigCompose(config ...string) string { + var str strings.Builder + + for _, conf := range config { + str.WriteString(conf) + } + + return str.String() +} + +func configNamedRegionalProvider(providerName string, region string) string { + return fmt.Sprintf(` +provider %[1]q { + region = %[2]q +} +`, providerName, region) +} diff --git a/ibm/flex/structures.go b/ibm/flex/structures.go index 5f89a520a6..f4370020f9 100644 --- a/ibm/flex/structures.go +++ b/ibm/flex/structures.go @@ -1641,42 +1641,55 @@ func FlattenV2PolicyResourceTags(resource iampolicymanagementv1.V2PolicyResource return result } +func getConditionValues(v interface{}) []string { + var values []string + switch value := v.(type) { + case string: + values = append(values, value) + case []interface{}: + for _, v := range value { + values = append(values, fmt.Sprint(v)) + } + case nil: + default: + values = append(values, fmt.Sprintf("%v", value)) + } + return values +} + func FlattenRuleConditions(rule iampolicymanagementv1.V2PolicyRule) []map[string]interface{} { result := make([]map[string]interface{}, 0) if len(rule.Conditions) > 0 { - for _, c := range rule.Conditions { - var values []string - switch value := c.Value.(type) { - case string: - values = append(values, value) - case []interface{}: - for _, v := range value { - values = append(values, fmt.Sprint(v)) + for _, cIntf := range rule.Conditions { + c := cIntf.(*iampolicymanagementv1.NestedCondition) + if len(c.Conditions) > 0 { + nestedConditions := make([]map[string]interface{}, 0) + for _, nc := range c.Conditions { + values := getConditionValues(nc.Value) + nestedCondition := map[string]interface{}{ + "key": nc.Key, + "value": values, + "operator": nc.Operator, + } + nestedConditions = append(nestedConditions, nestedCondition) } - default: - values = append(values, value.(string)) - } - - condition := map[string]interface{}{ - "key": c.Key, - "value": values, - "operator": c.Operator, + condition := map[string]interface{}{ + "operator": c.Operator, + "conditions": nestedConditions, + } + result = append(result, condition) + } else { + values := getConditionValues(c.Value) + condition := map[string]interface{}{ + "key": c.Key, + "value": values, + "operator": c.Operator, + } + result = append(result, condition) } - result = append(result, condition) } } else { - var values []string - switch value := rule.Value.(type) { - case string: - values = append(values, value) - case []interface{}: - for _, v := range value { - values = append(values, fmt.Sprint(v)) - } - default: - values = append(values, value.(string)) - } - + values := getConditionValues(rule.Value) condition := map[string]interface{}{ "key": rule.Key, "value": values, @@ -3932,39 +3945,64 @@ func GenerateV2PolicyOptions(d *schema.ResourceData, meta interface{}) (iampolic return iampolicymanagementv1.CreateV2PolicyOptions{Control: policyControl, Resource: &policyResource}, nil } -func GeneratePolicyRule(d *schema.ResourceData, ruleConditions interface{}) *iampolicymanagementv1.V2PolicyRule { - conditions := []iampolicymanagementv1.RuleAttribute{} +func generatePolicyRuleCondition(c map[string]interface{}) iampolicymanagementv1.RuleAttribute { + key := c["key"].(string) + operator := c["operator"].(string) + r := iampolicymanagementv1.RuleAttribute{ + Key: &key, + Operator: &operator, + } - for _, condition := range ruleConditions.(*schema.Set).List() { - c := condition.(map[string]interface{}) - key := c["key"].(string) - operator := c["operator"].(string) - r := iampolicymanagementv1.RuleAttribute{ - Key: &key, - Operator: &operator, - } + interfaceValues := c["value"].([]interface{}) + values := make([]string, len(interfaceValues)) + for i, v := range interfaceValues { + values[i] = fmt.Sprint(v) + } - interfaceValues := c["value"].([]interface{}) - values := make([]string, len(interfaceValues)) - for i, v := range interfaceValues { - values[i] = fmt.Sprint(v) - } + if len(values) > 1 { + r.Value = &values + } else if operator == "stringExists" && values[0] == "true" { + r.Value = true + } else if operator == "stringExists" && values[0] == "false" { + r.Value = false + } else { + r.Value = &values[0] + } + return r +} - if len(values) > 1 { - r.Value = &values - } else if operator == "stringExists" && values[0] == "true" { - r.Value = true +func GeneratePolicyRule(d *schema.ResourceData, ruleConditions interface{}) *iampolicymanagementv1.V2PolicyRule { + conditions := []iampolicymanagementv1.NestedConditionIntf{} + + for _, ruleCondition := range ruleConditions.(*schema.Set).List() { + rc := ruleCondition.(map[string]interface{}) + con := rc["conditions"].([]interface{}) + if len(con) > 0 { + nestedConditions := []iampolicymanagementv1.RuleAttribute{} + for _, nc := range con { + nestedConditions = append(nestedConditions, generatePolicyRuleCondition(nc.(map[string]interface{}))) + } + nestedCondition := &iampolicymanagementv1.NestedCondition{} + nestedConditionsOperator := rc["operator"].(string) + nestedCondition.Operator = &nestedConditionsOperator + nestedCondition.Conditions = nestedConditions + conditions = append(conditions, nestedCondition) } else { - r.Value = &values[0] + ruleAttribute := generatePolicyRuleCondition(rc) + nestedCondition := &iampolicymanagementv1.NestedCondition{ + Key: ruleAttribute.Key, + Operator: ruleAttribute.Operator, + Value: ruleAttribute.Value, + } + conditions = append(conditions, nestedCondition) } - - conditions = append(conditions, r) } rule := new(iampolicymanagementv1.V2PolicyRule) if len(conditions) == 1 { - rule.Key = conditions[0].Key - rule.Operator = conditions[0].Operator - rule.Value = conditions[0].Value + ruleCondition := conditions[0].(*iampolicymanagementv1.NestedCondition) + rule.Key = ruleCondition.Key + rule.Operator = ruleCondition.Operator + rule.Value = ruleCondition.Value } else { ruleOperator := d.Get("rule_operator").(string) rule.Operator = &ruleOperator diff --git a/ibm/provider/provider.go b/ibm/provider/provider.go index 7f33857001..1094e81038 100644 --- a/ibm/provider/provider.go +++ b/ibm/provider/provider.go @@ -857,7 +857,8 @@ func Provider() *schema.Provider { "ibm_code_engine_secret": codeengine.DataSourceIbmCodeEngineSecret(), // Added for Project - "ibm_project_event_notification": project.DataSourceIbmProjectEventNotification(), + "ibm_project": project.DataSourceIbmProject(), + "ibm_project_config": project.DataSourceIbmProjectConfig(), }, ResourcesMap: map[string]*schema.Resource{ @@ -1168,6 +1169,7 @@ func Provider() *schema.Provider { "ibm_pi_placement_group": power.ResourceIBMPIPlacementGroup(), "ibm_pi_spp_placement_group": power.ResourceIBMPISPPPlacementGroup(), "ibm_pi_shared_processor_pool": power.ResourceIBMPISharedProcessorPool(), + "ibm_pi_worspace": power.ResourceIBMPIWorkspace(), // Private DNS related resources "ibm_dns_zone": dnsservices.ResourceIBMPrivateDNSZone(), @@ -1369,7 +1371,8 @@ func Provider() *schema.Provider { "ibm_code_engine_secret": codeengine.ResourceIbmCodeEngineSecret(), // Added for Project - "ibm_project_instance": project.ResourceIbmProjectInstance(), + "ibm_project": project.ResourceIbmProject(), + "ibm_project_config": project.ResourceIbmProjectConfig(), }, ConfigureFunc: providerConfigure, @@ -1625,7 +1628,8 @@ func Validator() validate.ValidatorDict { "ibm_code_engine_secret": codeengine.ResourceIbmCodeEngineSecretValidator(), // Added for Project - "ibm_project_instance": project.ResourceIbmProjectInstanceValidator(), + "ibm_project": project.ResourceIbmProjectValidator(), + "ibm_project_config": project.ResourceIbmProjectConfigValidator(), }, DataSourceValidatorDictionary: map[string]*validate.ResourceValidator{ "ibm_is_subnet": vpc.DataSourceIBMISSubnetValidator(), diff --git a/ibm/service/cdtoolchain/data_source_ibm_cd_toolchain_tool_securitycompliance.go b/ibm/service/cdtoolchain/data_source_ibm_cd_toolchain_tool_securitycompliance.go index 11cf10dc7d..143fe95bb7 100644 --- a/ibm/service/cdtoolchain/data_source_ibm_cd_toolchain_tool_securitycompliance.go +++ b/ibm/service/cdtoolchain/data_source_ibm_cd_toolchain_tool_securitycompliance.go @@ -96,31 +96,6 @@ func DataSourceIBMCdToolchainToolSecuritycompliance() *schema.Resource { Computed: true, Description: "The kind of pipeline evidence to be displayed in Security and Compliance Center for this toolchain. The values are; `cd` which will use evidence generated by a Continuous Deployment pipeline, or `cc` which will use evidence generated by a Continuous Compliance pipeline.", }, - "trigger_scan": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Deprecated: "This argument is deprecated and may be removed in a future release", - Description: "Set to `enabled` to indicate that a DevSecOps pipeline task should trigger a Security and Compliance Center run of a Hybrid cloud validation scan. Note, each scan may incur charges. When enabled, other parameters become relevant that are needed to trigger that scan; `api_key`, `scope`, `profile`. Hybrid cloud scans are deprecated and are planned to be removed. This option will stop working at that time. For more information see the [Security and Compliance Center Release Notes](https://cloud.ibm.com/docs/security-compliance?topic=security-compliance-release-notes#security-compliance-march312023).", - }, - "api_key": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Sensitive: true, - Deprecated: "This argument is deprecated and may be removed in a future release", - Description: "The IBM Cloud API key used to access the Security and Compliance Center API. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter. You can use a toolchain secret reference for this parameter. For more information, see [Protecting your sensitive data in Continuous Delivery](https://cloud.ibm.com/docs/ContinuousDelivery?topic=ContinuousDelivery-cd_data_security#cd_secure_credentials).", - }, - "scope": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Deprecated: "This argument is deprecated and may be removed in a future release", - Description: "The name of a Security and Compliance Center scope, which has previously been created in that service. When the `trigger_scan` parameter is set to `enabled`, then the Validation scan will scan all the resources in that scope. Select a scope that contains this toolchain, so that the scan will find the evidence that has been recently updated by the DevSecOps pipeline-run. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter.", - }, - "profile": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Deprecated: "This argument is deprecated and may be removed in a future release", - Description: "The name of a Security and Compliance Center, Hybrid cloud profile. Usually, use the predefined profile \"IBM Cloud Security Best Practices v1.0.0\", which contains the DevSecOps toolchain goals. Or use a user-authored customized profile that has been configured to contain those goals. When the `trigger_scan` parameter is set to `enabled`, then the Validation scan will use the controls and goals in the configured profile. If configured with a profile that does not check the DevSecOps toolchain goals, it might incorrectly indicate that the toolchain status is passed even though some of the DevSecOps scans had actually failed. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter.", - }, "use_profile_attachment": &schema.Schema{ Type: schema.TypeString, Computed: true, @@ -140,7 +115,7 @@ func DataSourceIBMCdToolchainToolSecuritycompliance() *schema.Resource { "profile_name": &schema.Schema{ Type: schema.TypeString, Computed: true, - Description: "The name of a Security and Compliance Center profile. Usually, use one of the predefined profiles \"IBM Cloud Security Best Practices\" or \"IBM Cloud for Financial Services\", which contain the DevSecOps Toolchain rules. Or use a user-authored customized profile that has been configured to contain those rules. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`.", + Description: "The name of a Security and Compliance Center profile. Usually, use the \"IBM Cloud Framework for Financial Services\" predefined profile, which contains the DevSecOps Toolchain rules. Or use a user-authored customized profile that has been configured to contain those rules. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`.", }, "profile_version": &schema.Schema{ Type: schema.TypeString, @@ -232,7 +207,6 @@ func dataSourceIBMCdToolchainToolSecuritycomplianceRead(context context.Context, if toolchainTool.Parameters != nil { remapFields := map[string]string{ "evidence_repo_url": "evidence_repo_name", - "api_key": "api-key", } modelMap := GetParametersFromRead(toolchainTool.Parameters, DataSourceIBMCdToolchainToolSecuritycompliance(), remapFields) parameters = append(parameters, modelMap) diff --git a/ibm/service/cdtoolchain/data_source_ibm_cd_toolchain_tool_securitycompliance_test.go b/ibm/service/cdtoolchain/data_source_ibm_cd_toolchain_tool_securitycompliance_test.go index 2f1d8428b3..280fa471cb 100644 --- a/ibm/service/cdtoolchain/data_source_ibm_cd_toolchain_tool_securitycompliance_test.go +++ b/ibm/service/cdtoolchain/data_source_ibm_cd_toolchain_tool_securitycompliance_test.go @@ -87,10 +87,6 @@ func testAccCheckIBMCdToolchainToolSecuritycomplianceDataSourceConfigBasic(tcNam parameters { name = "compliance" evidence_namespace = "cd" - trigger_scan = "disabled" - api_key = "api_key" - scope = "my-scope" - profile = "IBM Cloud Security Best Practices v1.0.0" evidence_repo_url = "https://github.example.com//compliance-evidence-" } } @@ -118,10 +114,6 @@ func testAccCheckIBMCdToolchainToolSecuritycomplianceDataSourceConfig(tcName str parameters { name = "compliance" evidence_namespace = "cd" - trigger_scan = "disabled" - api_key = "api_key" - scope = "my-scope" - profile = "IBM Cloud Security Best Practices v1.0.0" evidence_repo_url = "https://github.example.com//compliance-evidence-" } name = "%s" diff --git a/ibm/service/cdtoolchain/resource_ibm_cd_toolchain_tool_securitycompliance.go b/ibm/service/cdtoolchain/resource_ibm_cd_toolchain_tool_securitycompliance.go index 1da7eaadfe..be80157483 100644 --- a/ibm/service/cdtoolchain/resource_ibm_cd_toolchain_tool_securitycompliance.go +++ b/ibm/service/cdtoolchain/resource_ibm_cd_toolchain_tool_securitycompliance.go @@ -56,35 +56,9 @@ func ResourceIBMCdToolchainToolSecuritycompliance() *schema.Resource { Description: "The name for this tool integration, shown on the toolchain page.", }, "evidence_namespace": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "The kind of pipeline evidence to be displayed in Security and Compliance Center for this toolchain. The values are; `cd` which will use evidence generated by a Continuous Deployment pipeline, or `cc` which will use evidence generated by a Continuous Compliance pipeline.", - }, - "trigger_scan": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Deprecated: "This argument is deprecated and may be removed in a future release", - Description: "Set to `enabled` to indicate that a DevSecOps pipeline task should trigger a Security and Compliance Center run of a Hybrid cloud validation scan. Note, each scan may incur charges. When enabled, other parameters become relevant that are needed to trigger that scan; `api_key`, `scope`, `profile`. Hybrid cloud scans are deprecated and are planned to be removed. This option will stop working at that time. For more information see the [Security and Compliance Center Release Notes](https://cloud.ibm.com/docs/security-compliance?topic=security-compliance-release-notes#security-compliance-march312023).", - }, - "api_key": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - DiffSuppressFunc: flex.SuppressHashedRawSecret, - Sensitive: true, - Deprecated: "This argument is deprecated and may be removed in a future release", - Description: "The IBM Cloud API key used to access the Security and Compliance Center API. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter. You can use a toolchain secret reference for this parameter. For more information, see [Protecting your sensitive data in Continuous Delivery](https://cloud.ibm.com/docs/ContinuousDelivery?topic=ContinuousDelivery-cd_data_security#cd_secure_credentials).", - }, - "scope": &schema.Schema{ Type: schema.TypeString, Optional: true, - Deprecated: "This argument is deprecated and may be removed in a future release", - Description: "The name of a Security and Compliance Center scope, which has previously been created in that service. When the `trigger_scan` parameter is set to `enabled`, then the Validation scan will scan all the resources in that scope. Select a scope that contains this toolchain, so that the scan will find the evidence that has been recently updated by the DevSecOps pipeline-run. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter.", - }, - "profile": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Deprecated: "This argument is deprecated and may be removed in a future release", - Description: "The name of a Security and Compliance Center, Hybrid cloud profile. Usually, use the predefined profile \"IBM Cloud Security Best Practices v1.0.0\", which contains the DevSecOps toolchain goals. Or use a user-authored customized profile that has been configured to contain those goals. When the `trigger_scan` parameter is set to `enabled`, then the Validation scan will use the controls and goals in the configured profile. If configured with a profile that does not check the DevSecOps toolchain goals, it might incorrectly indicate that the toolchain status is passed even though some of the DevSecOps scans had actually failed. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter.", + Description: "The kind of pipeline evidence to be displayed in Security and Compliance Center for this toolchain. The values are; `cd` which will use evidence generated by a Continuous Deployment pipeline, or `cc` which will use evidence generated by a Continuous Compliance pipeline.", }, "use_profile_attachment": &schema.Schema{ Type: schema.TypeString, @@ -106,7 +80,7 @@ func ResourceIBMCdToolchainToolSecuritycompliance() *schema.Resource { "profile_name": &schema.Schema{ Type: schema.TypeString, Optional: true, - Description: "The name of a Security and Compliance Center profile. Usually, use one of the predefined profiles \"IBM Cloud Security Best Practices\" or \"IBM Cloud for Financial Services\", which contain the DevSecOps Toolchain rules. Or use a user-authored customized profile that has been configured to contain those rules. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`.", + Description: "The name of a Security and Compliance Center profile. Usually, use the \"IBM Cloud Framework for Financial Services\" predefined profile, which contains the DevSecOps Toolchain rules. Or use a user-authored customized profile that has been configured to contain those rules. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`.", }, "profile_version": &schema.Schema{ Type: schema.TypeString, @@ -223,7 +197,6 @@ func resourceIBMCdToolchainToolSecuritycomplianceCreate(context context.Context, createToolOptions.SetToolTypeID("security_compliance") remapFields := map[string]string{ "evidence_repo_url": "evidence_repo_name", - "api_key": "api-key", } parametersModel := GetParametersForCreate(d, ResourceIBMCdToolchainToolSecuritycompliance(), remapFields) createToolOptions.SetParameters(parametersModel) @@ -292,7 +265,6 @@ func resourceIBMCdToolchainToolSecuritycomplianceRead(context context.Context, d } remapFields := map[string]string{ "evidence_repo_url": "evidence_repo_name", - "api_key": "api-key", } parametersMap := GetParametersFromRead(toolchainTool.Parameters, ResourceIBMCdToolchainToolSecuritycompliance(), remapFields) if err = d.Set("parameters", []map[string]interface{}{parametersMap}); err != nil { @@ -361,7 +333,6 @@ func resourceIBMCdToolchainToolSecuritycomplianceUpdate(context context.Context, if d.HasChange("parameters") { remapFields := map[string]string{ "evidence_repo_url": "evidence_repo_name", - "api_key": "api-key", } parameters := GetParametersForUpdate(d, ResourceIBMCdToolchainToolSecuritycompliance(), remapFields) patchVals.Parameters = parameters diff --git a/ibm/service/cdtoolchain/resource_ibm_cd_toolchain_tool_securitycompliance_test.go b/ibm/service/cdtoolchain/resource_ibm_cd_toolchain_tool_securitycompliance_test.go index 59e4162c65..a2ed43f81b 100644 --- a/ibm/service/cdtoolchain/resource_ibm_cd_toolchain_tool_securitycompliance_test.go +++ b/ibm/service/cdtoolchain/resource_ibm_cd_toolchain_tool_securitycompliance_test.go @@ -90,10 +90,6 @@ func testAccCheckIBMCdToolchainToolSecuritycomplianceConfigBasic(tcName string, parameters { name = "compliance" evidence_namespace = "cd" - trigger_scan = "disabled" - api_key = "api_key" - scope = "my-scope" - profile = "IBM Cloud Security Best Practices v1.0.0" evidence_repo_url = "https://github.example.com//compliance-evidence-" } } @@ -116,10 +112,6 @@ func testAccCheckIBMCdToolchainToolSecuritycomplianceConfig(tcName string, rgNam parameters { name = "compliance" evidence_namespace = "cd" - trigger_scan = "disabled" - api_key = "api_key" - scope = "my-scope" - profile = "IBM Cloud Security Best Practices v1.0.0" evidence_repo_url = "https://github.example.com//compliance-evidence-" } name = "%s" diff --git a/ibm/service/codeengine/README.md b/ibm/service/codeengine/README.md index ba10429863..e4283df92a 100644 --- a/ibm/service/codeengine/README.md +++ b/ibm/service/codeengine/README.md @@ -8,4 +8,4 @@ This area is primarily for IBM provider contributors and maintainers. For inform * IBM Provider Docs: [Home](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs) * IBM Provider Docs: [One of the resources](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/code_engine_app) * IBM API Docs: [IBM API Docs for ]() -* IBM SDK: [IBM SDK for ](https://github.com/IBM/appconfiguration-go-admin-sdk/tree/master/codeenginev2) +* IBM SDK: [IBM SDK for ](https://github.com/IBM/code-engine-go-sdk/tree/main/codeenginev2) diff --git a/ibm/service/cos/data_source_ibm_cos_bucket.go b/ibm/service/cos/data_source_ibm_cos_bucket.go index e45744b986..22c54e1c96 100644 --- a/ibm/service/cos/data_source_ibm_cos_bucket.go +++ b/ibm/service/cos/data_source_ibm_cos_bucket.go @@ -720,6 +720,9 @@ func dataSourceIBMCosBucketRead(d *schema.ResourceData, meta interface{}) error if endpointType == "private" { sess.SetServiceURL("https://config.private.cloud-object-storage.cloud.ibm.com/v1") } + if endpointType == "direct" { + sess.SetServiceURL("https://config.direct.cloud-object-storage.cloud.ibm.com/v1") + } if bucketType == "sl" { satconfig := fmt.Sprintf("https://config.%s.%s.cloud-object-storage.appdomain.cloud/v1", serviceID, satlc_id) diff --git a/ibm/service/cos/resource_ibm_cos_bucket.go b/ibm/service/cos/resource_ibm_cos_bucket.go index d21f73c77b..abcc543635 100644 --- a/ibm/service/cos/resource_ibm_cos_bucket.go +++ b/ibm/service/cos/resource_ibm_cos_bucket.go @@ -924,6 +924,9 @@ func resourceIBMCOSBucketUpdate(d *schema.ResourceData, meta interface{}) error if endpointType == "private" { sess.SetServiceURL("https://config.private.cloud-object-storage.cloud.ibm.com/v1") } + if endpointType == "direct" { + sess.SetServiceURL("https://config.direct.cloud-object-storage.cloud.ibm.com/v1") + } if apiType == "sl" { satconfig := fmt.Sprintf("https://config.%s.%s.cloud-object-storage.appdomain.cloud/v1", serviceID, bLocation) @@ -1153,6 +1156,9 @@ func resourceIBMCOSBucketRead(d *schema.ResourceData, meta interface{}) error { if endpointType == "private" { sess.SetServiceURL("https://config.private.cloud-object-storage.cloud.ibm.com/v1") } + if endpointType == "direct" { + sess.SetServiceURL("https://config.direct.cloud-object-storage.cloud.ibm.com/v1") + } if apiType == "sl" { diff --git a/ibm/service/cos/resource_ibm_cos_bucket_website_configuration_test.go b/ibm/service/cos/resource_ibm_cos_bucket_website_configuration_test.go index 5959dc2c0b..2988811df5 100644 --- a/ibm/service/cos/resource_ibm_cos_bucket_website_configuration_test.go +++ b/ibm/service/cos/resource_ibm_cos_bucket_website_configuration_test.go @@ -12,7 +12,7 @@ import ( func TestAccIBMCosBucket_Website_Configuration_Bucket_Basic(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -41,7 +41,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_Basic(t *testing.T) { func TestAccIBMCosBucket_Website_Configuration_Bucket_Without_Public_Access(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -69,7 +69,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_Without_Public_Access(t *t } func TestAccIBMCosBucket_Website_Configuration_Bucket_Index_Document_Only(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -96,7 +96,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_Index_Document_Only(t *tes func TestAccIBMCosBucket_Website_Configuration_Bucket_With_Routing_Rule(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -133,7 +133,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_With_Routing_Rule(t *testi func TestAccIBMCosBucket_Website_Configuration_Bucket_With_JSON_Routing_Rule(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -163,7 +163,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_With_JSON_Routing_Rule(t * } func TestAccIBMCosBucket_Website_Configuration_Bucket_With_Routing_Rule_Condition_Only(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -192,7 +192,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_With_Routing_Rule_Conditio func TestAccIBMCosBucket_Website_Configuration_Bucket_With_Routing_Rule_Redirect_Only(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -227,7 +227,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_With_Routing_Rule_Redirect func TestAccIBMCosBucket_Website_Configuration_Bucket_With_Multiple_Routing_Rules(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -263,7 +263,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_With_Multiple_Routing_Rule func TestAccIBMCosBucket_Website_Configuration_Bucket_Upload_Object_With_Redirect(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -293,7 +293,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_Upload_Object_With_Redirec func TestAccIBMCosBucket_Website_Configuration_Bucket_Empty_Config(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -312,7 +312,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_Empty_Config(t *testing.T) func TestAccIBMCosBucket_Website_Configuration_Bucket_Index_And_Redirect_Together(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" @@ -333,7 +333,7 @@ func TestAccIBMCosBucket_Website_Configuration_Bucket_Index_And_Redirect_Togethe func TestAccIBMCosBucket_Website_Configuration_Bucket_No_Config(t *testing.T) { serviceName := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) - bucketName := fmt.Sprintf("terraformStaticWebHosting%d", acctest.RandIntRange(10, 100)) + bucketName := fmt.Sprintf("terraform-static-web-hosting%d", acctest.RandIntRange(10, 100)) bucketRegion := "us" bucketClass := "standard" bucketRegionType := "cross_region_location" diff --git a/ibm/service/database/data_source_ibm_database_point_in_time_recovery_test.go b/ibm/service/database/data_source_ibm_database_point_in_time_recovery_test.go index 43f0cd691c..0a95020e99 100644 --- a/ibm/service/database/data_source_ibm_database_point_in_time_recovery_test.go +++ b/ibm/service/database/data_source_ibm_database_point_in_time_recovery_test.go @@ -49,7 +49,7 @@ func testAccCheckIBMDatabaseDataSourceConfig3(name string) string { tags = ["one:two"] } - `, name, acc.IcdDbRegion) + `, name, acc.Region()) } func testAccCheckIBMDatabasePitrDataSourceConfigBasic(name string) string { diff --git a/ibm/service/database/data_source_ibm_database_remotes_test.go b/ibm/service/database/data_source_ibm_database_remotes_test.go index 7b8cd000bf..b1cb0cd6da 100644 --- a/ibm/service/database/data_source_ibm_database_remotes_test.go +++ b/ibm/service/database/data_source_ibm_database_remotes_test.go @@ -67,7 +67,7 @@ func testAccCheckIBMDatabaseDataSourceConfig4(name string) string { ] } - `, name, acc.IcdDbRegion) + `, name, acc.Region()) } func testAccCheckIBMDatabaseRemotesDataSourceConfigBasic(name string) string { @@ -82,7 +82,7 @@ func testAccCheckIBMDatabaseRemotesDataSourceConfigBasic(name string) string { data "ibm_database_remotes" "database_remotes" { deployment_id = ibm_database.db.id - + depends_on = [ ibm_database.db_replica, ] diff --git a/ibm/service/database/data_source_ibm_database_test.go b/ibm/service/database/data_source_ibm_database_test.go index 500ff603c7..950d9fc14b 100644 --- a/ibm/service/database/data_source_ibm_database_test.go +++ b/ibm/service/database/data_source_ibm_database_test.go @@ -34,7 +34,7 @@ func TestAccIBMDatabaseDataSource_basic(t *testing.T) { resource.TestCheckResourceAttr(dataName, "name", testName), resource.TestCheckResourceAttr(dataName, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(dataName, "plan", "standard"), - resource.TestCheckResourceAttr(dataName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(dataName, "location", acc.Region()), resource.TestCheckResourceAttr(dataName, "adminuser", "admin"), resource.TestCheckResourceAttr(dataName, "groups.0.memory.0.allocation_mb", "2048"), resource.TestCheckResourceAttr(dataName, "groups.0.disk.0.allocation_mb", "10240"), @@ -66,5 +66,5 @@ func testAccCheckIBMDatabaseDataSourceConfig(databaseResourceGroup string, name tags = ["one:two"] } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database.go b/ibm/service/database/resource_ibm_database.go index 1cbe4913cf..ee2a9d09fa 100644 --- a/ibm/service/database/resource_ibm_database.go +++ b/ibm/service/database/resource_ibm_database.go @@ -242,6 +242,12 @@ func ResourceIBMDatabaseInstance() *schema.Resource { Optional: true, DiffSuppressFunc: flex.ApplyOnce, }, + "offline_restore": { + Description: "Set offline restore mode for MongoDB Enterprise Edition", + Type: schema.TypeBool, + Optional: true, + DiffSuppressFunc: flex.ApplyOnce, + }, "users": { Type: schema.TypeSet, Optional: true, @@ -872,6 +878,7 @@ type Params struct { RemoteLeaderID string `json:"remote_leader_id,omitempty"` PITRDeploymentID string `json:"point_in_time_recovery_deployment_id,omitempty"` PITRTimeStamp *string `json:"point_in_time_recovery_time,omitempty"` + OfflineRestore bool `json:"offline_restore,omitempty"` } type Group struct { @@ -1030,6 +1037,7 @@ func resourceIBMDatabaseInstanceDiff(_ context.Context, diff *schema.ResourceDif } service := diff.Get("service").(string) + plan := diff.Get("plan").(string) _, logicalReplicationSet := diff.GetOk("logical_replication_slot") @@ -1086,6 +1094,11 @@ func resourceIBMDatabaseInstanceDiff(_ context.Context, diff *schema.ResourceDif } } + _, offlineRestoreOk := diff.GetOk("offline_restore") + if offlineRestoreOk && service != "databases-for-mongodb" && plan != "enterprise" { + return fmt.Errorf("[ERROR] offline_restore is only supported for databases-for-mongodb enterprise") + } + return nil } @@ -1219,6 +1232,10 @@ func resourceIBMDatabaseInstanceCreate(context context.Context, d *schema.Resour params.PITRTimeStamp = &pitrTimeTrimmed } + if offlineRestore, ok := d.GetOk("offline_restore"); ok { + params.OfflineRestore = offlineRestore.(bool) + } + serviceEndpoint := d.Get("service_endpoints").(string) params.ServiceEndpoints = serviceEndpoint parameters, _ := json.Marshal(params) @@ -2330,7 +2347,6 @@ func waitForDatabaseInstanceCreate(d *schema.ResourceData, meta interface{}, ins waitErr := waitForICDReady(meta, instanceID) if waitErr != nil { return false, fmt.Errorf("[ERROR] Error ICD interface not ready after create: %s with error %s\n", instanceID, waitErr) - } return stateConf.WaitForState() diff --git a/ibm/service/database/resource_ibm_database_cassandra_test.go b/ibm/service/database/resource_ibm_database_cassandra_test.go index 5c5b703e03..831d52752b 100644 --- a/ibm/service/database/resource_ibm_database_cassandra_test.go +++ b/ibm/service/database/resource_ibm_database_cassandra_test.go @@ -33,7 +33,7 @@ func TestAccIBMCassandraDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "allowlist.#", "1"), resource.TestCheckResourceAttr(name, "users.#", "1"), @@ -49,7 +49,7 @@ func TestAccIBMCassandraDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), resource.TestCheckResourceAttr(name, "users.#", "2"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "3"), @@ -63,7 +63,7 @@ func TestAccIBMCassandraDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), resource.TestCheckResourceAttr(name, "users.#", "0"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "1"), @@ -93,7 +93,7 @@ func TestAccIBMDatabaseInstance_Cassandra_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "allowlist.#", "1"), @@ -111,7 +111,7 @@ func TestAccIBMDatabaseInstance_Cassandra_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), resource.TestCheckResourceAttr(name, "users.#", "2"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "3"), @@ -125,7 +125,7 @@ func TestAccIBMDatabaseInstance_Cassandra_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), resource.TestCheckResourceAttr(name, "users.#", "0"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "1"), @@ -138,7 +138,7 @@ func TestAccIBMDatabaseInstance_Cassandra_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), resource.TestCheckResourceAttr(name, "users.#", "0"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "1"), @@ -173,7 +173,7 @@ func TestAccIBMDatabaseInstance_Cassandra_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "groups.0.count", "3"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "36864"), @@ -194,7 +194,7 @@ func TestAccIBMDatabaseInstance_Cassandra_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "3"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "37248"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "61440"), @@ -212,7 +212,7 @@ func TestAccIBMDatabaseInstance_Cassandra_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "3"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "36864"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "61440"), @@ -229,7 +229,7 @@ func TestAccIBMDatabaseInstance_Cassandra_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "4"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "49152"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "81920"), @@ -266,7 +266,7 @@ func TestAccIBMDatabaseInstanceCassandraImport(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "databases-for-cassandra"), resource.TestCheckResourceAttr(resourceName, "plan", "enterprise"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), ), }, { @@ -311,7 +311,7 @@ func testAccCheckIBMDatabaseInstanceCassandraBasic(databaseResourceGroup string, delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraFullyspecified(databaseResourceGroup string, name string) string { @@ -351,7 +351,7 @@ func testAccCheckIBMDatabaseInstanceCassandraFullyspecified(databaseResourceGrou delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraReduced(databaseResourceGroup string, name string) string { @@ -375,7 +375,7 @@ func testAccCheckIBMDatabaseInstanceCassandraReduced(databaseResourceGroup strin delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraNodeBasic(databaseResourceGroup string, name string) string { @@ -395,15 +395,15 @@ func testAccCheckIBMDatabaseInstanceCassandraNodeBasic(databaseResourceGroup str group { group_id = "member" - + memory { allocation_mb = 12288 } - + disk { allocation_mb = 20480 } - + cpu { allocation_count = 6 } @@ -424,7 +424,7 @@ func testAccCheckIBMDatabaseInstanceCassandraNodeBasic(databaseResourceGroup str delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraNodeFullyspecified(databaseResourceGroup string, name string) string { @@ -454,7 +454,7 @@ func testAccCheckIBMDatabaseInstanceCassandraNodeFullyspecified(databaseResource disk { allocation_mb = 20480 } - + cpu { allocation_count = 6 } @@ -483,7 +483,7 @@ func testAccCheckIBMDatabaseInstanceCassandraNodeFullyspecified(databaseResource delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraNodeReduced(databaseResourceGroup string, name string) string { @@ -524,7 +524,7 @@ func testAccCheckIBMDatabaseInstanceCassandraNodeReduced(databaseResourceGroup s delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraNodeScaleOut(databaseResourceGroup string, name string) string { @@ -564,7 +564,7 @@ func testAccCheckIBMDatabaseInstanceCassandraNodeScaleOut(databaseResourceGroup delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraGroupBasic(databaseResourceGroup string, name string) string { @@ -613,7 +613,7 @@ func testAccCheckIBMDatabaseInstanceCassandraGroupBasic(databaseResourceGroup st delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraGroupFullyspecified(databaseResourceGroup string, name string) string { @@ -671,7 +671,7 @@ func testAccCheckIBMDatabaseInstanceCassandraGroupFullyspecified(databaseResourc } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraGroupReduced(databaseResourceGroup string, name string) string { @@ -711,7 +711,7 @@ func testAccCheckIBMDatabaseInstanceCassandraGroupReduced(databaseResourceGroup delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraGroupScaleOut(databaseResourceGroup string, name string) string { @@ -759,7 +759,7 @@ func testAccCheckIBMDatabaseInstanceCassandraGroupScaleOut(databaseResourceGroup delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceCassandraImport(databaseResourceGroup string, name string) string { @@ -783,5 +783,5 @@ func testAccCheckIBMDatabaseInstanceCassandraImport(databaseResourceGroup string } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_edb_test.go b/ibm/service/database/resource_ibm_database_edb_test.go index d554fe943e..2f7a639e25 100644 --- a/ibm/service/database/resource_ibm_database_edb_test.go +++ b/ibm/service/database/resource_ibm_database_edb_test.go @@ -34,7 +34,7 @@ func TestAccIBMEDBDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-enterprisedb"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "61440"), @@ -55,7 +55,7 @@ func TestAccIBMEDBDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-enterprisedb"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "6144"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "92160"), resource.TestCheckResourceAttr(name, "service_endpoints", "public-and-private"), @@ -78,7 +78,7 @@ func TestAccIBMEDBDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-enterprisedb"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "92160"), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), @@ -103,7 +103,7 @@ func testAccCheckIBMDatabaseInstanceEDBBasic(databaseResourceGroup string, name data "ibm_resource_group" "test_acc" { name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -135,7 +135,7 @@ func testAccCheckIBMDatabaseInstanceEDBBasic(databaseResourceGroup string, name delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceEDBFullyspecified(databaseResourceGroup string, name string) string { @@ -143,7 +143,7 @@ func testAccCheckIBMDatabaseInstanceEDBFullyspecified(databaseResourceGroup stri data "ibm_resource_group" "test_acc" { name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -187,7 +187,7 @@ func testAccCheckIBMDatabaseInstanceEDBFullyspecified(databaseResourceGroup stri delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceEDBReduced(databaseResourceGroup string, name string) string { @@ -195,7 +195,7 @@ func testAccCheckIBMDatabaseInstanceEDBReduced(databaseResourceGroup string, nam data "ibm_resource_group" "test_acc" { name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -220,5 +220,5 @@ func testAccCheckIBMDatabaseInstanceEDBReduced(databaseResourceGroup string, nam delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_elasticsearch_platinum_test.go b/ibm/service/database/resource_ibm_database_elasticsearch_platinum_test.go index 1027e878da..e1cefb491d 100644 --- a/ibm/service/database/resource_ibm_database_elasticsearch_platinum_test.go +++ b/ibm/service/database/resource_ibm_database_elasticsearch_platinum_test.go @@ -33,7 +33,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "allowlist.#", "1"), resource.TestCheckResourceAttr(name, "users.#", "1"), @@ -50,7 +50,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), resource.TestCheckResourceAttr(name, "users.#", "2"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "3"), @@ -64,7 +64,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "18432"), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), @@ -79,7 +79,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "18432"), resource.TestCheckResourceAttr(name, "whitelist.#", "0"), @@ -116,7 +116,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "node_count", "3"), resource.TestCheckResourceAttr(name, "node_memory_allocation_mb", "1024"), @@ -138,7 +138,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "node_count", "3"), resource.TestCheckResourceAttr(name, "node_memory_allocation_mb", "1024"), resource.TestCheckResourceAttr(name, "node_disk_allocation_mb", "6144"), @@ -156,7 +156,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "node_count", "3"), resource.TestCheckResourceAttr(name, "node_memory_allocation_mb", "1024"), resource.TestCheckResourceAttr(name, "node_disk_allocation_mb", "6144"), @@ -173,7 +173,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "node_count", "4"), resource.TestCheckResourceAttr(name, "node_memory_allocation_mb", "1024"), resource.TestCheckResourceAttr(name, "node_disk_allocation_mb", "6144"), @@ -212,7 +212,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "node_count", "3"), resource.TestCheckResourceAttr(name, "node_memory_allocation_mb", "1024"), @@ -234,7 +234,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "node_count", "3"), resource.TestCheckResourceAttr(name, "node_memory_allocation_mb", "1024"), resource.TestCheckResourceAttr(name, "node_disk_allocation_mb", "6144"), @@ -256,7 +256,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "node_count", "3"), resource.TestCheckResourceAttr(name, "node_memory_allocation_mb", "1024"), resource.TestCheckResourceAttr(name, "node_disk_allocation_mb", "6144"), @@ -277,7 +277,7 @@ func TestAccIBMDatabaseInstance_ElasticsearchPlatinum_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "platinum"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "node_count", "4"), resource.TestCheckResourceAttr(name, "node_memory_allocation_mb", "1024"), resource.TestCheckResourceAttr(name, "node_disk_allocation_mb", "6144"), @@ -322,7 +322,7 @@ func TestAccIBMDatabaseInstanceElasticsearchPlatinumImport(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(resourceName, "plan", "platinum"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), ), }, { @@ -354,7 +354,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumBasic(databaseResourceG adminpassword = "password12" group { group_id = "member" - + memory { allocation_mb = 1024 } @@ -377,7 +377,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumBasic(databaseResourceG delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumFullyspecified(databaseResourceGroup string, name string) string { @@ -418,7 +418,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumFullyspecified(database } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumReduced(databaseResourceGroup string, name string) string { @@ -442,7 +442,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumReduced(databaseResourc delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupMigration(databaseResourceGroup string, name string) string { @@ -477,7 +477,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupMigration(database delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumNodeBasic(databaseResourceGroup string, name string) string { @@ -525,7 +525,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumNodeBasic(databaseResou delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumNodeFullyspecified(databaseResourceGroup string, name string) string { @@ -580,7 +580,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumNodeFullyspecified(data delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumNodeReduced(databaseResourceGroup string, name string) string { @@ -619,7 +619,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumNodeReduced(databaseRes delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumNodeScaleOut(databaseResourceGroup string, name string) string { @@ -658,7 +658,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumNodeScaleOut(databaseRe delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupBasic(databaseResourceGroup string, name string) string { @@ -707,7 +707,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupBasic(databaseReso delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupFullyspecified(databaseResourceGroup string, name string) string { @@ -764,7 +764,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupFullyspecified(dat } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupReduced(databaseResourceGroup string, name string) string { @@ -804,7 +804,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupReduced(databaseRe delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupScaleOut(databaseResourceGroup string, name string) string { @@ -843,7 +843,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumGroupScaleOut(databaseR delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumImport(databaseResourceGroup string, name string) string { @@ -867,5 +867,5 @@ func testAccCheckIBMDatabaseInstanceElasticsearchPlatinumImport(databaseResource } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_elasticsearch_test.go b/ibm/service/database/resource_ibm_database_elasticsearch_test.go index cb5fb613c1..400e61b7b9 100644 --- a/ibm/service/database/resource_ibm_database_elasticsearch_test.go +++ b/ibm/service/database/resource_ibm_database_elasticsearch_test.go @@ -33,7 +33,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "allowlist.#", "1"), resource.TestCheckResourceAttr(name, "users.#", "1"), @@ -50,7 +50,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), resource.TestCheckResourceAttr(name, "users.#", "2"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "3"), @@ -64,7 +64,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), resource.TestCheckResourceAttr(name, "users.#", "0"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "1"), @@ -77,7 +77,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "18432"), resource.TestCheckResourceAttr(name, "users.#", "0"), @@ -113,7 +113,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "allowlist.#", "1"), @@ -131,7 +131,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), resource.TestCheckResourceAttr(name, "users.#", "2"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "3"), @@ -145,7 +145,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), resource.TestCheckResourceAttr(name, "users.#", "0"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "1"), @@ -158,7 +158,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Node(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), resource.TestCheckResourceAttr(name, "users.#", "0"), resource.TestCheckResourceAttr(name, "connectionstrings.#", "1"), @@ -193,7 +193,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "allowlist.#", "1"), @@ -211,7 +211,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "3"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "18432"), @@ -229,7 +229,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "3"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "18432"), @@ -246,7 +246,7 @@ func TestAccIBMDatabaseInstance_Elasticsearch_Group(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "4"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "4096"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "24576"), @@ -287,7 +287,7 @@ func TestAccIBMDatabaseInstanceElasticsearchImport(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "databases-for-elasticsearch"), resource.TestCheckResourceAttr(resourceName, "plan", "standard"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), ), }, { @@ -332,7 +332,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchBasic(databaseResourceGroup str delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchFullyspecified(databaseResourceGroup string, name string) string { @@ -373,7 +373,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchFullyspecified(databaseResource } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchReduced(databaseResourceGroup string, name string) string { @@ -397,7 +397,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchReduced(databaseResourceGroup s delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchGroupMigration(databaseResourceGroup string, name string) string { @@ -432,7 +432,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchGroupMigration(databaseResource delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchNodeBasic(databaseResourceGroup string, name string) string { @@ -480,7 +480,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchNodeBasic(databaseResourceGroup delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchNodeFullyspecified(databaseResourceGroup string, name string) string { @@ -535,7 +535,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchNodeFullyspecified(databaseReso delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchNodeReduced(databaseResourceGroup string, name string) string { @@ -574,7 +574,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchNodeReduced(databaseResourceGro delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchNodeScaleOut(databaseResourceGroup string, name string) string { @@ -613,7 +613,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchNodeScaleOut(databaseResourceGr delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchGroupBasic(databaseResourceGroup string, name string) string { @@ -662,7 +662,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchGroupBasic(databaseResourceGrou delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchGroupFullyspecified(databaseResourceGroup string, name string) string { @@ -719,7 +719,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchGroupFullyspecified(databaseRes } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchGroupReduced(databaseResourceGroup string, name string) string { @@ -759,7 +759,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchGroupReduced(databaseResourceGr delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchGroupScaleOut(databaseResourceGroup string, name string) string { @@ -798,7 +798,7 @@ func testAccCheckIBMDatabaseInstanceElasticsearchGroupScaleOut(databaseResourceG delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceElasticsearchImport(databaseResourceGroup string, name string) string { @@ -822,5 +822,5 @@ func testAccCheckIBMDatabaseInstanceElasticsearchImport(databaseResourceGroup st } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_etcd_test.go b/ibm/service/database/resource_ibm_database_etcd_test.go index 42d7a83c0c..90ae1134d9 100644 --- a/ibm/service/database/resource_ibm_database_etcd_test.go +++ b/ibm/service/database/resource_ibm_database_etcd_test.go @@ -34,7 +34,7 @@ func TestAccIBMDatabaseInstance_Etcd_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-etcd"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "root"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "9216"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "184320"), @@ -54,7 +54,7 @@ func TestAccIBMDatabaseInstance_Etcd_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-etcd"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "18432"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "193536"), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), @@ -68,7 +68,7 @@ func TestAccIBMDatabaseInstance_Etcd_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-etcd"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "9216"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "193536"), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), @@ -102,7 +102,7 @@ func TestAccIBMDatabaseInstanceEtcdImport(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "databases-for-etcd"), resource.TestCheckResourceAttr(resourceName, "plan", "standard"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), ), }, { @@ -124,7 +124,7 @@ func testAccCheckIBMDatabaseInstanceEtcdBasic(databaseResourceGroup string, name is_default = true # name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -150,7 +150,7 @@ func testAccCheckIBMDatabaseInstanceEtcdBasic(databaseResourceGroup string, name description = "desc1" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceEtcdFullyspecified(databaseResourceGroup string, name string) string { @@ -159,7 +159,7 @@ func testAccCheckIBMDatabaseInstanceEtcdFullyspecified(databaseResourceGroup str is_default = true # name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -193,8 +193,8 @@ func testAccCheckIBMDatabaseInstanceEtcdFullyspecified(databaseResourceGroup str description = "desc" } } - - `, databaseResourceGroup, name, acc.IcdDbRegion) + + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceEtcdReduced(databaseResourceGroup string, name string) string { @@ -203,7 +203,7 @@ func testAccCheckIBMDatabaseInstanceEtcdReduced(databaseResourceGroup string, na is_default = true # name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -221,7 +221,7 @@ func testAccCheckIBMDatabaseInstanceEtcdReduced(databaseResourceGroup string, na } } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceEtcdImport(databaseResourceGroup string, name string) string { @@ -230,7 +230,7 @@ func testAccCheckIBMDatabaseInstanceEtcdImport(databaseResourceGroup string, nam is_default = true # name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -238,5 +238,5 @@ func testAccCheckIBMDatabaseInstanceEtcdImport(databaseResourceGroup string, nam plan = "standard" location = "%[3]s" } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_mongodb_enterprise_test.go b/ibm/service/database/resource_ibm_database_mongodb_enterprise_test.go index e8a11917ae..0993877628 100644 --- a/ibm/service/database/resource_ibm_database_mongodb_enterprise_test.go +++ b/ibm/service/database/resource_ibm_database_mongodb_enterprise_test.go @@ -34,7 +34,7 @@ func TestAccIBMMongoDBEnterpriseDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "service_endpoints", "public"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "43008"), @@ -55,7 +55,7 @@ func TestAccIBMMongoDBEnterpriseDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "service_endpoints", "public"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "86016"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "122880"), @@ -79,7 +79,7 @@ func TestAccIBMMongoDBEnterpriseDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "43008"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "122880"), @@ -119,7 +119,7 @@ func TestAccIBMMongoDBEnterpriseDatabaseInstanceGroupBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "enterprise"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "service_endpoints", "public"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "43008"), @@ -138,6 +138,62 @@ func TestAccIBMMongoDBEnterpriseDatabaseInstanceGroupBasic(t *testing.T) { }) } +func TestAccIBMMongoDBEnterpriseDatabaseInstancePITR(t *testing.T) { + t.Parallel() + databaseResourceGroup := "Default" + var databaseInstanceOne string + var databaseInstanceTwo string + serviceName := fmt.Sprintf("tf-mongodbee-%d", acctest.RandIntRange(10, 100)) + pitrServiceName := serviceName + "-pitr" + resourceName := "ibm_database." + serviceName + pitrResourceName := "ibm_database." + pitrServiceName + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + ExternalProviders: map[string]resource.ExternalProvider{ + "time": { + Source: "hashicorp/time", + VersionConstraint: ">=0.9.1", + }, + }, + ProviderFactories: acc.TestAccProviderFactories(), + CheckDestroy: testAccCheckIBMDatabaseInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMDatabaseInstanceMongoDBEnterpriseMinimal(databaseResourceGroup, serviceName), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMDatabaseInstanceExists(resourceName, &databaseInstanceOne), + resource.TestCheckResourceAttr(resourceName, "name", serviceName), + resource.TestCheckResourceAttr(resourceName, "service", "databases-for-mongodb"), + resource.TestCheckResourceAttr(resourceName, "plan", "enterprise"), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), + + resource.TestCheckResourceAttr(resourceName, "groups.0.count", "3"), + resource.TestCheckResourceAttr(resourceName, "groups.1.count", "0"), + resource.TestCheckResourceAttr(resourceName, "groups.2.count", "0"), + ), + }, + { + Config: acc.ConfigCompose(acc.ConfigAlternateRegionProvider(), + testAccCheckIBMDatabaseInstanceMongoDBEnterpriseMinimal(databaseResourceGroup, serviceName), + testAccCheckIBMDatabaseInstanceMongoDBEnterpriseMinimal_PITR(databaseResourceGroup, serviceName)), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMDatabaseInstanceExists(resourceName, &databaseInstanceOne), + testAccCheckIBMDatabaseInstanceExists(pitrResourceName, &databaseInstanceTwo), + resource.TestCheckResourceAttr(pitrResourceName, "name", pitrServiceName), + resource.TestCheckResourceAttr(pitrResourceName, "service", "databases-for-mongodb"), + resource.TestCheckResourceAttr(pitrResourceName, "plan", "enterprise"), + resource.TestCheckResourceAttr(pitrResourceName, "location", acc.RegionAlternate()), + resource.TestCheckResourceAttr(pitrResourceName, "adminuser", "admin"), + resource.TestCheckResourceAttr(pitrResourceName, "groups.0.count", "3"), + resource.TestCheckResourceAttr(pitrResourceName, "groups.1.count", "0"), + resource.TestCheckResourceAttr(pitrResourceName, "groups.2.count", "0"), + ), + }, + }, + }) +} + func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseBasic(databaseResourceGroup string, name string) string { return fmt.Sprintf(` data "ibm_resource_group" "test_acc" { @@ -176,7 +232,7 @@ func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseBasic(databaseResourceGroup delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseFullyspecified(databaseResourceGroup string, name string) string { @@ -229,7 +285,7 @@ func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseFullyspecified(databaseReso delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseReduced(databaseResourceGroup string, name string) string { @@ -262,7 +318,7 @@ func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseReduced(databaseResourceGro delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseGroupBasic(databaseResourceGroup string, name string) string { @@ -313,5 +369,57 @@ func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseGroupBasic(databaseResource delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) +} + +func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseMinimal(databaseResourceGroup string, name string) string { + return fmt.Sprintf(` + data "ibm_resource_group" "test_acc" { + is_default = true + } + + resource "ibm_database" "%[2]s" { + resource_group_id = data.ibm_resource_group.test_acc.id + name = "%[2]s" + service = "databases-for-mongodb" + plan = "enterprise" + location = "%[3]s" + + timeouts { + create = "4h" + update = "4h" + delete = "15m" + } + } + `, databaseResourceGroup, name, acc.Region()) +} + +func testAccCheckIBMDatabaseInstanceMongoDBEnterpriseMinimal_PITR(databaseResourceGroup string, name string) string { + return fmt.Sprintf(` + resource "time_sleep" "wait_time" { + create_duration = "1h" + depends_on = [ibm_database.%[2]s] + } + + resource "ibm_database" "%[2]s-pitr" { + provider = "%[1]s" + depends_on = [time_sleep.wait_time, ibm_database.%[2]s] + + resource_group_id = data.ibm_resource_group.test_acc.id + name = "%[2]s-pitr" + service = "databases-for-mongodb" + plan = "enterprise" + location = "%[3]s" + point_in_time_recovery_deployment_id = ibm_database.%[2]s.id + point_in_time_recovery_time = "" + offline_restore = true + + timeouts { + create = "4h" + update = "4h" + delete = "15m" + } + } + + `, acc.ProviderNameAlternate, name, acc.RegionAlternate()) } diff --git a/ibm/service/database/resource_ibm_database_mongodb_sharding_test.go b/ibm/service/database/resource_ibm_database_mongodb_sharding_test.go index 3b8a8e7dbb..dad9d64ff0 100644 --- a/ibm/service/database/resource_ibm_database_mongodb_sharding_test.go +++ b/ibm/service/database/resource_ibm_database_mongodb_sharding_test.go @@ -34,7 +34,7 @@ func TestAccIBMMongoDBShardingDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "enterprise-sharding"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "43008"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "61440"), @@ -53,7 +53,7 @@ func TestAccIBMMongoDBShardingDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "enterprise-sharding"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "86016"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "122880"), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), @@ -70,7 +70,7 @@ func TestAccIBMMongoDBShardingDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "enterprise-sharding"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "43008"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "122880"), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), @@ -119,7 +119,7 @@ func testAccCheckIBMDatabaseInstanceMongoDBShardingBasic(databaseResourceGroup s delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMongoDBShardingFullyspecified(databaseResourceGroup string, name string) string { @@ -171,7 +171,7 @@ func testAccCheckIBMDatabaseInstanceMongoDBShardingFullyspecified(databaseResour delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMongoDBShardingReduced(databaseResourceGroup string, name string) string { @@ -203,5 +203,5 @@ func testAccCheckIBMDatabaseInstanceMongoDBShardingReduced(databaseResourceGroup delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_mongodb_test.go b/ibm/service/database/resource_ibm_database_mongodb_test.go index 683d02fa14..3bbfae9e52 100644 --- a/ibm/service/database/resource_ibm_database_mongodb_test.go +++ b/ibm/service/database/resource_ibm_database_mongodb_test.go @@ -34,7 +34,7 @@ func TestAccIBMDatabaseInstanceMongodbBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "allowlist.#", "1"), resource.TestCheckResourceAttr(name, "users.#", "1"), @@ -53,7 +53,7 @@ func TestAccIBMDatabaseInstanceMongodbBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), resource.TestCheckResourceAttr(name, "users.#", "2"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "6144"), @@ -70,7 +70,7 @@ func TestAccIBMDatabaseInstanceMongodbBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "30720"), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), @@ -109,7 +109,7 @@ func TestAccIBMDatabaseInstanceMongodbImport(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "databases-for-mongodb"), resource.TestCheckResourceAttr(resourceName, "plan", "standard"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), ), }, { @@ -128,7 +128,7 @@ func testAccCheckIBMDatabaseInstanceMongodbBasic(databaseResourceGroup string, n data "ibm_resource_group" "test_acc" { name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -154,7 +154,7 @@ func testAccCheckIBMDatabaseInstanceMongodbBasic(databaseResourceGroup string, n description = "desc1" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMongodbFullyspecified(databaseResourceGroup string, name string) string { @@ -162,7 +162,7 @@ func testAccCheckIBMDatabaseInstanceMongodbFullyspecified(databaseResourceGroup data "ibm_resource_group" "test_acc" { name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -196,7 +196,7 @@ func testAccCheckIBMDatabaseInstanceMongodbFullyspecified(databaseResourceGroup description = "desc" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMongodbReduced(databaseResourceGroup string, name string) string { @@ -204,7 +204,7 @@ func testAccCheckIBMDatabaseInstanceMongodbReduced(databaseResourceGroup string, data "ibm_resource_group" "test_acc" { name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -222,8 +222,8 @@ func testAccCheckIBMDatabaseInstanceMongodbReduced(databaseResourceGroup string, } } } - - `, databaseResourceGroup, name, acc.IcdDbRegion) + + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMongodbImport(databaseResourceGroup string, name string) string { @@ -232,7 +232,7 @@ func testAccCheckIBMDatabaseInstanceMongodbImport(databaseResourceGroup string, is_default = true # name = "%[1]s" } - + resource "ibm_database" "%[2]s" { resource_group_id = data.ibm_resource_group.test_acc.id name = "%[2]s" @@ -240,6 +240,6 @@ func testAccCheckIBMDatabaseInstanceMongodbImport(databaseResourceGroup string, plan = "standard" location = "%[3]s" } - - `, databaseResourceGroup, name, acc.IcdDbRegion) + + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_mysql_test.go b/ibm/service/database/resource_ibm_database_mysql_test.go index d88873886a..a1291df54d 100644 --- a/ibm/service/database/resource_ibm_database_mysql_test.go +++ b/ibm/service/database/resource_ibm_database_mysql_test.go @@ -33,7 +33,7 @@ func TestAccIBMMysqlDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mysql"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "61440"), @@ -54,7 +54,7 @@ func TestAccIBMMysqlDatabaseInstanceBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-mysql"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "6144"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "92160"), resource.TestCheckResourceAttr(name, "service_endpoints", "public-and-private"), @@ -111,7 +111,7 @@ func testAccCheckIBMDatabaseInstanceMysqlBasic(databaseResourceGroup string, nam delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceMysqlFullyspecified(databaseResourceGroup string, name string) string { @@ -169,5 +169,5 @@ func testAccCheckIBMDatabaseInstanceMysqlFullyspecified(databaseResourceGroup st delete = "15m" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_postgresql_test.go b/ibm/service/database/resource_ibm_database_postgresql_test.go index 15866b186c..56769cba61 100644 --- a/ibm/service/database/resource_ibm_database_postgresql_test.go +++ b/ibm/service/database/resource_ibm_database_postgresql_test.go @@ -55,7 +55,7 @@ func TestAccIBMDatabaseInstancePostgresBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "4096"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "20480"), @@ -78,7 +78,7 @@ func TestAccIBMDatabaseInstancePostgresBasic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "8192"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "28672"), resource.TestCheckResourceAttr(name, "service_endpoints", "public-and-private"), @@ -124,7 +124,7 @@ func TestAccIBMDatabaseInstancePostgresGroup(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "groups.0.count", "2"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "4096"), @@ -147,7 +147,7 @@ func TestAccIBMDatabaseInstancePostgresGroup(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "2"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "4608"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "28672"), @@ -172,7 +172,7 @@ func TestAccIBMDatabaseInstancePostgresGroup(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "2"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "4096"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "28672"), @@ -190,7 +190,7 @@ func TestAccIBMDatabaseInstancePostgresGroup(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.count", "3"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "6144"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "43008"), @@ -227,7 +227,7 @@ func TestAccIBMDatabaseInstancePostgresImport(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(resourceName, "plan", "standard"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), ), }, { @@ -264,7 +264,7 @@ func TestAccIBMDatabaseInstancePostgresPITR(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(resourceName, "plan", "standard"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), ), }, { @@ -274,7 +274,7 @@ func TestAccIBMDatabaseInstancePostgresPITR(t *testing.T) { resource.TestCheckResourceAttr(pitrResource, "name", pitrServiceName), resource.TestCheckResourceAttr(pitrResource, "service", "databases-for-postgresql"), resource.TestCheckResourceAttr(pitrResource, "plan", "standard"), - resource.TestCheckResourceAttr(pitrResource, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(pitrResource, "location", acc.Region()), ), }, }, @@ -447,7 +447,7 @@ func testAccCheckIBMDatabaseInstancePostgresBasic(databaseResourceGroup string, plugin_type = "wal2json" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstancePostgresFullyspecified(databaseResourceGroup string, name string) string { @@ -515,7 +515,7 @@ func testAccCheckIBMDatabaseInstancePostgresFullyspecified(databaseResourceGroup plugin_type = "wal2json" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstancePostgresGroupBasic(databaseResourceGroup string, name string) string { @@ -556,7 +556,7 @@ func testAccCheckIBMDatabaseInstancePostgresGroupBasic(databaseResourceGroup str description = "desc1" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstancePostgresGroupFullyspecified(databaseResourceGroup string, name string) string { @@ -606,7 +606,7 @@ func testAccCheckIBMDatabaseInstancePostgresGroupFullyspecified(databaseResource description = "desc" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstancePostgresGroupReduced(databaseResourceGroup string, name string) string { @@ -640,7 +640,7 @@ func testAccCheckIBMDatabaseInstancePostgresGroupReduced(databaseResourceGroup s } } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstancePostgresGroupScaleOut(databaseResourceGroup string, name string) string { @@ -674,7 +674,7 @@ func testAccCheckIBMDatabaseInstancePostgresGroupScaleOut(databaseResourceGroup service_endpoints = "public" tags = ["one:two"] } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstancePostgresImport(databaseResourceGroup string, name string) string { @@ -691,7 +691,7 @@ func testAccCheckIBMDatabaseInstancePostgresImport(databaseResourceGroup string, plan = "standard" location = "%[3]s" } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstancePostgresMinimal(databaseResourceGroup string, name string) string { @@ -708,7 +708,7 @@ func testAccCheckIBMDatabaseInstancePostgresMinimal(databaseResourceGroup string plan = "standard" location = "%[3]s" } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstancePostgresMinimal_PITR(databaseResourceGroup string, name string) string { @@ -735,5 +735,5 @@ func testAccCheckIBMDatabaseInstancePostgresMinimal_PITR(databaseResourceGroup s point_in_time_recovery_deployment_id = ibm_database.%[2]s.id point_in_time_recovery_time = "" } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_rabbitmq_test.go b/ibm/service/database/resource_ibm_database_rabbitmq_test.go index 93a4bc0456..5b55cac784 100644 --- a/ibm/service/database/resource_ibm_database_rabbitmq_test.go +++ b/ibm/service/database/resource_ibm_database_rabbitmq_test.go @@ -33,7 +33,7 @@ func TestAccIBMDatabaseInstance_Rabbitmq_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "messages-for-rabbitmq"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "3072"), @@ -52,7 +52,7 @@ func TestAccIBMDatabaseInstance_Rabbitmq_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "messages-for-rabbitmq"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "6144"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "6144"), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), @@ -68,7 +68,7 @@ func TestAccIBMDatabaseInstance_Rabbitmq_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "messages-for-rabbitmq"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "3072"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "6144"), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), @@ -107,7 +107,7 @@ func TestAccIBMDatabaseInstanceRabbitmqImport(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "messages-for-rabbitmq"), resource.TestCheckResourceAttr(resourceName, "plan", "standard"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), ), }, { @@ -160,7 +160,7 @@ func testAccCheckIBMDatabaseInstanceRabbitmqBasic(databaseResourceGroup string, } CONFIGURATION } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceRabbitmqFullyspecified(databaseResourceGroup string, name string) string { @@ -204,7 +204,7 @@ func testAccCheckIBMDatabaseInstanceRabbitmqFullyspecified(databaseResourceGroup } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceRabbitmqReduced(databaseResourceGroup string, name string) string { @@ -231,7 +231,7 @@ func testAccCheckIBMDatabaseInstanceRabbitmqReduced(databaseResourceGroup string } } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceRabbitmqImport(databaseResourceGroup string, name string) string { @@ -248,5 +248,5 @@ func testAccCheckIBMDatabaseInstanceRabbitmqImport(databaseResourceGroup string, plan = "standard" location = "%[3]s" } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } diff --git a/ibm/service/database/resource_ibm_database_redis_test.go b/ibm/service/database/resource_ibm_database_redis_test.go index 3a0f4cd85a..869643aab5 100644 --- a/ibm/service/database/resource_ibm_database_redis_test.go +++ b/ibm/service/database/resource_ibm_database_redis_test.go @@ -34,7 +34,7 @@ func TestAccIBMDatabaseInstance_Redis_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-redis"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "adminuser", "admin"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "2048"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "2048"), @@ -51,7 +51,7 @@ func TestAccIBMDatabaseInstance_Redis_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-redis"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "2304"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "4096"), resource.TestCheckResourceAttr(name, "allowlist.#", "2"), @@ -63,7 +63,7 @@ func TestAccIBMDatabaseInstance_Redis_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-redis"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "2048"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "4096"), @@ -75,7 +75,7 @@ func TestAccIBMDatabaseInstance_Redis_Basic(t *testing.T) { resource.TestCheckResourceAttr(name, "name", testName), resource.TestCheckResourceAttr(name, "service", "databases-for-redis"), resource.TestCheckResourceAttr(name, "plan", "standard"), - resource.TestCheckResourceAttr(name, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(name, "location", acc.Region()), resource.TestCheckResourceAttr(name, "groups.0.memory.0.allocation_mb", "2048"), resource.TestCheckResourceAttr(name, "groups.0.disk.0.allocation_mb", "4096"), resource.TestCheckResourceAttr(name, "allowlist.#", "0"), @@ -106,7 +106,7 @@ func TestAccIBMDatabaseInstanceRedisImport(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name", serviceName), resource.TestCheckResourceAttr(resourceName, "service", "databases-for-redis"), resource.TestCheckResourceAttr(resourceName, "plan", "standard"), - resource.TestCheckResourceAttr(resourceName, "location", acc.IcdDbRegion), + resource.TestCheckResourceAttr(resourceName, "location", acc.Region()), resource.TestCheckResourceAttr(resourceName, "auto_scaling.#", "1"), resource.TestCheckResourceAttr(resourceName, "auto_scaling.0.disk.0.capacity_enabled", "true"), resource.TestCheckResourceAttr(resourceName, "auto_scaling.0.memory.0.io_enabled", "true"), @@ -192,7 +192,7 @@ func testAccCheckIBMDatabaseInstanceRedisBasic(databaseResourceGroup string, nam } CONFIGURATION } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceRedisFullyspecified(databaseResourceGroup string, name string) string { @@ -227,7 +227,7 @@ func testAccCheckIBMDatabaseInstanceRedisFullyspecified(databaseResourceGroup st description = "desc" } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceRedisReduced(databaseResourceGroup string, name string) string { @@ -254,7 +254,7 @@ func testAccCheckIBMDatabaseInstanceRedisReduced(databaseResourceGroup string, n } } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceRedisGroupMigration(databaseResourceGroup string, name string) string { @@ -282,7 +282,7 @@ func testAccCheckIBMDatabaseInstanceRedisGroupMigration(databaseResourceGroup st } } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceRedisImport(databaseResourceGroup string, name string) string { @@ -321,7 +321,7 @@ func testAccCheckIBMDatabaseInstanceRedisImport(databaseResourceGroup string, na } } } - `, databaseResourceGroup, name, acc.IcdDbRegion) + `, databaseResourceGroup, name, acc.Region()) } func testAccCheckIBMDatabaseInstanceRedisKPEncrypt(databaseResourceGroup string, kpInstanceName, kpKeyName, kpByokName, name string) string { return fmt.Sprintf(` @@ -360,5 +360,5 @@ func testAccCheckIBMDatabaseInstanceRedisKPEncrypt(databaseResourceGroup string, delete = "15m" } } - `, databaseResourceGroup, kpInstanceName, kpKeyName, kpByokName, name, acc.IcdDbRegion) + `, databaseResourceGroup, kpInstanceName, kpKeyName, kpByokName, name, acc.Region()) } diff --git a/ibm/service/iampolicy/data_source_ibm_iam_access_group_policy.go b/ibm/service/iampolicy/data_source_ibm_iam_access_group_policy.go index a82b5632af..aa16b62557 100644 --- a/ibm/service/iampolicy/data_source_ibm_iam_access_group_policy.go +++ b/ibm/service/iampolicy/data_source_ibm_iam_access_group_policy.go @@ -145,7 +145,7 @@ func DataSourceIBMIAMAccessGroupPolicy() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -155,10 +155,35 @@ func DataSourceIBMIAMAccessGroupPolicy() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/data_source_ibm_iam_policy_template.go b/ibm/service/iampolicy/data_source_ibm_iam_policy_template.go index 1262ceb0a1..8062107d9a 100644 --- a/ibm/service/iampolicy/data_source_ibm_iam_policy_template.go +++ b/ibm/service/iampolicy/data_source_ibm_iam_policy_template.go @@ -137,7 +137,7 @@ func DataSourceIBMIAMPolicyTemplate() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -147,10 +147,35 @@ func DataSourceIBMIAMPolicyTemplate() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/data_source_ibm_iam_policy_template_version.go b/ibm/service/iampolicy/data_source_ibm_iam_policy_template_version.go index f6d87e3321..0b7ab07234 100644 --- a/ibm/service/iampolicy/data_source_ibm_iam_policy_template_version.go +++ b/ibm/service/iampolicy/data_source_ibm_iam_policy_template_version.go @@ -136,7 +136,7 @@ func DataSourceIBMIAMPolicyTemplateVersion() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -146,10 +146,35 @@ func DataSourceIBMIAMPolicyTemplateVersion() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/data_source_ibm_iam_service_policy.go b/ibm/service/iampolicy/data_source_ibm_iam_service_policy.go index 2f1f8d8f97..caf69db640 100644 --- a/ibm/service/iampolicy/data_source_ibm_iam_service_policy.go +++ b/ibm/service/iampolicy/data_source_ibm_iam_service_policy.go @@ -154,7 +154,7 @@ func DataSourceIBMIAMServicePolicy() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -164,10 +164,35 @@ func DataSourceIBMIAMServicePolicy() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/data_source_ibm_iam_trusted_profile_policy.go b/ibm/service/iampolicy/data_source_ibm_iam_trusted_profile_policy.go index ae0b425627..328eab1d08 100644 --- a/ibm/service/iampolicy/data_source_ibm_iam_trusted_profile_policy.go +++ b/ibm/service/iampolicy/data_source_ibm_iam_trusted_profile_policy.go @@ -154,7 +154,7 @@ func DataSourceIBMIAMTrustedProfilePolicy() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -164,10 +164,35 @@ func DataSourceIBMIAMTrustedProfilePolicy() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/data_source_ibm_iam_user_policy.go b/ibm/service/iampolicy/data_source_ibm_iam_user_policy.go index 4cf9652fe8..1f13f5638e 100644 --- a/ibm/service/iampolicy/data_source_ibm_iam_user_policy.go +++ b/ibm/service/iampolicy/data_source_ibm_iam_user_policy.go @@ -142,7 +142,7 @@ func DataSourceIBMIAMUserPolicy() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -152,10 +152,35 @@ func DataSourceIBMIAMUserPolicy() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/resource_ibm_iam_access_group_policy.go b/ibm/service/iampolicy/resource_ibm_iam_access_group_policy.go index 2c9ae69836..5bfcaf2be9 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_access_group_policy.go +++ b/ibm/service/iampolicy/resource_ibm_iam_access_group_policy.go @@ -211,7 +211,7 @@ func ResourceIBMIAMAccessGroupPolicy() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -221,10 +221,35 @@ func ResourceIBMIAMAccessGroupPolicy() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/resource_ibm_iam_access_group_policy_test.go b/ibm/service/iampolicy/resource_ibm_iam_access_group_policy_test.go index 3a17f77b47..2e3d5e70e9 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_access_group_policy_test.go +++ b/ibm/service/iampolicy/resource_ibm_iam_access_group_policy_test.go @@ -513,6 +513,37 @@ func TestAccIBMIAMAccessGroupPolicy_With_ServiceGroupID(t *testing.T) { }) } +func TestAccIBMIAMAccessGroupPolicy_With_Attribute_Based_Condition(t *testing.T) { + var conf iampolicymanagementv1.V2PolicyTemplateMetaData + name := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMIAMAccessGroupPolicyDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMIAMAccessGroupPolicyAttributeBasedCondition(name), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMIAMAccessGroupPolicyExists("ibm_iam_access_group_policy.policy", conf), + resource.TestCheckResourceAttr("ibm_iam_access_group.accgrp", "name", name), + resource.TestCheckResourceAttr("ibm_iam_access_group_policy.policy", "roles.#", "1"), + resource.TestCheckResourceAttr("ibm_iam_access_group_policy.policy", "pattern", "attribute-based-condition:resource:literal-and-wildcard"), + resource.TestCheckResourceAttr("ibm_iam_access_group_policy.policy", "description", "IAM Access Group Policy Attribute Based Condition Creation for test scenario"), + ), + }, + { + Config: testAccCheckIBMIAMAccessGroupPolicyUpdateAttributeBasedCondition(name), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ibm_iam_access_group.accgrp", "name", name), + resource.TestCheckResourceAttr("ibm_iam_access_group_policy.policy", "pattern", "attribute-based-condition:resource:literal-and-wildcard"), + resource.TestCheckResourceAttr("ibm_iam_access_group_policy.policy", "description", "IAM Access Group Policy Attribute Based Condition Update for test scenario"), + ), + }, + }, + }) +} + func testAccCheckIBMIAMAccessGroupPolicyDestroy(s *terraform.State) error { iamPolicyManagementClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).IAMPolicyManagementV1API() if err != nil { @@ -1126,3 +1157,137 @@ func testAccCheckIBMIAMAccessGroupPolicyUpdateWithServiceGroupId(name string) st } `, name) } + +func testAccCheckIBMIAMAccessGroupPolicyAttributeBasedCondition(name string) string { + return fmt.Sprintf(` + resource "ibm_iam_access_group" "accgrp" { + name = "%s" + } + + resource "ibm_iam_access_group_policy" "policy" { + access_group_id = ibm_iam_access_group.accgrp.id + roles = ["Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM Access Group Policy Attribute Based Condition Creation for test scenario" + } + `, name) +} + +func testAccCheckIBMIAMAccessGroupPolicyUpdateAttributeBasedCondition(name string) string { + return fmt.Sprintf(` + resource "ibm_iam_access_group" "accgrp" { + name = "%s" + } + + resource "ibm_iam_access_group_policy" "policy" { + access_group_id = ibm_iam_access_group.accgrp.id + roles = ["Reader", "Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM Access Group Policy Attribute Based Condition Update for test scenario" + } + `, name) +} diff --git a/ibm/service/iampolicy/resource_ibm_iam_policy_template.go b/ibm/service/iampolicy/resource_ibm_iam_policy_template.go index 62ec4e8712..a2c5018389 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_policy_template.go +++ b/ibm/service/iampolicy/resource_ibm_iam_policy_template.go @@ -125,7 +125,7 @@ func ResourceIBMIAMPolicyTemplate() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -135,10 +135,35 @@ func ResourceIBMIAMPolicyTemplate() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, @@ -268,12 +293,12 @@ func generateTemplatePolicy(modelMap map[string]interface{}, iamPolicyManagement } if modelMap["rule_conditions"] != nil && len(modelMap["rule_conditions"].(*schema.Set).List()) > 0 { - conditions := []iampolicymanagementv1.RuleAttribute{} + conditions := []iampolicymanagementv1.NestedConditionIntf{} for _, condition := range modelMap["rule_conditions"].(*schema.Set).List() { c := condition.(map[string]interface{}) key := c["key"].(string) operator := c["operator"].(string) - r := iampolicymanagementv1.RuleAttribute{ + r := &iampolicymanagementv1.NestedCondition{ Key: &key, Operator: &operator, } @@ -296,9 +321,10 @@ func generateTemplatePolicy(modelMap map[string]interface{}, iamPolicyManagement } rule := new(iampolicymanagementv1.V2PolicyRule) if len(conditions) == 1 { - rule.Key = conditions[0].Key - rule.Operator = conditions[0].Operator - rule.Value = conditions[0].Value + ruleCondition := conditions[0].(*iampolicymanagementv1.NestedCondition) + rule.Key = ruleCondition.Key + rule.Operator = ruleCondition.Operator + rule.Value = ruleCondition.Value } else { ruleOperator := modelMap["rule_operator"].(string) rule.Operator = &ruleOperator diff --git a/ibm/service/iampolicy/resource_ibm_iam_policy_template_version.go b/ibm/service/iampolicy/resource_ibm_iam_policy_template_version.go index 1f34e5d8f5..819ab07014 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_policy_template_version.go +++ b/ibm/service/iampolicy/resource_ibm_iam_policy_template_version.go @@ -123,7 +123,7 @@ func ResourceIBMIAMPolicyTemplateVersion() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -133,10 +133,35 @@ func ResourceIBMIAMPolicyTemplateVersion() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/resource_ibm_iam_service_policy.go b/ibm/service/iampolicy/resource_ibm_iam_service_policy.go index cb428e6c40..9b14ed0696 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_service_policy.go +++ b/ibm/service/iampolicy/resource_ibm_iam_service_policy.go @@ -214,7 +214,7 @@ func ResourceIBMIAMServicePolicy() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -224,10 +224,35 @@ func ResourceIBMIAMServicePolicy() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/resource_ibm_iam_service_policy_test.go b/ibm/service/iampolicy/resource_ibm_iam_service_policy_test.go index 27d18b638e..93bdf6ddb6 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_service_policy_test.go +++ b/ibm/service/iampolicy/resource_ibm_iam_service_policy_test.go @@ -474,6 +474,37 @@ func TestAccIBMIAMServicePolicy_With_ServiceGroupID(t *testing.T) { }) } +func TestAccIBMIAMServicePolicy_With_Attribute_Based_Condition(t *testing.T) { + var conf iampolicymanagementv1.V2PolicyTemplateMetaData + name := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMIAMServicePolicyDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMIAMServicePolicyAttributeBasedCondition(name), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMIAMServicePolicyExists("ibm_iam_service_policy.policy", conf), + resource.TestCheckResourceAttr("ibm_iam_service_id.serviceID", "name", name), + resource.TestCheckResourceAttr("ibm_iam_service_policy.policy", "roles.#", "1"), + resource.TestCheckResourceAttr("ibm_iam_service_policy.policy", "pattern", "attribute-based-condition:resource:literal-and-wildcard"), + resource.TestCheckResourceAttr("ibm_iam_service_policy.policy", "description", "IAM Service Policy Attribute Based Condition Creation for test scenario"), + ), + }, + { + Config: testAccCheckIBMIAMServicePolicyUpdateAttributeBasedCondition(name), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ibm_iam_service_id.serviceID", "name", name), + resource.TestCheckResourceAttr("ibm_iam_service_policy.policy", "pattern", "attribute-based-condition:resource:literal-and-wildcard"), + resource.TestCheckResourceAttr("ibm_iam_service_policy.policy", "description", "IAM Service Policy Attribute Based Condition Update for test scenario"), + ), + }, + }, + }) +} + func testAccCheckIBMIAMServicePolicyDestroy(s *terraform.State) error { rsContClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).IAMPolicyManagementV1API() if err != nil { @@ -1073,3 +1104,137 @@ func testAccCheckIBMIAMServiceUpdatePolicyWithServiceGroupId(name string) string } `, name) } + +func testAccCheckIBMIAMServicePolicyAttributeBasedCondition(name string) string { + return fmt.Sprintf(` + resource "ibm_iam_service_id" "serviceID" { + name = "%s" + } + + resource "ibm_iam_service_policy" "policy" { + iam_service_id = ibm_iam_service_id.serviceID.id + roles = ["Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM Service Policy Attribute Based Condition Creation for test scenario" + } + `, name) +} + +func testAccCheckIBMIAMServicePolicyUpdateAttributeBasedCondition(name string) string { + return fmt.Sprintf(` + resource "ibm_iam_service_id" "serviceID" { + name = "%s" + } + + resource "ibm_iam_service_policy" "policy" { + iam_service_id = ibm_iam_service_id.serviceID.id + roles = ["Reader", "Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM Service Policy Attribute Based Condition Update for test scenario" + } + `, name) +} diff --git a/ibm/service/iampolicy/resource_ibm_iam_trusted_profile_policy.go b/ibm/service/iampolicy/resource_ibm_iam_trusted_profile_policy.go index 16fe0f9499..f3631f38ae 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_trusted_profile_policy.go +++ b/ibm/service/iampolicy/resource_ibm_iam_trusted_profile_policy.go @@ -214,7 +214,7 @@ func ResourceIBMIAMTrustedProfilePolicy() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -224,10 +224,35 @@ func ResourceIBMIAMTrustedProfilePolicy() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/resource_ibm_iam_trusted_profile_policy_test.go b/ibm/service/iampolicy/resource_ibm_iam_trusted_profile_policy_test.go index 662eb71ee4..ba0d80e5f7 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_trusted_profile_policy_test.go +++ b/ibm/service/iampolicy/resource_ibm_iam_trusted_profile_policy_test.go @@ -465,6 +465,37 @@ func TestAccIBMIAMTrustedProfilePolicy_With_ServiceGroupID(t *testing.T) { }) } +func TestAccIBMIAMTrustedProfilePolicy_With_Attribute_Based_Condition(t *testing.T) { + var conf iampolicymanagementv1.V2PolicyTemplateMetaData + name := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMIAMTrustedProfilePolicyDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMIAMTrustedProfilePolicyAttributeBasedCondition(name), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMIAMTrustedProfilePolicyExists("ibm_iam_trusted_profile_policy.policy", conf), + resource.TestCheckResourceAttr("ibm_iam_trusted_profile.profileID", "name", name), + resource.TestCheckResourceAttr("ibm_iam_trusted_profile_policy.policy", "roles.#", "1"), + resource.TestCheckResourceAttr("ibm_iam_trusted_profile_policy.policy", "pattern", "attribute-based-condition:resource:literal-and-wildcard"), + resource.TestCheckResourceAttr("ibm_iam_trusted_profile_policy.policy", "description", "IAM Trusted Profile Policy Attribute Based Condition Creation for test scenario"), + ), + }, + { + Config: testAccCheckIBMIAMTrustedProfilePolicyUpdateAttributeBasedCondition(name), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ibm_iam_trusted_profile.profileID", "name", name), + resource.TestCheckResourceAttr("ibm_iam_trusted_profile_policy.policy", "pattern", "attribute-based-condition:resource:literal-and-wildcard"), + resource.TestCheckResourceAttr("ibm_iam_trusted_profile_policy.policy", "description", "IAM Trusted Profile Policy Attribute Based Condition Update for test scenario"), + ), + }, + }, + }) +} + func testAccCheckIBMIAMTrustedProfilePolicyDestroy(s *terraform.State) error { rsContClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).IAMPolicyManagementV1API() if err != nil { @@ -1033,3 +1064,137 @@ func testAccCheckIBMIAMTrustedProfilePolicyUpdateWithServiceGroupId(name string) } `, name) } + +func testAccCheckIBMIAMTrustedProfilePolicyAttributeBasedCondition(name string) string { + return fmt.Sprintf(` + resource "ibm_iam_trusted_profile" "profileID" { + name = "%s" + } + + resource "ibm_iam_trusted_profile_policy" "policy" { + profile_id = ibm_iam_trusted_profile.profileID.id + roles = ["Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM Trusted Profile Policy Attribute Based Condition Creation for test scenario" + } + `, name) +} + +func testAccCheckIBMIAMTrustedProfilePolicyUpdateAttributeBasedCondition(name string) string { + return fmt.Sprintf(` + resource "ibm_iam_trusted_profile" "profileID" { + name = "%s" + } + + resource "ibm_iam_trusted_profile_policy" "policy" { + profile_id = ibm_iam_trusted_profile.profileID.id + roles = ["Reader", "Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM Trusted Profile Policy Attribute Based Condition Update for test scenario" + } + `, name) +} diff --git a/ibm/service/iampolicy/resource_ibm_iam_user_policy.go b/ibm/service/iampolicy/resource_ibm_iam_user_policy.go index a30e0ab2bf..c3c3529ada 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_user_policy.go +++ b/ibm/service/iampolicy/resource_ibm_iam_user_policy.go @@ -202,7 +202,7 @@ func ResourceIBMIAMUserPolicy() *schema.Resource { Schema: map[string]*schema.Schema{ "key": { Type: schema.TypeString, - Required: true, + Optional: true, Description: "Key of the condition", }, "operator": { @@ -212,10 +212,35 @@ func ResourceIBMIAMUserPolicy() *schema.Resource { }, "value": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: "Value of the condition", }, + "conditions": { + Type: schema.TypeList, + Optional: true, + Description: "Additional Rule conditions enforced by the policy", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Key of the condition", + }, + "operator": { + Type: schema.TypeString, + Required: true, + Description: "Operator of the condition", + }, + "value": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "Value of the condition", + }, + }, + }, + }, }, }, }, diff --git a/ibm/service/iampolicy/resource_ibm_iam_user_policy_test.go b/ibm/service/iampolicy/resource_ibm_iam_user_policy_test.go index f3f6acb1d3..46be011f8e 100644 --- a/ibm/service/iampolicy/resource_ibm_iam_user_policy_test.go +++ b/ibm/service/iampolicy/resource_ibm_iam_user_policy_test.go @@ -205,6 +205,7 @@ func TestAccIBMIAMUserPolicy_With_Resource_Attributes(t *testing.T) { }, }) } + func TestAccIBMIAMUserPolicy_account_management(t *testing.T) { var conf iampolicymanagementv1.V2PolicyTemplateMetaData name := fmt.Sprintf("terraform_%d", acctest.RandIntRange(10, 100)) @@ -479,6 +480,34 @@ func TestAccIBMIAMUSerPolicy_With_ServiceGroupID(t *testing.T) { }) } +func TestAccIBMIAMUserPolicy_With_Attribute_Based_Condition(t *testing.T) { + var conf iampolicymanagementv1.V2PolicyTemplateMetaData + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMIAMUserPolicyDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMIAMUserPolicyAttributeBasedCondition(), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMIAMUserPolicyExists("ibm_iam_user_policy.policy", conf), + resource.TestCheckResourceAttr("ibm_iam_user_policy.policy", "roles.#", "1"), + resource.TestCheckResourceAttr("ibm_iam_user_policy.policy", "pattern", "attribute-based-condition:resource:literal-and-wildcard"), + resource.TestCheckResourceAttr("ibm_iam_user_policy.policy", "description", "IAM User Policy Attribute Based Condition Creation for test scenario"), + ), + }, + { + Config: testAccCheckIBMIAMUserPolicyUpdateAttributeBasedCondition(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ibm_iam_user_policy.policy", "pattern", "attribute-based-condition:resource:literal-and-wildcard"), + resource.TestCheckResourceAttr("ibm_iam_user_policy.policy", "description", "IAM User Policy Attribute Based Condition Update for test scenario"), + ), + }, + }, + }) +} + func testAccCheckIBMIAMUserPolicyDestroy(s *terraform.State) error { rsContClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).IAMPolicyManagementV1API() if err != nil { @@ -1008,3 +1037,130 @@ func testAccCheckIBMIAMUserPolicyWithServiceGroupId(name string) string { } `, acc.IAMUser) } + +func testAccCheckIBMIAMUserPolicyAttributeBasedCondition() string { + return fmt.Sprintf(` + + resource "ibm_iam_user_policy" "policy" { + ibm_id = "%s" + roles = ["Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM User Policy Attribute Based Condition Creation for test scenario" + } + `, acc.IAMUser) +} + +func testAccCheckIBMIAMUserPolicyUpdateAttributeBasedCondition() string { + return fmt.Sprintf(` + resource "ibm_iam_user_policy" "policy" { + ibm_id = "%s" + roles = ["Reader", "Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM User Policy Attribute Based Condition Update for test scenario" + } + `, acc.IAMUser) +} diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go new file mode 100644 index 0000000000..ab7263a6c7 --- /dev/null +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -0,0 +1,167 @@ +package power + +import ( + "context" + "fmt" + "log" + "time" + + st "github.com/IBM-Cloud/power-go-client/clients/instance" + "github.com/IBM-Cloud/power-go-client/helpers" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func ResourceIBMPIWorkspace() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIBMPIWorkspaceCreate, + ReadContext: resourceIBMPIWorkspaceRead, + DeleteContext: resourceIBMPIWorkspaceDelete, + Importer: &schema.ResourceImporter{}, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(20 * time.Minute), + Update: schema.DefaultTimeout(20 * time.Minute), + Delete: schema.DefaultTimeout(20 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + helpers.PICloudInstanceId: { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ConflictsWith: []string{helpers.PIWorkspaceName, helpers.PIWorkspaceDatacenter, helpers.PIWorkspaceResourceGroup, helpers.PIWorkspacePlan}, + Description: "PI cloud instance ID", + }, + helpers.PIWorkspaceName: { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ConflictsWith: []string{helpers.PICloudInstanceId}, + RequiredWith: []string{helpers.PIWorkspaceDatacenter, helpers.PIWorkspaceResourceGroup, helpers.PIWorkspacePlan}, + Description: "The desired name of the workspace", + }, + helpers.PIWorkspaceDatacenter: { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ConflictsWith: []string{helpers.PICloudInstanceId}, + RequiredWith: []string{helpers.PIWorkspaceName, helpers.PIWorkspaceResourceGroup, helpers.PIWorkspacePlan}, + Description: "The datacenter location where the instance should be hosted", + }, + helpers.PIWorkspaceResourceGroup: { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ConflictsWith: []string{helpers.PICloudInstanceId}, + RequiredWith: []string{helpers.PIWorkspaceDatacenter, helpers.PIWorkspaceName, helpers.PIWorkspacePlan}, + Description: "The ID of the resource group", + }, + helpers.PIWorkspacePlan: { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ConflictsWith: []string{helpers.PICloudInstanceId}, + RequiredWith: []string{helpers.PIWorkspaceDatacenter, helpers.PIWorkspaceResourceGroup, helpers.PIWorkspaceName}, + Description: "Plan associated with the offering; Valid values are \"public\" or \"private\".", + }, + }, + } +} + +func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + name := d.Get(helpers.PIWorkspaceName).(string) + datacenter := d.Get(helpers.PIWorkspaceDatacenter).(string) + resourceGroup := d.Get(helpers.PIWorkspaceResourceGroup).(string) + plan := d.Get(helpers.PIWorkspacePlan).(string) + + // No need for cloudInstanceID because we are creating a workspace + client := st.NewIBMPIWorkspacesClient(ctx, sess, "") + controller, err := client.Create(name, datacenter, resourceGroup, plan) + if err != nil { + log.Printf("[DEBUG] create workspace failed %v", err) + return diag.FromErr(err) + } + // d.Set(helpers.PICloudInstanceId, strings.Split(*controller.CRN, ":")[7]) + d.SetId(*controller.GUID) + _, err = waitForResourceInstanceCreate(ctx, client, *controller.GUID, d.Timeout(schema.TimeoutCreate)) + if err != nil { + return diag.FromErr(err) + } + + return resourceIBMPIWorkspaceRead(ctx, d, meta) +} + +func resourceIBMPIWorkspaceRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + // session + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + + client := st.NewIBMPIWorkspacesClient(ctx, sess, cloudInstanceID) + wsData, err := client.Get(cloudInstanceID) + if err != nil { + return diag.FromErr(err) + } + d.Set(helpers.PICloudInstanceId, cloudInstanceID) + d.Set(helpers.PIWorkspaceName, wsData.Name) + // d.Set(helpers.PIWorkspaceDatacenter, helpers.PIWorkspaceDatacenter) + // d.Set(helpers.PIWorkspaceResourceGroup, helpers.PIWorkspaceResourceGroup) + // d.Set(helpers.PIWorkspacePlan, helpers.PIWorkspacePlan) + + return nil +} + +func resourceIBMPIWorkspaceDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + client := st.NewIBMPIWorkspacesClient(ctx, sess, cloudInstanceID) + err = client.Delete(cloudInstanceID) + if err != nil { + return diag.FromErr(err) + } + + return nil +} + +func waitForResourceInstanceCreate(ctx context.Context, client *st.IBMPIWorkspacesClient, id string, timeout time.Duration) (interface{}, error) { + stateConf := &resource.StateChangeConf{ + Pending: []string{"provisioning", "in progress", "inactive"}, + Target: []string{"active"}, + Refresh: isIBMPIWorkspaceRefreshFunc(client, id), + Timeout: timeout, + Delay: 10 * time.Second, + MinTimeout: 10 * time.Second, + } + + return stateConf.WaitForStateContext(ctx) +} +func isIBMPIWorkspaceRefreshFunc(client *st.IBMPIWorkspacesClient, id string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + ws, err := client.GetRC(id) + // ws, err := client.Get(id) + if err != nil { + return nil, "", err + } + if *ws.State == "failed" { + return ws, *ws.State, fmt.Errorf("[ERROR] The resource instance %s failed to provisioned", id) + } + + return ws, *ws.State, nil + + } +} diff --git a/ibm/service/project/data_source_ibm_project.go b/ibm/service/project/data_source_ibm_project.go new file mode 100644 index 0000000000..277d769e3a --- /dev/null +++ b/ibm/service/project/data_source_ibm_project.go @@ -0,0 +1,532 @@ +// Copyright IBM Corp. 2023 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package project + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/IBM/project-go-sdk/projectv1" +) + +func DataSourceIbmProject() *schema.Resource { + return &schema.Resource{ + ReadContext: dataSourceIbmProjectRead, + + Schema: map[string]*schema.Schema{ + "project_id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The unique project ID.", + }, + "crn": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "An IBM Cloud resource name, which uniquely identifies a resource.", + }, + "created_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "cumulative_needs_attention_view": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The cumulative list of needs attention items for a project. If the view is successfully retrieved, an array which could be empty is returned.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "event": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The event name.", + }, + "event_id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A unique ID for that individual event.", + }, + "config_id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A unique ID for the configuration.", + }, + "config_version": &schema.Schema{ + Type: schema.TypeInt, + Computed: true, + Description: "The version number of the configuration.", + }, + }, + }, + }, + "cumulative_needs_attention_view_error": &schema.Schema{ + Type: schema.TypeBool, + Computed: true, + Description: "True indicates that the fetch of the needs attention items failed. It only exists if there was an error while retrieving the cumulative needs attention view.", + }, + "location": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The IBM Cloud location where a resource is deployed.", + }, + "resource_group": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The resource group where the project's data and tools are created.", + }, + "state": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The project status value.", + }, + "event_notifications_crn": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The CRN of the event notifications instance if one is connected to this project.", + }, + "configs": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The project configurations. These configurations are only included in the response of creating a project if a configs array is specified in the request payload.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration.", + }, + "version": &schema.Schema{ + Type: schema.TypeInt, + Computed: true, + Description: "The version of the configuration.", + }, + "state": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The state of the configuration.", + }, + "created_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "modified_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A URL.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The name and description of a project configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The configuration name.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A project configuration description.", + }, + }, + }, + }, + "project": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The project referenced by this resource.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The unique ID.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The definition of the project reference.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The name of the project.", + }, + }, + }, + }, + "crn": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "An IBM Cloud resource name, which uniquely identifies a resource.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A URL.", + }, + }, + }, + }, + }, + }, + }, + "environments": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The project environments. These environments are only included in the response if project environments were created on the project.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The environment id as a friendly name.", + }, + "project": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The project referenced by this resource.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The unique ID.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The definition of the project reference.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The name of the project.", + }, + }, + }, + }, + "crn": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "An IBM Cloud resource name, which uniquely identifies a resource.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A URL.", + }, + }, + }, + }, + "created_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A URL.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The environment definition used in the project collection.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The name of the environment.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The description of the environment.", + }, + }, + }, + }, + }, + }, + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The definition of the project.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The name of the project.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A brief explanation of the project's use in the configuration of a deployable architecture. It is possible to create a project without providing a description.", + }, + "destroy_on_delete": &schema.Schema{ + Type: schema.TypeBool, + Computed: true, + Description: "The policy that indicates whether the resources are destroyed or not when a project is deleted.", + }, + }, + }, + }, + }, + } +} + +func dataSourceIbmProjectRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + getProjectOptions := &projectv1.GetProjectOptions{} + + getProjectOptions.SetID(d.Get("project_id").(string)) + + project, response, err := projectClient.GetProjectWithContext(context, getProjectOptions) + if err != nil { + log.Printf("[DEBUG] GetProjectWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("GetProjectWithContext failed %s\n%s", err, response)) + } + + d.SetId(fmt.Sprintf("%s", *getProjectOptions.ID)) + + if err = d.Set("crn", project.Crn); err != nil { + return diag.FromErr(fmt.Errorf("Error setting crn: %s", err)) + } + + if err = d.Set("created_at", flex.DateTimeToString(project.CreatedAt)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting created_at: %s", err)) + } + + cumulativeNeedsAttentionView := []map[string]interface{}{} + if project.CumulativeNeedsAttentionView != nil { + for _, modelItem := range project.CumulativeNeedsAttentionView { + modelMap, err := dataSourceIbmProjectCumulativeNeedsAttentionToMap(&modelItem) + if err != nil { + return diag.FromErr(err) + } + cumulativeNeedsAttentionView = append(cumulativeNeedsAttentionView, modelMap) + } + } + if err = d.Set("cumulative_needs_attention_view", cumulativeNeedsAttentionView); err != nil { + return diag.FromErr(fmt.Errorf("Error setting cumulative_needs_attention_view %s", err)) + } + + if err = d.Set("cumulative_needs_attention_view_error", project.CumulativeNeedsAttentionViewError); err != nil { + return diag.FromErr(fmt.Errorf("Error setting cumulative_needs_attention_view_error: %s", err)) + } + + if err = d.Set("location", project.Location); err != nil { + return diag.FromErr(fmt.Errorf("Error setting location: %s", err)) + } + + if err = d.Set("resource_group", project.ResourceGroup); err != nil { + return diag.FromErr(fmt.Errorf("Error setting resource_group: %s", err)) + } + + if err = d.Set("state", project.State); err != nil { + return diag.FromErr(fmt.Errorf("Error setting state: %s", err)) + } + + if err = d.Set("event_notifications_crn", project.EventNotificationsCrn); err != nil { + return diag.FromErr(fmt.Errorf("Error setting event_notifications_crn: %s", err)) + } + + configs := []map[string]interface{}{} + if project.Configs != nil { + for _, modelItem := range project.Configs { + modelMap, err := dataSourceIbmProjectProjectConfigCollectionMemberToMap(&modelItem) + if err != nil { + return diag.FromErr(err) + } + configs = append(configs, modelMap) + } + } + if err = d.Set("configs", configs); err != nil { + return diag.FromErr(fmt.Errorf("Error setting configs %s", err)) + } + + environments := []map[string]interface{}{} + if project.Environments != nil { + for _, modelItem := range project.Environments { + modelMap, err := dataSourceIbmProjectProjectEnvironmentCollectionMemberToMap(&modelItem) + if err != nil { + return diag.FromErr(err) + } + environments = append(environments, modelMap) + } + } + if err = d.Set("environments", environments); err != nil { + return diag.FromErr(fmt.Errorf("Error setting environments %s", err)) + } + + definition := []map[string]interface{}{} + if project.Definition != nil { + modelMap, err := dataSourceIbmProjectProjectDefinitionPropertiesToMap(project.Definition) + if err != nil { + return diag.FromErr(err) + } + definition = append(definition, modelMap) + } + if err = d.Set("definition", definition); err != nil { + return diag.FromErr(fmt.Errorf("Error setting definition %s", err)) + } + + return nil +} + +func dataSourceIbmProjectCumulativeNeedsAttentionToMap(model *projectv1.CumulativeNeedsAttention) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.Event != nil { + modelMap["event"] = model.Event + } + if model.EventID != nil { + modelMap["event_id"] = model.EventID + } + if model.ConfigID != nil { + modelMap["config_id"] = model.ConfigID + } + if model.ConfigVersion != nil { + modelMap["config_version"] = flex.IntValue(model.ConfigVersion) + } + return modelMap, nil +} + +func dataSourceIbmProjectProjectConfigCollectionMemberToMap(model *projectv1.ProjectConfigCollectionMember) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.ApprovedVersion != nil { + approvedVersionMap, err := dataSourceIbmProjectProjectConfigVersionSummaryToMap(model.ApprovedVersion) + if err != nil { + return modelMap, err + } + modelMap["approved_version"] = []map[string]interface{}{approvedVersionMap} + } + if model.DeployedVersion != nil { + deployedVersionMap, err := dataSourceIbmProjectProjectConfigVersionSummaryToMap(model.DeployedVersion) + if err != nil { + return modelMap, err + } + modelMap["deployed_version"] = []map[string]interface{}{deployedVersionMap} + } + modelMap["id"] = model.ID + modelMap["version"] = flex.IntValue(model.Version) + modelMap["state"] = model.State + if model.CreatedAt != nil { + modelMap["created_at"] = model.CreatedAt.String() + } + if model.ModifiedAt != nil { + modelMap["modified_at"] = model.ModifiedAt.String() + } + modelMap["href"] = model.Href + definitionMap, err := dataSourceIbmProjectProjectConfigDefinitionNameDescriptionToMap(model.Definition) + if err != nil { + return modelMap, err + } + modelMap["definition"] = []map[string]interface{}{definitionMap} + projectMap, err := dataSourceIbmProjectProjectReferenceToMap(model.Project) + if err != nil { + return modelMap, err + } + modelMap["project"] = []map[string]interface{}{projectMap} + return modelMap, nil +} + +func dataSourceIbmProjectProjectConfigVersionSummaryToMap(model *projectv1.ProjectConfigVersionSummary) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["state"] = model.State + modelMap["version"] = flex.IntValue(model.Version) + modelMap["href"] = model.Href + return modelMap, nil +} + +func dataSourceIbmProjectProjectConfigDefinitionNameDescriptionToMap(model *projectv1.ProjectConfigDefinitionNameDescription) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.Name != nil { + modelMap["name"] = model.Name + } + if model.Description != nil { + modelMap["description"] = model.Description + } + return modelMap, nil +} + +func dataSourceIbmProjectProjectReferenceToMap(model *projectv1.ProjectReference) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["id"] = model.ID + definitionMap, err := dataSourceIbmProjectProjectDefinitionReferenceToMap(model.Definition) + if err != nil { + return modelMap, err + } + modelMap["definition"] = []map[string]interface{}{definitionMap} + modelMap["crn"] = model.Crn + modelMap["href"] = model.Href + return modelMap, nil +} + +func dataSourceIbmProjectProjectDefinitionReferenceToMap(model *projectv1.ProjectDefinitionReference) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + return modelMap, nil +} + +func dataSourceIbmProjectProjectEnvironmentCollectionMemberToMap(model *projectv1.ProjectEnvironmentCollectionMember) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["id"] = model.ID + projectMap, err := dataSourceIbmProjectProjectReferenceToMap(model.Project) + if err != nil { + return modelMap, err + } + modelMap["project"] = []map[string]interface{}{projectMap} + modelMap["created_at"] = model.CreatedAt.String() + modelMap["href"] = model.Href + definitionMap, err := dataSourceIbmProjectEnvironmentDefinitionNameDescriptionToMap(model.Definition) + if err != nil { + return modelMap, err + } + modelMap["definition"] = []map[string]interface{}{definitionMap} + return modelMap, nil +} + +func dataSourceIbmProjectEnvironmentDefinitionNameDescriptionToMap(model *projectv1.EnvironmentDefinitionNameDescription) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.Name != nil { + modelMap["name"] = model.Name + } + if model.Description != nil { + modelMap["description"] = model.Description + } + return modelMap, nil +} + +func dataSourceIbmProjectProjectDefinitionPropertiesToMap(model *projectv1.ProjectDefinitionProperties) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + if model.Description != nil { + modelMap["description"] = model.Description + } + modelMap["destroy_on_delete"] = model.DestroyOnDelete + return modelMap, nil +} diff --git a/ibm/service/project/data_source_ibm_project_config.go b/ibm/service/project/data_source_ibm_project_config.go new file mode 100644 index 0000000000..e064294568 --- /dev/null +++ b/ibm/service/project/data_source_ibm_project_config.go @@ -0,0 +1,494 @@ +// Copyright IBM Corp. 2023 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package project + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/IBM/project-go-sdk/projectv1" +) + +func DataSourceIbmProjectConfig() *schema.Resource { + return &schema.Resource{ + ReadContext: dataSourceIbmProjectConfigRead, + + Schema: map[string]*schema.Schema{ + "project_id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The unique project ID.", + }, + "project_config_id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The unique config ID.", + }, + "version": &schema.Schema{ + Type: schema.TypeInt, + Computed: true, + Description: "The version of the configuration.", + }, + "is_draft": &schema.Schema{ + Type: schema.TypeBool, + Computed: true, + Description: "The flag that indicates whether the version of the configuration is draft, or active.", + }, + "needs_attention_state": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The needs attention state of a configuration.", + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "created_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "modified_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "last_saved_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "outputs": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The outputs of a Schematics template property.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The variable name.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A short explanation of the output value.", + }, + "value": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "Can be any value - a string, number, boolean, array, or object.", + }, + }, + }, + }, + "project": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The project referenced by this resource.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The unique ID.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The definition of the project reference.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The name of the project.", + }, + }, + }, + }, + "crn": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "An IBM Cloud resource name, which uniquely identifies a resource.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A URL.", + }, + }, + }, + }, + "schematics": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "A schematics workspace associated to a project configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "workspace_crn": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "An existing schematics workspace CRN.", + }, + }, + }, + }, + "state": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The state of the configuration.", + }, + "update_available": &schema.Schema{ + Type: schema.TypeBool, + Computed: true, + Description: "The flag that indicates whether a configuration update is available.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The type and output of a project configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The configuration name.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A project configuration description.", + }, + "environment": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The ID of the project environment.", + }, + "authorizations": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The authorization details. You can authorize by using a trusted profile or an API key in Secrets Manager.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "trusted_profile_id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The trusted profile ID.", + }, + "method": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The authorization method. You can authorize by using a trusted profile or an API key in Secrets Manager.", + }, + "api_key": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The IBM Cloud API Key.", + }, + }, + }, + }, + "compliance_profile": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The profile required for compliance.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The unique ID.", + }, + "instance_id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The unique ID.", + }, + "instance_location": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The location of the compliance instance.", + }, + "attachment_id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The unique ID.", + }, + "profile_name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The name of the compliance profile.", + }, + }, + }, + }, + "locator_id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A dotted value of catalogID.versionID.", + }, + "inputs": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The input variables for configuration definition and environment.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{}, + }, + }, + "settings": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "Schematics environment variables to use to deploy the configuration.Settings are only available if they were specified when the configuration was initially created.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{}, + }, + }, + "type": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The type of a project configuration manual property.", + }, + }, + }, + }, + }, + } +} + +func dataSourceIbmProjectConfigRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + getConfigOptions := &projectv1.GetConfigOptions{} + + getConfigOptions.SetProjectID(d.Get("project_id").(string)) + getConfigOptions.SetID(d.Get("project_config_id").(string)) + + projectConfig, response, err := projectClient.GetConfigWithContext(context, getConfigOptions) + if err != nil { + log.Printf("[DEBUG] GetConfigWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("GetConfigWithContext failed %s\n%s", err, response)) + } + + d.SetId(fmt.Sprintf("%s/%s", *getConfigOptions.ProjectID, *getConfigOptions.ID)) + + if err = d.Set("version", flex.IntValue(projectConfig.Version)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting version: %s", err)) + } + + if err = d.Set("is_draft", projectConfig.IsDraft); err != nil { + return diag.FromErr(fmt.Errorf("Error setting is_draft: %s", err)) + } + + if err = d.Set("needs_attention_state", projectConfig.NeedsAttentionState); err != nil { + return diag.FromErr(fmt.Errorf("Error setting needs_attention_state: %s", err)) + } + + if err = d.Set("created_at", flex.DateTimeToString(projectConfig.CreatedAt)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting created_at: %s", err)) + } + + if err = d.Set("modified_at", flex.DateTimeToString(projectConfig.ModifiedAt)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting modified_at: %s", err)) + } + + if err = d.Set("last_saved_at", flex.DateTimeToString(projectConfig.LastSavedAt)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting last_saved_at: %s", err)) + } + + outputs := []map[string]interface{}{} + if projectConfig.Outputs != nil { + for _, modelItem := range projectConfig.Outputs { + modelMap, err := dataSourceIbmProjectConfigOutputValueToMap(&modelItem) + if err != nil { + return diag.FromErr(err) + } + outputs = append(outputs, modelMap) + } + } + if err = d.Set("outputs", outputs); err != nil { + return diag.FromErr(fmt.Errorf("Error setting outputs %s", err)) + } + + project := []map[string]interface{}{} + if projectConfig.Project != nil { + modelMap, err := dataSourceIbmProjectConfigProjectReferenceToMap(projectConfig.Project) + if err != nil { + return diag.FromErr(err) + } + project = append(project, modelMap) + } + if err = d.Set("project", project); err != nil { + return diag.FromErr(fmt.Errorf("Error setting project %s", err)) + } + + schematics := []map[string]interface{}{} + if projectConfig.Schematics != nil { + modelMap, err := dataSourceIbmProjectConfigSchematicsWorkspaceToMap(projectConfig.Schematics) + if err != nil { + return diag.FromErr(err) + } + schematics = append(schematics, modelMap) + } + if err = d.Set("schematics", schematics); err != nil { + return diag.FromErr(fmt.Errorf("Error setting schematics %s", err)) + } + + if err = d.Set("state", projectConfig.State); err != nil { + return diag.FromErr(fmt.Errorf("Error setting state: %s", err)) + } + + if err = d.Set("update_available", projectConfig.UpdateAvailable); err != nil { + return diag.FromErr(fmt.Errorf("Error setting update_available: %s", err)) + } + + definition := []map[string]interface{}{} + if projectConfig.Definition != nil { + modelMap, err := dataSourceIbmProjectConfigProjectConfigResponseDefinitionToMap(projectConfig.Definition) + if err != nil { + return diag.FromErr(err) + } + definition = append(definition, modelMap) + } + if err = d.Set("definition", definition); err != nil { + return diag.FromErr(fmt.Errorf("Error setting definition %s", err)) + } + + return nil +} + +func dataSourceIbmProjectConfigOutputValueToMap(model *projectv1.OutputValue) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + if model.Description != nil { + modelMap["description"] = model.Description + } + if model.Value != nil { + modelMap["value"] = model.Value + } + return modelMap, nil +} + +func dataSourceIbmProjectConfigProjectReferenceToMap(model *projectv1.ProjectReference) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["id"] = model.ID + definitionMap, err := dataSourceIbmProjectConfigProjectDefinitionReferenceToMap(model.Definition) + if err != nil { + return modelMap, err + } + modelMap["definition"] = []map[string]interface{}{definitionMap} + modelMap["crn"] = model.Crn + modelMap["href"] = model.Href + return modelMap, nil +} + +func dataSourceIbmProjectConfigProjectDefinitionReferenceToMap(model *projectv1.ProjectDefinitionReference) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + return modelMap, nil +} + +func dataSourceIbmProjectConfigSchematicsWorkspaceToMap(model *projectv1.SchematicsWorkspace) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.WorkspaceCrn != nil { + modelMap["workspace_crn"] = model.WorkspaceCrn + } + return modelMap, nil +} + +func dataSourceIbmProjectConfigProjectConfigResponseDefinitionToMap(model *projectv1.ProjectConfigResponseDefinition) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + if model.Description != nil { + modelMap["description"] = model.Description + } + if model.Environment != nil { + modelMap["environment"] = model.Environment + } + if model.Authorizations != nil { + authorizationsMap, err := dataSourceIbmProjectConfigProjectConfigAuthToMap(model.Authorizations) + if err != nil { + return modelMap, err + } + modelMap["authorizations"] = []map[string]interface{}{authorizationsMap} + } + if model.ComplianceProfile != nil { + complianceProfileMap, err := dataSourceIbmProjectConfigProjectComplianceProfileToMap(model.ComplianceProfile) + if err != nil { + return modelMap, err + } + modelMap["compliance_profile"] = []map[string]interface{}{complianceProfileMap} + } + modelMap["locator_id"] = model.LocatorID + if model.Inputs != nil { + inputsMap, err := dataSourceIbmProjectConfigInputVariableToMap(model.Inputs) + if err != nil { + return modelMap, err + } + modelMap["inputs"] = []map[string]interface{}{inputsMap} + } + if model.Settings != nil { + settingsMap, err := dataSourceIbmProjectConfigProjectConfigSettingToMap(model.Settings) + if err != nil { + return modelMap, err + } + modelMap["settings"] = []map[string]interface{}{settingsMap} + } + if model.Type != nil { + modelMap["type"] = model.Type + } + return modelMap, nil +} + +func dataSourceIbmProjectConfigProjectConfigAuthToMap(model *projectv1.ProjectConfigAuth) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.TrustedProfileID != nil { + modelMap["trusted_profile_id"] = model.TrustedProfileID + } + if model.Method != nil { + modelMap["method"] = model.Method + } + if model.ApiKey != nil { + modelMap["api_key"] = model.ApiKey + } + return modelMap, nil +} + +func dataSourceIbmProjectConfigProjectComplianceProfileToMap(model *projectv1.ProjectComplianceProfile) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.ID != nil { + modelMap["id"] = model.ID + } + if model.InstanceID != nil { + modelMap["instance_id"] = model.InstanceID + } + if model.InstanceLocation != nil { + modelMap["instance_location"] = model.InstanceLocation + } + if model.AttachmentID != nil { + modelMap["attachment_id"] = model.AttachmentID + } + if model.ProfileName != nil { + modelMap["profile_name"] = model.ProfileName + } + return modelMap, nil +} + +func dataSourceIbmProjectConfigInputVariableToMap(model *projectv1.InputVariable) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + return modelMap, nil +} + +func dataSourceIbmProjectConfigProjectConfigSettingToMap(model *projectv1.ProjectConfigSetting) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + return modelMap, nil +} diff --git a/ibm/service/project/data_source_ibm_project_config_test.go b/ibm/service/project/data_source_ibm_project_config_test.go new file mode 100644 index 0000000000..785e6ff684 --- /dev/null +++ b/ibm/service/project/data_source_ibm_project_config_test.go @@ -0,0 +1,74 @@ +// Copyright IBM Corp. 2023 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package project_test + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" +) + +func TestAccIbmProjectConfigDataSourceBasic(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckIbmProjectConfigDataSourceConfigBasic(), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "id"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "project_id"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "project_config_id"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "version"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "is_draft"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "created_at"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "modified_at"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "project.#"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "state"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "update_available"), + resource.TestCheckResourceAttrSet("data.ibm_project_config.project_config_instance", "definition.#"), + ), + }, + }, + }) +} + +func testAccCheckIbmProjectConfigDataSourceConfigBasic() string { + return fmt.Sprintf(` + resource "ibm_project" "project_instance" { + location = "us-south" + resource_group = "Default" + definition { + name = "acme-microservice" + description = "acme-microservice description" + destroy_on_delete = true + } + } + + resource "ibm_project_config" "project_config_instance" { + project_id = ibm_project.project_instance.id + definition { + name = "stage-environment" + authorizations { + method = "api_key" + api_key = "%s" + } + locator_id = "1082e7d2-5e2f-0a11-a3bc-f88a8e1931fc.cd596f95-95a2-4f21-9b84-477f21fd1e95-global" + } + lifecycle { + ignore_changes = [ + definition[0].authorizations[0].api_key, + ] + } + } + + data "ibm_project_config" "project_config_instance" { + project_id = ibm_project_config.project_config_instance.project_id + project_config_id = ibm_project_config.project_config_instance.project_config_id + } + `, acc.ProjectsConfigApiKey) +} diff --git a/ibm/service/project/data_source_ibm_project_event_notification.go b/ibm/service/project/data_source_ibm_project_event_notification.go deleted file mode 100644 index 7ffac8fd48..0000000000 --- a/ibm/service/project/data_source_ibm_project_event_notification.go +++ /dev/null @@ -1,444 +0,0 @@ -// Copyright IBM Corp. 2023 All Rights Reserved. -// Licensed under the Mozilla Public License v2.0 - -package project - -import ( - "context" - "fmt" - "log" - - "github.com/hashicorp/terraform-plugin-sdk/v2/diag" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - - "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" - "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" - "github.com/IBM/project-go-sdk/projectv1" -) - -func DataSourceIbmProjectEventNotification() *schema.Resource { - return &schema.Resource{ - ReadContext: dataSourceIbmProjectEventNotificationRead, - - Schema: map[string]*schema.Schema{ - "project_id": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "The unique project ID.", - }, - "name": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The project name.", - }, - "description": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "A project descriptive text.", - }, - "crn": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "An IBM Cloud resource name, which uniquely identifies a resource.", - }, - "configs": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "The project configurations.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "id": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration.", - }, - "name": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The configuration name.", - }, - "labels": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "A collection of configuration labels.", - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - "description": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The project configuration description.", - }, - "locator_id": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "A dotted value of catalogID.versionID.", - }, - "type": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The type of a project configuration manual property.", - }, - "input": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "The outputs of a Schematics template property.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The variable name.", - }, - "type": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The variable type.", - }, - "value": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "Can be any value - a string, number, boolean, array, or object.", - }, - "required": &schema.Schema{ - Type: schema.TypeBool, - Computed: true, - Description: "Whether the variable is required or not.", - }, - }, - }, - }, - "output": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "The outputs of a Schematics template property.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The variable name.", - }, - "description": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "A short explanation of the output value.", - }, - "value": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "Can be any value - a string, number, boolean, array, or object.", - }, - }, - }, - }, - "setting": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "Schematics environment variables to use to deploy the configuration.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The name of the configuration setting.", - }, - "value": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The value of the configuration setting.", - }, - }, - }, - }, - }, - }, - }, - "metadata": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "The metadata of the project.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "crn": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "An IBM Cloud resource name, which uniquely identifies a resource.", - }, - "created_at": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", - }, - "cumulative_needs_attention_view": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "The cumulative list of needs attention items for a project.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "event": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The event name.", - }, - "event_id": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The unique ID of a project.", - }, - "config_id": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The unique ID of a project.", - }, - "config_version": &schema.Schema{ - Type: schema.TypeInt, - Computed: true, - Description: "The version number of the configuration.", - }, - }, - }, - }, - "cumulative_needs_attention_view_err": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "True indicates that the fetch of the needs attention items failed.", - }, - "location": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The IBM Cloud location where a resource is deployed.", - }, - "resource_group": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The resource group where the project's data and tools are created.", - }, - "state": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The project status value.", - }, - "event_notifications_crn": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The CRN of the event notifications instance if one is connected to this project.", - }, - }, - }, - }, - }, - } -} - -func dataSourceIbmProjectEventNotificationRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - projectClient, err := meta.(conns.ClientSession).ProjectV1() - if err != nil { - return diag.FromErr(err) - } - - getProjectOptions := &projectv1.GetProjectOptions{} - - getProjectOptions.SetID(d.Get("project_id").(string)) - - project, response, err := projectClient.GetProjectWithContext(context, getProjectOptions) - if err != nil { - log.Printf("[DEBUG] GetProjectWithContext failed %s\n%s", err, response) - return diag.FromErr(fmt.Errorf("GetProjectWithContext failed %s\n%s", err, response)) - } - - d.SetId(fmt.Sprintf("%s", *getProjectOptions.ID)) - - if err = d.Set("name", project.Name); err != nil { - return diag.FromErr(fmt.Errorf("Error setting name: %s", err)) - } - - if err = d.Set("description", project.Description); err != nil { - return diag.FromErr(fmt.Errorf("Error setting description: %s", err)) - } - - if err = d.Set("crn", project.Crn); err != nil { - return diag.FromErr(fmt.Errorf("Error setting crn: %s", err)) - } - - configs := []map[string]interface{}{} - if project.Configs != nil { - for _, modelItem := range project.Configs { - modelMap, err := dataSourceIbmProjectEventNotificationProjectConfigToMap(&modelItem) - if err != nil { - return diag.FromErr(err) - } - configs = append(configs, modelMap) - } - } - if err = d.Set("configs", configs); err != nil { - return diag.FromErr(fmt.Errorf("Error setting configs %s", err)) - } - - metadata := []map[string]interface{}{} - if project.Metadata != nil { - modelMap, err := dataSourceIbmProjectEventNotificationProjectMetadataToMap(project.Metadata) - if err != nil { - return diag.FromErr(err) - } - metadata = append(metadata, modelMap) - } - if err = d.Set("metadata", metadata); err != nil { - return diag.FromErr(fmt.Errorf("Error setting metadata %s", err)) - } - - return nil -} - -func dataSourceIbmProjectEventNotificationProjectConfigToMap(model *projectv1.ProjectConfig) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.ID != nil { - modelMap["project_id"] = model.ID - } - if model.Name != nil { - modelMap["name"] = model.Name - } - if model.Labels != nil { - modelMap["labels"] = model.Labels - } - if model.Description != nil { - modelMap["description"] = model.Description - } - if model.LocatorID != nil { - modelMap["locator_id"] = model.LocatorID - } - if model.Type != nil { - modelMap["type"] = model.Type - } - if model.Input != nil { - input := []map[string]interface{}{} - for _, inputItem := range model.Input { - inputItemMap, err := dataSourceIbmProjectEventNotificationInputVariableToMap(&inputItem) - if err != nil { - return modelMap, err - } - input = append(input, inputItemMap) - } - modelMap["input"] = input - } - if model.Output != nil { - output := []map[string]interface{}{} - for _, outputItem := range model.Output { - outputItemMap, err := dataSourceIbmProjectEventNotificationOutputValueToMap(&outputItem) - if err != nil { - return modelMap, err - } - output = append(output, outputItemMap) - } - modelMap["output"] = output - } - if model.Setting != nil { - setting := []map[string]interface{}{} - for _, settingItem := range model.Setting { - settingItemMap, err := dataSourceIbmProjectEventNotificationProjectConfigSettingCollectionToMap(&settingItem) - if err != nil { - return modelMap, err - } - setting = append(setting, settingItemMap) - } - modelMap["setting"] = setting - } - return modelMap, nil -} - -func dataSourceIbmProjectEventNotificationInputVariableToMap(model *projectv1.InputVariable) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.Name != nil { - modelMap["name"] = model.Name - } - if model.Type != nil { - modelMap["type"] = model.Type - } - if model.Value != nil { - modelMap["value"] = model.Value - } - if model.Required != nil { - modelMap["required"] = model.Required - } - return modelMap, nil -} - -func dataSourceIbmProjectEventNotificationOutputValueToMap(model *projectv1.OutputValue) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.Name != nil { - modelMap["name"] = model.Name - } - if model.Description != nil { - modelMap["description"] = model.Description - } - if model.Value != nil { - modelMap["value"] = model.Value - } - return modelMap, nil -} - -func dataSourceIbmProjectEventNotificationProjectConfigSettingCollectionToMap(model *projectv1.ProjectConfigSettingCollection) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.Name != nil { - modelMap["name"] = model.Name - } - if model.Value != nil { - modelMap["value"] = model.Value - } - return modelMap, nil -} - -func dataSourceIbmProjectEventNotificationProjectMetadataToMap(model *projectv1.ProjectMetadata) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.Crn != nil { - modelMap["crn"] = model.Crn - } - if model.CreatedAt != nil { - modelMap["created_at"] = model.CreatedAt.String() - } - if model.CumulativeNeedsAttentionView != nil { - cumulativeNeedsAttentionView := []map[string]interface{}{} - for _, cumulativeNeedsAttentionViewItem := range model.CumulativeNeedsAttentionView { - cumulativeNeedsAttentionViewItemMap, err := dataSourceIbmProjectEventNotificationCumulativeNeedsAttentionToMap(&cumulativeNeedsAttentionViewItem) - if err != nil { - return modelMap, err - } - cumulativeNeedsAttentionView = append(cumulativeNeedsAttentionView, cumulativeNeedsAttentionViewItemMap) - } - modelMap["cumulative_needs_attention_view"] = cumulativeNeedsAttentionView - } - if model.CumulativeNeedsAttentionViewErr != nil { - modelMap["cumulative_needs_attention_view_err"] = model.CumulativeNeedsAttentionViewErr - } - if model.Location != nil { - modelMap["location"] = model.Location - } - if model.ResourceGroup != nil { - modelMap["resource_group"] = model.ResourceGroup - } - if model.State != nil { - modelMap["state"] = model.State - } - if model.EventNotificationsCrn != nil { - modelMap["event_notifications_crn"] = model.EventNotificationsCrn - } - return modelMap, nil -} - -func dataSourceIbmProjectEventNotificationCumulativeNeedsAttentionToMap(model *projectv1.CumulativeNeedsAttention) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.Event != nil { - modelMap["event"] = model.Event - } - if model.EventID != nil { - modelMap["event_id"] = model.EventID - } - if model.ConfigID != nil { - modelMap["config_id"] = model.ConfigID - } - if model.ConfigVersion != nil { - modelMap["config_version"] = flex.IntValue(model.ConfigVersion) - } - return modelMap, nil -} diff --git a/ibm/service/project/data_source_ibm_project_event_notification_test.go b/ibm/service/project/data_source_ibm_project_event_notification_test.go deleted file mode 100644 index a4bb083448..0000000000 --- a/ibm/service/project/data_source_ibm_project_event_notification_test.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright IBM Corp. 2023 All Rights Reserved. -// Licensed under the Mozilla Public License v2.0 - -package project_test - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - - acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" -) - -func TestAccIbmProjectEventNotificationDataSourceBasic(t *testing.T) { - projectName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) - projectResourceGroup := fmt.Sprintf("Default") - projectLocation := fmt.Sprintf("us-south") - - resource.Test(t, resource.TestCase{ - PreCheck: func() { acc.TestAccPreCheck(t) }, - Providers: acc.TestAccProviders, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccCheckIbmProjectEventNotificationDataSourceConfigBasic(projectResourceGroup, projectLocation, projectName), - Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttrSet("data.ibm_project_event_notification.project_event_notification", "project_id"), - resource.TestCheckResourceAttrSet("data.ibm_project_event_notification.project_event_notification", "name"), - ), - }, - }, - }) -} - -func TestAccIbmProjectEventNotificationDataSourceAllArgs(t *testing.T) { - projectName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) - projectDescription := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) - projectResourceGroup := fmt.Sprintf("Default") - projectLocation := fmt.Sprintf("us-south") - - resource.Test(t, resource.TestCase{ - PreCheck: func() { acc.TestAccPreCheck(t) }, - Providers: acc.TestAccProviders, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccCheckIbmProjectEventNotificationDataSourceConfig(projectName, projectDescription, projectResourceGroup, projectLocation), - Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttrSet("data.ibm_project_event_notification.project_event_notification", "project_id"), - resource.TestCheckResourceAttrSet("data.ibm_project_event_notification.project_event_notification", "name"), - resource.TestCheckResourceAttrSet("data.ibm_project_event_notification.project_event_notification", "description"), - resource.TestCheckResourceAttrSet("data.ibm_project_event_notification.project_event_notification", "metadata.#"), - ), - }, - }, - }) -} - -func testAccCheckIbmProjectEventNotificationDataSourceConfigBasic(projectResourceGroup string, projectLocation string, projectName string) string { - return fmt.Sprintf(` - resource "ibm_project_instance" "project_instance" { - resource_group = "%s" - location = "%s" - name = "%s" - } - - data "ibm_project_event_notification" "project_event_notification" { - project_id = ibm_project_instance.project_instance.id - } - `, projectResourceGroup, projectLocation, projectName) -} - -func testAccCheckIbmProjectEventNotificationDataSourceConfig(projectName string, projectDescription string, projectResourceGroup string, projectLocation string) string { - return fmt.Sprintf(` - resource "ibm_project_instance" "project_instance" { - name = "%s" - description = "%s" - configs { - name = "name" - labels = [ "labels" ] - description = "description" - locator_id = "1082e7d2-5e2f-0a11-a3bc-f88a8e1931fc.cd596f95-95a2-4f21-9b84-477f21fd1e95-global" - input { - name = "name" - } - setting { - name = "name" - value = "value" - } - } - resource_group = "%s" - location = "%s" - } - - data "ibm_project_event_notification" "project_event_notification" { - project_id = ibm_project_instance.project_instance.id - } - `, projectName, projectDescription, projectResourceGroup, projectLocation) -} diff --git a/ibm/service/project/data_source_ibm_project_test.go b/ibm/service/project/data_source_ibm_project_test.go new file mode 100644 index 0000000000..062bc5fefe --- /dev/null +++ b/ibm/service/project/data_source_ibm_project_test.go @@ -0,0 +1,56 @@ +// Copyright IBM Corp. 2023 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package project_test + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" +) + +func TestAccIbmProjectDataSourceBasic(t *testing.T) { + projectLocation := fmt.Sprintf("us-south") + projectResourceGroup := fmt.Sprintf("Default") + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckIbmProjectDataSourceConfigBasic(projectLocation, projectResourceGroup), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("data.ibm_project.project_instance", "id"), + resource.TestCheckResourceAttrSet("data.ibm_project.project_instance", "project_id"), + resource.TestCheckResourceAttrSet("data.ibm_project.project_instance", "crn"), + resource.TestCheckResourceAttrSet("data.ibm_project.project_instance", "created_at"), + resource.TestCheckResourceAttrSet("data.ibm_project.project_instance", "location"), + resource.TestCheckResourceAttrSet("data.ibm_project.project_instance", "resource_group"), + resource.TestCheckResourceAttrSet("data.ibm_project.project_instance", "state"), + resource.TestCheckResourceAttrSet("data.ibm_project.project_instance", "definition.#"), + ), + }, + }, + }) +} + +func testAccCheckIbmProjectDataSourceConfigBasic(projectLocation string, projectResourceGroup string) string { + return fmt.Sprintf(` + resource "ibm_project" "project_instance" { + location = "%s" + resource_group = "%s" + definition { + name = "acme-microservice" + description = "acme-microservice description" + destroy_on_delete = true + } + } + + data "ibm_project" "project_instance" { + project_id = ibm_project.project_instance.id + } + `, projectLocation, projectResourceGroup) +} diff --git a/ibm/service/project/resource_ibm_project.go b/ibm/service/project/resource_ibm_project.go new file mode 100644 index 0000000000..9b5242752d --- /dev/null +++ b/ibm/service/project/resource_ibm_project.go @@ -0,0 +1,787 @@ +// Copyright IBM Corp. 2023 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package project + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/validate" + "github.com/IBM/go-sdk-core/v5/core" + "github.com/IBM/project-go-sdk/projectv1" +) + +func ResourceIbmProject() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIbmProjectCreate, + ReadContext: resourceIbmProjectRead, + UpdateContext: resourceIbmProjectUpdate, + DeleteContext: resourceIbmProjectDelete, + Importer: &schema.ResourceImporter{}, + + Schema: map[string]*schema.Schema{ + "location": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.InvokeValidator("ibm_project", "location"), + Description: "The IBM Cloud location where a resource is deployed.", + }, + "resource_group": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "The resource group where the project's data and tools are created.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The definition of the project.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The name of the project.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "A brief explanation of the project's use in the configuration of a deployable architecture. It is possible to create a project without providing a description.", + }, + "destroy_on_delete": &schema.Schema{ + Type: schema.TypeBool, + Required: true, + Description: "The policy that indicates whether the resources are destroyed or not when a project is deleted.", + }, + }, + }, + }, + "crn": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "An IBM Cloud resource name, which uniquely identifies a resource.", + }, + "created_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "cumulative_needs_attention_view": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The cumulative list of needs attention items for a project. If the view is successfully retrieved, an array which could be empty is returned.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "event": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The event name.", + }, + "event_id": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "A unique ID for that individual event.", + }, + "config_id": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "A unique ID for the configuration.", + }, + "config_version": &schema.Schema{ + Type: schema.TypeInt, + Optional: true, + Description: "The version number of the configuration.", + }, + }, + }, + }, + "cumulative_needs_attention_view_error": &schema.Schema{ + Type: schema.TypeBool, + Computed: true, + Description: "True indicates that the fetch of the needs attention items failed. It only exists if there was an error while retrieving the cumulative needs attention view.", + }, + "state": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The project status value.", + }, + "event_notifications_crn": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The CRN of the event notifications instance if one is connected to this project.", + }, + "configs": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The project configurations. These configurations are only included in the response of creating a project if a configs array is specified in the request payload.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration.", + }, + "version": &schema.Schema{ + Type: schema.TypeInt, + Required: true, + Description: "The version of the configuration.", + }, + "state": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The state of the configuration.", + }, + "created_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "modified_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "A URL.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The name and description of a project configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The configuration name.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "A project configuration description.", + }, + }, + }, + }, + "project": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The project referenced by this resource.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The unique ID.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The definition of the project reference.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The name of the project.", + }, + }, + }, + }, + "crn": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "An IBM Cloud resource name, which uniquely identifies a resource.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "A URL.", + }, + }, + }, + }, + }, + }, + }, + "environments": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The project environments. These environments are only included in the response if project environments were created on the project.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The environment id as a friendly name.", + }, + "project": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The project referenced by this resource.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The unique ID.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The definition of the project reference.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The name of the project.", + }, + }, + }, + }, + "crn": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "An IBM Cloud resource name, which uniquely identifies a resource.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "A URL.", + }, + }, + }, + }, + "created_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "A URL.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The environment definition used in the project collection.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The name of the environment.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The description of the environment.", + }, + }, + }, + }, + }, + }, + }, + }, + } +} + +func ResourceIbmProjectValidator() *validate.ResourceValidator { + validateSchema := make([]validate.ValidateSchema, 0) + validateSchema = append(validateSchema, + validate.ValidateSchema{ + Identifier: "location", + ValidateFunctionIdentifier: validate.ValidateRegexpLen, + Type: validate.TypeString, + Required: true, + Regexp: `^$|^(us-south|us-east|eu-gb|eu-de)$`, + MinValueLength: 0, + MaxValueLength: 12, + }, + validate.ValidateSchema{ + Identifier: "resource_group", + ValidateFunctionIdentifier: validate.ValidateRegexpLen, + Type: validate.TypeString, + Required: true, + Regexp: `^(?!\s)(?!.*\s$)[^'"` + "`" + `<>{}\x00-\x1F]*$`, + MinValueLength: 0, + MaxValueLength: 64, + }, + ) + + resourceValidator := validate.ResourceValidator{ResourceName: "ibm_project", Schema: validateSchema} + return &resourceValidator +} + +func resourceIbmProjectCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + createProjectOptions := &projectv1.CreateProjectOptions{} + + definitionModel, err := resourceIbmProjectMapToProjectPrototypeDefinition(d.Get("definition.0").(map[string]interface{})) + if err != nil { + return diag.FromErr(err) + } + createProjectOptions.SetDefinition(definitionModel) + createProjectOptions.SetLocation(d.Get("location").(string)) + createProjectOptions.SetResourceGroup(d.Get("resource_group").(string)) + + project, response, err := projectClient.CreateProjectWithContext(context, createProjectOptions) + if err != nil { + log.Printf("[DEBUG] CreateProjectWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("CreateProjectWithContext failed %s\n%s", err, response)) + } + + d.SetId(*project.ID) + + return resourceIbmProjectRead(context, d, meta) +} + +func resourceIbmProjectRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + getProjectOptions := &projectv1.GetProjectOptions{} + + getProjectOptions.SetID(d.Id()) + + project, response, err := projectClient.GetProjectWithContext(context, getProjectOptions) + if err != nil { + if response != nil && response.StatusCode == 404 { + d.SetId("") + return nil + } + log.Printf("[DEBUG] GetProjectWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("GetProjectWithContext failed %s\n%s", err, response)) + } + + if err = d.Set("location", project.Location); err != nil { + return diag.FromErr(fmt.Errorf("Error setting location: %s", err)) + } + if err = d.Set("resource_group", project.ResourceGroup); err != nil { + return diag.FromErr(fmt.Errorf("Error setting resource_group: %s", err)) + } + definitionMap, err := resourceIbmProjectProjectDefinitionPropertiesToMap(project.Definition) + if err != nil { + return diag.FromErr(err) + } + if err = d.Set("definition", []map[string]interface{}{definitionMap}); err != nil { + return diag.FromErr(fmt.Errorf("Error setting definition: %s", err)) + } + if err = d.Set("crn", project.Crn); err != nil { + return diag.FromErr(fmt.Errorf("Error setting crn: %s", err)) + } + if err = d.Set("created_at", flex.DateTimeToString(project.CreatedAt)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting created_at: %s", err)) + } + if !core.IsNil(project.CumulativeNeedsAttentionView) { + cumulativeNeedsAttentionView := []map[string]interface{}{} + for _, cumulativeNeedsAttentionViewItem := range project.CumulativeNeedsAttentionView { + cumulativeNeedsAttentionViewItemMap, err := resourceIbmProjectCumulativeNeedsAttentionToMap(&cumulativeNeedsAttentionViewItem) + if err != nil { + return diag.FromErr(err) + } + cumulativeNeedsAttentionView = append(cumulativeNeedsAttentionView, cumulativeNeedsAttentionViewItemMap) + } + if err = d.Set("cumulative_needs_attention_view", cumulativeNeedsAttentionView); err != nil { + return diag.FromErr(fmt.Errorf("Error setting cumulative_needs_attention_view: %s", err)) + } + } + if !core.IsNil(project.CumulativeNeedsAttentionViewError) { + if err = d.Set("cumulative_needs_attention_view_error", project.CumulativeNeedsAttentionViewError); err != nil { + return diag.FromErr(fmt.Errorf("Error setting cumulative_needs_attention_view_error: %s", err)) + } + } + if err = d.Set("state", project.State); err != nil { + return diag.FromErr(fmt.Errorf("Error setting state: %s", err)) + } + if !core.IsNil(project.EventNotificationsCrn) { + if err = d.Set("event_notifications_crn", project.EventNotificationsCrn); err != nil { + return diag.FromErr(fmt.Errorf("Error setting event_notifications_crn: %s", err)) + } + } + if !core.IsNil(project.Configs) { + configs := []map[string]interface{}{} + for _, configsItem := range project.Configs { + configsItemMap, err := resourceIbmProjectProjectConfigCollectionMemberToMap(&configsItem) + if err != nil { + return diag.FromErr(err) + } + configs = append(configs, configsItemMap) + } + if err = d.Set("configs", configs); err != nil { + return diag.FromErr(fmt.Errorf("Error setting configs: %s", err)) + } + } + if !core.IsNil(project.Environments) { + environments := []map[string]interface{}{} + for _, environmentsItem := range project.Environments { + environmentsItemMap, err := resourceIbmProjectProjectEnvironmentCollectionMemberToMap(&environmentsItem) + if err != nil { + return diag.FromErr(err) + } + environments = append(environments, environmentsItemMap) + } + if err = d.Set("environments", environments); err != nil { + return diag.FromErr(fmt.Errorf("Error setting environments: %s", err)) + } + } + + return nil +} + +func resourceIbmProjectUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + updateProjectOptions := &projectv1.UpdateProjectOptions{} + + updateProjectOptions.SetID(d.Id()) + + hasChange := false + + if d.HasChange("definition") { + definition, err := resourceIbmProjectMapToProjectPrototypePatchDefinitionBlock(d.Get("definition.0").(map[string]interface{})) + if err != nil { + return diag.FromErr(err) + } + updateProjectOptions.SetDefinition(definition) + hasChange = true + } + + if hasChange { + _, response, err := projectClient.UpdateProjectWithContext(context, updateProjectOptions) + if err != nil { + log.Printf("[DEBUG] UpdateProjectWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("UpdateProjectWithContext failed %s\n%s", err, response)) + } + } + + return resourceIbmProjectRead(context, d, meta) +} + +func resourceIbmProjectDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + deleteProjectOptions := &projectv1.DeleteProjectOptions{} + + deleteProjectOptions.SetID(d.Id()) + + response, err := projectClient.DeleteProjectWithContext(context, deleteProjectOptions) + if err != nil { + log.Printf("[DEBUG] DeleteProjectWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("DeleteProjectWithContext failed %s\n%s", err, response)) + } + + d.SetId("") + + return nil +} + +func resourceIbmProjectMapToProjectPrototypeDefinition(modelMap map[string]interface{}) (*projectv1.ProjectPrototypeDefinition, error) { + model := &projectv1.ProjectPrototypeDefinition{} + model.Name = core.StringPtr(modelMap["name"].(string)) + if modelMap["description"] != nil && modelMap["description"].(string) != "" { + model.Description = core.StringPtr(modelMap["description"].(string)) + } + if modelMap["destroy_on_delete"] != nil { + model.DestroyOnDelete = core.BoolPtr(modelMap["destroy_on_delete"].(bool)) + } + return model, nil +} + +func resourceIbmProjectMapToProjectConfigPrototype(modelMap map[string]interface{}) (*projectv1.ProjectConfigPrototype, error) { + model := &projectv1.ProjectConfigPrototype{} + DefinitionModel, err := resourceIbmProjectMapToProjectConfigPrototypeDefinitionBlock(modelMap["definition"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Definition = DefinitionModel + if modelMap["schematics"] != nil && len(modelMap["schematics"].([]interface{})) > 0 { + SchematicsModel, err := resourceIbmProjectMapToSchematicsWorkspace(modelMap["schematics"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Schematics = SchematicsModel + } + return model, nil +} + +func resourceIbmProjectMapToProjectConfigPrototypeDefinitionBlock(modelMap map[string]interface{}) (*projectv1.ProjectConfigPrototypeDefinitionBlock, error) { + model := &projectv1.ProjectConfigPrototypeDefinitionBlock{} + model.Name = core.StringPtr(modelMap["name"].(string)) + if modelMap["description"] != nil && modelMap["description"].(string) != "" { + model.Description = core.StringPtr(modelMap["description"].(string)) + } + if modelMap["environment"] != nil && modelMap["environment"].(string) != "" { + model.Environment = core.StringPtr(modelMap["environment"].(string)) + } + if modelMap["authorizations"] != nil && len(modelMap["authorizations"].([]interface{})) > 0 { + AuthorizationsModel, err := resourceIbmProjectMapToProjectConfigAuth(modelMap["authorizations"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Authorizations = AuthorizationsModel + } + if modelMap["compliance_profile"] != nil && len(modelMap["compliance_profile"].([]interface{})) > 0 { + ComplianceProfileModel, err := resourceIbmProjectMapToProjectComplianceProfile(modelMap["compliance_profile"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.ComplianceProfile = ComplianceProfileModel + } + if modelMap["locator_id"] != nil && modelMap["locator_id"].(string) != "" { + model.LocatorID = core.StringPtr(modelMap["locator_id"].(string)) + } + if modelMap["inputs"] != nil && len(modelMap["inputs"].([]interface{})) > 0 { + InputsModel, err := resourceIbmProjectMapToInputVariable(modelMap["inputs"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Inputs = InputsModel + } + if modelMap["settings"] != nil && len(modelMap["settings"].([]interface{})) > 0 { + SettingsModel, err := resourceIbmProjectMapToProjectConfigSetting(modelMap["settings"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Settings = SettingsModel + } + return model, nil +} + +func resourceIbmProjectMapToProjectConfigAuth(modelMap map[string]interface{}) (*projectv1.ProjectConfigAuth, error) { + model := &projectv1.ProjectConfigAuth{} + if modelMap["trusted_profile_id"] != nil && modelMap["trusted_profile_id"].(string) != "" { + model.TrustedProfileID = core.StringPtr(modelMap["trusted_profile_id"].(string)) + } + if modelMap["method"] != nil && modelMap["method"].(string) != "" { + model.Method = core.StringPtr(modelMap["method"].(string)) + } + if modelMap["api_key"] != nil && modelMap["api_key"].(string) != "" { + model.ApiKey = core.StringPtr(modelMap["api_key"].(string)) + } + return model, nil +} + +func resourceIbmProjectMapToProjectComplianceProfile(modelMap map[string]interface{}) (*projectv1.ProjectComplianceProfile, error) { + model := &projectv1.ProjectComplianceProfile{} + if modelMap["id"] != nil && modelMap["id"].(string) != "" { + model.ID = core.StringPtr(modelMap["id"].(string)) + } + if modelMap["instance_id"] != nil && modelMap["instance_id"].(string) != "" { + model.InstanceID = core.StringPtr(modelMap["instance_id"].(string)) + } + if modelMap["instance_location"] != nil && modelMap["instance_location"].(string) != "" { + model.InstanceLocation = core.StringPtr(modelMap["instance_location"].(string)) + } + if modelMap["attachment_id"] != nil && modelMap["attachment_id"].(string) != "" { + model.AttachmentID = core.StringPtr(modelMap["attachment_id"].(string)) + } + if modelMap["profile_name"] != nil && modelMap["profile_name"].(string) != "" { + model.ProfileName = core.StringPtr(modelMap["profile_name"].(string)) + } + return model, nil +} + +func resourceIbmProjectMapToInputVariable(modelMap map[string]interface{}) (*projectv1.InputVariable, error) { + model := &projectv1.InputVariable{} + return model, nil +} + +func resourceIbmProjectMapToProjectConfigSetting(modelMap map[string]interface{}) (*projectv1.ProjectConfigSetting, error) { + model := &projectv1.ProjectConfigSetting{} + return model, nil +} + +func resourceIbmProjectMapToSchematicsWorkspace(modelMap map[string]interface{}) (*projectv1.SchematicsWorkspace, error) { + model := &projectv1.SchematicsWorkspace{} + if modelMap["workspace_crn"] != nil && modelMap["workspace_crn"].(string) != "" { + model.WorkspaceCrn = core.StringPtr(modelMap["workspace_crn"].(string)) + } + return model, nil +} + +func resourceIbmProjectMapToProjectPrototypePatchDefinitionBlock(modelMap map[string]interface{}) (*projectv1.ProjectPrototypePatchDefinitionBlock, error) { + model := &projectv1.ProjectPrototypePatchDefinitionBlock{} + if modelMap["name"] != nil && modelMap["name"].(string) != "" { + model.Name = core.StringPtr(modelMap["name"].(string)) + } + if modelMap["description"] != nil && modelMap["description"].(string) != "" { + model.Description = core.StringPtr(modelMap["description"].(string)) + } + if modelMap["destroy_on_delete"] != nil { + model.DestroyOnDelete = core.BoolPtr(modelMap["destroy_on_delete"].(bool)) + } + return model, nil +} + +func resourceIbmProjectProjectDefinitionPropertiesToMap(model *projectv1.ProjectDefinitionProperties) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + if model.Description != nil { + modelMap["description"] = model.Description + } + modelMap["destroy_on_delete"] = model.DestroyOnDelete + return modelMap, nil +} + +func resourceIbmProjectCumulativeNeedsAttentionToMap(model *projectv1.CumulativeNeedsAttention) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.Event != nil { + modelMap["event"] = model.Event + } + if model.EventID != nil { + modelMap["event_id"] = model.EventID + } + if model.ConfigID != nil { + modelMap["config_id"] = model.ConfigID + } + if model.ConfigVersion != nil { + modelMap["config_version"] = flex.IntValue(model.ConfigVersion) + } + return modelMap, nil +} + +func resourceIbmProjectProjectConfigCollectionMemberToMap(model *projectv1.ProjectConfigCollectionMember) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.ApprovedVersion != nil { + approvedVersionMap, err := resourceIbmProjectProjectConfigVersionSummaryToMap(model.ApprovedVersion) + if err != nil { + return modelMap, err + } + modelMap["approved_version"] = []map[string]interface{}{approvedVersionMap} + } + if model.DeployedVersion != nil { + deployedVersionMap, err := resourceIbmProjectProjectConfigVersionSummaryToMap(model.DeployedVersion) + if err != nil { + return modelMap, err + } + modelMap["deployed_version"] = []map[string]interface{}{deployedVersionMap} + } + modelMap["id"] = model.ID + modelMap["version"] = flex.IntValue(model.Version) + modelMap["state"] = model.State + if model.CreatedAt != nil { + modelMap["created_at"] = model.CreatedAt.String() + } + if model.ModifiedAt != nil { + modelMap["modified_at"] = model.ModifiedAt.String() + } + modelMap["href"] = model.Href + definitionMap, err := resourceIbmProjectProjectConfigDefinitionNameDescriptionToMap(model.Definition) + if err != nil { + return modelMap, err + } + modelMap["definition"] = []map[string]interface{}{definitionMap} + projectMap, err := resourceIbmProjectProjectReferenceToMap(model.Project) + if err != nil { + return modelMap, err + } + modelMap["project"] = []map[string]interface{}{projectMap} + return modelMap, nil +} + +func resourceIbmProjectProjectConfigVersionSummaryToMap(model *projectv1.ProjectConfigVersionSummary) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["state"] = model.State + modelMap["version"] = flex.IntValue(model.Version) + modelMap["href"] = model.Href + return modelMap, nil +} + +func resourceIbmProjectProjectConfigDefinitionNameDescriptionToMap(model *projectv1.ProjectConfigDefinitionNameDescription) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.Name != nil { + modelMap["name"] = model.Name + } + if model.Description != nil { + modelMap["description"] = model.Description + } + return modelMap, nil +} + +func resourceIbmProjectProjectReferenceToMap(model *projectv1.ProjectReference) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["id"] = model.ID + definitionMap, err := resourceIbmProjectProjectDefinitionReferenceToMap(model.Definition) + if err != nil { + return modelMap, err + } + modelMap["definition"] = []map[string]interface{}{definitionMap} + modelMap["crn"] = model.Crn + modelMap["href"] = model.Href + return modelMap, nil +} + +func resourceIbmProjectProjectDefinitionReferenceToMap(model *projectv1.ProjectDefinitionReference) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + return modelMap, nil +} + +func resourceIbmProjectProjectEnvironmentCollectionMemberToMap(model *projectv1.ProjectEnvironmentCollectionMember) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["id"] = model.ID + projectMap, err := resourceIbmProjectProjectReferenceToMap(model.Project) + if err != nil { + return modelMap, err + } + modelMap["project"] = []map[string]interface{}{projectMap} + modelMap["created_at"] = model.CreatedAt.String() + modelMap["href"] = model.Href + definitionMap, err := resourceIbmProjectEnvironmentDefinitionNameDescriptionToMap(model.Definition) + if err != nil { + return modelMap, err + } + modelMap["definition"] = []map[string]interface{}{definitionMap} + return modelMap, nil +} + +func resourceIbmProjectEnvironmentDefinitionNameDescriptionToMap(model *projectv1.EnvironmentDefinitionNameDescription) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.Name != nil { + modelMap["name"] = model.Name + } + if model.Description != nil { + modelMap["description"] = model.Description + } + return modelMap, nil +} diff --git a/ibm/service/project/resource_ibm_project_config.go b/ibm/service/project/resource_ibm_project_config.go new file mode 100644 index 0000000000..ef7fb404c3 --- /dev/null +++ b/ibm/service/project/resource_ibm_project_config.go @@ -0,0 +1,757 @@ +// Copyright IBM Corp. 2023 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package project + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/validate" + "github.com/IBM/go-sdk-core/v5/core" + "github.com/IBM/project-go-sdk/projectv1" +) + +func ResourceIbmProjectConfig() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIbmProjectConfigCreate, + ReadContext: resourceIbmProjectConfigRead, + UpdateContext: resourceIbmProjectConfigUpdate, + DeleteContext: resourceIbmProjectConfigDelete, + Importer: &schema.ResourceImporter{}, + + Schema: map[string]*schema.Schema{ + "project_id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.InvokeValidator("ibm_project_config", "project_id"), + Description: "The unique project ID.", + }, + "schematics": &schema.Schema{ + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + Description: "A schematics workspace associated to a project configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "workspace_crn": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "An existing schematics workspace CRN.", + }, + }, + }, + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The type and output of a project configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The configuration name.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "A project configuration description.", + }, + "environment": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The ID of the project environment.", + }, + "authorizations": &schema.Schema{ + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + Description: "The authorization details. You can authorize by using a trusted profile or an API key in Secrets Manager.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "trusted_profile_id": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The trusted profile ID.", + }, + "method": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The authorization method. You can authorize by using a trusted profile or an API key in Secrets Manager.", + }, + "api_key": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The IBM Cloud API Key.", + }, + }, + }, + }, + "compliance_profile": &schema.Schema{ + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + Description: "The profile required for compliance.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The unique ID.", + }, + "instance_id": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The unique ID.", + }, + "instance_location": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The location of the compliance instance.", + }, + "attachment_id": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The unique ID.", + }, + "profile_name": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "The name of the compliance profile.", + }, + }, + }, + }, + "locator_id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "A dotted value of catalogID.versionID.", + }, + "inputs": &schema.Schema{ + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + Description: "The input variables for configuration definition and environment.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{}, + }, + }, + "settings": &schema.Schema{ + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + Description: "Schematics environment variables to use to deploy the configuration.Settings are only available if they were specified when the configuration was initially created.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{}, + }, + }, + "type": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The type of a project configuration manual property.", + }, + }, + }, + }, + "version": &schema.Schema{ + Type: schema.TypeInt, + Computed: true, + Description: "The version of the configuration.", + }, + "is_draft": &schema.Schema{ + Type: schema.TypeBool, + Computed: true, + Description: "The flag that indicates whether the version of the configuration is draft, or active.", + }, + "needs_attention_state": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The needs attention state of a configuration.", + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "created_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "modified_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "last_saved_at": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", + }, + "outputs": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The outputs of a Schematics template property.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The variable name.", + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "A short explanation of the output value.", + }, + "value": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Description: "Can be any value - a string, number, boolean, array, or object.", + }, + }, + }, + }, + "project": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Description: "The project referenced by this resource.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The unique ID.", + }, + "definition": &schema.Schema{ + Type: schema.TypeList, + MinItems: 1, + MaxItems: 1, + Required: true, + Description: "The definition of the project reference.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "The name of the project.", + }, + }, + }, + }, + "crn": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "An IBM Cloud resource name, which uniquely identifies a resource.", + }, + "href": &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "A URL.", + }, + }, + }, + }, + "state": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The state of the configuration.", + }, + "update_available": &schema.Schema{ + Type: schema.TypeBool, + Computed: true, + Description: "The flag that indicates whether a configuration update is available.", + }, + "project_config_id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Description: "The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration.", + }, + }, + } +} + +func ResourceIbmProjectConfigValidator() *validate.ResourceValidator { + validateSchema := make([]validate.ValidateSchema, 0) + validateSchema = append(validateSchema, + validate.ValidateSchema{ + Identifier: "project_id", + ValidateFunctionIdentifier: validate.ValidateRegexp, + Type: validate.TypeString, + Required: true, + Regexp: `^[\.\-0-9a-zA-Z]+$`, + MaxValueLength: 128, + }, + ) + + resourceValidator := validate.ResourceValidator{ResourceName: "ibm_project_config", Schema: validateSchema} + return &resourceValidator +} + +func resourceIbmProjectConfigCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + createConfigOptions := &projectv1.CreateConfigOptions{} + + createConfigOptions.SetProjectID(d.Get("project_id").(string)) + definitionModel, err := resourceIbmProjectConfigMapToProjectConfigPrototypeDefinitionBlock(d.Get("definition.0").(map[string]interface{})) + if err != nil { + return diag.FromErr(err) + } + createConfigOptions.SetDefinition(definitionModel) + if _, ok := d.GetOk("schematics"); ok { + schematicsModel, err := resourceIbmProjectConfigMapToSchematicsWorkspace(d.Get("schematics.0").(map[string]interface{})) + if err != nil { + return diag.FromErr(err) + } + createConfigOptions.SetSchematics(schematicsModel) + } + + projectConfig, response, err := projectClient.CreateConfigWithContext(context, createConfigOptions) + if err != nil { + log.Printf("[DEBUG] CreateConfigWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("CreateConfigWithContext failed %s\n%s", err, response)) + } + + d.SetId(fmt.Sprintf("%s/%s", *createConfigOptions.ProjectID, *projectConfig.ID)) + + return resourceIbmProjectConfigRead(context, d, meta) +} + +func resourceIbmProjectConfigRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + getConfigOptions := &projectv1.GetConfigOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + return diag.FromErr(err) + } + + getConfigOptions.SetProjectID(parts[0]) + getConfigOptions.SetID(parts[1]) + + projectConfig, response, err := projectClient.GetConfigWithContext(context, getConfigOptions) + if err != nil { + if response != nil && response.StatusCode == 404 { + d.SetId("") + return nil + } + log.Printf("[DEBUG] GetConfigWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("GetConfigWithContext failed %s\n%s", err, response)) + } + + definitionMap, err := resourceIbmProjectConfigProjectConfigResponseDefinitionToMap(projectConfig.Definition) + if err != nil { + return diag.FromErr(err) + } + if err = d.Set("definition", []map[string]interface{}{definitionMap}); err != nil { + return diag.FromErr(fmt.Errorf("Error setting definition: %s", err)) + } + if err = d.Set("version", flex.IntValue(projectConfig.Version)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting version: %s", err)) + } + if err = d.Set("is_draft", projectConfig.IsDraft); err != nil { + return diag.FromErr(fmt.Errorf("Error setting is_draft: %s", err)) + } + if !core.IsNil(projectConfig.NeedsAttentionState) { + needsAttentionState := []interface{}{} + for _, needsAttentionStateItem := range projectConfig.NeedsAttentionState { + needsAttentionState = append(needsAttentionState, needsAttentionStateItem) + } + if err = d.Set("needs_attention_state", needsAttentionState); err != nil { + return diag.FromErr(fmt.Errorf("Error setting needs_attention_state: %s", err)) + } + } + if err = d.Set("created_at", flex.DateTimeToString(projectConfig.CreatedAt)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting created_at: %s", err)) + } + if err = d.Set("modified_at", flex.DateTimeToString(projectConfig.ModifiedAt)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting modified_at: %s", err)) + } + if !core.IsNil(projectConfig.LastSavedAt) { + if err = d.Set("last_saved_at", flex.DateTimeToString(projectConfig.LastSavedAt)); err != nil { + return diag.FromErr(fmt.Errorf("Error setting last_saved_at: %s", err)) + } + } + if !core.IsNil(projectConfig.Outputs) { + outputs := []map[string]interface{}{} + for _, outputsItem := range projectConfig.Outputs { + outputsItemMap, err := resourceIbmProjectConfigOutputValueToMap(&outputsItem) + if err != nil { + return diag.FromErr(err) + } + outputs = append(outputs, outputsItemMap) + } + if err = d.Set("outputs", outputs); err != nil { + return diag.FromErr(fmt.Errorf("Error setting outputs: %s", err)) + } + } + projectMap, err := resourceIbmProjectConfigProjectReferenceToMap(projectConfig.Project) + if err != nil { + return diag.FromErr(err) + } + if err = d.Set("project", []map[string]interface{}{projectMap}); err != nil { + return diag.FromErr(fmt.Errorf("Error setting project: %s", err)) + } + if err = d.Set("state", projectConfig.State); err != nil { + return diag.FromErr(fmt.Errorf("Error setting state: %s", err)) + } + if err = d.Set("update_available", projectConfig.UpdateAvailable); err != nil { + return diag.FromErr(fmt.Errorf("Error setting update_available: %s", err)) + } + if err = d.Set("project_config_id", projectConfig.ID); err != nil { + return diag.FromErr(fmt.Errorf("Error setting project_config_id: %s", err)) + } + + return nil +} + +func resourceIbmProjectConfigUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + updateConfigOptions := &projectv1.UpdateConfigOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + return diag.FromErr(err) + } + + updateConfigOptions.SetProjectID(parts[0]) + updateConfigOptions.SetID(parts[1]) + + hasChange := false + + if d.HasChange("definition") { + definition, err := resourceIbmProjectConfigMapToProjectConfigPrototypePatchDefinitionBlock(d.Get("definition.0").(map[string]interface{})) + if err != nil { + return diag.FromErr(err) + } + updateConfigOptions.SetDefinition(definition) + hasChange = true + } + + if hasChange { + _, response, err := projectClient.UpdateConfigWithContext(context, updateConfigOptions) + if err != nil { + log.Printf("[DEBUG] UpdateConfigWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("UpdateConfigWithContext failed %s\n%s", err, response)) + } + } + + return resourceIbmProjectConfigRead(context, d, meta) +} + +func resourceIbmProjectConfigDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + projectClient, err := meta.(conns.ClientSession).ProjectV1() + if err != nil { + return diag.FromErr(err) + } + + deleteConfigOptions := &projectv1.DeleteConfigOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + return diag.FromErr(err) + } + + deleteConfigOptions.SetProjectID(parts[0]) + deleteConfigOptions.SetID(parts[1]) + + _, response, err := projectClient.DeleteConfigWithContext(context, deleteConfigOptions) + if err != nil { + log.Printf("[DEBUG] DeleteConfigWithContext failed %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("DeleteConfigWithContext failed %s\n%s", err, response)) + } + + d.SetId("") + + return nil +} + +func resourceIbmProjectConfigMapToProjectConfigPrototypeDefinitionBlock(modelMap map[string]interface{}) (*projectv1.ProjectConfigPrototypeDefinitionBlock, error) { + model := &projectv1.ProjectConfigPrototypeDefinitionBlock{} + model.Name = core.StringPtr(modelMap["name"].(string)) + if modelMap["description"] != nil && modelMap["description"].(string) != "" { + model.Description = core.StringPtr(modelMap["description"].(string)) + } + if modelMap["environment"] != nil && modelMap["environment"].(string) != "" { + model.Environment = core.StringPtr(modelMap["environment"].(string)) + } + if modelMap["authorizations"] != nil && len(modelMap["authorizations"].([]interface{})) > 0 { + AuthorizationsModel, err := resourceIbmProjectConfigMapToProjectConfigAuth(modelMap["authorizations"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Authorizations = AuthorizationsModel + } + if modelMap["compliance_profile"] != nil && len(modelMap["compliance_profile"].([]interface{})) > 0 { + ComplianceProfileModel, err := resourceIbmProjectConfigMapToProjectComplianceProfile(modelMap["compliance_profile"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.ComplianceProfile = ComplianceProfileModel + } + if modelMap["locator_id"] != nil && modelMap["locator_id"].(string) != "" { + model.LocatorID = core.StringPtr(modelMap["locator_id"].(string)) + } + if modelMap["inputs"] != nil && len(modelMap["inputs"].([]interface{})) > 0 { + InputsModel, err := resourceIbmProjectConfigMapToInputVariable(modelMap["inputs"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Inputs = InputsModel + } + if modelMap["settings"] != nil && len(modelMap["settings"].([]interface{})) > 0 { + SettingsModel, err := resourceIbmProjectConfigMapToProjectConfigSetting(modelMap["settings"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Settings = SettingsModel + } + return model, nil +} + +func resourceIbmProjectConfigMapToProjectConfigAuth(modelMap map[string]interface{}) (*projectv1.ProjectConfigAuth, error) { + model := &projectv1.ProjectConfigAuth{} + if modelMap["trusted_profile_id"] != nil && modelMap["trusted_profile_id"].(string) != "" { + model.TrustedProfileID = core.StringPtr(modelMap["trusted_profile_id"].(string)) + } + if modelMap["method"] != nil && modelMap["method"].(string) != "" { + model.Method = core.StringPtr(modelMap["method"].(string)) + } + if modelMap["api_key"] != nil && modelMap["api_key"].(string) != "" { + model.ApiKey = core.StringPtr(modelMap["api_key"].(string)) + } + return model, nil +} + +func resourceIbmProjectConfigMapToProjectComplianceProfile(modelMap map[string]interface{}) (*projectv1.ProjectComplianceProfile, error) { + model := &projectv1.ProjectComplianceProfile{} + if modelMap["id"] != nil && modelMap["id"].(string) != "" { + model.ID = core.StringPtr(modelMap["id"].(string)) + } + if modelMap["instance_id"] != nil && modelMap["instance_id"].(string) != "" { + model.InstanceID = core.StringPtr(modelMap["instance_id"].(string)) + } + if modelMap["instance_location"] != nil && modelMap["instance_location"].(string) != "" { + model.InstanceLocation = core.StringPtr(modelMap["instance_location"].(string)) + } + if modelMap["attachment_id"] != nil && modelMap["attachment_id"].(string) != "" { + model.AttachmentID = core.StringPtr(modelMap["attachment_id"].(string)) + } + if modelMap["profile_name"] != nil && modelMap["profile_name"].(string) != "" { + model.ProfileName = core.StringPtr(modelMap["profile_name"].(string)) + } + return model, nil +} + +func resourceIbmProjectConfigMapToInputVariable(modelMap map[string]interface{}) (*projectv1.InputVariable, error) { + model := &projectv1.InputVariable{} + return model, nil +} + +func resourceIbmProjectConfigMapToProjectConfigSetting(modelMap map[string]interface{}) (*projectv1.ProjectConfigSetting, error) { + model := &projectv1.ProjectConfigSetting{} + return model, nil +} + +func resourceIbmProjectConfigMapToSchematicsWorkspace(modelMap map[string]interface{}) (*projectv1.SchematicsWorkspace, error) { + model := &projectv1.SchematicsWorkspace{} + if modelMap["workspace_crn"] != nil && modelMap["workspace_crn"].(string) != "" { + model.WorkspaceCrn = core.StringPtr(modelMap["workspace_crn"].(string)) + } + return model, nil +} + +func resourceIbmProjectConfigMapToProjectConfigPrototypePatchDefinitionBlock(modelMap map[string]interface{}) (*projectv1.ProjectConfigPrototypePatchDefinitionBlock, error) { + model := &projectv1.ProjectConfigPrototypePatchDefinitionBlock{} + if modelMap["name"] != nil && modelMap["name"].(string) != "" { + model.Name = core.StringPtr(modelMap["name"].(string)) + } + if modelMap["description"] != nil && modelMap["description"].(string) != "" { + model.Description = core.StringPtr(modelMap["description"].(string)) + } + if modelMap["environment"] != nil && modelMap["environment"].(string) != "" { + model.Environment = core.StringPtr(modelMap["environment"].(string)) + } + if modelMap["authorizations"] != nil && len(modelMap["authorizations"].([]interface{})) > 0 { + AuthorizationsModel, err := resourceIbmProjectConfigMapToProjectConfigAuth(modelMap["authorizations"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Authorizations = AuthorizationsModel + } + if modelMap["compliance_profile"] != nil && len(modelMap["compliance_profile"].([]interface{})) > 0 { + ComplianceProfileModel, err := resourceIbmProjectConfigMapToProjectComplianceProfile(modelMap["compliance_profile"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.ComplianceProfile = ComplianceProfileModel + } + if modelMap["locator_id"] != nil && modelMap["locator_id"].(string) != "" { + model.LocatorID = core.StringPtr(modelMap["locator_id"].(string)) + } + if modelMap["inputs"] != nil && len(modelMap["inputs"].([]interface{})) > 0 { + InputsModel, err := resourceIbmProjectConfigMapToInputVariable(modelMap["inputs"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Inputs = InputsModel + } + if modelMap["settings"] != nil && len(modelMap["settings"].([]interface{})) > 0 { + SettingsModel, err := resourceIbmProjectConfigMapToProjectConfigSetting(modelMap["settings"].([]interface{})[0].(map[string]interface{})) + if err != nil { + return model, err + } + model.Settings = SettingsModel + } + return model, nil +} + +func resourceIbmProjectConfigSchematicsWorkspaceToMap(model *projectv1.SchematicsWorkspace) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.WorkspaceCrn != nil { + modelMap["workspace_crn"] = model.WorkspaceCrn + } + return modelMap, nil +} + +func resourceIbmProjectConfigProjectConfigResponseDefinitionToMap(model *projectv1.ProjectConfigResponseDefinition) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + if model.Description != nil { + modelMap["description"] = model.Description + } + if model.Environment != nil { + modelMap["environment"] = model.Environment + } + if model.Authorizations != nil { + authorizationsMap, err := resourceIbmProjectConfigProjectConfigAuthToMap(model.Authorizations) + if err != nil { + return modelMap, err + } + modelMap["authorizations"] = []map[string]interface{}{authorizationsMap} + } + if model.ComplianceProfile != nil { + complianceProfileMap, err := resourceIbmProjectConfigProjectComplianceProfileToMap(model.ComplianceProfile) + if err != nil { + return modelMap, err + } + if len(complianceProfileMap) > 0 { + modelMap["compliance_profile"] = []map[string]interface{}{complianceProfileMap} + } + } + modelMap["locator_id"] = model.LocatorID + if model.Inputs != nil { + inputsMap, err := resourceIbmProjectConfigInputVariableToMap(model.Inputs) + if err != nil { + return modelMap, err + } + if len(inputsMap) > 0 { + modelMap["inputs"] = []map[string]interface{}{inputsMap} + } + } + if model.Settings != nil { + settingsMap, err := resourceIbmProjectConfigProjectConfigSettingToMap(model.Settings) + if err != nil { + return modelMap, err + } + modelMap["settings"] = []map[string]interface{}{settingsMap} + } + if model.Type != nil { + modelMap["type"] = model.Type + } + return modelMap, nil +} + +func resourceIbmProjectConfigProjectConfigAuthToMap(model *projectv1.ProjectConfigAuth) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.TrustedProfileID != nil { + modelMap["trusted_profile_id"] = model.TrustedProfileID + } + if model.Method != nil { + modelMap["method"] = model.Method + } + if model.ApiKey != nil { + modelMap["api_key"] = model.ApiKey + } + return modelMap, nil +} + +func resourceIbmProjectConfigProjectComplianceProfileToMap(model *projectv1.ProjectComplianceProfile) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + if model.ID != nil { + modelMap["id"] = model.ID + } + if model.InstanceID != nil { + modelMap["instance_id"] = model.InstanceID + } + if model.InstanceLocation != nil { + modelMap["instance_location"] = model.InstanceLocation + } + if model.AttachmentID != nil { + modelMap["attachment_id"] = model.AttachmentID + } + if model.ProfileName != nil { + modelMap["profile_name"] = model.ProfileName + } + return modelMap, nil +} + +func resourceIbmProjectConfigInputVariableToMap(model *projectv1.InputVariable) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + return modelMap, nil +} + +func resourceIbmProjectConfigProjectConfigSettingToMap(model *projectv1.ProjectConfigSetting) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + return modelMap, nil +} + +func resourceIbmProjectConfigOutputValueToMap(model *projectv1.OutputValue) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + if model.Description != nil { + modelMap["description"] = model.Description + } + if model.Value != nil { + modelMap["value"] = model.Value + } + return modelMap, nil +} + +func resourceIbmProjectConfigProjectReferenceToMap(model *projectv1.ProjectReference) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["id"] = model.ID + definitionMap, err := resourceIbmProjectConfigProjectDefinitionReferenceToMap(model.Definition) + if err != nil { + return modelMap, err + } + modelMap["definition"] = []map[string]interface{}{definitionMap} + modelMap["crn"] = model.Crn + modelMap["href"] = model.Href + return modelMap, nil +} + +func resourceIbmProjectConfigProjectDefinitionReferenceToMap(model *projectv1.ProjectDefinitionReference) (map[string]interface{}, error) { + modelMap := make(map[string]interface{}) + modelMap["name"] = model.Name + return modelMap, nil +} diff --git a/ibm/service/project/resource_ibm_project_config_test.go b/ibm/service/project/resource_ibm_project_config_test.go new file mode 100644 index 0000000000..8a827c81f1 --- /dev/null +++ b/ibm/service/project/resource_ibm_project_config_test.go @@ -0,0 +1,138 @@ +// Copyright IBM Corp. 2023 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package project_test + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/IBM/project-go-sdk/projectv1" +) + +func TestAccIbmProjectConfigBasic(t *testing.T) { + var conf projectv1.ProjectConfig + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIbmProjectConfigDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckIbmProjectConfigConfigBasic(), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIbmProjectConfigExists("ibm_project_config.project_config_instance", conf), + ), + }, + resource.TestStep{ + ResourceName: "ibm_project_config.project_config_instance", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"project_id"}, + }, + }, + }) +} + +func testAccCheckIbmProjectConfigConfigBasic() string { + return fmt.Sprintf(` + resource "ibm_project" "project_instance" { + location = "us-south" + resource_group = "Default" + definition { + name = "acme-microservice" + description = "acme-microservice description" + destroy_on_delete = true + } + } + + resource "ibm_project_config" "project_config_instance" { + project_id = ibm_project.project_instance.id + definition { + name = "stage-environment" + authorizations { + method = "api_key" + api_key = "%s" + } + locator_id = "1082e7d2-5e2f-0a11-a3bc-f88a8e1931fc.cd596f95-95a2-4f21-9b84-477f21fd1e95-global" + } + lifecycle { + ignore_changes = [ + definition[0].authorizations[0].api_key, + ] + } + } + `, acc.ProjectsConfigApiKey) +} + +func testAccCheckIbmProjectConfigExists(n string, obj projectv1.ProjectConfig) resource.TestCheckFunc { + + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + projectClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).ProjectV1() + if err != nil { + return err + } + + getConfigOptions := &projectv1.GetConfigOptions{} + + parts, err := flex.SepIdParts(rs.Primary.ID, "/") + if err != nil { + return err + } + + getConfigOptions.SetProjectID(parts[0]) + getConfigOptions.SetID(parts[1]) + + projectConfig, _, err := projectClient.GetConfig(getConfigOptions) + if err != nil { + return err + } + + obj = *projectConfig + return nil + } +} + +func testAccCheckIbmProjectConfigDestroy(s *terraform.State) error { + projectClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).ProjectV1() + if err != nil { + return err + } + for _, rs := range s.RootModule().Resources { + if rs.Type != "ibm_project_config" { + continue + } + + getConfigOptions := &projectv1.GetConfigOptions{} + + parts, err := flex.SepIdParts(rs.Primary.ID, "/") + if err != nil { + return err + } + + getConfigOptions.SetProjectID(parts[0]) + getConfigOptions.SetID(parts[1]) + + // Try to find the key + _, response, err := projectClient.GetConfig(getConfigOptions) + + if err == nil { + return fmt.Errorf("project_config still exists: %s", rs.Primary.ID) + } else if response.StatusCode != 404 { + return fmt.Errorf("Error checking for project_config (%s) has been destroyed: %s", rs.Primary.ID, err) + } + } + + return nil +} diff --git a/ibm/service/project/resource_ibm_project_instance.go b/ibm/service/project/resource_ibm_project_instance.go deleted file mode 100644 index 2d4c5af5a4..0000000000 --- a/ibm/service/project/resource_ibm_project_instance.go +++ /dev/null @@ -1,646 +0,0 @@ -// Copyright IBM Corp. 2023 All Rights Reserved. -// Licensed under the Mozilla Public License v2.0 - -package project - -import ( - "context" - "fmt" - "log" - "time" - - "github.com/hashicorp/terraform-plugin-sdk/v2/diag" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - - "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" - "github.com/IBM-Cloud/terraform-provider-ibm/ibm/validate" - "github.com/IBM/go-sdk-core/v5/core" - "github.com/IBM/project-go-sdk/projectv1" -) - -func ResourceIbmProjectInstance() *schema.Resource { - return &schema.Resource{ - CreateContext: resourceIbmProjectInstanceCreate, - ReadContext: resourceIbmProjectInstanceRead, - UpdateContext: resourceIbmProjectInstanceUpdate, - DeleteContext: resourceIbmProjectInstanceDelete, - Importer: &schema.ResourceImporter{}, - Timeouts: &schema.ResourceTimeout{ - Create: schema.DefaultTimeout(1 * time.Minute), - Delete: schema.DefaultTimeout(1 * time.Minute), - }, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - Description: "The project name.", - }, - "description": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Description: "A project's descriptive text.", - }, - "configs": &schema.Schema{ - Type: schema.TypeList, - Optional: true, - Description: "The project configurations.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "id": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Description: "The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration.", - }, - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "The configuration name.", - }, - "labels": &schema.Schema{ - Type: schema.TypeList, - Optional: true, - Description: "A collection of configuration labels.", - Elem: &schema.Schema{Type: schema.TypeString}, - }, - "description": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Description: "The project configuration description.", - }, - "locator_id": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "A dotted value of catalogID.versionID.", - }, - "input": &schema.Schema{ - Type: schema.TypeList, - Optional: true, - Description: "The input values to use to deploy the configuration.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "The variable name.", - }, - "value": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Description: "Can be any value - a string, number, boolean, array, or object.", - }, - }, - }, - }, - "setting": &schema.Schema{ - Type: schema.TypeList, - Optional: true, - Description: "Schematics environment variables to use to deploy the configuration.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "The name of the configuration setting.", - }, - "value": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "The value of the configuration setting.", - }, - }, - }, - }, - }, - }, - }, - "resource_group": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "The resource group where the project's data and tools are created.", - }, - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "The location where the project's data and tools are created.", - }, - "crn": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "An IBM Cloud resource name, which uniquely identifies a resource.", - }, - "metadata": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "The metadata of the project.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "crn": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "An IBM Cloud resource name, which uniquely identifies a resource.", - }, - "created_at": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339.", - }, - "cumulative_needs_attention_view": &schema.Schema{ - Type: schema.TypeList, - Computed: true, - Description: "The cumulative list of needs attention items for a project.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "event": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The event name.", - }, - "event_id": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The unique ID of a project.", - }, - "config_id": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The unique ID of a project.", - }, - "config_version": &schema.Schema{ - Type: schema.TypeInt, - Computed: true, - Description: "The version number of the configuration.", - }, - }, - }, - }, - "cumulative_needs_attention_view_err": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "True indicates that the fetch of the needs attention items failed.", - }, - "location": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The IBM Cloud location where a resource is deployed.", - }, - "resource_group": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The resource group where the project's data and tools are created.", - }, - "state": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The project status value.", - }, - "event_notifications_crn": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - Description: "The CRN of the event notifications instance if one is connected to this project.", - }, - }, - }, - }, - }, - } -} - -func ResourceIbmProjectInstanceValidator() *validate.ResourceValidator { - validateSchema := make([]validate.ValidateSchema, 0) - validateSchema = append(validateSchema, - validate.ValidateSchema{ - Identifier: "name", - Type: validate.TypeString, - Required: true, - Regexp: `^(?!\s)(?!.*\s$)[^'"<>{}\x00-\x1F]+$`, - MinValueLength: 1, - MaxValueLength: 64, - }, - validate.ValidateSchema{ - Identifier: "description", - Type: validate.TypeString, - Optional: true, - Regexp: `^$|^(?!\s).*\S$`, - MinValueLength: 0, - MaxValueLength: 1024, - }, - validate.ValidateSchema{ - Identifier: "resource_group", - Type: validate.TypeString, - Required: true, - Regexp: `^$|^(?!\s)(?!.*\s$)[^'"<>{}\x00-\x1F]*$`, - MinValueLength: 0, - MaxValueLength: 40, - }, - validate.ValidateSchema{ - Identifier: "location", - Type: validate.TypeString, - Required: true, - Regexp: `^$|^(us-south|us-east|eu-gb|eu-de)$`, - MinValueLength: 0, - MaxValueLength: 12, - }, - ) - - resourceValidator := validate.ResourceValidator{ResourceName: "ibm_project_instance", Schema: validateSchema} - return &resourceValidator -} - -func resourceIbmProjectInstanceCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - projectClient, err := meta.(conns.ClientSession).ProjectV1() - if err != nil { - return diag.FromErr(err) - } - - createProjectOptions := &projectv1.CreateProjectOptions{} - - createProjectOptions.SetName(d.Get("name").(string)) - if _, ok := d.GetOk("description"); ok { - createProjectOptions.SetDescription(d.Get("description").(string)) - } - if _, ok := d.GetOk("configs"); ok { - var configs []projectv1.ProjectConfigPrototype - for _, v := range d.Get("configs").([]interface{}) { - value := v.(map[string]interface{}) - configsItem, err := resourceIbmProjectInstanceMapToProjectConfigPrototype(value) - if err != nil { - return diag.FromErr(err) - } - configs = append(configs, *configsItem) - } - createProjectOptions.SetConfigs(configs) - } - if _, ok := d.GetOk("resource_group"); ok { - createProjectOptions.SetResourceGroup(d.Get("resource_group").(string)) - } - if _, ok := d.GetOk("location"); ok { - createProjectOptions.SetLocation(d.Get("location").(string)) - } - - project, response, err := projectClient.CreateProjectWithContext(context, createProjectOptions) - if err != nil { - log.Printf("[DEBUG] CreateProjectWithContext failed %s\n%s", err, response) - return diag.FromErr(fmt.Errorf("CreateProjectWithContext failed %s\n%s", err, response)) - } - - d.SetId(*project.ID) - - _, err = waitForProjectInstanceCreate(d, meta) - if err != nil { - return diag.FromErr(fmt.Errorf("[ERROR] Error waiting for create project instance (%s) to be succeeded: %s", d.Id(), err)) - } - - return resourceIbmProjectInstanceRead(context, d, meta) -} - -func waitForProjectInstanceCreate(d *schema.ResourceData, meta interface{}) (interface{}, error) { - projectClient, err := meta.(conns.ClientSession).ProjectV1() - if err != nil { - return false, err - } - instanceID := d.Id() - getProjectOptions := &projectv1.GetProjectOptions{} - getProjectOptions.SetID(instanceID) - - stateConf := &resource.StateChangeConf{ - Pending: []string{"not_exists"}, - Target: []string{"exists"}, - Refresh: func() (interface{}, string, error) { - _, resp, err := projectClient.GetProject(getProjectOptions) - if err == nil { - if resp != nil && resp.StatusCode == 200 { - return resp, "exists", nil - } else { - return resp, "not_exists", nil - } - } else { - return nil, "", fmt.Errorf("[ERROR] Get the project instance %s failed with resp code: %d, err: %v", d.Id(), resp.StatusCode, err) - } - }, - Timeout: d.Timeout(schema.TimeoutCreate), - Delay: 2 * time.Second, - MinTimeout: 10 * time.Second, - } - - return stateConf.WaitForState() -} - -func resourceIbmProjectInstanceRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - projectClient, err := meta.(conns.ClientSession).ProjectV1() - if err != nil { - return diag.FromErr(err) - } - - getProjectOptions := &projectv1.GetProjectOptions{} - - getProjectOptions.SetID(d.Id()) - - project, response, err := projectClient.GetProjectWithContext(context, getProjectOptions) - if err != nil { - if response != nil && response.StatusCode == 404 { - d.SetId("") - return nil - } - log.Printf("[DEBUG] GetProjectWithContext failed %s\n%s", err, response) - return diag.FromErr(fmt.Errorf("GetProjectWithContext failed %s\n%s", err, response)) - } - - if !core.IsNil(project.Crn) { - if err = d.Set("crn", project.Crn); err != nil { - return diag.FromErr(fmt.Errorf("Error setting crn: %s", err)) - } - } - if err = d.Set("name", project.Name); err != nil { - return diag.FromErr(fmt.Errorf("Error setting name: %s", err)) - } - if !core.IsNil(project.Description) { - if err = d.Set("description", project.Description); err != nil { - return diag.FromErr(fmt.Errorf("Error setting description: %s", err)) - } - } - if !core.IsNil(project.Configs) { - configs := []map[string]interface{}{} - if err = d.Set("configs", configs); err != nil { - return diag.FromErr(fmt.Errorf("Error setting configs: %s", err)) - } - } - if !core.IsNil(project.Metadata) { - metadataMap, err := resourceIbmProjectInstanceProjectMetadataToMap(project.Metadata) - if err != nil { - return diag.FromErr(err) - } - if err = d.Set("metadata", []map[string]interface{}{metadataMap}); err != nil { - return diag.FromErr(fmt.Errorf("Error setting metadata: %s", err)) - } - } - - return nil -} - -func resourceIbmProjectInstanceUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - projectClient, err := meta.(conns.ClientSession).ProjectV1() - if err != nil { - return diag.FromErr(err) - } - - updateProjectOptions := &projectv1.UpdateProjectOptions{} - - updateProjectOptions.SetID(d.Id()) - - hasChange := false - - if d.HasChange("name") { - updateProjectOptions.SetName(d.Get("name").(string)) - hasChange = true - } - if d.HasChange("description") { - updateProjectOptions.SetDescription(d.Get("description").(string)) - hasChange = true - } - if d.HasChange("configs") { - var configs []projectv1.ProjectConfigPrototype - for _, v := range d.Get("configs").([]interface{}) { - value := v.(map[string]interface{}) - configsItem, err := resourceIbmProjectInstanceMapToProjectConfigPrototype(value) - if err != nil { - return diag.FromErr(err) - } - configs = append(configs, *configsItem) - } - hasChange = true - } - - if hasChange { - _, response, err := projectClient.UpdateProjectWithContext(context, updateProjectOptions) - if err != nil { - log.Printf("[DEBUG] UpdateProjectWithContext failed %s\n%s", err, response) - return diag.FromErr(fmt.Errorf("UpdateProjectWithContext failed %s\n%s", err, response)) - } - } - - return resourceIbmProjectInstanceRead(context, d, meta) -} - -func resourceIbmProjectInstanceDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - projectClient, err := meta.(conns.ClientSession).ProjectV1() - if err != nil { - return diag.FromErr(err) - } - - deleteProjectOptions := &projectv1.DeleteProjectOptions{} - - deleteProjectOptions.SetID(d.Id()) - - response, err := projectClient.DeleteProjectWithContext(context, deleteProjectOptions) - if err != nil { - log.Printf("[DEBUG] DeleteProjectWithContext failed %s\n%s", err, response) - return diag.FromErr(fmt.Errorf("DeleteProjectWithContext failed %s\n%s", err, response)) - } - - _, err = waitForProjectInstanceDelete(d, meta) - if err != nil { - return diag.FromErr(fmt.Errorf("[ERROR] Error waiting for delete project instance (%s) to be succeeded: %s", d.Id(), err)) - } - - d.SetId("") - - return nil -} - -func waitForProjectInstanceDelete(d *schema.ResourceData, meta interface{}) (interface{}, error) { - projectClient, err := meta.(conns.ClientSession).ProjectV1() - if err != nil { - return false, err - } - instanceID := d.Id() - getProjectOptions := &projectv1.GetProjectOptions{} - getProjectOptions.SetID(instanceID) - - stateConf := &resource.StateChangeConf{ - Pending: []string{"exists"}, - Target: []string{"not_exists"}, - Refresh: func() (interface{}, string, error) { - _, resp, err := projectClient.GetProject(getProjectOptions) - if err != nil { - if resp != nil && resp.StatusCode == 404 { - return resp, "not_exists", nil - } else { - return resp, "exists", nil - } - } else { - return resp, "exists", nil - } - }, - Timeout: d.Timeout(schema.TimeoutDelete), - Delay: 2 * time.Second, - MinTimeout: 10 * time.Second, - } - - return stateConf.WaitForState() -} - -func resourceIbmProjectInstanceMapToProjectConfigPrototype(modelMap map[string]interface{}) (*projectv1.ProjectConfigPrototype, error) { - model := &projectv1.ProjectConfigPrototype{} - if modelMap["id"] != nil && modelMap["id"].(string) != "" { - model.ID = core.StringPtr(modelMap["id"].(string)) - } - model.Name = core.StringPtr(modelMap["name"].(string)) - if modelMap["labels"] != nil { - labels := []string{} - for _, labelsItem := range modelMap["labels"].([]interface{}) { - labels = append(labels, labelsItem.(string)) - } - model.Labels = labels - } - if modelMap["description"] != nil && modelMap["description"].(string) != "" { - model.Description = core.StringPtr(modelMap["description"].(string)) - } - model.LocatorID = core.StringPtr(modelMap["locator_id"].(string)) - if modelMap["input"] != nil { - input := []projectv1.ProjectConfigInputVariable{} - for _, inputItem := range modelMap["input"].([]interface{}) { - inputItemModel, err := resourceIbmProjectInstanceMapToProjectConfigInputVariable(inputItem.(map[string]interface{})) - if err != nil { - return model, err - } - input = append(input, *inputItemModel) - } - model.Input = input - } - if modelMap["setting"] != nil { - setting := []projectv1.ProjectConfigSettingCollection{} - for _, settingItem := range modelMap["setting"].([]interface{}) { - settingItemModel, err := resourceIbmProjectInstanceMapToProjectConfigSettingCollection(settingItem.(map[string]interface{})) - if err != nil { - return model, err - } - setting = append(setting, *settingItemModel) - } - model.Setting = setting - } - return model, nil -} - -func resourceIbmProjectInstanceMapToProjectConfigInputVariable(modelMap map[string]interface{}) (*projectv1.ProjectConfigInputVariable, error) { - model := &projectv1.ProjectConfigInputVariable{} - model.Name = core.StringPtr(modelMap["name"].(string)) - if modelMap["value"] != nil { - model.Value = modelMap["value"].(string) - } - return model, nil -} - -func resourceIbmProjectInstanceMapToProjectConfigSettingCollection(modelMap map[string]interface{}) (*projectv1.ProjectConfigSettingCollection, error) { - model := &projectv1.ProjectConfigSettingCollection{} - model.Name = core.StringPtr(modelMap["name"].(string)) - model.Value = core.StringPtr(modelMap["value"].(string)) - return model, nil -} - -func resourceIbmProjectInstanceProjectConfigPrototypeToMap(model *projectv1.ProjectConfigPrototype) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.ID != nil { - modelMap["id"] = model.ID - } - modelMap["name"] = model.Name - if model.Labels != nil { - modelMap["labels"] = model.Labels - } - if model.Description != nil { - modelMap["description"] = model.Description - } - modelMap["locator_id"] = model.LocatorID - if model.Input != nil { - input := []map[string]interface{}{} - for _, inputItem := range model.Input { - inputItemMap, err := resourceIbmProjectInstanceProjectConfigInputVariableToMap(&inputItem) - if err != nil { - return modelMap, err - } - input = append(input, inputItemMap) - } - modelMap["input"] = input - } - if model.Setting != nil { - setting := []map[string]interface{}{} - for _, settingItem := range model.Setting { - settingItemMap, err := resourceIbmProjectInstanceProjectConfigSettingCollectionToMap(&settingItem) - if err != nil { - return modelMap, err - } - setting = append(setting, settingItemMap) - } - modelMap["setting"] = setting - } - return modelMap, nil -} - -func resourceIbmProjectInstanceProjectConfigInputVariableToMap(model *projectv1.ProjectConfigInputVariable) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - modelMap["name"] = model.Name - if model.Value != nil { - modelMap["value"] = model.Value - } - return modelMap, nil -} - -func resourceIbmProjectInstanceProjectConfigSettingCollectionToMap(model *projectv1.ProjectConfigSettingCollection) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - modelMap["name"] = model.Name - modelMap["value"] = model.Value - return modelMap, nil -} - -func resourceIbmProjectInstanceProjectMetadataToMap(model *projectv1.ProjectMetadata) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.Crn != nil { - modelMap["crn"] = model.Crn - } - if model.CreatedAt != nil { - modelMap["created_at"] = model.CreatedAt.String() - } - if model.CumulativeNeedsAttentionView != nil { - cumulativeNeedsAttentionView := []map[string]interface{}{} - for _, cumulativeNeedsAttentionViewItem := range model.CumulativeNeedsAttentionView { - cumulativeNeedsAttentionViewItemMap, err := resourceIbmProjectInstanceCumulativeNeedsAttentionToMap(&cumulativeNeedsAttentionViewItem) - if err != nil { - return modelMap, err - } - cumulativeNeedsAttentionView = append(cumulativeNeedsAttentionView, cumulativeNeedsAttentionViewItemMap) - } - modelMap["cumulative_needs_attention_view"] = cumulativeNeedsAttentionView - } - if model.CumulativeNeedsAttentionViewErr != nil { - modelMap["cumulative_needs_attention_view_err"] = model.CumulativeNeedsAttentionViewErr - } - if model.Location != nil { - modelMap["location"] = model.Location - } - if model.ResourceGroup != nil { - modelMap["resource_group"] = model.ResourceGroup - } - if model.State != nil { - modelMap["state"] = model.State - } - if model.EventNotificationsCrn != nil { - modelMap["event_notifications_crn"] = model.EventNotificationsCrn - } - return modelMap, nil -} - -func resourceIbmProjectInstanceCumulativeNeedsAttentionToMap(model *projectv1.CumulativeNeedsAttention) (map[string]interface{}, error) { - modelMap := make(map[string]interface{}) - if model.Event != nil { - modelMap["event"] = model.Event - } - if model.EventID != nil { - modelMap["event_id"] = model.EventID - } - if model.ConfigID != nil { - modelMap["config_id"] = model.ConfigID - } - return modelMap, nil -} diff --git a/ibm/service/project/resource_ibm_project_instance_test.go b/ibm/service/project/resource_ibm_project_instance_test.go deleted file mode 100644 index 088784f11b..0000000000 --- a/ibm/service/project/resource_ibm_project_instance_test.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright IBM Corp. 2023 All Rights Reserved. -// Licensed under the Mozilla Public License v2.0 - -package project_test - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" - - acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" - "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" - "github.com/IBM/project-go-sdk/projectv1" -) - -func TestAccIbmProjectInstanceBasic(t *testing.T) { - var conf projectv1.Project - name := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) - nameUpdate := fmt.Sprintf("tf_name_update_%d", acctest.RandIntRange(10, 100)) - resourceGroup := fmt.Sprintf("Default") - location := fmt.Sprintf("us-south") - - resource.Test(t, resource.TestCase{ - PreCheck: func() { acc.TestAccPreCheck(t) }, - Providers: acc.TestAccProviders, - CheckDestroy: testAccCheckIbmProjectInstanceDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccCheckIbmProjectInstanceConfigBasic(resourceGroup, location, name), - Check: resource.ComposeAggregateTestCheckFunc( - testAccCheckIbmProjectInstanceExists("ibm_project_instance.project_instance", conf), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "resource_group", resourceGroup), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "location", location), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "name", name), - ), - }, - resource.TestStep{ - Config: testAccCheckIbmProjectInstanceConfigBasic(resourceGroup, location, nameUpdate), - Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "resource_group", resourceGroup), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "location", location), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "name", nameUpdate), - ), - }, - }, - }) -} - -func TestAccIbmProjectInstanceAllArgs(t *testing.T) { - var conf projectv1.Project - name := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) - nameUpdate := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) - description := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) - descriptionUpdate := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) - resourceGroup := fmt.Sprintf("Default") - location := fmt.Sprintf("us-south") - - resource.Test(t, resource.TestCase{ - PreCheck: func() { acc.TestAccPreCheck(t) }, - Providers: acc.TestAccProviders, - CheckDestroy: testAccCheckIbmProjectInstanceDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccCheckIbmProjectInstanceConfig(name, description, resourceGroup, location), - Check: resource.ComposeAggregateTestCheckFunc( - testAccCheckIbmProjectInstanceExists("ibm_project_instance.project_instance", conf), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "resource_group", resourceGroup), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "location", location), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "name", name), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "description", description), - ), - }, - resource.TestStep{ - Config: testAccCheckIbmProjectInstanceConfig(nameUpdate, descriptionUpdate, resourceGroup, location), - Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "resource_group", resourceGroup), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "location", location), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "name", nameUpdate), - resource.TestCheckResourceAttr("ibm_project_instance.project_instance", "description", descriptionUpdate), - ), - }, - resource.TestStep{ - ResourceName: "ibm_project_instance.project_instance", - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{ - "location", - "resource_group", - "configs", - }, - }, - }, - }) -} - -func testAccCheckIbmProjectInstanceConfigBasic(resourceGroup string, location string, name string) string { - return fmt.Sprintf(` - - resource "ibm_project_instance" "project_instance" { - resource_group = "%s" - location = "%s" - name = "%s" - } - `, resourceGroup, location, name) -} - -func testAccCheckIbmProjectInstanceConfig(name string, description string, resourceGroup string, location string) string { - return fmt.Sprintf(` - - resource "ibm_project_instance" "project_instance" { - name = "%s" - description = "%s" - resource_group = "%s" - location = "%s" - configs { - name = "name" - labels = [ "labels" ] - description = "description" - locator_id = "1082e7d2-5e2f-0a11-a3bc-f88a8e1931fc.cd596f95-95a2-4f21-9b84-477f21fd1e95-global" - input { - name = "name" - } - setting { - name = "name" - value = "value" - } - } - } - `, name, description, resourceGroup, location) -} - -func testAccCheckIbmProjectInstanceExists(n string, obj projectv1.Project) resource.TestCheckFunc { - - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[n] - if !ok { - return fmt.Errorf("Not found: %s", n) - } - - projectClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).ProjectV1() - if err != nil { - return err - } - - getProjectOptions := &projectv1.GetProjectOptions{} - - getProjectOptions.SetID(rs.Primary.ID) - - project, _, err := projectClient.GetProject(getProjectOptions) - if err != nil { - return err - } - - obj = *project - return nil - } -} - -func testAccCheckIbmProjectInstanceDestroy(s *terraform.State) error { - projectClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).ProjectV1() - if err != nil { - return err - } - for _, rs := range s.RootModule().Resources { - if rs.Type != "ibm_project_instance" { - continue - } - - getProjectOptions := &projectv1.GetProjectOptions{} - - getProjectOptions.SetID(rs.Primary.ID) - - // Try to find the key - _, response, err := projectClient.GetProject(getProjectOptions) - - if err == nil { - return fmt.Errorf("Project definition still exists: %s", rs.Primary.ID) - } else if response.StatusCode != 404 { - return fmt.Errorf("Error checking for Project definition (%s) has been destroyed: %s", rs.Primary.ID, err) - } - } - - return nil -} diff --git a/ibm/service/project/resource_ibm_project_test.go b/ibm/service/project/resource_ibm_project_test.go new file mode 100644 index 0000000000..20174656ec --- /dev/null +++ b/ibm/service/project/resource_ibm_project_test.go @@ -0,0 +1,111 @@ +// Copyright IBM Corp. 2023 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package project_test + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM/project-go-sdk/projectv1" +) + +func TestAccIbmProjectBasic(t *testing.T) { + var conf projectv1.Project + location := fmt.Sprintf("us-south") + resourceGroup := fmt.Sprintf("Default") + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIbmProjectDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckIbmProjectConfigBasic(location, resourceGroup), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIbmProjectExists("ibm_project.project_instance", conf), + resource.TestCheckResourceAttr("ibm_project.project_instance", "location", location), + resource.TestCheckResourceAttr("ibm_project.project_instance", "resource_group", resourceGroup), + ), + }, + resource.TestStep{ + ResourceName: "ibm_project.project_instance", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccCheckIbmProjectConfigBasic(location string, resourceGroup string) string { + return fmt.Sprintf(` + resource "ibm_project" "project_instance" { + location = "%s" + resource_group = "%s" + definition { + name = "acme-microservice" + description = "acme-microservice description" + destroy_on_delete = true + } + } + `, location, resourceGroup) +} + +func testAccCheckIbmProjectExists(n string, obj projectv1.Project) resource.TestCheckFunc { + + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + projectClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).ProjectV1() + if err != nil { + return err + } + + getProjectOptions := &projectv1.GetProjectOptions{} + + getProjectOptions.SetID(rs.Primary.ID) + + project, _, err := projectClient.GetProject(getProjectOptions) + if err != nil { + return err + } + + obj = *project + return nil + } +} + +func testAccCheckIbmProjectDestroy(s *terraform.State) error { + projectClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).ProjectV1() + if err != nil { + return err + } + for _, rs := range s.RootModule().Resources { + if rs.Type != "ibm_project" { + continue + } + + getProjectOptions := &projectv1.GetProjectOptions{} + + getProjectOptions.SetID(rs.Primary.ID) + + // Try to find the key + _, response, err := projectClient.GetProject(getProjectOptions) + + if err == nil { + return fmt.Errorf("project still exists: %s", rs.Primary.ID) + } else if response.StatusCode != 404 { + return fmt.Errorf("Error checking for project (%s) has been destroyed: %s", rs.Primary.ID, err) + } + } + + return nil +} diff --git a/ibm/service/satellite/data_source_ibm_satellite_cluster_worker_pool.go b/ibm/service/satellite/data_source_ibm_satellite_cluster_worker_pool.go index ccffa17cea..e56f585ea9 100644 --- a/ibm/service/satellite/data_source_ibm_satellite_cluster_worker_pool.go +++ b/ibm/service/satellite/data_source_ibm_satellite_cluster_worker_pool.go @@ -97,6 +97,11 @@ func DataSourceIBMSatelliteClusterWorkerPool() *schema.Resource { Computed: true, Description: "Enable auto scalling for worker pool", }, + "openshift_license_source": { + Type: schema.TypeString, + Computed: true, + Description: "License source for Openshift", + }, }, } } @@ -154,6 +159,7 @@ func dataSourceIBMSatelliteClusterWorkerPoolRead(d *schema.ResourceData, meta in d.Set("auto_scale_enabled", *workerPool.AutoscaleEnabled) d.Set("state", *workerPool.Lifecycle.ActualState) d.Set("isolation", *workerPool.Isolation) + d.Set("openshift_license_source", *workerPool.OpenshiftLicense) d.SetId(*workerPool.ID) return nil diff --git a/ibm/service/satellite/resource_ibm_satellite_cluster.go b/ibm/service/satellite/resource_ibm_satellite_cluster.go index 27ad6d268b..98177e1b0c 100644 --- a/ibm/service/satellite/resource_ibm_satellite_cluster.go +++ b/ibm/service/satellite/resource_ibm_satellite_cluster.go @@ -124,6 +124,12 @@ func ResourceIBMSatelliteCluster() *schema.Resource { }, Description: "The OpenShift Container Platform version", }, + "entitlement": { + Type: schema.TypeString, + Optional: true, + DiffSuppressFunc: flex.ApplyOnce, + Description: "Entitlement option reduces additional OCP Licence cost in Openshift Clusters", + }, "operating_system": { Type: schema.TypeString, Optional: true, @@ -390,6 +396,11 @@ func resourceIBMSatelliteClusterCreate(d *schema.ResourceData, meta interface{}) createClusterOptions.Labels = hostLabels } + if v, ok := d.GetOk("entitlement"); ok { + entitlement := v.(string) + createClusterOptions.DefaultWorkerPoolEntitlement = &entitlement + } + if v, ok := d.GetOk("crn_token"); ok { crnToken := v.(string) createRemoteClusterOptions := &kubernetesserviceapiv1.CreateSatelliteClusterRemoteOptions{} diff --git a/ibm/service/satellite/resource_ibm_satellite_cluster_test.go b/ibm/service/satellite/resource_ibm_satellite_cluster_test.go index 548ae6b18d..76752e640c 100644 --- a/ibm/service/satellite/resource_ibm_satellite_cluster_test.go +++ b/ibm/service/satellite/resource_ibm_satellite_cluster_test.go @@ -81,6 +81,36 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVE }) } +func TestAccSatelliteCluster_Entitlement(t *testing.T) { + var instance string + clusterName := fmt.Sprintf("tf-satellitecluster-%d", acctest.RandIntRange(10, 100)) + locationName := fmt.Sprintf("tf-satellitelocation-%d", acctest.RandIntRange(10, 100)) + managed_from := "dal10" + operatingSystem := "REDHAT_8_64" + zones := []string{"us-south-1", "us-south-2", "us-south-3"} + resource_group := "default" + region := "us-south" + resource_prefix := "tf-satellite" + host_provider := "ibm" + publicKey := acc.SatelliteSSHPubKey + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheckSatelliteSSH(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckSatelliteClusterDestroy, + Steps: []resource.TestStep{ + + { + Config: testAccCheckSatelliteEntitlementClusterCreate(clusterName, locationName, managed_from, operatingSystem, resource_group, resource_prefix, region, publicKey, host_provider, zones), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckSatelliteClusterExists("ibm_satellite_cluster.create_cluster", instance), + resource.TestCheckResourceAttr("data.ibm_satellite_cluster_worker_pool.read_default_wp", "openshift_license_source", "cloud_pak"), + ), + }, + }, + }) +} + func TestAccSatelliteCluster_Import(t *testing.T) { var instance string clusterName := fmt.Sprintf("tf-satellitecluster-%d", acctest.RandIntRange(10, 100)) @@ -382,3 +412,112 @@ func testAccCheckSatelliteSingleNodeClusterCreate(clusterName, locationName, man `, locationName, managed_from, resource_group, resource_prefix, resource_prefix, region, resource_prefix, publicKey, resource_prefix, region, resource_prefix, host_provider, clusterName) } + +func testAccCheckSatelliteEntitlementClusterCreate(clusterName, locationName, managed_from, operatingSystem, resource_group, resource_prefix, region, publicKey, host_provider string, zones []string) string { + return fmt.Sprintf(` + + variable "location_zones" { + description = "Allocate your hosts across these three zones" + type = list(string) + default = ["us-south-1", "us-south-2", "us-south-3"] + } + + data "ibm_is_image" "rhel8" { + name = "ibm-redhat-8-8-minimal-amd64-2" + } + + resource "ibm_satellite_location" "location" { + location = "%s" + managed_from = "%s" + zones = var.location_zones + coreos_enabled = true + } + + data "ibm_satellite_attach_host_script" "script" { + location = ibm_satellite_location.location.id + labels = ["env:prod"] + host_provider = "ibm" + } + + data "ibm_resource_group" "resource_group" { + name = "%s" + } + + resource "ibm_is_vpc" "satellite_vpc" { + name = "%s-vpc-1" + } + + resource "ibm_is_subnet" "satellite_subnet" { + count = 3 + + name = "%s-subnet-${count.index}" + vpc = ibm_is_vpc.satellite_vpc.id + total_ipv4_address_count = 256 + zone = "%s-${count.index + 1}" + } + + resource "ibm_is_ssh_key" "satellite_ssh" { + name = "%s-ibm-ssh" + public_key = "%s" + } + + resource "ibm_is_instance" "satellite_instance" { + count = 3 + + name = "%s-instance-${count.index}" + vpc = ibm_is_vpc.satellite_vpc.id + zone = "%s-${count.index + 1}" + image = data.ibm_is_image.rhel8.id + profile = "mx2-8x64" + keys = [ibm_is_ssh_key.satellite_ssh.id] + resource_group = data.ibm_resource_group.resource_group.id + user_data = data.ibm_satellite_attach_host_script.script.host_script + + primary_network_interface { + subnet = ibm_is_subnet.satellite_subnet[count.index].id + } + } + + resource "ibm_is_floating_ip" "satellite_ip" { + count = 3 + + name = "%s-fip-${count.index}" + target = ibm_is_instance.satellite_instance[count.index].primary_network_interface[0].id + } + + resource "ibm_satellite_host" "assign_host" { + count = 3 + + location = ibm_satellite_location.location.id + host_id = element(ibm_is_instance.satellite_instance[*].name, count.index) + labels = ["env:prod"] + zone = element(var.location_zones, count.index) + host_provider = "%s" + } + + resource "ibm_satellite_cluster" "create_cluster" { + name = "%s" + location = ibm_satellite_host.assign_host.0.location + enable_config_admin = true + kube_version = "4.13_openshift" + operating_system = "%s" + entitlement = "cloud_pak" + wait_for_worker_update = true + dynamic "zones" { + for_each = var.location_zones + content { + id = zones.value + } + } + default_worker_pool_labels = { + "test" = "test-pool1" + "test1" = "test-pool2" + } + } + + data "ibm_satellite_cluster_worker_pool" "read_default_wp" { + name = "default" + cluster = ibm_satellite_cluster.create_cluster.id + } +`, locationName, managed_from, resource_group, resource_prefix, resource_prefix, region, resource_prefix, publicKey, resource_prefix, region, resource_prefix, host_provider, clusterName, operatingSystem) +} diff --git a/ibm/service/satellite/resource_ibm_satellite_cluster_worker_pool.go b/ibm/service/satellite/resource_ibm_satellite_cluster_worker_pool.go index e94f270b59..e02f41ed12 100644 --- a/ibm/service/satellite/resource_ibm_satellite_cluster_worker_pool.go +++ b/ibm/service/satellite/resource_ibm_satellite_cluster_worker_pool.go @@ -109,8 +109,10 @@ func ResourceIBMSatelliteClusterWorkerPool() *schema.Resource { Computed: true, }, "entitlement": { - Type: schema.TypeString, - Optional: true, + Type: schema.TypeString, + Optional: true, + DiffSuppressFunc: flex.ApplyOnce, + Description: "Entitlement option reduces additional OCP Licence cost in Openshift Clusters", }, "operating_system": { Type: schema.TypeString, @@ -261,6 +263,11 @@ func resourceIBMSatelliteClusterWorkerPoolCreate(d *schema.ResourceData, meta in createWorkerPoolOptions.Isolation = &isolation } + if v, ok := d.GetOk("entitlement"); ok { + entitlement := v.(string) + createWorkerPoolOptions.Entitlement = &entitlement + } + instance, response, err := satClient.CreateSatelliteWorkerPool(createWorkerPoolOptions) if err != nil { return fmt.Errorf("[ERROR] Error Creating Satellite cluster worker pool: %s\n%s", err, response) diff --git a/ibm/service/satellite/resource_ibm_satellite_cluster_worker_pool_test.go b/ibm/service/satellite/resource_ibm_satellite_cluster_worker_pool_test.go index 9b7d163091..6b79c1c144 100644 --- a/ibm/service/satellite/resource_ibm_satellite_cluster_worker_pool_test.go +++ b/ibm/service/satellite/resource_ibm_satellite_cluster_worker_pool_test.go @@ -44,6 +44,35 @@ func TestAccSatelliteClusterWorkerPool_Basic(t *testing.T) { }) } +func TestAccSatelliteClusterWorkerPool_Entitlement(t *testing.T) { + var instance string + clusterName := fmt.Sprintf("tf-satellitecluster-%d", acctest.RandIntRange(10, 100)) + locationName := fmt.Sprintf("tf-satellitelocation-%d", acctest.RandIntRange(10, 100)) + operatingSystem := "REDHAT_8_64" + workerPoolName := fmt.Sprintf("tf-wp-%d", acctest.RandIntRange(10, 100)) + resource_prefix := "tf-satellite" + publicKey := acc.SatelliteSSHPubKey + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheckSatelliteSSH(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckSatelliteClusterWorkerPoolDestroy, + Steps: []resource.TestStep{ + + { + Config: testAccCheckSatelliteClusterWorkerPoolCreateEntitlement(clusterName, locationName, operatingSystem, workerPoolName, resource_prefix, publicKey), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckSatelliteClusterWorkerPoolExists("ibm_satellite_cluster_worker_pool.create_wp", instance), + resource.TestCheckResourceAttr("ibm_satellite_cluster.create_cluster", "name", clusterName), + resource.TestCheckResourceAttr("ibm_satellite_cluster_worker_pool.create_wp", "name", workerPoolName), + resource.TestCheckResourceAttr("ibm_satellite_cluster_worker_pool.create_wp", "operating_system", operatingSystem), + resource.TestCheckResourceAttr("data.ibm_satellite_cluster_worker_pool.read_created_wp", "openshift_license_source", "cloud_pak"), + ), + }, + }, + }) +} + func TestAccSatelliteClusterWorkerPool_Import(t *testing.T) { var instance string clusterName := fmt.Sprintf("tf-satellitecluster-%d", acctest.RandIntRange(10, 100)) @@ -262,3 +291,130 @@ func testAccCheckSatelliteClusterWorkerPoolCreate(clusterName, locationName, ope `, locationName, resource_prefix, resource_prefix, resource_prefix, resource_prefix, resource_prefix, clusterName, workerPoolName, operatingSystem) } + +func testAccCheckSatelliteClusterWorkerPoolCreateEntitlement(clusterName, locationName, operatingSystem, workerPoolName, resource_prefix, publicKey string) string { + return fmt.Sprintf(` + + variable "location_zones" { + description = "Allocate your hosts across these three zones" + type = list(string) + default = ["us-south-1", "us-south-2", "us-south-3"] + } + + resource "ibm_satellite_location" "location" { + location = "%s" + managed_from = "dal10" + zones = var.location_zones + coreos_enabled = true + } + + data "ibm_is_image" "rhel8" { + name = "ibm-redhat-8-8-minimal-amd64-2" + } + + data "ibm_satellite_attach_host_script" "script" { + location = ibm_satellite_location.location.id + labels = ["env:prod"] + host_provider = "ibm" + } + + data "ibm_resource_group" "resource_group" { + is_default = true + } + + resource "ibm_is_vpc" "satellite_vpc" { + name = "%s-vpc-1" + } + + resource "ibm_is_subnet" "satellite_subnet" { + count = 3 + + name = "%s-subnet-${count.index}" + vpc = ibm_is_vpc.satellite_vpc.id + total_ipv4_address_count = 256 + zone = "us-south-${count.index + 1}" + } + + resource "ibm_is_ssh_key" "satellite_ssh" { + name = "%s-ibm-ssh" + public_key = "%s" + } + + resource "ibm_is_instance" "satellite_instance" { + count = 3 + + name = "%s-instance-${count.index}" + vpc = ibm_is_vpc.satellite_vpc.id + zone = "us-south-${count.index + 1}" + image = data.ibm_is_image.rhel8.id + profile = "mx2-8x64" + keys = [ibm_is_ssh_key.satellite_ssh.id] + resource_group = data.ibm_resource_group.resource_group.id + user_data = data.ibm_satellite_attach_host_script.script.host_script + + primary_network_interface { + subnet = ibm_is_subnet.satellite_subnet[count.index].id + } + } + + resource "ibm_is_floating_ip" "satellite_ip" { + count = 3 + + name = "%s-fip-${count.index}" + target = ibm_is_instance.satellite_instance[count.index].primary_network_interface[0].id + } + + resource "ibm_satellite_host" "assign_host" { + count = 3 + + location = ibm_satellite_location.location.id + host_id = element(ibm_is_instance.satellite_instance[*].name, count.index) + labels = ["env:prod"] + zone = element(var.location_zones, count.index) + host_provider = "ibm" + } + + resource "ibm_satellite_cluster" "create_cluster" { + name = "%s" + location = ibm_satellite_location.location.id + enable_config_admin = true + kube_version = "4.13_openshift" + wait_for_worker_update = true + dynamic "zones" { + for_each = var.location_zones + content { + id = zones.value + } + } + default_worker_pool_labels = { + "test" = "test-pool1" + "test1" = "test-pool2" + } + } + + resource "ibm_satellite_cluster_worker_pool" "create_wp" { + name = "%s" + cluster = ibm_satellite_cluster.create_cluster.id + worker_count = 1 + host_labels = ["env:dev"] + operating_system = "%s" + entitlement = "cloud_pak" + dynamic "zones" { + for_each = var.location_zones + content { + id = zones.value + } + } + worker_pool_labels = { + "test" = "test-pool1" + "test1" = "test-pool2" + } + } + + data "ibm_satellite_cluster_worker_pool" "read_created_wp" { + name = ibm_satellite_cluster_worker_pool.create_wp.name + cluster = ibm_satellite_cluster.create_cluster.id + } + +`, locationName, resource_prefix, resource_prefix, resource_prefix, publicKey, resource_prefix, resource_prefix, clusterName, workerPoolName, operatingSystem) +} diff --git a/ibm/service/vpc/data_source_ibm_is_virtual_network_interface.go b/ibm/service/vpc/data_source_ibm_is_virtual_network_interface.go index 8fa399c599..181428db5f 100644 --- a/ibm/service/vpc/data_source_ibm_is_virtual_network_interface.go +++ b/ibm/service/vpc/data_source_ibm_is_virtual_network_interface.go @@ -8,7 +8,7 @@ import ( "fmt" "log" - "github.com/IBM/vpc-beta-go-sdk/vpcbetav1" + "github.com/IBM/vpc-go-sdk/vpcv1" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -339,16 +339,16 @@ func DataSourceIBMIsVirtualNetworkInterface() *schema.Resource { } func dataSourceIBMIsVirtualNetworkInterfaceRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - vpcbetaClient, err := meta.(conns.ClientSession).VpcV1BetaAPI() + vpcClient, err := meta.(conns.ClientSession).VpcV1API() if err != nil { return diag.FromErr(err) } - getVirtualNetworkInterfaceOptions := &vpcbetav1.GetVirtualNetworkInterfaceOptions{} + getVirtualNetworkInterfaceOptions := &vpcv1.GetVirtualNetworkInterfaceOptions{} getVirtualNetworkInterfaceOptions.SetID(d.Get("virtual_network_interface").(string)) - virtualNetworkInterface, response, err := vpcbetaClient.GetVirtualNetworkInterfaceWithContext(context, getVirtualNetworkInterfaceOptions) + virtualNetworkInterface, response, err := vpcClient.GetVirtualNetworkInterfaceWithContext(context, getVirtualNetworkInterfaceOptions) if err != nil { log.Printf("[DEBUG] GetVirtualNetworkInterfaceWithContext failed %s\n%s", err, response) return diag.FromErr(fmt.Errorf("GetVirtualNetworkInterfaceWithContext failed %s\n%s", err, response)) @@ -473,7 +473,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceRead(context context.Context, d *sche return nil } -func dataSourceIBMIsVirtualNetworkInterfaceReservedIPReferenceToMap(model *vpcbetav1.ReservedIPReference) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceReservedIPReferenceToMap(model *vpcv1.ReservedIPReference) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.Address != nil { modelMap["address"] = *model.Address @@ -500,7 +500,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceReservedIPReferenceToMap(model *vpcbe return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceReservedIPReferenceDeletedToMap(model *vpcbetav1.ReservedIPReferenceDeleted) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceReservedIPReferenceDeletedToMap(model *vpcv1.ReservedIPReferenceDeleted) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.MoreInfo != nil { modelMap["more_info"] = *model.MoreInfo @@ -508,7 +508,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceReservedIPReferenceDeletedToMap(model return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceResourceGroupReferenceToMap(model *vpcbetav1.ResourceGroupReference) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceResourceGroupReferenceToMap(model *vpcv1.ResourceGroupReference) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.Href != nil { modelMap["href"] = *model.Href @@ -522,7 +522,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceResourceGroupReferenceToMap(model *vp return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceSecurityGroupReferenceToMap(model *vpcbetav1.SecurityGroupReference) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceSecurityGroupReferenceToMap(model *vpcv1.SecurityGroupReference) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.CRN != nil { modelMap["crn"] = *model.CRN @@ -546,7 +546,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceSecurityGroupReferenceToMap(model *vp return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceSecurityGroupReferenceDeletedToMap(model *vpcbetav1.SecurityGroupReferenceDeleted) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceSecurityGroupReferenceDeletedToMap(model *vpcv1.SecurityGroupReferenceDeleted) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.MoreInfo != nil { modelMap["more_info"] = *model.MoreInfo @@ -554,7 +554,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceSecurityGroupReferenceDeletedToMap(mo return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceSubnetReferenceToMap(model *vpcbetav1.SubnetReference) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceSubnetReferenceToMap(model *vpcv1.SubnetReference) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.CRN != nil { modelMap["crn"] = *model.CRN @@ -581,7 +581,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceSubnetReferenceToMap(model *vpcbetav1 return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceSubnetReferenceDeletedToMap(model *vpcbetav1.SubnetReferenceDeleted) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceSubnetReferenceDeletedToMap(model *vpcv1.SubnetReferenceDeleted) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.MoreInfo != nil { modelMap["more_info"] = *model.MoreInfo @@ -589,12 +589,12 @@ func dataSourceIBMIsVirtualNetworkInterfaceSubnetReferenceDeletedToMap(model *vp return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceVirtualNetworkInterfaceTargetToMap(model vpcbetav1.VirtualNetworkInterfaceTargetIntf) (map[string]interface{}, error) { - if _, ok := model.(*vpcbetav1.VirtualNetworkInterfaceTargetShareMountTargetReference); ok { - return dataSourceIBMIsVirtualNetworkInterfaceVirtualNetworkInterfaceTargetShareMountTargetReferenceToMap(model.(*vpcbetav1.VirtualNetworkInterfaceTargetShareMountTargetReference)) - } else if _, ok := model.(*vpcbetav1.VirtualNetworkInterfaceTarget); ok { +func dataSourceIBMIsVirtualNetworkInterfaceVirtualNetworkInterfaceTargetToMap(model vpcv1.VirtualNetworkInterfaceTargetIntf) (map[string]interface{}, error) { + if _, ok := model.(*vpcv1.VirtualNetworkInterfaceTargetShareMountTargetReference); ok { + return dataSourceIBMIsVirtualNetworkInterfaceVirtualNetworkInterfaceTargetShareMountTargetReferenceToMap(model.(*vpcv1.VirtualNetworkInterfaceTargetShareMountTargetReference)) + } else if _, ok := model.(*vpcv1.VirtualNetworkInterfaceTarget); ok { modelMap := make(map[string]interface{}) - model := model.(*vpcbetav1.VirtualNetworkInterfaceTarget) + model := model.(*vpcv1.VirtualNetworkInterfaceTarget) if model.Deleted != nil { deletedMap, err := dataSourceIBMIsVirtualNetworkInterfaceShareMountTargetReferenceDeletedToMap(model.Deleted) if err != nil { @@ -616,11 +616,11 @@ func dataSourceIBMIsVirtualNetworkInterfaceVirtualNetworkInterfaceTargetToMap(mo } return modelMap, nil } else { - return nil, fmt.Errorf("Unrecognized vpcbetav1.VirtualNetworkInterfaceTargetIntf subtype encountered") + return nil, fmt.Errorf("Unrecognized vpcv1.VirtualNetworkInterfaceTargetIntf subtype encountered") } } -func dataSourceIBMIsVirtualNetworkInterfaceShareMountTargetReferenceDeletedToMap(model *vpcbetav1.ShareMountTargetReferenceDeleted) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceShareMountTargetReferenceDeletedToMap(model *vpcv1.ShareMountTargetReferenceDeleted) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.MoreInfo != nil { modelMap["more_info"] = *model.MoreInfo @@ -628,7 +628,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceShareMountTargetReferenceDeletedToMap return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceVirtualNetworkInterfaceTargetShareMountTargetReferenceToMap(model *vpcbetav1.VirtualNetworkInterfaceTargetShareMountTargetReference) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceVirtualNetworkInterfaceTargetShareMountTargetReferenceToMap(model *vpcv1.VirtualNetworkInterfaceTargetShareMountTargetReference) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.Deleted != nil { deletedMap, err := dataSourceIBMIsVirtualNetworkInterfaceShareMountTargetReferenceDeletedToMap(model.Deleted) @@ -652,7 +652,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceVirtualNetworkInterfaceTargetShareMou return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceVPCReferenceToMap(model *vpcbetav1.VPCReference) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceVPCReferenceToMap(model *vpcv1.VPCReference) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.CRN != nil { modelMap["crn"] = *model.CRN @@ -679,7 +679,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceVPCReferenceToMap(model *vpcbetav1.VP return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceVPCReferenceDeletedToMap(model *vpcbetav1.VPCReferenceDeleted) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceVPCReferenceDeletedToMap(model *vpcv1.VPCReferenceDeleted) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.MoreInfo != nil { modelMap["more_info"] = *model.MoreInfo @@ -687,7 +687,7 @@ func dataSourceIBMIsVirtualNetworkInterfaceVPCReferenceDeletedToMap(model *vpcbe return modelMap, nil } -func dataSourceIBMIsVirtualNetworkInterfaceZoneReferenceToMap(model *vpcbetav1.ZoneReference) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfaceZoneReferenceToMap(model *vpcv1.ZoneReference) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.Href != nil { modelMap["href"] = *model.Href diff --git a/ibm/service/vpc/data_source_ibm_is_virtual_network_interfaces.go b/ibm/service/vpc/data_source_ibm_is_virtual_network_interfaces.go index de054c2c45..8705e323cb 100644 --- a/ibm/service/vpc/data_source_ibm_is_virtual_network_interfaces.go +++ b/ibm/service/vpc/data_source_ibm_is_virtual_network_interfaces.go @@ -9,7 +9,7 @@ import ( "log" "time" - "github.com/IBM/vpc-beta-go-sdk/vpcbetav1" + "github.com/IBM/vpc-go-sdk/vpcv1" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -344,40 +344,42 @@ func DataSourceIBMIsVirtualNetworkInterfaces() *schema.Resource { }, }, }, + "resource_group": { + Type: schema.TypeString, + Optional: true, + Description: "The unique identifier of the resource group these virtual network interfaces belong to", + }, }, } } func dataSourceIBMIsVirtualNetworkInterfacesRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - vpcbetaClient, err := meta.(conns.ClientSession).VpcV1BetaAPI() + vpcClient, err := meta.(conns.ClientSession).VpcV1API() if err != nil { return diag.FromErr(err) } - listVirtualNetworkInterfacesOptions := &vpcbetav1.ListVirtualNetworkInterfacesOptions{} - - vniCollection, response, err := vpcbetaClient.ListVirtualNetworkInterfacesWithContext(context, listVirtualNetworkInterfacesOptions) - //log.Printf(len(vniCollection.VirtualNetworkInterfaces)) + listVirtualNetworkInterfacesOptions := &vpcv1.ListVirtualNetworkInterfacesOptions{} + if resgroupintf, ok := d.GetOk("resource_group"); ok { + resGroup := resgroupintf.(string) + listVirtualNetworkInterfacesOptions.ResourceGroupID = &resGroup + } + var pager *vpcv1.VirtualNetworkInterfacesPager + pager, err = vpcClient.NewVirtualNetworkInterfacesPager(listVirtualNetworkInterfacesOptions) if err != nil { - log.Printf("[DEBUG] VirtualNetworkInterfacesPager.GetAll() failed %s\n%s", err, response) - return diag.FromErr(fmt.Errorf("VirtualNetworkInterfacesPager.GetAll() failed %s\n%s", err, response)) + return diag.FromErr(err) } - // var pager *vpcbetav1.VirtualNetworkInterfacesPager - // pager, err = vpcbetaClient.NewVirtualNetworkInterfacesPager(listVirtualNetworkInterfacesOptions) - // if err != nil { - // return diag.FromErr(err) - // } - // allItems, err := pager.GetAll() - // if err != nil { - // log.Printf("[DEBUG] VirtualNetworkInterfacesPager.GetAll() failed %s", err) - // return diag.FromErr(fmt.Errorf("VirtualNetworkInterfacesPager.GetAll() failed %s", err)) - // } + allItems, err := pager.GetAll() + if err != nil { + log.Printf("[DEBUG] VirtualNetworkInterfacesPager.GetAll() failed %s", err) + return diag.FromErr(fmt.Errorf("VirtualNetworkInterfacesPager.GetAll() failed %s", err)) + } d.SetId(dataSourceIBMIsVirtualNetworkInterfacesID(d)) mapSlice := []map[string]interface{}{} - for _, modelItem := range vniCollection.VirtualNetworkInterfaces { + for _, modelItem := range allItems { modelMap, err := dataSourceIBMIsVirtualNetworkInterfacesVirtualNetworkInterfaceToMap(&modelItem) if err != nil { return diag.FromErr(err) @@ -397,7 +399,7 @@ func dataSourceIBMIsVirtualNetworkInterfacesID(d *schema.ResourceData) string { return time.Now().UTC().String() } -func dataSourceIBMIsVirtualNetworkInterfacesVirtualNetworkInterfaceToMap(model *vpcbetav1.VirtualNetworkInterface) (map[string]interface{}, error) { +func dataSourceIBMIsVirtualNetworkInterfacesVirtualNetworkInterfaceToMap(model *vpcv1.VirtualNetworkInterface) (map[string]interface{}, error) { modelMap := make(map[string]interface{}) if model.AutoDelete != nil { modelMap["auto_delete"] = *model.AutoDelete diff --git a/ibm/service/vpc/resource_ibm_is_security_group_target.go b/ibm/service/vpc/resource_ibm_is_security_group_target.go index 857ebccbf9..43f6a5754c 100644 --- a/ibm/service/vpc/resource_ibm_is_security_group_target.go +++ b/ibm/service/vpc/resource_ibm_is_security_group_target.go @@ -12,7 +12,6 @@ import ( "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/validate" - "github.com/IBM/vpc-beta-go-sdk/vpcbetav1" "github.com/IBM/vpc-go-sdk/vpcv1" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -127,7 +126,7 @@ func resourceIBMISSecurityGroupTargetCreate(d *schema.ResourceData, meta interfa return errsgt } } else if crn != nil && *crn != "" && strings.Contains(*crn, "virtual_network_interfaces") { - vpcClient, err := meta.(conns.ClientSession).VpcV1BetaAPI() + vpcClient, err := meta.(conns.ClientSession).VpcV1API() if err != nil { return err } @@ -338,7 +337,7 @@ func isLBSgTargetRefreshFunc(sess *vpcv1.VpcV1, lbId string) resource.StateRefre } } -func isWaitForVNISgTargetCreateAvailable(sess *vpcbetav1.VpcbetaV1, vniId string, timeout time.Duration) (interface{}, error) { +func isWaitForVNISgTargetCreateAvailable(sess *vpcv1.VpcV1, vniId string, timeout time.Duration) (interface{}, error) { log.Printf("Waiting for virtual network interface (%s) to be available.", vniId) stateConf := &resource.StateChangeConf{ @@ -353,10 +352,10 @@ func isWaitForVNISgTargetCreateAvailable(sess *vpcbetav1.VpcbetaV1, vniId string return stateConf.WaitForState() } -func isVNISgTargetRefreshFunc(vpcClient *vpcbetav1.VpcbetaV1, vniId string) resource.StateRefreshFunc { +func isVNISgTargetRefreshFunc(vpcClient *vpcv1.VpcV1, vniId string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - getVNIOptions := &vpcbetav1.GetVirtualNetworkInterfaceOptions{ + getVNIOptions := &vpcv1.GetVirtualNetworkInterfaceOptions{ ID: &vniId, } vni, response, err := vpcClient.GetVirtualNetworkInterface(getVNIOptions) diff --git a/ibm/service/vpc/resource_ibm_is_vpn_gateway.go b/ibm/service/vpc/resource_ibm_is_vpn_gateway.go index d2d25a5e20..96a617ff0f 100644 --- a/ibm/service/vpc/resource_ibm_is_vpn_gateway.go +++ b/ibm/service/vpc/resource_ibm_is_vpn_gateway.go @@ -566,8 +566,8 @@ func vpngwGet(d *schema.ResourceData, meta interface{}, id string) error { d.Set(flex.ResourceCRN, *vpnGateway.CRN) d.Set(isVPNGatewayCRN, *vpnGateway.CRN) if vpnGateway.ResourceGroup != nil { - d.Set(flex.ResourceGroupName, *vpnGateway.ResourceGroup.Name) - d.Set(isVPNGatewayResourceGroup, *vpnGateway.ResourceGroup.ID) + d.Set(flex.ResourceGroupName, vpnGateway.ResourceGroup.Name) + d.Set(isVPNGatewayResourceGroup, vpnGateway.ResourceGroup.ID) } d.Set(isVPNGatewayMode, *vpnGateway.Mode) if vpnGateway.Members != nil { diff --git a/version/version.go b/version/version.go index df2bae8a6f..f1071a21bf 100644 --- a/version/version.go +++ b/version/version.go @@ -5,7 +5,7 @@ import ( ) // Version is the current provider main version -const Version = "1.59.0" +const Version = "1.60.0-beta0" // GitCommit is the git commit that was compiled. This will be filled in by the compiler. var GitCommit string diff --git a/website/docs/d/cd_toolchain_tool_securitycompliance.html.markdown b/website/docs/d/cd_toolchain_tool_securitycompliance.html.markdown index 81fdc56c58..bf3493ad3e 100644 --- a/website/docs/d/cd_toolchain_tool_securitycompliance.html.markdown +++ b/website/docs/d/cd_toolchain_tool_securitycompliance.html.markdown @@ -44,8 +44,6 @@ After your data source is created, you can read values from the following attrib * `parameters` - (List) Unique key-value pairs representing parameters to be used to create the tool. A list of parameters for each tool integration can be found in the Configuring tool integrations page. Nested schema for **parameters**: - * `api_key` - (Deprecated, String) The IBM Cloud API key used to access the Security and Compliance Center API. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter. You can use a toolchain secret reference for this parameter. For more information, see [Protecting your sensitive data in Continuous Delivery](https://cloud.ibm.com/docs/ContinuousDelivery?topic=ContinuousDelivery-cd_data_security#cd_secure_credentials). - * Constraints: The value must match regular expression `/\\S/`. * `attachment_id` - (String) An attachment ID. An attachment is configured under a profile to define how a scan will be run. To find the attachment ID, in the browser, in the attachments list, click on the attachment link, and a panel appears with a button to copy the attachment ID. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. * Constraints: The value must match regular expression `/^[-0-9a-f]{32,36}$/`. * `evidence_namespace` - (String) The kind of pipeline evidence to be displayed in Security and Compliance Center for this toolchain. The values are; `cd` which will use evidence generated by a Continuous Deployment pipeline, or `cc` which will use evidence generated by a Continuous Compliance pipeline. @@ -54,13 +52,9 @@ Nested schema for **parameters**: * `instance_crn` - (String) The Security and Compliance Center service instance CRN (Cloud Resource Name). It is recommended to provide an instance CRN, but when absent, the oldest service instance will be used. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. * Constraints: The value must match regular expression `/^crn:v1:(?:bluemix|staging):public:compliance:[a-zA-Z0-9-]*\\b:a\/[0-9a-fA-F]*\\b:[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}\\b::$/`. * `name` - (String) The name for this tool integration, shown on the toolchain page. - * `profile` - (Deprecated, String) The name of a Security and Compliance Center, Hybrid cloud profile. Usually, use the predefined profile "IBM Cloud Security Best Practices v1.0.0", which contains the DevSecOps toolchain goals. Or use a user-authored customized profile that has been configured to contain those goals. When the `trigger_scan` parameter is set to `enabled`, then the Validation scan will use the controls and goals in the configured profile. If configured with a profile that does not check the DevSecOps toolchain goals, it might incorrectly indicate that the toolchain status is passed even though some of the DevSecOps scans had actually failed. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter. - * `profile_name` - (String) The name of a Security and Compliance Center profile. Usually, use one of the predefined profiles "IBM Cloud Security Best Practices" or "IBM Cloud for Financial Services", which contain the DevSecOps Toolchain rules. Or use a user-authored customized profile that has been configured to contain those rules. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. + * `profile_name` - (String) The name of a Security and Compliance Center profile. Usually, use the "IBM Cloud Framework for Financial Services" predefined profile, which contains the DevSecOps Toolchain rules. Or use a user-authored customized profile that has been configured to contain those rules. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. * `profile_version` - (String) The version of a Security and Compliance Center profile, in SemVer format, like '0.0.0'. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. * `scc_api_key` - (String) The IBM Cloud API key used to access the Security and Compliance Center service, for the use profile with attachment setting. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. You can use a toolchain secret reference for this parameter. For more information, see [Protecting your sensitive data in Continuous Delivery](https://cloud.ibm.com/docs/ContinuousDelivery?topic=ContinuousDelivery-cd_data_security#cd_secure_credentials). - * `scope` - (Deprecated, String) The name of a Security and Compliance Center scope, which has previously been created in that service. When the `trigger_scan` parameter is set to `enabled`, then the Validation scan will scan all the resources in that scope. Select a scope that contains this toolchain, so that the scan will find the evidence that has been recently updated by the DevSecOps pipeline-run. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter. - * `trigger_scan` - (Deprecated, String) Set to `enabled` to indicate that a DevSecOps pipeline task should trigger a Security and Compliance Center run of a Hybrid cloud validation scan. Note, each scan may incur charges. When enabled, other parameters become relevant that are needed to trigger that scan; `api_key`, `scope`, `profile`. Hybrid cloud scans are deprecated and are planned to be removed. This option will stop working at that time. For more information see the [Security and Compliance Center Release Notes](https://cloud.ibm.com/docs/security-compliance?topic=security-compliance-release-notes#security-compliance-march312023). - * Constraints: Allowable values are: `disabled`, `enabled`. * `use_profile_attachment` - (String) Set to `enabled` to enable use profile with attachment, so that the scripts in the pipeline can interact with the Security and Compliance Center service. When enabled, other parameters become relevant; `scc_api_key`, `instance_crn`, `profile_name`, `profile_version`, `attachment_id`. * Constraints: Allowable values are: `disabled`, `enabled`. diff --git a/website/docs/d/iam_access_group_policy.html.markdown b/website/docs/d/iam_access_group_policy.html.markdown index cc6c9c6308..147f408b13 100644 --- a/website/docs/d/iam_access_group_policy.html.markdown +++ b/website/docs/d/iam_access_group_policy.html.markdown @@ -76,7 +76,13 @@ In addition to all argument reference list, you can access the following attribu Nested schema for `rule_conditions`: - `key` - (String) The key of a rule condition. - `operator` - (String) The operator of a rule condition. - - `value` - (List of Strings) The valjue of a rule condition. + - `value` - (List of Strings) The value of a rule condition. + - `conditions` - (List of Objects) A nested block describing additional rule conditions of this policy. + + Nested schema for `conditions`: + - `key` - (String) The key of a condition. + - `operator` - (String) The operator of a condition. + - `value` - (List of Strings) The value of a condition. - `rule_operator` - (String) The operator used to evaluate multiple rule conditions, e.g., all must be satisfied with `and`. - `pattern` - (String) The pattern that the rule follows, e.g., `time-based-conditions:weekly:all-day`. diff --git a/website/docs/d/iam_service_policy.html.markdown b/website/docs/d/iam_service_policy.html.markdown index d3b66757bc..ce36e8d94a 100644 --- a/website/docs/d/iam_service_policy.html.markdown +++ b/website/docs/d/iam_service_policy.html.markdown @@ -74,7 +74,13 @@ In addition to all argument reference list, you can access the following attribu Nested schema for `rule_conditions`: - `key` - (String) The key of a rule condition. - `operator` - (String) The operator of a rule condition. - - `value` - (List of Strings) The valjue of a rule condition. + - `value` - (List of Strings) The value of a rule condition. + - `conditions` - (List of Objects) A nested block describing additional rule conditions of this policy. + + Nested schema for `conditions`: + - `key` - (String) The key of a condition. + - `operator` - (String) The operator of a condition. + - `value` - (List of Strings) The value of a condition. - `rule_operator` - (String) The operator used to evaluate multiple rule conditions, e.g., all must be satisfied with `and`. - `pattern` - (String) The pattern that the rule follows, e.g., `time-based-conditions:weekly:all-day`. diff --git a/website/docs/d/iam_trusted_profile_policy.html.markdown b/website/docs/d/iam_trusted_profile_policy.html.markdown index d6cf4346b1..0a1c93d222 100644 --- a/website/docs/d/iam_trusted_profile_policy.html.markdown +++ b/website/docs/d/iam_trusted_profile_policy.html.markdown @@ -75,7 +75,13 @@ In addition to all argument reference list, you can access the following attribu Nested schema for `rule_conditions`: - `key` - (String) The key of a rule condition. - `operator` - (String) The operator of a rule condition. - - `value` - (List of Strings) The valjue of a rule condition. + - `value` - (List of Strings) The value of a rule condition. + - `conditions` - (List of Objects) A nested block describing additional rule conditions of this policy. + + Nested schema for `conditions`: + - `key` - (String) The key of a condition. + - `operator` - (String) The operator of a condition. + - `value` - (List of Strings) The value of a condition. - `rule_operator` - (String) The operator used to evaluate multiple rule conditions, e.g., all must be satisfied with `and`. - `pattern` - (String) The pattern that the rule follows, e.g., `time-based-conditions:weekly:all-day`. diff --git a/website/docs/d/iam_user_policy.html.markdown b/website/docs/d/iam_user_policy.html.markdown index 8a9cfb2a36..78110fcdbc 100644 --- a/website/docs/d/iam_user_policy.html.markdown +++ b/website/docs/d/iam_user_policy.html.markdown @@ -72,7 +72,13 @@ In addition to all argument reference list, you can access the following attribu Nested schema for `rule_conditions`: - `key` - (String) The key of a rule condition. - `operator` - (String) The operator of a rule condition. - - `value` - (List of Strings) The valjue of a rule condition. + - `value` - (List of Strings) The value of a rule condition. + - `conditions` - (List of Objects) A nested block describing additional rule conditions of this policy. + + Nested schema for `conditions`: + - `key` - (String) The key of a condition. + - `operator` - (String) The operator of a condition. + - `value` - (List of Strings) The value of a condition. - `rule_operator` - (String) The operator used to evaluate multiple rule conditions, e.g., all must be satisfied with `and`. - `pattern` - (String) The pattern that the rule follows, e.g., `time-based-conditions:weekly:all-day`. diff --git a/website/docs/d/project.html.markdown b/website/docs/d/project.html.markdown new file mode 100644 index 0000000000..3ac6b811d3 --- /dev/null +++ b/website/docs/d/project.html.markdown @@ -0,0 +1,129 @@ +--- +layout: "ibm" +page_title: "IBM : ibm_project" +description: |- + Get information about project +subcategory: "Projects" +--- + +# ibm_project + +Provides a read-only data source to retrieve information about a project. You can then reference the fields of the data source in other resources within the same configuration by using interpolation syntax. + +## Example Usage + +```hcl +data "ibm_project" "project" { + project_id = ibm_project.project_instance.id +} +``` + +## Argument Reference + +You can specify the following arguments for this data source. + +* `project_id` - (Required, Forces new resource, String) The unique project ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + +## Attribute Reference + +After your data source is created, you can read values from the following attributes. + +* `id` - The unique identifier of the project. +* `configs` - (List) The project configurations. These configurations are only included in the response of creating a project if a configs array is specified in the request payload. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +Nested schema for **configs**: + * `created_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + * `definition` - (List) The name and description of a project configuration. + Nested schema for **definition**: + * `description` - (String) A project configuration description. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `name` - (String) The configuration name. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^[a-zA-Z0-9][a-zA-Z0-9-_ ]*$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `modified_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + * `project` - (List) The project referenced by this resource. + Nested schema for **project**: + * `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + * `definition` - (List) The definition of the project reference. + Nested schema for **definition**: + * `name` - (String) The name of the project. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `state` - (String) The state of the configuration. + * Constraints: Allowable values are: `approved`, `deleted`, `deleting`, `deleting_failed`, `discarded`, `draft`, `deployed`, `deploying_failed`, `deploying`, `superseded`, `undeploying`, `undeploying_failed`, `validated`, `validating`, `validating_failed`. + * `version` - (Integer) The version of the configuration. + +* `created_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + +* `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + +* `cumulative_needs_attention_view` - (List) The cumulative list of needs attention items for a project. If the view is successfully retrieved, an array which could be empty is returned. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +Nested schema for **cumulative_needs_attention_view**: + * `config_id` - (String) A unique ID for the configuration. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `config_version` - (Integer) The version number of the configuration. + * `event` - (String) The event name. + * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]*$/`. + * `event_id` - (String) A unique ID for that individual event. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + +* `cumulative_needs_attention_view_error` - (Boolean) True indicates that the fetch of the needs attention items failed. It only exists if there was an error while retrieving the cumulative needs attention view. + * Constraints: The default value is `false`. + +* `definition` - (List) The definition of the project. +Nested schema for **definition**: + * `description` - (String) A brief explanation of the project's use in the configuration of a deployable architecture. It is possible to create a project without providing a description. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `destroy_on_delete` - (Boolean) The policy that indicates whether the resources are destroyed or not when a project is deleted. + * `name` - (String) The name of the project. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + +* `environments` - (List) The project environments. These environments are only included in the response if project environments were created on the project. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +Nested schema for **environments**: + * `created_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + * `definition` - (List) The environment definition used in the project collection. + Nested schema for **definition**: + * `description` - (String) The description of the environment. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `name` - (String) The name of the environment. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The environment id as a friendly name. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. + * `project` - (List) The project referenced by this resource. + Nested schema for **project**: + * `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + * `definition` - (List) The definition of the project reference. + Nested schema for **definition**: + * `name` - (String) The name of the project. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + +* `event_notifications_crn` - (String) The CRN of the event notifications instance if one is connected to this project. + * Constraints: The maximum length is `512` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + +* `location` - (Forces new resource, String) The IBM Cloud location where a resource is deployed. + * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]*$/`. + +* `resource_group` - (Forces new resource, String) The resource group where the project's data and tools are created. + * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]*$/`. + +* `state` - (String) The project status value. + * Constraints: Allowable values are: `ready`, `deleting`, `deleting_failed`. + diff --git a/website/docs/d/project_config.html.markdown b/website/docs/d/project_config.html.markdown new file mode 100644 index 0000000000..5cfedd0d20 --- /dev/null +++ b/website/docs/d/project_config.html.markdown @@ -0,0 +1,117 @@ +--- +layout: "ibm" +page_title: "IBM : ibm_project_config" +description: |- + Get information about project_config +subcategory: "Projects" +--- + +# ibm_project_config + +Provides a read-only data source to retrieve information about a project_config. You can then reference the fields of the data source in other resources within the same configuration by using interpolation syntax. + +## Example Usage + +```hcl +data "ibm_project_config" "project_config" { + project_config_id = ibm_project_config.project_config_instance.project_config_id + project_id = ibm_project_config.project_config_instance.project_id +} +``` + +## Argument Reference + +You can specify the following arguments for this data source. + +* `project_config_id` - (Required, Forces new resource, String) The unique config ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. +* `project_id` - (Required, Forces new resource, String) The unique project ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + +## Attribute Reference + +After your data source is created, you can read values from the following attributes. + +* `id` - The unique identifier of the project_config. +* `created_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + +* `definition` - (List) The type and output of a project configuration. +Nested schema for **definition**: + * `authorizations` - (List) The authorization details. You can authorize by using a trusted profile or an API key in Secrets Manager. + Nested schema for **authorizations**: + * `api_key` - (String) The IBM Cloud API Key. + * Constraints: The maximum length is `512` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^`<>\\x00-\\x1F]*$/`. + * `method` - (String) The authorization method. You can authorize by using a trusted profile or an API key in Secrets Manager. + * Constraints: Allowable values are: `api_key`, `trusted_profile`. + * `trusted_profile_id` - (String) The trusted profile ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `compliance_profile` - (List) The profile required for compliance. + Nested schema for **compliance_profile**: + * `attachment_id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `instance_id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `instance_location` - (String) The location of the compliance instance. + * Constraints: The maximum length is `12` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(us-south|us-east|eu-gb|eu-de)$/`. + * `profile_name` - (String) The name of the compliance profile. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^`<>\\x00-\\x1F]*$/`. + * `description` - (String) A project configuration description. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `environment` - (String) The ID of the project environment. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `inputs` - (List) The input variables for configuration definition and environment. + Nested schema for **inputs**: + * `locator_id` - (Forces new resource, String) A dotted value of catalogID.versionID. + * Constraints: The maximum length is `512` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[\\.0-9a-z-A-Z_-]+$/`. + * `name` - (String) The configuration name. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^[a-zA-Z0-9][a-zA-Z0-9-_ ]*$/`. + * `settings` - (List) Schematics environment variables to use to deploy the configuration.Settings are only available if they were specified when the configuration was initially created. + Nested schema for **settings**: + * `type` - (String) The type of a project configuration manual property. + * Constraints: Allowable values are: `terraform_template`, `schematics_blueprint`. + +* `is_draft` - (Boolean) The flag that indicates whether the version of the configuration is draft, or active. + +* `last_saved_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + +* `modified_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + +* `needs_attention_state` - (List) The needs attention state of a configuration. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. + +* `outputs` - (List) The outputs of a Schematics template property. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +Nested schema for **outputs**: + * `description` - (String) A short explanation of the output value. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `name` - (String) The variable name. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. + * `value` - (String) Can be any value - a string, number, boolean, array, or object. + +* `project` - (List) The project referenced by this resource. +Nested schema for **project**: + * `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + * `definition` - (List) The definition of the project reference. + Nested schema for **definition**: + * `name` - (String) The name of the project. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + +* `schematics` - (List) A schematics workspace associated to a project configuration. +Nested schema for **schematics**: + * `workspace_crn` - (String) An existing schematics workspace CRN. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + +* `state` - (String) The state of the configuration. + * Constraints: Allowable values are: `approved`, `deleted`, `deleting`, `deleting_failed`, `discarded`, `draft`, `deployed`, `deploying_failed`, `deploying`, `superseded`, `undeploying`, `undeploying_failed`, `validated`, `validating`, `validating_failed`. + +* `update_available` - (Boolean) The flag that indicates whether a configuration update is available. + +* `version` - (Integer) The version of the configuration. + diff --git a/website/docs/d/project_event_notification.html.markdown b/website/docs/d/project_event_notification.html.markdown deleted file mode 100644 index 6818a34bc8..0000000000 --- a/website/docs/d/project_event_notification.html.markdown +++ /dev/null @@ -1,107 +0,0 @@ ---- -layout: "ibm" -page_title: "IBM : ibm_project_event_notification" -description: |- - Get information about Project definition -subcategory: "Project" ---- - -# ibm_project_event_notification - -Provides a read-only data source for Project definition. You can then reference the fields of the data source in other resources within the same configuration using interpolation syntax. - -## Example Usage - -```hcl -data "ibm_project_event_notification" "project_event_notification" { - id = "072b70cb-4db7-4c5c-bf1b-8d93d422537d" -} -``` - -## Argument Reference - -Review the argument reference that you can specify for your data source. - -* `id` - (Required, Forces new resource, String) The unique project ID. - * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. - -## Attribute Reference - -In addition to all argument references listed, you can access the following attribute references after your data source is created. - -* `id` - The unique identifier of the Project definition. -* `configs` - (List) The project configurations. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. -Nested scheme for **configs**: - * `description` - (String) The project configuration description. - * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. - * `id` - (String) The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration. - * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. - * `input` - (List) The outputs of a Schematics template property. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. - Nested scheme for **input**: - * `name` - (String) The variable name. - * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. - * `required` - (Boolean) Whether the variable is required or not. - * `type` - (String) The variable type. - * Constraints: Allowable values are: `array`, `boolean`, `float`, `int`, `number`, `password`, `string`, `object`. - * `value` - (String) Can be any value - a string, number, boolean, array, or object. - * `labels` - (List) A collection of configuration labels. - * Constraints: The list items must match regular expression `/^[_\\-a-z0-9:\/=]+$/`. The maximum length is `10000` items. The minimum length is `0` items. - * `locator_id` - (String) A dotted value of catalogID.versionID. - * Constraints: The maximum length is `512` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[\\.0-9a-z-A-Z_-]+$/`. - * `name` - (String) The configuration name. - * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^[a-zA-Z0-9][a-zA-Z0-9-_ ]*$/`. - * `output` - (List) The outputs of a Schematics template property. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. - Nested scheme for **output**: - * `description` - (String) A short explanation of the output value. - * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. - * `name` - (String) The variable name. - * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. - * `value` - (String) Can be any value - a string, number, boolean, array, or object. - * `setting` - (List) Schematics environment variables to use to deploy the configuration. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. - Nested scheme for **setting**: - * `name` - (String) The name of the configuration setting. - * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. - * `value` - (String) The value of the configuration setting. - * Constraints: The maximum length is `1024` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. - * `type` - (String) The type of a project configuration manual property. - * Constraints: Allowable values are: `terraform_template`, `schematics_blueprint`. - -* `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. - * Constraints: The maximum length is `512` characters. The minimum length is `9` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. - -* `description` - (String) A project descriptive text. - * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. - -* `metadata` - (List) The metadata of the project. -Nested scheme for **metadata**: - * `created_at` - (String) A date and time value in the format `YYYY-MM-DDTHH:mm:ssZ` or `YYYY-MM-DDTHH:mm:ss.sssZ`, matching the date and time format as specified by RFC 3339. - * `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. - * Constraints: The maximum length is `512` characters. The minimum length is `9` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. - * `cumulative_needs_attention_view` - (List) The cumulative list of needs attention items for a project. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. - Nested scheme for **cumulative_needs_attention_view**: - * `config_id` - (String) The unique ID of a project. - * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. - * `config_version` - (Integer) The version number of the configuration. - * `event` - (String) The event name. - * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - * `event_id` - (String) The unique ID of a project. - * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. - * `cumulative_needs_attention_view_err` - (String) `True` indicates that the fetch of the needs attention items failed. - * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - * `event_notifications_crn` - (String) The CRN of the event notifications instance if one is connected to this project. - * Constraints: The maximum length is `512` characters. The minimum length is `9` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. - * `location` - (String) The IBM Cloud location where a resource is deployed. - * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - * `resource_group` - (String) The resource group where the project's data and tools are created. - * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - * `state` - (String) The project status value. - * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(CREATING|CREATING_FAILED|UPDATING|UPDATING_FAILED|READY)$/`. - -* `name` - (String) The project name. - * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]+$/`. - diff --git a/website/docs/d/satellite_cluster_worker_pool.html.markdown b/website/docs/d/satellite_cluster_worker_pool.html.markdown index e8030c7eec..b1b4be49e0 100644 --- a/website/docs/d/satellite_cluster_worker_pool.html.markdown +++ b/website/docs/d/satellite_cluster_worker_pool.html.markdown @@ -49,3 +49,4 @@ In addition to all argument references list, you can access the following attrib - `isolation` - (String) Isolation of the worker node. - `auto_scale_enabled` - (String) Enable auto scalling for worker pool. - `worker_count` - (String) The number of workers that are attached. +- `openshift_license_source` - (String) The license source for OpenShift. diff --git a/website/docs/r/cd_toolchain_tool_securitycompliance.html.markdown b/website/docs/r/cd_toolchain_tool_securitycompliance.html.markdown index 477862aeb4..47011c756e 100644 --- a/website/docs/r/cd_toolchain_tool_securitycompliance.html.markdown +++ b/website/docs/r/cd_toolchain_tool_securitycompliance.html.markdown @@ -33,23 +33,17 @@ You can specify the following arguments for this resource. * Constraints: The maximum length is `128` characters. The minimum length is `0` characters. The value must match regular expression `/^([^\\x00-\\x7F]|[a-zA-Z0-9-._ ])+$/`. * `parameters` - (Required, List) Unique key-value pairs representing parameters to be used to create the tool. A list of parameters for each tool integration can be found in the Configuring tool integrations page. Nested schema for **parameters**: - * `api_key` - (Deprecated, Optional, String) The IBM Cloud API key used to access the Security and Compliance Center API. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter. You can use a toolchain secret reference for this parameter. For more information, see [Protecting your sensitive data in Continuous Delivery](https://cloud.ibm.com/docs/ContinuousDelivery?topic=ContinuousDelivery-cd_data_security#cd_secure_credentials). - * Constraints: The value must match regular expression `/\\S/`. * `attachment_id` - (Optional, String) An attachment ID. An attachment is configured under a profile to define how a scan will be run. To find the attachment ID, in the browser, in the attachments list, click on the attachment link, and a panel appears with a button to copy the attachment ID. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. * Constraints: The value must match regular expression `/^[-0-9a-f]{32,36}$/`. - * `evidence_namespace` - (Required, String) The kind of pipeline evidence to be displayed in Security and Compliance Center for this toolchain. The values are; `cd` which will use evidence generated by a Continuous Deployment pipeline, or `cc` which will use evidence generated by a Continuous Compliance pipeline. + * `evidence_namespace` - (Optional, String) The kind of pipeline evidence to be displayed in Security and Compliance Center for this toolchain. The values are; `cd` which will use evidence generated by a Continuous Deployment pipeline, or `cc` which will use evidence generated by a Continuous Compliance pipeline. * Constraints: Allowable values are: `cd`, `cc`. * `evidence_repo_url` - (Required, String) The URL to a Git repository evidence locker. The DevSecOps toolchain templates will collect and store evidence for scans and tasks in an evidence repository. This evidence URL should match the `repo_url` for a Git tool integration in this toolchain. The DevSecOps toolchain goals in the Security and Compliance Center will check the evidence repository for the pass or fail results for those goals. * `instance_crn` - (Optional, String) The Security and Compliance Center service instance CRN (Cloud Resource Name). It is recommended to provide an instance CRN, but when absent, the oldest service instance will be used. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. * Constraints: The value must match regular expression `/^crn:v1:(?:bluemix|staging):public:compliance:[a-zA-Z0-9-]*\\b:a\/[0-9a-fA-F]*\\b:[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}\\b::$/`. * `name` - (Required, String) The name for this tool integration, shown on the toolchain page. - * `profile` - (Deprecated, Optional, String) The name of a Security and Compliance Center, Hybrid cloud profile. Usually, use the predefined profile "IBM Cloud Security Best Practices v1.0.0", which contains the DevSecOps toolchain goals. Or use a user-authored customized profile that has been configured to contain those goals. When the `trigger_scan` parameter is set to `enabled`, then the Validation scan will use the controls and goals in the configured profile. If configured with a profile that does not check the DevSecOps toolchain goals, it might incorrectly indicate that the toolchain status is passed even though some of the DevSecOps scans had actually failed. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter. - * `profile_name` - (Optional, String) The name of a Security and Compliance Center profile. Usually, use one of the predefined profiles "IBM Cloud Security Best Practices" or "IBM Cloud for Financial Services", which contain the DevSecOps Toolchain rules. Or use a user-authored customized profile that has been configured to contain those rules. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. + * `profile_name` - (Optional, String) The name of a Security and Compliance Center profile. Usually, use the "IBM Cloud Framework for Financial Services" predefined profile, which contains the DevSecOps Toolchain rules. Or use a user-authored customized profile that has been configured to contain those rules. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. * `profile_version` - (Optional, String) The version of a Security and Compliance Center profile, in SemVer format, like '0.0.0'. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. * `scc_api_key` - (Optional, String) The IBM Cloud API key used to access the Security and Compliance Center service, for the use profile with attachment setting. This parameter is only relevant when the `use_profile_attachment` parameter is `enabled`. You can use a toolchain secret reference for this parameter. For more information, see [Protecting your sensitive data in Continuous Delivery](https://cloud.ibm.com/docs/ContinuousDelivery?topic=ContinuousDelivery-cd_data_security#cd_secure_credentials). - * `scope` - (Deprecated, Optional, String) The name of a Security and Compliance Center scope, which has previously been created in that service. When the `trigger_scan` parameter is set to `enabled`, then the Validation scan will scan all the resources in that scope. Select a scope that contains this toolchain, so that the scan will find the evidence that has been recently updated by the DevSecOps pipeline-run. This parameter is only relevant when the `trigger_scan` parameter is `enabled`. For information about the deprecation see the `trigger_scan` parameter. - * `trigger_scan` - (Deprecated, Optional, String) Set to `enabled` to indicate that a DevSecOps pipeline task should trigger a Security and Compliance Center run of a Hybrid cloud validation scan. Note, each scan may incur charges. When enabled, other parameters become relevant that are needed to trigger that scan; `api_key`, `scope`, `profile`. Hybrid cloud scans are deprecated and are planned to be removed. This option will stop working at that time. For more information see the [Security and Compliance Center Release Notes](https://cloud.ibm.com/docs/security-compliance?topic=security-compliance-release-notes#security-compliance-march312023). - * Constraints: Allowable values are: `disabled`, `enabled`. * `use_profile_attachment` - (Optional, String) Set to `enabled` to enable use profile with attachment, so that the scripts in the pipeline can interact with the Security and Compliance Center service. When enabled, other parameters become relevant; `scc_api_key`, `instance_crn`, `profile_name`, `profile_version`, `attachment_id`. * Constraints: Allowable values are: `disabled`, `enabled`. * `toolchain_id` - (Required, Forces new resource, String) ID of the toolchain to bind the tool to. diff --git a/website/docs/r/database.html.markdown b/website/docs/r/database.html.markdown index 00645a693f..04248090bb 100644 --- a/website/docs/r/database.html.markdown +++ b/website/docs/r/database.html.markdown @@ -668,6 +668,7 @@ Review the argument reference that you can specify for your resource. - `allocation_count` - (Optional, Integer) Allocated dedicated CPU per-member. - `name` - (Required, String) A descriptive name that is used to identify the database instance. The name must not include spaces. +- `offline_restore` - (Optional, Boolean) Enable or disable the Offline Restore option while performing a Point-in-time Recovery for MongoDB EE in a disaster recovery scenario when the source region is unavailable, see [Point-in-time Recovery](https://cloud.ibm.com/docs/databases-for-mongodb?topic=databases-for-mongodb-pitr&interface=api#pitr-offline-restore) - `plan` - (Required, Forces new resource, String) The name of the service plan that you choose for your instance. All databases use `standard`. `enterprise` is supported only for elasticsearch (`databases-for-elasticsearch`), cassandra (`databases-for-cassandra`), and mongodb(`databases-for-mongodb`). `platinum` is supported for elasticsearch (`databases-for-elasticsearch`). - `point_in_time_recovery_deployment_id` - (Optional, String) The ID of the source deployment that you want to recover back to. - `point_in_time_recovery_time` - (Optional, String) The timestamp in UTC format that you want to restore to. To retrieve the timestamp, run the `ibmcloud cdb postgresql earliest-pitr-timestamp ` command. To restore to the latest available time, use a blank string `""` as the timestamp. For more information, see [Point-in-time Recovery](https://cloud.ibm.com/docs/databases-for-postgresql?topic=databases-for-postgresql-pitr). diff --git a/website/docs/r/iam_access_group_policy.html.markdown b/website/docs/r/iam_access_group_policy.html.markdown index c54692b0c9..550dca2d88 100644 --- a/website/docs/r/iam_access_group_policy.html.markdown +++ b/website/docs/r/iam_access_group_policy.html.markdown @@ -267,6 +267,73 @@ resource "ibm_iam_access_group_policy" "policy" { } ``` +### Access Group Policy by using Attribute Based Condition +`rule_conditions` can be used in conjunction with `pattern = attribute-based-condition:resource:literal-and-wildcard` and `rule_operator` to implement more complex policy conditions. **Note** Currently, a policy resource created without `rule_conditions`, `pattern`, and `rule_operator` cannot be updated including those conditions on update. + +```terraform +resource "ibm_iam_access_group" "accgrp" { + name = "access_group" +} +resource "ibm_iam_access_group_policy" "policy" { + access_group_id = ibm_iam_access_group.accgrp.id + roles = ["Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM User Policy Attribute Based Condition Creation for test scenario" +} +``` + ## Argument reference Review the argument references that you can specify for your resource. @@ -304,9 +371,15 @@ Review the argument references that you can specify for your resource. - `rule_conditions` - (Optional, List) A nested block describing the rule conditions of this policy. Nested schema for `rule_conditions`: - - `key` - (Required, String) The key of a rule condition. + - `key` - (Optional, String) The key of a rule condition. - `operator` - (Required, String) The operator of a rule condition. - - `value` - (Required, List) The valjue of a rule condition. + - `value` - (Optional, List) The value of a rule condition. + - `conditions` - (Optional, List) A nested block describing additional conditions of this policy. + + Nested schema for `conditions`: + - `key` - (Required, String) The key of a condition. + - `operator` - (Required, String) The operator of a condition. + - `value` - (Required, List) The value of a condition. - `rule_operator` - (Optional, String) The operator used to evaluate multiple rule conditions, e.g., all must be satisfied with `and`. diff --git a/website/docs/r/iam_service_policy.html.markdown b/website/docs/r/iam_service_policy.html.markdown index dc9b0ec664..99291b2c01 100644 --- a/website/docs/r/iam_service_policy.html.markdown +++ b/website/docs/r/iam_service_policy.html.markdown @@ -268,6 +268,73 @@ resource "ibm_iam_service_policy" "policy" { } ``` +### Service Policy by using Attribute Based Condition +`rule_conditions` can be used in conjunction with `pattern = attribute-based-condition:resource:literal-and-wildcard` and `rule_operator` to implement more complex policy conditions. **Note** Currently, a policy resource created without `rule_conditions`, `pattern`, and `rule_operator` cannot be updated including those conditions on update. + +```terraform +resource "ibm_iam_service_id" "service_id" { + name = "test" +} +resource "ibm_iam_service_policy" "policy" { + iam_service_id = ibm_iam_service_id.service_id.id + roles = ["Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM User Policy Attribute Based Condition Creation for test scenario" +} +``` + ## Argument reference Review the argument references that you can specify for your resource. @@ -307,9 +374,15 @@ Review the argument references that you can specify for your resource. - `rule_conditions` - (Optional, List) A nested block describing the rule conditions of this policy. Nested schema for `rule_conditions`: - - `key` - (Required, String) The key of a rule condition. + - `key` - (Optional, String) The key of a rule condition. - `operator` - (Required, String) The operator of a rule condition. - - `value` - (Required, List) The valjue of a rule condition. + - `value` - (Optional, List) The value of a rule condition. + - `conditions` - (Optional, List) A nested block describing additional conditions of this policy. + + Nested schema for `conditions`: + - `key` - (Required, String) The key of a condition. + - `operator` - (Required, String) The operator of a condition. + - `value` - (Required, List) The value of a condition. - `rule_operator` - (Optional, String) The operator used to evaluate multiple rule conditions, e.g., all must be satisfied with `and`. diff --git a/website/docs/r/iam_trusted_profile_policy.html.markdown b/website/docs/r/iam_trusted_profile_policy.html.markdown index e987c0feb9..79e59ada80 100644 --- a/website/docs/r/iam_trusted_profile_policy.html.markdown +++ b/website/docs/r/iam_trusted_profile_policy.html.markdown @@ -261,6 +261,73 @@ resource "ibm_iam_trusted_profile_policy" "policy" { ``` +### Trusted Profile Policy by using Attribute Based Condition +`rule_conditions` can be used in conjunction with `pattern = attribute-based-condition:resource:literal-and-wildcard` and `rule_operator` to implement more complex policy conditions. **Note** Currently, a policy resource created without `rule_conditions`, `pattern`, and `rule_operator` cannot be updated including those conditions on update. + +```terraform +resource "ibm_iam_trusted_profile" "profile_id" { + name = "test" +} +resource "ibm_iam_trusted_profile_policy" "policy" { + profile_id = ibm_iam_trusted_profile.profile_id.id + roles = ["Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM User Policy Attribute Based Condition Creation for test scenario" +} +``` + ## Argument reference Review the argument references that you can specify for your resource. @@ -301,9 +368,15 @@ Review the argument references that you can specify for your resource. - `rule_conditions` - (Optional, List) A nested block describing the rule conditions of this policy. Nested schema for `rule_conditions`: - - `key` - (Required, String) The key of a rule condition. + - `key` - (Optional, String) The key of a rule condition. - `operator` - (Required, String) The operator of a rule condition. - - `value` - (Required, List) The valjue of a rule condition. + - `value` - (Optional, List) The value of a rule condition. + - `conditions` - (Optional, List) A nested block describing additional conditions of this policy. + + Nested schema for `conditions`: + - `key` - (Required, String) The key of a condition. + - `operator` - (Required, String) The operator of a condition. + - `value` - (Required, List) The value of a condition. - `rule_operator` - (Optional, String) The operator used to evaluate multiple rule conditions, e.g., all must be satisfied with `and`. diff --git a/website/docs/r/iam_user_policy.html.markdown b/website/docs/r/iam_user_policy.html.markdown index ef551b1c77..1a17ab207d 100644 --- a/website/docs/r/iam_user_policy.html.markdown +++ b/website/docs/r/iam_user_policy.html.markdown @@ -202,8 +202,72 @@ resource "ibm_iam_user_policy" "policy" { value = "IAM" } } +``` + +### User Policy by using Attribute Based Condition +`rule_conditions` can be used in conjunction with `pattern = attribute-based-condition:resource:literal-and-wildcard` and `rule_operator` to implement more complex policy conditions. **Note** Currently, a policy resource created without `rule_conditions`, `pattern`, and `rule_operator` cannot be updated including those conditions on update. +```terraform +resource "ibm_iam_user_policy" "policy" { + ibm_id = "test@in.ibm.com" + roles = ["Writer"] + resource_attributes { + value = "cloud-object-storage" + operator = "stringEquals" + name = "serviceName" + } + resource_attributes { + value = "cos-instance" + operator = "stringEquals" + name = "serviceInstance" + } + resource_attributes { + value = "bucket" + operator = "stringEquals" + name = "resourceType" + } + resource_attributes { + value = "fgac-tf-test" + operator = "stringEquals" + name = "resource" + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringEqualsAnyOf" + value = ["/",""] + } + } + rule_conditions { + key = "{{resource.attributes.path}}" + operator = "stringMatch" + value = ["folder1/subfolder1/*"] + } + rule_conditions { + operator = "and" + conditions { + key = "{{resource.attributes.delimiter}}" + operator = "stringExists" + value = ["false"] + } + conditions { + key = "{{resource.attributes.prefix}}" + operator = "stringExists" + value = ["false"] + } + } + rule_operator = "or" + pattern = "attribute-based-condition:resource:literal-and-wildcard" + description = "IAM User Policy Attribute Based Condition Creation for test scenario" +} ``` + ## Argument reference Review the argument references that you can specify for your resource. @@ -242,9 +306,15 @@ Review the argument references that you can specify for your resource. - `rule_conditions` - (Optional, List) A nested block describing the rule conditions of this policy. Nested schema for `rule_conditions`: - - `key` - (Required, String) The key of a rule condition. + - `key` - (Optional, String) The key of a rule condition. - `operator` - (Required, String) The operator of a rule condition. - - `value` - (Required, List) The valjue of a rule condition. + - `value` - (Optional, List) The value of a rule condition. + - `conditions` - (Optional, List) A nested block describing additional conditions of this policy. + + Nested schema for `conditions`: + - `key` - (Required, String) The key of a condition. + - `operator` - (Required, String) The operator of a condition. + - `value` - (Required, List) The value of a condition. - `rule_operator` - (Optional, String) The operator used to evaluate multiple rule conditions, e.g., all must be satisfied with `and`. diff --git a/website/docs/r/is_share_mount_target.html.markdown b/website/docs/r/is_share_mount_target.html.markdown index 15039a137a..3bc0c11a3d 100644 --- a/website/docs/r/is_share_mount_target.html.markdown +++ b/website/docs/r/is_share_mount_target.html.markdown @@ -27,39 +27,39 @@ resource "ibm_is_share" "example" { } resource "ibm_is_share_mount_target" "example" { - share = ibm_is_share.is_share.id - vpc = ibm_is_vpc.vpc.id + share = ibm_is_share.example.id + vpc = ibm_is_vpc.example.id name = "my-share-target" }` ``` ``` //Create mount target with virtual network interface that has primary ip name and subnet id -resource "ibm_is_vpc" "example" { +resource "ibm_is_vpc" "example1" { name = "my-vpc" } -resource "ibm_is_share" "example" { +resource "ibm_is_share" "example1" { access_control_mode = "security_group" zone = "br-sao-2" size = 9600 name = "my-example-share1" profile = "dp2" } -resource "ibm_is_subnet" "example" { +resource "ibm_is_subnet" "example1" { # provider = ibm.sao name = "my-subnet" - vpc = ibm_is_vpc.vpc2.id + vpc = ibm_is_vpc.example1.id zone = "br-sao-2" total_ipv4_address_count = 16 } resource "ibm_is_share_mount_target" "example1" { - share = ibm_is_share.example.id + share = ibm_is_share.example1.id virtual_network_interface { primary_ip { name = "my-example-pip" } - subnet = ibm_is_subnet.example.id + subnet = ibm_is_subnet.example1.id name = "my-example-vni" } name = "my-example-mount-target" @@ -80,8 +80,8 @@ resource "ibm_is_subnet_reserved_ip" "example" { subnet = ibm_is_subnet.example.id name = "my-example-resip" } -resource "ibm_is_share_mount_target" "mtarget1" { - share = ibm_is_share.share.id +resource "ibm_is_share_mount_target" "example" { + share = ibm_is_share.example.id virtual_network_interface { primary_ip { reserved_ip = ibm_is_subnet_reserved_ip.example.reserved_ip diff --git a/website/docs/r/project.html.markdown b/website/docs/r/project.html.markdown new file mode 100644 index 0000000000..98926aaffd --- /dev/null +++ b/website/docs/r/project.html.markdown @@ -0,0 +1,132 @@ +--- +layout: "ibm" +page_title: "IBM : ibm_project" +description: |- + Manages project. +subcategory: "Projects" +--- + +# ibm_project + +Create, update, and delete projects with this resource. + +## Example Usage + +```hcl +resource "ibm_project" "project_instance" { + definition { + name = "My static website" + description = "Sample static website test using the IBM catalog deployable architecture" + destroy_on_delete = true + } + location = "us-south" + resource_group = "Default" +} +``` + +## Argument Reference + +You can specify the following arguments for this resource. + +* `definition` - (Required, List) The definition of the project. +Nested schema for **definition**: + * `description` - (Optional, String) A brief explanation of the project's use in the configuration of a deployable architecture. It is possible to create a project without providing a description. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `destroy_on_delete` - (Required, Boolean) The policy that indicates whether the resources are destroyed or not when a project is deleted. + * `name` - (Required, String) The name of the project. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. +* `location` - (Required, Forces new resource, String) The IBM Cloud location where a resource is deployed. + * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]*$/`. +* `resource_group` - (Required, Forces new resource, String) The resource group where the project's data and tools are created. + * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]*$/`. + +## Attribute Reference + +After your resource is created, you can read values from the listed arguments and the following attributes. + +* `id` - The unique identifier of the project. +* `configs` - (List) The project configurations. These configurations are only included in the response of creating a project if a configs array is specified in the request payload. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +Nested schema for **configs**: + * `created_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + * `definition` - (List) The name and description of a project configuration. + Nested schema for **definition**: + * `description` - (String) A project configuration description. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `name` - (String) The configuration name. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^[a-zA-Z0-9][a-zA-Z0-9-_ ]*$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `modified_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + * `project` - (List) The project referenced by this resource. + Nested schema for **project**: + * `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + * `definition` - (List) The definition of the project reference. + Nested schema for **definition**: + * `name` - (String) The name of the project. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `state` - (String) The state of the configuration. + * Constraints: Allowable values are: `approved`, `deleted`, `deleting`, `deleting_failed`, `discarded`, `draft`, `deployed`, `deploying_failed`, `deploying`, `superseded`, `undeploying`, `undeploying_failed`, `validated`, `validating`, `validating_failed`. + * `version` - (Integer) The version of the configuration. +* `created_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. +* `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. +* `cumulative_needs_attention_view` - (List) The cumulative list of needs attention items for a project. If the view is successfully retrieved, an array which could be empty is returned. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +Nested schema for **cumulative_needs_attention_view**: + * `config_id` - (String) A unique ID for the configuration. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `config_version` - (Integer) The version number of the configuration. + * `event` - (String) The event name. + * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]*$/`. + * `event_id` - (String) A unique ID for that individual event. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. +* `cumulative_needs_attention_view_error` - (Boolean) True indicates that the fetch of the needs attention items failed. It only exists if there was an error while retrieving the cumulative needs attention view. + * Constraints: The default value is `false`. +* `environments` - (List) The project environments. These environments are only included in the response if project environments were created on the project. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +Nested schema for **environments**: + * `created_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. + * `definition` - (List) The environment definition used in the project collection. + Nested schema for **definition**: + * `description` - (String) The description of the environment. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `name` - (String) The name of the environment. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The environment id as a friendly name. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. + * `project` - (List) The project referenced by this resource. + Nested schema for **project**: + * `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + * `definition` - (List) The definition of the project reference. + Nested schema for **definition**: + * `name` - (String) The name of the project. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. +* `event_notifications_crn` - (String) The CRN of the event notifications instance if one is connected to this project. + * Constraints: The maximum length is `512` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. +* `state` - (String) The project status value. + * Constraints: Allowable values are: `ready`, `deleting`, `deleting_failed`. + + +## Import + +You can import the `ibm_project` resource by using `id`. The unique ID. + +# Syntax +``` +$ terraform import ibm_project.project +``` diff --git a/website/docs/r/project_config.html.markdown b/website/docs/r/project_config.html.markdown new file mode 100644 index 0000000000..db20dac197 --- /dev/null +++ b/website/docs/r/project_config.html.markdown @@ -0,0 +1,138 @@ +--- +layout: "ibm" +page_title: "IBM : ibm_project_config" +description: |- + Manages project_config. +subcategory: "Projects" +--- + +# ibm_project_config + +Create, update, and delete project_configs with this resource. + +## Example Usage + +```hcl +resource "ibm_project_config" "project_config_instance" { + definition { + name = "static-website-dev" + labels = [ "env:dev", "billing:internal" ] + description = "Website - development" + authorizations { + method = "api_key" + api_key = "" + } + locator_id = "1082e7d2-5e2f-0a11-a3bc-f88a8e1931fc.145be7c1-9ec4-4719-b586-584ee52fbed0-global" + input { + name = "app_repo_name" + } + setting { + name = "app_repo_name" + value = "static-website-dev-app-repo" + } + } + project_id = ibm_project.project_instance.id +} +``` + +## Argument Reference + +You can specify the following arguments for this resource. + +* `definition` - (Required, List) The type and output of a project configuration. +Nested schema for **definition**: + * `authorizations` - (Optional, List) The authorization details. You can authorize by using a trusted profile or an API key in Secrets Manager. + Nested schema for **authorizations**: + * `api_key` - (Optional, String) The IBM Cloud API Key. + * Constraints: The maximum length is `512` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^`<>\\x00-\\x1F]*$/`. + * `method` - (Optional, String) The authorization method. You can authorize by using a trusted profile or an API key in Secrets Manager. + * Constraints: Allowable values are: `api_key`, `trusted_profile`. + * `trusted_profile_id` - (Optional, String) The trusted profile ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `compliance_profile` - (Optional, List) The profile required for compliance. + Nested schema for **compliance_profile**: + * `attachment_id` - (Optional, String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `id` - (Optional, String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `instance_id` - (Optional, String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `instance_location` - (Optional, String) The location of the compliance instance. + * Constraints: The maximum length is `12` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(us-south|us-east|eu-gb|eu-de)$/`. + * `profile_name` - (Optional, String) The name of the compliance profile. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^`<>\\x00-\\x1F]*$/`. + * `description` - (Optional, String) A project configuration description. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `environment` - (Optional, String) The ID of the project environment. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. + * `inputs` - (Optional, List) The input variables for configuration definition and environment. + Nested schema for **inputs**: + * `locator_id` - (Required, Forces new resource, String) A dotted value of catalogID.versionID. + * Constraints: The maximum length is `512` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[\\.0-9a-z-A-Z_-]+$/`. + * `name` - (Required, String) The configuration name. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^[a-zA-Z0-9][a-zA-Z0-9-_ ]*$/`. + * `settings` - (Optional, List) Schematics environment variables to use to deploy the configuration.Settings are only available if they were specified when the configuration was initially created. + Nested schema for **settings**: + * `type` - (Computed, String) The type of a project configuration manual property. + * Constraints: Allowable values are: `terraform_template`, `schematics_blueprint`. +* `project_id` - (Required, Forces new resource, String) The unique project ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. +* `schematics` - (Optional, List) A schematics workspace associated to a project configuration. +Nested schema for **schematics**: + * `workspace_crn` - (Optional, String) An existing schematics workspace CRN. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + +## Attribute Reference + +After your resource is created, you can read values from the listed arguments and the following attributes. + +* `id` - The unique identifier of the project_config. +* `created_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. +* `is_draft` - (Boolean) The flag that indicates whether the version of the configuration is draft, or active. +* `last_saved_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. +* `modified_at` - (String) A date and time value in the format YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.sssZ, matching the date and time format as specified by RFC 3339. +* `needs_attention_state` - (List) The needs attention state of a configuration. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +* `outputs` - (List) The outputs of a Schematics template property. + * Constraints: The default value is `[]`. The maximum length is `10000` items. The minimum length is `0` items. +Nested schema for **outputs**: + * `description` - (String) A short explanation of the output value. + * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. + * `name` - (String) The variable name. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. + * `value` - (String) Can be any value - a string, number, boolean, array, or object. +* `project` - (List) The project referenced by this resource. +Nested schema for **project**: + * `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. + * Constraints: The maximum length is `512` characters. The minimum length is `4` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. + * `definition` - (List) The definition of the project reference. + Nested schema for **definition**: + * `name` - (String) The name of the project. + * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"`<>{}\\x00-\\x1F]+$/`. + * `href` - (String) A URL. + * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(http(s)?:\/\/)[a-zA-Z0-9\\$\\-_\\.+!\\*'\\(\\),=&?\/]+$/`. + * `id` - (String) The unique ID. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. +* `project_config_id` - (String) The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration. + * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. +* `state` - (String) The state of the configuration. + * Constraints: Allowable values are: `approved`, `deleted`, `deleting`, `deleting_failed`, `discarded`, `draft`, `deployed`, `deploying_failed`, `deploying`, `superseded`, `undeploying`, `undeploying_failed`, `validated`, `validating`, `validating_failed`. +* `update_available` - (Boolean) The flag that indicates whether a configuration update is available. +* `version` - (Integer) The version of the configuration. + + +## Import + +You can import the `ibm_project_config` resource by using `id`. +The `id` property can be formed from `project_id`, and `id` in the following format: + +``` +/ +``` +* `project_id`: A string. The unique project ID. +* `id`: A string. The unique config ID. + +# Syntax +``` +$ terraform import ibm_project_config.project_config / +``` diff --git a/website/docs/r/project_instance.html.markdown b/website/docs/r/project_instance.html.markdown deleted file mode 100644 index 5193113914..0000000000 --- a/website/docs/r/project_instance.html.markdown +++ /dev/null @@ -1,117 +0,0 @@ ---- -layout: "ibm" -page_title: "IBM : ibm_project_instance" -description: |- - Manages Project definition. -subcategory: "Project" ---- - -# ibm_project_instance - -Provides a resource for Project definition. This allows Project definition to be created, updated and deleted. - -## Example Usage - -```hcl -resource "ibm_project_instance" "project_instance" { - configs { - id = "0013790d-6cb5-4adc-8927-a725a1261d0c" - name = "static-website-dev" - labels = [ "env:dev", "billing:internal" ] - description = "Website - development" - locator_id = "1082e7d2-5e2f-0a11-a3bc-f88a8e1931fc.145be7c1-9ec4-4719-b586-584ee52fbed0-global" - input { - name = "app_repo_name" - } - setting { - name = "app_repo_name" - value = "static-website-dev-app-repo" - } - } - description = "Sample static website test using the IBM catalog deployable architecture" - name = "My static website" - location = "us-south" - resource_group = "Default" -} -``` - -## Argument Reference - -Review the argument reference that you can specify for your resource. - -* `configs` - (Optional, List) The project configurations. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. -Nested scheme for **configs**: - * `description` - (Optional, String) The project configuration description. - * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. - * `id` - (Optional, String) The ID of the configuration. If this parameter is empty, an ID is automatically created for the configuration. - * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. - * `input` - (Optional, List) The input values to use to deploy the configuration. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. - Nested scheme for **input**: - * `name` - (Required, String) The variable name. - * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. - * `value` - (Optional, String) Can be any value - a string, number, boolean, array, or object. - * `labels` - (Optional, List) A collection of configuration labels. - * Constraints: The list items must match regular expression `/^[_\\-a-z0-9:\/=]+$/`. The maximum length is `10000` items. The minimum length is `0` items. - * `locator_id` - (Required, String) A dotted value of catalogID.versionID. - * Constraints: The maximum length is `512` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[\\.0-9a-z-A-Z_-]+$/`. - * `name` - (Required, String) The configuration name. - * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^[a-zA-Z0-9][a-zA-Z0-9-_ ]*$/`. - * `setting` - (Optional, List) Schematics environment variables to use to deploy the configuration. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. - Nested scheme for **setting**: - * `name` - (Required, String) The name of the configuration setting. - * Constraints: The maximum length is `256` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. - * `value` - (Required, String) The value of the configuration setting. - * Constraints: The maximum length is `1024` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$).+$/`. -* `description` - (Optional, String) A project's descriptive text. - * Constraints: The maximum length is `1024` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s).*\\S$/`. -* `location` - (Required, String) The location where the project's data and tools are created. - * Constraints: The maximum length is `12` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(us-south|us-east|eu-gb|eu-de)$/`. -* `name` - (Required, String) The project name. - * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]+$/`. -* `resource_group` - (Required, String) The resource group where the project's data and tools are created. - * Constraints: The maximum length is `40` characters. The minimum length is `0` characters. The value must match regular expression `/^$|^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - -## Attribute Reference - -In addition to all argument references listed, you can access the following attribute references after your resource is created. - -* `id` - The unique identifier of the Project definition. -* `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. - * Constraints: The maximum length is `512` characters. The minimum length is `9` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. -* `metadata` - (List) The metadata of the project. -Nested scheme for **metadata**: - * `created_at` - (String) A date and time value in the format `YYYY-MM-DDTHH:mm:ssZ` or `YYYY-MM-DDTHH:mm:ss.sssZ`, matching the date and time format as specified by RFC 3339. - * `crn` - (String) An IBM Cloud resource name, which uniquely identifies a resource. - * Constraints: The maximum length is `512` characters. The minimum length is `9` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. - * `cumulative_needs_attention_view` - (List) The cumulative list of needs attention items for a project. - * Constraints: The maximum length is `10000` items. The minimum length is `0` items. - Nested scheme for **cumulative_needs_attention_view**: - * `config_id` - (String) The unique ID of a project. - * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. - * `config_version` - (Integer) The version number of the configuration. - * `event` - (String) The event name. - * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - * `event_id` - (String) The unique ID of a project. - * Constraints: The maximum length is `128` characters. The value must match regular expression `/^[\\.\\-0-9a-zA-Z]+$/`. - * `cumulative_needs_attention_view_err` - (String) `True` indicates that the fetch of the needs attention items failed. - * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - * `event_notifications_crn` - (String) The CRN of the event notifications instance if one is connected to this project. - * Constraints: The maximum length is `512` characters. The minimum length is `9` characters. The value must match regular expression `/^crn:v[0-9](:([A-Za-z0-9\\-._~!$&'()*+,;=@\/]|%[0-9A-Z]{2})*){8}$/`. - * `location` - (String) The IBM Cloud location where a resource is deployed. - * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - * `resource_group` - (String) The resource group where the project's data and tools are created. - * Constraints: The maximum length is `64` characters. The minimum length is `0` characters. The value must match regular expression `/^(?!\\s)(?!.*\\s$)[^'"<>{}\\x00-\\x1F]*$/`. - * `state` - (String) The project status value. - * Constraints: The maximum length is `64` characters. The minimum length is `1` character. The value must match regular expression `/^(CREATING|CREATING_FAILED|UPDATING|UPDATING_FAILED|READY)$/`. - -## Import - -You can import the `ibm_project_instance` resource by using `id`. The unique ID of a project. - -# Syntax -``` -$ terraform import ibm_project_instance.project_instance -``` diff --git a/website/docs/r/satellite_cluster.html.markdown b/website/docs/r/satellite_cluster.html.markdown index b01648bd64..b4d8a42038 100644 --- a/website/docs/r/satellite_cluster.html.markdown +++ b/website/docs/r/satellite_cluster.html.markdown @@ -50,6 +50,7 @@ Review the argument references that you can specify for your resource. - `location` - (Required, String) The name or ID of the Satellite location. - `kube_version` - (Optional, String) The Red Hart OpenShift Container Platform version. - `operating_system` - (Optional, String) Operating system of the default worker pool. Options are REDHAT_7_64, REDHAT_8_64, or RHCOS. +- `entitlement` - (Optional, String) Entitlement reduces additional OCP Licence cost in OpenShift clusters. Use Cloud Pak with OCP Licence entitlement to create the OpenShift cluster. **Note**
  • It is set only when the first time creation of the cluster, further modifications are not impacted.
  • Set this argument to `cloud_pak` only if you use the cluster with a Cloud Pak that has an OpenShift entitlement.
. - `zones` - (Optional, Array of Strings) The name of the zones to create the default worker pool. - `worker_count` - (Optional, String) The number of worker nodes to create per zone in the default worker pool. - `enable_config_admin` - (Optional, Bool) User provided value to indicate opt-in agreement to SatCon admin agent. diff --git a/website/docs/r/sm_arbitrary_secret.html.markdown b/website/docs/r/sm_arbitrary_secret.html.markdown index 0a5d5ae144..aadaef107d 100644 --- a/website/docs/r/sm_arbitrary_secret.html.markdown +++ b/website/docs/r/sm_arbitrary_secret.html.markdown @@ -14,6 +14,7 @@ Provides a resource for ArbitrarySecret. This allows ArbitrarySecret to be creat ```hcl resource "ibm_sm_arbitrary_secret" "sm_arbitrary_secret" { + name = "secret-name" instance_id = ibm_resource_instance.sm_instance.guid region = "us-south" custom_metadata = {"key":"value"}