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 ;
50+ import org .apache .cloudstack .api .command .admin .zone .ListVmwareDcHostsCmd ;
51+ import org .apache .cloudstack .api .command .admin .zone .ListVmwareDcItems ;
4952import org .apache .cloudstack .api .command .admin .zone .ListVmwareDcVmsCmd ;
5053import org .apache .cloudstack .api .command .admin .zone .ListVmwareDcsCmd ;
5154import org .apache .cloudstack .api .command .admin .zone .ListVsphereStoragePoliciesCmd ;
@@ -1587,14 +1590,26 @@ public List<StoragePool> listVsphereStoragePolicyCompatibleStoragePools(ListVsph
15871590 return compatiblePools ;
15881591 }
15891592
1590- @ Override
1591- public List <UnmanagedInstanceTO > listVMsInDatacenter (ListVmwareDcVmsCmd cmd ) {
1593+ private static class VcenterData {
1594+ public final String vcenter ;
1595+ public final String datacenterName ;
1596+ public final String username ;
1597+ public final String password ;
1598+
1599+ public VcenterData (String vcenter , String datacenterName , String username , String password ) {
1600+ this .vcenter = vcenter ;
1601+ this .datacenterName = datacenterName ;
1602+ this .username = username ;
1603+ this .password = password ;
1604+ }
1605+ }
1606+
1607+ private VcenterData getVcenterData (ListVmwareDcItems cmd ) {
15921608 String vcenter = cmd .getVcenter ();
15931609 String datacenterName = cmd .getDatacenterName ();
15941610 String username = cmd .getUsername ();
15951611 String password = cmd .getPassword ();
15961612 Long existingVcenterId = cmd .getExistingVcenterId ();
1597- String keyword = cmd .getKeyword ();
15981613
15991614 if ((existingVcenterId == null && StringUtils .isBlank (vcenter )) ||
16001615 (existingVcenterId != null && StringUtils .isNotBlank (vcenter ))) {
@@ -1615,26 +1630,75 @@ public List<UnmanagedInstanceTO> listVMsInDatacenter(ListVmwareDcVmsCmd cmd) {
16151630 username = vmwareDc .getUser ();
16161631 password = vmwareDc .getPassword ();
16171632 }
1633+ VcenterData vmwaredc = new VcenterData (vcenter , datacenterName , username , password );
1634+ return vmwaredc ;
1635+ }
1636+
1637+ private VmwareContext getVmwareContext (String vcenter , String username , String password ) throws Exception {
1638+ s_logger .debug (String .format ("Connecting to the VMware vCenter %s" , vcenter ));
1639+ String serviceUrl = String .format ("https://%s/sdk/vimService" , vcenter );
1640+ VmwareClient vimClient = new VmwareClient (vcenter );
1641+ vimClient .connect (serviceUrl , username , password );
1642+ return new VmwareContext (vimClient , vcenter );
1643+ }
1644+
1645+ @ Override
1646+ public List <UnmanagedInstanceTO > listVMsInDatacenter (ListVmwareDcVmsCmd cmd ) {
1647+ VcenterData vmwareDC = getVcenterData (cmd );
1648+ String vcenter = vmwareDC .vcenter ;
1649+ String username = vmwareDC .username ;
1650+ String password = vmwareDC .password ;
1651+ String datacenterName = vmwareDC .datacenterName ;
1652+ String keyword = cmd .getKeyword ();
1653+ String esxiHostName = cmd .getHostName ();
16181654
16191655 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 );
1656+ VmwareContext context = getVmwareContext (vcenter , username , password );
1657+ DatacenterMO dcMo = getDatacenterMO (context , vcenter , datacenterName );
1658+
1659+ List <VirtualMachineMO > vms ;
1660+ if (StringUtils .isNotBlank (esxiHostName )) {
1661+ // List VMs in a specific ESXi Host
1662+ HostMO hostMO = VmwareHelper .getHostMOFromHostName (context , esxiHostName );
1663+ vms = hostMO .listVmsOnHyperHostWithHypervisorName (null );
1664+ } else {
1665+ // Long lasting method, not recommended - retrieves all the VMs in a datacenter
1666+ vms = dcMo .getAllVmsOnDatacenter ();
16341667 }
1635- List <UnmanagedInstanceTO > instances = dcMo .getAllVmsOnDatacenter ();
1668+
1669+ List <UnmanagedInstanceTO > instances = VmwareHelper .getUnmanagedInstancesList (vms );
16361670 return StringUtils .isBlank (keyword ) ? instances :
16371671 instances .stream ().filter (x -> x .getName ().toLowerCase ().contains (keyword .toLowerCase ())).collect (Collectors .toList ());
1672+ } catch (Exception e ) {
1673+ String errorMsg = String .format ("Error retrieving VMs from the VMware VC %s datacenter %s: %s" ,
1674+ vcenter , datacenterName , e .getMessage ());
1675+ s_logger .error (errorMsg , e );
1676+ throw new CloudRuntimeException (errorMsg );
1677+ }
1678+ }
1679+
1680+ private static DatacenterMO getDatacenterMO (VmwareContext context , String vcenter , String datacenterName ) throws Exception {
1681+ DatacenterMO dcMo = new DatacenterMO (context , datacenterName );
1682+ ManagedObjectReference dcMor = dcMo .getMor ();
1683+ if (dcMor == null ) {
1684+ String msg = String .format ("Unable to find VMware datacenter %s in vCenter %s" , datacenterName , vcenter );
1685+ s_logger .error (msg );
1686+ throw new InvalidParameterValueException (msg );
1687+ }
1688+ return dcMo ;
1689+ }
1690+
1691+ @ Override
1692+ public List <HostMO > listHostsInDatacenter (ListVmwareDcHostsCmd cmd ) {
1693+ VcenterData vmwareDC = getVcenterData (cmd );
1694+ String vcenter = vmwareDC .vcenter ;
1695+ String username = vmwareDC .username ;
1696+ String password = vmwareDC .password ;
1697+ String datacenterName = vmwareDC .datacenterName ;
1698+ try {
1699+ VmwareContext context = getVmwareContext (vcenter , username , password );
1700+ DatacenterMO dcMo = getDatacenterMO (context , vcenter , datacenterName );
1701+ return dcMo .getAllHostsOnDatacenter ();
16381702 } catch (Exception e ) {
16391703 String errorMsg = String .format ("Error retrieving stopped VMs from the VMware VC %s datacenter %s: %s" ,
16401704 vcenter , datacenterName , e .getMessage ());
0 commit comments