github.com/wangzhucn/terraform@v0.6.7-0.20151109233120-4eea011b56b3/builtin/providers/google/provider.go (about)

     1  package google
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"os"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  	"github.com/hashicorp/terraform/terraform"
    10  )
    11  
    12  // Provider returns a terraform.ResourceProvider.
    13  func Provider() terraform.ResourceProvider {
    14  	return &schema.Provider{
    15  		Schema: map[string]*schema.Schema{
    16  			"account_file": &schema.Schema{
    17  				Type:         schema.TypeString,
    18  				Optional:     true,
    19  				DefaultFunc:  schema.EnvDefaultFunc("GOOGLE_ACCOUNT_FILE", nil),
    20  				ValidateFunc: validateAccountFile,
    21  			},
    22  
    23  			"project": &schema.Schema{
    24  				Type:        schema.TypeString,
    25  				Required:    true,
    26  				DefaultFunc: schema.EnvDefaultFunc("GOOGLE_PROJECT", nil),
    27  			},
    28  
    29  			"region": &schema.Schema{
    30  				Type:        schema.TypeString,
    31  				Required:    true,
    32  				DefaultFunc: schema.EnvDefaultFunc("GOOGLE_REGION", nil),
    33  			},
    34  		},
    35  
    36  		ResourcesMap: map[string]*schema.Resource{
    37  			"google_compute_autoscaler":             resourceComputeAutoscaler(),
    38  			"google_compute_address":                resourceComputeAddress(),
    39  			"google_compute_backend_service":        resourceComputeBackendService(),
    40  			"google_compute_disk":                   resourceComputeDisk(),
    41  			"google_compute_firewall":               resourceComputeFirewall(),
    42  			"google_compute_forwarding_rule":        resourceComputeForwardingRule(),
    43  			"google_compute_global_address":         resourceComputeGlobalAddress(),
    44  			"google_compute_global_forwarding_rule": resourceComputeGlobalForwardingRule(),
    45  			"google_compute_http_health_check":      resourceComputeHttpHealthCheck(),
    46  			"google_compute_instance":               resourceComputeInstance(),
    47  			"google_compute_instance_group_manager": resourceComputeInstanceGroupManager(),
    48  			"google_compute_instance_template":      resourceComputeInstanceTemplate(),
    49  			"google_compute_network":                resourceComputeNetwork(),
    50  			"google_compute_project_metadata":       resourceComputeProjectMetadata(),
    51  			"google_compute_route":                  resourceComputeRoute(),
    52  			"google_compute_ssl_certificate":        resourceComputeSslCertificate(),
    53  			"google_compute_target_http_proxy":      resourceComputeTargetHttpProxy(),
    54  			"google_compute_target_https_proxy":     resourceComputeTargetHttpsProxy(),
    55  			"google_compute_target_pool":            resourceComputeTargetPool(),
    56  			"google_compute_url_map":                resourceComputeUrlMap(),
    57  			"google_compute_vpn_gateway":            resourceComputeVpnGateway(),
    58  			"google_compute_vpn_tunnel":             resourceComputeVpnTunnel(),
    59  			"google_container_cluster":              resourceContainerCluster(),
    60  			"google_dns_managed_zone":               resourceDnsManagedZone(),
    61  			"google_dns_record_set":                 resourceDnsRecordSet(),
    62  			"google_sql_database":                   resourceSqlDatabase(),
    63  			"google_sql_database_instance":          resourceSqlDatabaseInstance(),
    64  			"google_storage_bucket":                 resourceStorageBucket(),
    65  			"google_storage_bucket_acl":             resourceStorageBucketAcl(),
    66  			"google_storage_bucket_object":          resourceStorageBucketObject(),
    67  			"google_storage_object_acl":             resourceStorageObjectAcl(),
    68  		},
    69  
    70  		ConfigureFunc: providerConfigure,
    71  	}
    72  }
    73  
    74  func providerConfigure(d *schema.ResourceData) (interface{}, error) {
    75  	config := Config{
    76  		AccountFile: d.Get("account_file").(string),
    77  		Project:     d.Get("project").(string),
    78  		Region:      d.Get("region").(string),
    79  	}
    80  
    81  	if err := config.loadAndValidate(); err != nil {
    82  		return nil, err
    83  	}
    84  
    85  	return &config, nil
    86  }
    87  
    88  func validateAccountFile(v interface{}, k string) (warnings []string, errors []error) {
    89  	if v == nil {
    90  		return
    91  	}
    92  
    93  	value := v.(string)
    94  
    95  	if value == "" {
    96  		return
    97  	}
    98  
    99  	var account accountFile
   100  	if err := json.Unmarshal([]byte(value), &account); err != nil {
   101  		warnings = append(warnings, `
   102  account_file is not valid JSON, so we are assuming it is a file path. This
   103  support will be removed in the future. Please update your configuration to use
   104  ${file("filename.json")} instead.`)
   105  	} else {
   106  		return
   107  	}
   108  
   109  	if _, err := os.Stat(value); err != nil {
   110  		errors = append(errors,
   111  			fmt.Errorf(
   112  				"account_file path could not be read from '%s': %s",
   113  				value,
   114  				err))
   115  	}
   116  
   117  	return
   118  }