package org.openstack.atlas.adapter.itest;
import org.junit.*;
import org.openstack.atlas.adapter.helpers.ZxtmNameBuilder;
import org.openstack.atlas.service.domain.entities.AccessList;
import org.openstack.atlas.service.domain.entities.AccessListType;
import org.openstack.atlas.service.domain.entities.ConnectionLimit;
import org.openstack.atlas.service.domain.entities.IpVersion;
import org.openstack.atlas.service.domain.entities.SslTermination;
import org.openstack.atlas.service.domain.pojos.ZeusSslTermination;
import org.rackspace.stingray.client.exception.StingrayRestClientException;
import org.rackspace.stingray.client.exception.StingrayRestClientObjectNotFoundException;
import org.rackspace.stingray.client.protection.Protection;
import java.util.*;
public class AccessListITest extends STMTestBase {
private String name;
Set<AccessList> list;
AccessList item1;
AccessList item2;
@Before
public void setUp() {
list = new HashSet<AccessList>();
item1 = new AccessList();
item1.setId(101);
item1.setIpAddress("10.0.0.1");
item1.setUserName("anonymous");
item1.setLoadbalancer(lb);
item1.setType(AccessListType.ALLOW);
list.add(item1);
item2 = new AccessList();
item2.setId(102);
item2.setIpAddress("10.0.0.2");
item2.setUserName("stillAnonymous");
item2.setLoadbalancer(lb);
item2.setType(AccessListType.DENY);
list.add(item2);
try {
Thread.sleep(SLEEP_TIME_BETWEEN_TESTS);
setupIvars();
createSimpleLoadBalancer();
name = ZxtmNameBuilder.genVSName(lb);
} catch(Exception e) {
Assert.fail(e.getMessage() + "\n" + Arrays.toString(e.getStackTrace()));
}
}
@Test
public void testAccessListCreationOnBasicLoadBalancer() {
createAccessList();
verifyAccessList();
}
@Test
public void testAccessListCreationWithConnectionThrottleEnabled() {
enableConnectionThrottle();
createAccessList();
verifyAccessList();
}
@Test
public void testAccessListCreationOnSslLoadBalancer() {
enableSsl();
createAccessList();
verifyAccessList();
}
@Test
public void testAccessListCreationOnSslOnlyLoadBalancer() {
enableSslOnly();
createAccessList();
verifyAccessList();
}
@Test
public void testAccessListRemovalOfOneItem() {
createAccessList();
verifyAccessList();
deleteAccessListItem();
verifyAccessListSingleDeletion();
}
@Test
public void testAccessListDeletion() {
createAccessList();
verifyAccessList();
deleteAccessList();
verifyAccessListDeletion();
}
public void createAccessList() {
lb.setAccessLists(list);
try {
stmAdapter.updateAccessList(config, lb);
} catch (Exception e) {
Assert.fail(String.format("Error updating Access List on '%s'.\n%s", name,
Arrays.toString(e.getStackTrace())));
}
}
public void verifyAccessList() {
Protection protection;
try {
protection = stmClient.getProtection(name);
} catch (Exception e) {
Assert.fail(String.format("Error retrieving Protection on '%s'.\n%s", name,
Arrays.toString(e.getStackTrace())));
return;
}
if (lb.getConnectionLimit() != null) {
Assert.assertNotNull(protection);
}
Set<String> allowed = protection.getProperties().getAccess_restriction().getAllowed();
Set<String> banned = protection.getProperties().getAccess_restriction().getBanned();
Assert.assertTrue(allowed.contains(item1.getIpAddress()));
Assert.assertTrue(banned.contains(item2.getIpAddress()));
}
public void verifyAccessListSingleDeletion() {
Protection protection;
try {
protection = stmClient.getProtection(name);
} catch (Exception e) {
Assert.fail(String.format("Error retrieving Protection on '%s'.\n%s", name,
Arrays.toString(e.getStackTrace())));
return;
}
if (lb.getConnectionLimit() != null) {
Assert.assertNotNull(protection);
}
Set<String> allowed = protection.getProperties().getAccess_restriction().getAllowed();
Set<String> banned = protection.getProperties().getAccess_restriction().getBanned();
Assert.assertTrue(allowed.contains(item1.getIpAddress()));
Assert.assertTrue(banned.isEmpty());
}
public void verifyAccessListDeletion() {
try {
stmClient.getProtection(name);
} catch (StingrayRestClientObjectNotFoundException notFoundException) {
Assert.assertTrue("Protection object removed successfully", true);
} catch (StingrayRestClientException e) {
Assert.fail(String.format("Error retrieving Protection on '%s'.\n%s", name,
Arrays.toString(e.getStackTrace())));
return;
}
}
public void enableConnectionThrottle() {
ConnectionLimit limit = new ConnectionLimit();
limit.setMaxConnectionRate(MAX_CONECT_RATE);
limit.setMaxConnections(MAX_CONNECTIONS);
limit.setMinConnections(MIN_CONNECTIONS);
limit.setRateInterval(RATE_INTERVAL);
lb.setConnectionLimit(limit);
try {
stmAdapter.updateConnectionThrottle(config, lb);
} catch(Exception e) {
Assert.fail(String.format("Error updating Connection Throttle on '%s'.\n%s", name,
Arrays.toString(e.getStackTrace())));
}
}
public void enableSsl() {
ZeusSslTermination sslTermination = new ZeusSslTermination();
SslTermination termination = setupSsl(false);
sslTermination.setSslTermination(termination);
lb.setSslTermination(termination);
try {
stmAdapter.updateSslTermination(config, lb, sslTermination, null);
} catch (Exception e) {
Assert.fail(String.format("Error updating SSL termination on '%s'.", name));
}
}
public void enableSslOnly() {
ZeusSslTermination sslTermination = new ZeusSslTermination();
SslTermination termination = setupSsl(true);
sslTermination.setSslTermination(termination);
lb.setSslTermination(termination);
try {
stmAdapter.updateSslTermination(config, lb, sslTermination, null);
} catch (Exception e) {
Assert.fail(String.format("Error updating SSL termination on '%s'.", name));
}
}
public SslTermination setupSsl(Boolean SslOnly) {
SslTermination termination = new SslTermination();
termination.setCertificate(StmTestConstants.SSL_CERT);
termination.setPrivatekey(StmTestConstants.SSL_KEY);
termination.setSecurePort(LB_SECURE_PORT);
termination.setSecureTrafficOnly(SslOnly);
return termination;
}
public void deleteAccessListItem() {
List<Integer> deletionItems = new ArrayList<Integer>();
deletionItems.add(item2.getId());
try {
stmAdapter.deleteAccessList(config, lb, deletionItems);
} catch(Exception e) {
Assert.fail(String.format("Error deleting SSL termination on '%s'.", name));
}
}
public void deleteAccessList() {
List<Integer> deletionItems = new ArrayList<Integer>();
deletionItems.add(item1.getId());
deletionItems.add(item2.getId());
try {
stmAdapter.deleteAccessList(config, lb, deletionItems);
} catch(Exception e) {
Assert.fail(String.format("Error deleting SSL termination on '%s'.", name));
}
}
@After
public void tearDown() {
teardownEverything();
}
}