Skip to content

Commit 372cb68

Browse files
Composer 3 GA (#12234) (#20340)
[upstream:ce7327247d236feaaf57005763f55494cca727b2] Signed-off-by: Modular Magician <[email protected]>
1 parent 0bb93df commit 372cb68

20 files changed

+3346
-867
lines changed

.changelog/12234.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note: enhancement
2+
composer: `google_composer_user_workloads_config_map` promoted to GA
3+
```

google/provider/provider_mmv1_resources.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
"github.com/hashicorp/terraform-provider-google/google/services/cloudrunv2"
4040
"github.com/hashicorp/terraform-provider-google/google/services/cloudscheduler"
4141
"github.com/hashicorp/terraform-provider-google/google/services/cloudtasks"
42+
"github.com/hashicorp/terraform-provider-google/google/services/composer"
4243
"github.com/hashicorp/terraform-provider-google/google/services/compute"
4344
"github.com/hashicorp/terraform-provider-google/google/services/containeranalysis"
4445
"github.com/hashicorp/terraform-provider-google/google/services/containerattached"
@@ -130,7 +131,6 @@ import (
130131
"github.com/hashicorp/terraform-provider-google/google/services/workbench"
131132
"github.com/hashicorp/terraform-provider-google/google/services/workflows"
132133

133-
"github.com/hashicorp/terraform-provider-google/google/services/composer"
134134
"github.com/hashicorp/terraform-provider-google/google/services/container"
135135
"github.com/hashicorp/terraform-provider-google/google/services/containeraws"
136136
"github.com/hashicorp/terraform-provider-google/google/services/containerazure"
@@ -179,6 +179,8 @@ var handwrittenDatasources = map[string]*schema.Resource{
179179
"google_cloud_run_v2_job": cloudrunv2.DataSourceGoogleCloudRunV2Job(),
180180
"google_cloud_run_v2_service": cloudrunv2.DataSourceGoogleCloudRunV2Service(),
181181
"google_composer_environment": composer.DataSourceGoogleComposerEnvironment(),
182+
"google_composer_user_workloads_config_map": composer.DataSourceGoogleComposerUserWorkloadsConfigMap(),
183+
"google_composer_user_workloads_secret": composer.DataSourceGoogleComposerUserWorkloadsSecret(),
182184
"google_composer_image_versions": composer.DataSourceGoogleComposerImageVersions(),
183185
"google_compute_address": compute.DataSourceGoogleComputeAddress(),
184186
"google_compute_addresses": compute.DataSourceGoogleComputeAddresses(),
@@ -455,9 +457,9 @@ var handwrittenIAMDatasources = map[string]*schema.Resource{
455457
}
456458

457459
// Resources
458-
// Generated resources: 490
460+
// Generated resources: 491
459461
// Generated IAM resources: 261
460-
// Total generated resources: 751
462+
// Total generated resources: 752
461463
var generatedResources = map[string]*schema.Resource{
462464
"google_folder_access_approval_settings": accessapproval.ResourceAccessApprovalFolderSettings(),
463465
"google_organization_access_approval_settings": accessapproval.ResourceAccessApprovalOrganizationSettings(),
@@ -622,6 +624,7 @@ var generatedResources = map[string]*schema.Resource{
622624
"google_cloud_tasks_queue_iam_binding": tpgiamresource.ResourceIamBinding(cloudtasks.CloudTasksQueueIamSchema, cloudtasks.CloudTasksQueueIamUpdaterProducer, cloudtasks.CloudTasksQueueIdParseFunc),
623625
"google_cloud_tasks_queue_iam_member": tpgiamresource.ResourceIamMember(cloudtasks.CloudTasksQueueIamSchema, cloudtasks.CloudTasksQueueIamUpdaterProducer, cloudtasks.CloudTasksQueueIdParseFunc),
624626
"google_cloud_tasks_queue_iam_policy": tpgiamresource.ResourceIamPolicy(cloudtasks.CloudTasksQueueIamSchema, cloudtasks.CloudTasksQueueIamUpdaterProducer, cloudtasks.CloudTasksQueueIdParseFunc),
627+
"google_composer_user_workloads_config_map": composer.ResourceComposerUserWorkloadsConfigMap(),
625628
"google_compute_address": compute.ResourceComputeAddress(),
626629
"google_compute_autoscaler": compute.ResourceComputeAutoscaler(),
627630
"google_compute_backend_bucket": compute.ResourceComputeBackendBucket(),
@@ -1211,6 +1214,7 @@ var handwrittenResources = map[string]*schema.Resource{
12111214
"google_billing_subaccount": resourcemanager.ResourceBillingSubaccount(),
12121215
"google_cloudfunctions_function": cloudfunctions.ResourceCloudFunctionsFunction(),
12131216
"google_composer_environment": composer.ResourceComposerEnvironment(),
1217+
"google_composer_user_workloads_secret": composer.ResourceComposerUserWorkloadsSecret(),
12141218
"google_compute_attached_disk": compute.ResourceComputeAttachedDisk(),
12151219
"google_compute_instance": compute.ResourceComputeInstance(),
12161220
"google_compute_disk_async_replication": compute.ResourceComputeDiskAsyncReplication(),
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,51 @@
11
// Copyright (c) HashiCorp, Inc.
22
// SPDX-License-Identifier: MPL-2.0
33
package composer
4+
5+
import (
6+
"fmt"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
10+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
11+
)
12+
13+
func DataSourceGoogleComposerUserWorkloadsConfigMap() *schema.Resource {
14+
dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceComposerUserWorkloadsConfigMap().Schema)
15+
16+
// Set 'Required' schema elements
17+
tpgresource.AddRequiredFieldsToSchema(dsSchema, "environment", "name")
18+
19+
// Set 'Optional' schema elements
20+
tpgresource.AddOptionalFieldsToSchema(dsSchema, "project", "region")
21+
22+
return &schema.Resource{
23+
Read: dataSourceGoogleComposerUserWorkloadsConfigMapRead,
24+
Schema: dsSchema,
25+
}
26+
}
27+
28+
func dataSourceGoogleComposerUserWorkloadsConfigMapRead(d *schema.ResourceData, meta interface{}) error {
29+
config := meta.(*transport_tpg.Config)
30+
31+
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/locations/{{region}}/environments/{{environment}}/userWorkloadsConfigMaps/{{name}}")
32+
if err != nil {
33+
return fmt.Errorf("Error constructing id: %s", err)
34+
}
35+
d.SetId(id)
36+
37+
err = resourceComposerUserWorkloadsConfigMapRead(d, meta)
38+
if err != nil {
39+
return err
40+
}
41+
42+
if err := tpgresource.SetDataSourceLabels(d); err != nil {
43+
return err
44+
}
45+
46+
if d.Id() == "" {
47+
return fmt.Errorf("%s not found", id)
48+
}
49+
50+
return nil
51+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,59 @@
11
// Copyright (c) HashiCorp, Inc.
22
// SPDX-License-Identifier: MPL-2.0
33
package composer_test
4+
5+
import (
6+
"fmt"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
10+
"github.com/hashicorp/terraform-provider-google/google/acctest"
11+
)
12+
13+
func TestAccDataSourceComposerUserWorkloadsConfigMap_basic(t *testing.T) {
14+
t.Parallel()
15+
16+
context := map[string]interface{}{
17+
"env_name": fmt.Sprintf("%s-%d", testComposerEnvironmentPrefix, acctest.RandInt(t)),
18+
"config_map_name": fmt.Sprintf("tf-test-composer-config-map-%d", acctest.RandInt(t)),
19+
}
20+
21+
acctest.VcrTest(t, resource.TestCase{
22+
PreCheck: func() { acctest.AccTestPreCheck(t) },
23+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
24+
Steps: []resource.TestStep{
25+
{
26+
Config: testAccDataSourceComposerUserWorkloadsConfigMap_basic(context),
27+
Check: resource.ComposeTestCheckFunc(
28+
acctest.CheckDataSourceStateMatchesResourceState("data.google_composer_user_workloads_config_map.test",
29+
"google_composer_user_workloads_config_map.test"),
30+
),
31+
},
32+
},
33+
})
34+
}
35+
36+
func testAccDataSourceComposerUserWorkloadsConfigMap_basic(context map[string]interface{}) string {
37+
return acctest.Nprintf(`
38+
resource "google_composer_environment" "test" {
39+
name = "%{env_name}"
40+
config {
41+
software_config {
42+
image_version = "composer-3-airflow-2"
43+
}
44+
}
45+
}
46+
resource "google_composer_user_workloads_config_map" "test" {
47+
environment = google_composer_environment.test.name
48+
name = "%{config_map_name}"
49+
data = {
50+
db_host: "dbhost:5432",
51+
api_host: "apihost:443",
52+
}
53+
}
54+
data "google_composer_user_workloads_config_map" "test" {
55+
name = google_composer_user_workloads_config_map.test.name
56+
environment = google_composer_environment.test.name
57+
}
58+
`, context)
59+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,62 @@
11
// Copyright (c) HashiCorp, Inc.
22
// SPDX-License-Identifier: MPL-2.0
33
package composer
4+
5+
import (
6+
"fmt"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
10+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
11+
)
12+
13+
func DataSourceGoogleComposerUserWorkloadsSecret() *schema.Resource {
14+
dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceComposerUserWorkloadsSecret().Schema)
15+
16+
// Set 'Required' schema elements
17+
tpgresource.AddRequiredFieldsToSchema(dsSchema, "environment", "name")
18+
19+
// Set 'Optional' schema elements
20+
tpgresource.AddOptionalFieldsToSchema(dsSchema, "project", "region")
21+
22+
return &schema.Resource{
23+
Read: dataSourceGoogleComposerUserWorkloadsSecretRead,
24+
Schema: dsSchema,
25+
}
26+
}
27+
28+
func dataSourceGoogleComposerUserWorkloadsSecretRead(d *schema.ResourceData, meta interface{}) error {
29+
config := meta.(*transport_tpg.Config)
30+
31+
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/locations/{{region}}/environments/{{environment}}/userWorkloadsSecrets/{{name}}")
32+
if err != nil {
33+
return fmt.Errorf("Error constructing id: %s", err)
34+
}
35+
d.SetId(id)
36+
37+
// retrieve "data" in advance, because Read function won't do it.
38+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
39+
if err != nil {
40+
return err
41+
}
42+
43+
res, err := config.NewComposerClient(userAgent).Projects.Locations.Environments.UserWorkloadsSecrets.Get(id).Do()
44+
if err != nil {
45+
return err
46+
}
47+
48+
if err := d.Set("data", res.Data); err != nil {
49+
return fmt.Errorf("Error setting UserWorkloadsSecret Data: %s", err)
50+
}
51+
52+
err = resourceComposerUserWorkloadsSecretRead(d, meta)
53+
if err != nil {
54+
return err
55+
}
56+
57+
if d.Id() == "" {
58+
return fmt.Errorf("%s not found", id)
59+
}
60+
61+
return nil
62+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,102 @@
11
// Copyright (c) HashiCorp, Inc.
22
// SPDX-License-Identifier: MPL-2.0
33
package composer_test
4+
5+
import (
6+
"errors"
7+
"fmt"
8+
"strings"
9+
"testing"
10+
11+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
12+
"github.com/hashicorp/terraform-plugin-testing/terraform"
13+
"github.com/hashicorp/terraform-provider-google/google/acctest"
14+
)
15+
16+
func TestAccDataSourceComposerUserWorkloadsSecret_basic(t *testing.T) {
17+
t.Parallel()
18+
19+
context := map[string]interface{}{
20+
"env_name": fmt.Sprintf("%s-%d", testComposerEnvironmentPrefix, acctest.RandInt(t)),
21+
"secret_name": fmt.Sprintf("%s-%d", testComposerUserWorkloadsSecretPrefix, acctest.RandInt(t)),
22+
}
23+
24+
acctest.VcrTest(t, resource.TestCase{
25+
PreCheck: func() { acctest.AccTestPreCheck(t) },
26+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
27+
Steps: []resource.TestStep{
28+
{
29+
Config: testAccDataSourceComposerUserWorkloadsSecret_basic(context),
30+
Check: resource.ComposeTestCheckFunc(
31+
checkSecretDataSourceMatchesResource(),
32+
),
33+
},
34+
},
35+
})
36+
}
37+
38+
func checkSecretDataSourceMatchesResource() resource.TestCheckFunc {
39+
return func(s *terraform.State) error {
40+
ds, ok := s.RootModule().Resources["data.google_composer_user_workloads_secret.test"]
41+
if !ok {
42+
return fmt.Errorf("can't find %s in state", "data.google_composer_user_workloads_secret.test")
43+
}
44+
rs, ok := s.RootModule().Resources["google_composer_user_workloads_secret.test"]
45+
if !ok {
46+
return fmt.Errorf("can't find %s in state", "google_composer_user_workloads_secret.test")
47+
}
48+
49+
dsAttr := ds.Primary.Attributes
50+
rsAttr := rs.Primary.Attributes
51+
errMsg := ""
52+
53+
for k := range rsAttr {
54+
if k == "%" || k == "data.%" {
55+
continue
56+
}
57+
// ignore diff if it's due to secrets being masked.
58+
if strings.HasPrefix(k, "data.") {
59+
if _, ok := dsAttr[k]; !ok {
60+
errMsg += fmt.Sprintf("%s is defined in resource and not in datasource\n", k)
61+
}
62+
if dsAttr[k] == "**********" {
63+
continue
64+
}
65+
}
66+
if dsAttr[k] != rsAttr[k] {
67+
errMsg += fmt.Sprintf("%s is %s; want %s\n", k, dsAttr[k], rsAttr[k])
68+
}
69+
}
70+
71+
if errMsg != "" {
72+
return errors.New(errMsg)
73+
}
74+
75+
return nil
76+
}
77+
}
78+
79+
func testAccDataSourceComposerUserWorkloadsSecret_basic(context map[string]interface{}) string {
80+
return acctest.Nprintf(`
81+
resource "google_composer_environment" "test" {
82+
name = "%{env_name}"
83+
config {
84+
software_config {
85+
image_version = "composer-3-airflow-2"
86+
}
87+
}
88+
}
89+
resource "google_composer_user_workloads_secret" "test" {
90+
environment = google_composer_environment.test.name
91+
name = "%{secret_name}"
92+
data = {
93+
username: base64encode("username"),
94+
password: base64encode("password"),
95+
}
96+
}
97+
data "google_composer_user_workloads_secret" "test" {
98+
name = google_composer_user_workloads_secret.test.name
99+
environment = google_composer_environment.test.name
100+
}
101+
`, context)
102+
}

0 commit comments

Comments
 (0)