Add usage export bucket resource. (#1080)

This commit is contained in:
Nathan McKinley 2018-02-13 13:30:17 -08:00 committed by GitHub
parent c77bb36523
commit 8354a43d1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 204 additions and 0 deletions

View File

@ -173,6 +173,7 @@ func Provider() terraform.ResourceProvider {
"google_project_iam_member": ResourceIamMemberWithImport(IamProjectSchema, NewProjectIamUpdater, ProjectIdParseFunc),
"google_project_service": resourceGoogleProjectService(),
"google_project_iam_custom_role": resourceGoogleProjectIamCustomRole(),
"google_project_usage_export_bucket": resourceProjectUsageBucket(),
"google_project_services": resourceGoogleProjectServices(),
"google_pubsub_topic": resourcePubsubTopic(),
"google_pubsub_topic_iam_binding": ResourceIamBindingWithImport(IamPubsubTopicSchema, NewPubsubTopicIamUpdater, PubsubTopicIdParseFunc),

View File

@ -0,0 +1,103 @@
package google
import (
"fmt"
"log"
"github.com/hashicorp/terraform/helper/schema"
"google.golang.org/api/compute/v1"
)
func resourceProjectUsageBucket() *schema.Resource {
return &schema.Resource{
Create: resourceProjectUsageBucketCreate,
Read: resourceProjectUsageBucketRead,
Delete: resourceProjectUsageBucketDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"bucket_name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"prefix": &schema.Schema{
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"project": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
},
}
}
func resourceProjectUsageBucketRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
project := d.Id()
p, err := config.clientCompute.Projects.Get(project).Do()
if err != nil {
return handleNotFoundError(err, d, fmt.Sprintf("Project data for project %s", project))
}
if p.UsageExportLocation == nil {
log.Printf("[WARN] Removing usage export location resource %s because it's not enabled server-side.", project)
d.SetId("")
}
d.Set("project", project)
d.Set("prefix", p.UsageExportLocation.ReportNamePrefix)
d.Set("bucket_name", p.UsageExportLocation.BucketName)
return nil
}
func resourceProjectUsageBucketCreate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
project, err := getProject(d, config)
if err != nil {
return err
}
op, err := config.clientCompute.Projects.SetUsageExportBucket(project, &compute.UsageExportLocation{
ReportNamePrefix: d.Get("prefix").(string),
BucketName: d.Get("bucket_name").(string),
}).Do()
if err != nil {
return err
}
d.SetId(project)
err = computeOperationWait(config.clientCompute, op, project, "Setting usage export bucket.")
if err != nil {
d.SetId("")
return err
}
d.Set("project", project)
return resourceProjectUsageBucketRead(d, meta)
}
func resourceProjectUsageBucketDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
project := d.Id()
op, err := config.clientCompute.Projects.SetUsageExportBucket(project, nil).Do()
if err != nil {
return err
}
d.SetId(project)
err = computeOperationWait(config.clientCompute, op, project, "Setting usage export bucket.")
if err != nil {
return err
}
d.SetId("")
return nil
}

View File

@ -0,0 +1,59 @@
package google
import (
"fmt"
"testing"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
)
func TestAccComputeResourceUsageExportBucket(t *testing.T) {
org := getTestOrgFromEnv(t)
billingId := getTestBillingAccountFromEnv(t)
baseProject := "ub-" + acctest.RandString(10)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccResourceUsageExportBucket(baseProject, org, billingId),
},
// Test import.
resource.TestStep{
ResourceName: "google_project_usage_export_bucket.ueb",
ImportState: true,
ImportStateVerify: true,
},
},
})
}
func testAccResourceUsageExportBucket(baseProject, org, billingId string) string {
return fmt.Sprintf(`
resource "google_project" "base" {
project_id = "%s"
name = "Export Bucket Base"
org_id = "%s"
billing_account = "%s"
}
resource "google_project_service" "service" {
project = "${google_project.base.project_id}"
service = "compute.googleapis.com"
}
resource "google_storage_bucket" "bucket" {
name = "b-${google_project.base.project_id}"
project = "${google_project_service.service.project}"
}
resource "google_project_usage_export_bucket" "ueb" {
project = "${google_project.base.project_id}"
bucket_name = "${google_storage_bucket.bucket.name}"
prefix = "foobar"
}
`, baseProject, org, billingId)
}

View File

@ -0,0 +1,38 @@
---
layout: "google"
page_title: "Google: google_project_usage_export_bucket"
sidebar_current: "docs-google-project-usage-export-bucket"
description: |-
Creates a dataset resource for Google BigQuery.
---
# google_project_usage_export_bucket
Sets up a usage export bucket for a particular project. A usage export bucket
is a pre-configured GCS bucket which is set up to receive daily and monthly
reports of the GCE resources used.
For more information see the [Docs](https://cloud.google.com/compute/docs/usage-export)
and for further details, the
[API Documentation](https://cloud.google.com/compute/docs/reference/rest/beta/projects/setUsageExportBucket).
## Example Usage
```hcl
resource "google_project_usage_export_bucket" "export" {
project = "foo"
bucket_name = "bar"
}
```
## Argument Reference
* `project`: (Required) The project to set the export bucket on.
* `bucket_name`: (Required) The bucket to store reports in.
* `prefix`: (Optional) A prefix for the reports, for instance, the project name.
## Note
You should specify only one of these per project. If there are two or more
they will fight over which bucket the reports should be stored in. It is
safe to have multiple resources with the same backing bucket.

View File

@ -167,6 +167,9 @@
<li<%= sidebar_current("docs-google-project-services") %>>
<a href="/docs/providers/google/r/google_project_services.html">google_project_services</a>
</li>
<li<%= sidebar_current("docs-google-project-usage-export-bucket") %>>
<a href="/docs/providers/google/r/usage_export_bucket.html">google_project_usage_export_bucket</a>
</li>
<li<%= sidebar_current("docs-google-service-account") %>>
<a href="/docs/providers/google/r/google_service_account.html">google_service_account</a>
</li>