Skip to content

Commit 05d558d

Browse files
modular-magicianrileykarson
authored andcommitted
Add disable_dependent_services to google_project_service resource. (#2938)
<!-- This change is generated by MagicModules. --> /cc @rileykarson
1 parent e37b94e commit 05d558d

9 files changed

+593
-295
lines changed

google/config.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import (
3838
redis "google.golang.org/api/redis/v1beta1"
3939
runtimeconfig "google.golang.org/api/runtimeconfig/v1beta1"
4040
"google.golang.org/api/servicemanagement/v1"
41-
serviceusage "google.golang.org/api/serviceusage/v1beta1"
41+
"google.golang.org/api/serviceusage/v1"
4242
"google.golang.org/api/sourcerepo/v1"
4343
"google.golang.org/api/spanner/v1"
4444
sqladmin "google.golang.org/api/sqladmin/v1beta4"
@@ -86,7 +86,7 @@ type Config struct {
8686
clientSqlAdmin *sqladmin.Service
8787
clientIAM *iam.Service
8888
clientServiceMan *servicemanagement.APIService
89-
clientServiceUsage *serviceusage.APIService
89+
clientServiceUsage *serviceusage.Service
9090
clientBigQuery *bigquery.Service
9191
clientCloudFunctions *cloudfunctions.Service
9292
clientCloudIoT *cloudiot.Service

google/resource_google_project_service.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ func resourceGoogleProjectService() *schema.Resource {
3232
Computed: true,
3333
ForceNew: true,
3434
},
35+
36+
"disable_dependent_services": {
37+
Type: schema.TypeBool,
38+
Optional: true,
39+
},
40+
3541
"disable_on_destroy": {
3642
Type: schema.TypeBool,
3743
Optional: true,
@@ -120,7 +126,7 @@ func resourceGoogleProjectServiceDelete(d *schema.ResourceData, meta interface{}
120126
return nil
121127
}
122128

123-
if err = disableService(id.service, id.project, config); err != nil {
129+
if err = disableService(id.service, id.project, config, d.Get("disable_dependent_services").(bool)); err != nil {
124130
return fmt.Errorf("Error disabling service: %s", err)
125131
}
126132

google/resource_google_project_service_test.go

+77
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package google
22

33
import (
44
"fmt"
5+
"regexp"
56
"testing"
67

78
"github.com/hashicorp/terraform/helper/acctest"
@@ -63,6 +64,46 @@ func TestAccProjectService_basic(t *testing.T) {
6364
})
6465
}
6566

67+
func TestAccProjectService_disableDependentServices(t *testing.T) {
68+
t.Parallel()
69+
70+
org := getTestOrgFromEnv(t)
71+
pid := "terraform-" + acctest.RandString(10)
72+
services := []string{"cloudbuild.googleapis.com", "containerregistry.googleapis.com"}
73+
resource.Test(t, resource.TestCase{
74+
PreCheck: func() { testAccPreCheck(t) },
75+
Providers: testAccProviders,
76+
Steps: []resource.TestStep{
77+
{
78+
Config: testAccProjectService_disableDependentServices(services, pid, pname, org, "false"),
79+
},
80+
{
81+
ResourceName: "google_project_service.test",
82+
ImportState: true,
83+
ImportStateVerify: true,
84+
ImportStateVerifyIgnore: []string{"disable_on_destroy"},
85+
},
86+
{
87+
Config: testAccProjectService_dependencyRemoved(services, pid, pname, org),
88+
ExpectError: regexp.MustCompile("Please specify disable_dependent_services=true if you want to proceed with disabling all services."),
89+
},
90+
{
91+
Config: testAccProjectService_disableDependentServices(services, pid, pname, org, "true"),
92+
},
93+
{
94+
ResourceName: "google_project_service.test",
95+
ImportState: true,
96+
ImportStateVerify: true,
97+
ImportStateVerifyIgnore: []string{"disable_on_destroy"},
98+
},
99+
{
100+
Config: testAccProjectService_dependencyRemoved(services, pid, pname, org),
101+
ExpectNonEmptyPlan: true,
102+
},
103+
},
104+
})
105+
}
106+
66107
func TestAccProjectService_handleNotFound(t *testing.T) {
67108
t.Parallel()
68109

@@ -136,6 +177,42 @@ resource "google_project_service" "test2" {
136177
`, pid, name, org, services[0], services[1])
137178
}
138179

180+
func testAccProjectService_disableDependentServices(services []string, pid, name, org, disableDependentServices string) string {
181+
return fmt.Sprintf(`
182+
resource "google_project" "acceptance" {
183+
project_id = "%s"
184+
name = "%s"
185+
org_id = "%s"
186+
}
187+
188+
resource "google_project_service" "test" {
189+
project = "${google_project.acceptance.project_id}"
190+
service = "%s"
191+
}
192+
193+
resource "google_project_service" "test2" {
194+
project = "${google_project.acceptance.project_id}"
195+
service = "%s"
196+
disable_dependent_services = %s
197+
}
198+
`, pid, name, org, services[0], services[1], disableDependentServices)
199+
}
200+
201+
func testAccProjectService_dependencyRemoved(services []string, pid, name, org string) string {
202+
return fmt.Sprintf(`
203+
resource "google_project" "acceptance" {
204+
project_id = "%s"
205+
name = "%s"
206+
org_id = "%s"
207+
}
208+
209+
resource "google_project_service" "test" {
210+
project = "${google_project.acceptance.project_id}"
211+
service = "%s"
212+
}
213+
`, pid, name, org, services[0])
214+
}
215+
139216
func testAccProjectService_noDisable(services []string, pid, name, org string) string {
140217
return fmt.Sprintf(`
141218
resource "google_project" "acceptance" {

google/resource_google_project_services.go

+16-9
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import (
44
"context"
55
"fmt"
66
"log"
7+
"sort"
78
"strings"
89

910
"github.com/hashicorp/errwrap"
1011
"github.com/hashicorp/terraform/helper/schema"
1112
"google.golang.org/api/googleapi"
12-
"google.golang.org/api/serviceusage/v1beta1"
13+
"google.golang.org/api/serviceusage/v1"
1314
)
1415

1516
func resourceGoogleProjectServices() *schema.Resource {
@@ -129,7 +130,7 @@ func resourceGoogleProjectServicesDelete(d *schema.ResourceData, meta interface{
129130
config := meta.(*Config)
130131
services := resourceServices(d)
131132
for _, s := range services {
132-
disableService(s, d.Id(), config)
133+
disableService(s, d.Id(), config, true)
133134
}
134135
d.SetId("")
135136
return nil
@@ -148,19 +149,21 @@ func reconcileServices(cfgServices, apiServices []string, config *Config, pid st
148149
return sm
149150
}
150151

152+
sort.Strings(cfgServices)
151153
cfgMap := m(cfgServices)
154+
log.Printf("[DEBUG]: Saw the following services in config: %v", cfgServices)
152155
apiMap := m(apiServices)
156+
log.Printf("[DEBUG]: Saw the following services enabled: %v", apiServices)
153157

154158
for k := range apiMap {
155159
if _, ok := cfgMap[k]; !ok {
156-
// The service in the API is not in the config; disable it.
157-
err := disableService(k, pid, config)
160+
log.Printf("[DEBUG]: Disabling %s as it's enabled upstream but not in config", k)
161+
err := disableService(k, pid, config, true)
158162
if err != nil {
159163
return err
160164
}
161165
} else {
162-
// The service exists in the config and the API, so we don't need
163-
// to re-enable it
166+
log.Printf("[DEBUG]: Skipping %s as it's enabled in both config and upstream", k)
164167
delete(cfgMap, k)
165168
}
166169
}
@@ -169,6 +172,8 @@ func reconcileServices(cfgServices, apiServices []string, config *Config, pid st
169172
for k := range cfgMap {
170173
keys = append(keys, k)
171174
}
175+
sort.Strings(keys)
176+
log.Printf("[DEBUG]: Enabling the following services: %v", keys)
172177
err := enableServices(keys, pid, config)
173178
if err != nil {
174179
return err
@@ -233,7 +238,7 @@ func enableServices(s []string, pid string, config *Config) error {
233238
// It's not permitted to enable more than 20 services in one API call (even
234239
// for batch).
235240
//
236-
// https://godoc.org/google.golang.org/api/serviceusage/v1beta1#BatchEnableServicesRequest
241+
// https://godoc.org/google.golang.org/api/serviceusage/v1#BatchEnableServicesRequest
237242
batchSize := 20
238243

239244
for i := 0; i < len(s); i += batchSize {
@@ -334,10 +339,12 @@ func diffStringSlice(wanted, actual []string) []string {
334339
return missing
335340
}
336341

337-
func disableService(s, pid string, config *Config) error {
342+
func disableService(s, pid string, config *Config, disableDependentServices bool) error {
338343
err := retryTime(func() error {
339344
name := fmt.Sprintf("projects/%s/services/%s", pid, s)
340-
sop, err := config.clientServiceUsage.Services.Disable(name, &serviceusage.DisableServiceRequest{}).Do()
345+
sop, err := config.clientServiceUsage.Services.Disable(name, &serviceusage.DisableServiceRequest{
346+
DisableDependentServices: disableDependentServices,
347+
}).Do()
341348
if err != nil {
342349
return err
343350
}

google/serviceusage_operation.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package google
33
import (
44
"fmt"
55

6-
serviceusage "google.golang.org/api/serviceusage/v1beta1"
6+
"google.golang.org/api/serviceusage/v1"
77
)
88

99
type ServiceUsageOperationWaiter struct {
10-
Service *serviceusage.APIService
10+
Service *serviceusage.Service
1111
CommonOperationWaiter
1212
}
1313

0 commit comments

Comments
 (0)