github.com/grange74/terraform@v0.7.0-rc3.0.20160722171430-8c8803864753/builtin/providers/scaleway/resource_scaleway_server.go (about) 1 package scaleway 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 "github.com/scaleway/scaleway-cli/pkg/api" 9 ) 10 11 func resourceScalewayServer() *schema.Resource { 12 return &schema.Resource{ 13 Create: resourceScalewayServerCreate, 14 Read: resourceScalewayServerRead, 15 Update: resourceScalewayServerUpdate, 16 Delete: resourceScalewayServerDelete, 17 Schema: map[string]*schema.Schema{ 18 "name": &schema.Schema{ 19 Type: schema.TypeString, 20 Required: true, 21 }, 22 "image": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 ForceNew: true, 26 }, 27 "type": &schema.Schema{ 28 Type: schema.TypeString, 29 Required: true, 30 ForceNew: true, 31 }, 32 "bootscript": &schema.Schema{ 33 Type: schema.TypeString, 34 Optional: true, 35 }, 36 "tags": &schema.Schema{ 37 Type: schema.TypeList, 38 Elem: &schema.Schema{ 39 Type: schema.TypeString, 40 }, 41 Optional: true, 42 }, 43 "ipv4_address_private": &schema.Schema{ 44 Type: schema.TypeString, 45 Computed: true, 46 }, 47 "ipv4_address_public": &schema.Schema{ 48 Type: schema.TypeString, 49 Computed: true, 50 }, 51 "state": &schema.Schema{ 52 Type: schema.TypeString, 53 Optional: true, 54 Computed: true, 55 }, 56 "dynamic_ip_required": &schema.Schema{ 57 Type: schema.TypeBool, 58 Optional: true, 59 }, 60 "state_detail": &schema.Schema{ 61 Type: schema.TypeString, 62 Computed: true, 63 }, 64 }, 65 } 66 } 67 68 func resourceScalewayServerCreate(d *schema.ResourceData, m interface{}) error { 69 scaleway := m.(*Client).scaleway 70 71 image := d.Get("image").(string) 72 var server = api.ScalewayServerDefinition{ 73 Name: d.Get("name").(string), 74 Image: String(image), 75 Organization: scaleway.Organization, 76 } 77 78 server.DynamicIPRequired = Bool(d.Get("dynamic_ip_required").(bool)) 79 server.CommercialType = d.Get("type").(string) 80 81 if bootscript, ok := d.GetOk("bootscript"); ok { 82 server.Bootscript = String(bootscript.(string)) 83 } 84 85 if raw, ok := d.GetOk("tags"); ok { 86 for _, tag := range raw.([]interface{}) { 87 server.Tags = append(server.Tags, tag.(string)) 88 } 89 } 90 91 id, err := scaleway.PostServer(server) 92 if err != nil { 93 return err 94 } 95 96 d.SetId(id) 97 if d.Get("state").(string) != "stopped" { 98 err = scaleway.PostServerAction(id, "poweron") 99 if err != nil { 100 return err 101 } 102 103 err = waitForServerState(scaleway, id, "running") 104 } 105 106 if err != nil { 107 return err 108 } 109 110 return resourceScalewayServerRead(d, m) 111 } 112 113 func resourceScalewayServerRead(d *schema.ResourceData, m interface{}) error { 114 scaleway := m.(*Client).scaleway 115 server, err := scaleway.GetServer(d.Id()) 116 117 if err != nil { 118 if serr, ok := err.(api.ScalewayAPIError); ok { 119 log.Printf("[DEBUG] Error reading server: %q\n", serr.APIMessage) 120 121 if serr.StatusCode == 404 { 122 d.SetId("") 123 return nil 124 } 125 } 126 127 return err 128 } 129 130 d.Set("ipv4_address_private", server.PrivateIP) 131 d.Set("ipv4_address_public", server.PublicAddress.IP) 132 d.Set("state", server.State) 133 d.Set("state_detail", server.StateDetail) 134 d.Set("tags", server.Tags) 135 136 d.SetConnInfo(map[string]string{ 137 "type": "ssh", 138 "host": server.PublicAddress.IP, 139 }) 140 141 return nil 142 } 143 144 func resourceScalewayServerUpdate(d *schema.ResourceData, m interface{}) error { 145 scaleway := m.(*Client).scaleway 146 147 var req api.ScalewayServerPatchDefinition 148 149 if d.HasChange("name") { 150 name := d.Get("name").(string) 151 req.Name = &name 152 } 153 154 if d.HasChange("tags") { 155 if raw, ok := d.GetOk("tags"); ok { 156 var tags []string 157 for _, tag := range raw.([]interface{}) { 158 tags = append(tags, tag.(string)) 159 } 160 req.Tags = &tags 161 } 162 } 163 164 if d.HasChange("dynamic_ip_required") { 165 req.DynamicIPRequired = Bool(d.Get("dynamic_ip_required").(bool)) 166 } 167 168 if err := scaleway.PatchServer(d.Id(), req); err != nil { 169 return fmt.Errorf("Failed patching scaleway server: %q", err) 170 } 171 172 return resourceScalewayServerRead(d, m) 173 } 174 175 func resourceScalewayServerDelete(d *schema.ResourceData, m interface{}) error { 176 scaleway := m.(*Client).scaleway 177 178 def, err := scaleway.GetServer(d.Id()) 179 if err != nil { 180 if serr, ok := err.(api.ScalewayAPIError); ok { 181 if serr.StatusCode == 404 { 182 d.SetId("") 183 return nil 184 } 185 } 186 return err 187 } 188 189 err = deleteServerSafe(scaleway, def.Identifier) 190 if err != nil { 191 return err 192 } 193 194 d.SetId("") 195 return nil 196 }