Skip to content

Commit 672c4d6

Browse files
committed
Fix template resource dynamic type resolution
1 parent 726c864 commit 672c4d6

File tree

1 file changed

+93
-74
lines changed

1 file changed

+93
-74
lines changed

opennebula/resource_template.go

Lines changed: 93 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package opennebula
22

33
import (
4-
"log"
5-
64
"github.com/hashicorp/terraform/helper/schema"
75
"github.com/megamsys/opennebula-go/api"
86
"github.com/megamsys/opennebula-go/template"
97
"errors"
108
"strconv"
9+
"log"
1110
)
1211

1312
func resourceTemplate() *schema.Resource {
@@ -251,7 +250,7 @@ func resourceTemplate() *schema.Resource {
251250
Optional: true,
252251
},
253252
"nic": {
254-
Type: schema.TypeList,
253+
Type: schema.TypeSet,
255254
Optional: true,
256255
Elem: &schema.Resource{
257256
Schema: map[string]*schema.Schema{
@@ -300,28 +299,12 @@ func getNestedSet(d *schema.ResourceData, k string) map[string]interface{} {
300299
}
301300

302301
func resourceTemplateCreate(d *schema.ResourceData, meta interface{}) error {
303-
permissions := getNestedSet(d, "permissions")
304-
context := getNestedSet(d, "context")
305-
graphics := getNestedSet(d, "graphics")
306-
disk := getNestedSet(d, "disk")
307-
os := getNestedSet(d, "os")
308-
309-
nic := d.Get("nic").([]interface{})
310-
nics := make([]*template.NIC, len(nic))
311-
for i, n := range nic {
312-
mapN := n.(*schema.Set).List()[0].(map[string]interface{})
313-
nics[i] = &template.NIC{
314-
Network: mapN["network"].(string),
315-
Network_uname: mapN["network_uname"].(string),
316-
}
317-
}
302+
log.Println("jason says: creating...")
318303

319304
userTemplate := &template.UserTemplate{
320305
T: meta.(*api.Rpc),
321306
Template: &template.Template{
322307
Name: d.Get("name").(string),
323-
324-
/*
325308
Cpu: d.Get("cpu").(string),
326309
Cpu_cost: d.Get("cpu_cost").(string),
327310
Description: d.Get("description").(string),
@@ -336,11 +319,11 @@ func resourceTemplateCreate(d *schema.ResourceData, meta interface{}) error {
336319
From_app_name: d.Get("from_app_name").(string),
337320
Sched_requirments: d.Get("sched_requirements").(string),
338321
Sched_ds_requirments: d.Get("sched_ds_requirements").(string),
339-
Nic: nics,
340-
*/
341322
},
342323
}
343324

325+
// TODO: Clean up a bit
326+
permissions := getNestedSet(d, "permissions")
344327
if permissions != nil {
345328
userTemplate.Permissions = &template.Permissions{
346329
Owner_U: permissions["owner_u"].(int),
@@ -355,23 +338,23 @@ func resourceTemplateCreate(d *schema.ResourceData, meta interface{}) error {
355338
}
356339
}
357340

341+
context := getNestedSet(d, "context")
358342
if context != nil {
359343
userTemplate.Template.Context = &template.Context{
360344
Network: context["network"].(string),
361345
SSH_Public_key: context["ssh_public_key"].(string),
362-
/*
363346
Files: context["files"].(string),
364347
Set_Hostname: context["set_hostname"].(string),
365348
Node_Name: context["node_name"].(string),
366349
Accounts_id: context["accounts_id"].(string),
367350
Platform_id: context["platform_id"].(string),
368351
Assembly_id: context["assembly_id"].(string),
369-
Assemblies_id: context["assembles_id"].(string),
352+
Assemblies_id: context["assemblies_id"].(string),
370353
Org_id: context["org_id"].(string),
371-
*/
372354
}
373355
}
374356

357+
graphics := getNestedSet(d, "graphics")
375358
if graphics != nil {
376359
userTemplate.Template.Graphics = &template.Graphics{
377360
Listen: graphics["listen"].(string),
@@ -381,6 +364,8 @@ func resourceTemplateCreate(d *schema.ResourceData, meta interface{}) error {
381364
}
382365
}
383366

367+
368+
disk := getNestedSet(d, "disk")
384369
if disk != nil {
385370
userTemplate.Template.Disk = &template.Disk{
386371
Driver: disk["driver"].(string),
@@ -390,21 +375,33 @@ func resourceTemplateCreate(d *schema.ResourceData, meta interface{}) error {
390375
}
391376
}
392377

378+
379+
os := getNestedSet(d, "os")
393380
if os != nil {
394381
userTemplate.Template.Os = &template.OS{
395382
Arch: os["arch"].(string),
396383
}
397384
}
398385

386+
nicList := d.Get("nic").(*schema.Set).List()
387+
nics := make([]*template.NIC, len(nicList))
388+
for i, nic := range nicList {
389+
mapN := nic.(map[string]interface{})
390+
nics[i] = &template.NIC{
391+
Network: mapN["network"].(string),
392+
Network_uname: mapN["network_uname"].(string),
393+
}
394+
}
395+
userTemplate.Template.Nic = nics
399396

400-
xml, err := userTemplate.AllocateTemplate()
397+
xmlRpc, err := userTemplate.AllocateTemplate()
401398
if err != nil {
402399
log.Println("[FATAL] Could not allocate template", err)
403400
return err
404401
}
405402

406-
log.Println("[INFO] Creating a template returned response", xml)
407-
d.SetId(xml.(string))
403+
log.Println("[INFO] Creating a template returned response", xmlRpc)
404+
d.SetId(xmlRpc.(string))
408405

409406
return resourceTemplateRead(d, meta)
410407
}
@@ -428,6 +425,7 @@ func resourceTemplateRead(d *schema.ResourceData, meta interface{}) error {
428425
return errors.New("No template with such name")
429426
}
430427

428+
// TODO: PK (user_id, name)
431429
if len(userTemplates) != 1 {
432430
log.Printf("[WARN] Reading template %s returned %d different templates\n", name, len(userTemplates))
433431
}
@@ -442,31 +440,6 @@ func resourceTemplateRead(d *schema.ResourceData, meta interface{}) error {
442440
d.Set("reg_time", t.RegTime)
443441
d.Set("name", t.Name)
444442

445-
/*
446-
d.Set("permissions", map[string]interface{}{
447-
"owner_u": t.Permissions.Owner_U,
448-
"owner_m": t.Permissions.Owner_M,
449-
"owner_a": t.Permissions.Owner_A,
450-
"group_u": t.Permissions.Group_U,
451-
"group_m": t.Permissions.Group_M,
452-
"group_a": t.Permissions.Group_A,
453-
"other_u": t.Permissions.Other_U,
454-
"other_m": t.Permissions.Other_M,
455-
"other_a": t.Permissions.Other_A,
456-
})
457-
458-
d.Set("context", map[string]interface{}{
459-
"network": t.Template.Context.Network,
460-
"files": t.Template.Context.Files,
461-
"ssh_public_key": t.Template.Context.SSH_Public_key,
462-
"set_hostname": t.Template.Context.Set_Hostname,
463-
"node_name": t.Template.Context.Node_Name,
464-
"accounts_id": t.Template.Context.Accounts_id,
465-
"platform_id": t.Template.Context.Platform_id,
466-
"assembly_id": t.Template.Context.Assembly_id,
467-
"assemblies_id": t.Template.Context.Assemblies_id,
468-
"org_id": t.Template.Context.Org_id,
469-
})
470443
d.Set("cpu", t.Template.Cpu)
471444
d.Set("cpu_cost", t.Template.Cpu_cost)
472445
d.Set("description", t.Template.Description)
@@ -477,38 +450,84 @@ func resourceTemplateRead(d *schema.ResourceData, meta interface{}) error {
477450
d.Set("sunstone_capacity_select", t.Template.Sunstone_capacity_select)
478451
d.Set("sunstone_network_select", t.Template.Sunstone_Network_select)
479452
d.Set("vcpu", t.Template.VCpu)
480-
d.Set("graphics", map[string]interface{}{
481-
"listen": t.Template.Graphics.Listen,
482-
"port": t.Template.Graphics.Port,
483-
"type": t.Template.Graphics.Type,
484-
"random_passwd": t.Template.Graphics.RandomPassWD,
485-
})
486-
d.Set("disk", map[string]interface{}{
487-
"driver": t.Template.Disk.Driver,
488-
"image": t.Template.Disk.Image,
489-
"image_uname": t.Template.Disk.Image_Uname,
490-
"size": t.Template.Disk.Size,
491-
})
453+
d.Set("sched_requirements", t.Template.Sched_requirments)
454+
d.Set("sched_ds_requirements", t.Template.Sched_ds_requirments)
492455
d.Set("disk_cost", t.Template.Disk_cost)
493456
d.Set("from_app", t.Template.From_app)
494457
d.Set("from_app_name", t.Template.From_app_name)
495458

459+
if t.Permissions != nil {
460+
d.Set("permissions", []map[string]interface{}{
461+
{
462+
"owner_u": t.Permissions.Owner_U,
463+
"owner_m": t.Permissions.Owner_M,
464+
"owner_a": t.Permissions.Owner_A,
465+
"group_u": t.Permissions.Group_U,
466+
"group_m": t.Permissions.Group_M,
467+
"group_a": t.Permissions.Group_A,
468+
"other_u": t.Permissions.Other_U,
469+
"other_m": t.Permissions.Other_M,
470+
"other_a": t.Permissions.Other_A,
471+
},
472+
})
473+
}
474+
475+
if t.Template.Context != nil {
476+
d.Set("context", []map[string]interface{}{
477+
{
478+
"network": t.Template.Context.Network,
479+
"files": t.Template.Context.Files,
480+
"ssh_public_key": t.Template.Context.SSH_Public_key,
481+
"set_hostname": t.Template.Context.Set_Hostname,
482+
"node_name": t.Template.Context.Node_Name,
483+
"accounts_id": t.Template.Context.Accounts_id,
484+
"platform_id": t.Template.Context.Platform_id,
485+
"assembly_id": t.Template.Context.Assembly_id,
486+
"assemblies_id": t.Template.Context.Assemblies_id,
487+
"org_id": t.Template.Context.Org_id,
488+
},
489+
})
490+
}
491+
492+
493+
if t.Template.Graphics != nil {
494+
d.Set("graphics", []map[string]interface{}{
495+
{
496+
"listen": t.Template.Graphics.Listen,
497+
"port": t.Template.Graphics.Port,
498+
"type": t.Template.Graphics.Type,
499+
"random_passwd": t.Template.Graphics.RandomPassWD,
500+
},
501+
})
502+
}
503+
504+
if t.Template.Disk != nil {
505+
d.Set("disk", []map[string]interface{}{
506+
{
507+
"driver": t.Template.Disk.Driver,
508+
"image": t.Template.Disk.Image,
509+
"image_uname": t.Template.Disk.Image_Uname,
510+
"size": t.Template.Disk.Size,
511+
},
512+
})
513+
}
514+
496515
nics := make([]map[string]interface{}, len(t.Template.Nic))
497516
for i, n := range t.Template.Nic {
498517
nics[i] = map[string]interface{}{
499518
"network": n.Network,
500519
"network_uname": n.Network_uname,
501520
}
502521
}
503-
d.Set("nic", []interface{}{
522+
d.Set("nic", nics)
504523

505-
})
506-
d.Set("os", map[string]interface{}{
507-
"arch": t.Template.Os.Arch,
508-
})
509-
d.Set("sched_requirements", t.Template.Sched_requirments)
510-
d.Set("sched_ds_requirements", t.Template.Sched_ds_requirments)
511-
*/
524+
if t.Template.Os != nil {
525+
d.Set("os", []map[string]interface{}{
526+
{
527+
"arch": t.Template.Os.Arch,
528+
},
529+
})
530+
}
512531

513532
return nil
514533
}
@@ -521,7 +540,7 @@ func resourceTemplateDelete(d *schema.ResourceData, meta interface{}) error {
521540
client := meta.(*api.Rpc)
522541
err := resourceTemplateRead(d, meta)
523542
if err != nil {
524-
return err
543+
return nil
525544
}
526545

527546
intId, err := strconv.Atoi(d.Id())

0 commit comments

Comments
 (0)