4343import javax .naming .ConfigurationException ;
4444import javax .persistence .EntityExistsException ;
4545
46+ import com .cloud .hypervisor .vmware .mo .VirtualMachineMO ;
4647import com .cloud .hypervisor .vmware .util .VmwareClient ;
4748import org .apache .cloudstack .api .command .admin .zone .AddVmwareDcCmd ;
4849import org .apache .cloudstack .api .command .admin .zone .ImportVsphereStoragePoliciesCmd ;
@@ -1587,14 +1588,26 @@ public List<StoragePool> listVsphereStoragePolicyCompatibleStoragePools(ListVsph
15871588 return compatiblePools ;
15881589 }
15891590
1590- @ Override
1591- public List <UnmanagedInstanceTO > listVMsInDatacenter (ListVmwareDcVmsCmd cmd ) {
1591+ private static class VcenterData {
1592+ public final String vcenter ;
1593+ public final String datacenterName ;
1594+ public final String username ;
1595+ public final String password ;
1596+
1597+ public VcenterData (String vcenter , String datacenterName , String username , String password ) {
1598+ this .vcenter = vcenter ;
1599+ this .datacenterName = datacenterName ;
1600+ this .username = username ;
1601+ this .password = password ;
1602+ }
1603+ }
1604+
1605+ private VcenterData getVcenterData (ListVmwareDcVmsCmd cmd ) {
15921606 String vcenter = cmd .getVcenter ();
15931607 String datacenterName = cmd .getDatacenterName ();
15941608 String username = cmd .getUsername ();
15951609 String password = cmd .getPassword ();
15961610 Long existingVcenterId = cmd .getExistingVcenterId ();
1597- String keyword = cmd .getKeyword ();
15981611
15991612 if ((existingVcenterId == null && StringUtils .isBlank (vcenter )) ||
16001613 (existingVcenterId != null && StringUtils .isNotBlank (vcenter ))) {
@@ -1615,34 +1628,67 @@ public List<UnmanagedInstanceTO> listVMsInDatacenter(ListVmwareDcVmsCmd cmd) {
16151628 username = vmwareDc .getUser ();
16161629 password = vmwareDc .getPassword ();
16171630 }
1631+ VcenterData vmwaredc = new VcenterData (vcenter , datacenterName , username , password );
1632+ return vmwaredc ;
1633+ }
1634+
1635+ private static VmwareContext getVmwareContext (String vcenter , String username , String password ) throws Exception {
1636+ s_logger .debug (String .format ("Connecting to the VMware vCenter %s" , vcenter ));
1637+ String serviceUrl = String .format ("https://%s/sdk/vimService" , vcenter );
1638+ VmwareClient vimClient = new VmwareClient (vcenter );
1639+ vimClient .connect (serviceUrl , username , password );
1640+ return new VmwareContext (vimClient , vcenter );
1641+ }
1642+
1643+ @ Override
1644+ public List <UnmanagedInstanceTO > listVMsInDatacenter (ListVmwareDcVmsCmd cmd ) {
1645+ VcenterData vmwareDC = getVcenterData (cmd );
1646+ String vcenter = vmwareDC .vcenter ;
1647+ String username = vmwareDC .username ;
1648+ String password = vmwareDC .password ;
1649+ String datacenterName = vmwareDC .datacenterName ;
1650+ String keyword = cmd .getKeyword ();
1651+ String esxiHostName = cmd .getHostName ();
1652+ String virtualMachineName = cmd .getInstanceName ();
16181653
16191654 try {
1620- s_logger .debug (String .format ("Connecting to the VMware datacenter %s at vCenter %s to retrieve VMs" ,
1621- datacenterName , vcenter ));
1622- String serviceUrl = String .format ("https://%s/sdk/vimService" , vcenter );
1623- VmwareClient vimClient = new VmwareClient (vcenter );
1624- vimClient .connect (serviceUrl , username , password );
1625- VmwareContext context = new VmwareContext (vimClient , vcenter );
1626-
1627- DatacenterMO dcMo = new DatacenterMO (context , datacenterName );
1628- ManagedObjectReference dcMor = dcMo .getMor ();
1629- if (dcMor == null ) {
1630- String msg = String .format ("Unable to find VMware datacenter %s in vCenter %s" ,
1631- datacenterName , vcenter );
1632- s_logger .error (msg );
1633- throw new InvalidParameterValueException (msg );
1655+ VmwareContext context = getVmwareContext (vcenter , username , password );
1656+ DatacenterMO dcMo = getDatacenterMO (context , vcenter , datacenterName );
1657+
1658+ List <UnmanagedInstanceTO > instances ;
1659+ if (StringUtils .isNotBlank (esxiHostName ) && StringUtils .isNotBlank (virtualMachineName )) {
1660+ ManagedObjectReference hostMor = dcMo .findHost (esxiHostName );
1661+ if (hostMor == null ) {
1662+ String errorMsg = String .format ("Cannot find a host with name %s on vcenter %s" , esxiHostName , vcenter );
1663+ s_logger .error (errorMsg );
1664+ throw new CloudRuntimeException (errorMsg );
1665+ }
1666+ HostMO hostMO = new HostMO (context , hostMor );
1667+ VirtualMachineMO vmMo = hostMO .findVmOnHyperHost (virtualMachineName );
1668+ instances = Collections .singletonList (VmwareHelper .getUnmanagedInstance (hostMO , vmMo ));
1669+ } else {
1670+ instances = dcMo .getAllVmsOnDatacenter (keyword );
16341671 }
1635- List <UnmanagedInstanceTO > instances = dcMo .getAllVmsOnDatacenter ();
1636- return StringUtils .isBlank (keyword ) ? instances :
1637- instances .stream ().filter (x -> x .getName ().toLowerCase ().contains (keyword .toLowerCase ())).collect (Collectors .toList ());
1672+ return instances ;
16381673 } catch (Exception e ) {
1639- String errorMsg = String .format ("Error retrieving stopped VMs from the VMware VC %s datacenter %s: %s" ,
1674+ String errorMsg = String .format ("Error retrieving VMs from the VMware VC %s datacenter %s: %s" ,
16401675 vcenter , datacenterName , e .getMessage ());
16411676 s_logger .error (errorMsg , e );
16421677 throw new CloudRuntimeException (errorMsg );
16431678 }
16441679 }
16451680
1681+ private static DatacenterMO getDatacenterMO (VmwareContext context , String vcenter , String datacenterName ) throws Exception {
1682+ DatacenterMO dcMo = new DatacenterMO (context , datacenterName );
1683+ ManagedObjectReference dcMor = dcMo .getMor ();
1684+ if (dcMor == null ) {
1685+ String msg = String .format ("Unable to find VMware datacenter %s in vCenter %s" , datacenterName , vcenter );
1686+ s_logger .error (msg );
1687+ throw new InvalidParameterValueException (msg );
1688+ }
1689+ return dcMo ;
1690+ }
1691+
16461692 @ Override
16471693 public boolean hasNexusVSM (Long clusterId ) {
16481694 ClusterVSMMapVO vsmMapVo = null ;
0 commit comments