mirror of https://github.com/apache/cloudstack.git
Merge remote-tracking branch 'apache/4.18' into main
This commit is contained in:
commit
9df580cef4
|
|
@ -164,5 +164,5 @@ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long>, StateDao<
|
|||
|
||||
void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType hypervisorType);
|
||||
|
||||
List<VMInstanceVO> listByHostOrLastHostOrHostPod(long hostId, long podId);
|
||||
List<VMInstanceVO> listByHostOrLastHostOrHostPod(List<Long> hostIds, long podId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -989,19 +989,19 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<VMInstanceVO> listByHostOrLastHostOrHostPod(long hostId, long podId) {
|
||||
public List<VMInstanceVO> listByHostOrLastHostOrHostPod(List<Long> hostIds, long podId) {
|
||||
SearchBuilder<VMInstanceVO> sb = createSearchBuilder();
|
||||
sb.or().op("hostId", sb.entity().getHostId(), Op.EQ);
|
||||
sb.or("lastHostId", sb.entity().getLastHostId(), Op.EQ);
|
||||
sb.and().op("hostIdNull", sb.entity().getHostId(), SearchCriteria.Op.NULL);
|
||||
sb.and().op("hostId", sb.entity().getHostId(), Op.IN);
|
||||
sb.or("lastHostId", sb.entity().getLastHostId(), Op.IN);
|
||||
sb.or().op("hostIdNull", sb.entity().getHostId(), SearchCriteria.Op.NULL);
|
||||
sb.and("lastHostIdNull", sb.entity().getHostId(), SearchCriteria.Op.NULL);
|
||||
sb.and("podId", sb.entity().getPodIdToDeployIn(), Op.EQ);
|
||||
sb.cp();
|
||||
sb.cp();
|
||||
sb.done();
|
||||
SearchCriteria<VMInstanceVO> sc = sb.create();
|
||||
sc.setParameters("hostId", String.valueOf(hostId));
|
||||
sc.setParameters("lastHostId", String.valueOf(hostId));
|
||||
sc.setParameters("hostId", hostIds.toArray());
|
||||
sc.setParameters("lastHostId", hostIds.toArray());
|
||||
sc.setParameters("podId", String.valueOf(podId));
|
||||
return listBy(sc);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -197,6 +197,7 @@ import com.cloud.exception.CloudAuthenticationException;
|
|||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.exception.PermissionDeniedException;
|
||||
import com.cloud.ha.HighAvailabilityManager;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.hypervisor.Hypervisor;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.network.RouterHealthCheckResult;
|
||||
|
|
@ -1090,7 +1091,12 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q
|
|||
sb.and("stateNIN", sb.entity().getState(), SearchCriteria.Op.NIN);
|
||||
sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
|
||||
sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ);
|
||||
if (clusterId != null) {
|
||||
sb.and().op("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ);
|
||||
sb.or("clusterHostId", sb.entity().getHostId(), Op.IN);
|
||||
sb.or("clusterLastHostId", sb.entity().getLastHostId(), Op.IN);
|
||||
sb.cp();
|
||||
}
|
||||
sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ);
|
||||
sb.and("hostIdEQ", sb.entity().getHostId(), SearchCriteria.Op.EQ);
|
||||
sb.and("templateId", sb.entity().getTemplateId(), SearchCriteria.Op.EQ);
|
||||
|
|
@ -1286,6 +1292,10 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q
|
|||
|
||||
if (clusterId != null) {
|
||||
sc.setParameters("clusterId", clusterId);
|
||||
List<HostJoinVO> hosts = _hostJoinDao.findByClusterId((Long)clusterId, Host.Type.Routing);
|
||||
List<Long> hostIds = hosts.stream().map(HostJoinVO::getId).collect(Collectors.toList());
|
||||
sc.setParameters("clusterHostId", hostIds.toArray());
|
||||
sc.setParameters("clusterLastHostId", hostIds.toArray());
|
||||
}
|
||||
|
||||
if (hostId != null) {
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ public class FirstFitPlanner extends AdapterBase implements DeploymentClusterPla
|
|||
|
||||
protected String allocationAlgorithm = "random";
|
||||
protected String globalDeploymentPlanner = "FirstFitPlanner";
|
||||
protected String[] implicitHostTags;
|
||||
protected String[] implicitHostTags = new String[0];
|
||||
|
||||
@Override
|
||||
public List<Long> orderClusters(VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException {
|
||||
|
|
@ -214,11 +214,11 @@ public class FirstFitPlanner extends AdapterBase implements DeploymentClusterPla
|
|||
Long uniqueTags;
|
||||
for (Long clusterId : clusterList) {
|
||||
uniqueTags = (long) 0;
|
||||
List<Long> hostList = capacityDao.listHostsWithEnoughCapacity(requiredCpu, requiredRam, clusterId, Host.Type.Routing.toString());
|
||||
if (!hostList.isEmpty() && implicitHostTags.length > 0) {
|
||||
uniqueTags = new Long(hostTagsDao.getDistinctImplicitHostTags(hostList, implicitHostTags).size());
|
||||
uniqueTags = uniqueTags + getHostsByCapability(hostList, Host.HOST_UEFI_ENABLE);
|
||||
}
|
||||
List<Long> hostList = capacityDao.listHostsWithEnoughCapacity(requiredCpu, requiredRam, clusterId, Host.Type.Routing.toString());
|
||||
if (!hostList.isEmpty() && implicitHostTags.length > 0) {
|
||||
uniqueTags = new Long(hostTagsDao.getDistinctImplicitHostTags(hostList, implicitHostTags).size());
|
||||
uniqueTags = uniqueTags + getHostsByCapability(hostList, Host.HOST_UEFI_ENABLE);
|
||||
}
|
||||
UniqueTagsInClusterMap.put(clusterId, uniqueTags);
|
||||
}
|
||||
Collections.sort(clusterList, new Comparator<Long>() {
|
||||
|
|
|
|||
|
|
@ -357,8 +357,11 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
|
|||
return additionalNameFilter;
|
||||
}
|
||||
|
||||
private List<String> getHostManagedVms(Host host) {
|
||||
List<VMInstanceVO> instances = vmDao.listByHostOrLastHostOrHostPod(host.getId(), host.getPodId());
|
||||
private List<String> getHostsManagedVms(List<HostVO> hosts) {
|
||||
if (CollectionUtils.isEmpty(hosts)) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
List<VMInstanceVO> instances = vmDao.listByHostOrLastHostOrHostPod(hosts.stream().map(HostVO::getId).collect(Collectors.toList()), hosts.get(0).getPodId());
|
||||
List<String> managedVms = instances.stream().map(VMInstanceVO::getInstanceName).collect(Collectors.toList());
|
||||
return managedVms;
|
||||
}
|
||||
|
|
@ -1026,6 +1029,24 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
|
|||
return userVm;
|
||||
}
|
||||
|
||||
private HashMap<String, UnmanagedInstanceTO> getUnmanagedInstancesForHost(HostVO host, String instanceName, List<String> managedVms) {
|
||||
HashMap<String, UnmanagedInstanceTO> unmanagedInstances = new HashMap<>();
|
||||
if (host.isInMaintenanceStates()) {
|
||||
return unmanagedInstances;
|
||||
}
|
||||
|
||||
GetUnmanagedInstancesCommand command = new GetUnmanagedInstancesCommand();
|
||||
command.setInstanceName(instanceName);
|
||||
command.setManagedInstancesNames(managedVms);
|
||||
Answer answer = agentManager.easySend(host.getId(), command);
|
||||
if (!(answer instanceof GetUnmanagedInstancesAnswer)) {
|
||||
return unmanagedInstances;
|
||||
}
|
||||
GetUnmanagedInstancesAnswer unmanagedInstancesAnswer = (GetUnmanagedInstancesAnswer) answer;
|
||||
unmanagedInstances = unmanagedInstancesAnswer.getUnmanagedInstances();
|
||||
return unmanagedInstances;
|
||||
}
|
||||
|
||||
private Cluster basicAccessChecks(Long clusterId) {
|
||||
final Account caller = CallContext.current().getCallingAccount();
|
||||
if (caller.getType() != Account.Type.ADMIN) {
|
||||
|
|
@ -1055,24 +1076,11 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
|
|||
}
|
||||
List<HostVO> hosts = resourceManager.listHostsInClusterByStatus(clusterId, Status.Up);
|
||||
List<String> additionalNameFilters = getAdditionalNameFilters(cluster);
|
||||
List<String> managedVms = new ArrayList<>(additionalNameFilters);
|
||||
managedVms.addAll(getHostsManagedVms(hosts));
|
||||
List<UnmanagedInstanceResponse> responses = new ArrayList<>();
|
||||
for (HostVO host : hosts) {
|
||||
if (host.isInMaintenanceStates()) {
|
||||
continue;
|
||||
}
|
||||
List<String> managedVms = new ArrayList<>();
|
||||
managedVms.addAll(additionalNameFilters);
|
||||
managedVms.addAll(getHostManagedVms(host));
|
||||
|
||||
GetUnmanagedInstancesCommand command = new GetUnmanagedInstancesCommand();
|
||||
command.setInstanceName(cmd.getName());
|
||||
command.setManagedInstancesNames(managedVms);
|
||||
Answer answer = agentManager.easySend(host.getId(), command);
|
||||
if (!(answer instanceof GetUnmanagedInstancesAnswer)) {
|
||||
continue;
|
||||
}
|
||||
GetUnmanagedInstancesAnswer unmanagedInstancesAnswer = (GetUnmanagedInstancesAnswer) answer;
|
||||
HashMap<String, UnmanagedInstanceTO> unmanagedInstances = new HashMap<>(unmanagedInstancesAnswer.getUnmanagedInstances());
|
||||
HashMap<String, UnmanagedInstanceTO> unmanagedInstances = getUnmanagedInstancesForHost(host, cmd.getName(), managedVms);
|
||||
Set<String> keys = unmanagedInstances.keySet();
|
||||
for (String key : keys) {
|
||||
UnmanagedInstanceTO instance = unmanagedInstances.get(key);
|
||||
|
|
@ -1099,7 +1107,7 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
|
|||
throw new InvalidParameterValueException("Instance name cannot be empty");
|
||||
}
|
||||
if (cmd.getDomainId() != null && StringUtils.isEmpty(cmd.getAccountName())) {
|
||||
throw new InvalidParameterValueException("domainid parameter must be specified with account parameter");
|
||||
throw new InvalidParameterValueException(String.format("%s parameter must be specified with %s parameter", ApiConstants.DOMAIN_ID, ApiConstants.ACCOUNT));
|
||||
}
|
||||
final Account owner = accountService.getActiveAccountById(cmd.getEntityOwnerId());
|
||||
long userId = CallContext.current().getCallingUserId();
|
||||
|
|
@ -1107,7 +1115,7 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
|
|||
if (CollectionUtils.isNotEmpty(userVOs)) {
|
||||
userId = userVOs.get(0).getId();
|
||||
}
|
||||
VMTemplateVO template = null;
|
||||
VMTemplateVO template;
|
||||
final Long templateId = cmd.getTemplateId();
|
||||
if (templateId == null) {
|
||||
template = templateDao.findByName(VM_IMPORT_DEFAULT_TEMPLATE_NAME);
|
||||
|
|
@ -1170,59 +1178,49 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
|
|||
List<HostVO> hosts = resourceManager.listHostsInClusterByStatus(clusterId, Status.Up);
|
||||
UserVm userVm = null;
|
||||
List<String> additionalNameFilters = getAdditionalNameFilters(cluster);
|
||||
List<String> managedVms = new ArrayList<>(additionalNameFilters);
|
||||
managedVms.addAll(getHostsManagedVms(hosts));
|
||||
for (HostVO host : hosts) {
|
||||
if (host.isInMaintenanceStates()) {
|
||||
continue;
|
||||
}
|
||||
List<String> managedVms = new ArrayList<>();
|
||||
managedVms.addAll(additionalNameFilters);
|
||||
managedVms.addAll(getHostManagedVms(host));
|
||||
GetUnmanagedInstancesCommand command = new GetUnmanagedInstancesCommand(instanceName);
|
||||
command.setManagedInstancesNames(managedVms);
|
||||
Answer answer = agentManager.easySend(host.getId(), command);
|
||||
if (!(answer instanceof GetUnmanagedInstancesAnswer)) {
|
||||
continue;
|
||||
}
|
||||
GetUnmanagedInstancesAnswer unmanagedInstancesAnswer = (GetUnmanagedInstancesAnswer) answer;
|
||||
HashMap<String, UnmanagedInstanceTO> unmanagedInstances = unmanagedInstancesAnswer.getUnmanagedInstances();
|
||||
HashMap<String, UnmanagedInstanceTO> unmanagedInstances = getUnmanagedInstancesForHost(host, cmd.getName(), managedVms);
|
||||
if (MapUtils.isEmpty(unmanagedInstances)) {
|
||||
continue;
|
||||
}
|
||||
Set<String> names = unmanagedInstances.keySet();
|
||||
for (String name : names) {
|
||||
if (instanceName.equals(name)) {
|
||||
UnmanagedInstanceTO unmanagedInstance = unmanagedInstances.get(name);
|
||||
if (unmanagedInstance == null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve details for unmanaged VM: %s", name));
|
||||
}
|
||||
if (template.getName().equals(VM_IMPORT_DEFAULT_TEMPLATE_NAME)) {
|
||||
String osName = unmanagedInstance.getOperatingSystem();
|
||||
GuestOS guestOS = null;
|
||||
if (StringUtils.isNotEmpty(osName)) {
|
||||
guestOS = guestOSDao.findOneByDisplayName(osName);
|
||||
}
|
||||
GuestOSHypervisor guestOSHypervisor = null;
|
||||
if (guestOS != null) {
|
||||
guestOSHypervisor = guestOSHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), host.getHypervisorType().toString(), host.getHypervisorVersion());
|
||||
}
|
||||
if (guestOSHypervisor == null && StringUtils.isNotEmpty(unmanagedInstance.getOperatingSystemId())) {
|
||||
guestOSHypervisor = guestOSHypervisorDao.findByOsNameAndHypervisor(unmanagedInstance.getOperatingSystemId(), host.getHypervisorType().toString(), host.getHypervisorVersion());
|
||||
}
|
||||
if (guestOSHypervisor == null) {
|
||||
if (guestOS != null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to find hypervisor guest OS ID: %s details for unmanaged VM: %s for hypervisor: %s version: %s. templateid parameter can be used to assign template for VM", guestOS.getUuid(), name, host.getHypervisorType().toString(), host.getHypervisorVersion()));
|
||||
}
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve guest OS details for unmanaged VM: %s with OS name: %s, OS ID: %s for hypervisor: %s version: %s. templateid parameter can be used to assign template for VM", name, osName, unmanagedInstance.getOperatingSystemId(), host.getHypervisorType().toString(), host.getHypervisorVersion()));
|
||||
}
|
||||
template.setGuestOSId(guestOSHypervisor.getGuestOsId());
|
||||
}
|
||||
userVm = importVirtualMachineInternal(unmanagedInstance, instanceName, zone, cluster, host,
|
||||
template, displayName, hostName, CallContext.current().getCallingAccount(), owner, userId,
|
||||
serviceOffering, dataDiskOfferingMap,
|
||||
nicNetworkMap, nicIpAddressMap,
|
||||
details, cmd.getMigrateAllowed(), forced);
|
||||
break;
|
||||
if (!instanceName.equals(name)) {
|
||||
continue;
|
||||
}
|
||||
UnmanagedInstanceTO unmanagedInstance = unmanagedInstances.get(name);
|
||||
if (unmanagedInstance == null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve details for unmanaged VM: %s", name));
|
||||
}
|
||||
if (template.getName().equals(VM_IMPORT_DEFAULT_TEMPLATE_NAME)) {
|
||||
String osName = unmanagedInstance.getOperatingSystem();
|
||||
GuestOS guestOS = null;
|
||||
if (StringUtils.isNotEmpty(osName)) {
|
||||
guestOS = guestOSDao.findOneByDisplayName(osName);
|
||||
}
|
||||
GuestOSHypervisor guestOSHypervisor = null;
|
||||
if (guestOS != null) {
|
||||
guestOSHypervisor = guestOSHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), host.getHypervisorType().toString(), host.getHypervisorVersion());
|
||||
}
|
||||
if (guestOSHypervisor == null && StringUtils.isNotEmpty(unmanagedInstance.getOperatingSystemId())) {
|
||||
guestOSHypervisor = guestOSHypervisorDao.findByOsNameAndHypervisor(unmanagedInstance.getOperatingSystemId(), host.getHypervisorType().toString(), host.getHypervisorVersion());
|
||||
}
|
||||
if (guestOSHypervisor == null) {
|
||||
if (guestOS != null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to find hypervisor guest OS ID: %s details for unmanaged VM: %s for hypervisor: %s version: %s. templateid parameter can be used to assign template for VM", guestOS.getUuid(), name, host.getHypervisorType().toString(), host.getHypervisorVersion()));
|
||||
}
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve guest OS details for unmanaged VM: %s with OS name: %s, OS ID: %s for hypervisor: %s version: %s. templateid parameter can be used to assign template for VM", name, osName, unmanagedInstance.getOperatingSystemId(), host.getHypervisorType().toString(), host.getHypervisorVersion()));
|
||||
}
|
||||
template.setGuestOSId(guestOSHypervisor.getGuestOsId());
|
||||
}
|
||||
userVm = importVirtualMachineInternal(unmanagedInstance, instanceName, zone, cluster, host,
|
||||
template, displayName, hostName, CallContext.current().getCallingAccount(), owner, userId,
|
||||
serviceOffering, dataDiskOfferingMap,
|
||||
nicNetworkMap, nicIpAddressMap,
|
||||
details, cmd.getMigrateAllowed(), forced);
|
||||
break;
|
||||
}
|
||||
if (userVm != null) {
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in New Issue