blob: 948330762841bd02a642e8c8726b5792cf0b260a [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
// ----------------------------------------------------------------------------
//
// *** AUTO GENERATED CODE *** Type: MMv1 ***
//
// ----------------------------------------------------------------------------
//
// 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 edgecontainer
import (
"fmt"
"log"
"net/http"
"reflect"
"strings"
"time"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/verify"
)
func ResourceEdgecontainerCluster() *schema.Resource {
return &schema.Resource{
Create: resourceEdgecontainerClusterCreate,
Read: resourceEdgecontainerClusterRead,
Update: resourceEdgecontainerClusterUpdate,
Delete: resourceEdgecontainerClusterDelete,
Importer: &schema.ResourceImporter{
State: resourceEdgecontainerClusterImport,
},
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(480 * time.Minute),
Update: schema.DefaultTimeout(480 * time.Minute),
Delete: schema.DefaultTimeout(480 * time.Minute),
},
CustomizeDiff: customdiff.All(
tpgresource.SetLabelsDiff,
tpgresource.DefaultProviderProject,
),
Schema: map[string]*schema.Schema{
"authorization": {
Type: schema.TypeList,
Required: true,
ForceNew: true,
Description: `RBAC policy that will be applied and managed by GEC.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"admin_users": {
Type: schema.TypeList,
Required: true,
Description: `User that will be granted the cluster-admin role on the cluster, providing
full access to the cluster. Currently, this is a singular field, but will
be expanded to allow multiple admins in the future.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"username": {
Type: schema.TypeString,
Required: true,
Description: `An active Google username.`,
},
},
},
},
},
},
},
"fleet": {
Type: schema.TypeList,
Required: true,
ForceNew: true,
Description: `Fleet related configuration.
Fleets are a Google Cloud concept for logically organizing clusters,
letting you use and manage multi-cluster capabilities and apply
consistent policies across your systems.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"project": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: `The name of the Fleet host project where this cluster will be registered.
Project names are formatted as
'projects/<project-number>'.`,
},
"membership": {
Type: schema.TypeString,
Computed: true,
Description: `The name of the managed Hub Membership resource associated to this cluster.
Membership names are formatted as
'projects/<project-number>/locations/global/membership/<cluster-id>'.`,
},
},
},
},
"location": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: `The location of the resource.`,
},
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: `The GDCE cluster name.`,
},
"networking": {
Type: schema.TypeList,
Required: true,
Description: `Fleet related configuration.
Fleets are a Google Cloud concept for logically organizing clusters,
letting you use and manage multi-cluster capabilities and apply
consistent policies across your systems.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"cluster_ipv4_cidr_blocks": {
Type: schema.TypeList,
Required: true,
ForceNew: true,
Description: `All pods in the cluster are assigned an RFC1918 IPv4 address from these
blocks. Only a single block is supported. This field cannot be changed
after creation.`,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"services_ipv4_cidr_blocks": {
Type: schema.TypeList,
Required: true,
ForceNew: true,
Description: `All services in the cluster are assigned an RFC1918 IPv4 address from these
blocks. Only a single block is supported. This field cannot be changed
after creation.`,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"cluster_ipv6_cidr_blocks": {
Type: schema.TypeList,
Optional: true,
ForceNew: true,
Description: `If specified, dual stack mode is enabled and all pods in the cluster are
assigned an IPv6 address from these blocks alongside from an IPv4
address. Only a single block is supported. This field cannot be changed
after creation.`,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"services_ipv6_cidr_blocks": {
Type: schema.TypeList,
Optional: true,
ForceNew: true,
Description: `If specified, dual stack mode is enabled and all services in the cluster are
assigned an IPv6 address from these blocks alongside from an IPv4
address. Only a single block is supported. This field cannot be changed
after creation.`,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"network_type": {
Type: schema.TypeString,
Computed: true,
Description: `IP addressing type of this cluster i.e. SINGLESTACK_V4 vs DUALSTACK_V4_V6.`,
},
},
},
},
"control_plane": {
Type: schema.TypeList,
Optional: true,
Description: `The configuration of the cluster control plane.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"local": {
Type: schema.TypeList,
Computed: true,
Optional: true,
ForceNew: true,
Description: `Local control plane configuration.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"machine_filter": {
Type: schema.TypeString,
Optional: true,
Description: `Only machines matching this filter will be allowed to host control
plane nodes. The filtering language accepts strings like "name=<name>",
and is documented here: [AIP-160](https://google.aip.dev/160).`,
},
"node_count": {
Type: schema.TypeInt,
Computed: true,
Optional: true,
Description: `The number of nodes to serve as replicas of the Control Plane.
Only 1 and 3 are supported.`,
},
"node_location": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ForceNew: true,
Description: `Name of the Google Distributed Cloud Edge zones where this node pool
will be created. For example: 'us-central1-edge-customer-a'.`,
},
"shared_deployment_policy": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ValidateFunc: verify.ValidateEnum([]string{"SHARED_DEPLOYMENT_POLICY_UNSPECIFIED", "ALLOWED", "DISALLOWED", ""}),
Description: `Policy configuration about how user applications are deployed. Possible values: ["SHARED_DEPLOYMENT_POLICY_UNSPECIFIED", "ALLOWED", "DISALLOWED"]`,
},
},
},
ExactlyOneOf: []string{"control_plane.0.remote", "control_plane.0.local"},
},
"remote": {
Type: schema.TypeList,
Computed: true,
Optional: true,
ForceNew: true,
Description: `Remote control plane configuration.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"node_location": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ForceNew: true,
Description: `Name of the Google Distributed Cloud Edge zones where this node pool
will be created. For example: 'us-central1-edge-customer-a'.`,
},
},
},
ExactlyOneOf: []string{"control_plane.0.remote", "control_plane.0.local"},
},
},
},
},
"control_plane_encryption": {
Type: schema.TypeList,
Computed: true,
Optional: true,
Description: `Remote control plane disk encryption options. This field is only used when
enabling CMEK support.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"kms_key": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ForceNew: true,
Description: `The Cloud KMS CryptoKey e.g.
projects/{project}/locations/{location}/keyRings/{keyRing}/cryptoKeys/{cryptoKey}
to use for protecting control plane disks. If not specified, a
Google-managed key will be used instead.`,
},
"kms_key_active_version": {
Type: schema.TypeString,
Computed: true,
Description: `The Cloud KMS CryptoKeyVersion currently in use for protecting control
plane disks. Only applicable if kms_key is set.`,
},
"kms_key_state": {
Type: schema.TypeString,
Computed: true,
Description: `Availability of the Cloud KMS CryptoKey. If not 'KEY_AVAILABLE', then
nodes may go offline as they cannot access their local data. This can be
caused by a lack of permissions to use the key, or if the key is disabled
or deleted.`,
},
"kms_status": {
Type: schema.TypeList,
Computed: true,
Description: `Error status returned by Cloud KMS when using this key. This field may be
populated only if 'kms_key_state' is not 'KMS_KEY_STATE_KEY_AVAILABLE'.
If populated, this field contains the error status reported by Cloud KMS.`,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"code": {
Type: schema.TypeInt,
Computed: true,
Description: `The status code, which should be an enum value of google.rpc.Code.`,
},
"message": {
Type: schema.TypeString,
Computed: true,
Description: `A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.`,
},
},
},
},
},
},
},
"default_max_pods_per_node": {
Type: schema.TypeInt,
Computed: true,
Optional: true,
Description: `The default maximum number of pods per node used if a maximum value is not
specified explicitly for a node pool in this cluster. If unspecified, the
Kubernetes default value will be used.`,
},
"external_load_balancer_ipv4_address_pools": {
Type: schema.TypeList,
Computed: true,
Optional: true,
Description: `Address pools for cluster data plane external load balancing.`,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"labels": {
Type: schema.TypeMap,
Optional: true,
Description: `User-defined labels for the edgecloud cluster.
**Note**: This field is non-authoritative, and will only manage the labels present in your configuration.
Please refer to the field 'effective_labels' for all of the labels present on the resource.`,
Elem: &schema.Schema{Type: schema.TypeString},
},
"maintenance_policy": {
Type: schema.TypeList,
Computed: true,
Optional: true,
Description: `Cluster-wide maintenance policy configuration.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"window": {
Type: schema.TypeList,
Required: true,
Description: `Specifies the maintenance window in which maintenance may be performed.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"recurring_window": {
Type: schema.TypeList,
Required: true,
Description: `Represents an arbitrary window of time that recurs.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"recurrence": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `An RRULE (https://tools.ietf.org/html/rfc5545#section-3.8.5.3) for how
this window recurs. They go on for the span of time between the start and
end time.`,
},
"window": {
Type: schema.TypeList,
Computed: true,
Optional: true,
Description: `Represents an arbitrary window of time.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"end_time": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `The time that the window ends. The end time must take place after the
start time.`,
},
"start_time": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `The time that the window first starts.`,
},
},
},
},
},
},
},
},
},
},
"maintenance_exclusions": {
Type: schema.TypeList,
Optional: true,
Description: `Exclusions to automatic maintenance. Non-emergency maintenance should not occur
in these windows. Each exclusion has a unique name and may be active or expired.
The max number of maintenance exclusions allowed at a given time is 3.`,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `A unique (per cluster) id for the window.`,
},
"window": {
Type: schema.TypeList,
Computed: true,
Optional: true,
Description: `Represents an arbitrary window of time.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"end_time": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `The time that the window ends. The end time must take place after the
start time.`,
},
"start_time": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `The time that the window first starts.`,
},
},
},
},
},
},
},
},
},
},
"release_channel": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ValidateFunc: verify.ValidateEnum([]string{"RELEASE_CHANNEL_UNSPECIFIED", "NONE", "REGULAR", ""}),
Description: `The release channel a cluster is subscribed to. Possible values: ["RELEASE_CHANNEL_UNSPECIFIED", "NONE", "REGULAR"]`,
},
"system_addons_config": {
Type: schema.TypeList,
Computed: true,
Optional: true,
Description: `Config that customers are allowed to define for GDCE system add-ons.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"ingress": {
Type: schema.TypeList,
Computed: true,
Optional: true,
Description: `Config for the Ingress add-on which allows customers to create an Ingress
object to manage external access to the servers in a cluster. The add-on
consists of istiod and istio-ingress.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"disabled": {
Type: schema.TypeBool,
Computed: true,
Optional: true,
Description: `Whether Ingress is disabled.`,
},
"ipv4_vip": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `Ingress VIP.`,
},
},
},
},
},
},
},
"target_version": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `The target cluster version. For example: "1.5.0".`,
},
"cluster_ca_certificate": {
Type: schema.TypeString,
Computed: true,
Description: `The PEM-encoded public certificate of the cluster's CA.`,
Sensitive: true,
},
"control_plane_version": {
Type: schema.TypeString,
Computed: true,
Description: `The control plane release version.`,
},
"create_time": {
Type: schema.TypeString,
Computed: true,
Description: `The time the cluster was created, in RFC3339 text format.`,
},
"effective_labels": {
Type: schema.TypeMap,
Computed: true,
Description: `All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.`,
Elem: &schema.Schema{Type: schema.TypeString},
},
"endpoint": {
Type: schema.TypeString,
Computed: true,
Description: `The IP address of the Kubernetes API server.`,
},
"maintenance_events": {
Type: schema.TypeList,
Computed: true,
Description: `All the maintenance events scheduled for the cluster, including the ones
ongoing, planned for the future and done in the past (up to 90 days).`,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"create_time": {
Type: schema.TypeString,
Computed: true,
Description: `The time when the maintenance event request was created.`,
},
"end_time": {
Type: schema.TypeString,
Computed: true,
Description: `The time when the maintenance event ended, either successfully or not. If
the maintenance event is split into multiple maintenance windows,
end_time is only updated when the whole flow ends.`,
},
"operation": {
Type: schema.TypeString,
Computed: true,
Description: `The operation for running the maintenance event. Specified in the format
projects/*/locations/*/operations/*. If the maintenance event is split
into multiple operations (e.g. due to maintenance windows), the latest
one is recorded.`,
},
"schedule": {
Type: schema.TypeString,
Computed: true,
Description: `The schedule of the maintenance event.`,
},
"start_time": {
Type: schema.TypeString,
Computed: true,
Description: `The time when the maintenance event started.`,
},
"state": {
Type: schema.TypeString,
Computed: true,
Description: `Indicates the maintenance event state.`,
},
"target_version": {
Type: schema.TypeString,
Computed: true,
Description: `The target version of the cluster.`,
},
"type": {
Type: schema.TypeString,
Computed: true,
Description: `Indicates the maintenance event type.`,
},
"update_time": {
Type: schema.TypeString,
Computed: true,
Description: `The time when the maintenance event message was updated.`,
},
"uuid": {
Type: schema.TypeString,
Computed: true,
Description: `UUID of the maintenance event.`,
},
},
},
},
"node_version": {
Type: schema.TypeString,
Computed: true,
Description: `The lowest release version among all worker nodes. This field can be empty
if the cluster does not have any worker nodes.`,
},
"port": {
Type: schema.TypeInt,
Computed: true,
Description: `The port number of the Kubernetes API server.`,
},
"status": {
Type: schema.TypeString,
Computed: true,
Description: `Indicates the status of the cluster.`,
},
"terraform_labels": {
Type: schema.TypeMap,
Computed: true,
Description: `The combination of labels configured directly on the resource
and default labels configured on the provider.`,
Elem: &schema.Schema{Type: schema.TypeString},
},
"update_time": {
Type: schema.TypeString,
Computed: true,
Description: `The time the cluster was last updated, in RFC3339 text format.`,
},
"project": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
},
UseJSONNumber: true,
}
}
func resourceEdgecontainerClusterCreate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
obj := make(map[string]interface{})
fleetProp, err := expandEdgecontainerClusterFleet(d.Get("fleet"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("fleet"); !tpgresource.IsEmptyValue(reflect.ValueOf(fleetProp)) && (ok || !reflect.DeepEqual(v, fleetProp)) {
obj["fleet"] = fleetProp
}
networkingProp, err := expandEdgecontainerClusterNetworking(d.Get("networking"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("networking"); !tpgresource.IsEmptyValue(reflect.ValueOf(networkingProp)) && (ok || !reflect.DeepEqual(v, networkingProp)) {
obj["networking"] = networkingProp
}
authorizationProp, err := expandEdgecontainerClusterAuthorization(d.Get("authorization"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("authorization"); !tpgresource.IsEmptyValue(reflect.ValueOf(authorizationProp)) && (ok || !reflect.DeepEqual(v, authorizationProp)) {
obj["authorization"] = authorizationProp
}
defaultMaxPodsPerNodeProp, err := expandEdgecontainerClusterDefaultMaxPodsPerNode(d.Get("default_max_pods_per_node"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("default_max_pods_per_node"); !tpgresource.IsEmptyValue(reflect.ValueOf(defaultMaxPodsPerNodeProp)) && (ok || !reflect.DeepEqual(v, defaultMaxPodsPerNodeProp)) {
obj["defaultMaxPodsPerNode"] = defaultMaxPodsPerNodeProp
}
maintenancePolicyProp, err := expandEdgecontainerClusterMaintenancePolicy(d.Get("maintenance_policy"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("maintenance_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(maintenancePolicyProp)) && (ok || !reflect.DeepEqual(v, maintenancePolicyProp)) {
obj["maintenancePolicy"] = maintenancePolicyProp
}
controlPlaneProp, err := expandEdgecontainerClusterControlPlane(d.Get("control_plane"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("control_plane"); !tpgresource.IsEmptyValue(reflect.ValueOf(controlPlaneProp)) && (ok || !reflect.DeepEqual(v, controlPlaneProp)) {
obj["controlPlane"] = controlPlaneProp
}
systemAddonsConfigProp, err := expandEdgecontainerClusterSystemAddonsConfig(d.Get("system_addons_config"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("system_addons_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(systemAddonsConfigProp)) && (ok || !reflect.DeepEqual(v, systemAddonsConfigProp)) {
obj["systemAddonsConfig"] = systemAddonsConfigProp
}
externalLoadBalancerIpv4AddressPoolsProp, err := expandEdgecontainerClusterExternalLoadBalancerIpv4AddressPools(d.Get("external_load_balancer_ipv4_address_pools"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("external_load_balancer_ipv4_address_pools"); !tpgresource.IsEmptyValue(reflect.ValueOf(externalLoadBalancerIpv4AddressPoolsProp)) && (ok || !reflect.DeepEqual(v, externalLoadBalancerIpv4AddressPoolsProp)) {
obj["externalLoadBalancerIpv4AddressPools"] = externalLoadBalancerIpv4AddressPoolsProp
}
controlPlaneEncryptionProp, err := expandEdgecontainerClusterControlPlaneEncryption(d.Get("control_plane_encryption"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("control_plane_encryption"); !tpgresource.IsEmptyValue(reflect.ValueOf(controlPlaneEncryptionProp)) && (ok || !reflect.DeepEqual(v, controlPlaneEncryptionProp)) {
obj["controlPlaneEncryption"] = controlPlaneEncryptionProp
}
targetVersionProp, err := expandEdgecontainerClusterTargetVersion(d.Get("target_version"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("target_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(targetVersionProp)) && (ok || !reflect.DeepEqual(v, targetVersionProp)) {
obj["targetVersion"] = targetVersionProp
}
releaseChannelProp, err := expandEdgecontainerClusterReleaseChannel(d.Get("release_channel"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("release_channel"); !tpgresource.IsEmptyValue(reflect.ValueOf(releaseChannelProp)) && (ok || !reflect.DeepEqual(v, releaseChannelProp)) {
obj["releaseChannel"] = releaseChannelProp
}
labelsProp, err := expandEdgecontainerClusterEffectiveLabels(d.Get("effective_labels"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("effective_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) {
obj["labels"] = labelsProp
}
url, err := tpgresource.ReplaceVars(d, config, "{{EdgecontainerBasePath}}projects/{{project}}/locations/{{location}}/clusters?cluster_id={{name}}")
if err != nil {
return err
}
log.Printf("[DEBUG] Creating new Cluster: %#v", obj)
billingProject := ""
project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for Cluster: %s", err)
}
billingProject = project
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
headers := make(http.Header)
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "POST",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Body: obj,
Timeout: d.Timeout(schema.TimeoutCreate),
Headers: headers,
})
if err != nil {
return fmt.Errorf("Error creating Cluster: %s", err)
}
// Store the ID now
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/locations/{{location}}/clusters/{{name}}")
if err != nil {
return fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)
err = EdgecontainerOperationWaitTime(
config, res, project, "Creating Cluster", userAgent,
d.Timeout(schema.TimeoutCreate))
if err != nil {
// The resource didn't actually create
d.SetId("")
return fmt.Errorf("Error waiting to create Cluster: %s", err)
}
log.Printf("[DEBUG] Finished creating Cluster %q: %#v", d.Id(), res)
return resourceEdgecontainerClusterRead(d, meta)
}
func resourceEdgecontainerClusterRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
url, err := tpgresource.ReplaceVars(d, config, "{{EdgecontainerBasePath}}projects/{{project}}/locations/{{location}}/clusters/{{name}}")
if err != nil {
return err
}
billingProject := ""
project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for Cluster: %s", err)
}
billingProject = project
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
headers := make(http.Header)
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "GET",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Headers: headers,
})
if err != nil {
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("EdgecontainerCluster %q", d.Id()))
}
if err := d.Set("project", project); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("create_time", flattenEdgecontainerClusterCreateTime(res["createTime"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("update_time", flattenEdgecontainerClusterUpdateTime(res["updateTime"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("labels", flattenEdgecontainerClusterLabels(res["labels"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("fleet", flattenEdgecontainerClusterFleet(res["fleet"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("networking", flattenEdgecontainerClusterNetworking(res["networking"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("authorization", flattenEdgecontainerClusterAuthorization(res["authorization"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("default_max_pods_per_node", flattenEdgecontainerClusterDefaultMaxPodsPerNode(res["defaultMaxPodsPerNode"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("endpoint", flattenEdgecontainerClusterEndpoint(res["endpoint"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("port", flattenEdgecontainerClusterPort(res["port"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("cluster_ca_certificate", flattenEdgecontainerClusterClusterCaCertificate(res["clusterCaCertificate"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("maintenance_policy", flattenEdgecontainerClusterMaintenancePolicy(res["maintenancePolicy"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("control_plane_version", flattenEdgecontainerClusterControlPlaneVersion(res["controlPlaneVersion"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("node_version", flattenEdgecontainerClusterNodeVersion(res["nodeVersion"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("control_plane", flattenEdgecontainerClusterControlPlane(res["controlPlane"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("system_addons_config", flattenEdgecontainerClusterSystemAddonsConfig(res["systemAddonsConfig"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("external_load_balancer_ipv4_address_pools", flattenEdgecontainerClusterExternalLoadBalancerIpv4AddressPools(res["externalLoadBalancerIpv4AddressPools"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("control_plane_encryption", flattenEdgecontainerClusterControlPlaneEncryption(res["controlPlaneEncryption"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("status", flattenEdgecontainerClusterStatus(res["status"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("maintenance_events", flattenEdgecontainerClusterMaintenanceEvents(res["maintenanceEvents"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("target_version", flattenEdgecontainerClusterTargetVersion(res["targetVersion"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("release_channel", flattenEdgecontainerClusterReleaseChannel(res["releaseChannel"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("terraform_labels", flattenEdgecontainerClusterTerraformLabels(res["labels"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
if err := d.Set("effective_labels", flattenEdgecontainerClusterEffectiveLabels(res["labels"], d, config)); err != nil {
return fmt.Errorf("Error reading Cluster: %s", err)
}
return nil
}
func resourceEdgecontainerClusterUpdate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
billingProject := ""
project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for Cluster: %s", err)
}
billingProject = project
obj := make(map[string]interface{})
networkingProp, err := expandEdgecontainerClusterNetworking(d.Get("networking"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("networking"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, networkingProp)) {
obj["networking"] = networkingProp
}
defaultMaxPodsPerNodeProp, err := expandEdgecontainerClusterDefaultMaxPodsPerNode(d.Get("default_max_pods_per_node"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("default_max_pods_per_node"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, defaultMaxPodsPerNodeProp)) {
obj["defaultMaxPodsPerNode"] = defaultMaxPodsPerNodeProp
}
maintenancePolicyProp, err := expandEdgecontainerClusterMaintenancePolicy(d.Get("maintenance_policy"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("maintenance_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, maintenancePolicyProp)) {
obj["maintenancePolicy"] = maintenancePolicyProp
}
controlPlaneProp, err := expandEdgecontainerClusterControlPlane(d.Get("control_plane"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("control_plane"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, controlPlaneProp)) {
obj["controlPlane"] = controlPlaneProp
}
systemAddonsConfigProp, err := expandEdgecontainerClusterSystemAddonsConfig(d.Get("system_addons_config"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("system_addons_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, systemAddonsConfigProp)) {
obj["systemAddonsConfig"] = systemAddonsConfigProp
}
externalLoadBalancerIpv4AddressPoolsProp, err := expandEdgecontainerClusterExternalLoadBalancerIpv4AddressPools(d.Get("external_load_balancer_ipv4_address_pools"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("external_load_balancer_ipv4_address_pools"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, externalLoadBalancerIpv4AddressPoolsProp)) {
obj["externalLoadBalancerIpv4AddressPools"] = externalLoadBalancerIpv4AddressPoolsProp
}
controlPlaneEncryptionProp, err := expandEdgecontainerClusterControlPlaneEncryption(d.Get("control_plane_encryption"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("control_plane_encryption"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, controlPlaneEncryptionProp)) {
obj["controlPlaneEncryption"] = controlPlaneEncryptionProp
}
releaseChannelProp, err := expandEdgecontainerClusterReleaseChannel(d.Get("release_channel"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("release_channel"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, releaseChannelProp)) {
obj["releaseChannel"] = releaseChannelProp
}
labelsProp, err := expandEdgecontainerClusterEffectiveLabels(d.Get("effective_labels"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("effective_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) {
obj["labels"] = labelsProp
}
url, err := tpgresource.ReplaceVars(d, config, "{{EdgecontainerBasePath}}projects/{{project}}/locations/{{location}}/clusters/{{name}}")
if err != nil {
return err
}
log.Printf("[DEBUG] Updating Cluster %q: %#v", d.Id(), obj)
headers := make(http.Header)
updateMask := []string{}
if d.HasChange("networking") {
updateMask = append(updateMask, "networking")
}
if d.HasChange("default_max_pods_per_node") {
updateMask = append(updateMask, "defaultMaxPodsPerNode")
}
if d.HasChange("maintenance_policy") {
updateMask = append(updateMask, "maintenancePolicy")
}
if d.HasChange("control_plane") {
updateMask = append(updateMask, "controlPlane")
}
if d.HasChange("system_addons_config") {
updateMask = append(updateMask, "systemAddonsConfig")
}
if d.HasChange("external_load_balancer_ipv4_address_pools") {
updateMask = append(updateMask, "externalLoadBalancerIpv4AddressPools")
}
if d.HasChange("control_plane_encryption") {
updateMask = append(updateMask, "controlPlaneEncryption")
}
if d.HasChange("release_channel") {
updateMask = append(updateMask, "releaseChannel")
}
if d.HasChange("effective_labels") {
updateMask = append(updateMask, "labels")
}
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
// won't set it
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
if err != nil {
return err
}
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
// if updateMask is empty we are not updating anything so skip the post
if len(updateMask) > 0 {
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "PATCH",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Body: obj,
Timeout: d.Timeout(schema.TimeoutUpdate),
Headers: headers,
})
if err != nil {
return fmt.Errorf("Error updating Cluster %q: %s", d.Id(), err)
} else {
log.Printf("[DEBUG] Finished updating Cluster %q: %#v", d.Id(), res)
}
err = EdgecontainerOperationWaitTime(
config, res, project, "Updating Cluster", userAgent,
d.Timeout(schema.TimeoutUpdate))
if err != nil {
return err
}
}
d.Partial(true)
if d.HasChange("target_version") {
obj := make(map[string]interface{})
targetVersionProp, err := expandEdgecontainerClusterTargetVersion(d.Get("target_version"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("target_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, targetVersionProp)) {
obj["targetVersion"] = targetVersionProp
}
url, err := tpgresource.ReplaceVars(d, config, "{{EdgecontainerBasePath}}projects/{{project}}/locations/{{location}}/clusters/{{name}}:upgrade")
if err != nil {
return err
}
headers := make(http.Header)
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "POST",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Body: obj,
Timeout: d.Timeout(schema.TimeoutUpdate),
Headers: headers,
})
if err != nil {
return fmt.Errorf("Error updating Cluster %q: %s", d.Id(), err)
} else {
log.Printf("[DEBUG] Finished updating Cluster %q: %#v", d.Id(), res)
}
err = EdgecontainerOperationWaitTime(
config, res, project, "Updating Cluster", userAgent,
d.Timeout(schema.TimeoutUpdate))
if err != nil {
return err
}
}
d.Partial(false)
return resourceEdgecontainerClusterRead(d, meta)
}
func resourceEdgecontainerClusterDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
billingProject := ""
project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for Cluster: %s", err)
}
billingProject = project
url, err := tpgresource.ReplaceVars(d, config, "{{EdgecontainerBasePath}}projects/{{project}}/locations/{{location}}/clusters/{{name}}")
if err != nil {
return err
}
var obj map[string]interface{}
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
headers := make(http.Header)
log.Printf("[DEBUG] Deleting Cluster %q", d.Id())
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "DELETE",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Body: obj,
Timeout: d.Timeout(schema.TimeoutDelete),
Headers: headers,
})
if err != nil {
return transport_tpg.HandleNotFoundError(err, d, "Cluster")
}
err = EdgecontainerOperationWaitTime(
config, res, project, "Deleting Cluster", userAgent,
d.Timeout(schema.TimeoutDelete))
if err != nil {
return err
}
log.Printf("[DEBUG] Finished deleting Cluster %q: %#v", d.Id(), res)
return nil
}
func resourceEdgecontainerClusterImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
config := meta.(*transport_tpg.Config)
if err := tpgresource.ParseImportId([]string{
"^projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/clusters/(?P<name>[^/]+)$",
"^(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<name>[^/]+)$",
"^(?P<location>[^/]+)/(?P<name>[^/]+)$",
}, d, config); err != nil {
return nil, err
}
// Replace import id for the resource id
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/locations/{{location}}/clusters/{{name}}")
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)
return []*schema.ResourceData{d}, nil
}
func flattenEdgecontainerClusterCreateTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterUpdateTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return v
}
transformed := make(map[string]interface{})
if l, ok := d.GetOkExists("labels"); ok {
for k := range l.(map[string]interface{}) {
transformed[k] = v.(map[string]interface{})[k]
}
}
return transformed
}
func flattenEdgecontainerClusterFleet(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["project"] =
flattenEdgecontainerClusterFleetProject(original["project"], d, config)
transformed["membership"] =
flattenEdgecontainerClusterFleetMembership(original["membership"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterFleetProject(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterFleetMembership(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterNetworking(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["cluster_ipv4_cidr_blocks"] =
flattenEdgecontainerClusterNetworkingClusterIpv4CidrBlocks(original["clusterIpv4CidrBlocks"], d, config)
transformed["services_ipv4_cidr_blocks"] =
flattenEdgecontainerClusterNetworkingServicesIpv4CidrBlocks(original["servicesIpv4CidrBlocks"], d, config)
transformed["cluster_ipv6_cidr_blocks"] =
flattenEdgecontainerClusterNetworkingClusterIpv6CidrBlocks(original["clusterIpv6CidrBlocks"], d, config)
transformed["services_ipv6_cidr_blocks"] =
flattenEdgecontainerClusterNetworkingServicesIpv6CidrBlocks(original["servicesIpv6CidrBlocks"], d, config)
transformed["network_type"] =
flattenEdgecontainerClusterNetworkingNetworkType(original["networkType"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterNetworkingClusterIpv4CidrBlocks(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterNetworkingServicesIpv4CidrBlocks(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterNetworkingClusterIpv6CidrBlocks(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterNetworkingServicesIpv6CidrBlocks(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterNetworkingNetworkType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterAuthorization(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["admin_users"] =
flattenEdgecontainerClusterAuthorizationAdminUsers(original["adminUsers"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterAuthorizationAdminUsers(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["username"] =
flattenEdgecontainerClusterAuthorizationAdminUsersUsername(original["username"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterAuthorizationAdminUsersUsername(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterDefaultMaxPodsPerNode(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
// Handles the string fixed64 format
if strVal, ok := v.(string); ok {
if intVal, err := tpgresource.StringToFixed64(strVal); err == nil {
return intVal
}
}
// number values are represented as float64
if floatVal, ok := v.(float64); ok {
intVal := int(floatVal)
return intVal
}
return v // let terraform core handle it otherwise
}
func flattenEdgecontainerClusterEndpoint(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterPort(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
// Handles the string fixed64 format
if strVal, ok := v.(string); ok {
if intVal, err := tpgresource.StringToFixed64(strVal); err == nil {
return intVal
}
}
// number values are represented as float64
if floatVal, ok := v.(float64); ok {
intVal := int(floatVal)
return intVal
}
return v // let terraform core handle it otherwise
}
func flattenEdgecontainerClusterClusterCaCertificate(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenancePolicy(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["window"] =
flattenEdgecontainerClusterMaintenancePolicyWindow(original["window"], d, config)
transformed["maintenance_exclusions"] =
flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusions(original["maintenanceExclusions"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterMaintenancePolicyWindow(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["recurring_window"] =
flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindow(original["recurringWindow"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindow(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["window"] =
flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindow(original["window"], d, config)
transformed["recurrence"] =
flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindowRecurrence(original["recurrence"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindow(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["start_time"] =
flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindowStartTime(original["startTime"], d, config)
transformed["end_time"] =
flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindowEndTime(original["endTime"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindowStartTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindowEndTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenancePolicyWindowRecurringWindowRecurrence(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusions(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return v
}
l := v.([]interface{})
transformed := make([]interface{}, 0, len(l))
for _, raw := range l {
original := raw.(map[string]interface{})
if len(original) < 1 {
// Do not include empty json objects coming back from the api
continue
}
transformed = append(transformed, map[string]interface{}{
"window": flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindow(original["window"], d, config),
"id": flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsId(original["id"], d, config),
})
}
return transformed
}
func flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindow(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["start_time"] =
flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindowStartTime(original["startTime"], d, config)
transformed["end_time"] =
flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindowEndTime(original["endTime"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindowStartTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindowEndTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlaneVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterNodeVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlane(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["remote"] =
flattenEdgecontainerClusterControlPlaneRemote(original["remote"], d, config)
transformed["local"] =
flattenEdgecontainerClusterControlPlaneLocal(original["local"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterControlPlaneRemote(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["node_location"] =
flattenEdgecontainerClusterControlPlaneRemoteNodeLocation(original["nodeLocation"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterControlPlaneRemoteNodeLocation(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlaneLocal(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["node_location"] =
flattenEdgecontainerClusterControlPlaneLocalNodeLocation(original["nodeLocation"], d, config)
transformed["node_count"] =
flattenEdgecontainerClusterControlPlaneLocalNodeCount(original["nodeCount"], d, config)
transformed["machine_filter"] =
flattenEdgecontainerClusterControlPlaneLocalMachineFilter(original["machineFilter"], d, config)
transformed["shared_deployment_policy"] =
flattenEdgecontainerClusterControlPlaneLocalSharedDeploymentPolicy(original["sharedDeploymentPolicy"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterControlPlaneLocalNodeLocation(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlaneLocalNodeCount(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
// Handles the string fixed64 format
if strVal, ok := v.(string); ok {
if intVal, err := tpgresource.StringToFixed64(strVal); err == nil {
return intVal
}
}
// number values are represented as float64
if floatVal, ok := v.(float64); ok {
intVal := int(floatVal)
return intVal
}
return v // let terraform core handle it otherwise
}
func flattenEdgecontainerClusterControlPlaneLocalMachineFilter(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlaneLocalSharedDeploymentPolicy(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterSystemAddonsConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["ingress"] =
flattenEdgecontainerClusterSystemAddonsConfigIngress(original["ingress"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterSystemAddonsConfigIngress(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["disabled"] =
flattenEdgecontainerClusterSystemAddonsConfigIngressDisabled(original["disabled"], d, config)
transformed["ipv4_vip"] =
flattenEdgecontainerClusterSystemAddonsConfigIngressIpv4Vip(original["ipv4Vip"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterSystemAddonsConfigIngressDisabled(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterSystemAddonsConfigIngressIpv4Vip(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterExternalLoadBalancerIpv4AddressPools(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlaneEncryption(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["kms_key"] =
flattenEdgecontainerClusterControlPlaneEncryptionKmsKey(original["kmsKey"], d, config)
transformed["kms_key_active_version"] =
flattenEdgecontainerClusterControlPlaneEncryptionKmsKeyActiveVersion(original["kmsKeyActiveVersion"], d, config)
transformed["kms_key_state"] =
flattenEdgecontainerClusterControlPlaneEncryptionKmsKeyState(original["kmsKeyState"], d, config)
transformed["kms_status"] =
flattenEdgecontainerClusterControlPlaneEncryptionKmsStatus(original["kmsStatus"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterControlPlaneEncryptionKmsKey(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlaneEncryptionKmsKeyActiveVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlaneEncryptionKmsKeyState(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterControlPlaneEncryptionKmsStatus(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["code"] =
flattenEdgecontainerClusterControlPlaneEncryptionKmsStatusCode(original["code"], d, config)
transformed["message"] =
flattenEdgecontainerClusterControlPlaneEncryptionKmsStatusMessage(original["message"], d, config)
return []interface{}{transformed}
}
func flattenEdgecontainerClusterControlPlaneEncryptionKmsStatusCode(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
// Handles the string fixed64 format
if strVal, ok := v.(string); ok {
if intVal, err := tpgresource.StringToFixed64(strVal); err == nil {
return intVal
}
}
// number values are represented as float64
if floatVal, ok := v.(float64); ok {
intVal := int(floatVal)
return intVal
}
return v // let terraform core handle it otherwise
}
func flattenEdgecontainerClusterControlPlaneEncryptionKmsStatusMessage(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterStatus(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEvents(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return v
}
l := v.([]interface{})
transformed := make([]interface{}, 0, len(l))
for _, raw := range l {
original := raw.(map[string]interface{})
if len(original) < 1 {
// Do not include empty json objects coming back from the api
continue
}
transformed = append(transformed, map[string]interface{}{
"uuid": flattenEdgecontainerClusterMaintenanceEventsUuid(original["uuid"], d, config),
"target_version": flattenEdgecontainerClusterMaintenanceEventsTargetVersion(original["targetVersion"], d, config),
"operation": flattenEdgecontainerClusterMaintenanceEventsOperation(original["operation"], d, config),
"type": flattenEdgecontainerClusterMaintenanceEventsType(original["type"], d, config),
"schedule": flattenEdgecontainerClusterMaintenanceEventsSchedule(original["schedule"], d, config),
"state": flattenEdgecontainerClusterMaintenanceEventsState(original["state"], d, config),
"create_time": flattenEdgecontainerClusterMaintenanceEventsCreateTime(original["createTime"], d, config),
"start_time": flattenEdgecontainerClusterMaintenanceEventsStartTime(original["startTime"], d, config),
"end_time": flattenEdgecontainerClusterMaintenanceEventsEndTime(original["endTime"], d, config),
"update_time": flattenEdgecontainerClusterMaintenanceEventsUpdateTime(original["updateTime"], d, config),
})
}
return transformed
}
func flattenEdgecontainerClusterMaintenanceEventsUuid(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsTargetVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsOperation(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsSchedule(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsState(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsCreateTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsStartTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsEndTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterMaintenanceEventsUpdateTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterTargetVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterReleaseChannel(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenEdgecontainerClusterTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return v
}
transformed := make(map[string]interface{})
if l, ok := d.GetOkExists("terraform_labels"); ok {
for k := range l.(map[string]interface{}) {
transformed[k] = v.(map[string]interface{})[k]
}
}
return transformed
}
func flattenEdgecontainerClusterEffectiveLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func expandEdgecontainerClusterFleet(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedProject, err := expandEdgecontainerClusterFleetProject(original["project"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedProject); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["project"] = transformedProject
}
transformedMembership, err := expandEdgecontainerClusterFleetMembership(original["membership"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedMembership); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["membership"] = transformedMembership
}
return transformed, nil
}
func expandEdgecontainerClusterFleetProject(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterFleetMembership(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterNetworking(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedClusterIpv4CidrBlocks, err := expandEdgecontainerClusterNetworkingClusterIpv4CidrBlocks(original["cluster_ipv4_cidr_blocks"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedClusterIpv4CidrBlocks); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["clusterIpv4CidrBlocks"] = transformedClusterIpv4CidrBlocks
}
transformedServicesIpv4CidrBlocks, err := expandEdgecontainerClusterNetworkingServicesIpv4CidrBlocks(original["services_ipv4_cidr_blocks"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedServicesIpv4CidrBlocks); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["servicesIpv4CidrBlocks"] = transformedServicesIpv4CidrBlocks
}
transformedClusterIpv6CidrBlocks, err := expandEdgecontainerClusterNetworkingClusterIpv6CidrBlocks(original["cluster_ipv6_cidr_blocks"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedClusterIpv6CidrBlocks); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["clusterIpv6CidrBlocks"] = transformedClusterIpv6CidrBlocks
}
transformedServicesIpv6CidrBlocks, err := expandEdgecontainerClusterNetworkingServicesIpv6CidrBlocks(original["services_ipv6_cidr_blocks"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedServicesIpv6CidrBlocks); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["servicesIpv6CidrBlocks"] = transformedServicesIpv6CidrBlocks
}
transformedNetworkType, err := expandEdgecontainerClusterNetworkingNetworkType(original["network_type"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedNetworkType); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["networkType"] = transformedNetworkType
}
return transformed, nil
}
func expandEdgecontainerClusterNetworkingClusterIpv4CidrBlocks(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterNetworkingServicesIpv4CidrBlocks(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterNetworkingClusterIpv6CidrBlocks(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterNetworkingServicesIpv6CidrBlocks(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterNetworkingNetworkType(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterAuthorization(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedAdminUsers, err := expandEdgecontainerClusterAuthorizationAdminUsers(original["admin_users"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedAdminUsers); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["adminUsers"] = transformedAdminUsers
}
return transformed, nil
}
func expandEdgecontainerClusterAuthorizationAdminUsers(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedUsername, err := expandEdgecontainerClusterAuthorizationAdminUsersUsername(original["username"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedUsername); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["username"] = transformedUsername
}
return transformed, nil
}
func expandEdgecontainerClusterAuthorizationAdminUsersUsername(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterDefaultMaxPodsPerNode(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterMaintenancePolicy(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedWindow, err := expandEdgecontainerClusterMaintenancePolicyWindow(original["window"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedWindow); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["window"] = transformedWindow
}
transformedMaintenanceExclusions, err := expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusions(original["maintenance_exclusions"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedMaintenanceExclusions); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["maintenanceExclusions"] = transformedMaintenanceExclusions
}
return transformed, nil
}
func expandEdgecontainerClusterMaintenancePolicyWindow(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedRecurringWindow, err := expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindow(original["recurring_window"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedRecurringWindow); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["recurringWindow"] = transformedRecurringWindow
}
return transformed, nil
}
func expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindow(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedWindow, err := expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindow(original["window"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedWindow); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["window"] = transformedWindow
}
transformedRecurrence, err := expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindowRecurrence(original["recurrence"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedRecurrence); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["recurrence"] = transformedRecurrence
}
return transformed, nil
}
func expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindow(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedStartTime, err := expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindowStartTime(original["start_time"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedStartTime); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["startTime"] = transformedStartTime
}
transformedEndTime, err := expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindowEndTime(original["end_time"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedEndTime); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["endTime"] = transformedEndTime
}
return transformed, nil
}
func expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindowStartTime(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindowWindowEndTime(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterMaintenancePolicyWindowRecurringWindowRecurrence(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusions(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
req := make([]interface{}, 0, len(l))
for _, raw := range l {
if raw == nil {
continue
}
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedWindow, err := expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindow(original["window"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedWindow); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["window"] = transformedWindow
}
transformedId, err := expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsId(original["id"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedId); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["id"] = transformedId
}
req = append(req, transformed)
}
return req, nil
}
func expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindow(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedStartTime, err := expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindowStartTime(original["start_time"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedStartTime); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["startTime"] = transformedStartTime
}
transformedEndTime, err := expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindowEndTime(original["end_time"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedEndTime); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["endTime"] = transformedEndTime
}
return transformed, nil
}
func expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindowStartTime(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsWindowEndTime(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterMaintenancePolicyMaintenanceExclusionsId(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlane(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedRemote, err := expandEdgecontainerClusterControlPlaneRemote(original["remote"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedRemote); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["remote"] = transformedRemote
}
transformedLocal, err := expandEdgecontainerClusterControlPlaneLocal(original["local"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedLocal); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["local"] = transformedLocal
}
return transformed, nil
}
func expandEdgecontainerClusterControlPlaneRemote(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedNodeLocation, err := expandEdgecontainerClusterControlPlaneRemoteNodeLocation(original["node_location"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedNodeLocation); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["nodeLocation"] = transformedNodeLocation
}
return transformed, nil
}
func expandEdgecontainerClusterControlPlaneRemoteNodeLocation(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneLocal(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedNodeLocation, err := expandEdgecontainerClusterControlPlaneLocalNodeLocation(original["node_location"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedNodeLocation); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["nodeLocation"] = transformedNodeLocation
}
transformedNodeCount, err := expandEdgecontainerClusterControlPlaneLocalNodeCount(original["node_count"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedNodeCount); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["nodeCount"] = transformedNodeCount
}
transformedMachineFilter, err := expandEdgecontainerClusterControlPlaneLocalMachineFilter(original["machine_filter"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedMachineFilter); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["machineFilter"] = transformedMachineFilter
}
transformedSharedDeploymentPolicy, err := expandEdgecontainerClusterControlPlaneLocalSharedDeploymentPolicy(original["shared_deployment_policy"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedSharedDeploymentPolicy); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["sharedDeploymentPolicy"] = transformedSharedDeploymentPolicy
}
return transformed, nil
}
func expandEdgecontainerClusterControlPlaneLocalNodeLocation(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneLocalNodeCount(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneLocalMachineFilter(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneLocalSharedDeploymentPolicy(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterSystemAddonsConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedIngress, err := expandEdgecontainerClusterSystemAddonsConfigIngress(original["ingress"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedIngress); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["ingress"] = transformedIngress
}
return transformed, nil
}
func expandEdgecontainerClusterSystemAddonsConfigIngress(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedDisabled, err := expandEdgecontainerClusterSystemAddonsConfigIngressDisabled(original["disabled"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedDisabled); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["disabled"] = transformedDisabled
}
transformedIpv4Vip, err := expandEdgecontainerClusterSystemAddonsConfigIngressIpv4Vip(original["ipv4_vip"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedIpv4Vip); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["ipv4Vip"] = transformedIpv4Vip
}
return transformed, nil
}
func expandEdgecontainerClusterSystemAddonsConfigIngressDisabled(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterSystemAddonsConfigIngressIpv4Vip(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterExternalLoadBalancerIpv4AddressPools(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneEncryption(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedKmsKey, err := expandEdgecontainerClusterControlPlaneEncryptionKmsKey(original["kms_key"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedKmsKey); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["kmsKey"] = transformedKmsKey
}
transformedKmsKeyActiveVersion, err := expandEdgecontainerClusterControlPlaneEncryptionKmsKeyActiveVersion(original["kms_key_active_version"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedKmsKeyActiveVersion); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["kmsKeyActiveVersion"] = transformedKmsKeyActiveVersion
}
transformedKmsKeyState, err := expandEdgecontainerClusterControlPlaneEncryptionKmsKeyState(original["kms_key_state"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedKmsKeyState); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["kmsKeyState"] = transformedKmsKeyState
}
transformedKmsStatus, err := expandEdgecontainerClusterControlPlaneEncryptionKmsStatus(original["kms_status"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedKmsStatus); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["kmsStatus"] = transformedKmsStatus
}
return transformed, nil
}
func expandEdgecontainerClusterControlPlaneEncryptionKmsKey(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneEncryptionKmsKeyActiveVersion(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneEncryptionKmsKeyState(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneEncryptionKmsStatus(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})
transformedCode, err := expandEdgecontainerClusterControlPlaneEncryptionKmsStatusCode(original["code"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedCode); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["code"] = transformedCode
}
transformedMessage, err := expandEdgecontainerClusterControlPlaneEncryptionKmsStatusMessage(original["message"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedMessage); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["message"] = transformedMessage
}
return transformed, nil
}
func expandEdgecontainerClusterControlPlaneEncryptionKmsStatusCode(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterControlPlaneEncryptionKmsStatusMessage(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterTargetVersion(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterReleaseChannel(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandEdgecontainerClusterEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
if v == nil {
return map[string]string{}, nil
}
m := make(map[string]string)
for k, val := range v.(map[string]interface{}) {
m[k] = val.(string)
}
return m, nil
}