@@ -2,6 +2,7 @@ package scaleway
2
2
3
3
import (
4
4
"fmt"
5
+ "hash/fnv"
5
6
"log"
6
7
7
8
"github.com/hashicorp/terraform/helper/schema"
@@ -10,6 +11,8 @@ import (
10
11
11
12
var commercialServerTypes []string
12
13
14
+ var sshHostFingerprints = "ssh-host-fingerprints"
15
+
13
16
func resourceScalewayServer () * schema.Resource {
14
17
return & schema.Resource {
15
18
Create : resourceScalewayServerCreate ,
@@ -57,6 +60,29 @@ func resourceScalewayServer() *schema.Resource {
57
60
Optional : true ,
58
61
Description : "The security group the server is attached to" ,
59
62
},
63
+ "user_data" : {
64
+ Type : schema .TypeSet ,
65
+ Optional : true ,
66
+ Elem : & schema.Resource {
67
+ Schema : map [string ]* schema.Schema {
68
+ "key" : {
69
+ Type : schema .TypeString ,
70
+ Required : true ,
71
+ },
72
+ "value" : {
73
+ Type : schema .TypeString ,
74
+ Required : true ,
75
+ },
76
+ },
77
+ },
78
+ Set : func (val interface {}) int {
79
+ h := fnv .New32a ()
80
+ userData := val .(map [string ]interface {})
81
+ h .Write ([]byte (userData ["key" ].(string )))
82
+ return int (h .Sum32 ())
83
+ },
84
+ Description : "User Data attached to the server on creation" ,
85
+ },
60
86
"volume" : {
61
87
Type : schema .TypeList ,
62
88
Optional : true ,
@@ -201,6 +227,17 @@ func resourceScalewayServerCreate(d *schema.ResourceData, m interface{}) error {
201
227
return err
202
228
}
203
229
230
+ if val , ok := d .GetOk ("user_data" ); ok {
231
+ s := val .(* schema.Set )
232
+ for _ , v := range s .List () {
233
+ data := v .(map [string ]interface {})
234
+ err := scaleway .PatchUserdata (server .Identifier , data ["key" ].(string ), []byte (data ["value" ].(string )), false )
235
+ if err != nil {
236
+ return err
237
+ }
238
+ }
239
+ }
240
+
204
241
d .SetId (server .Identifier )
205
242
if d .Get ("state" ).(string ) != "stopped" {
206
243
task , err := scaleway .PostServerAction (server .Identifier , "poweron" )
@@ -256,6 +293,26 @@ func resourceScalewayServerRead(d *schema.ResourceData, m interface{}) error {
256
293
d .Set ("state_detail" , server .StateDetail )
257
294
d .Set ("tags" , server .Tags )
258
295
296
+ userDatas := []map [string ]interface {}{}
297
+ keys , err := scaleway .GetUserdatas (d .Id (), false )
298
+ if err != nil {
299
+ return err
300
+ }
301
+ for _ , key := range keys .UserData {
302
+ if key == sshHostFingerprints {
303
+ continue
304
+ }
305
+ data , err := scaleway .GetUserdata (d .Id (), key , false )
306
+ if err != nil {
307
+ return err
308
+ }
309
+ userDatas = append (userDatas , map [string ]interface {}{
310
+ "key" : key ,
311
+ "value" : data .String (),
312
+ })
313
+ }
314
+ d .Set ("user_data" , userDatas )
315
+
259
316
d .SetConnInfo (map [string ]string {
260
317
"type" : "ssh" ,
261
318
"host" : server .PublicAddress .IP ,
@@ -304,6 +361,40 @@ func resourceScalewayServerUpdate(d *schema.ResourceData, m interface{}) error {
304
361
return fmt .Errorf ("Failed patching scaleway server: %q" , err )
305
362
}
306
363
364
+ if d .HasChange ("user_data" ) {
365
+ remote , err := scaleway .GetUserdatas (d .Id (), false )
366
+ if err != nil {
367
+ return err
368
+ }
369
+
370
+ toDelete := []string {}
371
+ local := d .Get ("user_data" ).(* schema.Set )
372
+ for _ , key := range remote .UserData {
373
+ exists := false
374
+ for _ , v := range local .List () {
375
+ exists = exists || v .(map [string ]interface {})["key" ] == key
376
+ }
377
+ if ! exists {
378
+ toDelete = append (toDelete , key )
379
+ }
380
+ }
381
+ for _ , key := range toDelete {
382
+ if err := scaleway .DeleteUserdata (d .Id (), key , false ); err != nil {
383
+ return err
384
+ }
385
+ }
386
+
387
+ for _ , v := range local .List () {
388
+ if err := scaleway .PatchUserdata (
389
+ d .Id (),
390
+ v .(map [string ]interface {})["key" ].(string ),
391
+ []byte (v .(map [string ]interface {})["value" ].(string )),
392
+ false ); err != nil {
393
+ return err
394
+ }
395
+ }
396
+ }
397
+
307
398
if d .HasChange ("public_ip" ) {
308
399
ips , err := scaleway .GetIPS ()
309
400
if err != nil {
0 commit comments