mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	Merge branch '4.19' of https://github.com/apache/cloudstack into 4.20
This commit is contained in:
		
						commit
						0785ba046e
					
				| @ -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"; | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -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()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -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<Class<?>, Long> networkMsg = new Pair<Class<?>, 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); | ||||
|  | ||||
| @ -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); | ||||
|     } | ||||
|  | ||||
| @ -47,7 +47,7 @@ public class DynamicRoleBasedAPIAccessChecker extends AdapterBase implements API | ||||
|     private RoleService roleService; | ||||
| 
 | ||||
|     private List<PluggableService> services; | ||||
|     private Map<RoleType, Set<String>> annotationRoleBasedApisMap = new HashMap<>(); | ||||
|     private Map<RoleType, Set<String>> annotationRoleBasedApisMap = new HashMap<RoleType, Set<String>>(); | ||||
| 
 | ||||
|     private LazyCache<Long, Account> accountCache; | ||||
|     private LazyCache<Long, Pair<Role, List<RolePermission>>> 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<String>()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -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<StoragePool> listVsphereStoragePolicyCompatibleStoragePools(ListVsphereStoragePolicyCompatiblePoolsCmd cmd); | ||||
| 
 | ||||
|     List<HostMO> listHostsInDatacenter(ListVmwareDcHostsCmd cmd); | ||||
| 
 | ||||
|     Pair<String, List<UnmanagedInstanceTO>> listVMsInDatacenter(ListVmwareDcVmsCmd cmd); | ||||
|     List<UnmanagedInstanceTO> listVMsInDatacenter(ListVmwareDcVmsCmd cmd); | ||||
| } | ||||
|  | ||||
| @ -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<ManagedObjectReference> returnedHostList = new ArrayList<>(); | ||||
|             List<ManagedObjectReference> returnedHostList = new ArrayList<ManagedObjectReference>(); | ||||
| 
 | ||||
|             if (mor.getType().equals("ComputeResource")) { | ||||
|                 List<ManagedObjectReference> 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<ManagedObjectReference> 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<Integer, Integer> getAddiionalVncPortRange() { | ||||
|         return new Pair<>(_additionalPortRangeStart, _additionalPortRangeSize); | ||||
|         return new Pair<Integer, Integer>(_additionalPortRangeStart, _additionalPortRangeSize); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Map<String, String> 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<String, String> nexusVSMCredentials = new HashMap<>(); | ||||
|         Map<String, String> nexusVSMCredentials = new HashMap<String, String>(); | ||||
|         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<Class<?>> getCommands() { | ||||
|         List<Class<?>> cmdList = new ArrayList<>(); | ||||
|         List<Class<?>> cmdList = new ArrayList<Class<?>>(); | ||||
|         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<VmwareDatacenter>() { | ||||
|             @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<ClusterVO> 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<? extends VmwareDatacenter> listVmwareDatacenters(ListVmwareDcsCmd cmd) throws CloudRuntimeException { | ||||
|     public List<? extends VmwareDatacenter> listVmwareDatacenters(ListVmwareDcsCmd cmd) throws CloudRuntimeException, InvalidParameterValueException { | ||||
|         Long zoneId = cmd.getZoneId(); | ||||
|         List<VmwareDatacenterVO> vmwareDcList = new ArrayList<>(); | ||||
|         List<VmwareDatacenterVO> vmwareDcList = new ArrayList<VmwareDatacenterVO>(); | ||||
|         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<PbmProfile> storageProfiles; | ||||
|         List<PbmProfile> 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<VsphereStoragePolicyVO> allStoragePolicies = vsphereStoragePolicyDao.listAll(); | ||||
|         List<PbmProfile> finalStorageProfiles = storageProfiles; | ||||
|         List<VsphereStoragePolicyVO> 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<VsphereStoragePolicyVO> storagePolicies = vsphereStoragePolicyDao.listAll(); | ||||
|         return storagePolicies; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -1588,87 +1586,13 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<HostMO> 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<String, List<UnmanagedInstanceTO>> 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<UnmanagedInstanceTO> 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; | ||||
| 
 | ||||
|         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); | ||||
| 
 | ||||
|             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); | ||||
|             } | ||||
| 
 | ||||
|     private static class VcenterData { | ||||
|         public final String vcenter; | ||||
|         public final String datacenterName; | ||||
|         public final String username; | ||||
|         public final String password; | ||||
| 
 | ||||
|         public VcenterData(String vcenter, String datacenterName, String username, String password) { | ||||
|             this.vcenter = vcenter; | ||||
|             this.datacenterName = datacenterName; | ||||
|             this.username = username; | ||||
|             this.password = password; | ||||
|             List<UnmanagedInstanceTO> 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 | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -72,13 +72,6 @@ public class ImportVsphereStoragePoliciesCmd extends BaseCmd { | ||||
| 
 | ||||
|         List<? extends VsphereStoragePolicy> storagePolicies = _vmwareDatacenterService.importVsphereStoragePolicies(this); | ||||
|         final ListResponse<VsphereStoragePoliciesResponse> responseList = new ListResponse<>(); | ||||
|         final List<VsphereStoragePoliciesResponse> storagePoliciesResponseList = getVsphereStoragePoliciesResponses(storagePolicies, dataCenter); | ||||
|         responseList.setResponses(storagePoliciesResponseList); | ||||
|         responseList.setResponseName(getCommandName()); | ||||
|         setResponseObject(responseList); | ||||
|     } | ||||
| 
 | ||||
|     private static List<VsphereStoragePoliciesResponse> getVsphereStoragePoliciesResponses(List<? extends VsphereStoragePolicy> storagePolicies, DataCenter dataCenter) { | ||||
|         final List<VsphereStoragePoliciesResponse> 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 | ||||
|  | ||||
| @ -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<HostMO> hosts = _vmwareDatacenterService.listHostsInDatacenter(this); | ||||
|             List<BaseResponse> baseResponseList = new ArrayList<>(); | ||||
|             if (CollectionUtils.isNotEmpty(hosts)) { | ||||
|                 for (HostMO vmwareHost : hosts) { | ||||
|                     HostResponse resp = createHostResponse(vmwareHost); | ||||
|                     baseResponseList.add(resp); | ||||
|                 } | ||||
|             } | ||||
|             VmwareRequestResponse<BaseResponse> 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; | ||||
|     } | ||||
| } | ||||
| @ -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(); | ||||
| } | ||||
| @ -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<String, List<UnmanagedInstanceTO>> results = _vmwareDatacenterService.listVMsInDatacenter(this); | ||||
|             List<UnmanagedInstanceTO> vms = results.second(); | ||||
|             List<UnmanagedInstanceTO> vms = _vmwareDatacenterService.listVMsInDatacenter(this); | ||||
|             List<BaseResponse> 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<BaseResponse> response = new VmwareRequestResponse<>(); | ||||
|             response.setResponses(baseResponseList, baseResponseList.size()); | ||||
|             List<BaseResponse> pagingList = com.cloud.utils.StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); | ||||
|             if (CollectionUtils.isEmpty(pagingList)) { | ||||
|                 pagingList = baseResponseList; | ||||
|             } | ||||
|             ListResponse<BaseResponse> 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"; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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<? extends VmwareDatacenter> vmwareDcList; | ||||
|         List<? extends VmwareDatacenter> 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<VmwareDatacenterResponse> response = new ListResponse<>(); | ||||
|         List<VmwareDatacenterResponse> vmwareDcResponses = getVmwareDatacenterResponses(vmwareDcList); | ||||
|         response.setResponses(vmwareDcResponses); | ||||
|         response.setResponseName(getCommandName()); | ||||
|         setResponseObject(response); | ||||
|     } | ||||
|         ListResponse<VmwareDatacenterResponse> response = new ListResponse<VmwareDatacenterResponse>(); | ||||
|         List<VmwareDatacenterResponse> vmwareDcResponses = new ArrayList<VmwareDatacenterResponse>(); | ||||
| 
 | ||||
|     private List<VmwareDatacenterResponse> getVmwareDatacenterResponses(List<? extends VmwareDatacenter> vmwareDcList) { | ||||
|         List<VmwareDatacenterResponse> 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 | ||||
|  | ||||
| @ -71,13 +71,6 @@ public class ListVsphereStoragePoliciesCmd extends BaseCmd { | ||||
| 
 | ||||
|         List<? extends VsphereStoragePolicy> storagePolicies = _vmwareDatacenterService.listVsphereStoragePolicies(this); | ||||
|         final ListResponse<VsphereStoragePoliciesResponse> responseList = new ListResponse<>(); | ||||
|         final List<VsphereStoragePoliciesResponse> storagePoliciesResponseList = getVsphereStoragePoliciesResponses(storagePolicies, dataCenter); | ||||
|         responseList.setResponses(storagePoliciesResponseList); | ||||
|         responseList.setResponseName(getCommandName()); | ||||
|         setResponseObject(responseList); | ||||
|     } | ||||
| 
 | ||||
|     private static List<VsphereStoragePoliciesResponse> getVsphereStoragePoliciesResponses(List<? extends VsphereStoragePolicy> storagePolicies, DataCenter dataCenter) { | ||||
|         final List<VsphereStoragePoliciesResponse> 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 | ||||
|  | ||||
| @ -68,7 +68,7 @@ public class ListVsphereStoragePolicyCompatiblePoolsCmd extends BaseListCmd { | ||||
|         List<StoragePoolResponse> 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); | ||||
|  | ||||
| @ -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." | ||||
|  | ||||
| @ -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); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -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<T extends ResponseObject> extends ListResponse<T> { | ||||
|     @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; | ||||
|     } | ||||
| } | ||||
| @ -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<Integer, Integer> 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; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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") | ||||
|  | ||||
| @ -74,7 +74,6 @@ class TestData(object): | ||||
|                 "listApis": "allow", | ||||
|                 "listAccounts": "allow", | ||||
|                 "listClusters": "deny", | ||||
|                 "*VmwareDc*": "allow", | ||||
|                 "*VM*": "allow", | ||||
|                 "*Host*": "deny" | ||||
|             } | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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") | ||||
|  | ||||
| @ -1198,7 +1198,6 @@ export default { | ||||
|         } else { | ||||
|           params.existingvcenterid = this.selectedVmwareVcenter.existingvcenterid | ||||
|         } | ||||
|         params.host = this.selectedVmwareVcenter.host | ||||
|       } | ||||
| 
 | ||||
