You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2023/01/09 11:57:51 UTC

[cloudstack] branch main updated (6790371fe2 -> 2d1d2944e5)

This is an automated email from the ASF dual-hosted git repository.

dahn pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


    from 6790371fe2 fix merge diff display (#7047)
     add eb5c8a5a8c server: correctly list suitable hosts for migration with uefi capability (#7024)
     new 2d1d2944e5 merge release branch 4.17 into main

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/com/cloud/host/dao/HostDetailsDao.java    |   3 +
 .../com/cloud/host/dao/HostDetailsDaoImpl.java     |  13 +-
 .../com/cloud/server/ManagementServerImpl.java     | 430 +++++++++++----------
 .../com/cloud/server/ManagementServerImplTest.java | 135 ++++++-
 4 files changed, 364 insertions(+), 217 deletions(-)


[cloudstack] 01/01: merge release branch 4.17 into main

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 2d1d2944e5314a3bb03c2e0a9813ef70ef70c65d
Merge: 6790371fe2 eb5c8a5a8c
Author: Daan Hoogland <da...@onecht.net>
AuthorDate: Mon Jan 9 12:57:40 2023 +0100

    merge release branch 4.17 into main

 .../java/com/cloud/host/dao/HostDetailsDao.java    |   3 +
 .../com/cloud/host/dao/HostDetailsDaoImpl.java     |  13 +-
 .../com/cloud/server/ManagementServerImpl.java     | 430 +++++++++++----------
 .../com/cloud/server/ManagementServerImplTest.java | 135 ++++++-
 4 files changed, 364 insertions(+), 217 deletions(-)

diff --cc server/src/main/java/com/cloud/server/ManagementServerImpl.java
index aa362b2dc6,c1a3e9905c..5ba1195750
--- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
@@@ -45,28 -43,6 +45,202 @@@ import javax.crypto.spec.SecretKeySpec
  import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
- import com.cloud.storage.VMTemplateVO;
- import com.cloud.storage.dao.VMTemplateDao;
- import com.cloud.user.UserData;
- import com.cloud.user.UserDataVO;
- import com.cloud.user.dao.UserDataDao;
++import com.cloud.agent.AgentManager;
 +import com.cloud.agent.api.Answer;
 +import com.cloud.agent.api.Command;
++import com.cloud.agent.api.GetVncPortAnswer;
++import com.cloud.agent.api.GetVncPortCommand;
 +import com.cloud.agent.api.PatchSystemVmAnswer;
 +import com.cloud.agent.api.PatchSystemVmCommand;
 +import com.cloud.agent.api.proxy.AllowConsoleAccessCommand;
 +import com.cloud.agent.api.routing.NetworkElementCommand;
 +import com.cloud.agent.manager.Commands;
++import com.cloud.agent.manager.allocator.HostAllocator;
++import com.cloud.alert.Alert;
++import com.cloud.alert.AlertManager;
++import com.cloud.alert.AlertVO;
++import com.cloud.alert.dao.AlertDao;
++import com.cloud.api.ApiDBUtils;
++import com.cloud.api.query.dao.StoragePoolJoinDao;
++import com.cloud.api.query.vo.StoragePoolJoinVO;
++import com.cloud.capacity.Capacity;
++import com.cloud.capacity.CapacityVO;
++import com.cloud.capacity.dao.CapacityDao;
++import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
++import com.cloud.cluster.ClusterManager;
++import com.cloud.configuration.Config;
++import com.cloud.configuration.ConfigurationManagerImpl;
++import com.cloud.consoleproxy.ConsoleProxyManagementState;
++import com.cloud.consoleproxy.ConsoleProxyManager;
++import com.cloud.dc.AccountVlanMapVO;
++import com.cloud.dc.ClusterVO;
++import com.cloud.dc.DataCenterVO;
 +import com.cloud.dc.DomainVlanMapVO;
++import com.cloud.dc.HostPodVO;
++import com.cloud.dc.Pod;
++import com.cloud.dc.PodVlanMapVO;
++import com.cloud.dc.Vlan;
++import com.cloud.dc.Vlan.VlanType;
++import com.cloud.dc.VlanVO;
++import com.cloud.dc.dao.AccountVlanMapDao;
++import com.cloud.dc.dao.ClusterDao;
++import com.cloud.dc.dao.DataCenterDao;
 +import com.cloud.dc.dao.DomainVlanMapDao;
++import com.cloud.dc.dao.HostPodDao;
++import com.cloud.dc.dao.PodVlanMapDao;
++import com.cloud.dc.dao.VlanDao;
++import com.cloud.deploy.DataCenterDeployment;
++import com.cloud.deploy.DeploymentPlanner;
++import com.cloud.deploy.DeploymentPlanner.ExcludeList;
++import com.cloud.deploy.DeploymentPlanningManager;
++import com.cloud.domain.DomainVO;
++import com.cloud.domain.dao.DomainDao;
++import com.cloud.event.ActionEvent;
++import com.cloud.event.ActionEventUtils;
++import com.cloud.event.EventTypes;
++import com.cloud.event.EventVO;
++import com.cloud.event.dao.EventDao;
 +import com.cloud.exception.AgentUnavailableException;
++import com.cloud.exception.ConcurrentOperationException;
++import com.cloud.exception.InsufficientAddressCapacityException;
++import com.cloud.exception.InvalidParameterValueException;
++import com.cloud.exception.ManagementServerException;
++import com.cloud.exception.OperationTimedoutException;
++import com.cloud.exception.PermissionDeniedException;
++import com.cloud.exception.ResourceUnavailableException;
++import com.cloud.exception.VirtualMachineMigrationException;
++import com.cloud.gpu.GPU;
++import com.cloud.ha.HighAvailabilityManager;
++import com.cloud.host.DetailVO;
++import com.cloud.host.Host;
++import com.cloud.host.Host.Type;
++import com.cloud.host.HostTagVO;
++import com.cloud.host.HostVO;
++import com.cloud.host.dao.HostDao;
++import com.cloud.host.dao.HostDetailsDao;
++import com.cloud.host.dao.HostTagsDao;
++import com.cloud.hypervisor.Hypervisor;
++import com.cloud.hypervisor.Hypervisor.HypervisorType;
++import com.cloud.hypervisor.HypervisorCapabilities;
++import com.cloud.hypervisor.HypervisorCapabilitiesVO;
++import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
++import com.cloud.hypervisor.kvm.dpdk.DpdkHelper;
++import com.cloud.info.ConsoleProxyInfo;
++import com.cloud.network.IpAddress;
++import com.cloud.network.IpAddressManager;
++import com.cloud.network.IpAddressManagerImpl;
++import com.cloud.network.Network;
++import com.cloud.network.NetworkModel;
 +import com.cloud.network.Networks;
++import com.cloud.network.dao.IPAddressDao;
++import com.cloud.network.dao.IPAddressVO;
++import com.cloud.network.dao.LoadBalancerDao;
++import com.cloud.network.dao.LoadBalancerVO;
++import com.cloud.network.dao.NetworkAccountDao;
++import com.cloud.network.dao.NetworkAccountVO;
++import com.cloud.network.dao.NetworkDao;
++import com.cloud.network.dao.NetworkDomainDao;
++import com.cloud.network.dao.NetworkDomainVO;
++import com.cloud.network.dao.NetworkVO;
++import com.cloud.network.vpc.dao.VpcDao;
++import com.cloud.org.Cluster;
++import com.cloud.org.Grouping.AllocationState;
++import com.cloud.projects.Project;
++import com.cloud.projects.Project.ListProjectResourcesCriteria;
++import com.cloud.projects.ProjectManager;
++import com.cloud.resource.ResourceManager;
++import com.cloud.server.ResourceTag.ResourceObjectType;
++import com.cloud.server.auth.UserAuthenticator;
++import com.cloud.service.ServiceOfferingVO;
++import com.cloud.service.dao.ServiceOfferingDao;
++import com.cloud.service.dao.ServiceOfferingDetailsDao;
++import com.cloud.storage.DiskOfferingVO;
++import com.cloud.storage.GuestOS;
++import com.cloud.storage.GuestOSCategoryVO;
++import com.cloud.storage.GuestOSHypervisor;
++import com.cloud.storage.GuestOSHypervisorVO;
++import com.cloud.storage.GuestOSVO;
++import com.cloud.storage.GuestOsCategory;
++import com.cloud.storage.ScopeType;
++import com.cloud.storage.Storage;
++import com.cloud.storage.StorageManager;
++import com.cloud.storage.StoragePool;
++import com.cloud.storage.StoragePoolStatus;
++import com.cloud.storage.VMTemplateVO;
++import com.cloud.storage.Volume;
++import com.cloud.storage.VolumeApiServiceImpl;
++import com.cloud.storage.VolumeVO;
++import com.cloud.storage.dao.DiskOfferingDao;
++import com.cloud.storage.dao.GuestOSCategoryDao;
++import com.cloud.storage.dao.GuestOSDao;
++import com.cloud.storage.dao.GuestOSHypervisorDao;
++import com.cloud.storage.dao.VMTemplateDao;
++import com.cloud.storage.dao.VolumeDao;
++import com.cloud.storage.secondary.SecondaryStorageVmManager;
++import com.cloud.tags.ResourceTagVO;
++import com.cloud.tags.dao.ResourceTagDao;
++import com.cloud.template.TemplateManager;
++import com.cloud.user.Account;
++import com.cloud.user.AccountManager;
++import com.cloud.user.AccountService;
++import com.cloud.user.SSHKeyPair;
++import com.cloud.user.SSHKeyPairVO;
++import com.cloud.user.User;
++import com.cloud.user.UserData;
++import com.cloud.user.UserDataVO;
++import com.cloud.user.UserVO;
++import com.cloud.user.dao.AccountDao;
++import com.cloud.user.dao.SSHKeyPairDao;
++import com.cloud.user.dao.UserDao;
++import com.cloud.user.dao.UserDataDao;
++import com.cloud.utils.NumbersUtil;
++import com.cloud.utils.Pair;
++import com.cloud.utils.PasswordGenerator;
++import com.cloud.utils.Ternary;
++import com.cloud.utils.component.ComponentLifecycle;
++import com.cloud.utils.component.ManagerBase;
++import com.cloud.utils.concurrency.NamedThreadFactory;
++import com.cloud.utils.crypt.DBEncryptionUtil;
++import com.cloud.utils.db.DB;
++import com.cloud.utils.db.Filter;
++import com.cloud.utils.db.GlobalLock;
++import com.cloud.utils.db.JoinBuilder;
++import com.cloud.utils.db.JoinBuilder.JoinType;
++import com.cloud.utils.db.SearchBuilder;
++import com.cloud.utils.db.SearchCriteria;
++import com.cloud.utils.db.Transaction;
++import com.cloud.utils.db.TransactionCallbackNoReturn;
++import com.cloud.utils.db.TransactionStatus;
 +import com.cloud.utils.db.UUIDManager;
++import com.cloud.utils.exception.CloudRuntimeException;
 +import com.cloud.utils.fsm.StateMachine2;
++import com.cloud.utils.net.MacAddress;
++import com.cloud.utils.net.NetUtils;
++import com.cloud.utils.ssh.SSHKeysHelper;
++import com.cloud.vm.ConsoleProxyVO;
++import com.cloud.vm.DiskProfile;
 +import com.cloud.vm.DomainRouterVO;
++import com.cloud.vm.InstanceGroupVO;
 +import com.cloud.vm.NicVO;
++import com.cloud.vm.SecondaryStorageVmVO;
++import com.cloud.vm.UserVmDetailVO;
++import com.cloud.vm.UserVmManager;
++import com.cloud.vm.UserVmVO;
++import com.cloud.vm.VMInstanceVO;
++import com.cloud.vm.VirtualMachine;
++import com.cloud.vm.VirtualMachine.State;
++import com.cloud.vm.VirtualMachineManager;
++import com.cloud.vm.VirtualMachineProfile;
++import com.cloud.vm.VirtualMachineProfileImpl;
++import com.cloud.vm.dao.ConsoleProxyDao;
 +import com.cloud.vm.dao.DomainRouterDao;
++import com.cloud.vm.dao.InstanceGroupDao;
 +import com.cloud.vm.dao.NicDao;
++import com.cloud.vm.dao.SecondaryStorageVmDao;
++import com.cloud.vm.dao.UserVmDao;
++import com.cloud.vm.dao.UserVmDetailsDao;
++import com.cloud.vm.dao.VMInstanceDao;
++
  import org.apache.cloudstack.acl.ControlledEntity;
  import org.apache.cloudstack.acl.SecurityChecker;
  import org.apache.cloudstack.affinity.AffinityGroupProcessor;
@@@ -515,293 -488,301 +689,120 @@@ import org.apache.cloudstack.api.comman
  import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
  import org.apache.cloudstack.api.command.user.template.UpdateTemplateCmd;
  import org.apache.cloudstack.api.command.user.template.UpdateTemplatePermissionsCmd;
 +import org.apache.cloudstack.api.command.user.userdata.DeleteUserDataCmd;
 +import org.apache.cloudstack.api.command.user.userdata.LinkUserDataToTemplateCmd;
 +import org.apache.cloudstack.api.command.user.userdata.ListUserDataCmd;
 +import org.apache.cloudstack.api.command.user.userdata.RegisterUserDataCmd;
  import org.apache.cloudstack.api.command.user.vm.AddIpToVmNicCmd;
 -import org.apache.cloudstack.api.command.user.vm.AddNicToVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.DeployVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.DestroyVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.GetVMPasswordCmd;
 -import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
 -import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
 -import org.apache.cloudstack.api.command.user.vm.RebootVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.RemoveIpFromVmNicCmd;
 -import org.apache.cloudstack.api.command.user.vm.RemoveNicFromVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd;
 -import org.apache.cloudstack.api.command.user.vm.ResetVMSSHKeyCmd;
 -import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.StopVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.UpdateDefaultNicForVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.UpdateVmNicIpCmd;
 -import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
 -import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
 -import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
 -import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
 -import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd;
 -import org.apache.cloudstack.api.command.user.vmsnapshot.CreateVMSnapshotCmd;
 -import org.apache.cloudstack.api.command.user.vmsnapshot.DeleteVMSnapshotCmd;
 -import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
 -import org.apache.cloudstack.api.command.user.vmsnapshot.RevertToVMSnapshotCmd;
 -import org.apache.cloudstack.api.command.user.volume.AddResourceDetailCmd;
 -import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.ChangeOfferingForVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.DeleteVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.DestroyVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.GetUploadParamsForVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.ListResourceDetailsCmd;
 -import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
 -import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.RecoverVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.RemoveResourceDetailCmd;
 -import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.UpdateVolumeCmd;
 -import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
 -import org.apache.cloudstack.api.command.user.vpc.CreatePrivateGatewayCmd;
 -import org.apache.cloudstack.api.command.user.vpc.CreateStaticRouteCmd;
 -import org.apache.cloudstack.api.command.user.vpc.CreateVPCCmd;
 -import org.apache.cloudstack.api.command.user.vpc.DeleteStaticRouteCmd;
 -import org.apache.cloudstack.api.command.user.vpc.DeleteVPCCmd;
 -import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd;
 -import org.apache.cloudstack.api.command.user.vpc.ListStaticRoutesCmd;
 -import org.apache.cloudstack.api.command.user.vpc.ListVPCOfferingsCmd;
 -import org.apache.cloudstack.api.command.user.vpc.ListVPCsCmd;
 -import org.apache.cloudstack.api.command.user.vpc.RestartVPCCmd;
 -import org.apache.cloudstack.api.command.user.vpc.UpdateVPCCmd;
 -import org.apache.cloudstack.api.command.user.vpn.AddVpnUserCmd;
 -import org.apache.cloudstack.api.command.user.vpn.CreateRemoteAccessVpnCmd;
 -import org.apache.cloudstack.api.command.user.vpn.CreateVpnConnectionCmd;
 -import org.apache.cloudstack.api.command.user.vpn.CreateVpnCustomerGatewayCmd;
 -import org.apache.cloudstack.api.command.user.vpn.CreateVpnGatewayCmd;
 -import org.apache.cloudstack.api.command.user.vpn.DeleteRemoteAccessVpnCmd;
 -import org.apache.cloudstack.api.command.user.vpn.DeleteVpnConnectionCmd;
 -import org.apache.cloudstack.api.command.user.vpn.DeleteVpnCustomerGatewayCmd;
 -import org.apache.cloudstack.api.command.user.vpn.DeleteVpnGatewayCmd;
 -import org.apache.cloudstack.api.command.user.vpn.ListRemoteAccessVpnsCmd;
 -import org.apache.cloudstack.api.command.user.vpn.ListVpnConnectionsCmd;
 -import org.apache.cloudstack.api.command.user.vpn.ListVpnCustomerGatewaysCmd;
 -import org.apache.cloudstack.api.command.user.vpn.ListVpnGatewaysCmd;
 -import org.apache.cloudstack.api.command.user.vpn.ListVpnUsersCmd;
 -import org.apache.cloudstack.api.command.user.vpn.RemoveVpnUserCmd;
 -import org.apache.cloudstack.api.command.user.vpn.ResetVpnConnectionCmd;
 -import org.apache.cloudstack.api.command.user.vpn.UpdateRemoteAccessVpnCmd;
 -import org.apache.cloudstack.api.command.user.vpn.UpdateVpnConnectionCmd;
 -import org.apache.cloudstack.api.command.user.vpn.UpdateVpnCustomerGatewayCmd;
 -import org.apache.cloudstack.api.command.user.vpn.UpdateVpnGatewayCmd;
 -import org.apache.cloudstack.api.command.user.zone.ListZonesCmd;
 -import org.apache.cloudstack.config.ApiServiceConfiguration;
 -import org.apache.cloudstack.config.Configuration;
 -import org.apache.cloudstack.context.CallContext;
 -import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
 -import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 -import org.apache.cloudstack.framework.config.ConfigDepot;
 -import org.apache.cloudstack.framework.config.ConfigKey;
 -import org.apache.cloudstack.framework.config.Configurable;
 -import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 -import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
 -import org.apache.cloudstack.framework.security.keystore.KeystoreManager;
 -import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 -import org.apache.cloudstack.query.QueryService;
 -import org.apache.cloudstack.resourcedetail.dao.GuestOsDetailsDao;
 -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 -import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 -import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 -import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 -import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 -import org.apache.cloudstack.utils.CloudStackVersion;
 -import org.apache.cloudstack.utils.identity.ManagementServerNode;
 -import org.apache.commons.codec.binary.Base64;
 -import org.apache.commons.collections.CollectionUtils;
 -import org.apache.commons.lang3.StringUtils;
 -import org.apache.log4j.Logger;
 -
 -import com.cloud.agent.AgentManager;
 -import com.cloud.agent.api.Answer;
 -import com.cloud.agent.api.Command;
 -import com.cloud.agent.api.GetVncPortAnswer;
 -import com.cloud.agent.api.GetVncPortCommand;
 -import com.cloud.agent.api.PatchSystemVmAnswer;
 -import com.cloud.agent.api.PatchSystemVmCommand;
 -import com.cloud.agent.api.routing.NetworkElementCommand;
 -import com.cloud.agent.manager.Commands;
 -import com.cloud.agent.manager.allocator.HostAllocator;
 -import com.cloud.alert.Alert;
 -import com.cloud.alert.AlertManager;
 -import com.cloud.alert.AlertVO;
 -import com.cloud.alert.dao.AlertDao;
 -import com.cloud.api.ApiDBUtils;
 -import com.cloud.api.query.dao.StoragePoolJoinDao;
 -import com.cloud.api.query.vo.StoragePoolJoinVO;
 -import com.cloud.capacity.Capacity;
 -import com.cloud.capacity.CapacityVO;
 -import com.cloud.capacity.dao.CapacityDao;
 -import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
 -import com.cloud.cluster.ClusterManager;
 -import com.cloud.configuration.Config;
 -import com.cloud.configuration.ConfigurationManagerImpl;
 -import com.cloud.consoleproxy.ConsoleProxyManagementState;
 -import com.cloud.consoleproxy.ConsoleProxyManager;
 -import com.cloud.dc.AccountVlanMapVO;
 -import com.cloud.dc.ClusterVO;
 -import com.cloud.dc.DataCenterVO;
 -import com.cloud.dc.DomainVlanMapVO;
 -import com.cloud.dc.HostPodVO;
 -import com.cloud.dc.Pod;
 -import com.cloud.dc.PodVlanMapVO;
 -import com.cloud.dc.Vlan;
 -import com.cloud.dc.Vlan.VlanType;
 -import com.cloud.dc.VlanVO;
 -import com.cloud.dc.dao.AccountVlanMapDao;
 -import com.cloud.dc.dao.ClusterDao;
 -import com.cloud.dc.dao.DataCenterDao;
 -import com.cloud.dc.dao.DomainVlanMapDao;
 -import com.cloud.dc.dao.HostPodDao;
 -import com.cloud.dc.dao.PodVlanMapDao;
 -import com.cloud.dc.dao.VlanDao;
 -import com.cloud.deploy.DataCenterDeployment;
 -import com.cloud.deploy.DeploymentPlanner;
 -import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 -import com.cloud.deploy.DeploymentPlanningManager;
 -import com.cloud.domain.DomainVO;
 -import com.cloud.domain.dao.DomainDao;
 -import com.cloud.event.ActionEvent;
 -import com.cloud.event.ActionEventUtils;
 -import com.cloud.event.EventTypes;
 -import com.cloud.event.EventVO;
 -import com.cloud.event.dao.EventDao;
 -import com.cloud.exception.AgentUnavailableException;
 -import com.cloud.exception.ConcurrentOperationException;
 -import com.cloud.exception.InsufficientAddressCapacityException;
 -import com.cloud.exception.InvalidParameterValueException;
 -import com.cloud.exception.ManagementServerException;
 -import com.cloud.exception.OperationTimedoutException;
 -import com.cloud.exception.PermissionDeniedException;
 -import com.cloud.exception.ResourceUnavailableException;
 -import com.cloud.exception.VirtualMachineMigrationException;
 -import com.cloud.gpu.GPU;
 -import com.cloud.ha.HighAvailabilityManager;
 -import com.cloud.host.DetailVO;
 -import com.cloud.host.Host;
 -import com.cloud.host.Host.Type;
 -import com.cloud.host.HostTagVO;
 -import com.cloud.host.HostVO;
 -import com.cloud.host.dao.HostDao;
 -import com.cloud.host.dao.HostDetailsDao;
 -import com.cloud.host.dao.HostTagsDao;
 -import com.cloud.hypervisor.Hypervisor;
 -import com.cloud.hypervisor.Hypervisor.HypervisorType;
 -import com.cloud.hypervisor.HypervisorCapabilities;
 -import com.cloud.hypervisor.HypervisorCapabilitiesVO;
 -import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
 -import com.cloud.hypervisor.kvm.dpdk.DpdkHelper;
 -import com.cloud.info.ConsoleProxyInfo;
 -import com.cloud.network.IpAddress;
 -import com.cloud.network.IpAddressManager;
 -import com.cloud.network.IpAddressManagerImpl;
 -import com.cloud.network.Network;
 -import com.cloud.network.NetworkModel;
 -import com.cloud.network.Networks;
 -import com.cloud.network.dao.IPAddressDao;
 -import com.cloud.network.dao.IPAddressVO;
 -import com.cloud.network.dao.LoadBalancerDao;
 -import com.cloud.network.dao.LoadBalancerVO;
 -import com.cloud.network.dao.NetworkAccountDao;
 -import com.cloud.network.dao.NetworkAccountVO;
 -import com.cloud.network.dao.NetworkDao;
 -import com.cloud.network.dao.NetworkDomainDao;
 -import com.cloud.network.dao.NetworkDomainVO;
 -import com.cloud.network.dao.NetworkVO;
 -import com.cloud.network.vpc.dao.VpcDao;
 -import com.cloud.org.Cluster;
 -import com.cloud.org.Grouping.AllocationState;
 -import com.cloud.projects.Project;
 -import com.cloud.projects.Project.ListProjectResourcesCriteria;
 -import com.cloud.projects.ProjectManager;
 -import com.cloud.resource.ResourceManager;
 -import com.cloud.server.ResourceTag.ResourceObjectType;
 -import com.cloud.server.auth.UserAuthenticator;
 -import com.cloud.service.ServiceOfferingVO;
 -import com.cloud.service.dao.ServiceOfferingDao;
 -import com.cloud.service.dao.ServiceOfferingDetailsDao;
 -import com.cloud.storage.DiskOfferingVO;
 -import com.cloud.storage.GuestOS;
 -import com.cloud.storage.GuestOSCategoryVO;
 -import com.cloud.storage.GuestOSHypervisor;
 -import com.cloud.storage.GuestOSHypervisorVO;
 -import com.cloud.storage.GuestOSVO;
 -import com.cloud.storage.GuestOsCategory;
 -import com.cloud.storage.ScopeType;
 -import com.cloud.storage.Storage;
 -import com.cloud.storage.StorageManager;
 -import com.cloud.storage.StoragePool;
 -import com.cloud.storage.StoragePoolStatus;
 -import com.cloud.storage.Volume;
 -import com.cloud.storage.VolumeApiServiceImpl;
 -import com.cloud.storage.VolumeVO;
 -import com.cloud.storage.dao.DiskOfferingDao;
 -import com.cloud.storage.dao.GuestOSCategoryDao;
 -import com.cloud.storage.dao.GuestOSDao;
 -import com.cloud.storage.dao.GuestOSHypervisorDao;
 -import com.cloud.storage.dao.VolumeDao;
 -import com.cloud.storage.secondary.SecondaryStorageVmManager;
 -import com.cloud.tags.ResourceTagVO;
 -import com.cloud.tags.dao.ResourceTagDao;
 -import com.cloud.template.TemplateManager;
 -import com.cloud.user.Account;
 -import com.cloud.user.AccountManager;
 -import com.cloud.user.AccountService;
 -import com.cloud.user.SSHKeyPair;
 -import com.cloud.user.SSHKeyPairVO;
 -import com.cloud.user.User;
 -import com.cloud.user.UserVO;
 -import com.cloud.user.dao.AccountDao;
 -import com.cloud.user.dao.SSHKeyPairDao;
 -import com.cloud.user.dao.UserDao;
 -import com.cloud.utils.NumbersUtil;
 -import com.cloud.utils.Pair;
 -import com.cloud.utils.PasswordGenerator;
 -import com.cloud.utils.Ternary;
 -import com.cloud.utils.component.ComponentLifecycle;
 -import com.cloud.utils.component.ManagerBase;
 -import com.cloud.utils.concurrency.NamedThreadFactory;
 -import com.cloud.utils.crypt.DBEncryptionUtil;
 -import com.cloud.utils.db.DB;
 -import com.cloud.utils.db.Filter;
 -import com.cloud.utils.db.GlobalLock;
 -import com.cloud.utils.db.JoinBuilder;
 -import com.cloud.utils.db.JoinBuilder.JoinType;
 -import com.cloud.utils.db.SearchBuilder;
 -import com.cloud.utils.db.SearchCriteria;
 -import com.cloud.utils.db.Transaction;
 -import com.cloud.utils.db.TransactionCallbackNoReturn;
 -import com.cloud.utils.db.TransactionStatus;
 -import com.cloud.utils.db.UUIDManager;
 -import com.cloud.utils.exception.CloudRuntimeException;
 -import com.cloud.utils.fsm.StateMachine2;
 -import com.cloud.utils.net.MacAddress;
 -import com.cloud.utils.net.NetUtils;
 -import com.cloud.utils.ssh.SSHKeysHelper;
 -import com.cloud.vm.ConsoleProxyVO;
 -import com.cloud.vm.DiskProfile;
 -import com.cloud.vm.DomainRouterVO;
 -import com.cloud.vm.InstanceGroupVO;
 -import com.cloud.vm.NicVO;
 -import com.cloud.vm.SecondaryStorageVmVO;
 -import com.cloud.vm.UserVmDetailVO;
 -import com.cloud.vm.UserVmManager;
 -import com.cloud.vm.UserVmVO;
 -import com.cloud.vm.VMInstanceVO;
 -import com.cloud.vm.VirtualMachine;
 -import com.cloud.vm.VirtualMachine.State;
 -import com.cloud.vm.VirtualMachineManager;
 -import com.cloud.vm.VirtualMachineProfile;
 -import com.cloud.vm.VirtualMachineProfileImpl;
 -import com.cloud.vm.dao.ConsoleProxyDao;
 -import com.cloud.vm.dao.DomainRouterDao;
 -import com.cloud.vm.dao.InstanceGroupDao;
 -import com.cloud.vm.dao.NicDao;
 -import com.cloud.vm.dao.SecondaryStorageVmDao;
 -import com.cloud.vm.dao.UserVmDao;
 -import com.cloud.vm.dao.UserVmDetailsDao;
 -import com.cloud.vm.dao.VMInstanceDao;
 +import org.apache.cloudstack.api.command.user.vm.AddNicToVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.DeployVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.DestroyVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.GetVMPasswordCmd;
 +import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
 +import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
 +import org.apache.cloudstack.api.command.user.vm.RebootVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.RemoveIpFromVmNicCmd;
 +import org.apache.cloudstack.api.command.user.vm.RemoveNicFromVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd;
 +import org.apache.cloudstack.api.command.user.vm.ResetVMSSHKeyCmd;
 +import org.apache.cloudstack.api.command.user.vm.ResetVMUserDataCmd;
 +import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.StopVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.UpdateDefaultNicForVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
 +import org.apache.cloudstack.api.command.user.vm.UpdateVmNicIpCmd;
 +import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
 +import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
 +import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
 +import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
 +import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd;
 +import org.apache.cloudstack.api.command.user.vmsnapshot.CreateVMSnapshotCmd;
 +import org.apache.cloudstack.api.command.user.vmsnapshot.DeleteVMSnapshotCmd;
 +import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
 +import org.apache.cloudstack.api.command.user.vmsnapshot.RevertToVMSnapshotCmd;
 +import org.apache.cloudstack.api.command.user.volume.AddResourceDetailCmd;
 +import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.ChangeOfferingForVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.DeleteVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.DestroyVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.GetUploadParamsForVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.ListResourceDetailsCmd;
 +import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
 +import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.RecoverVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.RemoveResourceDetailCmd;
 +import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.UpdateVolumeCmd;
 +import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
 +import org.apache.cloudstack.api.command.user.vpc.CreatePrivateGatewayCmd;
 +import org.apache.cloudstack.api.command.user.vpc.CreateStaticRouteCmd;
 +import org.apache.cloudstack.api.command.user.vpc.CreateVPCCmd;
 +import org.apache.cloudstack.api.command.user.vpc.DeleteStaticRouteCmd;
 +import org.apache.cloudstack.api.command.user.vpc.DeleteVPCCmd;
 +import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd;
 +import org.apache.cloudstack.api.command.user.vpc.ListStaticRoutesCmd;
 +import org.apache.cloudstack.api.command.user.vpc.ListVPCOfferingsCmd;
 +import org.apache.cloudstack.api.command.user.vpc.ListVPCsCmd;
 +import org.apache.cloudstack.api.command.user.vpc.RestartVPCCmd;
 +import org.apache.cloudstack.api.command.user.vpc.UpdateVPCCmd;
 +import org.apache.cloudstack.api.command.user.vpn.AddVpnUserCmd;
 +import org.apache.cloudstack.api.command.user.vpn.CreateRemoteAccessVpnCmd;
 +import org.apache.cloudstack.api.command.user.vpn.CreateVpnConnectionCmd;
 +import org.apache.cloudstack.api.command.user.vpn.CreateVpnCustomerGatewayCmd;
 +import org.apache.cloudstack.api.command.user.vpn.CreateVpnGatewayCmd;
 +import org.apache.cloudstack.api.command.user.vpn.DeleteRemoteAccessVpnCmd;
 +import org.apache.cloudstack.api.command.user.vpn.DeleteVpnConnectionCmd;
 +import org.apache.cloudstack.api.command.user.vpn.DeleteVpnCustomerGatewayCmd;
 +import org.apache.cloudstack.api.command.user.vpn.DeleteVpnGatewayCmd;
 +import org.apache.cloudstack.api.command.user.vpn.ListRemoteAccessVpnsCmd;
 +import org.apache.cloudstack.api.command.user.vpn.ListVpnConnectionsCmd;
 +import org.apache.cloudstack.api.command.user.vpn.ListVpnCustomerGatewaysCmd;
 +import org.apache.cloudstack.api.command.user.vpn.ListVpnGatewaysCmd;
 +import org.apache.cloudstack.api.command.user.vpn.ListVpnUsersCmd;
 +import org.apache.cloudstack.api.command.user.vpn.RemoveVpnUserCmd;
 +import org.apache.cloudstack.api.command.user.vpn.ResetVpnConnectionCmd;
 +import org.apache.cloudstack.api.command.user.vpn.UpdateRemoteAccessVpnCmd;
 +import org.apache.cloudstack.api.command.user.vpn.UpdateVpnConnectionCmd;
 +import org.apache.cloudstack.api.command.user.vpn.UpdateVpnCustomerGatewayCmd;
 +import org.apache.cloudstack.api.command.user.vpn.UpdateVpnGatewayCmd;
 +import org.apache.cloudstack.api.command.user.zone.ListZonesCmd;
 +import org.apache.cloudstack.config.ApiServiceConfiguration;
 +import org.apache.cloudstack.config.Configuration;
 +import org.apache.cloudstack.context.CallContext;
 +import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
 +import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 +import org.apache.cloudstack.framework.config.ConfigDepot;
 +import org.apache.cloudstack.framework.config.ConfigKey;
 +import org.apache.cloudstack.framework.config.Configurable;
 +import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 +import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
 +import org.apache.cloudstack.framework.security.keystore.KeystoreManager;
 +import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 +import org.apache.cloudstack.query.QueryService;
 +import org.apache.cloudstack.resourcedetail.dao.GuestOsDetailsDao;
 +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 +import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 +import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 +import org.apache.cloudstack.utils.CloudStackVersion;
 +import org.apache.cloudstack.utils.identity.ManagementServerNode;
 +import org.apache.commons.codec.binary.Base64;
 +import org.apache.commons.collections.CollectionUtils;
 +import org.apache.commons.lang3.StringUtils;
 +import org.apache.log4j.Logger;
 +
- import com.cloud.agent.AgentManager;
- import com.cloud.agent.api.GetVncPortAnswer;
- import com.cloud.agent.api.GetVncPortCommand;
- import com.cloud.agent.manager.allocator.HostAllocator;
- import com.cloud.alert.Alert;
- import com.cloud.alert.AlertManager;
- import com.cloud.alert.AlertVO;
- import com.cloud.alert.dao.AlertDao;
- import com.cloud.api.ApiDBUtils;
- import com.cloud.api.query.dao.StoragePoolJoinDao;
- import com.cloud.api.query.vo.StoragePoolJoinVO;
- import com.cloud.capacity.Capacity;
- import com.cloud.capacity.CapacityVO;
- import com.cloud.capacity.dao.CapacityDao;
- import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
- import com.cloud.cluster.ClusterManager;
- import com.cloud.configuration.Config;
- import com.cloud.configuration.ConfigurationManagerImpl;
- import com.cloud.consoleproxy.ConsoleProxyManagementState;
- import com.cloud.consoleproxy.ConsoleProxyManager;
- import com.cloud.dc.AccountVlanMapVO;
- import com.cloud.dc.ClusterVO;
- import com.cloud.dc.DataCenterVO;
- import com.cloud.dc.HostPodVO;
- import com.cloud.dc.Pod;
- import com.cloud.dc.PodVlanMapVO;
- import com.cloud.dc.Vlan;
- import com.cloud.dc.Vlan.VlanType;
- import com.cloud.dc.VlanVO;
- import com.cloud.dc.dao.AccountVlanMapDao;
- import com.cloud.dc.dao.ClusterDao;
- import com.cloud.dc.dao.DataCenterDao;
- import com.cloud.dc.dao.HostPodDao;
- import com.cloud.dc.dao.PodVlanMapDao;
- import com.cloud.dc.dao.VlanDao;
- import com.cloud.deploy.DataCenterDeployment;
- import com.cloud.deploy.DeploymentPlanner;
- import com.cloud.deploy.DeploymentPlanner.ExcludeList;
- import com.cloud.deploy.DeploymentPlanningManager;
- import com.cloud.domain.DomainVO;
- import com.cloud.domain.dao.DomainDao;
- import com.cloud.event.ActionEvent;
- import com.cloud.event.ActionEventUtils;
- import com.cloud.event.EventTypes;
- import com.cloud.event.EventVO;
- import com.cloud.event.dao.EventDao;
- import com.cloud.exception.ConcurrentOperationException;
- import com.cloud.exception.InsufficientAddressCapacityException;
- import com.cloud.exception.InvalidParameterValueException;
- import com.cloud.exception.ManagementServerException;
- import com.cloud.exception.OperationTimedoutException;
- import com.cloud.exception.PermissionDeniedException;
- import com.cloud.exception.ResourceUnavailableException;
- import com.cloud.exception.VirtualMachineMigrationException;
- import com.cloud.gpu.GPU;
- import com.cloud.ha.HighAvailabilityManager;
- import com.cloud.host.DetailVO;
- import com.cloud.host.Host;
- import com.cloud.host.Host.Type;
- import com.cloud.host.HostTagVO;
- import com.cloud.host.HostVO;
- import com.cloud.host.dao.HostDao;
- import com.cloud.host.dao.HostDetailsDao;
- import com.cloud.host.dao.HostTagsDao;
- import com.cloud.hypervisor.Hypervisor;
- import com.cloud.hypervisor.Hypervisor.HypervisorType;
- import com.cloud.hypervisor.HypervisorCapabilities;
- import com.cloud.hypervisor.HypervisorCapabilitiesVO;
- import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
- import com.cloud.hypervisor.kvm.dpdk.DpdkHelper;
- import com.cloud.info.ConsoleProxyInfo;
- import com.cloud.network.IpAddress;
- import com.cloud.network.IpAddressManager;
- import com.cloud.network.IpAddressManagerImpl;
- import com.cloud.network.Network;
- import com.cloud.network.NetworkModel;
- import com.cloud.network.dao.IPAddressDao;
- import com.cloud.network.dao.IPAddressVO;
- import com.cloud.network.dao.LoadBalancerDao;
- import com.cloud.network.dao.LoadBalancerVO;
- import com.cloud.network.dao.NetworkAccountDao;
- import com.cloud.network.dao.NetworkAccountVO;
- import com.cloud.network.dao.NetworkDao;
- import com.cloud.network.dao.NetworkDomainDao;
- import com.cloud.network.dao.NetworkDomainVO;
- import com.cloud.network.dao.NetworkVO;
- import com.cloud.network.vpc.dao.VpcDao;
- import com.cloud.org.Cluster;
- import com.cloud.org.Grouping.AllocationState;
- import com.cloud.projects.Project;
- import com.cloud.projects.Project.ListProjectResourcesCriteria;
- import com.cloud.projects.ProjectManager;
- import com.cloud.resource.ResourceManager;
- import com.cloud.server.ResourceTag.ResourceObjectType;
- import com.cloud.server.auth.UserAuthenticator;
- import com.cloud.service.ServiceOfferingVO;
- import com.cloud.service.dao.ServiceOfferingDao;
- import com.cloud.service.dao.ServiceOfferingDetailsDao;
- import com.cloud.storage.DiskOfferingVO;
- import com.cloud.storage.GuestOS;
- import com.cloud.storage.GuestOSCategoryVO;
- import com.cloud.storage.GuestOSHypervisor;
- import com.cloud.storage.GuestOSHypervisorVO;
- import com.cloud.storage.GuestOSVO;
- import com.cloud.storage.GuestOsCategory;
- import com.cloud.storage.ScopeType;
- import com.cloud.storage.Storage;
- import com.cloud.storage.StorageManager;
- import com.cloud.storage.StoragePool;
- import com.cloud.storage.StoragePoolStatus;
- import com.cloud.storage.Volume;
- import com.cloud.storage.VolumeApiServiceImpl;
- import com.cloud.storage.VolumeVO;
- import com.cloud.storage.dao.DiskOfferingDao;
- import com.cloud.storage.dao.GuestOSCategoryDao;
- import com.cloud.storage.dao.GuestOSDao;
- import com.cloud.storage.dao.GuestOSHypervisorDao;
- import com.cloud.storage.dao.VolumeDao;
- import com.cloud.storage.secondary.SecondaryStorageVmManager;
- import com.cloud.tags.ResourceTagVO;
- import com.cloud.tags.dao.ResourceTagDao;
- import com.cloud.template.TemplateManager;
- import com.cloud.user.Account;
- import com.cloud.user.AccountManager;
- import com.cloud.user.AccountService;
- import com.cloud.user.SSHKeyPair;
- import com.cloud.user.SSHKeyPairVO;
- import com.cloud.user.User;
- import com.cloud.user.UserVO;
- import com.cloud.user.dao.AccountDao;
- import com.cloud.user.dao.SSHKeyPairDao;
- import com.cloud.user.dao.UserDao;
- import com.cloud.utils.NumbersUtil;
- import com.cloud.utils.Pair;
- import com.cloud.utils.PasswordGenerator;
- import com.cloud.utils.Ternary;
- import com.cloud.utils.component.ComponentLifecycle;
- import com.cloud.utils.component.ManagerBase;
- import com.cloud.utils.concurrency.NamedThreadFactory;
- import com.cloud.utils.crypt.DBEncryptionUtil;
- import com.cloud.utils.db.DB;
- import com.cloud.utils.db.Filter;
- import com.cloud.utils.db.GlobalLock;
- import com.cloud.utils.db.JoinBuilder;
- import com.cloud.utils.db.JoinBuilder.JoinType;
- import com.cloud.utils.db.SearchBuilder;
- import com.cloud.utils.db.SearchCriteria;
- import com.cloud.utils.db.Transaction;
- import com.cloud.utils.db.TransactionCallbackNoReturn;
- import com.cloud.utils.db.TransactionStatus;
- import com.cloud.utils.exception.CloudRuntimeException;
- import com.cloud.utils.net.MacAddress;
- import com.cloud.utils.net.NetUtils;
- import com.cloud.utils.ssh.SSHKeysHelper;
- import com.cloud.vm.ConsoleProxyVO;
- import com.cloud.vm.DiskProfile;
- import com.cloud.vm.InstanceGroupVO;
- import com.cloud.vm.SecondaryStorageVmVO;
- import com.cloud.vm.UserVmDetailVO;
- import com.cloud.vm.UserVmManager;
- import com.cloud.vm.UserVmVO;
- import com.cloud.vm.VMInstanceVO;
- import com.cloud.vm.VirtualMachine;
- import com.cloud.vm.VirtualMachine.State;
- import com.cloud.vm.VirtualMachineManager;
- import com.cloud.vm.VirtualMachineProfile;
- import com.cloud.vm.VirtualMachineProfileImpl;
- import com.cloud.vm.dao.ConsoleProxyDao;
- import com.cloud.vm.dao.InstanceGroupDao;
- import com.cloud.vm.dao.SecondaryStorageVmDao;
- import com.cloud.vm.dao.UserVmDao;
- import com.cloud.vm.dao.UserVmDetailsDao;
- import com.cloud.vm.dao.VMInstanceDao;
 +
 +import static com.cloud.configuration.ConfigurationManagerImpl.VM_USERDATA_MAX_LENGTH;
 +import static com.cloud.vm.UserVmManager.MAX_USER_DATA_LENGTH_BYTES;
  
  public class ManagementServerImpl extends ManagerBase implements ManagementServer, Configurable {
      public static final Logger s_logger = Logger.getLogger(ManagementServerImpl.class.getName());
@@@ -813,9 -794,8 +814,11 @@@
      public static final ConfigKey<String> customCsIdentifier = new ConfigKey<String>("Advanced", String.class, "custom.cs.identifier", UUID.randomUUID().toString().split("-")[0].substring(4), "Custom identifier for the cloudstack installation", true, ConfigKey.Scope.Global);
      private static final VirtualMachine.Type []systemVmTypes = { VirtualMachine.Type.SecondaryStorageVm, VirtualMachine.Type.ConsoleProxy};
  
 +    private static final int MAX_HTTP_GET_LENGTH = 2 * MAX_USER_DATA_LENGTH_BYTES;
 +    private static final int NUM_OF_2K_BLOCKS = 512;
 +    private static final int MAX_HTTP_POST_LENGTH = NUM_OF_2K_BLOCKS * MAX_USER_DATA_LENGTH_BYTES;
+     private static final List<HypervisorType> LIVE_MIGRATION_SUPPORTING_HYPERVISORS = List.of(HypervisorType.Hyperv, HypervisorType.KVM,
+             HypervisorType.LXC, HypervisorType.Ovm, HypervisorType.Ovm3, HypervisorType.Simulator, HypervisorType.VMware, HypervisorType.XenServer);
  
      @Inject
      public AccountManager _accountMgr;
diff --cc server/src/test/java/com/cloud/server/ManagementServerImplTest.java
index 3c169cda55,d7e221702d..cf8df1ad37
--- a/server/src/test/java/com/cloud/server/ManagementServerImplTest.java
+++ b/server/src/test/java/com/cloud/server/ManagementServerImplTest.java
@@@ -22,58 -21,44 +22,67 @@@ import static org.mockito.Mockito.any
  import static org.mockito.Mockito.lenient;
  import static org.mockito.Mockito.when;
  
 -import java.util.ArrayList;
 -import java.util.List;
 -
 -import org.apache.cloudstack.api.ApiConstants;
 -import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd;
 -import org.apache.cloudstack.api.command.user.ssh.RegisterSSHKeyPairCmd;
 -import org.apache.cloudstack.framework.config.ConfigKey;
 -import org.junit.Assert;
 -import org.junit.Before;
 -import org.junit.Test;
 -import org.junit.runner.RunWith;
 -import org.mockito.Mock;
 -import org.mockito.Mockito;
 -import org.mockito.Spy;
 -import org.mockito.runners.MockitoJUnitRunner;
 -import org.powermock.reflect.Whitebox;
 -import org.springframework.test.util.ReflectionTestUtils;
 -
+ import com.cloud.dc.Vlan.VlanType;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.host.DetailVO;
+ import com.cloud.host.Host;
+ import com.cloud.host.HostVO;
+ import com.cloud.host.dao.HostDetailsDao;
+ import com.cloud.network.IpAddress;
+ import com.cloud.network.IpAddressManagerImpl;
+ import com.cloud.network.dao.IPAddressVO;
 +import com.cloud.storage.VMTemplateVO;
 +import com.cloud.storage.dao.VMTemplateDao;
+ import com.cloud.user.Account;
 +import com.cloud.user.AccountManager;
+ import com.cloud.user.SSHKeyPair;
+ import com.cloud.user.SSHKeyPairVO;
 +import com.cloud.user.User;
 +import com.cloud.user.UserData;
 +import com.cloud.user.UserDataVO;
+ import com.cloud.user.dao.SSHKeyPairDao;
 +import com.cloud.user.dao.UserDataDao;
  import com.cloud.utils.Pair;
 +import com.cloud.utils.db.Filter;
 +import com.cloud.utils.db.SearchBuilder;
+ import com.cloud.utils.db.SearchCriteria;
 +import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.vm.UserVmDetailVO;
  import com.cloud.vm.UserVmVO;
+ import com.cloud.vm.dao.UserVmDetailsDao;
 +import com.cloud.vm.dao.UserVmDao;
++
 +import org.apache.cloudstack.annotation.dao.AnnotationDao;
++import org.apache.cloudstack.api.ApiConstants;
 +import org.apache.cloudstack.api.BaseCmd;
 +import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd;
 +import org.apache.cloudstack.api.command.user.ssh.RegisterSSHKeyPairCmd;
 +import org.apache.cloudstack.api.command.user.userdata.DeleteUserDataCmd;
 +import org.apache.cloudstack.api.command.user.userdata.ListUserDataCmd;
 +import org.apache.cloudstack.api.command.user.userdata.RegisterUserDataCmd;
 +import org.apache.cloudstack.context.CallContext;
 +import org.apache.cloudstack.framework.config.ConfigKey;
++
 +import org.junit.After;
 +import org.junit.Assert;
 +import org.junit.Before;
 +import org.junit.Test;
 +import org.junit.runner.RunWith;
 +import org.mockito.Mock;
 +import org.mockito.Mockito;
 +import org.mockito.MockitoAnnotations;
 +import org.mockito.Spy;
 +import org.powermock.api.mockito.PowerMockito;
 +import org.powermock.core.classloader.annotations.PrepareForTest;
 +import org.powermock.modules.junit4.PowerMockRunner;
 +import org.powermock.reflect.Whitebox;
- 
- import com.cloud.dc.Vlan.VlanType;
- import com.cloud.exception.InvalidParameterValueException;
- import com.cloud.network.IpAddress;
- import com.cloud.network.IpAddressManagerImpl;
- import com.cloud.network.dao.IPAddressVO;
- import com.cloud.user.Account;
- import com.cloud.user.SSHKeyPair;
- import com.cloud.user.SSHKeyPairVO;
- import com.cloud.user.dao.SSHKeyPairDao;
- import com.cloud.utils.db.SearchCriteria;
++import org.springframework.test.util.ReflectionTestUtils;
  
 -@RunWith(MockitoJUnitRunner.class)
 +import java.util.ArrayList;
 +import java.util.List;
 +
 +@RunWith(PowerMockRunner.class)
 +@PrepareForTest(CallContext.class)
  public class ManagementServerImplTest {
  
      @Mock
@@@ -117,24 -87,20 +126,32 @@@
  
      ConfigKey mockConfig;
  
+     @Mock
+     UserVmDetailsDao userVmDetailsDao;
+ 
+     @Mock
+     HostDetailsDao hostDetailsDao;
+ 
      @Before
      public void setup() {
 +        MockitoAnnotations.initMocks(this);
 +        CallContext.register(Mockito.mock(User.class), Mockito.mock(Account.class));
          mockConfig = Mockito.mock(ConfigKey.class);
          Whitebox.setInternalState(ipAddressManagerImpl.getClass(), "SystemVmPublicIpReservationModeStrictness", mockConfig);
 +        spy._accountMgr = _accountMgr;
 +        spy.userDataDao = _userDataDao;
 +        spy.templateDao = _templateDao;
 +        spy._userVmDao = _userVmDao;
 +        spy.annotationDao = annotationDao;
+         spy._UserVmDetailsDao = userVmDetailsDao;
+         spy._detailsDao = hostDetailsDao;
      }
  
 +    @After
 +    public void tearDown() throws Exception {
 +        CallContext.unregister();
 +    }
 +
      @Test(expected = InvalidParameterValueException.class)
      public void testDuplicateRegistraitons(){
          String accountName = "account";
@@@ -277,263 -243,100 +294,359 @@@
          Mockito.verify(sc, Mockito.never()).setParameters("forsystemvms", false);
      }
  
 +    @Test
 +    public void testSuccessfulRegisterUserdata() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        RegisterUserDataCmd cmd = Mockito.mock(RegisterUserDataCmd.class);
 +        when(cmd.getUserData()).thenReturn("testUserdata");
 +        when(cmd.getName()).thenReturn("testName");
 +        when(cmd.getHttpMethod()).thenReturn(BaseCmd.HTTPMethod.GET);
 +
 +        when(_userDataDao.findByName(account.getAccountId(), account.getDomainId(), "testName")).thenReturn(null);
 +        when(_userDataDao.findByUserData(account.getAccountId(), account.getDomainId(), "testUserdata")).thenReturn(null);
 +
 +        UserData userData = spy.registerUserData(cmd);
 +        Assert.assertEquals("testName", userData.getName());
 +        Assert.assertEquals("testUserdata", userData.getUserData());
 +        Assert.assertEquals(1L, userData.getAccountId());
 +        Assert.assertEquals(2L, userData.getDomainId());
 +    }
 +
 +    @Test(expected = InvalidParameterValueException.class)
 +    public void testRegisterExistingUserdata() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        RegisterUserDataCmd cmd = Mockito.mock(RegisterUserDataCmd.class);
 +        when(cmd.getUserData()).thenReturn("testUserdata");
 +        when(cmd.getName()).thenReturn("testName");
 +
 +        UserDataVO userData = Mockito.mock(UserDataVO.class);
 +        when(_userDataDao.findByName(account.getAccountId(), account.getDomainId(), "testName")).thenReturn(null);
 +        when(_userDataDao.findByUserData(account.getAccountId(), account.getDomainId(), "testUserdata")).thenReturn(userData);
 +
 +        spy.registerUserData(cmd);
 +    }
 +
 +    @Test(expected = InvalidParameterValueException.class)
 +    public void testRegisterExistingName() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        PowerMockito.when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        RegisterUserDataCmd cmd = Mockito.mock(RegisterUserDataCmd.class);
 +        when(cmd.getUserData()).thenReturn("testUserdata");
 +        when(cmd.getName()).thenReturn("testName");
 +
 +        UserDataVO userData = Mockito.mock(UserDataVO.class);
 +        when(_userDataDao.findByName(account.getAccountId(), account.getDomainId(), "testName")).thenReturn(userData);
 +
 +        spy.registerUserData(cmd);
 +    }
 +
 +    @Test
 +    public void testSuccessfulDeleteUserdata() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        DeleteUserDataCmd cmd = Mockito.mock(DeleteUserDataCmd.class);
 +        when(cmd.getAccountName()).thenReturn("testAccountName");
 +        when(cmd.getDomainId()).thenReturn(1L);
 +        when(cmd.getProjectId()).thenReturn(2L);
 +        when(cmd.getId()).thenReturn(1L);
 +        UserDataVO userData = Mockito.mock(UserDataVO.class);
 +
 +        Mockito.when(userData.getId()).thenReturn(1L);
 +        when(_userDataDao.findById(1L)).thenReturn(userData);
 +        when(_userDataDao.findByName(account.getAccountId(), account.getDomainId(), "testName")).thenReturn(null);
 +        when(_templateDao.findTemplatesLinkedToUserdata(1L)).thenReturn(new ArrayList<VMTemplateVO>());
 +        when(_userVmDao.findByUserDataId(1L)).thenReturn(new ArrayList<UserVmVO>());
 +        when(_userDataDao.remove(1L)).thenReturn(true);
 +
 +        boolean result = spy.deleteUserData(cmd);
 +        Assert.assertEquals(true, result);
 +    }
 +
 +    @Test(expected = CloudRuntimeException.class)
 +    public void testDeleteUserdataLinkedToTemplate() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        DeleteUserDataCmd cmd = Mockito.mock(DeleteUserDataCmd.class);
 +        when(cmd.getAccountName()).thenReturn("testAccountName");
 +        when(cmd.getDomainId()).thenReturn(1L);
 +        when(cmd.getProjectId()).thenReturn(2L);
 +        when(cmd.getId()).thenReturn(1L);
 +
 +        UserDataVO userData = Mockito.mock(UserDataVO.class);
 +        Mockito.when(userData.getId()).thenReturn(1L);
 +        when(_userDataDao.findById(1L)).thenReturn(userData);
 +        when(_userDataDao.findByName(account.getAccountId(), account.getDomainId(), "testName")).thenReturn(null);
 +
 +        VMTemplateVO vmTemplateVO = Mockito.mock(VMTemplateVO.class);
 +        List<VMTemplateVO> linkedTemplates = new ArrayList<>();
 +        linkedTemplates.add(vmTemplateVO);
 +        when(_templateDao.findTemplatesLinkedToUserdata(1L)).thenReturn(linkedTemplates);
 +
 +        spy.deleteUserData(cmd);
 +    }
 +
 +    @Test(expected = CloudRuntimeException.class)
 +    public void testDeleteUserdataUsedByVM() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        DeleteUserDataCmd cmd = Mockito.mock(DeleteUserDataCmd.class);
 +        when(cmd.getAccountName()).thenReturn("testAccountName");
 +        when(cmd.getDomainId()).thenReturn(1L);
 +        when(cmd.getProjectId()).thenReturn(2L);
 +        when(cmd.getId()).thenReturn(1L);
 +
 +        UserDataVO userData = Mockito.mock(UserDataVO.class);
 +        Mockito.when(userData.getId()).thenReturn(1L);
 +        when(_userDataDao.findById(1L)).thenReturn(userData);
 +        when(_userDataDao.findByName(account.getAccountId(), account.getDomainId(), "testName")).thenReturn(null);
 +
 +        when(_templateDao.findTemplatesLinkedToUserdata(1L)).thenReturn(new ArrayList<VMTemplateVO>());
 +
 +        UserVmVO userVmVO = Mockito.mock(UserVmVO.class);
 +        List<UserVmVO> vms = new ArrayList<>();
 +        vms.add(userVmVO);
 +        when(_userVmDao.findByUserDataId(1L)).thenReturn(vms);
 +
 +        spy.deleteUserData(cmd);
 +    }
 +
 +    @Test
 +    public void testListUserDataById() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        ListUserDataCmd cmd = Mockito.mock(ListUserDataCmd.class);
 +        when(cmd.getAccountName()).thenReturn("testAccountName");
 +        when(cmd.getDomainId()).thenReturn(1L);
 +        when(cmd.getProjectId()).thenReturn(2L);
 +        when(cmd.getId()).thenReturn(1L);
 +        when(cmd.isRecursive()).thenReturn(false);
 +        UserDataVO userData = Mockito.mock(UserDataVO.class);
 +
 +        SearchBuilder<UserDataVO> sb = Mockito.mock(SearchBuilder.class);
 +        when(_userDataDao.createSearchBuilder()).thenReturn(sb);
 +        when(sb.entity()).thenReturn(userData);
 +
 +        SearchCriteria<UserDataVO> sc = Mockito.mock(SearchCriteria.class);
 +        when(sb.create()).thenReturn(sc);
 +
 +        List<UserDataVO> userDataList = new ArrayList<UserDataVO>();
 +        userDataList.add(userData);
 +        Pair<List<UserDataVO>, Integer> result = new Pair(userDataList, 1);
 +        when(_userDataDao.searchAndCount(nullable(SearchCriteria.class), nullable(Filter.class))).thenReturn(result);
 +
 +        Pair<List<? extends UserData>, Integer> userdataResultList = spy.listUserDatas(cmd);
 +
 +        Assert.assertEquals(userdataResultList.first().get(0), userDataList.get(0));
 +    }
 +
 +    @Test
 +    public void testListUserDataByName() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        ListUserDataCmd cmd = Mockito.mock(ListUserDataCmd.class);
 +        when(cmd.getAccountName()).thenReturn("testAccountName");
 +        when(cmd.getDomainId()).thenReturn(1L);
 +        when(cmd.getProjectId()).thenReturn(2L);
 +        when(cmd.getName()).thenReturn("testSearchUserdataName");
 +        when(cmd.isRecursive()).thenReturn(false);
 +        UserDataVO userData = Mockito.mock(UserDataVO.class);
 +
 +        SearchBuilder<UserDataVO> sb = Mockito.mock(SearchBuilder.class);
 +        when(_userDataDao.createSearchBuilder()).thenReturn(sb);
 +        when(sb.entity()).thenReturn(userData);
 +
 +        SearchCriteria<UserDataVO> sc = Mockito.mock(SearchCriteria.class);
 +        when(sb.create()).thenReturn(sc);
 +
 +        List<UserDataVO> userDataList = new ArrayList<UserDataVO>();
 +        userDataList.add(userData);
 +        Pair<List<UserDataVO>, Integer> result = new Pair(userDataList, 1);
 +        when(_userDataDao.searchAndCount(nullable(SearchCriteria.class), nullable(Filter.class))).thenReturn(result);
 +
 +        Pair<List<? extends UserData>, Integer> userdataResultList = spy.listUserDatas(cmd);
 +
 +        Assert.assertEquals(userdataResultList.first().get(0), userDataList.get(0));
 +    }
 +
 +    @Test
 +    public void testListUserDataByKeyword() {
 +        PowerMockito.mockStatic(CallContext.class);
 +        CallContext callContextMock = PowerMockito.mock(CallContext.class);
 +        when(CallContext.current()).thenReturn(callContextMock);
 +        when(account.getAccountId()).thenReturn(1L);
 +        when(account.getDomainId()).thenReturn(2L);
 +        when(callContextMock.getCallingAccount()).thenReturn(account);
 +        when(_accountMgr.finalizeOwner(nullable(Account.class), nullable(String.class), nullable(Long.class), nullable(Long.class))).thenReturn(account);
 +
 +        ListUserDataCmd cmd = Mockito.mock(ListUserDataCmd.class);
 +        when(cmd.getAccountName()).thenReturn("testAccountName");
 +        when(cmd.getDomainId()).thenReturn(1L);
 +        when(cmd.getProjectId()).thenReturn(2L);
 +        when(cmd.getKeyword()).thenReturn("testSearchUserdataKeyword");
 +        when(cmd.isRecursive()).thenReturn(false);
 +        UserDataVO userData = Mockito.mock(UserDataVO.class);
 +
 +        SearchBuilder<UserDataVO> sb = Mockito.mock(SearchBuilder.class);
 +        when(_userDataDao.createSearchBuilder()).thenReturn(sb);
 +        when(sb.entity()).thenReturn(userData);
 +
 +        SearchCriteria<UserDataVO> sc = Mockito.mock(SearchCriteria.class);
 +        when(sb.create()).thenReturn(sc);
 +
 +        List<UserDataVO> userDataList = new ArrayList<UserDataVO>();
 +        userDataList.add(userData);
 +        Pair<List<UserDataVO>, Integer> result = new Pair(userDataList, 1);
 +        when(_userDataDao.searchAndCount(nullable(SearchCriteria.class), nullable(Filter.class))).thenReturn(result);
 +
 +        Pair<List<? extends UserData>, Integer> userdataResultList = spy.listUserDatas(cmd);
 +
 +        Assert.assertEquals(userdataResultList.first().get(0), userDataList.get(0));
 +    }
 +
