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