diff --git a/modules/cloud_service_providers/vmware/src/Entity/VmwareVm.php b/modules/cloud_service_providers/vmware/src/Entity/VmwareVm.php index 6a8f42c..17394ee 100644 --- a/modules/cloud_service_providers/vmware/src/Entity/VmwareVm.php +++ b/modules/cloud_service_providers/vmware/src/Entity/VmwareVm.php @@ -25,6 +25,7 @@ use Drupal\Core\Field\FieldStorageDefinitionInterface; * "access" = "Drupal\vmware\Controller\VmwareVmAccessControlHandler", * "form" = { * "add" = "Drupal\vmware\Form\VmwareVmCreateForm", + * "edit" = "Drupal\vmware\Form\VmwareVmEditForm", * "start" = "Drupal\vmware\Form\VmwareVmStartForm", * "stop" = "Drupal\vmware\Form\VmwareVmStopForm", * "reboot" = "Drupal\vmware\Form\VmwareVmRebootForm", @@ -48,6 +49,7 @@ use Drupal\Core\Field\FieldStorageDefinitionInterface; * "canonical" = "/clouds/vmware/{cloud_context}/vm/{vmware_vm}", * "collection" = "/clouds/vmware/{cloud_context}/vm", * "add-form" = "/clouds/vmware/{cloud_context}/vm/add", + * "edit-form" = "/clouds/vmware/{cloud_context}/vm/{vmware_vm}/edit", * "start-form" = "/clouds/vmware/{cloud_context}/vm/{vmware_vm}/start", * "stop-form" = "/clouds/vmware/{cloud_context}/vm/{vmware_vm}/stop", * "reboot-form" = "/clouds/vmware/{cloud_context}/vm/{vmware_vm}/reboot", diff --git a/modules/cloud_service_providers/vmware/src/Form/VmwareVmCreateForm.php b/modules/cloud_service_providers/vmware/src/Form/VmwareVmCreateForm.php index bd04c11..9d2e0df 100644 --- a/modules/cloud_service_providers/vmware/src/Form/VmwareVmCreateForm.php +++ b/modules/cloud_service_providers/vmware/src/Form/VmwareVmCreateForm.php @@ -10,7 +10,7 @@ use Drupal\vmware\Service\VmwareService; use Drupal\vmware\Service\VmwareServiceException; /** - * Form controller for the Namespace entity create form. + * Form controller for the VMware VM entity create form. * * @ingroup vmware */ diff --git a/modules/cloud_service_providers/vmware/src/Form/VmwareVmEditForm.php b/modules/cloud_service_providers/vmware/src/Form/VmwareVmEditForm.php new file mode 100644 index 0000000..5ad4dc7 --- /dev/null +++ b/modules/cloud_service_providers/vmware/src/Form/VmwareVmEditForm.php @@ -0,0 +1,137 @@ +entity; + $weight = -50; + + $form['vm'] = [ + '#type' => 'details', + '#title' => $this->t('VM'), + '#open' => TRUE, + '#weight' => $weight++, + ]; + + $form['vm']['name'] = [ + '#type' => 'item', + '#title' => $this->getItemTitle($this->t('Name')), + '#markup' => $entity->getName(), + '#weight' => $weight++, + ]; + + $form['vm']['power_state'] = [ + '#type' => 'item', + '#title' => $this->getItemTitle($this->t('Power State')), + '#markup' => $entity->getPowerState(), + '#weight' => $weight++, + ]; + + $form['vm']['cpu_count'] = [ + '#type' => 'number', + '#title' => $this->t('CPU Count'), + '#description' => $this->t('The CPU count can be modified when virtual machine is powered off.'), + '#default_value' => $entity->getCpuCount(), + '#required' => TRUE, + '#weight' => $weight++, + '#disabled' => $entity->getPowerState() != 'POWERED_OFF', + ]; + + $form['vm']['memory_size'] = [ + '#type' => 'number', + '#title' => $this->t('Memory Size (MiB)'), + '#description' => $this->t('The memory size can be modified when virtual machine is powered off.'), + '#default_value' => $entity->getMemorySize(), + '#weight' => $weight++, + '#disabled' => $entity->getPowerState() != 'POWERED_OFF', + ]; + + $form['vm']['guest_os'] = [ + '#type' => 'item', + '#title' => $this->getItemTitle($this->t('Guest OS')), + '#markup' => $this->vmwareVmGuestOsDataProvider->getLabel($entity->getGuestOs()), + '#weight' => $weight++, + ]; + + $form['vm']['disk_size'] = $form['disk_size']; + $form['vm']['disk_size']['#disabled'] = TRUE; + unset($form['disk_size']); + + $this->addOthersFieldset($form, $weight++, $cloud_context); + + $form['actions'] = $this->actions($form, $form_state, $cloud_context); + + return $form; + } + + /** + * {@inheritdoc} + */ + public function save(array $form, FormStateInterface $form_state) { + $this->copyFormItemValues($form); + + $this->trimTextfields($form, $form_state); + + $entity = $this->entity; + + try { + $this->vmwareService->setCloudContext($entity->getCloudContext()); + $this->vmwareService->login(); + + if ($entity->getPowerState() == 'POWERED_OFF') { + $this->vmwareService->updateVmCpu( + $entity->getVmId(), + $entity->getCpuCount() + ); + + $this->vmwareService->updateVmMemory( + $entity->getVmId(), + $entity->getMemorySize() + ); + } + + // Save author to entity. + $entity->save(); + + $this->vmwareService->updateVms([ + 'VmId' => $entity->getVmId(), + ], FALSE); + + $this->processOperationStatus($entity, 'updated'); + + VmwareService::clearCacheValue(); + + $form_state->setRedirect('view.vmware_vm.list', ['cloud_context' => $entity->getCloudContext()]); + } + catch (VmwareServiceException + | EntityStorageException + | EntityMalformedException $e) { + + try { + $this->processOperationErrorStatus($entity, 'updated'); + } + catch (EntityMalformedException $e) { + $this->handleException($e); + } + } + } + +} diff --git a/modules/cloud_service_providers/vmware/src/Service/VmwareService.php b/modules/cloud_service_providers/vmware/src/Service/VmwareService.php index 0f886ad..711d489 100644 --- a/modules/cloud_service_providers/vmware/src/Service/VmwareService.php +++ b/modules/cloud_service_providers/vmware/src/Service/VmwareService.php @@ -223,6 +223,38 @@ class VmwareService extends CloudServiceBase implements VmwareServiceInterface { /** * {@inheritdoc} */ + public function updateVmMemory($vm_id, $memory_size) { + $body = [ + 'spec' => [ + 'size_MiB' => $memory_size, + ], + ]; + return $this->callApi( + 'patch', + "rest/vcenter/vm/$vm_id/hardware/memory", + ['json' => $body] + ); + } + + /** + * {@inheritdoc} + */ + public function updateVmCpu($vm_id, $cpu_count) { + $body = [ + 'spec' => [ + 'count' => $cpu_count, + ], + ]; + return $this->callApi( + 'patch', + "rest/vcenter/vm/$vm_id/hardware/cpu", + ['json' => $body] + ); + } + + /** + * {@inheritdoc} + */ public function describeFolders(array $params = []) { $url = 'rest/vcenter/folder'; return $this->callApi('get', $url); @@ -324,6 +356,7 @@ class VmwareService extends CloudServiceBase implements VmwareServiceInterface { } } catch (GuzzleException $error) { + $response = $error->getResponse(); $message = new FormattableMarkup( 'VMware API error. Error details are as follows:
@response
', [ '@response' => !empty($response) diff --git a/modules/cloud_service_providers/vmware/src/Service/VmwareServiceInterface.php b/modules/cloud_service_providers/vmware/src/Service/VmwareServiceInterface.php index 071f782..81a86f3 100644 --- a/modules/cloud_service_providers/vmware/src/Service/VmwareServiceInterface.php +++ b/modules/cloud_service_providers/vmware/src/Service/VmwareServiceInterface.php @@ -98,12 +98,25 @@ interface VmwareServiceInterface { * @param bool $clear * TRUE to clear stale entities. * - * @return bool - * Indicates success so failure. + * @return array + * The response of API. */ public function updateVms(array $params = [], $clear = TRUE); /** + * Update the VM memory. + * + * @param string $vm_id + * The VM's ID. + * @param int $memory_size + * The memory size. + * + * @return array + * The response of API. + */ + public function updateVmMemory($vm_id, $memory_size); + + /** * Describe the folders. * * @param array $params diff --git a/modules/cloud_service_providers/vmware/vmware.links.action.yml b/modules/cloud_service_providers/vmware/vmware.links.action.yml index 5959e05..66c6d7f 100644 --- a/modules/cloud_service_providers/vmware/vmware.links.action.yml +++ b/modules/cloud_service_providers/vmware/vmware.links.action.yml @@ -30,9 +30,16 @@ entity.vmware_vm.collection: title: 'List VMware VMs' appears_on: - entity.vmware_vm.add_form + - entity.vmware_vm.edit_form - entity.vmware_vm.canonical - entity.vmware_vm.delete_form +entity.vmware_vm.edit: + route_name: entity.vmware_vm.edit_form + title: 'Edit' + appears_on: + - entity.vmware_vm.canonical + entity.vmware_vm.delete: route_name: entity.vmware_vm.delete_form title: 'Delete'