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()); + } }
