| // 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 dns |
| |
| import ( |
| "bytes" |
| "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-plugin-sdk/v2/helper/validation" |
| "google.golang.org/api/dns/v1" |
| |
| "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 ResourceDNSManagedZone() *schema.Resource { |
| return &schema.Resource{ |
| Create: resourceDNSManagedZoneCreate, |
| Read: resourceDNSManagedZoneRead, |
| Update: resourceDNSManagedZoneUpdate, |
| Delete: resourceDNSManagedZoneDelete, |
| |
| Importer: &schema.ResourceImporter{ |
| State: resourceDNSManagedZoneImport, |
| }, |
| |
| Timeouts: &schema.ResourceTimeout{ |
| Create: schema.DefaultTimeout(20 * time.Minute), |
| Update: schema.DefaultTimeout(20 * time.Minute), |
| Delete: schema.DefaultTimeout(20 * time.Minute), |
| }, |
| |
| CustomizeDiff: customdiff.All( |
| tpgresource.SetLabelsDiff, |
| tpgresource.DefaultProviderProject, |
| ), |
| |
| Schema: map[string]*schema.Schema{ |
| "dns_name": { |
| Type: schema.TypeString, |
| Required: true, |
| ForceNew: true, |
| Description: `The DNS name of this managed zone, for instance "example.com.".`, |
| }, |
| "name": { |
| Type: schema.TypeString, |
| Required: true, |
| ForceNew: true, |
| Description: `User assigned name for this resource. |
| Must be unique within the project.`, |
| }, |
| "cloud_logging_config": { |
| Type: schema.TypeList, |
| Computed: true, |
| Optional: true, |
| Description: `Cloud logging configuration`, |
| MaxItems: 1, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "enable_logging": { |
| Type: schema.TypeBool, |
| Required: true, |
| Description: `If set, enable query logging for this ManagedZone. False by default, making logging opt-in.`, |
| }, |
| }, |
| }, |
| }, |
| "description": { |
| Type: schema.TypeString, |
| Optional: true, |
| ValidateFunc: validation.StringIsNotEmpty, |
| Description: `A textual description field. Defaults to 'Managed by Terraform'.`, |
| Default: "Managed by Terraform", |
| }, |
| "dnssec_config": { |
| Type: schema.TypeList, |
| Optional: true, |
| Description: `DNSSEC configuration`, |
| MaxItems: 1, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "default_key_specs": { |
| Type: schema.TypeList, |
| Computed: true, |
| Optional: true, |
| Description: `Specifies parameters that will be used for generating initial DnsKeys |
| for this ManagedZone. If you provide a spec for keySigning or zoneSigning, |
| you must also provide one for the other. |
| default_key_specs can only be updated when the state is 'off'.`, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "algorithm": { |
| Type: schema.TypeString, |
| Optional: true, |
| ValidateFunc: verify.ValidateEnum([]string{"ecdsap256sha256", "ecdsap384sha384", "rsasha1", "rsasha256", "rsasha512", ""}), |
| Description: `String mnemonic specifying the DNSSEC algorithm of this key Possible values: ["ecdsap256sha256", "ecdsap384sha384", "rsasha1", "rsasha256", "rsasha512"]`, |
| }, |
| "key_length": { |
| Type: schema.TypeInt, |
| Optional: true, |
| Description: `Length of the keys in bits`, |
| }, |
| "key_type": { |
| Type: schema.TypeString, |
| Optional: true, |
| ValidateFunc: verify.ValidateEnum([]string{"keySigning", "zoneSigning", ""}), |
| Description: `Specifies whether this is a key signing key (KSK) or a zone |
| signing key (ZSK). Key signing keys have the Secure Entry |
| Point flag set and, when active, will only be used to sign |
| resource record sets of type DNSKEY. Zone signing keys do |
| not have the Secure Entry Point flag set and will be used |
| to sign all other types of resource record sets. Possible values: ["keySigning", "zoneSigning"]`, |
| }, |
| "kind": { |
| Type: schema.TypeString, |
| Optional: true, |
| Description: `Identifies what kind of resource this is`, |
| Default: "dns#dnsKeySpec", |
| }, |
| }, |
| }, |
| AtLeastOneOf: []string{"dnssec_config.0.kind", "dnssec_config.0.non_existence", "dnssec_config.0.state", "dnssec_config.0.default_key_specs"}, |
| }, |
| "kind": { |
| Type: schema.TypeString, |
| Optional: true, |
| Description: `Identifies what kind of resource this is`, |
| Default: "dns#managedZoneDnsSecConfig", |
| AtLeastOneOf: []string{"dnssec_config.0.kind", "dnssec_config.0.non_existence", "dnssec_config.0.state", "dnssec_config.0.default_key_specs"}, |
| }, |
| "non_existence": { |
| Type: schema.TypeString, |
| Computed: true, |
| Optional: true, |
| ValidateFunc: verify.ValidateEnum([]string{"nsec", "nsec3", ""}), |
| Description: `Specifies the mechanism used to provide authenticated denial-of-existence responses. |
| non_existence can only be updated when the state is 'off'. Possible values: ["nsec", "nsec3"]`, |
| AtLeastOneOf: []string{"dnssec_config.0.kind", "dnssec_config.0.non_existence", "dnssec_config.0.state", "dnssec_config.0.default_key_specs"}, |
| }, |
| "state": { |
| Type: schema.TypeString, |
| Optional: true, |
| ValidateFunc: verify.ValidateEnum([]string{"off", "on", "transfer", ""}), |
| Description: `Specifies whether DNSSEC is enabled, and what mode it is in Possible values: ["off", "on", "transfer"]`, |
| AtLeastOneOf: []string{"dnssec_config.0.kind", "dnssec_config.0.non_existence", "dnssec_config.0.state", "dnssec_config.0.default_key_specs"}, |
| }, |
| }, |
| }, |
| }, |
| "forwarding_config": { |
| Type: schema.TypeList, |
| Optional: true, |
| Description: `The presence for this field indicates that outbound forwarding is enabled |
| for this zone. The value of this field contains the set of destinations |
| to forward to.`, |
| MaxItems: 1, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "target_name_servers": { |
| Type: schema.TypeSet, |
| Required: true, |
| Description: `List of target name servers to forward to. Cloud DNS will |
| select the best available name server if more than |
| one target is given.`, |
| Elem: dnsManagedZoneForwardingConfigTargetNameServersSchema(), |
| Set: func(v interface{}) int { |
| raw := v.(map[string]interface{}) |
| if address, ok := raw["ipv4_address"]; ok { |
| tpgresource.Hashcode(address.(string)) |
| } |
| var buf bytes.Buffer |
| schema.SerializeResourceForHash(&buf, raw, dnsManagedZoneForwardingConfigTargetNameServersSchema()) |
| return tpgresource.Hashcode(buf.String()) |
| }, |
| }, |
| }, |
| }, |
| }, |
| "labels": { |
| Type: schema.TypeMap, |
| Optional: true, |
| Description: `A set of key/value label pairs to assign to this ManagedZone. |
| |
| |
| **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}, |
| }, |
| "peering_config": { |
| Type: schema.TypeList, |
| Optional: true, |
| Description: `The presence of this field indicates that DNS Peering is enabled for this |
| zone. The value of this field contains the network to peer with.`, |
| MaxItems: 1, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "target_network": { |
| Type: schema.TypeList, |
| Required: true, |
| Description: `The network with which to peer.`, |
| MaxItems: 1, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "network_url": { |
| Type: schema.TypeString, |
| Required: true, |
| DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName, |
| Description: `The id or fully qualified URL of the VPC network to forward queries to. |
| This should be formatted like 'projects/{project}/global/networks/{network}' or |
| 'https://www.googleapis.com/compute/v1/projects/{project}/global/networks/{network}'`, |
| }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| "private_visibility_config": { |
| Type: schema.TypeList, |
| Optional: true, |
| Description: `For privately visible zones, the set of Virtual Private Cloud |
| resources that the zone is visible from. At least one of 'gke_clusters' or 'networks' must be specified.`, |
| MaxItems: 1, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "gke_clusters": { |
| Type: schema.TypeList, |
| Optional: true, |
| Description: `The list of Google Kubernetes Engine clusters that can see this zone.`, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "gke_cluster_name": { |
| Type: schema.TypeString, |
| Required: true, |
| Description: `The resource name of the cluster to bind this ManagedZone to. |
| This should be specified in the format like |
| 'projects/*/locations/*/clusters/*'`, |
| }, |
| }, |
| }, |
| }, |
| "networks": { |
| Type: schema.TypeSet, |
| Optional: true, |
| Description: `The list of VPC networks that can see this zone. Until the provider updates to use the Terraform 0.12 SDK in a future release, you |
| may experience issues with this resource while updating. If you've defined a 'networks' block and |
| add another 'networks' block while keeping the old block, Terraform will see an incorrect diff |
| and apply an incorrect update to the resource. If you encounter this issue, remove all 'networks' |
| blocks in an update and then apply another update adding all of them back simultaneously.`, |
| Elem: dnsManagedZonePrivateVisibilityConfigNetworksSchema(), |
| Set: func(v interface{}) int { |
| if v == nil { |
| return 0 |
| } |
| raw := v.(map[string]interface{}) |
| if url, ok := raw["network_url"]; ok { |
| return tpgresource.SelfLinkRelativePathHash(url) |
| } |
| var buf bytes.Buffer |
| schema.SerializeResourceForHash(&buf, raw, dnsManagedZonePrivateVisibilityConfigNetworksSchema()) |
| return tpgresource.Hashcode(buf.String()) |
| }, |
| }, |
| }, |
| }, |
| AtLeastOneOf: []string{}, |
| }, |
| "reverse_lookup": { |
| Type: schema.TypeBool, |
| Optional: true, |
| ForceNew: true, |
| Description: `Specifies if this is a managed reverse lookup zone. If true, Cloud DNS will resolve reverse |
| lookup queries using automatically configured records for VPC resources. This only applies |
| to networks listed under 'private_visibility_config'.`, |
| }, |
| "service_directory_config": { |
| Type: schema.TypeList, |
| Optional: true, |
| ForceNew: true, |
| Description: `The presence of this field indicates that this zone is backed by Service Directory. The value of this field contains information related to the namespace associated with the zone.`, |
| MaxItems: 1, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "namespace": { |
| Type: schema.TypeList, |
| Required: true, |
| Description: `The namespace associated with the zone.`, |
| MaxItems: 1, |
| Elem: &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "namespace_url": { |
| Type: schema.TypeString, |
| Required: true, |
| Description: `The fully qualified or partial URL of the service directory namespace that should be |
| associated with the zone. This should be formatted like |
| 'https://servicedirectory.googleapis.com/v1/projects/{project}/locations/{location}/namespaces/{namespace_id}' |
| or simply 'projects/{project}/locations/{location}/namespaces/{namespace_id}' |
| Ignored for 'public' visibility zones.`, |
| }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| "visibility": { |
| Type: schema.TypeString, |
| Optional: true, |
| ForceNew: true, |
| ValidateFunc: verify.ValidateEnum([]string{"private", "public", ""}), |
| DiffSuppressFunc: tpgresource.CaseDiffSuppress, |
| Description: `The zone's visibility: public zones are exposed to the Internet, |
| while private zones are visible only to Virtual Private Cloud resources. Default value: "public" Possible values: ["private", "public"]`, |
| Default: "public", |
| }, |
| "creation_time": { |
| Type: schema.TypeString, |
| Computed: true, |
| Description: `The time that this resource was created on the server. |
| This is 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}, |
| }, |
| "managed_zone_id": { |
| Type: schema.TypeInt, |
| Computed: true, |
| Description: `Unique identifier for the resource; defined by the server.`, |
| }, |
| "name_servers": { |
| Type: schema.TypeList, |
| Computed: true, |
| Description: `Delegate your managed_zone to these virtual name servers; |
| defined by the server`, |
| Elem: &schema.Schema{ |
| Type: schema.TypeString, |
| }, |
| }, |
| "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}, |
| }, |
| "force_destroy": { |
| Type: schema.TypeBool, |
| Optional: true, |
| Description: `Set this true to delete all records in the zone.`, |
| Default: false, |
| }, |
| "project": { |
| Type: schema.TypeString, |
| Optional: true, |
| Computed: true, |
| ForceNew: true, |
| }, |
| }, |
| UseJSONNumber: true, |
| } |
| } |
| |
| func dnsManagedZonePrivateVisibilityConfigNetworksSchema() *schema.Resource { |
| return &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "network_url": { |
| Type: schema.TypeString, |
| Required: true, |
| DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName, |
| Description: `The id or fully qualified URL of the VPC network to bind to. |
| This should be formatted like 'projects/{project}/global/networks/{network}' or |
| 'https://www.googleapis.com/compute/v1/projects/{project}/global/networks/{network}'`, |
| }, |
| }, |
| } |
| } |
| |
| func dnsManagedZoneForwardingConfigTargetNameServersSchema() *schema.Resource { |
| return &schema.Resource{ |
| Schema: map[string]*schema.Schema{ |
| "ipv4_address": { |
| Type: schema.TypeString, |
| Required: true, |
| Description: `IPv4 address of a target name server.`, |
| }, |
| "forwarding_path": { |
| Type: schema.TypeString, |
| Optional: true, |
| ValidateFunc: verify.ValidateEnum([]string{"default", "private", ""}), |
| Description: `Forwarding path for this TargetNameServer. If unset or 'default' Cloud DNS will make forwarding |
| decision based on address ranges, i.e. RFC1918 addresses go to the VPC, Non-RFC1918 addresses go |
| to the Internet. When set to 'private', Cloud DNS will always send queries through VPC for this target Possible values: ["default", "private"]`, |
| }, |
| }, |
| } |
| } |
| |
| func resourceDNSManagedZoneCreate(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{}) |
| descriptionProp, err := expandDNSManagedZoneDescription(d.Get("description"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("description"); !tpgresource.IsEmptyValue(reflect.ValueOf(descriptionProp)) && (ok || !reflect.DeepEqual(v, descriptionProp)) { |
| obj["description"] = descriptionProp |
| } |
| dnsNameProp, err := expandDNSManagedZoneDnsName(d.Get("dns_name"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("dns_name"); !tpgresource.IsEmptyValue(reflect.ValueOf(dnsNameProp)) && (ok || !reflect.DeepEqual(v, dnsNameProp)) { |
| obj["dnsName"] = dnsNameProp |
| } |
| dnssecConfigProp, err := expandDNSManagedZoneDnssecConfig(d.Get("dnssec_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("dnssec_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(dnssecConfigProp)) && (ok || !reflect.DeepEqual(v, dnssecConfigProp)) { |
| obj["dnssecConfig"] = dnssecConfigProp |
| } |
| nameProp, err := expandDNSManagedZoneName(d.Get("name"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("name"); !tpgresource.IsEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) { |
| obj["name"] = nameProp |
| } |
| visibilityProp, err := expandDNSManagedZoneVisibility(d.Get("visibility"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("visibility"); !tpgresource.IsEmptyValue(reflect.ValueOf(visibilityProp)) && (ok || !reflect.DeepEqual(v, visibilityProp)) { |
| obj["visibility"] = visibilityProp |
| } |
| privateVisibilityConfigProp, err := expandDNSManagedZonePrivateVisibilityConfig(d.Get("private_visibility_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("private_visibility_config"); ok || !reflect.DeepEqual(v, privateVisibilityConfigProp) { |
| obj["privateVisibilityConfig"] = privateVisibilityConfigProp |
| } |
| forwardingConfigProp, err := expandDNSManagedZoneForwardingConfig(d.Get("forwarding_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("forwarding_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(forwardingConfigProp)) && (ok || !reflect.DeepEqual(v, forwardingConfigProp)) { |
| obj["forwardingConfig"] = forwardingConfigProp |
| } |
| peeringConfigProp, err := expandDNSManagedZonePeeringConfig(d.Get("peering_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("peering_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(peeringConfigProp)) && (ok || !reflect.DeepEqual(v, peeringConfigProp)) { |
| obj["peeringConfig"] = peeringConfigProp |
| } |
| reverseLookupConfigProp, err := expandDNSManagedZoneReverseLookup(d.Get("reverse_lookup"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("reverse_lookup"); !tpgresource.IsEmptyValue(reflect.ValueOf(reverseLookupConfigProp)) && (ok || !reflect.DeepEqual(v, reverseLookupConfigProp)) { |
| obj["reverseLookupConfig"] = reverseLookupConfigProp |
| } |
| serviceDirectoryConfigProp, err := expandDNSManagedZoneServiceDirectoryConfig(d.Get("service_directory_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("service_directory_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(serviceDirectoryConfigProp)) && (ok || !reflect.DeepEqual(v, serviceDirectoryConfigProp)) { |
| obj["serviceDirectoryConfig"] = serviceDirectoryConfigProp |
| } |
| cloudLoggingConfigProp, err := expandDNSManagedZoneCloudLoggingConfig(d.Get("cloud_logging_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("cloud_logging_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(cloudLoggingConfigProp)) && (ok || !reflect.DeepEqual(v, cloudLoggingConfigProp)) { |
| obj["cloudLoggingConfig"] = cloudLoggingConfigProp |
| } |
| labelsProp, err := expandDNSManagedZoneEffectiveLabels(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, "{{DNSBasePath}}projects/{{project}}/managedZones") |
| if err != nil { |
| return err |
| } |
| |
| log.Printf("[DEBUG] Creating new ManagedZone: %#v", obj) |
| billingProject := "" |
| |
| project, err := tpgresource.GetProject(d, config) |
| if err != nil { |
| return fmt.Errorf("Error fetching project for ManagedZone: %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 ManagedZone: %s", err) |
| } |
| |
| // Store the ID now |
| id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/managedZones/{{name}}") |
| if err != nil { |
| return fmt.Errorf("Error constructing id: %s", err) |
| } |
| d.SetId(id) |
| |
| log.Printf("[DEBUG] Finished creating ManagedZone %q: %#v", d.Id(), res) |
| |
| return resourceDNSManagedZoneRead(d, meta) |
| } |
| |
| func resourceDNSManagedZoneRead(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, "{{DNSBasePath}}projects/{{project}}/managedZones/{{name}}") |
| if err != nil { |
| return err |
| } |
| |
| billingProject := "" |
| |
| project, err := tpgresource.GetProject(d, config) |
| if err != nil { |
| return fmt.Errorf("Error fetching project for ManagedZone: %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("DNSManagedZone %q", d.Id())) |
| } |
| |
| // Explicitly set virtual fields to default values if unset |
| if _, ok := d.GetOkExists("force_destroy"); !ok { |
| if err := d.Set("force_destroy", false); err != nil { |
| return fmt.Errorf("Error setting force_destroy: %s", err) |
| } |
| } |
| if err := d.Set("project", project); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| |
| if err := d.Set("description", flattenDNSManagedZoneDescription(res["description"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("dns_name", flattenDNSManagedZoneDnsName(res["dnsName"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("dnssec_config", flattenDNSManagedZoneDnssecConfig(res["dnssecConfig"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("managed_zone_id", flattenDNSManagedZoneManagedZoneID(res["id"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("name", flattenDNSManagedZoneName(res["name"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("name_servers", flattenDNSManagedZoneNameServers(res["nameServers"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("creation_time", flattenDNSManagedZoneCreationTime(res["creationTime"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("labels", flattenDNSManagedZoneLabels(res["labels"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("visibility", flattenDNSManagedZoneVisibility(res["visibility"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("private_visibility_config", flattenDNSManagedZonePrivateVisibilityConfig(res["privateVisibilityConfig"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("forwarding_config", flattenDNSManagedZoneForwardingConfig(res["forwardingConfig"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("peering_config", flattenDNSManagedZonePeeringConfig(res["peeringConfig"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("reverse_lookup", flattenDNSManagedZoneReverseLookup(res["reverseLookupConfig"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("service_directory_config", flattenDNSManagedZoneServiceDirectoryConfig(res["serviceDirectoryConfig"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("cloud_logging_config", flattenDNSManagedZoneCloudLoggingConfig(res["cloudLoggingConfig"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("terraform_labels", flattenDNSManagedZoneTerraformLabels(res["labels"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| if err := d.Set("effective_labels", flattenDNSManagedZoneEffectiveLabels(res["labels"], d, config)); err != nil { |
| return fmt.Errorf("Error reading ManagedZone: %s", err) |
| } |
| |
| return nil |
| } |
| |
| func resourceDNSManagedZoneUpdate(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 ManagedZone: %s", err) |
| } |
| billingProject = project |
| |
| obj := make(map[string]interface{}) |
| descriptionProp, err := expandDNSManagedZoneDescription(d.Get("description"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("description"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, descriptionProp)) { |
| obj["description"] = descriptionProp |
| } |
| dnsNameProp, err := expandDNSManagedZoneDnsName(d.Get("dns_name"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("dns_name"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, dnsNameProp)) { |
| obj["dnsName"] = dnsNameProp |
| } |
| dnssecConfigProp, err := expandDNSManagedZoneDnssecConfig(d.Get("dnssec_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("dnssec_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, dnssecConfigProp)) { |
| obj["dnssecConfig"] = dnssecConfigProp |
| } |
| nameProp, err := expandDNSManagedZoneName(d.Get("name"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("name"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, nameProp)) { |
| obj["name"] = nameProp |
| } |
| visibilityProp, err := expandDNSManagedZoneVisibility(d.Get("visibility"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("visibility"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, visibilityProp)) { |
| obj["visibility"] = visibilityProp |
| } |
| privateVisibilityConfigProp, err := expandDNSManagedZonePrivateVisibilityConfig(d.Get("private_visibility_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("private_visibility_config"); ok || !reflect.DeepEqual(v, privateVisibilityConfigProp) { |
| obj["privateVisibilityConfig"] = privateVisibilityConfigProp |
| } |
| forwardingConfigProp, err := expandDNSManagedZoneForwardingConfig(d.Get("forwarding_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("forwarding_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, forwardingConfigProp)) { |
| obj["forwardingConfig"] = forwardingConfigProp |
| } |
| peeringConfigProp, err := expandDNSManagedZonePeeringConfig(d.Get("peering_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("peering_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, peeringConfigProp)) { |
| obj["peeringConfig"] = peeringConfigProp |
| } |
| reverseLookupConfigProp, err := expandDNSManagedZoneReverseLookup(d.Get("reverse_lookup"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("reverse_lookup"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, reverseLookupConfigProp)) { |
| obj["reverseLookupConfig"] = reverseLookupConfigProp |
| } |
| serviceDirectoryConfigProp, err := expandDNSManagedZoneServiceDirectoryConfig(d.Get("service_directory_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("service_directory_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, serviceDirectoryConfigProp)) { |
| obj["serviceDirectoryConfig"] = serviceDirectoryConfigProp |
| } |
| cloudLoggingConfigProp, err := expandDNSManagedZoneCloudLoggingConfig(d.Get("cloud_logging_config"), d, config) |
| if err != nil { |
| return err |
| } else if v, ok := d.GetOkExists("cloud_logging_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, cloudLoggingConfigProp)) { |
| obj["cloudLoggingConfig"] = cloudLoggingConfigProp |
| } |
| labelsProp, err := expandDNSManagedZoneEffectiveLabels(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 |
| } |
| |
| obj, err = resourceDNSManagedZoneUpdateEncoder(d, meta, obj) |
| if err != nil { |
| return err |
| } |
| |
| url, err := tpgresource.ReplaceVars(d, config, "{{DNSBasePath}}projects/{{project}}/managedZones/{{name}}") |
| if err != nil { |
| return err |
| } |
| |
| log.Printf("[DEBUG] Updating ManagedZone %q: %#v", d.Id(), obj) |
| 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: "PUT", |
| Project: billingProject, |
| RawURL: url, |
| UserAgent: userAgent, |
| Body: obj, |
| Timeout: d.Timeout(schema.TimeoutUpdate), |
| Headers: headers, |
| }) |
| |
| if err != nil { |
| return fmt.Errorf("Error updating ManagedZone %q: %s", d.Id(), err) |
| } else { |
| log.Printf("[DEBUG] Finished updating ManagedZone %q: %#v", d.Id(), res) |
| } |
| |
| return resourceDNSManagedZoneRead(d, meta) |
| } |
| |
| func resourceDNSManagedZoneDelete(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 ManagedZone: %s", err) |
| } |
| billingProject = project |
| |
| url, err := tpgresource.ReplaceVars(d, config, "{{DNSBasePath}}projects/{{project}}/managedZones/{{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) |
| if d.Get("force_destroy").(bool) { |
| zone := d.Get("name").(string) |
| token := "" |
| for paginate := true; paginate; { |
| var resp *dns.ResourceRecordSetsListResponse |
| if token == "" { |
| resp, err = config.NewDnsClient(userAgent).ResourceRecordSets.List(project, zone).Do() |
| if err != nil { |
| return fmt.Errorf("Error reading ResourceRecordSets: %s", err) |
| } |
| } else { |
| resp, err = config.NewDnsClient(userAgent).ResourceRecordSets.List(project, zone).PageToken(token).Do() |
| if err != nil { |
| return fmt.Errorf("Error reading ResourceRecordSets: %s", err) |
| } |
| } |
| |
| for _, rr := range resp.Rrsets { |
| // Build the change |
| chg := &dns.Change{ |
| Deletions: []*dns.ResourceRecordSet{ |
| { |
| Name: rr.Name, |
| Type: rr.Type, |
| Ttl: rr.Ttl, |
| Rrdatas: rr.Rrdatas, |
| }, |
| }, |
| } |
| |
| if rr.Type == "NS" { |
| mz, err := config.NewDnsClient(userAgent).ManagedZones.Get(project, zone).Do() |
| if err != nil { |
| return fmt.Errorf("Error retrieving managed zone %q from %q: %s", zone, project, err) |
| } |
| domain := mz.DnsName |
| |
| if domain == rr.Name { |
| log.Println("[DEBUG] NS records can't be deleted due to API restrictions, so they're being left in place. See https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/dns_record_set for more information.") |
| continue |
| } |
| } |
| |
| if rr.Type == "SOA" { |
| log.Println("[DEBUG] SOA records can't be deleted due to API restrictions, so they're being left in place.") |
| continue |
| } |
| |
| log.Printf("[DEBUG] DNS Record delete request via MZ: %#v", chg) |
| chg, err = config.NewDnsClient(userAgent).Changes.Create(project, zone, chg).Do() |
| if err != nil { |
| return fmt.Errorf("Unable to delete ResourceRecordSets: %s", err) |
| } |
| |
| w := &DnsChangeWaiter{ |
| Service: config.NewDnsClient(userAgent), |
| Change: chg, |
| Project: project, |
| ManagedZone: zone, |
| } |
| _, err = w.Conf().WaitForState() |
| if err != nil { |
| return fmt.Errorf("Error waiting for Google DNS change: %s", err) |
| } |
| } |
| |
| token = resp.NextPageToken |
| paginate = token != "" |
| } |
| } |
| |
| log.Printf("[DEBUG] Deleting ManagedZone %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, "ManagedZone") |
| } |
| |
| log.Printf("[DEBUG] Finished deleting ManagedZone %q: %#v", d.Id(), res) |
| return nil |
| } |
| |
| func resourceDNSManagedZoneImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { |
| config := meta.(*transport_tpg.Config) |
| if err := tpgresource.ParseImportId([]string{ |
| "^projects/(?P<project>[^/]+)/managedZones/(?P<name>[^/]+)$", |
| "^(?P<project>[^/]+)/(?P<name>[^/]+)$", |
| "^(?P<name>[^/]+)$", |
| }, d, config); err != nil { |
| return nil, err |
| } |
| |
| // Replace import id for the resource id |
| id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/managedZones/{{name}}") |
| if err != nil { |
| return nil, fmt.Errorf("Error constructing id: %s", err) |
| } |
| d.SetId(id) |
| |
| // Explicitly set virtual fields to default values on import |
| if err := d.Set("force_destroy", false); err != nil { |
| return nil, fmt.Errorf("Error setting force_destroy: %s", err) |
| } |
| |
| return []*schema.ResourceData{d}, nil |
| } |
| |
| func flattenDNSManagedZoneDescription(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneDnsName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneDnssecConfig(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["kind"] = |
| flattenDNSManagedZoneDnssecConfigKind(original["kind"], d, config) |
| transformed["non_existence"] = |
| flattenDNSManagedZoneDnssecConfigNonExistence(original["nonExistence"], d, config) |
| transformed["state"] = |
| flattenDNSManagedZoneDnssecConfigState(original["state"], d, config) |
| transformed["default_key_specs"] = |
| flattenDNSManagedZoneDnssecConfigDefaultKeySpecs(original["defaultKeySpecs"], d, config) |
| return []interface{}{transformed} |
| } |
| func flattenDNSManagedZoneDnssecConfigKind(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneDnssecConfigNonExistence(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneDnssecConfigState(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneDnssecConfigDefaultKeySpecs(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{}{ |
| "algorithm": flattenDNSManagedZoneDnssecConfigDefaultKeySpecsAlgorithm(original["algorithm"], d, config), |
| "key_length": flattenDNSManagedZoneDnssecConfigDefaultKeySpecsKeyLength(original["keyLength"], d, config), |
| "key_type": flattenDNSManagedZoneDnssecConfigDefaultKeySpecsKeyType(original["keyType"], d, config), |
| "kind": flattenDNSManagedZoneDnssecConfigDefaultKeySpecsKind(original["kind"], d, config), |
| }) |
| } |
| return transformed |
| } |
| func flattenDNSManagedZoneDnssecConfigDefaultKeySpecsAlgorithm(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneDnssecConfigDefaultKeySpecsKeyLength(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 flattenDNSManagedZoneDnssecConfigDefaultKeySpecsKeyType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneDnssecConfigDefaultKeySpecsKind(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneManagedZoneID(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 flattenDNSManagedZoneName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneNameServers(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneCreationTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneLabels(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 flattenDNSManagedZoneVisibility(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| if v == nil || tpgresource.IsEmptyValue(reflect.ValueOf(v)) { |
| return "public" |
| } |
| |
| return v |
| } |
| |
| func flattenDNSManagedZonePrivateVisibilityConfig(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["gke_clusters"] = |
| flattenDNSManagedZonePrivateVisibilityConfigGkeClusters(original["gkeClusters"], d, config) |
| transformed["networks"] = |
| flattenDNSManagedZonePrivateVisibilityConfigNetworks(original["networks"], d, config) |
| return []interface{}{transformed} |
| } |
| func flattenDNSManagedZonePrivateVisibilityConfigGkeClusters(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{}{ |
| "gke_cluster_name": flattenDNSManagedZonePrivateVisibilityConfigGkeClustersGkeClusterName(original["gkeClusterName"], d, config), |
| }) |
| } |
| return transformed |
| } |
| func flattenDNSManagedZonePrivateVisibilityConfigGkeClustersGkeClusterName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZonePrivateVisibilityConfigNetworks(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| if v == nil { |
| return v |
| } |
| l := v.([]interface{}) |
| transformed := schema.NewSet(func(v interface{}) int { |
| if v == nil { |
| return 0 |
| } |
| raw := v.(map[string]interface{}) |
| if url, ok := raw["network_url"]; ok { |
| return tpgresource.SelfLinkRelativePathHash(url) |
| } |
| var buf bytes.Buffer |
| schema.SerializeResourceForHash(&buf, raw, dnsManagedZonePrivateVisibilityConfigNetworksSchema()) |
| return tpgresource.Hashcode(buf.String()) |
| }, []interface{}{}) |
| 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.Add(map[string]interface{}{ |
| "network_url": flattenDNSManagedZonePrivateVisibilityConfigNetworksNetworkUrl(original["networkUrl"], d, config), |
| }) |
| } |
| return transformed |
| } |
| func flattenDNSManagedZonePrivateVisibilityConfigNetworksNetworkUrl(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneForwardingConfig(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["target_name_servers"] = |
| flattenDNSManagedZoneForwardingConfigTargetNameServers(original["targetNameServers"], d, config) |
| return []interface{}{transformed} |
| } |
| func flattenDNSManagedZoneForwardingConfigTargetNameServers(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| if v == nil { |
| return v |
| } |
| l := v.([]interface{}) |
| transformed := schema.NewSet(func(v interface{}) int { |
| raw := v.(map[string]interface{}) |
| if address, ok := raw["ipv4_address"]; ok { |
| tpgresource.Hashcode(address.(string)) |
| } |
| var buf bytes.Buffer |
| schema.SerializeResourceForHash(&buf, raw, dnsManagedZoneForwardingConfigTargetNameServersSchema()) |
| return tpgresource.Hashcode(buf.String()) |
| }, []interface{}{}) |
| 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.Add(map[string]interface{}{ |
| "ipv4_address": flattenDNSManagedZoneForwardingConfigTargetNameServersIpv4Address(original["ipv4Address"], d, config), |
| "forwarding_path": flattenDNSManagedZoneForwardingConfigTargetNameServersForwardingPath(original["forwardingPath"], d, config), |
| }) |
| } |
| return transformed |
| } |
| func flattenDNSManagedZoneForwardingConfigTargetNameServersIpv4Address(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneForwardingConfigTargetNameServersForwardingPath(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZonePeeringConfig(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["target_network"] = |
| flattenDNSManagedZonePeeringConfigTargetNetwork(original["targetNetwork"], d, config) |
| return []interface{}{transformed} |
| } |
| func flattenDNSManagedZonePeeringConfigTargetNetwork(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["network_url"] = |
| flattenDNSManagedZonePeeringConfigTargetNetworkNetworkUrl(original["networkUrl"], d, config) |
| return []interface{}{transformed} |
| } |
| func flattenDNSManagedZonePeeringConfigTargetNetworkNetworkUrl(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneReverseLookup(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v != nil |
| } |
| |
| func flattenDNSManagedZoneServiceDirectoryConfig(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["namespace"] = |
| flattenDNSManagedZoneServiceDirectoryConfigNamespace(original["namespace"], d, config) |
| return []interface{}{transformed} |
| } |
| func flattenDNSManagedZoneServiceDirectoryConfigNamespace(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["namespace_url"] = |
| flattenDNSManagedZoneServiceDirectoryConfigNamespaceNamespaceUrl(original["namespaceUrl"], d, config) |
| return []interface{}{transformed} |
| } |
| func flattenDNSManagedZoneServiceDirectoryConfigNamespaceNamespaceUrl(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| if v == nil { |
| return v |
| } |
| relative, err := tpgresource.GetRelativePath(v.(string)) |
| if err != nil { |
| return v |
| } |
| return relative |
| } |
| |
| func flattenDNSManagedZoneCloudLoggingConfig(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["enable_logging"] = |
| flattenDNSManagedZoneCloudLoggingConfigEnableLogging(original["enableLogging"], d, config) |
| return []interface{}{transformed} |
| } |
| func flattenDNSManagedZoneCloudLoggingConfigEnableLogging(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func flattenDNSManagedZoneTerraformLabels(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 flattenDNSManagedZoneEffectiveLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { |
| return v |
| } |
| |
| func expandDNSManagedZoneDescription(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneDnsName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfig(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{}) |
| |
| transformedKind, err := expandDNSManagedZoneDnssecConfigKind(original["kind"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedKind); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["kind"] = transformedKind |
| } |
| |
| transformedNonExistence, err := expandDNSManagedZoneDnssecConfigNonExistence(original["non_existence"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedNonExistence); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["nonExistence"] = transformedNonExistence |
| } |
| |
| transformedState, err := expandDNSManagedZoneDnssecConfigState(original["state"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedState); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["state"] = transformedState |
| } |
| |
| transformedDefaultKeySpecs, err := expandDNSManagedZoneDnssecConfigDefaultKeySpecs(original["default_key_specs"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedDefaultKeySpecs); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["defaultKeySpecs"] = transformedDefaultKeySpecs |
| } |
| |
| return transformed, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfigKind(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfigNonExistence(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfigState(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfigDefaultKeySpecs(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{}) |
| |
| transformedAlgorithm, err := expandDNSManagedZoneDnssecConfigDefaultKeySpecsAlgorithm(original["algorithm"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedAlgorithm); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["algorithm"] = transformedAlgorithm |
| } |
| |
| transformedKeyLength, err := expandDNSManagedZoneDnssecConfigDefaultKeySpecsKeyLength(original["key_length"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedKeyLength); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["keyLength"] = transformedKeyLength |
| } |
| |
| transformedKeyType, err := expandDNSManagedZoneDnssecConfigDefaultKeySpecsKeyType(original["key_type"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedKeyType); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["keyType"] = transformedKeyType |
| } |
| |
| transformedKind, err := expandDNSManagedZoneDnssecConfigDefaultKeySpecsKind(original["kind"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedKind); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["kind"] = transformedKind |
| } |
| |
| req = append(req, transformed) |
| } |
| return req, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfigDefaultKeySpecsAlgorithm(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfigDefaultKeySpecsKeyLength(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfigDefaultKeySpecsKeyType(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneDnssecConfigDefaultKeySpecsKind(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneVisibility(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZonePrivateVisibilityConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| l := v.([]interface{}) |
| if len(l) == 0 || l[0] == nil { |
| // The API won't remove the the field unless an empty network array is sent. |
| transformed := make(map[string]interface{}) |
| emptyNetwork := make([]interface{}, 0) |
| transformed["networks"] = emptyNetwork |
| return transformed, nil |
| } |
| raw := l[0] |
| original := raw.(map[string]interface{}) |
| transformed := make(map[string]interface{}) |
| |
| transformedGkeClusters, err := expandDNSManagedZonePrivateVisibilityConfigGkeClusters(original["gke_clusters"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedGkeClusters); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["gkeClusters"] = transformedGkeClusters |
| } |
| |
| transformedNetworks, err := expandDNSManagedZonePrivateVisibilityConfigNetworks(original["networks"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedNetworks); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["networks"] = transformedNetworks |
| } |
| |
| return transformed, nil |
| } |
| |
| func expandDNSManagedZonePrivateVisibilityConfigNetworks(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| v = v.(*schema.Set).List() |
| 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{}) |
| |
| transformedNetworkUrl, err := expandDNSManagedZonePrivateVisibilityConfigNetworksNetworkUrl(original["network_url"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedNetworkUrl); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["networkUrl"] = transformedNetworkUrl |
| } |
| |
| req = append(req, transformed) |
| } |
| return req, nil |
| } |
| |
| func expandDNSManagedZonePrivateVisibilityConfigGkeClusters(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{}) |
| |
| transformedGkeClusterName, err := expandDNSManagedZonePrivateVisibilityConfigGkeClustersGkeClusterName(original["gke_cluster_name"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedGkeClusterName); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["gkeClusterName"] = transformedGkeClusterName |
| } |
| |
| req = append(req, transformed) |
| } |
| return req, nil |
| } |
| |
| func expandDNSManagedZonePrivateVisibilityConfigNetworksNetworkUrl(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| if v == nil || v.(string) == "" { |
| return "", nil |
| } else if strings.HasPrefix(v.(string), "https://") { |
| return v, nil |
| } |
| url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}"+v.(string)) |
| if err != nil { |
| return "", err |
| } |
| return tpgresource.ConvertSelfLinkToV1(url), nil |
| } |
| |
| func expandDNSManagedZonePrivateVisibilityConfigGkeClustersGkeClusterName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneForwardingConfig(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{}) |
| |
| transformedTargetNameServers, err := expandDNSManagedZoneForwardingConfigTargetNameServers(original["target_name_servers"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedTargetNameServers); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["targetNameServers"] = transformedTargetNameServers |
| } |
| |
| return transformed, nil |
| } |
| |
| func expandDNSManagedZoneForwardingConfigTargetNameServers(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| v = v.(*schema.Set).List() |
| 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{}) |
| |
| transformedIpv4Address, err := expandDNSManagedZoneForwardingConfigTargetNameServersIpv4Address(original["ipv4_address"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedIpv4Address); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["ipv4Address"] = transformedIpv4Address |
| } |
| |
| transformedForwardingPath, err := expandDNSManagedZoneForwardingConfigTargetNameServersForwardingPath(original["forwarding_path"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedForwardingPath); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["forwardingPath"] = transformedForwardingPath |
| } |
| |
| req = append(req, transformed) |
| } |
| return req, nil |
| } |
| |
| func expandDNSManagedZoneForwardingConfigTargetNameServersIpv4Address(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneForwardingConfigTargetNameServersForwardingPath(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZonePeeringConfig(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{}) |
| |
| transformedTargetNetwork, err := expandDNSManagedZonePeeringConfigTargetNetwork(original["target_network"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedTargetNetwork); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["targetNetwork"] = transformedTargetNetwork |
| } |
| |
| return transformed, nil |
| } |
| |
| func expandDNSManagedZonePeeringConfigTargetNetwork(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{}) |
| |
| transformedNetworkUrl, err := expandDNSManagedZonePeeringConfigTargetNetworkNetworkUrl(original["network_url"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedNetworkUrl); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["networkUrl"] = transformedNetworkUrl |
| } |
| |
| return transformed, nil |
| } |
| |
| func expandDNSManagedZonePeeringConfigTargetNetworkNetworkUrl(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| if v == nil || v.(string) == "" { |
| return "", nil |
| } else if strings.HasPrefix(v.(string), "https://") { |
| return v, nil |
| } |
| url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}"+v.(string)) |
| if err != nil { |
| return "", err |
| } |
| return tpgresource.ConvertSelfLinkToV1(url), nil |
| } |
| |
| func expandDNSManagedZoneReverseLookup(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| if v == nil || !v.(bool) { |
| return nil, nil |
| } |
| |
| return struct{}{}, nil |
| } |
| |
| func expandDNSManagedZoneServiceDirectoryConfig(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{}) |
| |
| transformedNamespace, err := expandDNSManagedZoneServiceDirectoryConfigNamespace(original["namespace"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedNamespace); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["namespace"] = transformedNamespace |
| } |
| |
| return transformed, nil |
| } |
| |
| func expandDNSManagedZoneServiceDirectoryConfigNamespace(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{}) |
| |
| transformedNamespaceUrl, err := expandDNSManagedZoneServiceDirectoryConfigNamespaceNamespaceUrl(original["namespace_url"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedNamespaceUrl); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["namespaceUrl"] = transformedNamespaceUrl |
| } |
| |
| return transformed, nil |
| } |
| |
| func expandDNSManagedZoneServiceDirectoryConfigNamespaceNamespaceUrl(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| if v == nil || v.(string) == "" { |
| return "", nil |
| } else if strings.HasPrefix(v.(string), "https://") { |
| return v, nil |
| } |
| url, err := tpgresource.ReplaceVars(d, config, "{{ServiceDirectoryBasePath}}"+v.(string)) |
| if err != nil { |
| return "", err |
| } |
| return url, nil |
| } |
| |
| func expandDNSManagedZoneCloudLoggingConfig(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{}) |
| |
| transformedEnableLogging, err := expandDNSManagedZoneCloudLoggingConfigEnableLogging(original["enable_logging"], d, config) |
| if err != nil { |
| return nil, err |
| } else if val := reflect.ValueOf(transformedEnableLogging); val.IsValid() && !tpgresource.IsEmptyValue(val) { |
| transformed["enableLogging"] = transformedEnableLogging |
| } |
| |
| return transformed, nil |
| } |
| |
| func expandDNSManagedZoneCloudLoggingConfigEnableLogging(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { |
| return v, nil |
| } |
| |
| func expandDNSManagedZoneEffectiveLabels(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 |
| } |
| |
| func resourceDNSManagedZoneUpdateEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { |
| // The upstream update method (https://cloud.google.com/dns/docs/reference/v1/managedZones/update) |
| // requires the full ManagedZones object, therefore, we need to keep some input only values in the struct |
| // and then reuse it in the update |
| nameServers, ok := d.GetOkExists("name_servers") |
| if !ok { |
| nameServers = []string{} |
| } |
| obj["nameServers"] = nameServers |
| obj["id"] = d.Get("managed_zone_id") |
| obj["creationTime"] = d.Get("creation_time") |
| return obj, nil |
| } |