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 }