+     private UserVmVO mockFilterUefiHostsTestVm(String uefiValue) {
+         UserVmVO vm = Mockito.mock(UserVmVO.class);
+         Mockito.when(vm.getId()).thenReturn(1L);
+         if (uefiValue == null) {
+             Mockito.when(userVmDetailsDao.findDetail(vm.getId(), ApiConstants.BootType.UEFI.toString())).thenReturn(null);
+         } else {
+             UserVmDetailVO detail = new UserVmDetailVO(vm.getId(), ApiConstants.BootType.UEFI.toString(), uefiValue, true);
+             Mockito.when(userVmDetailsDao.findDetail(vm.getId(), ApiConstants.BootType.UEFI.toString())).thenReturn(detail);
+             Mockito.when(hostDetailsDao.findByName(Host.HOST_UEFI_ENABLE)).thenReturn(new ArrayList<>(List.of(new DetailVO(1l, Host.HOST_UEFI_ENABLE, "true"), new DetailVO(2l, Host.HOST_UEFI_ENABLE, "false"))));
+         }
+         return vm;
+     }
+ 
+     private List<HostVO> mockHostsList(Long filtered) {
+         List<HostVO> hosts = new ArrayList<>();
+         HostVO h1 = new HostVO("guid-1");
+         ReflectionTestUtils.setField(h1, "id", 1L);
+         hosts.add(h1);
+         HostVO h2 = new HostVO("guid-2");
+         ReflectionTestUtils.setField(h2, "id", 2L);
+         hosts.add(h2);
+         HostVO h3 = new HostVO("guid-3");
+         ReflectionTestUtils.setField(h3, "id", 3L);
+         hosts.add(h3);
+         if (filtered != null) {
+             hosts.removeIf(h -> h.getId() == filtered);
+         }
+         return hosts;
+     }
+ 
+     @Test
+     public void testFilterUefiHostsForMigrationBiosVm() {
+         UserVmVO vm = mockFilterUefiHostsTestVm(null);
+         Pair<Boolean, List<HostVO>> result = spy.filterUefiHostsForMigration(new ArrayList<>(), new ArrayList<>(), vm);
+         Assert.assertTrue(result.first());
+     }
+ 
+     @Test
+     public void testFilterUefiHostsForMigrationBiosVmFiltered() {
+         List<HostVO> filteredHosts = mockHostsList(2L);
+         UserVmVO vm = mockFilterUefiHostsTestVm(null);
+         Pair<Boolean, List<HostVO>> result = spy.filterUefiHostsForMigration(new ArrayList<>(), filteredHosts, vm);
+         Assert.assertTrue(result.first());
+         Assert.assertNotNull(result.second());
+         Assert.assertEquals(2, result.second().size());
+     }
+ 
+     @Test
+     public void testFilterUefiHostsForMigrationUefiInvalidValueVm() {
+         UserVmVO vm = mockFilterUefiHostsTestVm("");
+         Pair<Boolean, List<HostVO>> result = spy.filterUefiHostsForMigration(new ArrayList<>(), new ArrayList<>(), vm);
+         Assert.assertTrue(result.first());
+     }
+ 
+     @Test
+     public void testFilterUefiHostsForMigrationUefiVMHostsUnavailable() {
+         UserVmVO vm = mockFilterUefiHostsTestVm(ApiConstants.BootMode.SECURE.toString());
+         List<HostVO> filteredHosts = new ArrayList<>();
+         Mockito.when(hostDetailsDao.findByName(Host.HOST_UEFI_ENABLE)).thenReturn(new ArrayList<>());
+         Pair<Boolean, List<HostVO>> result = spy.filterUefiHostsForMigration(mockHostsList(null), filteredHosts, vm);
+         Assert.assertFalse(result.first());
+     }
+ 
+     @Test
+     public void testFilterUefiHostsForMigrationUefiVMHostsAvailable() {
+         UserVmVO vm = mockFilterUefiHostsTestVm(ApiConstants.BootMode.LEGACY.toString());
+         Pair<Boolean, List<HostVO>> result = spy.filterUefiHostsForMigration(mockHostsList(null), null, vm);
+         Assert.assertTrue(result.first());
+         Assert.assertNotNull(result.second());
+         Assert.assertEquals(1, result.second().size());
+     }
+ 
+     @Test
+     public void testFilterUefiHostsForMigrationNoHostsAvailable() {
+         UserVmVO vm = mockFilterUefiHostsTestVm(ApiConstants.BootMode.SECURE.toString());
+         Pair<Boolean, List<HostVO>> result = spy.filterUefiHostsForMigration(new ArrayList<>(), null, vm);
+         Assert.assertFalse(result.first());
+     }
+ 
+     @Test
+     public void testFilterUefiHostsForMigrationUefiVMHostsAvailableFiltered() {
+         UserVmVO vm = mockFilterUefiHostsTestVm(ApiConstants.BootMode.LEGACY.toString());
+         Pair<Boolean, List<HostVO>> result = spy.filterUefiHostsForMigration(mockHostsList(null), mockHostsList(3L), vm);
+         Assert.assertTrue(result.first());
+         Assert.assertNotNull(result.second());
+         Assert.assertEquals(1, result.second().size());
+     }
+ 
+     @Test
+     public void testFilterUefiHostsForMigrationUefiVMNoHostsAvailableFiltered() {
+         UserVmVO vm = mockFilterUefiHostsTestVm(ApiConstants.BootMode.SECURE.toString());
+         Pair<Boolean, List<HostVO>> result = spy.filterUefiHostsForMigration(mockHostsList(null), mockHostsList(1L), vm);
+         Assert.assertFalse(result.first());
+         Assert.assertNotNull(result.second());
+         Assert.assertEquals(0, result.second().size());
+     }
  }