mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-10-04 17:51:11 +00:00
0cdcd66f67
This PR does a few things to the User-Agent header: 1. It puts Terraform/(version) first, since that's the way the RFC expects it 2. It removes the goos and goarch data, although I could be convinced to put it back in, I don't see what value it's providing 3. Moves directly to consuming the version package (which is the comment above the function previously being called)
335 lines
9.5 KiB
Go
335 lines
9.5 KiB
Go
package google
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/terraform/helper/logging"
|
|
"github.com/hashicorp/terraform/helper/pathorcontents"
|
|
"github.com/hashicorp/terraform/version"
|
|
|
|
"golang.org/x/oauth2"
|
|
"golang.org/x/oauth2/google"
|
|
"golang.org/x/oauth2/jwt"
|
|
"google.golang.org/api/bigquery/v2"
|
|
"google.golang.org/api/cloudbilling/v1"
|
|
"google.golang.org/api/cloudfunctions/v1"
|
|
"google.golang.org/api/cloudiot/v1"
|
|
"google.golang.org/api/cloudkms/v1"
|
|
"google.golang.org/api/cloudresourcemanager/v1"
|
|
resourceManagerV2Beta1 "google.golang.org/api/cloudresourcemanager/v2beta1"
|
|
computeBeta "google.golang.org/api/compute/v0.beta"
|
|
"google.golang.org/api/compute/v1"
|
|
"google.golang.org/api/container/v1"
|
|
containerBeta "google.golang.org/api/container/v1beta1"
|
|
"google.golang.org/api/dataflow/v1b3"
|
|
"google.golang.org/api/dataproc/v1"
|
|
"google.golang.org/api/dns/v1"
|
|
"google.golang.org/api/iam/v1"
|
|
cloudlogging "google.golang.org/api/logging/v2"
|
|
"google.golang.org/api/pubsub/v1"
|
|
"google.golang.org/api/runtimeconfig/v1beta1"
|
|
"google.golang.org/api/servicemanagement/v1"
|
|
"google.golang.org/api/sourcerepo/v1"
|
|
"google.golang.org/api/spanner/v1"
|
|
"google.golang.org/api/sqladmin/v1beta4"
|
|
"google.golang.org/api/storage/v1"
|
|
)
|
|
|
|
// Config is the configuration structure used to instantiate the Google
|
|
// provider.
|
|
type Config struct {
|
|
Credentials string
|
|
Project string
|
|
Region string
|
|
Zone string
|
|
|
|
client *http.Client
|
|
userAgent string
|
|
|
|
tokenSource oauth2.TokenSource
|
|
|
|
clientBilling *cloudbilling.Service
|
|
clientCompute *compute.Service
|
|
clientComputeBeta *computeBeta.Service
|
|
clientContainer *container.Service
|
|
clientContainerBeta *containerBeta.Service
|
|
clientDataproc *dataproc.Service
|
|
clientDataflow *dataflow.Service
|
|
clientDns *dns.Service
|
|
clientKms *cloudkms.Service
|
|
clientLogging *cloudlogging.Service
|
|
clientPubsub *pubsub.Service
|
|
clientResourceManager *cloudresourcemanager.Service
|
|
clientResourceManagerV2Beta1 *resourceManagerV2Beta1.Service
|
|
clientRuntimeconfig *runtimeconfig.Service
|
|
clientSpanner *spanner.Service
|
|
clientSourceRepo *sourcerepo.Service
|
|
clientStorage *storage.Service
|
|
clientSqlAdmin *sqladmin.Service
|
|
clientIAM *iam.Service
|
|
clientServiceMan *servicemanagement.APIService
|
|
clientBigQuery *bigquery.Service
|
|
clientCloudFunctions *cloudfunctions.Service
|
|
clientCloudIoT *cloudiot.Service
|
|
|
|
bigtableClientFactory *BigtableClientFactory
|
|
}
|
|
|
|
func (c *Config) loadAndValidate() error {
|
|
var account accountFile
|
|
clientScopes := []string{
|
|
"https://www.googleapis.com/auth/compute",
|
|
"https://www.googleapis.com/auth/cloud-platform",
|
|
"https://www.googleapis.com/auth/ndev.clouddns.readwrite",
|
|
"https://www.googleapis.com/auth/devstorage.full_control",
|
|
}
|
|
|
|
var client *http.Client
|
|
var tokenSource oauth2.TokenSource
|
|
|
|
if c.Credentials != "" {
|
|
contents, _, err := pathorcontents.Read(c.Credentials)
|
|
if err != nil {
|
|
return fmt.Errorf("Error loading credentials: %s", err)
|
|
}
|
|
|
|
// Assume account_file is a JSON string
|
|
if err := parseJSON(&account, contents); err != nil {
|
|
return fmt.Errorf("Error parsing credentials '%s': %s", contents, err)
|
|
}
|
|
|
|
// Get the token for use in our requests
|
|
log.Printf("[INFO] Requesting Google token...")
|
|
log.Printf("[INFO] -- Email: %s", account.ClientEmail)
|
|
log.Printf("[INFO] -- Scopes: %s", clientScopes)
|
|
log.Printf("[INFO] -- Private Key Length: %d", len(account.PrivateKey))
|
|
|
|
conf := jwt.Config{
|
|
Email: account.ClientEmail,
|
|
PrivateKey: []byte(account.PrivateKey),
|
|
Scopes: clientScopes,
|
|
TokenURL: "https://accounts.google.com/o/oauth2/token",
|
|
}
|
|
|
|
// Initiate an http.Client. The following GET request will be
|
|
// authorized and authenticated on the behalf of
|
|
// your service account.
|
|
client = conf.Client(context.Background())
|
|
|
|
tokenSource = conf.TokenSource(context.Background())
|
|
} else {
|
|
log.Printf("[INFO] Authenticating using DefaultClient")
|
|
err := error(nil)
|
|
client, err = google.DefaultClient(context.Background(), clientScopes...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
tokenSource, err = google.DefaultTokenSource(context.Background(), clientScopes...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
c.tokenSource = tokenSource
|
|
|
|
client.Transport = logging.NewTransport("Google", client.Transport)
|
|
|
|
projectURL := "https://www.terraform.io"
|
|
userAgent := fmt.Sprintf("Terraform/%s (+%s)",
|
|
version.String(), projectURL)
|
|
|
|
c.client = client
|
|
c.userAgent = userAgent
|
|
|
|
var err error
|
|
|
|
log.Printf("[INFO] Instantiating GCE client...")
|
|
c.clientCompute, err = compute.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientCompute.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating GCE Beta client...")
|
|
c.clientComputeBeta, err = computeBeta.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientComputeBeta.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating GKE client...")
|
|
c.clientContainer, err = container.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientContainer.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating GKE Beta client...")
|
|
c.clientContainerBeta, err = containerBeta.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientContainerBeta.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud DNS client...")
|
|
c.clientDns, err = dns.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientDns.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud KMS Client...")
|
|
c.clientKms, err = cloudkms.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientKms.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Stackdriver Logging client...")
|
|
c.clientLogging, err = cloudlogging.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientLogging.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Storage Client...")
|
|
c.clientStorage, err = storage.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientStorage.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google SqlAdmin Client...")
|
|
c.clientSqlAdmin, err = sqladmin.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientSqlAdmin.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Pubsub Client...")
|
|
c.clientPubsub, err = pubsub.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientPubsub.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Dataflow Client...")
|
|
c.clientDataflow, err = dataflow.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientDataflow.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud ResourceManager Client...")
|
|
c.clientResourceManager, err = cloudresourcemanager.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientResourceManager.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud ResourceManager V Client...")
|
|
c.clientResourceManagerV2Beta1, err = resourceManagerV2Beta1.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientResourceManagerV2Beta1.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud Runtimeconfig Client...")
|
|
c.clientRuntimeconfig, err = runtimeconfig.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientRuntimeconfig.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud IAM Client...")
|
|
c.clientIAM, err = iam.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientIAM.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud Service Management Client...")
|
|
c.clientServiceMan, err = servicemanagement.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientServiceMan.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud Billing Client...")
|
|
c.clientBilling, err = cloudbilling.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientBilling.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud BigQuery Client...")
|
|
c.clientBigQuery, err = bigquery.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientBigQuery.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud CloudFunctions Client...")
|
|
c.clientCloudFunctions, err = cloudfunctions.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientCloudFunctions.UserAgent = userAgent
|
|
|
|
c.bigtableClientFactory = &BigtableClientFactory{
|
|
UserAgent: userAgent,
|
|
TokenSource: tokenSource,
|
|
}
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud Source Repo Client...")
|
|
c.clientSourceRepo, err = sourcerepo.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientSourceRepo.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud Spanner Client...")
|
|
c.clientSpanner, err = spanner.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientSpanner.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud Dataproc Client...")
|
|
c.clientDataproc, err = dataproc.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientDataproc.UserAgent = userAgent
|
|
|
|
log.Printf("[INFO] Instantiating Google Cloud IoT Core Client...")
|
|
c.clientCloudIoT, err = cloudiot.New(client)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.clientCloudIoT.UserAgent = userAgent
|
|
|
|
return nil
|
|
}
|
|
|
|
// accountFile represents the structure of the account file JSON file.
|
|
type accountFile struct {
|
|
PrivateKeyId string `json:"private_key_id"`
|
|
PrivateKey string `json:"private_key"`
|
|
ClientEmail string `json:"client_email"`
|
|
ClientId string `json:"client_id"`
|
|
}
|
|
|
|
func parseJSON(result interface{}, contents string) error {
|
|
r := strings.NewReader(contents)
|
|
dec := json.NewDecoder(r)
|
|
|
|
return dec.Decode(result)
|
|
}
|