package org.openstack.atlas.adapter.itest; import com.zxtm.service.client.VirtualServerBasicInfo; import com.zxtm.service.client.VirtualServerRule; import org.apache.axis.AxisFault; import org.junit.*; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import org.openstack.atlas.adapter.exceptions.InsufficientRequestException; import org.openstack.atlas.adapter.exceptions.ZxtmRollBackException; import org.openstack.atlas.adapter.helpers.ZxtmNameBuilder; import org.openstack.atlas.adapter.zxtm.ZxtmAdapterImpl; import org.openstack.atlas.service.domain.entities.SslTermination; import org.openstack.atlas.service.domain.entities.UserPages; import org.openstack.atlas.service.domain.pojos.ZeusSslTermination; import org.openstack.atlas.util.ca.zeus.ZeusCrtFile; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Arrays; import static org.openstack.atlas.service.domain.entities.LoadBalancerProtocol.HTTPS; @RunWith(Enclosed.class) public class HttpsRedirectIntegrationTest extends ZeusTestBase { public static class testingBasicHttpsRedirect { @BeforeClass public static void setupClass() throws InterruptedException { Thread.sleep(SLEEP_TIME_BETWEEN_TESTS); setupIvars(); lb.setProtocol(HTTPS); lb.setPort(443); setupSimpleLoadBalancer(); } @AfterClass public static void tearDownClass() { removeSimpleLoadBalancer(); } @Test public void testAddRemoveHttpsRedirect() { try { verifyAddRemoveHttpsRedirect(); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } @Test public void testAddRemoveHttpsRedirectWithErrorPage() { try { String efContent = "<html>test ep</html>"; UserPages up = new UserPages(); up.setErrorpage(efContent); lb.setUserPages(up); zxtmAdapter.setErrorFile(config, lb, efContent); Assert.assertEquals(efContent, new String(getServiceStubs().getZxtmConfExtraBinding().downloadFile(errorFileName()))); verifyAddRemoveHttpsRedirect(); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } public void verifyAddRemoveHttpsRedirect() throws RemoteException, InsufficientRequestException, ZxtmRollBackException { ArrayList<String> vsNames; vsNames = new ArrayList<String>(Arrays.asList(getServiceStubs().getVirtualServerBinding().getVirtualServerNames())); Assert.assertTrue(vsNames.contains(loadBalancerName())); Assert.assertFalse(vsNames.contains(redirectLoadBalancerName())); Assert.assertFalse(vsNames.contains(secureLoadBalancerName())); Assert.assertTrue(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{loadBalancerName()})[0]); lb.setHttpsRedirect(true); zxtmAdapter.updateHttpsRedirect(config, lb); vsNames = new ArrayList<String>(Arrays.asList(getServiceStubs().getVirtualServerBinding().getVirtualServerNames())); Assert.assertTrue(vsNames.contains(loadBalancerName())); Assert.assertTrue(vsNames.contains(redirectLoadBalancerName())); Assert.assertFalse(vsNames.contains(secureLoadBalancerName())); Assert.assertTrue(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{loadBalancerName()})[0]); Assert.assertTrue(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{redirectLoadBalancerName()})[0]); VirtualServerRule[][] virtualServerRules = getServiceStubs().getVirtualServerBinding().getRules(new String[]{redirectLoadBalancerName()}); Assert.assertEquals(1, virtualServerRules.length); Assert.assertEquals(1, virtualServerRules[0].length); Assert.assertEquals(ZxtmAdapterImpl.ruleForceHttpsRedirect, virtualServerRules[0][0]); lb.setHttpsRedirect(false); zxtmAdapter.updateHttpsRedirect(config, lb); vsNames = new ArrayList<String>(Arrays.asList(getServiceStubs().getVirtualServerBinding().getVirtualServerNames())); Assert.assertTrue(vsNames.contains(loadBalancerName())); Assert.assertFalse(vsNames.contains(redirectLoadBalancerName())); Assert.assertFalse(vsNames.contains(secureLoadBalancerName())); Assert.assertTrue(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{loadBalancerName()})[0]); } } public static class testingSslTerminationHttpsRedirect { @BeforeClass public static void setupClass() throws InterruptedException { Thread.sleep(SLEEP_TIME_BETWEEN_TESTS); setupIvars(); setupSimpleLoadBalancer(); } @AfterClass public static void tearDownClass() { removeSimpleLoadBalancer(); } @Before public void setupSsl() { setSslTermination(); } @Test public void testAddRemoveHttpsRedirect() { try { verifyAddRemoveHttpsRedirect(); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } @Test public void testAddRemoveHttpsRedirectWithErrorPage() { try { String efContent = "<html>test ep</html>"; UserPages up = new UserPages(); up.setErrorpage(efContent); lb.setUserPages(up); zxtmAdapter.setErrorFile(config, lb, efContent); Assert.assertEquals(efContent, new String(getServiceStubs().getZxtmConfExtraBinding().downloadFile(errorFileName()))); verifyAddRemoveHttpsRedirect(); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } private void setSslTermination() { try { String sVs = secureLoadBalancerName(); SslTermination sslTermination = new SslTermination(); sslTermination.setSecureTrafficOnly(true); sslTermination.setEnabled(true); sslTermination.setSecurePort(443); sslTermination.setCertificate(SslTerminationIntegrationTest.testCert); sslTermination.setPrivatekey(SslTerminationIntegrationTest.testKey); ZeusCrtFile zeusCrtFile = new ZeusCrtFile(); zeusCrtFile.setPublic_cert(SslTerminationIntegrationTest.testCert); zeusCrtFile.setPrivate_key(SslTerminationIntegrationTest.testKey); ZeusSslTermination zeusSslTermination = new ZeusSslTermination(); zeusSslTermination.setCertIntermediateCert(SslTerminationIntegrationTest.testCert); zeusSslTermination.setSslTermination(sslTermination); lb.setSslTermination(zeusSslTermination.getSslTermination()); zxtmAdapter.updateSslTermination(config, lb, zeusSslTermination); ArrayList<String> vsNames = new ArrayList<String>(Arrays.asList(getServiceStubs().getVirtualServerBinding().getVirtualServerNames())); Assert.assertTrue(vsNames.contains(secureLoadBalancerName())); String[] certificate = getServiceStubs().getVirtualServerBinding().getSSLCertificate(new String[]{sVs}); Assert.assertEquals(sVs, certificate[0]); final VirtualServerBasicInfo[] serverBasicInfos = getServiceStubs().getVirtualServerBinding().getBasicInfo(new String[]{sVs}); Assert.assertEquals(sslTermination.getSecurePort(), serverBasicInfos[0].getPort()); Assert.assertEquals(true, lb.getProtocol().toString().equalsIgnoreCase(serverBasicInfos[0].getProtocol().toString())); Assert.assertEquals(ZxtmNameBuilder.genVSName(lb), serverBasicInfos[0].getDefault_pool()); boolean[] vsEnabled = getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{secureLoadBalancerName()}); Assert.assertEquals(true, vsEnabled[0]); boolean[] vsNonSecureEnabled = getServiceStubs().getVirtualServerBinding().getSSLDecrypt(new String[]{sVs}); Assert.assertEquals(sslTermination.isEnabled(), vsNonSecureEnabled[0]); String[] vsSecureInfo = getServiceStubs().getZxtmCatalogSSLCertificatesBinding().getRawCertificate(new String[]{sVs}); Assert.assertEquals(sslTermination.getCertificate(), vsSecureInfo[0]); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } private void verifyAddRemoveHttpsRedirect() throws InsufficientRequestException, ZxtmRollBackException, RemoteException { ArrayList<String> vsNames; vsNames = new ArrayList<String>(Arrays.asList(getServiceStubs().getVirtualServerBinding().getVirtualServerNames())); Assert.assertTrue(vsNames.contains(loadBalancerName())); Assert.assertTrue(vsNames.contains(secureLoadBalancerName())); Assert.assertFalse(vsNames.contains(redirectLoadBalancerName())); Assert.assertFalse(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{loadBalancerName()})[0]); Assert.assertTrue(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{secureLoadBalancerName()})[0]); lb.setHttpsRedirect(true); zxtmAdapter.updateHttpsRedirect(config, lb); vsNames = new ArrayList<String>(Arrays.asList(getServiceStubs().getVirtualServerBinding().getVirtualServerNames())); Assert.assertFalse(vsNames.contains(loadBalancerName())); Assert.assertTrue(vsNames.contains(secureLoadBalancerName())); Assert.assertTrue(vsNames.contains(redirectLoadBalancerName())); Assert.assertTrue(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{secureLoadBalancerName()})[0]); Assert.assertTrue(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{redirectLoadBalancerName()})[0]); VirtualServerRule[][] virtualServerRules = getServiceStubs().getVirtualServerBinding().getRules(new String[]{redirectLoadBalancerName()}); Assert.assertEquals(1, virtualServerRules.length); Assert.assertEquals(1, virtualServerRules[0].length); Assert.assertEquals(ZxtmAdapterImpl.ruleForceHttpsRedirect, virtualServerRules[0][0]); lb.setHttpsRedirect(false); zxtmAdapter.updateHttpsRedirect(config, lb); vsNames = new ArrayList<String>(Arrays.asList(getServiceStubs().getVirtualServerBinding().getVirtualServerNames())); Assert.assertTrue(vsNames.contains(loadBalancerName())); Assert.assertTrue(vsNames.contains(secureLoadBalancerName())); Assert.assertFalse(vsNames.contains(redirectLoadBalancerName())); Assert.assertFalse(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{loadBalancerName()})[0]); Assert.assertTrue(getServiceStubs().getVirtualServerBinding().getEnabled(new String[]{secureLoadBalancerName()})[0]); } } }