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 <[email protected]>
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());
+     }
  }

Reply via email to