This is an automated email from the ASF dual-hosted git repository.
sureshanaparti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 981dac7 server: allow listing custom offerings for a running VM
(#5420)
981dac7 is described below
commit 981dac7bca911a137d63e837b9dcc2b199534b44
Author: Abhishek Kumar <[email protected]>
AuthorDate: Fri Sep 17 01:48:24 2021 +0530
server: allow listing custom offerings for a running VM (#5420)
* server: allow listing custom offerings for a running VM
listServiceOffering API when called for a running VM only fails to list all
possible offerings especially the custom offerings and all offerings when VM is
deployed using a custom offering.
This improves the list behviour by adding adding appropriate conditions for
the custom offerings.
Fixes #5412
Signed-off-by: Abhishek Kumar <[email protected]>
Co-authored-by: davidjumani <[email protected]>
---
.../java/com/cloud/api/query/QueryManagerImpl.java | 67 ++++++++++++++++++++--
1 file changed, 63 insertions(+), 4 deletions(-)
diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
index f61fa33..7c5a486 100644
--- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
@@ -40,6 +40,7 @@ import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao;
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
+import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
import org.apache.cloudstack.api.ResourceDetail;
import org.apache.cloudstack.api.ResponseGenerator;
@@ -234,6 +235,7 @@ import com.cloud.user.User;
import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserDao;
import com.cloud.utils.DateUtil;
+import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.StringUtils;
import com.cloud.utils.Ternary;
@@ -447,6 +449,45 @@ public class QueryManagerImpl extends
MutualExclusiveIdsManagerBase implements Q
@Inject
private ResourceIconDao resourceIconDao;
+ private SearchCriteria<ServiceOfferingJoinVO>
getMinimumCpuServiceOfferingJoinSearchCriteria(int cpu) {
+ SearchCriteria<ServiceOfferingJoinVO> sc =
_srvOfferingJoinDao.createSearchCriteria();
+ SearchCriteria<ServiceOfferingJoinVO> sc1 =
_srvOfferingJoinDao.createSearchCriteria();
+ sc1.addAnd("cpu", Op.GTEQ, cpu);
+ sc.addOr("cpu", Op.SC, sc1);
+ SearchCriteria<ServiceOfferingJoinVO> sc2 =
_srvOfferingJoinDao.createSearchCriteria();
+ sc2.addAnd("cpu", Op.NULL);
+ sc2.addAnd("maxCpu", Op.NULL);
+ sc.addOr("cpu", Op.SC, sc2);
+ SearchCriteria<ServiceOfferingJoinVO> sc3 =
_srvOfferingJoinDao.createSearchCriteria();
+ sc3.addAnd("cpu", Op.NULL);
+ sc3.addAnd("maxCpu", Op.GTEQ, cpu);
+ sc.addOr("cpu", Op.SC, sc3);
+ return sc;
+ }
+
+ private SearchCriteria<ServiceOfferingJoinVO>
getMinimumMemoryServiceOfferingJoinSearchCriteria(int memory) {
+ SearchCriteria<ServiceOfferingJoinVO> sc =
_srvOfferingJoinDao.createSearchCriteria();
+ SearchCriteria<ServiceOfferingJoinVO> sc1 =
_srvOfferingJoinDao.createSearchCriteria();
+ sc1.addAnd("ramSize", Op.GTEQ, memory);
+ sc.addOr("ramSize", Op.SC, sc1);
+ SearchCriteria<ServiceOfferingJoinVO> sc2 =
_srvOfferingJoinDao.createSearchCriteria();
+ sc2.addAnd("ramSize", Op.NULL);
+ sc2.addAnd("maxMemory", Op.NULL);
+ sc.addOr("ramSize", Op.SC, sc2);
+ SearchCriteria<ServiceOfferingJoinVO> sc3 =
_srvOfferingJoinDao.createSearchCriteria();
+ sc3.addAnd("ramSize", Op.NULL);
+ sc3.addAnd("maxMemory", Op.GTEQ, memory);
+ sc.addOr("ramSize", Op.SC, sc3);
+ return sc;
+ }
+
+ private SearchCriteria<ServiceOfferingJoinVO>
getMinimumCpuSpeedServiceOfferingJoinSearchCriteria(int speed) {
+ SearchCriteria<ServiceOfferingJoinVO> sc =
_srvOfferingJoinDao.createSearchCriteria();
+ sc.addOr("speed", Op.GTEQ, speed);
+ sc.addOr("speed", Op.NULL);
+ return sc;
+ }
+
/*
* (non-Javadoc)
*
@@ -454,7 +495,6 @@ public class QueryManagerImpl extends
MutualExclusiveIdsManagerBase implements Q
* com.cloud.api.query.QueryService#searchForUsers(org.apache.cloudstack
* .api.command.admin.user.ListUsersCmd)
*/
-
@Override
public ListResponse<UserResponse> searchForUsers(ListUsersCmd cmd) throws
PermissionDeniedException {
Pair<List<UserAccountJoinVO>, Integer> result =
searchForUsersInternal(cmd);
@@ -2994,9 +3034,28 @@ public class QueryManagerImpl extends
MutualExclusiveIdsManagerBase implements Q
// 2.In case vm is running return only offerings greater than
equal to current offering compute and offering's dynamic scalability should
match
if (vmInstance.getState() == VirtualMachine.State.Running) {
- sc.addAnd("cpu", Op.GTEQ, currentVmOffering.getCpu());
- sc.addAnd("speed", Op.GTEQ, currentVmOffering.getSpeed());
- sc.addAnd("ramSize", Op.GTEQ, currentVmOffering.getRamSize());
+ Integer vmCpu = currentVmOffering.getCpu();
+ Integer vmMemory = currentVmOffering.getRamSize();
+ Integer vmSpeed = currentVmOffering.getSpeed();
+ if ((vmCpu == null || vmMemory == null || vmSpeed == null) &&
VirtualMachine.Type.User.equals(vmInstance.getType())) {
+ UserVmVO userVmVO = _userVmDao.findById(vmId);
+ _userVmDao.loadDetails(userVmVO);
+ Map<String, String> details = userVmVO.getDetails();
+ vmCpu =
NumbersUtil.parseInt(details.get(ApiConstants.CPU_NUMBER), 0);
+ if (vmSpeed == null) {
+ vmSpeed =
NumbersUtil.parseInt(details.get(ApiConstants.CPU_SPEED), 0);
+ }
+ vmMemory =
NumbersUtil.parseInt(details.get(ApiConstants.MEMORY), 0);
+ }
+ if (vmCpu != null && vmCpu > 0) {
+ sc.addAnd("cpu", Op.SC,
getMinimumCpuServiceOfferingJoinSearchCriteria(vmCpu));
+ }
+ if (vmSpeed != null && vmSpeed > 0) {
+ sc.addAnd("speed", Op.SC,
getMinimumCpuSpeedServiceOfferingJoinSearchCriteria(vmSpeed));
+ }
+ if (vmMemory != null && vmMemory > 0) {
+ sc.addAnd("ramSize", Op.SC,
getMinimumMemoryServiceOfferingJoinSearchCriteria(vmMemory));
+ }
sc.addAnd("dynamicScalingEnabled", Op.EQ,
currentVmOffering.isDynamicScalingEnabled());
}
}