Skip to content

Commit 06dbff5

Browse files
patrickmoyrainshen49
authored andcommitted
Add handwritten sweeper for google_data_loss_prevention_discovery_config (GoogleCloudPlatform#11429)
1 parent 0bac775 commit 06dbff5

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

mmv1/products/dlp/DiscoveryConfig.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ references: !ruby/object:Api::Resource::ReferenceLinks
2929
'Schedule inspection scan': 'https://cloud.google.com/dlp/docs/schedule-inspection-scan'
3030
api: 'https://cloud.google.com/dlp/docs/reference/rest/v2/projects.locations.discoveryConfigs'
3131
id_format: '{{parent}}/discoveryConfigs/{{name}}'
32+
skip_sweeper: true
3233
examples:
3334
- !ruby/object:Provider::Terraform::Examples
3435
name: 'dlp_discovery_config_basic'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package datalossprevention
2+
3+
import (
4+
"context"
5+
"log"
6+
"strings"
7+
8+
"github.com/hashicorp/terraform-provider-google/google/sweeper"
9+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
10+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
11+
)
12+
13+
func init() {
14+
sweeper.AddTestSweepers("DataLossPreventionDiscoveryConfig", testSweepDataLossPreventionDiscoveryConfig)
15+
}
16+
17+
// At the time of writing, the CI only passes us-central1 as the region
18+
func testSweepDataLossPreventionDiscoveryConfig(region string) error {
19+
resourceName := "DataLossPreventionDiscoveryConfig"
20+
log.Printf("[INFO][SWEEPER_LOG] Starting sweeper for %s", resourceName)
21+
22+
config, err := sweeper.SharedConfigForRegion(region)
23+
if err != nil {
24+
log.Printf("[INFO][SWEEPER_LOG] error getting shared config for region: %s", err)
25+
return err
26+
}
27+
28+
err = config.LoadAndValidate(context.Background())
29+
if err != nil {
30+
log.Printf("[INFO][SWEEPER_LOG] error loading: %s", err)
31+
return err
32+
}
33+
34+
// Setup variables to replace in list template
35+
d := &tpgresource.ResourceDataMock{
36+
FieldsInSchema: map[string]interface{}{
37+
"project": config.Project,
38+
"region": region,
39+
"location": region,
40+
"zone": "-",
41+
},
42+
}
43+
44+
listTemplate := strings.Split("https://dlp.googleapis.com/v2/projects/{{project}}/locations/{{location}}/discoveryConfigs", "?")[0]
45+
listUrl, err := tpgresource.ReplaceVars(d, config, listTemplate)
46+
if err != nil {
47+
log.Printf("[INFO][SWEEPER_LOG] error preparing sweeper list url: %s", err)
48+
return nil
49+
}
50+
51+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
52+
Config: config,
53+
Method: "GET",
54+
Project: config.Project,
55+
RawURL: listUrl,
56+
UserAgent: config.UserAgent,
57+
})
58+
if err != nil {
59+
log.Printf("[INFO][SWEEPER_LOG] Error in response from request %s: %s", listUrl, err)
60+
return nil
61+
}
62+
63+
resourceList, ok := res["discoveryConfigs"]
64+
if !ok {
65+
log.Printf("[INFO][SWEEPER_LOG] Nothing found in response.")
66+
return nil
67+
}
68+
69+
rl := resourceList.([]interface{})
70+
71+
log.Printf("[INFO][SWEEPER_LOG] Found %d items in %s list response.", len(rl), resourceName)
72+
for _, ri := range rl {
73+
obj := ri.(map[string]interface{})
74+
if obj["name"] == nil {
75+
log.Printf("[INFO][SWEEPER_LOG] %s resource name was nil", resourceName)
76+
return nil
77+
}
78+
79+
// Note that we do not check for a sweepable prefix here.
80+
// We can have at most 1 DiscoveryConfig for a storage type in the same project/location, so ensure we delete everything.
81+
name := tpgresource.GetResourceNameFromSelfLink(obj["name"].(string))
82+
83+
deleteTemplate := "https://dlp.googleapis.com/v2/projects/{{project}}/locations/{{location}}/discoveryConfigs/{{name}}"
84+
deleteUrl, err := tpgresource.ReplaceVars(d, config, deleteTemplate)
85+
if err != nil {
86+
log.Printf("[INFO][SWEEPER_LOG] error preparing delete url: %s", err)
87+
return nil
88+
}
89+
deleteUrl = deleteUrl + name
90+
91+
// Don't wait on operations as we may have a lot to delete
92+
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
93+
Config: config,
94+
Method: "DELETE",
95+
Project: config.Project,
96+
RawURL: deleteUrl,
97+
UserAgent: config.UserAgent,
98+
})
99+
if err != nil {
100+
log.Printf("[INFO][SWEEPER_LOG] Error deleting for url %s : %s", deleteUrl, err)
101+
} else {
102+
log.Printf("[INFO][SWEEPER_LOG] Sent delete request for %s resource: %s", resourceName, name)
103+
}
104+
}
105+
return nil
106+
}

0 commit comments

Comments
 (0)