package org.openstack.atlas.adapter.itest; import com.zxtm.service.client.Certificate; import com.zxtm.service.client.ObjectDoesNotExist; import com.zxtm.service.client.VirtualServerSSLSite; import org.junit.*; import org.openstack.atlas.adapter.exceptions.InsufficientRequestException; import org.openstack.atlas.adapter.exceptions.RollBackException; import org.openstack.atlas.adapter.helpers.ZxtmNameBuilder; import org.openstack.atlas.service.domain.entities.CertificateMapping; import org.openstack.atlas.service.domain.entities.LoadBalancer; import java.rmi.RemoteException; import java.util.HashSet; import java.util.Set; public class CertificateMappingIntegrationTest extends ZeusTestBase { private CertificateMapping certificateMapping; private CertificateMapping certificateMapping2; private static Integer CERTIFICATE_MAPPING_ID_1 = 100; private static Integer CERTIFICATE_MAPPING_ID_2 = 101; private static String CERTIFICATE_MAPPING_HOST_NAME_1 = "1-integration.test.com"; private static String CERTIFICATE_MAPPING_HOST_NAME_2 = "2-integration.test.com"; @BeforeClass public static void setupClass() throws InterruptedException { Thread.sleep(SLEEP_TIME_BETWEEN_TESTS); setupIvars(); setupSimpleLoadBalancer(); setSslTermination(); } @Before public void standUp() { certificateMapping = new CertificateMapping(); certificateMapping.setId(CERTIFICATE_MAPPING_ID_1); certificateMapping.setPrivateKey(testKey); certificateMapping.setCertificate(testCert); certificateMapping.setHostName(CERTIFICATE_MAPPING_HOST_NAME_1); certificateMapping2 = new CertificateMapping(); certificateMapping2.setId(CERTIFICATE_MAPPING_ID_2); certificateMapping2.setPrivateKey(testKey); certificateMapping2.setCertificate(testCert); certificateMapping2.setHostName(CERTIFICATE_MAPPING_HOST_NAME_2); Set<CertificateMapping> certificateMappings = new HashSet<CertificateMapping>(); certificateMappings.add(certificateMapping); certificateMappings.add(certificateMapping2); lb.setCertificateMappings(certificateMappings); } @AfterClass public static void tearDownClass() throws InsufficientRequestException, RemoteException { removeSimpleLoadBalancer(); verifyCertificateIsDeleted(CERTIFICATE_MAPPING_ID_1); verifyCertificateIsDeleted(CERTIFICATE_MAPPING_ID_2); } @Test public void shouldIgnoreWhenRemovingNonExistentMapping() throws RollBackException, InsufficientRequestException, RemoteException { zxtmAdapter.deleteCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); } @Test public void shouldIgnoreWhenRemovingFromNonExistentLoadBalancer() throws RollBackException, InsufficientRequestException, RemoteException { LoadBalancer dummyLb = new LoadBalancer(); dummyLb.setId(7278237); dummyLb.setAccountId(7278237); zxtmAdapter.deleteCertificateMapping(config, dummyLb.getId(), dummyLb.getAccountId(), certificateMapping); } @Test public void verifyCertificateAndMappingAreCreated() throws RollBackException, InsufficientRequestException, RemoteException { zxtmAdapter.updateCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); verifyCertificateExists(certificateMapping); final VirtualServerSSLSite[][] sslSites = getServiceStubs().getVirtualServerBinding().getSSLSites(new String[]{secureLoadBalancerName()}); Assert.assertEquals(1, sslSites.length); Assert.assertEquals(1, sslSites[0].length); Assert.assertEquals(certificateName(certificateMapping.getId()), sslSites[0][0].getCertificate()); Assert.assertEquals(certificateMapping.getHostName(), sslSites[0][0].getDest_address()); zxtmAdapter.deleteCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); } @Test public void verifyWhenUpdatingHostNameOnly() throws RollBackException, InsufficientRequestException, RemoteException { zxtmAdapter.updateCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); verifyCertificateExists(certificateMapping); VirtualServerSSLSite[][] sslSites = getServiceStubs().getVirtualServerBinding().getSSLSites(new String[]{secureLoadBalancerName()}); Assert.assertEquals(1, sslSites.length); Assert.assertEquals(1, sslSites[0].length); Assert.assertEquals(certificateName(certificateMapping.getId()), sslSites[0][0].getCertificate()); Assert.assertEquals(certificateMapping.getHostName(), sslSites[0][0].getDest_address()); certificateMapping.setHostName("new-integration.test.com"); zxtmAdapter.updateCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); verifyCertificateExists(certificateMapping); sslSites = getServiceStubs().getVirtualServerBinding().getSSLSites(new String[]{secureLoadBalancerName()}); Assert.assertEquals(1, sslSites.length); Assert.assertEquals(1, sslSites[0].length); Assert.assertEquals(certificateName(certificateMapping.getId()), sslSites[0][0].getCertificate()); Assert.assertEquals(certificateMapping.getHostName(), sslSites[0][0].getDest_address()); zxtmAdapter.deleteCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); } @Test public void verifyWhenAddingTwoSeparateMappings() throws RollBackException, InsufficientRequestException, RemoteException { zxtmAdapter.updateCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); verifyCertificateExists(certificateMapping); VirtualServerSSLSite[][] sslSites = getServiceStubs().getVirtualServerBinding().getSSLSites(new String[]{secureLoadBalancerName()}); Assert.assertEquals(1, sslSites.length); Assert.assertEquals(1, sslSites[0].length); Assert.assertEquals(certificateName(certificateMapping.getId()), sslSites[0][0].getCertificate()); Assert.assertEquals(certificateMapping.getHostName(), sslSites[0][0].getDest_address()); zxtmAdapter.updateCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping2); verifyCertificateExists(certificateMapping2); sslSites = getServiceStubs().getVirtualServerBinding().getSSLSites(new String[]{secureLoadBalancerName()}); Assert.assertEquals(1, sslSites.length); Assert.assertEquals(2, sslSites[0].length); for (VirtualServerSSLSite sslSite : sslSites[0]) { Assert.assertTrue(certificateName(certificateMapping.getId()).equals(sslSite.getCertificate()) || certificateName(certificateMapping2.getId()).equals(sslSite.getCertificate())); Assert.assertTrue(certificateMapping.getHostName().equals(sslSite.getDest_address()) || certificateMapping2.getHostName().equals(sslSite.getDest_address())); } zxtmAdapter.deleteCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); zxtmAdapter.deleteCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping2); } @Test public void verifyWhenAddingThenDeletingMapping() throws RollBackException, InsufficientRequestException, RemoteException { zxtmAdapter.updateCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); verifyCertificateExists(certificateMapping); VirtualServerSSLSite[][] sslSites = getServiceStubs().getVirtualServerBinding().getSSLSites(new String[]{secureLoadBalancerName()}); Assert.assertEquals(1, sslSites.length); Assert.assertEquals(1, sslSites[0].length); Assert.assertEquals(certificateName(certificateMapping.getId()), sslSites[0][0].getCertificate()); Assert.assertEquals(certificateMapping.getHostName(), sslSites[0][0].getDest_address()); zxtmAdapter.deleteCertificateMapping(config, lb.getId(), lb.getAccountId(), certificateMapping); sslSites = getServiceStubs().getVirtualServerBinding().getSSLSites(new String[]{secureLoadBalancerName()}); Assert.assertEquals(1, sslSites.length); Assert.assertEquals(0, sslSites[0].length); verifyCertificateIsDeleted(certificateMapping.getId()); } private void verifyCertificateExists(CertificateMapping certMapping) throws RemoteException, InsufficientRequestException { final Certificate[] certificateInfo = getServiceStubs().getZxtmCatalogSSLCertificatesBinding().getCertificateInfo(new String[]{certificateName(certMapping.getId())}); Assert.assertEquals(1, certificateInfo.length); } private static void verifyCertificateIsDeleted(Integer certMappingId) throws RemoteException, InsufficientRequestException { boolean isDeleted = false; try { getServiceStubs().getZxtmCatalogSSLCertificatesBinding().getCertificateInfo(new String[]{certificateName(certMappingId)}); } catch(ObjectDoesNotExist odne) { isDeleted = true; } Assert.assertTrue(isDeleted); } }