Add import support to project metadata. (#2423)

This commit is contained in:
The Magician 2018-11-07 16:01:54 -08:00 committed by Nathan McKinley
parent 75dc4df056
commit b90091e926
3 changed files with 45 additions and 118 deletions

View File

@ -14,6 +14,9 @@ func resourceComputeProjectMetadata() *schema.Resource {
Read: resourceComputeProjectMetadataRead, Read: resourceComputeProjectMetadataRead,
Update: resourceComputeProjectMetadataUpdate, Update: resourceComputeProjectMetadataUpdate,
Delete: resourceComputeProjectMetadataDelete, Delete: resourceComputeProjectMetadataDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
SchemaVersion: 0, SchemaVersion: 0,
@ -91,16 +94,19 @@ func resourceComputeProjectMetadataCreate(d *schema.ResourceData, meta interface
func resourceComputeProjectMetadataRead(d *schema.ResourceData, meta interface{}) error { func resourceComputeProjectMetadataRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config) config := meta.(*Config)
if d.Id() == "" {
projectID, err := getProject(d, config) projectID, err := getProject(d, config)
if err != nil { if err != nil {
return err return err
} }
d.SetId(projectID)
}
// Load project service // Load project service
log.Printf("[DEBUG] Loading project service: %s", projectID) log.Printf("[DEBUG] Loading project service: %s", d.Id())
project, err := config.clientCompute.Projects.Get(projectID).Do() project, err := config.clientCompute.Projects.Get(d.Id()).Do()
if err != nil { if err != nil {
return handleNotFoundError(err, d, fmt.Sprintf("Project metadata for project %q", projectID)) return handleNotFoundError(err, d, fmt.Sprintf("Project metadata for project %q", d.Id()))
} }
md := flattenMetadata(project.CommonInstanceMetadata) md := flattenMetadata(project.CommonInstanceMetadata)
@ -116,9 +122,8 @@ func resourceComputeProjectMetadataRead(d *schema.ResourceData, meta interface{}
return fmt.Errorf("Error setting metadata: %s", err) return fmt.Errorf("Error setting metadata: %s", err)
} }
d.Set("project", projectID) d.Set("project", d.Id())
d.SetId("common_metadata") d.SetId(d.Id())
return nil return nil
} }

View File

