github.com/mehmetalisavas/terraform@v0.7.10/builtin/providers/google/resource_compute_image.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  	"google.golang.org/api/compute/v1"
     9  	"google.golang.org/api/googleapi"
    10  )
    11  
    12  func resourceComputeImage() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceComputeImageCreate,
    15  		Read:   resourceComputeImageRead,
    16  		Delete: resourceComputeImageDelete,
    17  
    18  		Schema: map[string]*schema.Schema{
    19  			// TODO(cblecker): one of source_disk or raw_disk is required
    20  
    21  			"name": &schema.Schema{
    22  				Type:     schema.TypeString,
    23  				Required: true,
    24  				ForceNew: true,
    25  			},
    26  
    27  			"description": &schema.Schema{
    28  				Type:     schema.TypeString,
    29  				Computed: true,
    30  			},
    31  
    32  			"family": &schema.Schema{
    33  				Type:     schema.TypeString,
    34  				Optional: true,
    35  				ForceNew: true,
    36  			},
    37  
    38  			"project": &schema.Schema{
    39  				Type:     schema.TypeString,
    40  				Optional: true,
    41  				ForceNew: true,
    42  			},
    43  
    44  			"source_disk": &schema.Schema{
    45  				Type:     schema.TypeString,
    46  				Optional: true,
    47  				ForceNew: true,
    48  			},
    49  
    50  			"raw_disk": &schema.Schema{
    51  				Type:     schema.TypeList,
    52  				Optional: true,
    53  				ForceNew: true,
    54  				MaxItems: 1,
    55  				Elem: &schema.Resource{
    56  					Schema: map[string]*schema.Schema{
    57  						"source": &schema.Schema{
    58  							Type:     schema.TypeString,
    59  							Required: true,
    60  							ForceNew: true,
    61  						},
    62  						"sha1": &schema.Schema{
    63  							Type:     schema.TypeString,
    64  							Optional: true,
    65  							ForceNew: true,
    66  						},
    67  						"container_type": &schema.Schema{
    68  							Type:     schema.TypeString,
    69  							Optional: true,
    70  							Default:  "TAR",
    71  							ForceNew: true,
    72  						},
    73  					},
    74  				},
    75  			},
    76  
    77  			"self_link": &schema.Schema{
    78  				Type:     schema.TypeString,
    79  				Computed: true,
    80  			},
    81  		},
    82  	}
    83  }
    84  
    85  func resourceComputeImageCreate(d *schema.ResourceData, meta interface{}) error {
    86  	config := meta.(*Config)
    87  
    88  	project, err := getProject(d, config)
    89  	if err != nil {
    90  		return err
    91  	}
    92  
    93  	// Build the image
    94  	image := &compute.Image{
    95  		Name: d.Get("name").(string),
    96  	}
    97  
    98  	if v, ok := d.GetOk("description"); ok {
    99  		image.Description = v.(string)
   100  	}
   101  
   102  	if v, ok := d.GetOk("family"); ok {
   103  		image.Family = v.(string)
   104  	}
   105  
   106  	// Load up the source_disk for this image if specified
   107  	if v, ok := d.GetOk("source_disk"); ok {
   108  		image.SourceDisk = v.(string)
   109  	}
   110  
   111  	// Load up the raw_disk for this image if specified
   112  	if v, ok := d.GetOk("raw_disk"); ok {
   113  		rawDiskEle := v.([]interface{})[0].(map[string]interface{})
   114  		imageRawDisk := &compute.ImageRawDisk{
   115  			Source:        rawDiskEle["source"].(string),
   116  			ContainerType: rawDiskEle["container_type"].(string),
   117  		}
   118  		if val, ok := rawDiskEle["sha1"]; ok {
   119  			imageRawDisk.Sha1Checksum = val.(string)
   120  		}
   121  
   122  		image.RawDisk = imageRawDisk
   123  	}
   124  
   125  	// Insert the image
   126  	op, err := config.clientCompute.Images.Insert(
   127  		project, image).Do()
   128  	if err != nil {
   129  		return fmt.Errorf("Error creating image: %s", err)
   130  	}
   131  
   132  	// Store the ID
   133  	d.SetId(image.Name)
   134  
   135  	err = computeOperationWaitGlobal(config, op, project, "Creating Image")
   136  	if err != nil {
   137  		return err
   138  	}
   139  
   140  	return resourceComputeImageRead(d, meta)
   141  }
   142  
   143  func resourceComputeImageRead(d *schema.ResourceData, meta interface{}) error {
   144  	config := meta.(*Config)
   145  
   146  	project, err := getProject(d, config)
   147  	if err != nil {
   148  		return err
   149  	}
   150  
   151  	image, err := config.clientCompute.Images.Get(
   152  		project, d.Id()).Do()
   153  	if err != nil {
   154  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   155  			// The resource doesn't exist anymore
   156  			log.Printf("[WARN] Removing Image %q because it's gone", d.Get("name").(string))
   157  			d.SetId("")
   158  
   159  			return nil
   160  		}
   161  
   162  		return fmt.Errorf("Error reading image: %s", err)
   163  	}
   164  
   165  	d.Set("self_link", image.SelfLink)
   166  
   167  	return nil
   168  }
   169  
   170  func resourceComputeImageDelete(d *schema.ResourceData, meta interface{}) error {
   171  	config := meta.(*Config)
   172  
   173  	project, err := getProject(d, config)
   174  	if err != nil {
   175  		return err
   176  	}
   177  
   178  	// Delete the image
   179  	log.Printf("[DEBUG] image delete request")
   180  	op, err := config.clientCompute.Images.Delete(
   181  		project, d.Id()).Do()
   182  	if err != nil {
   183  		return fmt.Errorf("Error deleting image: %s", err)
   184  	}
   185  
   186  	err = computeOperationWaitGlobal(config, op, project, "Deleting image")
   187  	if err != nil {
   188  		return err
   189  	}
   190  
   191  	d.SetId("")
   192  	return nil
   193  }