github.com/emc-cmd/terraform@v0.7.8-0.20161101145618-f16309630e7c/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 }