Skip to content

Commit 6ac132e

Browse files
modular-magiciantrodge
authored andcommitted
Monitoring monitored project (#8322) (#5882)
* Allow property to work for monitoring monitored project * Change display name * Move handling of long form to encoder * Add error retry predicate * Add a pre-read * Retry all 403 errors Signed-off-by: Modular Magician <[email protected]>
1 parent 23f7fe8 commit 6ac132e

File tree

5 files changed

+52
-33
lines changed

5 files changed

+52
-33
lines changed

.changelog/8322.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:none
2+
3+
```

google-beta/resource_monitoring_monitored_project_generated_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ func testAccMonitoringMonitoredProject_monitoringMonitoredProjectBasicExample(co
6363
return acctest.Nprintf(`
6464
resource "google_monitoring_monitored_project" "primary" {
6565
metrics_scope = "%{project_id}"
66-
name = google_project.basic.name
66+
name = google_project.basic.project_id
6767
}
6868
6969
resource "google_project" "basic" {
7070
project_id = "tf-test-m-id%{random_suffix}"
71-
name = "tf-test-m-id%{random_suffix}"
71+
name = "tf-test-m-id%{random_suffix}-display"
7272
org_id = "%{org_id}"
7373
}
7474
`, context)

google-beta/services/monitoring/resource_monitoring_monitored_project.go

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"fmt"
2222
"log"
2323
"reflect"
24-
"strings"
2524
"time"
2625

2726
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -47,10 +46,11 @@ func ResourceMonitoringMonitoredProject() *schema.Resource {
4746

4847
Schema: map[string]*schema.Schema{
4948
"metrics_scope": {
50-
Type: schema.TypeString,
51-
Required: true,
52-
ForceNew: true,
53-
Description: `Required. The resource name of the existing Metrics Scope that will monitor this project. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}`,
49+
Type: schema.TypeString,
50+
Required: true,
51+
ForceNew: true,
52+
DiffSuppressFunc: tpgresource.CompareResourceNames,
53+
Description: `Required. The resource name of the existing Metrics Scope that will monitor this project. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}`,
5454
},
5555
"name": {
5656
Type: schema.TypeString,
@@ -92,7 +92,6 @@ func resourceMonitoringMonitoredProjectCreate(d *schema.ResourceData, meta inter
9292
if err != nil {
9393
return err
9494
}
95-
url = strings.ReplaceAll(url, "projects/projects/", "projects/")
9695

9796
log.Printf("[DEBUG] Creating new MonitoredProject: %#v", obj)
9897
billingProject := ""
@@ -103,13 +102,14 @@ func resourceMonitoringMonitoredProjectCreate(d *schema.ResourceData, meta inter
103102
}
104103

105104
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
106-
Config: config,
107-
Method: "POST",
108-
Project: billingProject,
109-
RawURL: url,
110-
UserAgent: userAgent,
111-
Body: obj,
112-
Timeout: d.Timeout(schema.TimeoutCreate),
105+
Config: config,
106+
Method: "POST",
107+
Project: billingProject,
108+
RawURL: url,
109+
UserAgent: userAgent,
110+
Body: obj,
111+
Timeout: d.Timeout(schema.TimeoutCreate),
112+
ErrorRetryPredicates: []transport_tpg.RetryErrorPredicateFunc{transport_tpg.IsMonitoringPermissionError},
113113
})
114114
if err != nil {
115115
return fmt.Errorf("Error creating MonitoredProject: %s", err)
@@ -120,7 +120,6 @@ func resourceMonitoringMonitoredProjectCreate(d *schema.ResourceData, meta inter
120120
if err != nil {
121121
return fmt.Errorf("Error constructing id: %s", err)
122122
}
123-
id = strings.ReplaceAll(id, "projects/projects/", "projects/")
124123
d.SetId(id)
125124

126125
log.Printf("[DEBUG] Finished creating MonitoredProject %q: %#v", d.Id(), res)
@@ -139,7 +138,6 @@ func resourceMonitoringMonitoredProjectRead(d *schema.ResourceData, meta interfa
139138
if err != nil {
140139
return err
141140
}
142-
url = strings.ReplaceAll(url, "projects/projects/", "projects/")
143141

144142
billingProject := ""
145143

@@ -148,12 +146,20 @@ func resourceMonitoringMonitoredProjectRead(d *schema.ResourceData, meta interfa
148146
billingProject = bp
149147
}
150148

149+
metricsScope := d.Get("metrics_scope").(string)
150+
metricsScope = tpgresource.GetResourceNameFromSelfLink(metricsScope)
151+
d.Set("metrics_scope", metricsScope)
152+
url, err = tpgresource.ReplaceVars(d, config, "{{MonitoringBasePath}}v1/locations/global/metricsScopes/{{metrics_scope}}")
153+
if err != nil {
154+
return err
155+
}
151156
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
152-
Config: config,
153-
Method: "GET",
154-
Project: billingProject,
155-
RawURL: url,
156-
UserAgent: userAgent,
157+
Config: config,
158+
Method: "GET",
159+
Project: billingProject,
160+
RawURL: url,
161+
UserAgent: userAgent,
162+
ErrorRetryPredicates: []transport_tpg.RetryErrorPredicateFunc{transport_tpg.IsMonitoringPermissionError},
157163
})
158164
if err != nil {
159165
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("MonitoringMonitoredProject %q", d.Id()))
@@ -206,7 +212,6 @@ func resourceMonitoringMonitoredProjectDelete(d *schema.ResourceData, meta inter
206212
if err != nil {
207213
return err
208214
}
209-
url = strings.ReplaceAll(url, "projects/projects/", "projects/")
210215

211216
var obj map[string]interface{}
212217
log.Printf("[DEBUG] Deleting MonitoredProject %q", d.Id())
@@ -217,13 +222,14 @@ func resourceMonitoringMonitoredProjectDelete(d *schema.ResourceData, meta inter
217222
}
218223

219224
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
220-
Config: config,
221-
Method: "DELETE",
222-
Project: billingProject,
223-
RawURL: url,
224-
UserAgent: userAgent,
225-
Body: obj,
226-
Timeout: d.Timeout(schema.TimeoutDelete),
225+
Config: config,
226+
Method: "DELETE",
227+
Project: billingProject,
228+
RawURL: url,
229+
UserAgent: userAgent,
230+
Body: obj,
231+
Timeout: d.Timeout(schema.TimeoutDelete),
232+
ErrorRetryPredicates: []transport_tpg.RetryErrorPredicateFunc{transport_tpg.IsMonitoringPermissionError},
227233
})
228234
if err != nil {
229235
return transport_tpg.HandleNotFoundError(err, d, "MonitoredProject")
@@ -247,7 +253,6 @@ func resourceMonitoringMonitoredProjectImport(d *schema.ResourceData, meta inter
247253
if err != nil {
248254
return nil, fmt.Errorf("Error constructing id: %s", err)
249255
}
250-
id = strings.ReplaceAll(id, "projects/projects/", "projects/")
251256
d.SetId(id)
252257

253258
return []*schema.ResourceData{d}, nil
@@ -270,6 +275,7 @@ func resourceMonitoringMonitoredProjectEncoder(d *schema.ResourceData, meta inte
270275
name = tpgresource.GetResourceNameFromSelfLink(name)
271276
metricsScope := d.Get("metrics_scope").(string)
272277
metricsScope = tpgresource.GetResourceNameFromSelfLink(metricsScope)
278+
d.Set("metrics_scope", metricsScope)
273279
obj["name"] = fmt.Sprintf("locations/global/metricsScopes/%s/projects/%s", metricsScope, name)
274280
return obj, nil
275281
}

google-beta/transport/error_retry_predicates.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,16 @@ func IsMonitoringConcurrentEditError(err error) (bool, string) {
273273
return false, ""
274274
}
275275

276+
// Retry if Monitoring operation returns a 403
277+
func IsMonitoringPermissionError(err error) (bool, string) {
278+
if gerr, ok := err.(*googleapi.Error); ok {
279+
if gerr.Code == 403 {
280+
return true, "Waiting for project to be ready for metrics scope"
281+
}
282+
}
283+
return false, ""
284+
}
285+
276286
// Retry if KMS CryptoKeyVersions returns a 400 for PENDING_GENERATION
277287
func IsCryptoKeyVersionsPendingGeneration(err error) (bool, string) {
278288
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 400 {

website/docs/r/monitoring_monitored_project.html.markdown

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ To get more information about MonitoredProject, see:
3434
```hcl
3535
resource "google_monitoring_monitored_project" "primary" {
3636
metrics_scope = "my-project-name"
37-
name = google_project.basic.name
37+
name = google_project.basic.project_id
3838
}
3939
4040
resource "google_project" "basic" {
4141
project_id = "m-id"
42-
name = "m-id"
42+
name = "m-id-display"
4343
org_id = "123456789"
4444
}
4545
```

0 commit comments

Comments
 (0)