Skip to content

Commit 66142f5

Browse files
ACM: service perimeter's vpc_accessible_services (#3318) (#1910)
Signed-off-by: Modular Magician <[email protected]>
1 parent f923ff2 commit 66142f5

File tree

4 files changed

+164
-0
lines changed

4 files changed

+164
-0
lines changed

.changelog/3318.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
accesscontextmanager: added `status.vpc_accessible_services` to `google_access_context_manager_service_perimeter` to control which services are available from the perimeter's VPC networks to the restricted Google APIs IP address range.
3+
```

google-beta/resource_access_context_manager_service_perimeter.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,33 @@ restrictions.`,
144144
Set: schema.HashString,
145145
AtLeastOneOf: []string{"status.0.resources", "status.0.access_levels", "status.0.restricted_services"},
146146
},
147+
"vpc_accessible_services": {
148+
Type: schema.TypeList,
149+
Optional: true,
150+
Description: `Specifies how APIs are allowed to communicate within the Service
151+
Perimeter.`,
152+
MaxItems: 1,
153+
Elem: &schema.Resource{
154+
Schema: map[string]*schema.Schema{
155+
"allowed_services": {
156+
Type: schema.TypeSet,
157+
Optional: true,
158+
Description: `The list of APIs usable within the Service Perimeter.
159+
Must be empty unless 'enableRestriction' is True.`,
160+
Elem: &schema.Schema{
161+
Type: schema.TypeString,
162+
},
163+
Set: schema.HashString,
164+
},
165+
"enable_restriction": {
166+
Type: schema.TypeBool,
167+
Optional: true,
168+
Description: `Whether to restrict API calls within the Service Perimeter to the
169+
list of APIs specified in 'allowedServices'.`,
170+
},
171+
},
172+
},
173+
},
147174
},
148175
},
149176
},
@@ -464,6 +491,8 @@ func flattenAccessContextManagerServicePerimeterStatus(v interface{}, d *schema.
464491
flattenAccessContextManagerServicePerimeterStatusAccessLevels(original["accessLevels"], d, config)
465492
transformed["restricted_services"] =
466493
flattenAccessContextManagerServicePerimeterStatusRestrictedServices(original["restrictedServices"], d, config)
494+
transformed["vpc_accessible_services"] =
495+
flattenAccessContextManagerServicePerimeterStatusVPCAccessibleServices(original["vpcAccessibleServices"], d, config)
467496
return []interface{}{transformed}
468497
}
469498
func flattenAccessContextManagerServicePerimeterStatusResources(v interface{}, d *schema.ResourceData, config *Config) interface{} {
@@ -481,6 +510,32 @@ func flattenAccessContextManagerServicePerimeterStatusRestrictedServices(v inter
481510
return schema.NewSet(schema.HashString, v.([]interface{}))
482511
}
483512

513+
func flattenAccessContextManagerServicePerimeterStatusVPCAccessibleServices(v interface{}, d *schema.ResourceData, config *Config) interface{} {
514+
if v == nil {
515+
return nil
516+
}
517+
original := v.(map[string]interface{})
518+
if len(original) == 0 {
519+
return nil
520+
}
521+
transformed := make(map[string]interface{})
522+
transformed["enable_restriction"] =
523+
flattenAccessContextManagerServicePerimeterStatusVPCAccessibleServicesEnableRestriction(original["enableRestriction"], d, config)
524+
transformed["allowed_services"] =
525+
flattenAccessContextManagerServicePerimeterStatusVPCAccessibleServicesAllowedServices(original["allowedServices"], d, config)
526+
return []interface{}{transformed}
527+
}
528+
func flattenAccessContextManagerServicePerimeterStatusVPCAccessibleServicesEnableRestriction(v interface{}, d *schema.ResourceData, config *Config) interface{} {
529+
return v
530+
}
531+
532+
func flattenAccessContextManagerServicePerimeterStatusVPCAccessibleServicesAllowedServices(v interface{}, d *schema.ResourceData, config *Config) interface{} {
533+
if v == nil {
534+
return v
535+
}
536+
return schema.NewSet(schema.HashString, v.([]interface{}))
537+
}
538+
484539
func flattenAccessContextManagerServicePerimeterName(v interface{}, d *schema.ResourceData, config *Config) interface{} {
485540
return v
486541
}
@@ -527,6 +582,13 @@ func expandAccessContextManagerServicePerimeterStatus(v interface{}, d Terraform
527582
transformed["restrictedServices"] = transformedRestrictedServices
528583
}
529584

585+
transformedVPCAccessibleServices, err := expandAccessContextManagerServicePerimeterStatusVPCAccessibleServices(original["vpc_accessible_services"], d, config)
586+
if err != nil {
587+
return nil, err
588+
} else if val := reflect.ValueOf(transformedVPCAccessibleServices); val.IsValid() && !isEmptyValue(val) {
589+
transformed["vpcAccessibleServices"] = transformedVPCAccessibleServices
590+
}
591+
530592
return transformed, nil
531593
}
532594

@@ -543,6 +605,41 @@ func expandAccessContextManagerServicePerimeterStatusRestrictedServices(v interf
543605
return v, nil
544606
}
545607

