This is an automated email from the ASF dual-hosted git repository. weizhou pushed a commit to branch 4.18-non-strict-affinity-groups in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 06c0f151169b3acf0769f5ea2ea37cc4da2f0000 Author: Wei Zhou <[email protected]> AuthorDate: Mon Oct 24 09:19:55 2022 +0200 api,server: add forgetLastHost to StartVM --- api/src/main/java/com/cloud/vm/VirtualMachineProfile.java | 1 + api/src/main/java/org/apache/cloudstack/api/ApiConstants.java | 1 + .../org/apache/cloudstack/api/command/user/vm/StartVMCmd.java | 11 +++++++++++ .../src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java | 4 ++++ .../engine/cloud/entity/api/VMEntityManagerImpl.java | 3 +++ .../java/com/cloud/deploy/DeploymentPlanningManagerImpl.java | 4 +++- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 3 +++ ui/public/locales/en.json | 1 + ui/src/config/section/compute.js | 3 ++- ui/src/views/compute/StartVirtualMachine.vue | 7 +++++++ 10 files changed, 36 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java b/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java index f87939a13f..a447f3819a 100644 --- a/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java +++ b/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java @@ -75,6 +75,7 @@ public interface VirtualMachineProfile { public static final Param BootType = new Param("BootType"); public static final Param BootIntoSetup = new Param("enterHardwareSetup"); public static final Param PreserveNics = new Param("PreserveNics"); + public static final Param ForgetLastHost = new Param("ForgetLastHost"); private String name; diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 21088592d8..c556b65be0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -630,6 +630,7 @@ public class ApiConstants { public static final String PURPOSE = "purpose"; public static final String IS_TAGGED = "istagged"; public static final String INSTANCE_NAME = "instancename"; + public static final String FORGET_LAST_HOST = "forgetlasthost"; public static final String START_VM = "startvm"; public static final String HA_HOST = "hahost"; public static final String CUSTOM_DISK_OFF_MIN_SIZE = "customdiskofferingminsize"; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java index 2e7f5a6f0d..103efe2761 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java @@ -82,6 +82,13 @@ public class StartVMCmd extends BaseAsyncCmd implements UserCmd { since = "3.0.1") private Long hostId; + @Parameter(name = ApiConstants.FORGET_LAST_HOST, + type = CommandType.BOOLEAN, + description = "False by default, CloudStack will try to start the VM on the last host where it run if destination host is not specified. " + + "If true, CloudStack will forget the last host and start the VM by normal process.", + since = "4.18.0") + private Boolean forgetLastHost; + @Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "Deployment planner to use for vm allocation. Available to ROOT admin only", since = "4.4", authorized = { RoleType.Admin }) private String deploymentPlanner; @@ -112,6 +119,10 @@ public class StartVMCmd extends BaseAsyncCmd implements UserCmd { return bootIntoSetup; } + public Boolean getForgetLastHost() { + return forgetLastHost; + } + // /////////////////////////////////////////////////// // ///////////// API Implementation/////////////////// // /////////////////////////////////////////////////// diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index 3bad014dbf..83a37c27d4 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1393,6 +1393,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac msgBuf.append(String.format("Boot into Setup: %s ", params.get(VirtualMachineProfile.Param.BootIntoSetup))); log = true; } + if (params.get(VirtualMachineProfile.Param.ForgetLastHost) != null) { + msgBuf.append(String.format("Forget last host: %s ", params.get(VirtualMachineProfile.Param.ForgetLastHost))); + log = true; + } if (log) { s_logger.info(msgBuf.toString()); } diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java index d9b7722f30..16bc2b5958 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java @@ -158,6 +158,9 @@ public class VMEntityManagerImpl implements VMEntityManager { vmProfile.getParameters().put(VirtualMachineProfile.Param.BootMode, details.get(VirtualMachineProfile.Param.BootMode.getName())); vmProfile.getParameters().put(VirtualMachineProfile.Param.UefiFlag, details.get(VirtualMachineProfile.Param.UefiFlag.getName())); } + if (MapUtils.isNotEmpty(vmEntityVO.getDetails()) && vmEntityVO.getDetails().containsKey(VirtualMachineProfile.Param.ForgetLastHost.getName())) { + vmProfile.getParameters().put(VirtualMachineProfile.Param.ForgetLastHost, vmEntityVO.getDetails().get(VirtualMachineProfile.Param.ForgetLastHost.getName())); + } DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterId(), vm.getPodIdToDeployIn(), null, null, null, null); if (planToDeploy != null && planToDeploy.getDataCenterId() != 0) { plan = diff --git a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java index d16b69999d..e258777e03 100644 --- a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -293,6 +293,8 @@ StateListener<State, VirtualMachine.Event, VirtualMachine>, Configurable { String haVmTag = (String)vmProfile.getParameter(VirtualMachineProfile.Param.HaTag); String uefiFlag = (String)vmProfile.getParameter(VirtualMachineProfile.Param.UefiFlag); + String forgetLastHostStr = (String)vmProfile.getParameter(VirtualMachineProfile.Param.ForgetLastHost); + boolean forgetLastHostBool = forgetLastHostStr != null && Boolean.TRUE.toString().equalsIgnoreCase(forgetLastHostStr); if (plan.getHostId() != null && haVmTag == null) { Long hostIdSpecified = plan.getHostId(); @@ -408,7 +410,7 @@ StateListener<State, VirtualMachine.Event, VirtualMachine>, Configurable { planner = getDeploymentPlannerByName(plannerName); } - if (vm.getLastHostId() != null && haVmTag == null) { + if (vm.getLastHostId() != null && haVmTag == null && !forgetLastHostBool) { s_logger.debug("This VM has last host_id specified, trying to choose the same host: " + vm.getLastHostId()); HostVO host = _hostDao.findById(vm.getLastHostId()); diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 4e646dff6a..3034c885f5 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -3203,6 +3203,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if (uefiDetail != null) { addVmUefiBootOptionsToParams(additonalParams, uefiDetail.getName(), uefiDetail.getValue()); } + if (cmd.getForgetLastHost() != null) { + additonalParams.put(VirtualMachineProfile.Param.ForgetLastHost, cmd.getForgetLastHost().toString()); + } return startVirtualMachine(cmd.getId(), cmd.getPodId(), cmd.getClusterId(), cmd.getHostId(), additonalParams, cmd.getDeploymentPlanner()).first(); } diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index babd453baa..0fb372e13b 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -730,6 +730,7 @@ "label.forced": "Force", "label.forceencap": "Force UDP encapsulation of ESP packets", "label.forgedtransmits": "Forged transmits", +"label.forgetlasthost": "Forget Last Host", "label.format": "Format", "label.free": "Free", "label.friday": "Friday", diff --git a/ui/src/config/section/compute.js b/ui/src/config/section/compute.js index a8e7c56d47..4c65ce05ad 100644 --- a/ui/src/config/section/compute.js +++ b/ui/src/config/section/compute.js @@ -117,7 +117,8 @@ export default { dataView: true, groupAction: true, popup: true, - groupMap: (selection) => { return selection.map(x => { return { id: x } }) }, + groupMap: (selection, values) => { return selection.map(x => { return { id: x, forgetlasthost: values.forgetlasthost } }) }, + args: ['forgetlasthost'], show: (record) => { return ['Stopped'].includes(record.state) }, component: shallowRef(defineAsyncComponent(() => import('@/views/compute/StartVirtualMachine.vue'))) }, diff --git a/ui/src/views/compute/StartVirtualMachine.vue b/ui/src/views/compute/StartVirtualMachine.vue index 5d5ff83346..e21d0a4681 100644 --- a/ui/src/views/compute/StartVirtualMachine.vue +++ b/ui/src/views/compute/StartVirtualMachine.vue @@ -97,6 +97,13 @@ <a-switch v-model:checked="form.bootintosetup" /> </a-form-item> + <a-form-item name="forgetlasthost" ref="forgetlasthost"> + <template #label> + <tooltip-label :title="$t('label.forgetlasthost')" :tooltip="apiParams.forgetlasthost.description"/> + </template> + <a-switch v-model:checked="form.forgetlasthost" /> + </a-form-item> + <div :span="24" class="action-button"> <a-button @click="closeAction">{{ $t('label.cancel') }}</a-button> <a-button :loading="loading" ref="submit" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
