func resourceAwsDbInstanceRead(d *schema.ResourceData, meta interface{}) error { v, err := resourceAwsBbInstanceRetrieve(d, meta) if err != nil { return err } if v == nil { d.SetId("") return nil } d.Set("name", v.DBName) d.Set("username", v.MasterUsername) d.Set("engine", v.Engine) d.Set("engine_version", v.EngineVersion) d.Set("allocated_storage", v.AllocatedStorage) d.Set("instance_class", v.DBInstanceClass) d.Set("availability_zone", v.AvailabilityZone) d.Set("backup_retention_period", v.BackupRetentionPeriod) d.Set("backup_window", v.PreferredBackupWindow) d.Set("maintenance_window", v.PreferredMaintenanceWindow) d.Set("multi_az", v.MultiAZ) d.Set("port", v.Port) d.Set("db_subnet_group_name", v.DBSubnetGroup.Name) d.Set("parameter_group_name", v.DBParameterGroupName) d.Set("address", v.Address) d.Set("endpoint", fmt.Sprintf("%s:%d", v.Address, v.Port)) d.Set("status", v.DBInstanceStatus) // Create an empty schema.Set to hold all vpc security group ids ids := &schema.Set{ F: func(v interface{}) int { return hashcode.String(v.(string)) }, } for _, v := range v.VpcSecurityGroupIds { ids.Add(v) } d.Set("vpc_security_group_ids", ids) // Create an empty schema.Set to hold all security group names sgn := &schema.Set{ F: func(v interface{}) int { return hashcode.String(v.(string)) }, } for _, v := range v.DBSecurityGroupNames { sgn.Add(v) } d.Set("security_group_names", sgn) return nil }
// dataSourceGoogleIamPolicyRead reads a data source from config and writes it // to state. func dataSourceGoogleIamPolicyRead(d *schema.ResourceData, meta interface{}) error { var policy cloudresourcemanager.Policy var bindings []*cloudresourcemanager.Binding // The schema supports multiple binding{} blocks bset := d.Get("binding").(*schema.Set) // All binding{} blocks will be converted and stored in an array bindings = make([]*cloudresourcemanager.Binding, bset.Len()) policy.Bindings = bindings // Convert each config binding into a cloudresourcemanager.Binding for i, v := range bset.List() { binding := v.(map[string]interface{}) policy.Bindings[i] = &cloudresourcemanager.Binding{ Role: binding["role"].(string), Members: dataSourceGoogleIamPolicyMembers(binding["members"].(*schema.Set)), } } // Marshal cloudresourcemanager.Policy to JSON suitable for storing in state pjson, err := json.Marshal(&policy) if err != nil { // should never happen if the above code is correct return err } pstring := string(pjson) d.Set("policy_data", pstring) d.SetId(strconv.Itoa(hashcode.String(pstring))) return nil }
// HashResource hashes complex structures that are described using // a *Resource. This is the default set implementation used when a set's // element type is a full resource. func HashResource(resource *Resource) SchemaSetFunc { return func(v interface{}) int { var buf bytes.Buffer SerializeResourceForHash(&buf, v, resource) return hashcode.String(buf.String()) } }
func resourceComputeInstancePersonalityHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["file"].(string))) return hashcode.String(buf.String()) }
func resourceArmVirtualMachineStorageOsProfileLinuxConfigHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%t-", m["disable_password_authentication"].(bool))) return hashcode.String(buf.String()) }
func resourceCloudStackFirewallRuleHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf( "%s-%s-", m["source_cidr"].(string), m["protocol"].(string))) if v, ok := m["icmp_type"]; ok { buf.WriteString(fmt.Sprintf("%d-", v.(int))) } if v, ok := m["icmp_code"]; ok { buf.WriteString(fmt.Sprintf("%d-", v.(int))) } // We need to make sure to sort the strings below so that we always // generate the same hash code no matter what is in the set. if v, ok := m["ports"]; ok { vs := v.(*schema.Set).List() s := make([]string, len(vs)) for i, raw := range vs { s[i] = raw.(string) } sort.Strings(s) for _, v := range s { buf.WriteString(fmt.Sprintf("%s-", v)) } } return hashcode.String(buf.String()) }
func resourceGoogleComputeBackendServiceBackendHash(v interface{}) int { if v == nil { return 0 } var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["group"].(string))) if v, ok := m["balancing_mode"]; ok { buf.WriteString(fmt.Sprintf("%s-", v.(string))) } if v, ok := m["capacity_scaler"]; ok { buf.WriteString(fmt.Sprintf("%f-", v.(float64))) } if v, ok := m["description"]; ok { buf.WriteString(fmt.Sprintf("%s-", v.(string))) } if v, ok := m["max_rate"]; ok { buf.WriteString(fmt.Sprintf("%d-", int64(v.(int)))) } if v, ok := m["max_rate_per_instance"]; ok { buf.WriteString(fmt.Sprintf("%f-", v.(float64))) } if v, ok := m["max_rate_per_instance"]; ok { buf.WriteString(fmt.Sprintf("%f-", v.(float64))) } return hashcode.String(buf.String()) }
func resourceDockerVolumesHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) if v, ok := m["from_container"]; ok { buf.WriteString(fmt.Sprintf("%v-", v.(string))) } if v, ok := m["container_path"]; ok { buf.WriteString(fmt.Sprintf("%v-", v.(string))) } if v, ok := m["host_path"]; ok { buf.WriteString(fmt.Sprintf("%v-", v.(string))) } if v, ok := m["volume_name"]; ok { buf.WriteString(fmt.Sprintf("%v-", v.(string))) } if v, ok := m["read_only"]; ok { buf.WriteString(fmt.Sprintf("%v-", v.(bool))) } return hashcode.String(buf.String()) }
func hashEbsBlockDevice(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["device_name"].(string))) buf.WriteString(fmt.Sprintf("%s-", m["snapshot_id"].(string))) return hashcode.String(buf.String()) }
func resourceLibratoAlertConditionsHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["type"].(string))) buf.WriteString(fmt.Sprintf("%s-", m["metric_name"].(string))) source, present := m["source"] if present { buf.WriteString(fmt.Sprintf("%s-", source.(string))) } detect_reset, present := m["detect_reset"] if present { buf.WriteString(fmt.Sprintf("%t-", detect_reset.(bool))) } duration, present := m["duration"] if present { buf.WriteString(fmt.Sprintf("%d-", duration.(int))) } threshold, present := m["threshold"] if present { buf.WriteString(fmt.Sprintf("%f-", threshold.(float64))) } summary_function, present := m["summary_function"] if present { buf.WriteString(fmt.Sprintf("%s-", summary_function.(string))) } return hashcode.String(buf.String()) }
func resourceDockerIpamConfigHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) if v, ok := m["subnet"]; ok { buf.WriteString(fmt.Sprintf("%v-", v.(string))) } if v, ok := m["ip_range"]; ok { buf.WriteString(fmt.Sprintf("%v-", v.(string))) } if v, ok := m["gateway"]; ok { buf.WriteString(fmt.Sprintf("%v-", v.(string))) } if v, ok := m["aux_address"]; ok { auxAddress := v.(map[string]interface{}) keys := make([]string, len(auxAddress)) i := 0 for k, _ := range auxAddress { keys[i] = k i++ } sort.Strings(keys) for _, k := range keys { buf.WriteString(fmt.Sprintf("%v-%v-", k, auxAddress[k].(string))) } } return hashcode.String(buf.String()) }
func resourceArmVirtualMachineScaleSetNetworkConfigurationHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) buf.WriteString(fmt.Sprintf("%t-", m["primary"].(bool))) return hashcode.String(buf.String()) }
func answersToHash(v interface{}) int { var buf bytes.Buffer a := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", a["answer"].(string))) if a["region"] != nil { buf.WriteString(fmt.Sprintf("%s-", a["region"].(string))) } metas := make([]int, 0) switch t := a["meta"].(type) { default: panic(fmt.Sprintf("unexpected type %T", t)) case *schema.Set: for _, meta := range t.List() { metas = append(metas, metaToHash(meta)) } case []map[string]interface{}: for _, meta := range t { metas = append(metas, metaToHash(meta)) } } sort.Ints(metas) for _, metahash := range metas { buf.WriteString(fmt.Sprintf("%d-", metahash)) } hash := hashcode.String(buf.String()) log.Println("Generated answersToHash %d from %+v", hash, a) return hash }
func resourceAwsVpcEndpoint() *schema.Resource { return &schema.Resource{ Create: resourceAwsVPCEndpointCreate, Read: resourceAwsVPCEndpointRead, Update: resourceAwsVPCEndpointUpdate, Delete: resourceAwsVPCEndpointDelete, Schema: map[string]*schema.Schema{ "policy": &schema.Schema{ Type: schema.TypeString, Optional: true, Computed: true, StateFunc: normalizeJson, }, "vpc_id": &schema.Schema{ Type: schema.TypeString, Required: true, ForceNew: true, }, "service_name": &schema.Schema{ Type: schema.TypeString, Required: true, ForceNew: true, }, "route_table_ids": &schema.Schema{ Type: schema.TypeSet, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Set: func(v interface{}) int { return hashcode.String(v.(string)) }, }, }, } }
func resourceAwsElasticacheSubnetGroup() *schema.Resource { return &schema.Resource{ Create: resourceAwsElasticacheSubnetGroupCreate, Read: resourceAwsElasticacheSubnetGroupRead, Update: resourceAwsElasticacheSubnetGroupUpdate, Delete: resourceAwsElasticacheSubnetGroupDelete, Schema: map[string]*schema.Schema{ "description": &schema.Schema{ Type: schema.TypeString, Required: true, }, "name": &schema.Schema{ Type: schema.TypeString, Required: true, ForceNew: true, StateFunc: func(val interface{}) string { // Elasticache normalizes subnet names to lowercase, // so we have to do this too or else we can end up // with non-converging diffs. return strings.ToLower(val.(string)) }, }, "subnet_ids": &schema.Schema{ Type: schema.TypeSet, Required: true, Elem: &schema.Schema{Type: schema.TypeString}, Set: func(v interface{}) int { return hashcode.String(v.(string)) }, }, }, } }
func volumeTagsHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["key"].(string))) buf.WriteString(fmt.Sprintf("%s-", m["value"].(string))) return hashcode.String(buf.String()) }
func writeV1BlockDevice( is *terraform.InstanceState, oldBd map[string]string) error { code := hashcode.String(oldBd["device_name"]) bdType := "ebs_block_device" if vn, ok := oldBd["virtual_name"]; ok && strings.HasPrefix(vn, "ephemeral") { bdType = "ephemeral_block_device" } else if dn, ok := oldBd["device_name"]; ok && dn == "/dev/sda1" { bdType = "root_block_device" } switch bdType { case "ebs_block_device": delete(oldBd, "virtual_name") case "root_block_device": delete(oldBd, "virtual_name") delete(oldBd, "encrypted") delete(oldBd, "snapshot_id") case "ephemeral_block_device": delete(oldBd, "delete_on_termination") delete(oldBd, "encrypted") delete(oldBd, "iops") delete(oldBd, "volume_size") delete(oldBd, "volume_type") } for attr, val := range oldBd { attrKey := fmt.Sprintf("%s.%d.%s", bdType, code, attr) is.Attributes[attrKey] = val } countAttr := fmt.Sprintf("%s.#", bdType) count, _ := strconv.Atoi(is.Attributes[countAttr]) is.Attributes[countAttr] = strconv.Itoa(count + 1) return nil }
func hashEphemeralBlockDevice(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["device_name"].(string))) buf.WriteString(fmt.Sprintf("%s-", m["virtual_name"].(string))) return hashcode.String(buf.String()) }
// Generates a hash for the set hash function used by the block_device_mappings // attribute. func amiBlockDeviceMappingHash(v interface{}) int { var buf bytes.Buffer // All keys added in alphabetical order. m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["device_name"].(string))) if d, ok := m["ebs"]; ok { if len(d.(map[string]interface{})) > 0 { e := d.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", e["delete_on_termination"].(string))) buf.WriteString(fmt.Sprintf("%s-", e["encrypted"].(string))) buf.WriteString(fmt.Sprintf("%s-", e["iops"].(string))) buf.WriteString(fmt.Sprintf("%s-", e["volume_size"].(string))) buf.WriteString(fmt.Sprintf("%s-", e["volume_type"].(string))) } } if d, ok := m["no_device"]; ok { buf.WriteString(fmt.Sprintf("%s-", d.(string))) } if d, ok := m["virtual_name"]; ok { buf.WriteString(fmt.Sprintf("%s-", d.(string))) } if d, ok := m["snapshot_id"]; ok { buf.WriteString(fmt.Sprintf("%s-", d.(string))) } return hashcode.String(buf.String()) }
func resourceConsulKeysHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) buf.WriteString(fmt.Sprintf("%s-", m["path"].(string))) return hashcode.String(buf.String()) }
func resourceAwsElasticacheSubnetGroup() *schema.Resource { return &schema.Resource{ Create: resourceAwsElasticacheSubnetGroupCreate, Read: resourceAwsElasticacheSubnetGroupRead, Update: resourceAwsElasticacheSubnetGroupUpdate, Delete: resourceAwsElasticacheSubnetGroupDelete, Schema: map[string]*schema.Schema{ "description": &schema.Schema{ Type: schema.TypeString, Required: true, }, "name": &schema.Schema{ Type: schema.TypeString, Required: true, ForceNew: true, }, "subnet_ids": &schema.Schema{ Type: schema.TypeSet, Required: true, Elem: &schema.Schema{Type: schema.TypeString}, Set: func(v interface{}) int { return hashcode.String(v.(string)) }, }, }, } }
func resourceAwsEniAttachmentHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["instance"].(string))) buf.WriteString(fmt.Sprintf("%d-", m["device_index"].(int))) return hashcode.String(buf.String()) }
func resourceArmVirtualMachineStorageOsProfileHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["admin_username"].(string))) buf.WriteString(fmt.Sprintf("%s-", m["computer_name"].(string))) return hashcode.String(buf.String()) }
func resourceAwsNetworkAclEntryHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%d-", m["from_port"].(int))) buf.WriteString(fmt.Sprintf("%d-", m["to_port"].(int))) buf.WriteString(fmt.Sprintf("%d-", m["rule_no"].(int))) buf.WriteString(fmt.Sprintf("%s-", m["action"].(string))) // The AWS network ACL API only speaks protocol numbers, and that's // all we store. Never hash a protocol name. protocol := m["protocol"].(string) if _, err := strconv.Atoi(m["protocol"].(string)); err != nil { // We're a protocol name. Look up the number. buf.WriteString(fmt.Sprintf("%d-", protocolIntegers()[protocol])) } else { // We're a protocol number. Pass the value through. buf.WriteString(fmt.Sprintf("%s-", protocol)) } buf.WriteString(fmt.Sprintf("%s-", m["cidr_block"].(string))) if v, ok := m["ssl_certificate_id"]; ok { buf.WriteString(fmt.Sprintf("%s-", v.(string))) } if v, ok := m["icmp_type"]; ok { buf.WriteString(fmt.Sprintf("%d-", v.(int))) } if v, ok := m["icmp_code"]; ok { buf.WriteString(fmt.Sprintf("%d-", v.(int))) } return hashcode.String(buf.String()) }
func resourceComputeVolumeAttachmentHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["volume_id"].(string))) return hashcode.String(buf.String()) }
// Assemble the hash for the aws_cloudfront_distribution default_cache_behavior // TypeSet attribute. func defaultCacheBehaviorHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%t-", m["compress"].(bool))) buf.WriteString(fmt.Sprintf("%s-", m["viewer_protocol_policy"].(string))) buf.WriteString(fmt.Sprintf("%s-", m["target_origin_id"].(string))) buf.WriteString(fmt.Sprintf("%d-", forwardedValuesHash(m["forwarded_values"].(*schema.Set).List()[0].(map[string]interface{})))) buf.WriteString(fmt.Sprintf("%d-", m["min_ttl"].(int))) if d, ok := m["trusted_signers"]; ok { for _, e := range sortInterfaceSlice(d.([]interface{})) { buf.WriteString(fmt.Sprintf("%s-", e.(string))) } } if d, ok := m["max_ttl"]; ok { buf.WriteString(fmt.Sprintf("%d-", d.(int))) } if d, ok := m["smooth_streaming"]; ok { buf.WriteString(fmt.Sprintf("%t-", d.(bool))) } if d, ok := m["default_ttl"]; ok { buf.WriteString(fmt.Sprintf("%d-", d.(int))) } if d, ok := m["allowed_methods"]; ok { for _, e := range sortInterfaceSlice(d.([]interface{})) { buf.WriteString(fmt.Sprintf("%s-", e.(string))) } } if d, ok := m["cached_methods"]; ok { for _, e := range sortInterfaceSlice(d.([]interface{})) { buf.WriteString(fmt.Sprintf("%s-", e.(string))) } } return hashcode.String(buf.String()) }
func resourceAwsRouteTableHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) if v, ok := m["cidr_block"]; ok { buf.WriteString(fmt.Sprintf("%s-", v.(string))) } if v, ok := m["gateway_id"]; ok { buf.WriteString(fmt.Sprintf("%s-", v.(string))) } natGatewaySet := false if v, ok := m["nat_gateway_id"]; ok { natGatewaySet = v.(string) != "" buf.WriteString(fmt.Sprintf("%s-", v.(string))) } instanceSet := false if v, ok := m["instance_id"]; ok { instanceSet = v.(string) != "" buf.WriteString(fmt.Sprintf("%s-", v.(string))) } if v, ok := m["vpc_peering_connection_id"]; ok { buf.WriteString(fmt.Sprintf("%s-", v.(string))) } if v, ok := m["network_interface_id"]; ok && !(instanceSet || natGatewaySet) { buf.WriteString(fmt.Sprintf("%s-", v.(string))) } return hashcode.String(buf.String()) }
// Helper function used by originHash to get a composite hash for all // aws_cloudfront_distribution custom_header attributes. func customHeadersHash(s *schema.Set) int { var buf bytes.Buffer for _, v := range s.List() { buf.WriteString(fmt.Sprintf("%d-", originCustomHeaderHash(v))) } return hashcode.String(buf.String()) }
// HashSchema hashes values that are described using a *Schema. This is the // default set implementation used when a set's element type is a single // schema. func HashSchema(schema *Schema) SchemaSetFunc { return func(v interface{}) int { var buf bytes.Buffer SerializeValueForHash(&buf, v, schema) return hashcode.String(buf.String()) } }
// Assemble the hash for the aws_cloudfront_distribution custom_header // TypeSet attribute. func originCustomHeaderHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) buf.WriteString(fmt.Sprintf("%s-", m["value"].(string))) return hashcode.String(buf.String()) }