|       api(apiName, params).then(json => { | ||||
|  | ||||
| @ -129,33 +129,11 @@ | ||||
|           | ||||
|         <tooltip-label :title="$t('label.press.enter')" :tooltip="$t('label.press.enter.tooltip')"/> | ||||
|       </div> | ||||
|       <div | ||||
|         v-if="selectedExistingVcenterId || (vcenterSelectedOption === 'new')"> | ||||
|         <a-form-item :label="$t('label.esx.host')" ref="host" name="host" v-if="hosts.length > 0"> | ||||
|           <a-select | ||||
|             v-model:value="form.host" | ||||
|             :loading="loading" | ||||
|             optionFilterProp="label" | ||||
|             :filterOption="(input, option) => { | ||||
|               return  option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 | ||||
|             }" | ||||
|             :placeholder="$t('label.esx.host')" | ||||
|             @change="onSelectExistingVmwareHost"> | ||||
|             <a-select-option key="" label="">{{ }}</a-select-option> | ||||
|             <a-select-option v-for="opt in hosts" :key="opt.name"> | ||||
|                 {{ 'ESXi: ' + opt.name }} | ||||
|             </a-select-option> | ||||
|           </a-select> | ||||
|         </a-form-item> | ||||
|         <div v-else> | ||||
|           {{ $t('message.list.zone.vmware.hosts.empty') }} | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="card-footer"> | ||||
|         <a-button | ||||
|           v-if="vcenterSelectedOption == 'existing' || vcenterSelectedOption == 'new'" | ||||
|           :disabled="(vcenterSelectedOption === 'new' && (vcenter === '' || datacentername === '' || username === '' || password === '')) || | ||||
|             (vcenterSelectedOption === 'existing' && selectedExistingVcenterId === '') && host === ''" | ||||
|             (vcenterSelectedOption === 'existing' && selectedExistingVcenterId === '')" | ||||
|           :loading="loading" | ||||
|           type="primary" | ||||
|           @click="listVmwareDatacenterVms">{{ $t('label.list.vmware.vcenter.vms') }}</a-button> | ||||
| @ -186,8 +164,6 @@ export default { | ||||
|       zones: {}, | ||||
|       vcenterSelectedOption: '', | ||||
|       existingvcenter: [], | ||||
|       hosts: [], | ||||
|       selectedHost: '', | ||||
|       selectedExistingVcenterId: '', | ||||
|       selectedPoweredOnVm: false, | ||||
|       vmwareDcVms: [], | ||||
| @ -251,7 +227,6 @@ export default { | ||||
|       } else { | ||||
|         params.existingvcenterid = this.selectedExistingVcenterId | ||||
|       } | ||||
|       params.host = this.selectedHost | ||||
|       api('listVmwareDcVms', params).then(json => { | ||||
|         const obj = { | ||||
|           params: params, | ||||
| @ -281,8 +256,8 @@ export default { | ||||
|     listZoneVmwareDcs () { | ||||
|       this.loading = true | ||||
|       api('listVmwareDcs', { zoneid: this.sourcezoneid }).then(response => { | ||||
|         if (response.listvmwaredcsresponse.vmwaredc && response.listvmwaredcsresponse.vmwaredc.length > 0) { | ||||
|           this.existingvcenter = response.listvmwaredcsresponse.vmwaredc | ||||
|         if (response.listvmwaredcsresponse.VMwareDC && response.listvmwaredcsresponse.VMwareDC.length > 0) { | ||||
|           this.existingvcenter = response.listvmwaredcsresponse.VMwareDC | ||||
|         } | ||||
|       }).catch(error => { | ||||
|         this.$notifyError(error) | ||||
| @ -290,43 +265,8 @@ export default { | ||||
|         this.loading = false | ||||
|       }) | ||||
|     }, | ||||
|     loadZoneVmwareDcHosts (doNotify) { | ||||
|       this.loading = true | ||||
|       const params = {} | ||||
|       if (this.vcenterSelectedOption === 'new') { | ||||
|         params.datacentername = this.datacenter | ||||
|         params.vcenter = this.vcenter | ||||
|         params.username = this.username | ||||
|         params.password = this.password | ||||
|       } else { | ||||
|         params.existingvcenterid = this.selectedExistingVcenterId | ||||
|       } | ||||
|       api('listVmwareDcHosts', params).then(response => { | ||||
|         if (response.listvmwaredchostsresponse.host && response.listvmwaredchostsresponse.host.length > 0) { | ||||
|           this.hosts = response.listvmwaredchostsresponse.host | ||||
|         } | ||||
|       }).catch(error => { | ||||
|         if (doNotify) { | ||||
|           this.$notifyError(error) | ||||
|         } | ||||
|         this.hosts = [] | ||||
|         return false | ||||
|       }).finally(() => { | ||||
|         this.loading = false | ||||
|         return true | ||||
|       }) | ||||
|     }, | ||||
|     onSelectExistingVmwareDatacenter (value) { | ||||
|       this.selectedExistingVcenterId = value | ||||
|       this.loadZoneVmwareDcHosts(true) | ||||
|     }, | ||||
|     onSelectExternalVmwareDatacenter (value) { | ||||
|       if (this.vcenterSelectedOption === 'new' && !(this.vcenter === '' || this.datacentername === '' || this.username === '' || this.password === '')) { | ||||
|         this.loadZoneVmwareDcHosts(false) | ||||
|       } | ||||
|     }, | ||||
|     onSelectExistingVmwareHost (value) { | ||||
|       this.selectedHost = value | ||||
|     }, | ||||
|     onVcenterTypeChange () { | ||||
|       this.$emit('onVcenterTypeChanged', this.vcenterSelectedOption) | ||||
|  | ||||
| @ -19,23 +19,11 @@ package com.cloud.hypervisor.vmware.mo; | ||||
| import org.apache.logging.log4j.Logger; | ||||
| import org.apache.logging.log4j.LogManager; | ||||
| 
 | ||||
| import com.cloud.hypervisor.vmware.util.VmwareHelper; | ||||
| import com.cloud.hypervisor.vmware.util.VmwareContext; | ||||
| import com.cloud.utils.Pair; | ||||
| import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; | ||||
| import org.apache.cloudstack.vm.UnmanagedInstanceTO; | ||||
| 
 | ||||
| import com.vmware.vim25.CustomFieldDef; | ||||
| import com.vmware.vim25.CustomFieldStringValue; | ||||
| import com.vmware.vim25.ManagedObjectReference; | ||||
| import com.vmware.vim25.InvalidPropertyFaultMsg; | ||||
| import com.vmware.vim25.RuntimeFaultFaultMsg; | ||||
| import com.vmware.vim25.ObjectContent; | ||||
| import com.vmware.vim25.RetrieveResult; | ||||
| 
 | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class BaseMO { | ||||
|     protected static Logger logger = LogManager.getLogger(BaseMO.class); | ||||
| @ -63,18 +51,6 @@ public class BaseMO { | ||||
|         _mor.setValue(morValue); | ||||
|     } | ||||
| 
 | ||||
|     protected static Pair<String, List<ObjectContent>> createReturnObjectPair(RetrieveResult result) { | ||||
|         if (logger.isDebugEnabled()) { | ||||
|             logger.debug("vmware result : {} ", ReflectionToStringBuilderUtils.reflectCollection(result)); | ||||
|         } | ||||
|         if (result == null) { | ||||
|             return new Pair<>(null, new ArrayList<>()); | ||||
|         } | ||||
|         String tokenForRetrievingNewResults = result.getToken(); | ||||
|         List<ObjectContent> listOfObjects = result.getObjects(); | ||||
|         return new Pair<>(tokenForRetrievingNewResults, listOfObjects); | ||||
|     } | ||||
| 
 | ||||
|     public VmwareContext getContext() { | ||||
|         return _context; | ||||
|     } | ||||
| @ -162,11 +138,11 @@ public class BaseMO { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public int getCustomFieldKey(String fieldName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|     public int getCustomFieldKey(String fieldName) throws Exception { | ||||
|         return getCustomFieldKey(getMor().getType(), fieldName); | ||||
|     } | ||||
| 
 | ||||
|     public int getCustomFieldKey(String morType, String fieldName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|     public int getCustomFieldKey(String morType, String fieldName) throws Exception { | ||||
|         assert (morType != null); | ||||
| 
 | ||||
|         ManagedObjectReference cfmMor = _context.getServiceContent().getCustomFieldsManager(); | ||||
| @ -178,30 +154,4 @@ public class BaseMO { | ||||
| 
 | ||||
|         return cfmMo.getCustomFieldKey(morType, fieldName); | ||||
|     } | ||||
| 
 | ||||
|     protected Pair<String, List<ObjectContent>> retrieveNextSetOfProperties(String tokenForPriorQuery) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|         RetrieveResult result = _context.getService().continueRetrievePropertiesEx(_context.getPropertyCollector(), tokenForPriorQuery); | ||||
|         return BaseMO.createReturnObjectPair(result); | ||||
|     } | ||||
| 
 | ||||
|     protected void objectContentToUnmanagedInstanceTO(Pair<String, List<ObjectContent>> objectContents, List<UnmanagedInstanceTO> vms) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|         List<ObjectContent> ocs = objectContents.second(); | ||||
|         if (ocs != null) { | ||||
|             for (ObjectContent oc : ocs) { | ||||
|                 ManagedObjectReference vmMor = oc.getObj(); | ||||
|                 if (vmMor != null) { | ||||
|                     VirtualMachineMO vmMo = new VirtualMachineMO(_context, vmMor); | ||||
|                     try { | ||||
|                         if (!vmMo.isTemplate()) { | ||||
|                             HostMO hostMO = vmMo.getRunningHost(); | ||||
|                             UnmanagedInstanceTO unmanagedInstance = VmwareHelper.getUnmanagedInstance(hostMO, vmMo); | ||||
|                             vms.add(unmanagedInstance); | ||||
|                         } | ||||
|                     } catch (Exception e) { | ||||
|                         logger.debug("Unexpected error checking unmanaged instance {}, excluding it: {}", vmMo.getVmName(), e.getMessage(), e); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -16,14 +16,11 @@ | ||||
| // under the License. | ||||
| package com.cloud.hypervisor.vmware.mo; | ||||
| 
 | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import com.vmware.vim25.CustomFieldDef; | ||||
| import com.vmware.vim25.ManagedObjectReference; | ||||
| import com.vmware.vim25.PrivilegePolicyDef; | ||||
| import com.vmware.vim25.InvalidPropertyFaultMsg; | ||||
| import com.vmware.vim25.RuntimeFaultFaultMsg; | ||||
| 
 | ||||
| import com.cloud.hypervisor.vmware.util.VmwareContext; | ||||
| 
 | ||||
| @ -53,12 +50,12 @@ public class CustomFieldsManagerMO extends BaseMO { | ||||
|         _context.getService().setField(getMor(), morEntity, key, value); | ||||
|     } | ||||
| 
 | ||||
|     public List<CustomFieldDef> getFields() throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|     public List<CustomFieldDef> getFields() throws Exception { | ||||
|         return _context.getVimClient().getDynamicProperty(getMor(), "field"); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int getCustomFieldKey(String morType, String fieldName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|     public int getCustomFieldKey(String morType, String fieldName) throws Exception { | ||||
|         List<CustomFieldDef> fields = getFields(); | ||||
|         if (fields != null) { | ||||
|             for (CustomFieldDef field : fields) { | ||||
|  | ||||
| @ -17,12 +17,11 @@ | ||||
| 
 | ||||
| package com.cloud.hypervisor.vmware.mo; | ||||
| 
 | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import com.cloud.utils.StringUtils; | ||||
| import com.cloud.hypervisor.vmware.util.VmwareHelper; | ||||
| import org.apache.cloudstack.vm.UnmanagedInstanceTO; | ||||
| import org.apache.commons.collections.CollectionUtils; | ||||
| 
 | ||||
| @ -39,10 +38,6 @@ import com.vmware.vim25.PropertySpec; | ||||
| import com.vmware.vim25.SelectionSpec; | ||||
| import com.vmware.vim25.TraversalSpec; | ||||
| import com.vmware.vim25.VirtualEthernetCardDistributedVirtualPortBackingInfo; | ||||
| import com.vmware.vim25.RetrieveOptions; | ||||
| import com.vmware.vim25.RetrieveResult; | ||||
| import com.vmware.vim25.InvalidPropertyFaultMsg; | ||||
| import com.vmware.vim25.RuntimeFaultFaultMsg; | ||||
| 
 | ||||
| import com.cloud.hypervisor.vmware.util.VmwareContext; | ||||
| import com.cloud.utils.Pair; | ||||
| @ -57,7 +52,7 @@ public class DatacenterMO extends BaseMO { | ||||
|         super(context, morType, morValue); | ||||
|     } | ||||
| 
 | ||||
|     public DatacenterMO(VmwareContext context, String dcName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|     public DatacenterMO(VmwareContext context, String dcName) throws Exception { | ||||
|         super(context, null); | ||||
| 
 | ||||
|         _mor = _context.getVimClient().getDecendentMoRef(_context.getRootFolder(), "Datacenter", dcName); | ||||
| @ -67,8 +62,25 @@ public class DatacenterMO extends BaseMO { | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String getName() throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|         return _context.getVimClient().getDynamicProperty(_mor, "name"); | ||||
|     public String getName() throws Exception { | ||||
|         return (String)_context.getVimClient().getDynamicProperty(_mor, "name"); | ||||
|     } | ||||
| 
 | ||||
|     public void registerTemplate(ManagedObjectReference morHost, String datastoreName, String templateName, String templateFileName) throws Exception { | ||||
| 
 | ||||
|         ManagedObjectReference morFolder = (ManagedObjectReference)_context.getVimClient().getDynamicProperty(_mor, "vmFolder"); | ||||
|         assert (morFolder != null); | ||||
| 
 | ||||
|         ManagedObjectReference morTask = | ||||
|             _context.getService() | ||||
|                 .registerVMTask(morFolder, String.format("[%s] %s/%s", datastoreName, templateName, templateFileName), templateName, true, null, morHost); | ||||
| 
 | ||||
|         boolean result = _context.getVimClient().waitForTask(morTask); | ||||
|         if (!result) { | ||||
|             throw new Exception("Unable to register template due to " + TaskMO.getTaskFailureInfo(_context, morTask)); | ||||
|         } else { | ||||
|             _context.waitForTaskProgressDone(morTask); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public VirtualMachineMO findVm(String vmName) throws Exception { | ||||
| @ -77,7 +89,7 @@ public class DatacenterMO extends BaseMO { | ||||
|             logger.warn("Custom field " + CustomFieldConstants.CLOUD_VM_INTERNAL_NAME + " is not registered ?!"); | ||||
|         } | ||||
|         String instanceNameCustomField = "value[" + key + "]"; | ||||
|         List<ObjectContent> ocs = getVmProperties(new String[] {"name", instanceNameCustomField}); | ||||
|         List<ObjectContent> ocs = getVmPropertiesOnDatacenterVmFolder(new String[] {"name", instanceNameCustomField}); | ||||
|         return HypervisorHostHelper.findVmFromObjectContent(_context, ocs.toArray(new ObjectContent[0]), vmName, instanceNameCustomField); | ||||
|     } | ||||
| 
 | ||||
| @ -86,10 +98,10 @@ public class DatacenterMO extends BaseMO { | ||||
|         int key = cfmMo.getCustomFieldKey("VirtualMachine", CustomFieldConstants.CLOUD_UUID); | ||||
|         assert (key != 0); | ||||
| 
 | ||||
|         List<VirtualMachineMO> list = new ArrayList<>(); | ||||
|         List<VirtualMachineMO> list = new ArrayList<VirtualMachineMO>(); | ||||
| 
 | ||||
|         List<ObjectContent> ocs = getVmProperties(new String[] {"name", String.format("value[%d]", key)}); | ||||
|         if (CollectionUtils.isNotEmpty(ocs)) { | ||||
|         List<ObjectContent> ocs = getVmPropertiesOnDatacenterVmFolder(new String[] {"name", String.format("value[%d]", key)}); | ||||
|         if (ocs != null && ocs.size() > 0) { | ||||
|             for (ObjectContent oc : ocs) { | ||||
|                 List<DynamicProperty> props = oc.getPropSet(); | ||||
|                 if (props != null) { | ||||
| @ -121,8 +133,8 @@ public class DatacenterMO extends BaseMO { | ||||
|             logger.warn("Custom field " + CustomFieldConstants.CLOUD_VM_INTERNAL_NAME + " is not registered ?!"); | ||||
|         } | ||||
| 
 | ||||
|         List<ObjectContent> ocs = getVmProperties(new String[] {"name", String.format("value[%d]", key)}); | ||||
|         if (CollectionUtils.isNotEmpty(ocs)) { | ||||
|         List<ObjectContent> ocs = getVmPropertiesOnDatacenterVmFolder(new String[] {"name", String.format("value[%d]", key)}); | ||||
|         if (ocs != null && ocs.size() > 0) { | ||||
|             for (ObjectContent oc : ocs) { | ||||
|                 List<DynamicProperty> props = oc.getPropSet(); | ||||
|                 if (props != null) { | ||||
| @ -147,18 +159,31 @@ public class DatacenterMO extends BaseMO { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public Pair<String, List<UnmanagedInstanceTO>> getVms(Integer maxObjects, String token) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|     public List<UnmanagedInstanceTO> getAllVmsOnDatacenter() throws Exception { | ||||
|         List<UnmanagedInstanceTO> vms = new ArrayList<>(); | ||||
|         Pair<String, List<ObjectContent>> objectContents = getVmProperties(new String[] {"name"}, maxObjects, token); | ||||
|         logger.debug("returning token {} for future retrievals, currently {} objects retrieved.", objectContents.first(), objectContents.second().size()); | ||||
|         Pair<String, List<UnmanagedInstanceTO>> retval = new Pair<>(objectContents.first(), vms); | ||||
| 
 | ||||
|         objectContentToUnmanagedInstanceTO(objectContents, vms); | ||||
| 
 | ||||
|         return retval; | ||||
|         List<ObjectContent> ocs = getVmPropertiesOnDatacenterVmFolder(new String[] {"name"}); | ||||
|         if (ocs != null) { | ||||
|             for (ObjectContent oc : ocs) { | ||||
|                 ManagedObjectReference vmMor = oc.getObj(); | ||||
|                 if (vmMor != null) { | ||||
|                     VirtualMachineMO vmMo = new VirtualMachineMO(_context, vmMor); | ||||
|                     try { | ||||
|                         if (!vmMo.isTemplate()) { | ||||
|                             HostMO hostMO = vmMo.getRunningHost(); | ||||
|                             UnmanagedInstanceTO unmanagedInstance = VmwareHelper.getUnmanagedInstance(hostMO, vmMo); | ||||
|                             vms.add(unmanagedInstance); | ||||
|                         } | ||||
|                     } catch (Exception e) { | ||||
|                         logger.debug(String.format("Unexpected error checking unmanaged instance %s, excluding it: %s", vmMo.getVmName(), e.getMessage()), e); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|     public List<HostMO> getAllHostsOnDatacenter() throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|         return vms; | ||||
|     } | ||||
| 
 | ||||
|     public List<HostMO> getAllHostsOnDatacenter() throws Exception { | ||||
|         List<HostMO> hosts = new ArrayList<>(); | ||||
| 
 | ||||
|         List<ObjectContent> ocs = getHostPropertiesOnDatacenterHostFolder(new String[] {"name"}); | ||||
| @ -185,7 +210,21 @@ public class DatacenterMO extends BaseMO { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public ManagedObjectReference findHost(String name) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|     public ManagedObjectReference listDatastore(String name) throws Exception { | ||||
|         assert (name != null); | ||||
| 
 | ||||
|         List<ObjectContent> ocs = getDatastorePropertiesOnDatacenter(new String[] {"name"}); | ||||
|         if (ocs != null) { | ||||
|             for (ObjectContent oc : ocs) { | ||||
|                 if (oc.getPropSet().get(0).getVal().toString().equals(name)) { | ||||
|                     return oc.getObj(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public ManagedObjectReference findHost(String name) throws Exception { | ||||
|         List<ObjectContent> ocs = getHostPropertiesOnDatacenterHostFolder(new String[] {"name"}); | ||||
| 
 | ||||
|         if (ocs != null) { | ||||
| @ -199,10 +238,10 @@ public class DatacenterMO extends BaseMO { | ||||
|     } | ||||
| 
 | ||||
|     public ManagedObjectReference getVmFolder() throws Exception { | ||||
|         return _context.getVimClient().getDynamicProperty(_mor, "vmFolder"); | ||||
|         return (ManagedObjectReference)_context.getVimClient().getDynamicProperty(_mor, "vmFolder"); | ||||
|     } | ||||
| 
 | ||||
|     public List<ObjectContent> getHostPropertiesOnDatacenterHostFolder(String[] propertyPaths) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|     public List<ObjectContent> getHostPropertiesOnDatacenterHostFolder(String[] propertyPaths) throws Exception { | ||||
|         PropertySpec pSpec = new PropertySpec(); | ||||
|         pSpec.setType("HostSystem"); | ||||
|         pSpec.getPathSet().addAll(Arrays.asList(propertyPaths)); | ||||
| @ -236,7 +275,7 @@ public class DatacenterMO extends BaseMO { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         return _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); | ||||
| @ -262,37 +301,14 @@ public class DatacenterMO extends BaseMO { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         return _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public List<ObjectContent> getVmProperties(String[] propertyPaths) throws  InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|         return getVmProperties(propertyPaths, null, null).second(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * @param propertyPaths Vmware side property names to query, for instance {"name"} | ||||
|      * @param maxObjects the number of objects to retrieve | ||||
|      * @param tokenForPriorQuery restart the query or continue a previous query | ||||
|      * @return The propertyPaths requested for the objects of type "VirtualMachine" in a list are found/returned by the DC | ||||
|      * @throws InvalidPropertyFaultMsg property does not exist as thrown by Vmware. | ||||
|      * @throws RuntimeFaultFaultMsg generic vmware runtime exception | ||||
|      */ | ||||
|     public Pair<String, List<ObjectContent>> getVmProperties(String[] propertyPaths, Integer maxObjects, String tokenForPriorQuery) throws  InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|         if(StringUtils.isNotBlank(tokenForPriorQuery)) { | ||||
|             logger.debug("running repeat query with token '{}'", tokenForPriorQuery); | ||||
|             return retrieveNextSetOfProperties(tokenForPriorQuery); | ||||
|         } else { | ||||
|             logger.debug("running query for {} propertypaths and max {} objects", propertyPaths.length, maxObjects); | ||||
|             return retrieveNextSetOfProperties(propertyPaths, maxObjects); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private Pair<String, List<ObjectContent>> retrieveNextSetOfProperties(String[] propertyPaths, Integer maxObjects) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|     public List<ObjectContent> getVmPropertiesOnDatacenterVmFolder(String[] propertyPaths) throws Exception { | ||||
|         PropertySpec pSpec = new PropertySpec(); | ||||
|         pSpec.setType("VirtualMachine"); | ||||
|         pSpec.getPathSet().addAll(Arrays.asList(propertyPaths)); | ||||
| @ -320,16 +336,10 @@ public class DatacenterMO extends BaseMO { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         RetrieveOptions ro = new RetrieveOptions(); | ||||
|         if (maxObjects != null && maxObjects > 0) { | ||||
|             ro.setMaxObjects(maxObjects); | ||||
|         } | ||||
| 
 | ||||
|         RetrieveResult result = _context.getService().retrievePropertiesEx(_context.getPropertyCollector(), pfSpecArr, ro); | ||||
|         return createReturnObjectPair(result); | ||||
|         return _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); | ||||
|     } | ||||
| 
 | ||||
|     public static Pair<DatacenterMO, String> getOwnerDatacenter(VmwareContext context, ManagedObjectReference morEntity) throws Exception { | ||||
| @ -354,18 +364,18 @@ public class DatacenterMO extends BaseMO { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         List<ObjectContent> ocs = context.getService().retrieveProperties(context.getPropertyCollector(), pfSpecArr); | ||||
| 
 | ||||
|         assert (CollectionUtils.isNotEmpty(ocs)); | ||||
|         assert (ocs != null && ocs.size() > 0); | ||||
|         assert (ocs.get(0).getObj() != null); | ||||
|         assert (ocs.get(0).getPropSet().get(0) != null); | ||||
|         assert (ocs.get(0).getPropSet().get(0).getVal() != null); | ||||
| 
 | ||||
|         String dcName = ocs.get(0).getPropSet().get(0).getVal().toString(); | ||||
|         return new Pair<>(new DatacenterMO(context, ocs.get(0).getObj()), dcName); | ||||
|         return new Pair<DatacenterMO, String>(new DatacenterMO(context, ocs.get(0).getObj()), dcName); | ||||
|     } | ||||
| 
 | ||||
|     public ManagedObjectReference getDvPortGroupMor(String dvPortGroupName) throws Exception { | ||||
| @ -386,7 +396,7 @@ public class DatacenterMO extends BaseMO { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         List<ObjectContent> ocs = _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); | ||||
| @ -407,7 +417,9 @@ public class DatacenterMO extends BaseMO { | ||||
| 
 | ||||
|     public boolean hasDvPortGroup(String dvPortGroupName) throws Exception { | ||||
|         ManagedObjectReference morNetwork = getDvPortGroupMor(dvPortGroupName); | ||||
|         return morNetwork != null; | ||||
|         if (morNetwork != null) | ||||
|             return true; | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     public DVPortgroupConfigInfo getDvPortGroupSpec(String dvPortGroupName) throws Exception { | ||||
| @ -431,7 +443,7 @@ public class DatacenterMO extends BaseMO { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         List<ObjectContent> ocs = _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); | ||||
| @ -448,7 +460,7 @@ public class DatacenterMO extends BaseMO { | ||||
|                             nameProperty = prop.getVal().toString(); | ||||
|                         } | ||||
|                     } | ||||
|                     if (nameProperty != null && nameProperty.equalsIgnoreCase(dvPortGroupName)) { | ||||
|                     if (nameProperty.equalsIgnoreCase(dvPortGroupName)) { | ||||
|                         return configSpec; | ||||
|                     } | ||||
|                 } | ||||
| @ -478,7 +490,7 @@ public class DatacenterMO extends BaseMO { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         List<ObjectContent> ocs = _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); | ||||
| @ -506,7 +518,7 @@ public class DatacenterMO extends BaseMO { | ||||
| 
 | ||||
|     public String getDvSwitchUuid(ManagedObjectReference dvSwitchMor) throws Exception { | ||||
|         assert (dvSwitchMor != null); | ||||
|         return _context.getVimClient().getDynamicProperty(dvSwitchMor, "uuid"); | ||||
|         return (String)_context.getVimClient().getDynamicProperty(dvSwitchMor, "uuid"); | ||||
|     } | ||||
| 
 | ||||
|     public VirtualEthernetCardDistributedVirtualPortBackingInfo getDvPortBackingInfo(Pair<ManagedObjectReference, String> networkInfo) throws Exception { | ||||
| @ -524,8 +536,8 @@ public class DatacenterMO extends BaseMO { | ||||
|     } | ||||
| 
 | ||||
|     public ManagedObjectReference getDvSwitchMor(String dvSwitchName) throws Exception { | ||||
|         ManagedObjectReference dvSwitchMor; | ||||
|         ManagedObjectReference networkFolderMor; | ||||
|         ManagedObjectReference dvSwitchMor = null; | ||||
|         ManagedObjectReference networkFolderMor = null; | ||||
|         networkFolderMor = _context.getVimClient().getMoRefProp(_mor, "networkFolder"); | ||||
|         dvSwitchMor = _context.getVimClient().getDecendentMoRef(networkFolderMor, "VmwareDistributedVirtualSwitch", dvSwitchName); | ||||
|         return dvSwitchMor; | ||||
| @ -537,6 +549,7 @@ public class DatacenterMO extends BaseMO { | ||||
|     } | ||||
| 
 | ||||
|     public DatacenterConfigInfo getDatacenterConfigInfo() throws Exception { | ||||
|         return _context.getVimClient().getDynamicProperty(_mor, "configuration"); | ||||
|         DatacenterConfigInfo configInfo = (DatacenterConfigInfo)_context.getVimClient().getDynamicProperty(_mor, "configuration"); | ||||
|         return configInfo; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -16,7 +16,6 @@ | ||||
| // under the License. | ||||
| package com.cloud.hypervisor.vmware.mo; | ||||
| 
 | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collection; | ||||
| @ -25,19 +24,10 @@ import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.regex.Pattern; | ||||
| 
 | ||||
| import org.apache.cloudstack.vm.UnmanagedInstanceTO; | ||||
| 
 | ||||
| import com.cloud.hypervisor.vmware.util.VmwareClientException; | ||||
| import com.cloud.hypervisor.vmware.util.VmwareContext; | ||||
| import com.cloud.hypervisor.vmware.util.VmwareHelper; | ||||
| import com.cloud.utils.LogUtils; | ||||
| import com.cloud.utils.Pair; | ||||
| import com.cloud.utils.StringUtils; | ||||
| 
 | ||||
| import org.apache.commons.collections.CollectionUtils; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| 
 | ||||
| import com.google.gson.Gson; | ||||
| 
 | ||||
| import com.vmware.vim25.AboutInfo; | ||||
| import com.vmware.vim25.AlreadyExistsFaultMsg; | ||||
| import com.vmware.vim25.ClusterDasConfigInfo; | ||||
| @ -67,7 +57,6 @@ import com.vmware.vim25.HostRuntimeInfo; | ||||
| import com.vmware.vim25.HostSystemConnectionState; | ||||
| import com.vmware.vim25.HostVirtualNic; | ||||
| import com.vmware.vim25.HostVirtualSwitch; | ||||
| import com.vmware.vim25.InvalidPropertyFaultMsg; | ||||
| import com.vmware.vim25.ManagedObjectReference; | ||||
| import com.vmware.vim25.NasDatastoreInfo; | ||||
| import com.vmware.vim25.ObjectContent; | ||||
| @ -75,12 +64,13 @@ import com.vmware.vim25.ObjectSpec; | ||||
| import com.vmware.vim25.OptionValue; | ||||
| import com.vmware.vim25.PropertyFilterSpec; | ||||
| import com.vmware.vim25.PropertySpec; | ||||
| import com.vmware.vim25.RetrieveOptions; | ||||
| import com.vmware.vim25.RetrieveResult; | ||||
| import com.vmware.vim25.RuntimeFaultFaultMsg; | ||||
| import com.vmware.vim25.TraversalSpec; | ||||
| import com.vmware.vim25.VirtualMachineConfigSpec; | ||||
| import com.vmware.vim25.VirtualNicManagerNetConfig; | ||||
| import com.cloud.hypervisor.vmware.util.VmwareContext; | ||||
| import com.cloud.hypervisor.vmware.util.VmwareHelper; | ||||
| import com.cloud.utils.LogUtils; | ||||
| import com.cloud.utils.Pair; | ||||
| 
 | ||||
| public class HostMO extends BaseMO implements VmwareHypervisorHost { | ||||
|     Map<String, VirtualMachineMO> _vmCache = new HashMap<>(); | ||||
| @ -542,23 +532,19 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public String getHostName() throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|         return _context.getVimClient().getDynamicProperty(_mor, "name"); | ||||
|     public String getHostName() throws Exception { | ||||
|         return (String)_context.getVimClient().getDynamicProperty(_mor, "name"); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public synchronized List<VirtualMachineMO> listVmsOnHyperHostWithHypervisorName(String vmName) throws VmwareClientException { | ||||
|     public synchronized List<VirtualMachineMO> listVmsOnHyperHostWithHypervisorName(String vmName) throws Exception { | ||||
|         List<VirtualMachineMO> vms = new ArrayList<>(); | ||||
|         try { | ||||
|         if (StringUtils.isNotEmpty(vmName)) { | ||||
|             vms.add(findVmOnHyperHostWithHypervisorName(vmName)); | ||||
|         } else { | ||||
|             loadVmCache(); | ||||
|             vms.addAll(_vmCache.values()); | ||||
|         } | ||||
|         } catch (InvalidPropertyFaultMsg | RuntimeFaultFaultMsg | InvocationTargetException | NoSuchMethodException | IllegalAccessException e) { | ||||
|             throw new VmwareClientException("problem loading vm cache.", e); | ||||
|         } | ||||
|         return vms; | ||||
|     } | ||||
| 
 | ||||
| @ -593,7 +579,8 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void loadVmCache() throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|     private void loadVmCache() throws Exception { | ||||
|         if (logger.isDebugEnabled()) | ||||
|             logger.debug("load VM cache on host"); | ||||
| 
 | ||||
|         _vmCache.clear(); | ||||
| @ -714,16 +701,11 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public ObjectContent[] getVmPropertiesOnHyperHost(String[] propertyPaths) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|         List<ObjectContent> properties = getVmProperties(propertyPaths, null).second(); | ||||
|         return properties.toArray(new ObjectContent[properties.size()]); | ||||
|     } | ||||
| 
 | ||||
|     public Pair<String, List<ObjectContent>> getVmProperties(String[] propertyPaths, Integer maxObjects) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|         if (logger.isTraceEnabled()) { | ||||
|     public ObjectContent[] getVmPropertiesOnHyperHost(String[] propertyPaths) throws Exception { | ||||
|         if (logger.isTraceEnabled()) | ||||
|             logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getValue() + ", properties: " + | ||||
|                     new Gson().toJson(propertyPaths)); | ||||
|         } | ||||
| 
 | ||||
|         PropertySpec pSpec = new PropertySpec(); | ||||
|         pSpec.setType("VirtualMachine"); | ||||
|         pSpec.getPathSet().addAll(Arrays.asList(propertyPaths)); | ||||
| @ -741,18 +723,14 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         RetrieveOptions ro = new RetrieveOptions(); | ||||
|         if (maxObjects != null && maxObjects > 0) { | ||||
|             ro.setMaxObjects(maxObjects); | ||||
|         } | ||||
| 
 | ||||
|         RetrieveResult result = _context.getService().retrievePropertiesEx(_context.getPropertyCollector(), pfSpecArr, ro); | ||||
|         List<ObjectContent> properties = _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); | ||||
| 
 | ||||
|         if (logger.isTraceEnabled()) | ||||
|             logger.trace("vCenter API trace - retrieveProperties() done"); | ||||
|         return createReturnObjectPair(result); | ||||
|         return properties.toArray(new ObjectContent[properties.size()]); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -778,7 +756,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { | ||||
|         PropertyFilterSpec pfSpec = new PropertyFilterSpec(); | ||||
|         pfSpec.getPropSet().add(pSpec); | ||||
|         pfSpec.getObjectSet().add(oSpec); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); | ||||
|         List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); | ||||
|         pfSpecArr.add(pfSpec); | ||||
| 
 | ||||
|         List<ObjectContent> properties = _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); | ||||
| @ -1337,8 +1315,9 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     private synchronized VirtualMachineMO findVmOnHyperHostWithHypervisorName(String vmName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|             logger.debug("find VM hypervisor name: {} on host", vmName ); | ||||
|     private synchronized VirtualMachineMO findVmOnHyperHostWithHypervisorName(String vmName) throws Exception { | ||||
|         if (logger.isDebugEnabled()) | ||||
|             logger.debug("find VM hypervisor name: " + vmName + " on host"); | ||||
| 
 | ||||
|         VirtualMachineMO vmMo = getVmWithHypervisorName(_vmCache.values(), vmName); | ||||
|         if (vmMo != null) { | ||||
| @ -1367,25 +1346,4 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public Pair<String, List<UnmanagedInstanceTO>> getVms(Integer maxObjects, String token) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException { | ||||
|         List<UnmanagedInstanceTO> vms = new ArrayList<>(); | ||||
|         Pair<String, List<ObjectContent>> objectContents = getVmProperties(new String[] {"name"}, maxObjects, token); | ||||
|         logger.debug("returning token {} for future retrievals, currently {} objects retrieved.", objectContents.first(), objectContents.second().size()); | ||||
|         Pair<String, List<UnmanagedInstanceTO>> retval = new Pair<>(objectContents.first(), vms); | ||||
| 
 | ||||
|         objectContentToUnmanagedInstanceTO(objectContents, vms); | ||||
| 
 | ||||
|         return retval; | ||||
|     } | ||||
| 
 | ||||
|     public Pair<String, List<ObjectContent>> getVmProperties(String[] propertyPaths, Integer maxObjects, String tokenForPriorQuery) throws  InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|         if(com.cloud.utils.StringUtils.isNotBlank(tokenForPriorQuery)) { | ||||
|             logger.debug("running repeat query with token '{}'", tokenForPriorQuery); | ||||
|             return retrieveNextSetOfProperties(tokenForPriorQuery); | ||||
|         } else { | ||||
|             logger.debug("running query for {} propertypaths and max {} objects", propertyPaths.length, maxObjects); | ||||
|             return getVmProperties(propertyPaths, maxObjects); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -16,10 +16,8 @@ | ||||
| // under the License. | ||||
| package com.cloud.hypervisor.vmware.util; | ||||
| 
 | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.lang.reflect.Method; | ||||
| import java.net.URI; | ||||
| import java.net.URISyntaxException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collections; | ||||
| @ -38,6 +36,7 @@ import javax.xml.ws.handler.Handler; | ||||
| import javax.xml.ws.handler.HandlerResolver; | ||||
| import javax.xml.ws.handler.PortInfo; | ||||
| 
 | ||||
| 
 | ||||
| import org.apache.cloudstack.utils.security.SSLUtils; | ||||
| import org.apache.cloudstack.utils.security.SecureSSLSocketFactory; | ||||
| 
 | ||||
| @ -54,10 +53,7 @@ import org.apache.logging.log4j.LogManager; | ||||
| 
 | ||||
| import com.vmware.vim25.DynamicProperty; | ||||
| import com.vmware.vim25.InvalidCollectorVersionFaultMsg; | ||||
| import com.vmware.vim25.InvalidLocaleFaultMsg; | ||||
| import com.vmware.vim25.InvalidLoginFaultMsg; | ||||
| import com.vmware.vim25.InvalidPropertyFaultMsg; | ||||
| import com.vmware.vim25.InvalidStateFaultMsg; | ||||
| import com.vmware.vim25.LocalizedMethodFault; | ||||
| import com.vmware.vim25.ManagedObjectReference; | ||||
| import com.vmware.vim25.MethodFault; | ||||
| @ -164,7 +160,7 @@ public class VmwareClient { | ||||
|      * @throws Exception | ||||
|      *             the exception | ||||
|      */ | ||||
|     public void connect(String url, String userName, String password) throws RuntimeFaultFaultMsg, URISyntaxException, VmwareClientException, InvalidLocaleFaultMsg, InvalidLoginFaultMsg { | ||||
|     public void connect(String url, String userName, String password) throws Exception { | ||||
|         svcInstRef.setType(SVC_INST_NAME); | ||||
|         svcInstRef.setValue(SVC_INST_NAME); | ||||
| 
 | ||||
| @ -194,7 +190,7 @@ public class VmwareClient { | ||||
|             if (cookies == null) { | ||||
|                 String msg = "Login successful, but failed to get server cookies from url :[" + url + "]"; | ||||
|                 LOGGER.error(msg); | ||||
|                 throw new  VmwareClientException(msg); | ||||
|                 throw new Exception(msg); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -210,7 +206,7 @@ public class VmwareClient { | ||||
|         isConnected = true; | ||||
|     } | ||||
| 
 | ||||
|     private void pbmConnect(String url, String cookieValue) throws URISyntaxException { | ||||
|     private void pbmConnect(String url, String cookieValue) throws Exception { | ||||
|         URI uri = new URI(url); | ||||
|         String pbmurl = "https://" + uri.getHost() + "/pbm"; | ||||
|         String[] tokens = cookieValue.split("="); | ||||
| @ -354,8 +350,8 @@ public class VmwareClient { | ||||
|      * @return property value. | ||||
|      */ | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public <T> T getDynamicProperty(ManagedObjectReference mor, String propertyName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, NoSuchMethodException, InvocationTargetException, IllegalAccessException { | ||||
|         List<String> props = new ArrayList<>(); | ||||
|     public <T> T getDynamicProperty(ManagedObjectReference mor, String propertyName) throws Exception { | ||||
|         List<String> props = new ArrayList<String>(); | ||||
|         props.add(propertyName); | ||||
|         List<ObjectContent> objContent = retrieveMoRefProperties(mor, props); | ||||
| 
 | ||||
| @ -385,7 +381,7 @@ public class VmwareClient { | ||||
|         return (T)propertyValue; | ||||
|     } | ||||
| 
 | ||||
|     private List<ObjectContent> retrieveMoRefProperties(ManagedObjectReference mObj, List<String> props) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|     private List<ObjectContent> retrieveMoRefProperties(ManagedObjectReference mObj, List<String> props) throws Exception { | ||||
|         PropertySpec pSpec = new PropertySpec(); | ||||
|         pSpec.setAll(false); | ||||
|         pSpec.setType(mObj.getType()); | ||||
| @ -415,7 +411,7 @@ public class VmwareClient { | ||||
|      * @throws RuntimeFaultFaultMsg | ||||
|      * @throws InvalidPropertyFaultMsg | ||||
|      */ | ||||
|     public boolean waitForTask(ManagedObjectReference task) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvalidCollectorVersionFaultMsg, InvocationTargetException, NoSuchMethodException, IllegalAccessException, InvalidStateFaultMsg { | ||||
|     public boolean waitForTask(ManagedObjectReference task) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvalidCollectorVersionFaultMsg, Exception { | ||||
| 
 | ||||
|         boolean retVal = false; | ||||
| 
 | ||||
| @ -710,7 +706,7 @@ public class VmwareClient { | ||||
|      * | ||||
|      * @return First ManagedObjectReference of the type / name pair found | ||||
|      */ | ||||
|     public ManagedObjectReference getDecendentMoRef(ManagedObjectReference root, String type, String name) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { | ||||
|     public ManagedObjectReference getDecendentMoRef(ManagedObjectReference root, String type, String name) throws Exception { | ||||
|         if (name == null || name.isEmpty()) { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
| @ -1,33 +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 com.cloud.hypervisor.vmware.util; | ||||
| 
 | ||||
| import com.cloud.exception.CloudException; | ||||
| 
 | ||||
| public class VmwareClientException extends CloudException { | ||||
|     public VmwareClientException(String message, Throwable cause) { | ||||
|         super(message, cause); | ||||
|     } | ||||
| 
 | ||||
|     public VmwareClientException(String msg) { | ||||
|         super(msg); | ||||
|     } | ||||
|     // TODO embed vmware classes in this one for use downstream | ||||
|     public VmwareClientException(String msg, Exception embedded) { | ||||
|         super(msg, embedded); | ||||
|     } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user