diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 2c729c3cbc7..efb1ca929ca 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -477,12 +477,11 @@ public class ApiConstants { public static final String STATE = "state"; public static final String STATS = "stats"; public static final String STATUS = "status"; + public static final String STORAGE_TYPE = "storagetype"; + public static final String STORAGE_POLICY = "storagepolicy"; + public static final String STORAGE_MOTION_ENABLED = "storagemotionenabled"; public static final String STORAGE_CAPABILITIES = "storagecapabilities"; public static final String STORAGE_CUSTOM_STATS = "storagecustomstats"; - public static final String STORAGE_MOTION_ENABLED = "storagemotionenabled"; - public static final String STORAGE_POLICY = "storagepolicy"; - public static final String STORAGE_POOL = "storagepool"; - public static final String STORAGE_TYPE = "storagetype"; public static final String SUBNET = "subnet"; public static final String OWNER = "owner"; public static final String SWAP_OWNER = "swapowner"; diff --git a/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java index a3563d5a3e5..62bcc07b16d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java @@ -152,7 +152,7 @@ public class HostResponse extends BaseResponseWithAnnotations { @Deprecated @SerializedName("memoryallocated") @Param(description = "the amount of the host's memory currently allocated") - private Long memoryAllocated; + private long memoryAllocated; @SerializedName("memoryallocatedpercentage") @Param(description = "the amount of the host's memory currently allocated in percentage") @@ -407,7 +407,7 @@ public class HostResponse extends BaseResponseWithAnnotations { this.memWithOverprovisioning=memWithOverprovisioning; } - public void setMemoryAllocated(Long memoryAllocated) { + public void setMemoryAllocated(long memoryAllocated) { this.memoryAllocated = memoryAllocated; } @@ -687,8 +687,8 @@ public class HostResponse extends BaseResponseWithAnnotations { return memoryTotal; } - public Long getMemoryAllocated() { - return memoryAllocated == null ? 0 : memoryAllocated; + public long getMemoryAllocated() { + return memoryAllocated; } public void setMemoryAllocatedPercentage(String memoryAllocatedPercentage) { diff --git a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java index 51d0846fafb..94fbb7a80af 100644 --- a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java +++ b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java @@ -25,14 +25,16 @@ import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; +import com.cloud.network.Network; +import org.apache.commons.collections.MapUtils; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; + import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.events.Event; import org.apache.cloudstack.framework.events.EventBus; import org.apache.cloudstack.framework.events.EventDistributor; -import org.apache.commons.collections.MapUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; @@ -243,4 +245,22 @@ public class UsageEventUtils { static final String Name = "management-server"; + public static void publishNetworkCreation(Network network) { + publishUsageEvent(EventTypes.EVENT_NETWORK_CREATE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, null, null, network.getState().name(), + network.getUuid()); + } + + public static void publishNetworkUpdate(Network network) { + publishUsageEvent(EventTypes.EVENT_NETWORK_UPDATE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, network.getState().name(), + Network.class.getName(), network.getUuid(), true); + } + + public static void publishNetworkDeletion(Network network) { + publishUsageEvent(EventTypes.EVENT_NETWORK_DELETE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, null, null, + Network.class.getName(), network.getUuid()); + } + } diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 5106fd824c7..22ec005a8d1 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -1528,8 +1528,6 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (isNetworkImplemented(network)) { logger.debug("Network {} is already implemented", network); implemented.set(guru, network); - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_UPDATE, network.getAccountId(), network.getDataCenterId(), network.getId(), - network.getName(), network.getNetworkOfferingId(), null, network.getState().name(), Network.class.getName(), network.getUuid(), true); return implemented; } @@ -1585,9 +1583,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra network.setRestartRequired(false); _networksDao.update(network.getId(), network); + UsageEventUtils.publishNetworkUpdate(network); implemented.set(guru, network); - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_CREATE, network.getAccountId(), network.getDataCenterId(), network.getId(), - network.getName(), network.getNetworkOfferingId(), null, null, null, network.getState().name(), network.getUuid()); return implemented; } catch (final NoTransitionException e) { logger.error(e.getMessage()); @@ -3087,6 +3084,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (updateResourceCount) { _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network, isDisplayNetworkEnabled); } + UsageEventUtils.publishNetworkCreation(network); return network; } @@ -3168,13 +3166,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } logger.debug("Lock is acquired for network {} as a part of network shutdown", network); - if (network.getState() == Network.State.Allocated) { - logger.debug("Network is already shutdown: {}", network); + final Network.State initialState = network.getState(); + if (initialState == Network.State.Allocated) { + logger.debug(String.format("Network [%s] is in Allocated state, no need to shutdown.", network)); return true; } - if (network.getState() != Network.State.Implemented && network.getState() != Network.State.Shutdown) { - logger.debug("Network is not implemented: {}", network); + if (initialState != Network.State.Implemented && initialState != Network.State.Shutdown) { + logger.debug("Network is not implemented: " + network); return false; } @@ -3218,6 +3217,9 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } _networksDao.update(networkFinal.getId(), networkFinal); _networksDao.clearCheckForGc(networkId); + if (initialState == Network.State.Implemented) { + UsageEventUtils.publishNetworkUpdate(networkFinal); + } result = true; } else { try { @@ -3469,8 +3471,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra final Pair, Long> networkMsg = new Pair, Long>(Network.class, networkFinal.getId()); _messageBus.publish(_name, EntityManager.MESSAGE_REMOVE_ENTITY_EVENT, PublishScope.LOCAL, networkMsg); } - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_DELETE, network.getAccountId(), network.getDataCenterId(), network.getId(), - network.getName(), network.getNetworkOfferingId(), null, null, null, Network.class.getName(), network.getUuid()); + UsageEventUtils.publishNetworkDeletion(network); return true; } catch (final CloudRuntimeException e) { logger.error("Failed to delete network", e); diff --git a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java index 58746a9a6cf..064ca44c69a 100644 --- a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java +++ b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java @@ -891,7 +891,7 @@ public class NetworkOrchestratorTest extends TestCase { boolean shutdownNetworkStatus = testOrchestrator.shutdownNetwork(networkId, reservationContext, false); Assert.assertFalse(shutdownNetworkStatus); - verify(network, times(3)).getState(); + verify(network).getState(); verify(testOrchestrator._networksDao, times(1)).acquireInLockTable(networkId, NetworkLockTimeout.value()); verify(testOrchestrator._networksDao, times(1)).releaseFromLockTable(networkId); } diff --git a/plugins/acl/dynamic-role-based/src/main/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java b/plugins/acl/dynamic-role-based/src/main/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java index 6bbd25bb440..030e0bcf014 100644 --- a/plugins/acl/dynamic-role-based/src/main/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java +++ b/plugins/acl/dynamic-role-based/src/main/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java @@ -47,7 +47,7 @@ public class DynamicRoleBasedAPIAccessChecker extends AdapterBase implements API private RoleService roleService; private List services; - private Map> annotationRoleBasedApisMap = new HashMap<>(); + private Map> annotationRoleBasedApisMap = new HashMap>(); private LazyCache accountCache; private LazyCache>> rolePermissionsCache; @@ -56,7 +56,7 @@ public class DynamicRoleBasedAPIAccessChecker extends AdapterBase implements API protected DynamicRoleBasedAPIAccessChecker() { super(); for (RoleType roleType : RoleType.values()) { - annotationRoleBasedApisMap.put(roleType, new HashSet<>()); + annotationRoleBasedApisMap.put(roleType, new HashSet()); } } diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareDatacenterService.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareDatacenterService.java index 6bb473536b8..bbac78b879a 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareDatacenterService.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareDatacenterService.java @@ -22,15 +22,12 @@ import com.cloud.dc.VmwareDatacenterVO; import com.cloud.dc.VsphereStoragePolicy; import com.cloud.exception.DiscoveryException; import com.cloud.exception.ResourceInUseException; -import com.cloud.hypervisor.vmware.mo.HostMO; import com.cloud.storage.StoragePool; -import com.cloud.utils.Pair; import com.cloud.utils.component.PluggableService; import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd; import org.apache.cloudstack.api.command.admin.zone.ImportVsphereStoragePoliciesCmd; import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcVmsCmd; -import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcHostsCmd; import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcsCmd; import org.apache.cloudstack.api.command.admin.zone.ListVsphereStoragePoliciesCmd; import org.apache.cloudstack.api.command.admin.zone.ListVsphereStoragePolicyCompatiblePoolsCmd; @@ -56,7 +53,5 @@ public interface VmwareDatacenterService extends PluggableService { List listVsphereStoragePolicyCompatibleStoragePools(ListVsphereStoragePolicyCompatiblePoolsCmd cmd); - List listHostsInDatacenter(ListVmwareDcHostsCmd cmd); - - Pair> listVMsInDatacenter(ListVmwareDcVmsCmd cmd); + List listVMsInDatacenter(ListVmwareDcVmsCmd cmd); } diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index b64422482aa..730b737e0f4 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -19,12 +19,10 @@ package com.cloud.hypervisor.vmware.manager; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; import java.rmi.RemoteException; import java.time.Duration; import java.time.Instant; @@ -45,11 +43,10 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import javax.persistence.EntityExistsException; +import com.cloud.hypervisor.vmware.util.VmwareClient; import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd; import org.apache.cloudstack.api.command.admin.zone.ImportVsphereStoragePoliciesCmd; import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcVmsCmd; -import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcHostsCmd; -import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcItems; import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcsCmd; import org.apache.cloudstack.api.command.admin.zone.ListVsphereStoragePoliciesCmd; import org.apache.cloudstack.api.command.admin.zone.ListVsphereStoragePolicyCompatiblePoolsCmd; @@ -89,7 +86,6 @@ import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterVO; import com.cloud.dc.ClusterVSMMapVO; import com.cloud.dc.DataCenterVO; -import com.cloud.dc.VmwareDatacenter; import com.cloud.dc.VsphereStoragePolicy; import com.cloud.dc.VsphereStoragePolicyVO; import com.cloud.dc.dao.ClusterDao; @@ -115,8 +111,7 @@ import com.cloud.hypervisor.HypervisorGuruManager; import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao; import com.cloud.hypervisor.vmware.LegacyZoneVO; import com.cloud.hypervisor.vmware.VmwareCleanupMaid; -import com.cloud.hypervisor.vmware.util.VmwareClient; -import com.cloud.hypervisor.vmware.util.VmwareClientException; +import com.cloud.dc.VmwareDatacenter; import com.cloud.hypervisor.vmware.VmwareDatacenterService; import com.cloud.dc.VmwareDatacenterVO; import com.cloud.hypervisor.vmware.VmwareDatacenterZoneMap; @@ -173,16 +168,9 @@ import com.cloud.utils.ssh.SshHelper; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.dao.UserVmCloneSettingDao; import com.cloud.vm.dao.VMInstanceDao; - -// TODO move these items upstream? import com.vmware.pbm.PbmProfile; import com.vmware.vim25.AboutInfo; import com.vmware.vim25.ManagedObjectReference; -import com.vmware.vim25.InvalidLocaleFaultMsg; -import com.vmware.vim25.InvalidLoginFaultMsg; -import com.vmware.vim25.RuntimeFaultFaultMsg; -import com.vmware.vim25.InvalidPropertyFaultMsg; -import org.jetbrains.annotations.NotNull; public class VmwareManagerImpl extends ManagerBase implements VmwareManager, VmwareStorageMount, Listener, VmwareDatacenterService, Configurable { @@ -257,11 +245,11 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private StorageLayer _storage; private final String _privateNetworkVSwitchName = "vSwitch0"; - private final int _portsPerDvPortGroup = DEFAULT_PORTS_PER_DV_PORT_GROUP; + private int _portsPerDvPortGroup = DEFAULT_PORTS_PER_DV_PORT_GROUP; private boolean _fullCloneFlag; private boolean _instanceNameFlag; private String _serviceConsoleName; - private String _managementPortGroupName; + private String _managemetPortGroupName; private String _defaultSystemVmNicAdapterType = VirtualEthernetCardType.E1000.toString(); private String _recycleHungWorker = "false"; private int _additionalPortRangeStart; @@ -275,7 +263,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private final Random _rand = new Random(System.currentTimeMillis()); - private static final ScheduledExecutorService templateCleanupScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Vmware-FullyClonedTemplateCheck")); + private static ScheduledExecutorService templateCleanupScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Vmware-FullyClonedTemplateCheck"));; private final VmwareStorageManager _storageMgr; private final GlobalLock _exclusiveOpLock = GlobalLock.getInternLock("vmware.exclusive.op"); @@ -359,9 +347,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw _serviceConsoleName = "Service Console"; } - _managementPortGroupName = _configDao.getValue(Config.VmwareManagementPortGroup.key()); - if (_managementPortGroupName == null) { - _managementPortGroupName = "Management Network"; + _managemetPortGroupName = _configDao.getValue(Config.VmwareManagementPortGroup.key()); + if (_managemetPortGroupName == null) { + _managemetPortGroupName = "Management Network"; } _defaultSystemVmNicAdapterType = _configDao.getValue(Config.VmwareSystemVmNicDeviceType.key()); @@ -460,7 +448,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw logger.info("Preparing network on host " + hostMo.getContext().toString() + " for " + privateTrafficLabel); VirtualSwitchType vsType = VirtualSwitchType.getType(vSwitchType); - //The management network is probably always going to be a physical network with isolation type of vlans, so assume BroadcastDomainType VLAN + //The management network is probably always going to be a physical network with islation type of vlans, so assume BroadcastDomainType VLAN if (VirtualSwitchType.StandardVirtualSwitch == vsType) { HypervisorHostHelper.prepareNetwork(vSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000, false, BroadcastDomainType.Vlan, null, null); } @@ -469,7 +457,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw AboutInfo about = hostMo.getHostAboutInfo(); if (about != null) { String version = about.getApiVersion(); - if (version != null && (version.equals("4.0") || version.equals("4.1")) ) { // && _portsPerDvPortGroup < DEFAULT_PORTS_PER_DV_PORT_GROUP_VSPHERE4_x) + if (version != null && (version.equals("4.0") || version.equals("4.1")) && _portsPerDvPortGroup < DEFAULT_PORTS_PER_DV_PORT_GROUP_VSPHERE4_x) { portsPerDvPortGroup = DEFAULT_PORTS_PER_DV_PORT_GROUP_VSPHERE4_x; } } @@ -492,7 +480,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } URI uriForHost = new URI(UriUtils.encodeURIComponent(clusterDetails.get("url") + "/" + host.getName())); - morSrcHost = serviceContext.getHostMorByPath(URLDecoder.decode(uriForHost.getPath(), StandardCharsets.UTF_8)); + morSrcHost = serviceContext.getHostMorByPath(URLDecoder.decode(uriForHost.getPath(), "UTF-8")); if (morSrcHost == null) { return null; } @@ -508,18 +496,19 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw throw new CloudRuntimeException("Invalid serviceContext"); } ManagedObjectReference mor = serviceContext.getHostMorByPath(hostInventoryPath); - String privateTrafficLabel; + String privateTrafficLabel = null; privateTrafficLabel = serviceContext.getStockObject("privateTrafficLabel"); if (privateTrafficLabel == null) { privateTrafficLabel = _privateNetworkVSwitchName; } if (mor != null) { - List returnedHostList = new ArrayList<>(); + List returnedHostList = new ArrayList(); if (mor.getType().equals("ComputeResource")) { List hosts = serviceContext.getVimClient().getDynamicProperty(mor, "host"); - assert (CollectionUtils.isNullOrEmpty(hosts)); + assert (hosts != null && hosts.size() > 0); + // For ESX host, we need to enable host firewall to allow VNC access HostMO hostMo = new HostMO(serviceContext, hosts.get(0)); @@ -530,8 +519,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw List hosts = serviceContext.getVimClient().getDynamicProperty(mor, "host"); assert (hosts != null); - if (!hosts.isEmpty()) { - AboutInfo about = serviceContext.getVimClient().getDynamicProperty(hosts.get(0), "config.product"); + if (hosts.size() > 0) { + AboutInfo about = (AboutInfo)(serviceContext.getVimClient().getDynamicProperty(hosts.get(0), "config.product")); String version = about.getApiVersion(); int maxHostsPerCluster = _hvCapabilitiesDao.getMaxHostsPerCluster(HypervisorType.VMware, version); if (hosts.size() > maxHostsPerCluster) { @@ -625,13 +614,13 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override public String getManagementPortGroupName() { - return _managementPortGroupName; + return _managemetPortGroupName; } @Override public String getManagementPortGroupByHost(HostMO hostMo) throws Exception { if (hostMo.getHostType() == VmwareHostType.ESXi) { - return _managementPortGroupName; + return _managemetPortGroupName; } return _serviceConsoleName; } @@ -641,7 +630,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw params.put("vmware.create.full.clone", _fullCloneFlag); params.put("vm.instancename.flag", _instanceNameFlag); params.put("service.console.name", _serviceConsoleName); - params.put("management.portgroup.name", _managementPortGroupName); + params.put("management.portgroup.name", _managemetPortGroupName); params.put("vmware.root.disk.controller", _rootDiskController); params.put("vmware.data.disk.controller", _dataDiskController); params.put("vmware.recycle.hung.wokervm", _recycleHungWorker); @@ -668,23 +657,23 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw return false; } - String[] tokens = workerTag.split("-"); + String tokens[] = workerTag.split("-"); if (tokens.length != 3) { logger.error("Invalid worker VM tag " + workerTag); return false; } long startTick = Long.parseLong(tokens[0]); - long msId = Long.parseLong(tokens[1]); - long runId = Long.parseLong(tokens[2]); + long msid = Long.parseLong(tokens[1]); + long runid = Long.parseLong(tokens[2]); - if (msHostPeerDao.countStateSeenInPeers(msId, runId, ManagementServerHost.State.Down) > 0) { + if (msHostPeerDao.countStateSeenInPeers(msid, runid, ManagementServerHost.State.Down) > 0) { if (logger.isInfoEnabled()) logger.info("Worker VM's owner management server node has been detected down from peer nodes, recycle it"); return true; } - if (runId != clusterManager.getManagementRunId(msId)) { + if (runid != clusterManager.getManagementRunId(msid)) { if (logger.isInfoEnabled()) logger.info("Worker VM's owner management server has changed runid, recycle it"); return true; @@ -782,6 +771,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw isoFile = new File("/usr/share/cloudstack-common/vms/systemvm.iso"); } + assert (isoFile != null); if (!isoFile.exists()) { logger.error("Unable to locate systemvm.iso in your setup at " + isoFile); } @@ -798,7 +788,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw if (keyFile == null || !keyFile.exists()) { keyFile = new File("/usr/share/cloudstack-common/scripts/vm/systemvm/id_rsa.cloud"); } - + assert (keyFile != null); if (!keyFile.exists()) { logger.error("Unable to locate id_rsa.cloud in your setup at " + keyFile); } @@ -807,7 +797,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override public String getMountPoint(String storageUrl, String nfsVersion) { - String mountPoint; + String mountPoint = null; synchronized (_storageMounts) { mountPoint = _storageMounts.get(storageUrl); if (mountPoint != null) { @@ -837,7 +827,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw String mountPoint = null; long mshostId = ManagementServerNode.getManagementServerId(); for (int i = 0; i < 10; i++) { - String mntPt = parent + File.separator + mshostId + "." + Integer.toHexString(_rand.nextInt(Integer.MAX_VALUE)); + String mntPt = parent + File.separator + String.valueOf(mshostId) + "." + Integer.toHexString(_rand.nextInt(Integer.MAX_VALUE)); File file = new File(mntPt); if (!file.exists()) { if (_storage.mkdir(mntPt)) { @@ -862,9 +852,10 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw for (String mountPoint : mounts) { logger.info("umount NFS mount from previous session: " + mountPoint); + String result = null; Script command = new Script(true, "umount", _timeout, logger); command.add(mountPoint); - String result = command.execute(); + result = command.execute(); if (result != null) { logger.warn("Unable to umount " + mountPoint + " due to " + result); } @@ -882,9 +873,10 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw for (String mountPoint : _storageMounts.values()) { logger.info("umount NFS mount: " + mountPoint); + String result = null; Script command = new Script(true, "umount", _timeout, logger); command.add(mountPoint); - String result = command.execute(); + result = command.execute(); if (result != null) { logger.warn("Unable to umount " + mountPoint + " due to " + result); } @@ -902,8 +894,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw return null; } - Script script; - String result; + Script script = null; + String result = null; Script command = new Script(true, "mount", _timeout, logger); command.add("-t", "nfs"); if (nfsVersion != null){ @@ -990,9 +982,11 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override public void processConnect(Host host, StartupCommand cmd, boolean forRebalance) { - if (cmd != null) { + if (cmd instanceof StartupCommand) { if (host.getHypervisorType() == HypervisorType.VMware) { updateClusterNativeHAState(host, cmd); + } else { + return; } } } @@ -1062,16 +1056,16 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override public Pair getAddiionalVncPortRange() { - return new Pair<>(_additionalPortRangeStart, _additionalPortRangeSize); + return new Pair(_additionalPortRangeStart, _additionalPortRangeSize); } @Override public Map getNexusVSMCredentialsByClusterId(Long clusterId) { - CiscoNexusVSMDeviceVO nexusVSM; - ClusterVSMMapVO vsmMapVO; + CiscoNexusVSMDeviceVO nexusVSM = null; + ClusterVSMMapVO vsmMapVO = null; vsmMapVO = _vsmMapDao.findByClusterId(clusterId); - long vsmId; + long vsmId = 0; if (vsmMapVO != null) { vsmId = vsmMapVO.getVsmId(); logger.info("vsmId is " + vsmId); @@ -1082,7 +1076,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw return null; } - Map nexusVSMCredentials = new HashMap<>(); + Map nexusVSMCredentials = new HashMap(); if (nexusVSM != null) { nexusVSMCredentials.put("vsmip", nexusVSM.getipaddr()); nexusVSMCredentials.put("vsmusername", nexusVSM.getUserName()); @@ -1109,7 +1103,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override public List> getCommands() { - List> cmdList = new ArrayList<>(); + List> cmdList = new ArrayList>(); cmdList.add(AddVmwareDcCmd.class); cmdList.add(UpdateVmwareDcCmd.class); cmdList.add(RemoveVmwareDcCmd.class); @@ -1118,14 +1112,13 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw cmdList.add(ListVsphereStoragePoliciesCmd.class); cmdList.add(ListVsphereStoragePolicyCompatiblePoolsCmd.class); cmdList.add(ListVmwareDcVmsCmd.class); - cmdList.add(ListVmwareDcHostsCmd.class); return cmdList; } @Override @DB public VmwareDatacenterVO addVmwareDatacenter(AddVmwareDcCmd cmd) throws ResourceInUseException { - VmwareDatacenterVO vmwareDc; + VmwareDatacenterVO vmwareDc = null; Long zoneId = cmd.getZoneId(); String userName = cmd.getUsername(); String password = cmd.getPassword(); @@ -1181,10 +1174,10 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw checkIfDcIsUsed(vCenterHost, vmwareDcName, zoneId); VmwareContext context = null; - DatacenterMO dcMo; + DatacenterMO dcMo = null; String dcCustomFieldValue; boolean addDcCustomFieldDef = false; - boolean dcInUse; + boolean dcInUse = false; String guid; ManagedObjectReference dcMor; try { @@ -1217,7 +1210,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw // Map zone with vmware datacenter vmwareDcZoneMap = new VmwareDatacenterZoneMapVO(zoneId, vmwareDc.getId()); - vmwareDatacenterZoneMapDao.persist(vmwareDcZoneMap); + vmwareDcZoneMap = vmwareDatacenterZoneMapDao.persist(vmwareDcZoneMap); // Set custom field for this DC if (addDcCustomFieldDef) { @@ -1237,6 +1230,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw if (context != null) { context.close(); } + context = null; } importVsphereStoragePoliciesInternal(zoneId, vmwareDc.getId()); return vmwareDc; @@ -1261,9 +1255,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw * Check if DC is already part of zone * In that case vmware_data_center table should have the DC and a dc zone mapping should exist * - * @param vCenterHost the vcenter appliance hostname - * @param vmwareDcName the name of the vmware DC - * @param zoneId zone that the DC should be connected to + * @param vCenterHost + * @param vmwareDcName + * @param zoneId * @throws ResourceInUseException if the DC can not be used. */ private void checkIfDcIsUsed(String vCenterHost, String vmwareDcName, Long zoneId) throws ResourceInUseException { @@ -1271,7 +1265,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw vmwareDc = vmwareDcDao.getVmwareDatacenterByGuid(vmwareDcName + "@" + vCenterHost); if (vmwareDc != null) { VmwareDatacenterZoneMapVO mapping = vmwareDatacenterZoneMapDao.findByVmwareDcId(vmwareDc.getId()); - if (mapping != null && zoneId == mapping.getZoneId()) { + if (mapping != null && Long.compare(zoneId, mapping.getZoneId()) == 0) { throw new ResourceInUseException(String.format("This DC (%s) is already part of other CloudStack zone (%d). Cannot add this DC to more zones.", vmwareDc.getUuid(), zoneId)); } } @@ -1280,7 +1274,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override @ActionEvent(eventType = EventTypes.EVENT_ZONE_EDIT, eventDescription = "updating VMware datacenter") public VmwareDatacenter updateVmwareDatacenter(UpdateVmwareDcCmd cmd) { - final long zoneId = cmd.getZoneId(); + final Long zoneId = cmd.getZoneId(); final String userName = cmd.getUsername(); final String password = cmd.getPassword(); final String vCenterHost = cmd.getVcenter(); @@ -1308,7 +1302,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } vmwareDc.setGuid(String.format("%s@%s", vmwareDc.getVmwareDatacenterName(), vmwareDc.getVcenterHost())); - return Transaction.execute(new TransactionCallback<>() { + return Transaction.execute(new TransactionCallback() { @Override public VmwareDatacenter doInTransaction(TransactionStatus status) { if (vmwareDcDao.update(vmwareDc.getId(), vmwareDc)) { @@ -1357,7 +1351,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw String vCenterHost; String userName; String password; - DatacenterMO dcMo; + DatacenterMO dcMo = null; final VmwareDatacenterZoneMapVO vmwareDcZoneMap = vmwareDatacenterZoneMapDao.findByZoneId(zoneId); // Check if zone is associated with VMware DC if (vmwareDcZoneMap == null) { @@ -1394,9 +1388,11 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw throw new DiscoveryException(msg); } + assert (dcMo != null); + // Reset custom field property cloud.zone over this DC dcMo.setCustomFieldValue(CustomFieldConstants.CLOUD_ZONE, "false"); - logger.info("Sucessfully reset custom field property cloud.zone over DC {}", vmwareDcName); + logger.info("Successfully reset custom field property cloud.zone over DC {}", vmwareDcName); } catch (Exception e) { String msg = "Unable to reset custom field property cloud.zone over DC " + vmwareDcName + " due to : " + VmwareHelper.getExceptionMessage(e); logger.error(msg); @@ -1405,6 +1401,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw if (context != null) { context.close(); } + context = null; } return true; } @@ -1425,7 +1422,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private void validateZoneWithResources(Long zoneId, String errStr) throws ResourceInUseException { // Check if zone has resources? - For now look for clusters List clusters = clusterDao.listByZoneId(zoneId); - if (!CollectionUtils.isNullOrEmpty(clusters)) { + if (clusters != null && clusters.size() > 0) { // Look for VMware hypervisor. for (ClusterVO cluster : clusters) { if (cluster.getHypervisorType().equals(HypervisorType.VMware)) { @@ -1446,9 +1443,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } @Override - public List listVmwareDatacenters(ListVmwareDcsCmd cmd) throws CloudRuntimeException { + public List listVmwareDatacenters(ListVmwareDcsCmd cmd) throws CloudRuntimeException, InvalidParameterValueException { Long zoneId = cmd.getZoneId(); - List vmwareDcList = new ArrayList<>(); + List vmwareDcList = new ArrayList(); VmwareDatacenterZoneMapVO vmwareDcZoneMap; VmwareDatacenterVO vmwareDatacenter; long vmwareDcId; @@ -1506,7 +1503,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw String vCenterHost = vmwareDatacenter.getVcenterHost(); String userName = vmwareDatacenter.getUser(); String password = vmwareDatacenter.getPassword(); - List storageProfiles; + List storageProfiles = null; try { logger.debug(String.format("Importing vSphere Storage Policies for the vmware DC %d in zone %d", vmwareDcId, zoneId)); VmwareContext context = VmwareContextFactory.getContext(vCenterHost, userName, password); @@ -1534,15 +1531,16 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw List allStoragePolicies = vsphereStoragePolicyDao.listAll(); List finalStorageProfiles = storageProfiles; List needToMarkRemoved = allStoragePolicies.stream() - .filter(existingPolicy -> finalStorageProfiles.stream() - .noneMatch(storageProfile -> storageProfile.getProfileId().getUniqueId().equals(existingPolicy.getPolicyId()))) + .filter(existingPolicy -> !finalStorageProfiles.stream() + .anyMatch(storageProfile -> storageProfile.getProfileId().getUniqueId().equals(existingPolicy.getPolicyId()))) .collect(Collectors.toList()); for (VsphereStoragePolicyVO storagePolicy : needToMarkRemoved) { vsphereStoragePolicyDao.remove(storagePolicy.getId()); } - return vsphereStoragePolicyDao.listAll(); + List storagePolicies = vsphereStoragePolicyDao.listAll(); + return storagePolicies; } @Override @@ -1588,87 +1586,13 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } @Override - public List listHostsInDatacenter(ListVmwareDcHostsCmd cmd) { - VcenterData vmwaredc = getVcenterData(cmd); - - try { - VmwareContext context = getVmwareContext(vmwaredc); - DatacenterMO dcMo = getDatacenterMO(context, vmwaredc); - return dcMo.getAllHostsOnDatacenter(); - } catch (RuntimeFaultFaultMsg | URISyntaxException | VmwareClientException | InvalidLocaleFaultMsg | - InvalidLoginFaultMsg | InvalidPropertyFaultMsg e) { - String errorMsg = String.format("Error retrieving stopped VMs from the VMware VC %s datacenter %s: %s", - vmwaredc.vcenter, vmwaredc.datacenterName, e.getMessage()); - logger.error(errorMsg, e); - throw new CloudRuntimeException(errorMsg); - } - - } - - @Override - public Pair> listVMsInDatacenter(ListVmwareDcVmsCmd cmd) { - Integer maxObjects = cmd.getBatchSize(); - String token = cmd.getToken(); - String host = cmd.getHost(); - - VcenterData vmwaredc = getVcenterData(cmd); - - try { - VmwareContext context = getVmwareContext(vmwaredc); - - DatacenterMO dcMo = getDatacenterMO(context, vmwaredc); - - if (com.cloud.utils.StringUtils.isNotBlank(host)) { - ManagedObjectReference hostMor = dcMo.findHost(host); - if (hostMor == null) { - throw new VmwareClientException(String.format("No host '%s' found on DC: %s.", host, dcMo.getName())); - } - HostMO hostMo = new HostMO(context, hostMor); - return hostMo.getVms(maxObjects, token); - } else { - return dcMo.getVms(maxObjects, token); - } - } catch (InvalidParameterValueException | VmwareClientException | InvalidLocaleFaultMsg | InvalidLoginFaultMsg | - RuntimeFaultFaultMsg | URISyntaxException | InvalidPropertyFaultMsg | InvocationTargetException | - NoSuchMethodException | IllegalAccessException e) { - String errorMsg = String.format("Error retrieving stopped VMs from the VMware VC %s datacenter %s: %s", - vmwaredc.vcenter, vmwaredc.datacenterName, e.getMessage()); - logger.error(errorMsg, e); - throw new CloudRuntimeException(errorMsg); - } - } - - @NotNull - private DatacenterMO getDatacenterMO(VmwareContext context, VcenterData vmwaredc) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { - DatacenterMO dcMo = new DatacenterMO(context, vmwaredc.datacenterName); - ManagedObjectReference dcMor = dcMo.getMor(); - if (dcMor == null) { - String msg = String.format("Unable to find VMware datacenter %s in vCenter %s", - vmwaredc.datacenterName, vmwaredc.vcenter); - logger.error(msg); - throw new InvalidParameterValueException(msg); - } - return dcMo; - } - - @NotNull - private VmwareContext getVmwareContext(VcenterData vmwaredc) throws RuntimeFaultFaultMsg, URISyntaxException, VmwareClientException, InvalidLocaleFaultMsg, InvalidLoginFaultMsg { - logger.debug(String.format("Connecting to the VMware datacenter %s at vCenter %s to retrieve VMs", - vmwaredc.datacenterName, vmwaredc.vcenter)); - String serviceUrl = String.format("https://%s/sdk/vimService", vmwaredc.vcenter); - VmwareClient vimClient = new VmwareClient(vmwaredc.vcenter); - vimClient.connect(serviceUrl, vmwaredc.username, vmwaredc.password); - VmwareContext context = new VmwareContext(vimClient, vmwaredc.vcenter); - return context; - } - - @NotNull - private VcenterData getVcenterData(ListVmwareDcItems cmd) { + public List listVMsInDatacenter(ListVmwareDcVmsCmd cmd) { String vcenter = cmd.getVcenter(); String datacenterName = cmd.getDatacenterName(); String username = cmd.getUsername(); String password = cmd.getPassword(); Long existingVcenterId = cmd.getExistingVcenterId(); + String keyword = cmd.getKeyword(); if ((existingVcenterId == null && StringUtils.isBlank(vcenter)) || (existingVcenterId != null && StringUtils.isNotBlank(vcenter))) { @@ -1689,27 +1613,37 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw username = vmwareDc.getUser(); password = vmwareDc.getPassword(); } - VcenterData vmwaredc = new VcenterData(vcenter, datacenterName, username, password); - return vmwaredc; - } - private static class VcenterData { - public final String vcenter; - public final String datacenterName; - public final String username; - public final String password; + try { + logger.debug(String.format("Connecting to the VMware datacenter %s at vCenter %s to retrieve VMs", + datacenterName, vcenter)); + String serviceUrl = String.format("https://%s/sdk/vimService", vcenter); + VmwareClient vimClient = new VmwareClient(vcenter); + vimClient.connect(serviceUrl, username, password); + VmwareContext context = new VmwareContext(vimClient, vcenter); - public VcenterData(String vcenter, String datacenterName, String username, String password) { - this.vcenter = vcenter; - this.datacenterName = datacenterName; - this.username = username; - this.password = password; + DatacenterMO dcMo = new DatacenterMO(context, datacenterName); + ManagedObjectReference dcMor = dcMo.getMor(); + if (dcMor == null) { + String msg = String.format("Unable to find VMware datacenter %s in vCenter %s", + datacenterName, vcenter); + logger.error(msg); + throw new InvalidParameterValueException(msg); + } + List instances = dcMo.getAllVmsOnDatacenter(); + return StringUtils.isBlank(keyword) ? instances : + instances.stream().filter(x -> x.getName().toLowerCase().contains(keyword.toLowerCase())).collect(Collectors.toList()); + } catch (Exception e) { + String errorMsg = String.format("Error retrieving stopped VMs from the VMware VC %s datacenter %s: %s", + vcenter, datacenterName, e.getMessage()); + logger.error(errorMsg, e); + throw new CloudRuntimeException(errorMsg); } } @Override public boolean hasNexusVSM(Long clusterId) { - ClusterVSMMapVO vsmMapVo; + ClusterVSMMapVO vsmMapVo = null; vsmMapVo = _vsmMapDao.findByClusterId(clusterId); if (vsmMapVo == null) { @@ -1759,7 +1693,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } /** - * This task is to clean-up templates from primary storage that are otherwise not cleaned by the {@see com.cloud.storage.StorageManagerImpl.StorageGarbageCollector}. + * This task is to cleanup templates from primary storage that are otherwise not cleaned by the {@link com.cloud.storage.StorageManagerImpl.StorageGarbageCollector}. * it is called at regular intervals when storage.template.cleanup.enabled == true * It collect all templates that * - are deleted from cloudstack diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java index aa2e5ac6f3a..6f783e0a0fd 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java @@ -36,8 +36,8 @@ import com.cloud.dc.VmwareDatacenterVO; import com.cloud.user.Account; import com.cloud.utils.exception.CloudRuntimeException; -@APICommand(name = "addVmwareDc", description = "Adds a Vmware datacenter to specified zone", - responseObject = VmwareDatacenterResponse.class, responseHasSensitiveInfo = false) +@APICommand(name = "addVmwareDc", description = "Adds a VMware datacenter to specified zone", responseObject = VmwareDatacenterResponse.class, + requestHasSensitiveInfo = true, responseHasSensitiveInfo = false) public class AddVmwareDcCmd extends BaseCmd { @Inject @@ -45,7 +45,7 @@ public class AddVmwareDcCmd extends BaseCmd { - @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Name of Vmware datacenter to be added to specified zone.") + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Name of VMware datacenter to be added to specified zone.") private String name; @Parameter(name = ApiConstants.VCENTER, @@ -54,10 +54,10 @@ public class AddVmwareDcCmd extends BaseCmd { description = "The name/ip of vCenter. Make sure it is IP address or full qualified domain name for host running vCenter server.") private String vCenter; - @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, description = "The Username required to connect to resource.") + @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, required = false, description = "The Username required to connect to resource.") private String username; - @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, description = "The password for specified username.") + @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, required = false, description = "The password for specified username.") private String password; @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "The Zone ID.") @@ -99,7 +99,7 @@ public class AddVmwareDcCmd extends BaseCmd { response.setResponseName(getCommandName()); response.setObjectName("vmwaredc"); } else { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add Vmware Datacenter to zone."); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add VMware Datacenter to zone."); } this.setResponseObject(response); } catch (DiscoveryException ex) { diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ImportVsphereStoragePoliciesCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ImportVsphereStoragePoliciesCmd.java index 40b479f809c..ff373e42871 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ImportVsphereStoragePoliciesCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ImportVsphereStoragePoliciesCmd.java @@ -72,13 +72,6 @@ public class ImportVsphereStoragePoliciesCmd extends BaseCmd { List storagePolicies = _vmwareDatacenterService.importVsphereStoragePolicies(this); final ListResponse responseList = new ListResponse<>(); - final List storagePoliciesResponseList = getVsphereStoragePoliciesResponses(storagePolicies, dataCenter); - responseList.setResponses(storagePoliciesResponseList); - responseList.setResponseName(getCommandName()); - setResponseObject(responseList); - } - - private static List getVsphereStoragePoliciesResponses(List storagePolicies, DataCenter dataCenter) { final List storagePoliciesResponseList = new ArrayList<>(); for (VsphereStoragePolicy storagePolicy : storagePolicies) { final VsphereStoragePoliciesResponse storagePoliciesResponse = new VsphereStoragePoliciesResponse(); @@ -91,7 +84,9 @@ public class ImportVsphereStoragePoliciesCmd extends BaseCmd { storagePoliciesResponseList.add(storagePoliciesResponse); } - return storagePoliciesResponseList; + responseList.setResponses(storagePoliciesResponseList); + responseList.setResponseName(getCommandName()); + setResponseObject(responseList); } @Override diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcHostsCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcHostsCmd.java deleted file mode 100644 index 6f193c9c1b2..00000000000 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcHostsCmd.java +++ /dev/null @@ -1,144 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package org.apache.cloudstack.api.command.admin.zone; - -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.exception.ResourceAllocationException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.hypervisor.Hypervisor; -import com.cloud.hypervisor.vmware.VmwareDatacenterService; -import com.cloud.hypervisor.vmware.mo.HostMO; -import com.cloud.user.Account; -import com.cloud.utils.exception.CloudRuntimeException; - -import com.vmware.vim25.InvalidPropertyFaultMsg; -import com.vmware.vim25.RuntimeFaultFaultMsg; - -import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.ApiErrorCode; -import org.apache.cloudstack.api.BaseCmd; -import org.apache.cloudstack.api.BaseResponse; -import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.response.HostResponse; -import org.apache.cloudstack.api.response.VmwareDatacenterResponse; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; - -import javax.inject.Inject; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; - -@APICommand(name = "listVmwareDcHosts", responseObject = VmwareRequestResponse.class, - description = "Lists the VMs in a Vmware Datacenter", - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) -public class ListVmwareDcHostsCmd extends BaseCmd implements ListVmwareDcItems { - - @Inject - public VmwareDatacenterService _vmwareDatacenterService; - - @Parameter(name = ApiConstants.EXISTING_VCENTER_ID, - type = CommandType.UUID, - entityType = VmwareDatacenterResponse.class, - description = "UUID of a linked existing vCenter") - private Long existingVcenterId; - - @Parameter(name = ApiConstants.VCENTER, - type = CommandType.STRING, - description = "The name/ip of vCenter. Make sure it is IP address or full qualified domain name for host running vCenter server.") - private String vcenter; - - @Parameter(name = ApiConstants.DATACENTER_NAME, type = CommandType.STRING, description = "Name of Vmware datacenter.") - private String datacenterName; - - @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, description = "The Username required to connect to resource.") - private String username; - - @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, description = "The password for specified username.") - private String password; - - public String getVcenter() { - return vcenter; - } - - public String getUsername() { - return username; - } - - public String getPassword() { - return password; - } - - public String getDatacenterName() { - return datacenterName; - } - - public Long getExistingVcenterId() { - return existingVcenterId; - } - - @Override - public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { - checkParameters(); - try { - List hosts = _vmwareDatacenterService.listHostsInDatacenter(this); - List baseResponseList = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(hosts)) { - for (HostMO vmwareHost : hosts) { - HostResponse resp = createHostResponse(vmwareHost); - baseResponseList.add(resp); - } - } - VmwareRequestResponse response = new VmwareRequestResponse<>(); - response.setResponses(baseResponseList, baseResponseList.size()); - response.setResponseName(getCommandName()); - setResponseObject(response); - } catch (CloudRuntimeException | InvalidPropertyFaultMsg | RuntimeFaultFaultMsg | InvocationTargetException | - NoSuchMethodException | IllegalAccessException e) { - String errorMsg = String.format("Error retrieving VMs from Vmware VC: %s", e.getMessage()); - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, errorMsg); - } - } - - private HostResponse createHostResponse(HostMO hostInstance) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { - HostResponse response = new HostResponse(); - response.setHypervisor(Hypervisor.HypervisorType.VMware.toString()); - response.setName(hostInstance.getHostName()); - response.setObjectName("host"); - return response; - } - - private void checkParameters() { - if ((existingVcenterId == null && vcenter == null) || (existingVcenterId != null && vcenter != null)) { - throw new ServerApiException(ApiErrorCode.PARAM_ERROR, - "Please provide an existing vCenter ID or a vCenter IP/Name, parameters are mutually exclusive"); - } - if (existingVcenterId == null && StringUtils.isAnyBlank(vcenter, datacenterName, username, password)) { - throw new ServerApiException(ApiErrorCode.PARAM_ERROR, - "Please set all the information for a vCenter IP/Name, datacenter, username and password"); - } - } - - @Override - public long getEntityOwnerId() { - return Account.ACCOUNT_ID_SYSTEM; - } -} diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcItems.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcItems.java deleted file mode 100644 index 580fb3bad9b..00000000000 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcItems.java +++ /dev/null @@ -1,29 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package org.apache.cloudstack.api.command.admin.zone; - -public interface ListVmwareDcItems { - String getVcenter(); - - String getDatacenterName(); - - String getUsername(); - - String getPassword(); - - Long getExistingVcenterId(); -} diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcVmsCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcVmsCmd.java index 544e756fe80..4dd1b4beb09 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcVmsCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcVmsCmd.java @@ -23,15 +23,15 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.hypervisor.vmware.VmwareDatacenterService; import com.cloud.user.Account; -import com.cloud.utils.Pair; import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; -import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.UnmanagedInstanceResponse; import org.apache.cloudstack.api.response.VmwareDatacenterResponse; import org.apache.cloudstack.vm.UnmanagedInstanceTO; @@ -42,10 +42,10 @@ import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@APICommand(name = "listVmwareDcVms", responseObject = VmwareRequestResponse.class, - description = "Lists the VMs in a Vmware Datacenter", +@APICommand(name = "listVmwareDcVms", responseObject = UnmanagedInstanceResponse.class, + description = "Lists the VMs in a VMware Datacenter", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) -public class ListVmwareDcVmsCmd extends BaseCmd implements ListVmwareDcItems { +public class ListVmwareDcVmsCmd extends BaseListCmd { @Inject public VmwareDatacenterService _vmwareDatacenterService; @@ -61,7 +61,7 @@ public class ListVmwareDcVmsCmd extends BaseCmd implements ListVmwareDcItems { description = "The name/ip of vCenter. Make sure it is IP address or full qualified domain name for host running vCenter server.") private String vcenter; - @Parameter(name = ApiConstants.DATACENTER_NAME, type = CommandType.STRING, description = "Name of Vmware datacenter.") + @Parameter(name = ApiConstants.DATACENTER_NAME, type = CommandType.STRING, description = "Name of VMware datacenter.") private String datacenterName; @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, description = "The Username required to connect to resource.") @@ -70,18 +70,6 @@ public class ListVmwareDcVmsCmd extends BaseCmd implements ListVmwareDcItems { @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, description = "The password for specified username.") private String password; - @Parameter(name = ApiConstants.HOST, type = CommandType.STRING, description = "get only the VMs from the specified host.") - private String host; - - @Parameter(name = ApiConstants.BATCH_SIZE, type = CommandType.INTEGER, description = "The maximum number of results to return.") - private Integer batchSize; - - @Parameter(name = ApiConstants.TOKEN, type = CommandType.STRING, - description = "For listVmwareDcVms, if the maximum number of results (the `batchsize`) is exceeded, " + - " a token is returned. This token can be used in subsequent calls to retrieve more results." + - " As long as a token is returned, more results can be retrieved.") - private String token; - public String getVcenter() { return vcenter; } @@ -94,18 +82,6 @@ public class ListVmwareDcVmsCmd extends BaseCmd implements ListVmwareDcItems { return password; } - public Integer getBatchSize() { - return batchSize; - } - - public String getHost() { - return host; - } - - public String getToken() { - return token; - } - public String getDatacenterName() { return datacenterName; } @@ -118,8 +94,7 @@ public class ListVmwareDcVmsCmd extends BaseCmd implements ListVmwareDcItems { public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { checkParameters(); try { - Pair> results = _vmwareDatacenterService.listVMsInDatacenter(this); - List vms = results.second(); + List vms = _vmwareDatacenterService.listVMsInDatacenter(this); List baseResponseList = new ArrayList<>(); if (CollectionUtils.isNotEmpty(vms)) { for (UnmanagedInstanceTO vmwareVm : vms) { @@ -127,13 +102,16 @@ public class ListVmwareDcVmsCmd extends BaseCmd implements ListVmwareDcItems { baseResponseList.add(resp); } } - VmwareRequestResponse response = new VmwareRequestResponse<>(); - response.setResponses(baseResponseList, baseResponseList.size()); + List pagingList = com.cloud.utils.StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + if (CollectionUtils.isEmpty(pagingList)) { + pagingList = baseResponseList; + } + ListResponse response = new ListResponse<>(); + response.setResponses(pagingList, baseResponseList.size()); response.setResponseName(getCommandName()); - response.setToken(results.first()); setResponseObject(response); } catch (CloudRuntimeException e) { - String errorMsg = String.format("Error retrieving VMs from Vmware VC: %s", e.getMessage()); + String errorMsg = String.format("Error retrieving VMs from VMware VC: %s", e.getMessage()); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, errorMsg); } } @@ -156,6 +134,6 @@ public class ListVmwareDcVmsCmd extends BaseCmd implements ListVmwareDcItems { @Override public String getCommandName() { - return "listVmwareDcVmsResponse".toLowerCase(); + return "listvmwaredcvmsresponse"; } } diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcsCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcsCmd.java index 9cafda955ca..4c7f2a5c7d8 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcsCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcsCmd.java @@ -42,7 +42,7 @@ import com.cloud.dc.VmwareDatacenter; import com.cloud.hypervisor.vmware.VmwareDatacenterService; import com.cloud.user.Account; -@APICommand(name = "listVmwareDcs", responseObject = VmwareDatacenterResponse.class, description = "Retrieves Vmware DC(s) associated with a zone.", +@APICommand(name = "listVmwareDcs", responseObject = VmwareDatacenterResponse.class, description = "Retrieves VMware DC(s) associated with a zone.", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class ListVmwareDcsCmd extends BaseListCmd { @@ -50,6 +50,7 @@ public class ListVmwareDcsCmd extends BaseListCmd { public VmwareDatacenterService _vmwareDatacenterService; + ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// @@ -72,27 +73,20 @@ public class ListVmwareDcsCmd extends BaseListCmd { @Override public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException { - List vmwareDcList; + List vmwareDcList = null; try { vmwareDcList = _vmwareDatacenterService.listVmwareDatacenters(this); } catch (InvalidParameterValueException ie) { throw new InvalidParameterValueException("Invalid zone id " + getZoneId()); } catch (Exception e) { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to find associated Vmware DCs associated with zone " + getZoneId()); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to find associated VMware DCs associated with zone " + getZoneId()); } - ListResponse response = new ListResponse<>(); - List vmwareDcResponses = getVmwareDatacenterResponses(vmwareDcList); - response.setResponses(vmwareDcResponses); - response.setResponseName(getCommandName()); - setResponseObject(response); - } + ListResponse response = new ListResponse(); + List vmwareDcResponses = new ArrayList(); - private List getVmwareDatacenterResponses(List vmwareDcList) { - List vmwareDcResponses = new ArrayList<>(); - - if (vmwareDcList != null && !vmwareDcList.isEmpty()) { + if (vmwareDcList != null && vmwareDcList.size() > 0) { for (VmwareDatacenter vmwareDc : vmwareDcList) { VmwareDatacenterResponse vmwareDcResponse = new VmwareDatacenterResponse(); @@ -100,12 +94,14 @@ public class ListVmwareDcsCmd extends BaseListCmd { vmwareDcResponse.setVcenter(vmwareDc.getVcenterHost()); vmwareDcResponse.setName(vmwareDc.getVmwareDatacenterName()); vmwareDcResponse.setZoneId(getZoneId()); - vmwareDcResponse.setObjectName(ApiConstants.VMWARE_DC); + vmwareDcResponse.setObjectName("VMwareDC"); vmwareDcResponses.add(vmwareDcResponse); } } - return vmwareDcResponses; + response.setResponses(vmwareDcResponses); + response.setResponseName(getCommandName()); + setResponseObject(response); } @Override diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePoliciesCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePoliciesCmd.java index 35631ba1315..ec76e1eff49 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePoliciesCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePoliciesCmd.java @@ -71,13 +71,6 @@ public class ListVsphereStoragePoliciesCmd extends BaseCmd { List storagePolicies = _vmwareDatacenterService.listVsphereStoragePolicies(this); final ListResponse responseList = new ListResponse<>(); - final List storagePoliciesResponseList = getVsphereStoragePoliciesResponses(storagePolicies, dataCenter); - responseList.setResponses(storagePoliciesResponseList); - responseList.setResponseName(getCommandName()); - setResponseObject(responseList); - } - - private static List getVsphereStoragePoliciesResponses(List storagePolicies, DataCenter dataCenter) { final List storagePoliciesResponseList = new ArrayList<>(); for (VsphereStoragePolicy storagePolicy : storagePolicies) { final VsphereStoragePoliciesResponse storagePoliciesResponse = new VsphereStoragePoliciesResponse(); @@ -86,11 +79,13 @@ public class ListVsphereStoragePoliciesCmd extends BaseCmd { storagePoliciesResponse.setName(storagePolicy.getName()); storagePoliciesResponse.setPolicyId(storagePolicy.getPolicyId()); storagePoliciesResponse.setDescription(storagePolicy.getDescription()); - storagePoliciesResponse.setObjectName(ApiConstants.STORAGE_POLICY); + storagePoliciesResponse.setObjectName("StoragePolicy"); storagePoliciesResponseList.add(storagePoliciesResponse); } - return storagePoliciesResponseList; + responseList.setResponses(storagePoliciesResponseList); + responseList.setResponseName(getCommandName()); + setResponseObject(responseList); } @Override diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePolicyCompatiblePoolsCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePolicyCompatiblePoolsCmd.java index ab697fbad67..d66972ded2e 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePolicyCompatiblePoolsCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePolicyCompatiblePoolsCmd.java @@ -68,7 +68,7 @@ public class ListVsphereStoragePolicyCompatiblePoolsCmd extends BaseListCmd { List poolResponses = new ArrayList<>(); for (StoragePool pool : pools) { StoragePoolResponse poolResponse = _responseGenerator.createStoragePoolForMigrationResponse(pool); - poolResponse.setObjectName(ApiConstants.STORAGE_POOL); + poolResponse.setObjectName("storagepool"); poolResponses.add(poolResponse); } response.setResponses(poolResponses); diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/RemoveVmwareDcCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/RemoveVmwareDcCmd.java index d85fbacf2db..a503d860feb 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/RemoveVmwareDcCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/RemoveVmwareDcCmd.java @@ -34,7 +34,7 @@ import com.cloud.hypervisor.vmware.VmwareDatacenterService; import com.cloud.user.Account; import com.cloud.utils.exception.CloudRuntimeException; -@APICommand(name = "removeVmwareDc", responseObject = SuccessResponse.class, description = "Remove a Vmware datacenter from a zone.", +@APICommand(name = "removeVmwareDc", responseObject = SuccessResponse.class, description = "Remove a VMware datacenter from a zone.", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class RemoveVmwareDcCmd extends BaseCmd { @@ -47,7 +47,7 @@ public class RemoveVmwareDcCmd extends BaseCmd { type = CommandType.UUID, entityType = ZoneResponse.class, required = true, - description = "The id of Zone from which Vmware datacenter has to be removed.") + description = "The id of Zone from which VMware datacenter has to be removed.") private Long zoneId; public Long getZoneId() { @@ -63,7 +63,7 @@ public class RemoveVmwareDcCmd extends BaseCmd { response.setResponseName(getCommandName()); setResponseObject(response); } else { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove Vmware datacenter from zone"); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove VMware datacenter from zone"); } } catch (ResourceInUseException ex) { logger.warn("The zone has one or more resources (like cluster), hence not able to remove VMware datacenter from zone." diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/UpdateVmwareDcCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/UpdateVmwareDcCmd.java index 5e02d5a96c2..b8749b9663d 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/UpdateVmwareDcCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/UpdateVmwareDcCmd.java @@ -33,7 +33,7 @@ import com.cloud.dc.VmwareDatacenter; import com.cloud.hypervisor.vmware.VmwareDatacenterService; import com.cloud.user.Account; -@APICommand(name = "updateVmwareDc", description = "Updates a Vmware datacenter details for a zone", +@APICommand(name = "updateVmwareDc", description = "Updates a VMware datacenter details for a zone", responseObject = VmwareDatacenterResponse.class, responseHasSensitiveInfo = false, since = "4.12.0", authorized = {RoleType.Admin}) public class UpdateVmwareDcCmd extends BaseCmd { @@ -50,7 +50,7 @@ public class UpdateVmwareDcCmd extends BaseCmd { private Long zoneId; @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, - description = "Vmware datacenter name.") + description = "VMware datacenter name.") private String name; @Parameter(name = ApiConstants.VCENTER, type = CommandType.STRING, @@ -105,13 +105,13 @@ public class UpdateVmwareDcCmd extends BaseCmd { public void execute() { final VmwareDatacenter vmwareDatacenter = vmwareDatacenterService.updateVmwareDatacenter(this); if (vmwareDatacenter == null) { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update Vmware datacenter"); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update VMware datacenter"); } final VmwareDatacenterResponse response = new VmwareDatacenterResponse(); response.setId(vmwareDatacenter.getUuid()); response.setName(vmwareDatacenter.getVmwareDatacenterName()); response.setResponseName(getCommandName()); - response.setObjectName(ApiConstants.VMWARE_DC); + response.setObjectName("vmwaredc"); setResponseObject(response); } diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/VmwareRequestResponse.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/VmwareRequestResponse.java deleted file mode 100644 index 81c58ef27ba..00000000000 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/VmwareRequestResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package org.apache.cloudstack.api.command.admin.zone; - -import com.cloud.serializer.Param; -import com.google.gson.annotations.SerializedName; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.ResponseObject; -import org.apache.cloudstack.api.response.ListResponse; - -public class VmwareRequestResponse extends ListResponse { - @SerializedName(ApiConstants.TOKEN) - @Param(description = "The Vmware API token to use for retrieving further responses with") - private String token; - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } -} diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 4fbb501e8e4..2e5308b5bd8 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -1783,8 +1783,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C if (ipv4 && Objects.isNull(startIP)) { throw new CloudRuntimeException("IPv4 address range needs to be provided"); } - if (ipv6 && Objects.isNull(startIPv6)) { - throw new CloudRuntimeException("IPv6 address range needs to be provided"); + if (ipv6) { + logger.info(String.format("ip range for network '%s' is specified as %s - %s", name, startIPv6, endIPv6)); } } Pair interfaceMTUs = validateMtuConfig(publicMtu, privateMtu, zone.getId()); @@ -2174,12 +2174,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C if (implementedNetwork == null || implementedNetwork.first() == null) { logger.warn("Failed to provision the network " + network); } - Network implemented = implementedNetwork.second(); - if (implemented != null) { - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_CREATE, implemented.getAccountId(), implemented.getDataCenterId(), implemented.getId(), - implemented.getName(), implemented.getNetworkOfferingId(), null, null, null, Network.class.getName(), implemented.getUuid()); - } - return implemented; + return implementedNetwork.second(); } catch (ResourceUnavailableException ex) { logger.warn("Failed to implement persistent guest network " + network + "due to ", ex); CloudRuntimeException e = new CloudRuntimeException("Failed to implement persistent guest network"); @@ -3580,8 +3575,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C } } Network updatedNetwork = getNetwork(network.getId()); - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_UPDATE, updatedNetwork.getAccountId(), updatedNetwork.getDataCenterId(), updatedNetwork.getId(), - updatedNetwork.getName(), updatedNetwork.getNetworkOfferingId(), null, updatedNetwork.getState().name(), Network.class.getName(), updatedNetwork.getUuid(), true); + UsageEventUtils.publishNetworkUpdate(updatedNetwork); return updatedNetwork; } diff --git a/test/integration/smoke/test_certauthority_root.py b/test/integration/smoke/test_certauthority_root.py index f20314ad4c5..dc6420d6369 100644 --- a/test/integration/smoke/test_certauthority_root.py +++ b/test/integration/smoke/test_certauthority_root.py @@ -24,13 +24,7 @@ from marvin.lib.common import list_hosts from cryptography import x509 from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization -from OpenSSL.crypto import FILETYPE_PEM, verify, X509 - -PUBKEY_VERIFY=True -try: - from OpenSSL.crypto import load_publickey -except ImportError: - PUBKEY_VERIFY=False +from cryptography.hazmat.primitives.asymmetric import padding class TestCARootProvider(cloudstackTestCase): @@ -52,6 +46,20 @@ class TestCARootProvider(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) + def verifySignature(self, caCert, cert): + print("Verifying Certificate") + caPublicKey = caCert.public_key() + try: + caPublicKey.verify( + cert.signature, + cert.tbs_certificate_bytes, + padding.PKCS1v15(), + cert.signature_hash_algorithm, + ) + print("Certificate is valid!") + except Exception as e: + print(f"Certificate verification failed: {e}") + def setUp(self): self.apiclient = self.testClient.getApiClient() self.dbclient = self.testClient.getDbConnection() @@ -136,13 +144,8 @@ class TestCARootProvider(cloudstackTestCase): self.assertTrue(address in [str(x) for x in altNames.value.get_values_for_type(x509.IPAddress)]) # Validate certificate against CA public key - global PUBKEY_VERIFY - if not PUBKEY_VERIFY: - return caCert = x509.load_pem_x509_certificate(self.getCaCertificate().encode(), default_backend()) - x = X509() - x.set_pubkey(load_publickey(FILETYPE_PEM, caCert.public_key().public_bytes(serialization.Encoding.PEM, serialization.PublicFormat.SubjectPublicKeyInfo))) - verify(x, cert.signature, cert.tbs_certificate_bytes, cert.signature_hash_algorithm.name) + self.verifySignature(caCert, cert) @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False) @@ -165,13 +168,8 @@ class TestCARootProvider(cloudstackTestCase): self.assertEqual(cert.subject.get_attributes_for_oid(x509.oid.NameOID.COMMON_NAME)[0].value, 'v-1-VM') # Validate certificate against CA public key - global PUBKEY_VERIFY - if not PUBKEY_VERIFY: - return caCert = x509.load_pem_x509_certificate(self.getCaCertificate().encode(), default_backend()) - x = X509() - x.set_pubkey(load_publickey(FILETYPE_PEM, caCert.public_key().public_bytes(serialization.Encoding.PEM, serialization.PublicFormat.SubjectPublicKeyInfo))) - verify(x, cert.signature, cert.tbs_certificate_bytes, cert.signature_hash_algorithm.name) + self.verifySignature(caCert, cert) @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False) diff --git a/test/integration/smoke/test_cluster_drs.py b/test/integration/smoke/test_cluster_drs.py index f1eb48f92f5..53abe7fd8e3 100644 --- a/test/integration/smoke/test_cluster_drs.py +++ b/test/integration/smoke/test_cluster_drs.py @@ -23,11 +23,12 @@ import logging import time from collections.abc import Iterable +from marvin.codes import FAILED from marvin.cloudstackTestCase import cloudstackTestCase from marvin.cloudstackAPI import (migrateSystemVm, listRouters, listSystemVms) from marvin.lib.base import (Cluster, Configurations, Host, Network, NetworkOffering, ServiceOffering, VirtualMachine, Zone) -from marvin.lib.common import (get_domain, get_zone, get_template) +from marvin.lib.common import (get_domain, get_zone, get_test_template) from marvin.lib.utils import wait_until from marvin import jsonHelper from nose.plugins.attrib import attr @@ -43,7 +44,15 @@ class TestClusterDRS(cloudstackTestCase): zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests()) cls.zone = Zone(zone.__dict__) - cls.template = get_template(cls.apiclient, cls.zone.id) + cls.hypervisor = cls.testClient.getHypervisorInfo() + cls.template = get_test_template( + cls.apiclient, + cls.zone.id, + cls.hypervisor + ) + if cls.template == FAILED: + assert False, "get_test_template() failed to return template\ + with hypervisor %s" % cls.hypervisor cls._cleanup = [] cls.logger = logging.getLogger("TestClusterDRS") diff --git a/test/integration/smoke/test_dynamicroles.py b/test/integration/smoke/test_dynamicroles.py index 19248d28391..e404835fbb8 100644 --- a/test/integration/smoke/test_dynamicroles.py +++ b/test/integration/smoke/test_dynamicroles.py @@ -74,7 +74,6 @@ class TestData(object): "listApis": "allow", "listAccounts": "allow", "listClusters": "deny", - "*VmwareDc*": "allow", "*VM*": "allow", "*Host*": "deny" } diff --git a/test/integration/smoke/test_events_resource.py b/test/integration/smoke/test_events_resource.py index 79443110950..dac95f8c090 100644 --- a/test/integration/smoke/test_events_resource.py +++ b/test/integration/smoke/test_events_resource.py @@ -20,10 +20,6 @@ import json import os import tempfile import time -import unittest -import urllib.error -import urllib.parse -import urllib.request from datetime import datetime @@ -165,6 +161,7 @@ class TestEventsResource(cloudstackTestCase): self.cleanup.remove(volume) ts = str(time.time()) virtual_machine.update(self.apiclient, displayname=ts) + virtual_machine.start(self.apiclient) virtual_machine.delete(self.apiclient) self.cleanup.remove(virtual_machine) account_network.update(self.apiclient, name=account_network.name + ts) diff --git a/test/integration/smoke/test_network_permissions.py b/test/integration/smoke/test_network_permissions.py index cd55c5af745..94ee05d7baf 100644 --- a/test/integration/smoke/test_network_permissions.py +++ b/test/integration/smoke/test_network_permissions.py @@ -733,12 +733,17 @@ class TestNetworkPermissions(cloudstackTestCase): self.exec_command("self.user_apiclient", command, expected=False) self.exec_command("self.otheruser_apiclient", command, expected=True) - # 22. Destroy vm2, should succeed by vm owner + # 22. Start VM before destroying, to recreate ROOT volume that was deleted as part of restore operation + command = """self.virtual_machine.start({apiclient})""" + self.exec_command("self.user_apiclient", command, expected=False) + self.exec_command("self.otheruser_apiclient", command, expected=True) + + # 23. Destroy vm2, should succeed by vm owner command = """self.virtual_machine.delete({apiclient}, expunge=False)""" self.exec_command("self.user_apiclient", command, expected=False) self.exec_command("self.otheruser_apiclient", command, expected=True) - # 23. Recover vm2, should succeed by vm owner + # 24. Recover vm2, should succeed by vm owner allow_expunge_recover_vm = Configurations.list(self.apiclient, name="allow.user.expunge.recover.vm")[0].value self.logger.debug("Global configuration allow.user.expunge.recover.vm = %s", allow_expunge_recover_vm) if allow_expunge_recover_vm == "true": @@ -746,12 +751,12 @@ class TestNetworkPermissions(cloudstackTestCase): self.exec_command("self.user_apiclient", command, expected=False) self.exec_command("self.otheruser_apiclient", command, expected=True) - # 24. Destroy vm2, should succeed by vm owner + # 25. Destroy vm2, should succeed by vm owner command = """self.virtual_machine.delete({apiclient}, expunge=False)""" self.exec_command("self.user_apiclient", command, expected=False) self.exec_command("self.otheruser_apiclient", command, expected=True) - # 25. Expunge vm2, should succeed by vm owner + # 26. Expunge vm2, should succeed by vm owner if allow_expunge_recover_vm == "true": command = """self.virtual_machine.expunge({apiclient})""" self.exec_command("self.user_apiclient", command, expected=False) @@ -759,7 +764,7 @@ class TestNetworkPermissions(cloudstackTestCase): else: self.virtual_machine.expunge(self.apiclient) - # 26. Reset network permissions, should succeed by network owner + # 27. Reset network permissions, should succeed by network owner command = """self.reset_network_permission({apiclient}, self.user_network, expected=True)""" self.exec_command("self.otheruser_apiclient", command, expected=False) self.exec_command("self.user_apiclient", command, expected=True) diff --git a/test/integration/smoke/test_nonstrict_affinity_group.py b/test/integration/smoke/test_nonstrict_affinity_group.py index 27b7d341bd3..1b9b0c02c70 100644 --- a/test/integration/smoke/test_nonstrict_affinity_group.py +++ b/test/integration/smoke/test_nonstrict_affinity_group.py @@ -21,6 +21,7 @@ Tests of Non-Strict (host anti-affinity and host affinity) affinity groups import logging +from marvin.codes import FAILED from nose.plugins.attrib import attr from marvin.cloudstackTestCase import cloudstackTestCase from marvin.cloudstackAPI import startVirtualMachine, stopVirtualMachine, destroyVirtualMachine @@ -37,7 +38,8 @@ from marvin.lib.base import (Account, from marvin.lib.common import (get_domain, get_zone, - get_template) + get_template, + get_test_template) class TestNonStrictAffinityGroups(cloudstackTestCase): @@ -54,7 +56,11 @@ class TestNonStrictAffinityGroups(cloudstackTestCase): zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests()) cls.zone = Zone(zone.__dict__) - cls.template = get_template(cls.apiclient, cls.zone.id) + cls.hypervisor = cls.testClient.getHypervisorInfo() + cls.template = get_test_template(cls.apiclient, cls.zone.id, cls.hypervisor) + if cls.template == FAILED: + assert False, "get_test_template() failed to return template\ + with hypervisor %s" % cls.hypervisor cls._cleanup = [] cls.logger = logging.getLogger("TestNonStrictAffinityGroups") diff --git a/ui/src/views/tools/ManageInstances.vue b/ui/src/views/tools/ManageInstances.vue index 91a9e8f4193..8ab81e35667 100644 --- a/ui/src/views/tools/ManageInstances.vue +++ b/ui/src/views/tools/ManageInstances.vue @@ -1198,7 +1198,6 @@ export default { } else { params.existingvcenterid = this.selectedVmwareVcenter.existingvcenterid } - params.host = this.selectedVmwareVcenter.host } api(apiName, params).then(json => { diff --git a/ui/src/views/tools/SelectVmwareVcenter.vue b/ui/src/views/tools/SelectVmwareVcenter.vue index e93d893e9fc..80618655719 100644 --- a/ui/src/views/tools/SelectVmwareVcenter.vue +++ b/ui/src/views/tools/SelectVmwareVcenter.vue @@ -129,33 +129,11 @@   -
- - - {{ }} - - {{ 'ESXi: ' + opt.name }} - - - -
- {{ $t('message.list.zone.vmware.hosts.empty') }} -
-