package org.openstack.atlas.adapter.itest; import org.junit.*; import org.openstack.atlas.adapter.zxtm.ZxtmAdapterImpl; import org.openstack.atlas.service.domain.entities.RateLimit; import com.zxtm.service.client.VirtualServerBasicInfo; import com.zxtm.service.client.VirtualServerProtocol; import com.zxtm.service.client.VirtualServerRule; import org.apache.axis.types.UnsignedInt; import java.util.Calendar; import static org.openstack.atlas.service.domain.entities.LoadBalancerProtocol.HTTPS; @Ignore public class RateLimitIntegrationTest extends ZeusTestBase { @BeforeClass public static void setupClass() throws InterruptedException { Thread.sleep(SLEEP_TIME_BETWEEN_TESTS); setupIvars(); setupSimpleLoadBalancer(); } @AfterClass public static void tearDownClass() { removeSimpleLoadBalancer(); } @Test public void testSimpleRateLimitOperations() { //No longer a documented feature, the rate script needs to be installed to be useful setRateLimit(); updateRateLimit(); deleteRateLimit(); } private void setRateLimit() { try { final Integer maxRequestsPerSecond = 1000; RateLimit rateLimit = new RateLimit(); rateLimit.setExpirationTime(Calendar.getInstance()); rateLimit.setMaxRequestsPerSecond(maxRequestsPerSecond); zxtmAdapter.setRateLimit(config, lb, rateLimit); String[] rateNames = getServiceStubs().getZxtmRateCatalogService().getRateNames(); boolean doesExist = false; for (String rateName : rateNames) { if (rateName.equals(rateLimitName())) { doesExist = true; break; } } Assert.assertTrue(doesExist); final UnsignedInt[] ratePerSecondList = getServiceStubs().getZxtmRateCatalogService().getMaxRatePerSecond(new String[]{rateLimitName()}); Assert.assertEquals(new UnsignedInt(maxRequestsPerSecond), ratePerSecondList[0]); final VirtualServerRule[][] virtualServerRules = getServiceStubs().getVirtualServerBinding().getRules(new String[]{loadBalancerName()}); Assert.assertEquals(1, virtualServerRules.length); Assert.assertEquals(3, virtualServerRules[0].length); for (VirtualServerRule rule : virtualServerRules[0]) { if (!(rule.equals(ZxtmAdapterImpl.ruleRateLimitHttp)) && !(rule.equals(ZxtmAdapterImpl.ruleXForwardedProto)) && !(rule.equals(ZxtmAdapterImpl.ruleXForwardedFor))) { Assert.fail("None of the rules matched, test failed!..."); } } // Assert.assertEquals(ZxtmAdapterImpl.ruleRateLimitHttp, virtualServerRules[0][1]); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } private void updateRateLimit() { try { final Integer maxRequestsPerSecond = 5; RateLimit rateLimit = new RateLimit(); rateLimit.setExpirationTime(Calendar.getInstance()); rateLimit.setMaxRequestsPerSecond(maxRequestsPerSecond); zxtmAdapter.updateRateLimit(config, lb, rateLimit); String[] rateNames = getServiceStubs().getZxtmRateCatalogService().getRateNames(); boolean doesExist = false; for (String rateName : rateNames) { if (rateName.equals(rateLimitName())) { doesExist = true; break; } } Assert.assertTrue(doesExist); final UnsignedInt[] ratePerSecondList = getServiceStubs().getZxtmRateCatalogService().getMaxRatePerSecond(new String[]{rateLimitName()}); Assert.assertEquals(new UnsignedInt(maxRequestsPerSecond), ratePerSecondList[0]); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } private void deleteRateLimit() { try { zxtmAdapter.deleteRateLimit(config, lb); String[] rateNames = getServiceStubs().getZxtmRateCatalogService().getRateNames(); boolean doesExist = false; for (String rateName : rateNames) { if (rateName.equals(rateLimitName())) { doesExist = true; break; } } Assert.assertFalse(doesExist); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } @Test public void testRateLimitOperationsWhenChangingBetweenHttpAndNonHttpProtocols() { setRateLimit(); updateProtocolToHttps(); deleteRateLimit(); } private void updateProtocolToHttps() { try { lb.setProtocol(HTTPS); zxtmAdapter.updateProtocol(config, lb); final VirtualServerBasicInfo[] virtualServerBasicInfos = getServiceStubs().getVirtualServerBinding().getBasicInfo(new String[]{loadBalancerName()}); Assert.assertEquals(1, virtualServerBasicInfos.length); Assert.assertEquals(VirtualServerProtocol.https, virtualServerBasicInfos[0].getProtocol()); final VirtualServerRule[][] virtualServerRules = getServiceStubs().getVirtualServerBinding().getRules(new String[]{loadBalancerName()}); Assert.assertEquals(1, virtualServerRules.length); Assert.assertEquals(1, virtualServerRules[0].length); Assert.assertEquals(ZxtmAdapterImpl.ruleRateLimitNonHttp, virtualServerRules[0][0]); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } }