Skip to content

Commit

Permalink
F #27: VM: enable OS and graphics update
Browse files Browse the repository at this point in the history
  • Loading branch information
treywelsh committed Aug 25, 2021
1 parent be69ee7 commit 6fbad05
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 47 deletions.
62 changes: 44 additions & 18 deletions opennebula/resource_opennebula_virtual_machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,7 @@ func resourceOpennebulaVirtualMachineUpdate(d *schema.ResourceData, meta interfa

// TODO: fix it after 5.10 release
// Force the "decrypt" bool to false to keep ONE 5.8 behavior
vm, err := vmc.Info(false)
vmInfos, err := vmc.Info(false)
if err != nil {
return err
}
Expand All @@ -780,8 +780,8 @@ func resourceOpennebulaVirtualMachineUpdate(d *schema.ResourceData, meta interfa
}
// TODO: fix it after 5.10 release
// Force the "decrypt" bool to false to keep ONE 5.8 behavior
vm, err := vmc.Info(false)
log.Printf("[INFO] Successfully updated name (%s) for VM ID %x\n", vm.Name, vm.ID)
vmInfos, err := vmc.Info(false)
log.Printf("[INFO] Successfully updated name (%s) for VM ID %x\n", vmInfos.Name, vmInfos.ID)
}

if d.HasChange("permissions") && d.Get("permissions") != "" {
Expand All @@ -791,25 +791,25 @@ func resourceOpennebulaVirtualMachineUpdate(d *schema.ResourceData, meta interfa
return err
}
}
log.Printf("[INFO] Successfully updated Permissions VM %s\n", vm.Name)
log.Printf("[INFO] Successfully updated Permissions VM %s\n", vmInfos.Name)
}

if d.HasChange("group") {
err := changeVmGroup(d, meta)
if err != nil {
return err
}
log.Printf("[INFO] Successfully updated group for VM %s\n", vm.Name)
log.Printf("[INFO] Successfully updated group for VM %s\n", vmInfos.Name)
}

if d.HasChange("tags") {
tagsInterface := d.Get("tags").(map[string]interface{})
for k, v := range tagsInterface {
vm.UserTemplate.Del(strings.ToUpper(k))
vm.UserTemplate.AddPair(strings.ToUpper(k), v.(string))
vmInfos.UserTemplate.Del(strings.ToUpper(k))
vmInfos.UserTemplate.AddPair(strings.ToUpper(k), v.(string))
}

err = vmc.Update(vm.UserTemplate.String(), 1)
err = vmc.Update(vmInfos.UserTemplate.String(), 1)
if err != nil {
return err
}
Expand Down Expand Up @@ -979,18 +979,32 @@ func resourceOpennebulaVirtualMachineUpdate(d *schema.ResourceData, meta interfa
}
}

if d.HasChange("context") {
updateConf := false
tpl := vm.NewTemplate()

// wait state to be ready
timeout := d.Get("timeout").(int)
if d.HasChange("os") {
updateConf = true

_, err = waitForVMState(vmc, timeout, "RUNNING")
if err != nil {
return fmt.Errorf(
"waiting for virtual machine (ID:%d) to be in state %s: %s", vmc.ID, strings.Join(vmDiskUpdateReadyStates, " "), err)
}
log.Printf("[DEBUG] Update os")

//Generate OS definition
addOS(tpl, d.Get("os").([]interface{}))

}

if d.HasChange("graphics") {
updateConf = true

log.Printf("[DEBUG] Update graphics")

//Generate GRAPHICS definition
addGraphic(tpl, d.Get("graphics").([]interface{}))

log.Printf("[INFO] Update context configuration")
}

if d.HasChange("context") {

log.Printf("[DEBUG] Update context")

tpl := dyn.NewTemplate()
contextVec := tpl.AddVector("CONTEXT")
Expand All @@ -1004,7 +1018,19 @@ func resourceOpennebulaVirtualMachineUpdate(d *schema.ResourceData, meta interfa
contextVec.AddPair(keyUp, fmt.Sprint(value))
}

log.Printf("[INFO] Update CONTEXT configuration: %s", tpl.String())
}

if updateConf == true {

timeout := d.Get("timeout").(int)

_, err = waitForVMState(vmc, timeout, "RUNNING")
if err != nil {
return fmt.Errorf(
"waiting for virtual machine (ID:%d) to be in state %s: %s", vmc.ID, strings.Join(vmDiskUpdateReadyStates, " "), err)
}

log.Printf("[INFO] Update VM configuration: %s", tpl.String())

err := vmc.UpdateConf(tpl.String())
if err != nil {
Expand Down
68 changes: 39 additions & 29 deletions opennebula/shared_schemas.go
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,43 @@ func makeNICVector(nicConfig map[string]interface{}) *shared.NIC {
return nic
}

func addOS(tpl *vm.Template, os []interface{}) {

for i := 0; i < len(os); i++ {
osconfig := os[i].(map[string]interface{})
tpl.AddOS(vmk.Arch, osconfig["arch"].(string))
tpl.AddOS(vmk.Boot, osconfig["boot"].(string))
}

}

func addGraphic(tpl *vm.Template, graphics []interface{}) {

for i := 0; i < len(graphics); i++ {
graphicsconfig := graphics[i].(map[string]interface{})

for k, v := range graphicsconfig {

if isEmptyValue(reflect.ValueOf(v)) {
continue
}

switch k {
case "listen":
tpl.AddIOGraphic(vmk.Listen, v.(string))
case "type":
tpl.AddIOGraphic(vmk.GraphicType, v.(string))
case "port":
tpl.AddIOGraphic(vmk.Port, v.(string))
case "keymap":
tpl.AddIOGraphic(vmk.Keymap, v.(string))
}

}

}
}

func generateVMTemplate(d *schema.ResourceData, tpl *vm.Template) {

//Generate NIC definition
Expand Down Expand Up @@ -327,37 +364,10 @@ func generateVMTemplate(d *schema.ResourceData, tpl *vm.Template) {
}

//Generate GRAPHICS definition
graphics := d.Get("graphics").([]interface{})
for i := 0; i < len(graphics); i++ {
graphicsconfig := graphics[i].(map[string]interface{})

for k, v := range graphicsconfig {

if isEmptyValue(reflect.ValueOf(v)) {
continue
}

switch k {
case "listen":
tpl.AddIOGraphic(vmk.Listen, v.(string))
case "type":
tpl.AddIOGraphic(vmk.GraphicType, v.(string))
case "port":
tpl.AddIOGraphic(vmk.Port, v.(string))
case "keymap":
tpl.AddIOGraphic(vmk.Keymap, v.(string))
}

}
}
addGraphic(tpl, d.Get("graphics").([]interface{}))

//Generate OS definition
os := d.Get("os").([]interface{})
for i := 0; i < len(os); i++ {
osconfig := os[i].(map[string]interface{})
tpl.AddOS(vmk.Arch, osconfig["arch"].(string))
tpl.AddOS(vmk.Boot, osconfig["boot"].(string))
}
addOS(tpl, d.Get("os").([]interface{}))

//Generate CPU Model definition
cpumodel := d.Get("cpumodel").([]interface{})
Expand Down

0 comments on commit 6fbad05

Please sign in to comment.