src/intTest/java/com/vmware/vim25/ws/WSClientIntTest.java (215 lines of code) (raw):

package com.vmware.vim25.ws; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import java.security.cert.X509Certificate; import java.util.Calendar; import javax.net.ssl.*; import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.utility.LoadVcenterProps; import com.vmware.vim25.ManagedObjectReference; import com.vmware.vim25.ObjectContent; import com.vmware.vim25.ObjectSpec; import com.vmware.vim25.PropertyFilterSpec; import com.vmware.vim25.PropertySpec; import com.vmware.vim25.SelectionSpec; import com.vmware.vim25.mo.ServiceInstance; import com.vmware.vim25.mo.util.PropertyCollectorUtil; public class WSClientIntTest { private static final Logger log = Logger.getLogger(WSClientIntTest.class); /** * Counter for created factory in {@link CustomWSClient}. */ private int createdSSLFactory = 0; /** * Counter for computed thumbprint in {@link CustomWSClient}. */ private int computedThumbprint = 0; SoapClient wsClient = null; @Before public void setUp() throws Exception { if (null == LoadVcenterProps.url || null == LoadVcenterProps.userName || null == LoadVcenterProps.password || null == LoadVcenterProps.secondUrl || null == LoadVcenterProps.badUrl || null == LoadVcenterProps.sslThumbprint || "".equals(LoadVcenterProps.url.trim()) || "".equals(LoadVcenterProps.secondUrl.trim()) || "".equals(LoadVcenterProps.badUrl.trim()) || "".equals(LoadVcenterProps.userName.trim()) || "".equals(LoadVcenterProps.password.trim()) || "".equals(LoadVcenterProps.sslThumbprint.trim())) { throw new Exception("Vcenter credentials not loaded"); } createdSSLFactory = 0; computedThumbprint = 0; ServiceInstance si = null; try { si = new ServiceInstance(new URL(LoadVcenterProps.url), LoadVcenterProps.userName, LoadVcenterProps.password, true); } catch (MalformedURLException e) { e.printStackTrace(); } if(si != null) { wsClient = new WSClient(LoadVcenterProps.url, true); wsClient.setVimNameSpace(ServiceInstance.VIM25_NAMESPACE); wsClient.setSoapActionOnApiVersion("5.5"); wsClient.setCookie(si.getSessionManager().getServerConnection() .getVimService().getWsc().getCookie()); } } /** * This method will test that you can ignore ssl to a vcenter but it doesnt trust * every cert on the net and will fail trying to connect to my jenkins server */ @Test(expected = SSLHandshakeException.class) public void testIgnoreSslDoesNotTrustAllCertsOnline() throws Exception { ServiceInstance si = new ServiceInstance(new URL(LoadVcenterProps.url), LoadVcenterProps.userName, LoadVcenterProps.password, true); // if we get here we were successful ignoring the self signed cert from vcenter assert si.getServerClock() instanceof Calendar; URL badUrl = new URL(LoadVcenterProps.badUrl); HttpsURLConnection myURLConnection = (HttpsURLConnection) badUrl.openConnection(); // this should throw a handshake exception myURLConnection.connect(); } /** * This method will test that you can ignore ssl to a vcenter but it doesnt trust * every cert on the net and will fail trying to connect to my jenkins server */ @Test public void testIgnoreSslAllowsMultiplevCentersToBeIgnored() throws Exception { ServiceInstance si = new ServiceInstance(new URL(LoadVcenterProps.url), LoadVcenterProps.userName, LoadVcenterProps.password, true); // if we get here we were successful ignoring the self signed cert from vcenter assert si.getServerClock() instanceof Calendar; ServiceInstance serviceInstance = new ServiceInstance(new URL(LoadVcenterProps.secondUrl), LoadVcenterProps.userName, LoadVcenterProps.password, true); assert serviceInstance.currentTime() instanceof Calendar; } /** * This method should fail with ssl handshake exception * the vcenter used in your properties file should be running on ssl * and you should not have its cert imported in your keystore. For these * tests I rely on a vCenter Server Appliance running simulator. */ @Test public void testDoNotIgnoreSslFailsOnSelfSignedCertNotInKeyStore() throws Exception { Throwable t = null; try { ServiceInstance si = new ServiceInstance(new URL(LoadVcenterProps.url), LoadVcenterProps.userName, LoadVcenterProps.password, false); } catch (RemoteException re) { t = re; } assert t.getCause() instanceof SSLHandshakeException; } /** * This test method will bring all the host systems under particular * vCenter. */ @Test public void testGetHosts() { ObjectContent[] hostSystems = null; try { hostSystems = (ObjectContent[]) wsClient.invoke( "RetrieveProperties", buildGetHostsArgs(), "ObjectContent[]"); if (hostSystems == null) { hostSystems = (ObjectContent[]) wsClient.invoke( "RetrieveProperties", buildGetHostsArgs(), "ObjectContent[]"); } } catch (RemoteException e) { e.printStackTrace(); } Assert.assertNotNull(hostSystems); Assert.assertNotEquals(0, hostSystems.length); } /** * This test method will test marshalling feature of the Soap Client. */ @Test public void testReqMarshall() { String soapPayload = wsClient.marshall("RetrieveProperties", buildGetHostsArgs()); Assert.assertNotNull(soapPayload); } /** * This test will confirm that the internal SSL socket factory is initiate only once in the WSClient (Issue #38). */ @Test public void testSSLSocketFactoryInitialization() throws Exception { CustomWSClient client = new CustomWSClient(LoadVcenterProps.url, true); Assert.assertEquals(1, createdSSLFactory); try { client.invoke("RetrieveProperties", buildGetHostsArgs(), "ObjectContent[]"); } catch (RemoteException e) { } Assert.assertEquals(1, createdSSLFactory); try { client.invoke("RetrieveProperties", buildGetHostsArgs(), "ObjectContent[]"); } catch (RemoteException e) { } Assert.assertEquals(1, createdSSLFactory); } /** * Tests the SSL factory is only created once when a trust manager is provided. */ @Test public void testSSLSocketFactoryInitWithTrustManager() throws Exception { CustomWSClient client = new CustomWSClient(LoadVcenterProps.url, false, new TrustAllManager()); Assert.assertEquals(1, createdSSLFactory); try { client.invoke("RetrieveProperties", buildGetHostsArgs(), "ObjectContent[]"); } catch (RemoteException e) { } Assert.assertEquals(1, createdSSLFactory); try { client.invoke("RetrieveProperties", buildGetHostsArgs(), "ObjectContent[]"); } catch (RemoteException e) { } Assert.assertEquals(1, createdSSLFactory); } /** * This method will build the request payload. * * @return Argument[] */ private Argument[] buildGetHostsArgs() { Argument[] paras = new Argument[2]; SelectionSpec[] selectionSpecs = null; ManagedObjectReference mor = new ManagedObjectReference(); mor.setType("PropertyCollector"); mor.setVal("propertyCollector"); selectionSpecs = PropertyCollectorUtil.buildFullTraversalV4(); // Need to set the vcenter specific details here. ManagedObjectReference vcenterMor = new ManagedObjectReference(); vcenterMor.setType("Folder"); vcenterMor.setVal("group-d1"); ObjectSpec os = new ObjectSpec(); os.setObj(vcenterMor); os.setSkip(Boolean.FALSE); os.setSelectSet(selectionSpecs); String[][] typeinfo = new String[][] { new String[] { "HostSystem", "name", }, }; PropertySpec[] propspecary = PropertyCollectorUtil .buildPropertySpecArray(typeinfo); PropertyFilterSpec spec = new PropertyFilterSpec(); spec.setObjectSet(new ObjectSpec[] { os }); spec.setPropSet(propspecary); paras[0] = new Argument("_this", "ManagedObjectReference", mor); paras[1] = new Argument("specSet", "PropertyFilterSpec[]", new PropertyFilterSpec[] { spec }); return paras; } /** * This test verifies that the computed thumbprint is correct and that it is computed only once. * @author Hubert Verstraete */ @Test public void testServerThumbprintInit() throws Exception { CustomWSClient client = new CustomWSClient(LoadVcenterProps.url, true); try { client.invoke("RetrieveProperties", buildGetHostsArgs(), "ObjectContent[]"); } catch (RemoteException e) { } Assert.assertEquals(1, computedThumbprint); try { client.invoke("RetrieveProperties", buildGetHostsArgs(), "ObjectContent[]"); } catch (RemoteException e) { } Assert.assertEquals(1, computedThumbprint); Assert.assertEquals("The computed SSL Server Thumbprint is invalid.", client.getServerThumbprint(), LoadVcenterProps.sslThumbprint); } /** * This extension of the WSClient will create count the number of time the {@link SSLSocketFactory} was created. * * @author Francis Beaulé * * This extension also counts the number of time the Server {@link thumbprint} is computed. * @author Hubert Verstraete * */ private class CustomWSClient extends WSClient { public CustomWSClient(String serverUrl, boolean ignoreCert) throws MalformedURLException, RemoteException { super(serverUrl, ignoreCert); } public CustomWSClient(String serverUrl, boolean ignoreCert, TrustManager trustManager) throws MalformedURLException, RemoteException { super(serverUrl, ignoreCert, trustManager); } /** * {@inheritDoc} */ @Override protected SSLSocketFactory getTrustAllSocketFactory(boolean ignoreCert) throws RemoteException { ++createdSSLFactory; return super.getTrustAllSocketFactory(ignoreCert); } @Override protected SSLSocketFactory getCustomTrustManagerSocketFactory(TrustManager trustManager) throws RemoteException { ++createdSSLFactory; return super.getCustomTrustManagerSocketFactory(trustManager); } @Override public void setServerThumbprint(String thumbprint) { ++computedThumbprint; super.setServerThumbprint(thumbprint); } } private static class TrustAllManager implements X509TrustManager { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkServerTrusted(X509Certificate[] certs, String authType) { } @Override public void checkClientTrusted(X509Certificate[] certs, String authType) { } } }