Skip to content

Commit 3b7746b

Browse files
authored
Add sweeper that covers org-scope resources for dlp. (#15321)
1 parent a872f68 commit 3b7746b

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

mmv1/third_party/terraform/services/datalossprevention/resource_data_loss_prevention_discovery_config_sweeper.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import (
55
"log"
66
"strings"
77

8+
"github.com/hashicorp/terraform-provider-google/google/envvar"
89
"github.com/hashicorp/terraform-provider-google/google/sweeper"
910
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
1011
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
1112
)
1213

1314
func init() {
1415
sweeper.AddTestSweepersLegacy("DataLossPreventionDiscoveryConfig", testSweepDataLossPreventionDiscoveryConfig)
16+
sweeper.AddTestSweepersLegacy("DataLossPreventionDiscoveryConfigOrgScope", testSweepDataLossPreventionDiscoveryConfigOrgScope)
1517
}
1618

1719
// At the time of writing, the CI only passes us-central1 as the region
@@ -104,3 +106,97 @@ func testSweepDataLossPreventionDiscoveryConfig(region string) error {
104106
}
105107
return nil
106108
}
109+
110+
// At the time of writing, the CI only passes us-central1 as the region
111+
func testSweepDataLossPreventionDiscoveryConfigOrgScope(region string) error {
112+
resourceName := "DataLossPreventionDiscoveryConfig"
113+
log.Printf("[INFO][SWEEPER_LOG] Starting sweeper for org-scope %s", resourceName)
114+
115+
config, err := sweeper.SharedConfigForRegion(region)
116+
if err != nil {
117+
log.Printf("[INFO][SWEEPER_LOG] error getting shared config for region: %s", err)
118+
return err
119+
}
120+
121+
err = config.LoadAndValidate(context.Background())
122+
if err != nil {
123+
log.Printf("[INFO][SWEEPER_LOG] error loading: %s", err)
124+
return err
125+
}
126+
127+
// Setup variables to replace in list template
128+
testOrg := envvar.GetTestOrgFromEnv(nil)
129+
if testOrg == "" {
130+
log.Printf("test org not set for test environment, skip sweep")
131+
return nil
132+
}
133+
d := &tpgresource.ResourceDataMock{
134+
FieldsInSchema: map[string]interface{}{
135+
"org": testOrg,
136+
"region": region,
137+
"location": region,
138+
"zone": "-",
139+
},
140+
}
141+
142+
listTemplate := strings.Split("https://dlp.googleapis.com/v2/organizations/{{org}}/locations/{{location}}/discoveryConfigs", "?")[0]
143+
listUrl, err := tpgresource.ReplaceVars(d, config, listTemplate)
144+
if err != nil {
145+
log.Printf("[INFO][SWEEPER_LOG] error preparing sweeper list url: %s", err)
146+
return nil
147+
}
148+
149+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
150+
Config: config,
151+
Method: "GET",
152+
RawURL: listUrl,
153+
UserAgent: config.UserAgent,
154+
})
155+
if err != nil {
156+
log.Printf("[INFO][SWEEPER_LOG] Error in response from request %s: %s", listUrl, err)
157+
return nil
158+
}
159+
160+
resourceList, ok := res["discoveryConfigs"]
161+
if !ok {
162+
log.Printf("[INFO][SWEEPER_LOG] Nothing found in response.")
163+
return nil
164+
}
165+
166+
rl := resourceList.([]interface{})
167+
168+
log.Printf("[INFO][SWEEPER_LOG] Found %d items in %s list response.", len(rl), resourceName)
169+
for _, ri := range rl {
170+
obj := ri.(map[string]interface{})
171+
if obj["name"] == nil {
172+
log.Printf("[INFO][SWEEPER_LOG] %s resource name was nil", resourceName)
173+
return nil
174+
}
175+
176+
// Note that we do not check for a sweepable prefix here.
177+
// We can have at most 1 DiscoveryConfig for a storage type in the same project/location, so ensure we delete everything.
178+
name := tpgresource.GetResourceNameFromSelfLink(obj["name"].(string))
179+
180+
deleteTemplate := "https://dlp.googleapis.com/v2/organizations/{{org}}/locations/{{location}}/discoveryConfigs/{{name}}"
181+
deleteUrl, err := tpgresource.ReplaceVars(d, config, deleteTemplate)
182+
if err != nil {
183+
log.Printf("[INFO][SWEEPER_LOG] error preparing delete url: %s", err)
184+
return nil
185+
}
186+
deleteUrl = deleteUrl + name
187+
188+
// Don't wait on operations as we may have a lot to delete
189+
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
190+
Config: config,
191+
Method: "DELETE",
192+
RawURL: deleteUrl,
193+
UserAgent: config.UserAgent,
194+
})
195+
if err != nil {
196+
log.Printf("[INFO][SWEEPER_LOG] Error deleting for url %s : %s", deleteUrl, err)
197+
} else {
198+
log.Printf("[INFO][SWEEPER_LOG] Sent delete request for %s resource: %s", resourceName, name)
199+
}
200+
}
201+
return nil
202+
}

0 commit comments

Comments
 (0)