@ -7,7 +7,6 @@ import (
"github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform" "github.com/hashicorp/terraform/terraform"
"google.golang.org/api/compute/v1"
) )
// Add two key value pairs // Add two key value pairs
@ -16,7 +15,6 @@ func TestAccComputeProjectMetadata_basic(t *testing.T) {
org := getTestOrgFromEnv(t) org := getTestOrgFromEnv(t)
billingId := getTestBillingAccountFromEnv(t) billingId := getTestBillingAccountFromEnv(t)
var project compute.Project
projectID := "terrafom-test-" + acctest.RandString(10) projectID := "terrafom-test-" + acctest.RandString(10)
resource.Test(t, resource.TestCase{ resource.Test(t, resource.TestCase{
@ -26,13 +24,11 @@ func TestAccComputeProjectMetadata_basic(t *testing.T) {
Steps: []resource.TestStep{ Steps: []resource.TestStep{
resource.TestStep{ resource.TestStep{
Config: testAccComputeProject_basic0_metadata(projectID, pname, org, billingId), Config: testAccComputeProject_basic0_metadata(projectID, pname, org, billingId),
Check: resource.ComposeTestCheckFunc( },
testAccCheckComputeProjectExists( resource.TestStep{
"google_compute_project_metadata.fizzbuzz", projectID, &project), ResourceName: "google_compute_project_metadata.fizzbuzz",
testAccCheckComputeProjectMetadataContains(projectID, "banana", "orange"), ImportState: true,
testAccCheckComputeProjectMetadataContains(projectID, "sofa", "darwinism"), ImportStateVerify: true,
testAccCheckComputeProjectMetadataSize(projectID, 2),
),
}, },
}, },
}) })
@ -44,7 +40,6 @@ func TestAccComputeProjectMetadata_modify_1(t *testing.T) {
org := getTestOrgFromEnv(t) org := getTestOrgFromEnv(t)
billingId := getTestBillingAccountFromEnv(t) billingId := getTestBillingAccountFromEnv(t)
var project compute.Project
projectID := "terrafom-test-" + acctest.RandString(10) projectID := "terrafom-test-" + acctest.RandString(10)
resource.Test(t, resource.TestCase{ resource.Test(t, resource.TestCase{
@ -54,26 +49,20 @@ func TestAccComputeProjectMetadata_modify_1(t *testing.T) {
Steps: []resource.TestStep{ Steps: []resource.TestStep{
resource.TestStep{ resource.TestStep{
Config: testAccComputeProject_modify0_metadata(projectID, pname, org, billingId), Config: testAccComputeProject_modify0_metadata(projectID, pname, org, billingId),
Check: resource.ComposeTestCheckFunc( },
testAccCheckComputeProjectExists( resource.TestStep{
"google_compute_project_metadata.fizzbuzz", projectID, &project), ResourceName: "google_compute_project_metadata.fizzbuzz",
testAccCheckComputeProjectMetadataContains(projectID, "paper", "pen"), ImportState: true,
testAccCheckComputeProjectMetadataContains(projectID, "genghis_khan", "french bread"), ImportStateVerify: true,
testAccCheckComputeProjectMetadataContains(projectID, "happy", "smiling"),
testAccCheckComputeProjectMetadataSize(projectID, 3),
),
}, },
resource.TestStep{ resource.TestStep{
Config: testAccComputeProject_modify1_metadata(projectID, pname, org, billingId), Config: testAccComputeProject_modify1_metadata(projectID, pname, org, billingId),
Check: resource.ComposeTestCheckFunc( },
testAccCheckComputeProjectExists( resource.TestStep{
"google_compute_project_metadata.fizzbuzz", projectID, &project), ResourceName: "google_compute_project_metadata.fizzbuzz",
testAccCheckComputeProjectMetadataContains(projectID, "paper", "pen"), ImportState: true,
testAccCheckComputeProjectMetadataContains(projectID, "paris", "french bread"), ImportStateVerify: true,
testAccCheckComputeProjectMetadataContains(projectID, "happy", "laughing"),
testAccCheckComputeProjectMetadataSize(projectID, 3),
),
}, },
}, },
}) })
@ -85,7 +74,6 @@ func TestAccComputeProjectMetadata_modify_2(t *testing.T) {
org := getTestOrgFromEnv(t) org := getTestOrgFromEnv(t)
billingId := getTestBillingAccountFromEnv(t) billingId := getTestBillingAccountFromEnv(t)
var project compute.Project
projectID := "terraform-test-" + acctest.RandString(10) projectID := "terraform-test-" + acctest.RandString(10)
resource.Test(t, resource.TestCase{ resource.Test(t, resource.TestCase{
@ -95,24 +83,20 @@ func TestAccComputeProjectMetadata_modify_2(t *testing.T) {
Steps: []resource.TestStep{ Steps: []resource.TestStep{
resource.TestStep{ resource.TestStep{
Config: testAccComputeProject_basic0_metadata(projectID, pname, org, billingId), Config: testAccComputeProject_basic0_metadata(projectID, pname, org, billingId),
Check: resource.ComposeTestCheckFunc( },
testAccCheckComputeProjectExists( resource.TestStep{
"google_compute_project_metadata.fizzbuzz", projectID, &project), ResourceName: "google_compute_project_metadata.fizzbuzz",
testAccCheckComputeProjectMetadataContains(projectID, "banana", "orange"), ImportState: true,
testAccCheckComputeProjectMetadataContains(projectID, "sofa", "darwinism"), ImportStateVerify: true,
testAccCheckComputeProjectMetadataSize(projectID, 2),
),
}, },
resource.TestStep{ resource.TestStep{
Config: testAccComputeProject_basic1_metadata(projectID, pname, org, billingId), Config: testAccComputeProject_basic1_metadata(projectID, pname, org, billingId),
Check: resource.ComposeTestCheckFunc( },
testAccCheckComputeProjectExists( resource.TestStep{
"google_compute_project_metadata.fizzbuzz", projectID, &project), ResourceName: "google_compute_project_metadata.fizzbuzz",
testAccCheckComputeProjectMetadataContains(projectID, "kiwi", "papaya"), ImportState: true,
testAccCheckComputeProjectMetadataContains(projectID, "finches", "darwinism"), ImportStateVerify: true,
testAccCheckComputeProjectMetadataSize(projectID, 2),
),
}, },
}, },
}) })
@ -135,74 +119,6 @@ func testAccCheckComputeProjectMetadataDestroy(s *terraform.State) error {
return nil return nil
} }
func testAccCheckComputeProjectExists(n, projectID string, project *compute.Project) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not found: %s", n)
}
if rs.Primary.ID == "" {
return fmt.Errorf("No ID is set")
}
config := testAccProvider.Meta().(*Config)
found, err := config.clientCompute.Projects.Get(projectID).Do()
if err != nil {
return err
}
if "common_metadata" != rs.Primary.ID {
return fmt.Errorf("Common metadata not found, found %s", rs.Primary.ID)
}
*project = *found
return nil
}
}
func testAccCheckComputeProjectMetadataContains(projectID, key, value string) resource.TestCheckFunc {
return func(s *terraform.State) error {
config := testAccProvider.Meta().(*Config)
project, err := config.clientCompute.Projects.Get(projectID).Do()
if err != nil {
return fmt.Errorf("Error, failed to load project service for %s: %s", config.Project, err)
}
for _, kv := range project.CommonInstanceMetadata.Items {
if kv.Key == key {
if kv.Value != nil && *kv.Value == value {
return nil
} else {
return fmt.Errorf("Error, key value mismatch, wanted (%s, %s), got (%s, %s)",
key, value, kv.Key, *kv.Value)
}
}
}
return fmt.Errorf("Error, key %s not present in %s", key, project.SelfLink)
}
}
func testAccCheckComputeProjectMetadataSize(projectID string, size int) resource.TestCheckFunc {
return func(s *terraform.State) error {
config := testAccProvider.Meta().(*Config)
project, err := config.clientCompute.Projects.Get(projectID).Do()
if err != nil {
return fmt.Errorf("Error, failed to load project service for %s: %s", config.Project, err)
}
if size > len(project.CommonInstanceMetadata.Items) {
return fmt.Errorf("Error, expected at least %d metadata items, got %d", size,
len(project.CommonInstanceMetadata.Items))
}
return nil
}
}
func testAccComputeProject_basic0_metadata(projectID, name, org, billing string) string { func testAccComputeProject_basic0_metadata(projectID, name, org, billing string) string {
return fmt.Sprintf(` return fmt.Sprintf(`
resource "google_project" "project" { resource "google_project" "project" {

View File

@ -44,3 +44,9 @@ The following arguments are supported:
## Attributes Reference ## Attributes Reference
Only the arguments listed above are exposed as attributes. Only the arguments listed above are exposed as attributes.
## Import
This resource can be imported using the project ID:
`terraform import google_compute_project_metadata.foo my-project-id`