2015-08-20 19:18:41 +00:00
|
|
|
package google
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
|
|
"google.golang.org/api/compute/v1"
|
|
|
|
)
|
|
|
|
|
|
|
|
func resourceComputeProjectMetadata() *schema.Resource {
|
|
|
|
return &schema.Resource{
|
2018-10-10 22:13:25 +00:00
|
|
|
Create: resourceComputeProjectMetadataCreateOrUpdate,
|
2015-08-31 14:06:25 +00:00
|
|
|
Read: resourceComputeProjectMetadataRead,
|
2018-10-10 22:13:25 +00:00
|
|
|
Update: resourceComputeProjectMetadataCreateOrUpdate,
|
2015-08-20 19:18:41 +00:00
|
|
|
Delete: resourceComputeProjectMetadataDelete,
|
2018-11-08 00:01:54 +00:00
|
|
|
Importer: &schema.ResourceImporter{
|
|
|
|
State: schema.ImportStatePassthrough,
|
|
|
|
},
|
2015-08-20 19:18:41 +00:00
|
|
|
|
|
|
|
SchemaVersion: 0,
|
|
|
|
|
|
|
|
Schema: map[string]*schema.Schema{
|
2015-08-31 14:06:25 +00:00
|
|
|
"metadata": &schema.Schema{
|
|
|
|
Type: schema.TypeMap,
|
2015-08-20 19:18:41 +00:00
|
|
|
Required: true,
|
2018-08-14 23:53:39 +00:00
|
|
|
Elem: &schema.Schema{Type: schema.TypeString},
|
2015-08-20 19:18:41 +00:00
|
|
|
},
|
2016-04-10 16:59:57 +00:00
|
|
|
|
|
|
|
"project": &schema.Schema{
|
|
|
|
Type: schema.TypeString,
|
|
|
|
Optional: true,
|
2017-11-28 00:32:20 +00:00
|
|
|
Computed: true,
|
2016-04-10 16:59:57 +00:00
|
|
|
ForceNew: true,
|
|
|
|
},
|
2015-08-20 19:18:41 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
func resourceComputeProjectMetadataCreateOrUpdate(d *schema.ResourceData, meta interface{}) error {
|
2015-08-20 19:18:41 +00:00
|
|
|
config := meta.(*Config)
|
|
|
|
|
2016-04-10 16:59:57 +00:00
|
|
|
projectID, err := getProject(d, config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
md := &compute.Metadata{
|
|
|
|
Items: expandComputeMetadata(d.Get("metadata").(map[string]interface{})),
|
2015-08-31 21:33:02 +00:00
|
|
|
}
|
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
err = resourceComputeProjectMetadataSet(projectID, config, md)
|
2015-08-31 21:33:02 +00:00
|
|
|
if err != nil {
|
2018-10-10 22:13:25 +00:00
|
|
|
return fmt.Errorf("SetCommonInstanceMetadata failed: %s", err)
|
2015-08-20 19:18:41 +00:00
|
|
|
}
|
|
|
|
|
2015-10-07 20:35:06 +00:00
|
|
|
return resourceComputeProjectMetadataRead(d, meta)
|
2015-08-20 19:18:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func resourceComputeProjectMetadataRead(d *schema.ResourceData, meta interface{}) error {
|
|
|
|
config := meta.(*Config)
|
|
|
|
|
2018-11-08 00:01:54 +00:00
|
|
|
if d.Id() == "" {
|
|
|
|
projectID, err := getProject(d, config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
d.SetId(projectID)
|
2016-04-10 16:59:57 +00:00
|
|
|
}
|
|
|
|
|
2015-08-20 19:18:41 +00:00
|
|
|
// Load project service
|
2018-11-08 00:01:54 +00:00
|
|
|
log.Printf("[DEBUG] Loading project service: %s", d.Id())
|
|
|
|
project, err := config.clientCompute.Projects.Get(d.Id()).Do()
|
2015-08-20 19:18:41 +00:00
|
|
|
if err != nil {
|
2018-11-08 00:01:54 +00:00
|
|
|
return handleNotFoundError(err, d, fmt.Sprintf("Project metadata for project %q", d.Id()))
|
2015-08-20 19:18:41 +00:00
|
|
|
}
|
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
err = d.Set("metadata", flattenMetadata(project.CommonInstanceMetadata))
|
|
|
|
if err != nil {
|
2015-08-31 14:06:25 +00:00
|
|
|
return fmt.Errorf("Error setting metadata: %s", err)
|
2015-08-20 19:18:41 +00:00
|
|
|
}
|
|
|
|
|
2018-11-08 00:01:54 +00:00
|
|
|
d.Set("project", d.Id())
|
|
|
|
d.SetId(d.Id())
|
2015-08-20 19:18:41 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func resourceComputeProjectMetadataDelete(d *schema.ResourceData, meta interface{}) error {
|
|
|
|
config := meta.(*Config)
|
|
|
|
|
2016-04-10 16:59:57 +00:00
|
|
|
projectID, err := getProject(d, config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
md := &compute.Metadata{}
|
|
|
|
err = resourceComputeProjectMetadataSet(projectID, config, md)
|
2015-08-20 19:18:41 +00:00
|
|
|
if err != nil {
|
2018-10-10 22:13:25 +00:00
|
|
|
return fmt.Errorf("SetCommonInstanceMetadata failed: %s", err)
|
2015-08-20 19:18:41 +00:00
|
|
|
}
|
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
return resourceComputeProjectMetadataRead(d, meta)
|
|
|
|
}
|
2015-08-20 19:18:41 +00:00
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
func resourceComputeProjectMetadataSet(projectID string, config *Config, md *compute.Metadata) error {
|
|
|
|
createMD := func() error {
|
|
|
|
log.Printf("[DEBUG] Loading project service: %s", projectID)
|
|
|
|
project, err := config.clientCompute.Projects.Get(projectID).Do()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("Error loading project '%s': %s", projectID, err)
|
|
|
|
}
|
2017-02-16 10:36:03 +00:00
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
md.Fingerprint = project.CommonInstanceMetadata.Fingerprint
|
|
|
|
op, err := config.clientCompute.Projects.SetCommonInstanceMetadata(projectID, md).Do()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("SetCommonInstanceMetadata failed: %s", err)
|
|
|
|
}
|
2015-08-20 19:18:41 +00:00
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
log.Printf("[DEBUG] SetCommonMetadata: %d (%s)", op.Id, op.SelfLink)
|
|
|
|
return computeOperationWait(config.clientCompute, op, project.Name, "SetCommonMetadata")
|
2015-08-20 19:18:41 +00:00
|
|
|
}
|
|
|
|
|
2018-10-10 22:13:25 +00:00
|
|
|
err := MetadataRetryWrapper(createMD)
|
|
|
|
return err
|
2015-08-20 19:18:41 +00:00
|
|
|
}
|