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>

Reply via email to