forked from hashicorp/terraform-provider-google
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for network endpoint groups (hashicorp#630)
Signed-off-by: Modular Magician <[email protected]>
- Loading branch information
1 parent
fb3f5ab
commit 71a7aa6
Showing
5 changed files
with
659 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,384 @@ | ||
// ---------------------------------------------------------------------------- | ||
// | ||
// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** | ||
// | ||
// ---------------------------------------------------------------------------- | ||
// | ||
// This file is automatically generated by Magic Modules and manual | ||
// changes will be clobbered when the file is regenerated. | ||
// | ||
// Please read more about how to change this file in | ||
// .github/CONTRIBUTING.md. | ||
// | ||
// ---------------------------------------------------------------------------- | ||
|
||
package google | ||
|
||
import ( | ||
"fmt" | ||
"log" | ||
"reflect" | ||
"strconv" | ||
"time" | ||
|
||
"github.com/hashicorp/terraform/helper/schema" | ||
"github.com/hashicorp/terraform/helper/validation" | ||
"google.golang.org/api/compute/v1" | ||
) | ||
|
||
func resourceComputeNetworkEndpointGroup() *schema.Resource { | ||
return &schema.Resource{ | ||
Create: resourceComputeNetworkEndpointGroupCreate, | ||
Read: resourceComputeNetworkEndpointGroupRead, | ||
Delete: resourceComputeNetworkEndpointGroupDelete, | ||
|
||
Importer: &schema.ResourceImporter{ | ||
State: resourceComputeNetworkEndpointGroupImport, | ||
}, | ||
|
||
Timeouts: &schema.ResourceTimeout{ | ||
Create: schema.DefaultTimeout(240 * time.Second), | ||
Delete: schema.DefaultTimeout(240 * time.Second), | ||
}, | ||
|
||
Schema: map[string]*schema.Schema{ | ||
"name": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
ValidateFunc: validateGCPName, | ||
}, | ||
"network": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
DiffSuppressFunc: compareSelfLinkOrResourceName, | ||
}, | ||
"default_port": { | ||
Type: schema.TypeInt, | ||
Optional: true, | ||
ForceNew: true, | ||
}, | ||
"description": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
}, | ||
"network_endpoint_type": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
ValidateFunc: validation.StringInSlice([]string{"GCE_VM_IP_PORT", ""}, false), | ||
Default: "GCE_VM_IP_PORT", | ||
}, | ||
"subnetwork": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
DiffSuppressFunc: compareSelfLinkOrResourceName, | ||
}, | ||
"zone": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
Optional: true, | ||
ForceNew: true, | ||
DiffSuppressFunc: compareSelfLinkOrResourceName, | ||
}, | ||
"size": { | ||
Type: schema.TypeInt, | ||
Computed: true, | ||
}, | ||
"project": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
Computed: true, | ||
ForceNew: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func resourceComputeNetworkEndpointGroupCreate(d *schema.ResourceData, meta interface{}) error { | ||
config := meta.(*Config) | ||
|
||
obj := make(map[string]interface{}) | ||
nameProp, err := expandComputeNetworkEndpointGroupName(d.Get("name"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) { | ||
obj["name"] = nameProp | ||
} | ||
descriptionProp, err := expandComputeNetworkEndpointGroupDescription(d.Get("description"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("description"); !isEmptyValue(reflect.ValueOf(descriptionProp)) && (ok || !reflect.DeepEqual(v, descriptionProp)) { | ||
obj["description"] = descriptionProp | ||
} | ||
networkEndpointTypeProp, err := expandComputeNetworkEndpointGroupNetworkEndpointType(d.Get("network_endpoint_type"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("network_endpoint_type"); !isEmptyValue(reflect.ValueOf(networkEndpointTypeProp)) && (ok || !reflect.DeepEqual(v, networkEndpointTypeProp)) { | ||
obj["networkEndpointType"] = networkEndpointTypeProp | ||
} | ||
networkProp, err := expandComputeNetworkEndpointGroupNetwork(d.Get("network"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("network"); !isEmptyValue(reflect.ValueOf(networkProp)) && (ok || !reflect.DeepEqual(v, networkProp)) { | ||
obj["network"] = networkProp | ||
} | ||
subnetworkProp, err := expandComputeNetworkEndpointGroupSubnetwork(d.Get("subnetwork"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("subnetwork"); !isEmptyValue(reflect.ValueOf(subnetworkProp)) && (ok || !reflect.DeepEqual(v, subnetworkProp)) { | ||
obj["subnetwork"] = subnetworkProp | ||
} | ||
defaultPortProp, err := expandComputeNetworkEndpointGroupDefaultPort(d.Get("default_port"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("default_port"); !isEmptyValue(reflect.ValueOf(defaultPortProp)) && (ok || !reflect.DeepEqual(v, defaultPortProp)) { | ||
obj["defaultPort"] = defaultPortProp | ||
} | ||
zoneProp, err := expandComputeNetworkEndpointGroupZone(d.Get("zone"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("zone"); !isEmptyValue(reflect.ValueOf(zoneProp)) && (ok || !reflect.DeepEqual(v, zoneProp)) { | ||
obj["zone"] = zoneProp | ||
} | ||
|
||
url, err := replaceVars(d, config, "https://www.googleapis.com/compute/beta/projects/{{project}}/zones/{{zone}}/networkEndpointGroups") | ||
if err != nil { | ||
return err | ||
} | ||
|
||
log.Printf("[DEBUG] Creating new NetworkEndpointGroup: %#v", obj) | ||
res, err := sendRequestWithTimeout(config, "POST", url, obj, d.Timeout(schema.TimeoutCreate)) | ||
if err != nil { | ||
return fmt.Errorf("Error creating NetworkEndpointGroup: %s", err) | ||
} | ||
|
||
// Store the ID now | ||
id, err := replaceVars(d, config, "{{name}}") | ||
if err != nil { | ||
return fmt.Errorf("Error constructing id: %s", err) | ||
} | ||
d.SetId(id) | ||
|
||
project, err := getProject(d, config) | ||
if err != nil { | ||
return err | ||
} | ||
op := &compute.Operation{} | ||
err = Convert(res, op) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
waitErr := computeOperationWaitTime( | ||
config.clientCompute, op, project, "Creating NetworkEndpointGroup", | ||
int(d.Timeout(schema.TimeoutCreate).Minutes())) | ||
|
||
if waitErr != nil { | ||
// The resource didn't actually create | ||
d.SetId("") | ||
return fmt.Errorf("Error waiting to create NetworkEndpointGroup: %s", waitErr) | ||
} | ||
|
||
log.Printf("[DEBUG] Finished creating NetworkEndpointGroup %q: %#v", d.Id(), res) | ||
|
||
return resourceComputeNetworkEndpointGroupRead(d, meta) | ||
} | ||
|
||
func resourceComputeNetworkEndpointGroupRead(d *schema.ResourceData, meta interface{}) error { | ||
config := meta.(*Config) | ||
|
||
url, err := replaceVars(d, config, "https://www.googleapis.com/compute/beta/projects/{{project}}/zones/{{zone}}/networkEndpointGroups/{{name}}") | ||
if err != nil { | ||
return err | ||
} | ||
|
||
res, err := sendRequest(config, "GET", url, nil) | ||
if err != nil { | ||
return handleNotFoundError(err, d, fmt.Sprintf("ComputeNetworkEndpointGroup %q", d.Id())) | ||
} | ||
|
||
project, err := getProject(d, config) | ||
if err != nil { | ||
return err | ||
} | ||
if err := d.Set("project", project); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
|
||
if err := d.Set("name", flattenComputeNetworkEndpointGroupName(res["name"], d)); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
if err := d.Set("description", flattenComputeNetworkEndpointGroupDescription(res["description"], d)); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
if err := d.Set("network_endpoint_type", flattenComputeNetworkEndpointGroupNetworkEndpointType(res["networkEndpointType"], d)); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
if err := d.Set("size", flattenComputeNetworkEndpointGroupSize(res["size"], d)); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
if err := d.Set("network", flattenComputeNetworkEndpointGroupNetwork(res["network"], d)); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
if err := d.Set("subnetwork", flattenComputeNetworkEndpointGroupSubnetwork(res["subnetwork"], d)); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
if err := d.Set("default_port", flattenComputeNetworkEndpointGroupDefaultPort(res["defaultPort"], d)); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
if err := d.Set("zone", flattenComputeNetworkEndpointGroupZone(res["zone"], d)); err != nil { | ||
return fmt.Errorf("Error reading NetworkEndpointGroup: %s", err) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func resourceComputeNetworkEndpointGroupDelete(d *schema.ResourceData, meta interface{}) error { | ||
config := meta.(*Config) | ||
|
||
url, err := replaceVars(d, config, "https://www.googleapis.com/compute/beta/projects/{{project}}/zones/{{zone}}/networkEndpointGroups/{{name}}") | ||
if err != nil { | ||
return err | ||
} | ||
|
||
var obj map[string]interface{} | ||
log.Printf("[DEBUG] Deleting NetworkEndpointGroup %q", d.Id()) | ||
res, err := sendRequestWithTimeout(config, "DELETE", url, obj, d.Timeout(schema.TimeoutDelete)) | ||
if err != nil { | ||
return handleNotFoundError(err, d, "NetworkEndpointGroup") | ||
} | ||
|
||
project, err := getProject(d, config) | ||
if err != nil { | ||
return err | ||
} | ||
op := &compute.Operation{} | ||
err = Convert(res, op) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
err = computeOperationWaitTime( | ||
config.clientCompute, op, project, "Deleting NetworkEndpointGroup", | ||
int(d.Timeout(schema.TimeoutDelete).Minutes())) | ||
|
||
if err != nil { | ||
return err | ||
} | ||
|
||
log.Printf("[DEBUG] Finished deleting NetworkEndpointGroup %q: %#v", d.Id(), res) | ||
return nil | ||
} | ||
|
||
func resourceComputeNetworkEndpointGroupImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { | ||
config := meta.(*Config) | ||
if err := parseImportId([]string{"projects/(?P<project>[^/]+)/zones/(?P<zone>[^/]+)/networkEndpointGroups/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config); err != nil { | ||
return nil, err | ||
} | ||
|
||
// Replace import id for the resource id | ||
id, err := replaceVars(d, config, "{{name}}") | ||
if err != nil { | ||
return nil, fmt.Errorf("Error constructing id: %s", err) | ||
} | ||
d.SetId(id) | ||
|
||
return []*schema.ResourceData{d}, nil | ||
} | ||
|
||
func flattenComputeNetworkEndpointGroupName(v interface{}, d *schema.ResourceData) interface{} { | ||
return v | ||
} | ||
|
||
func flattenComputeNetworkEndpointGroupDescription(v interface{}, d *schema.ResourceData) interface{} { | ||
return v | ||
} | ||
|
||
func flattenComputeNetworkEndpointGroupNetworkEndpointType(v interface{}, d *schema.ResourceData) interface{} { | ||
return v | ||
} | ||
|
||
func flattenComputeNetworkEndpointGroupSize(v interface{}, d *schema.ResourceData) interface{} { | ||
// Handles the string fixed64 format | ||
if strVal, ok := v.(string); ok { | ||
if intVal, err := strconv.ParseInt(strVal, 10, 64); err == nil { | ||
return intVal | ||
} // let terraform core handle it if we can't convert the string to an int. | ||
} | ||
return v | ||
} | ||
|
||
func flattenComputeNetworkEndpointGroupNetwork(v interface{}, d *schema.ResourceData) interface{} { | ||
if v == nil { | ||
return v | ||
} | ||
return ConvertSelfLinkToV1(v.(string)) | ||
} | ||
|
||
func flattenComputeNetworkEndpointGroupSubnetwork(v interface{}, d *schema.ResourceData) interface{} { | ||
if v == nil { | ||
return v | ||
} | ||
return ConvertSelfLinkToV1(v.(string)) | ||
} | ||
|
||
func flattenComputeNetworkEndpointGroupDefaultPort(v interface{}, d *schema.ResourceData) interface{} { | ||
// Handles the string fixed64 format | ||
if strVal, ok := v.(string); ok { | ||
if intVal, err := strconv.ParseInt(strVal, 10, 64); err == nil { | ||
return intVal | ||
} // let terraform core handle it if we can't convert the string to an int. | ||
} | ||
return v | ||
} | ||
|
||
func flattenComputeNetworkEndpointGroupZone(v interface{}, d *schema.ResourceData) interface{} { | ||
if v == nil { | ||
return v | ||
} | ||
return ConvertSelfLinkToV1(v.(string)) | ||
} | ||
|
||
func expandComputeNetworkEndpointGroupName(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
return v, nil | ||
} | ||
|
||
func expandComputeNetworkEndpointGroupDescription(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
return v, nil | ||
} | ||
|
||
func expandComputeNetworkEndpointGroupNetworkEndpointType(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
return v, nil | ||
} | ||
|
||
func expandComputeNetworkEndpointGroupNetwork(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
f, err := parseGlobalFieldValue("networks", v.(string), "project", d, config, true) | ||
if err != nil { | ||
return nil, fmt.Errorf("Invalid value for network: %s", err) | ||
} | ||
return f.RelativeLink(), nil | ||
} | ||
|
||
func expandComputeNetworkEndpointGroupSubnetwork(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
f, err := parseRegionalFieldValue("subnetworks", v.(string), "project", "region", "zone", d, config, true) | ||
if err != nil { | ||
return nil, fmt.Errorf("Invalid value for subnetwork: %s", err) | ||
} | ||
return f.RelativeLink(), nil | ||
} | ||
|
||
func expandComputeNetworkEndpointGroupDefaultPort(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
return v, nil | ||
} | ||
|
||
func expandComputeNetworkEndpointGroupZone(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
f, err := parseGlobalFieldValue("zones", v.(string), "project", d, config, true) | ||
if err != nil { | ||
return nil, fmt.Errorf("Invalid value for zone: %s", err) | ||
} | ||
return f.RelativeLink(), nil | ||
} |
Oops, something went wrong.