diff --git a/opennebula/resource_opennebula_virtual_machine.go b/opennebula/resource_opennebula_virtual_machine.go index 70d13896d..176bc0314 100644 --- a/opennebula/resource_opennebula_virtual_machine.go +++ b/opennebula/resource_opennebula_virtual_machine.go @@ -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 } @@ -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") != "" { @@ -791,7 +791,7 @@ 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") { @@ -799,17 +799,17 @@ func resourceOpennebulaVirtualMachineUpdate(d *schema.ResourceData, meta interfa 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 } @@ -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") @@ -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 { diff --git a/opennebula/shared_schemas.go b/opennebula/shared_schemas.go index 813d0764d..bc825e336 100644 --- a/opennebula/shared_schemas.go +++ b/opennebula/shared_schemas.go @@ -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 @@ -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{})