608+
func expandAccessContextManagerServicePerimeterStatusVPCAccessibleServices(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
609+
l := v.([]interface{})
610+
if len(l) == 0 || l[0] == nil {
611+
return nil, nil
612+
}
613+
raw := l[0]
614+
original := raw.(map[string]interface{})
615+
transformed := make(map[string]interface{})
616+
617+
transformedEnableRestriction, err := expandAccessContextManagerServicePerimeterStatusVPCAccessibleServicesEnableRestriction(original["enable_restriction"], d, config)
618+
if err != nil {
619+
return nil, err
620+
} else if val := reflect.ValueOf(transformedEnableRestriction); val.IsValid() && !isEmptyValue(val) {
621+
transformed["enableRestriction"] = transformedEnableRestriction
622+
}
623+
624+
transformedAllowedServices, err := expandAccessContextManagerServicePerimeterStatusVPCAccessibleServicesAllowedServices(original["allowed_services"], d, config)
625+
if err != nil {
626+
return nil, err
627+
} else if val := reflect.ValueOf(transformedAllowedServices); val.IsValid() && !isEmptyValue(val) {
628+
transformed["allowedServices"] = transformedAllowedServices
629+
}
630+
631+
return transformed, nil
632+
}
633+
634+
func expandAccessContextManagerServicePerimeterStatusVPCAccessibleServicesEnableRestriction(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
635+
return v, nil
636+
}
637+
638+
func expandAccessContextManagerServicePerimeterStatusVPCAccessibleServicesAllowedServices(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
639+
v = v.(*schema.Set).List()
640+
return v, nil
641+
}
642+
546643
func expandAccessContextManagerServicePerimeterParent(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
547644
return v, nil
548645
}

google-beta/resource_access_context_manager_service_perimeter_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ func testAccAccessContextManagerServicePerimeter_updateTest(t *testing.T) {
5454
ImportState: true,
5555
ImportStateVerify: true,
5656
},
57+
{
58+
Config: testAccAccessContextManagerServicePerimeter_updateAllowed(org, "my policy", "level", "perimeter"),
59+
},
60+
{
61+
ResourceName: "google_access_context_manager_service_perimeter.test-access",
62+
ImportState: true,
63+
ImportStateVerify: true,
64+
},
5765
},
5866
})
5967
}
@@ -144,3 +152,41 @@ resource "google_access_context_manager_service_perimeter" "test-access" {
144152
}
145153
`, org, policyTitle, levelTitleName, levelTitleName, perimeterTitleName, perimeterTitleName)
146154
}
155+
156+
func testAccAccessContextManagerServicePerimeter_updateAllowed(org, policyTitle, levelTitleName, perimeterTitleName string) string {
157+
return fmt.Sprintf(`
158+
resource "google_access_context_manager_access_policy" "test-access" {
159+
parent = "organizations/%s"
160+
title = "%s"
161+
}
162+
163+
resource "google_access_context_manager_access_level" "test-access" {
164+
parent = "accessPolicies/${google_access_context_manager_access_policy.test-access.name}"
165+
name = "accessPolicies/${google_access_context_manager_access_policy.test-access.name}/accessLevels/%s"
166+
title = "%s"
167+
description = "hello"
168+
basic {
169+
combining_function = "AND"
170+
conditions {
171+
ip_subnetworks = ["192.0.4.0/24"]
172+
}
173+
}
174+
}
175+
176+
resource "google_access_context_manager_service_perimeter" "test-access" {
177+
parent = "accessPolicies/${google_access_context_manager_access_policy.test-access.name}"
178+
name = "accessPolicies/${google_access_context_manager_access_policy.test-access.name}/servicePerimeters/%s"
179+
title = "%s"
180+
perimeter_type = "PERIMETER_TYPE_REGULAR"
181+
status {
182+
restricted_services = ["bigquery.googleapis.com"]
183+
access_levels = [google_access_context_manager_access_level.test-access.name]
184+
185+
vpc_accessible_services {
186+
enable_restriction = true
187+
allowed_services = ["bigquery.googleapis.com"]
188+
}
189+
}
190+
}
191+
`, org, policyTitle, levelTitleName, levelTitleName, perimeterTitleName, perimeterTitleName)
192+
}

website/docs/r/access_context_manager_service_perimeter.html.markdown

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,24 @@ The `status` block supports:
162162
buckets inside the perimeter must meet the perimeter's access
163163
restrictions.
164164

165+
* `vpc_accessible_services` -
166+
(Optional)
167+
Specifies how APIs are allowed to communicate within the Service
168+
Perimeter. Structure is documented below.
169+
170+
171+
The `vpc_accessible_services` block supports:
172+
173+
* `enable_restriction` -
174+
(Optional)
175+
Whether to restrict API calls within the Service Perimeter to the
176+
list of APIs specified in 'allowedServices'.
177+
178+
* `allowed_services` -
179+
(Optional)
180+
The list of APIs usable within the Service Perimeter.
181+
Must be empty unless `enableRestriction` is True.
182+
165183
## Attributes Reference
166184

167185
In addition to the arguments listed above, the following computed attributes are exported:

0 commit comments

Comments
 (0)