package org.openstack.atlas.adapter.zxtm;
import org.openstack.atlas.util.ca.primitives.RsaConst;
import org.openstack.atlas.util.ca.zeus.ZeusUtils;
import org.openstack.atlas.util.ca.zeus.ZeusCrtFile;
import com.zxtm.service.client.*;
import org.apache.axis.types.UnsignedInt;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Matchers;
import org.openstack.atlas.adapter.LoadBalancerEndpointConfiguration;
import org.openstack.atlas.adapter.exceptions.InsufficientRequestException;
import org.openstack.atlas.adapter.exceptions.RollBackException;
import org.openstack.atlas.adapter.service.ReverseProxyLoadBalancerAdapter;
import org.openstack.atlas.service.domain.entities.*;
import org.openstack.atlas.service.domain.pojos.*;
import org.openstack.atlas.util.ca.StringUtils;
import org.openstack.atlas.util.ca.primitives.RsaConst;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.mockito.Mockito.*;
import static org.openstack.atlas.service.domain.entities.AccessListType.ALLOW;
import static org.openstack.atlas.service.domain.entities.AccessListType.DENY;
import static org.openstack.atlas.service.domain.entities.LoadBalancerAlgorithm.ROUND_ROBIN;
import static org.openstack.atlas.service.domain.entities.LoadBalancerProtocol.HTTP;
import static org.openstack.atlas.service.domain.entities.NodeCondition.DISABLED;
import static org.openstack.atlas.service.domain.entities.NodeCondition.DRAINING;
import static org.openstack.atlas.service.domain.entities.SessionPersistence.HTTP_COOKIE;
@RunWith(Enclosed.class)
public class ZxtmAdapterImplTest {
protected static final ZeusUtils zeusUtils;
protected static final String testpkcs1 = "-----BEGIN RSA PRIVATE KEY-----\n"
+ "MIICWwIBAAKBgQCV9RAA8bqJ0igreCLb1cAQKlu9Sd/arkX4N42giadMgGkDDH96\n"
+ "nhus2x/Ljh2+I7C/pUuTVA83yRxIE4oc1OYXNsbxNqZhR8rPbeT1l/OJUJR2ohk8\n"
+ "wxYpdWjHTVwb6v0pDkVoGN2bq3QvkopzGRKoBKmJlhZ6jCyJQ+PKibv8QwIDAQAB\n"
+ "AoGAX+qLHP+BIGyC8yL5sQFswypE2bNp8tcrvBPUjA3gK6erA5833vdInmzeTnYN\n"
+ "gjQT9tFEoOzQew8w/s04ty5aKR4pUSQYyeK4zd5JQcqvkEArtD3xE9YtQ5P/Q1Pn\n"
+ "CWHV4TTltsqklnV4j1b1b5Iq+M+zXordWxpa+nBUzKjtDvkCQQDMc6SLtTfA76Qr\n"
+ "NKx5nehqb+eyD3k6iT7POmquZLXBb1OgH6l32/VtMnuyBw1qxIKwcvoXjgXjo6P0\n"
+ "hSOMeus/AkEAu8QR3erwdB8noFOkRzyzNy7lHzzArHvIJJXIOb8aVRCfDgRzetwV\n"
+ "ooJiGdQ4ZlfNFzcUALw4DdfyOwgrwFnB/QJAfzjSwnDQscktQglz7fW540mhRqbk\n"
+ "S+2NXQw/yCc5BpZM1k39eW0xKnMIj75dtft0S3Iwd6nTtlRkuMqEVW1DpwJATeRJ\n"
+ "kSjsNQ/TjXQFOzQYGHVQwUOfni3/WgX0uNfpIY6ynMsF6Nqx8udpsNNTzkjwIIhN\n"
+ "uPxbuIpzxz9dfv79NQJAS7wILWp270Tbo0kP2jDv84LJhqBumTw306n1kj8yqhfR\n"
+ "IzLnW0NQf9wGdv2z7fheczdcw8q8ZwfrruU2WGRmEg==\n"
+ "-----END RSA PRIVATE KEY-----";
protected static final String testpkcs8 = "-----BEGIN PRIVATE KEY-----\n"
+ "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJX1EADxuonSKCt4\n"
+ "ItvVwBAqW71J39quRfg3jaCJp0yAaQMMf3qeG6zbH8uOHb4jsL+lS5NUDzfJHEgT\n"
+ "ihzU5hc2xvE2pmFHys9t5PWX84lQlHaiGTzDFil1aMdNXBvq/SkORWgY3ZurdC+S\n"
+ "inMZEqgEqYmWFnqMLIlD48qJu/xDAgMBAAECgYBf6osc/4EgbILzIvmxAWzDKkTZ\n"
+ "s2ny1yu8E9SMDeArp6sDnzfe90iebN5Odg2CNBP20USg7NB7DzD+zTi3LlopHilR\n"
+ "JBjJ4rjN3klByq+QQCu0PfET1i1Dk/9DU+cJYdXhNOW2yqSWdXiPVvVvkir4z7Ne\n"
+ "it1bGlr6cFTMqO0O+QJBAMxzpIu1N8DvpCs0rHmd6Gpv57IPeTqJPs86aq5ktcFv\n"
+ "U6AfqXfb9W0ye7IHDWrEgrBy+heOBeOjo/SFI4x66z8CQQC7xBHd6vB0HyegU6RH\n"
+ "PLM3LuUfPMCse8gklcg5vxpVEJ8OBHN63BWigmIZ1DhmV80XNxQAvDgN1/I7CCvA\n"
+ "WcH9AkB/ONLCcNCxyS1CCXPt9bnjSaFGpuRL7Y1dDD/IJzkGlkzWTf15bTEqcwiP\n"
+ "vl21+3RLcjB3qdO2VGS4yoRVbUOnAkBN5EmRKOw1D9ONdAU7NBgYdVDBQ5+eLf9a\n"
+ "BfS41+khjrKcywXo2rHy52mw01POSPAgiE24/Fu4inPHP11+/v01AkBLvAgtanbv\n"
+ "RNujSQ/aMO/zgsmGoG6ZPDfTqfWSPzKqF9EjMudbQ1B/3AZ2/bPt+F5zN1zDyrxn\n"
+ "B+uu5TZYZGYS\n"
+ "-----END PRIVATE KEY-----\n";
protected static final String testCrt = "-----BEGIN CERTIFICATE-----\n"
+ "MIIDITCCAoqgAwIBAgIGATbHOhIHMA0GCSqGSIb3DQEBBQUAMG4xDDAKBgNVBAYT\n"
+ "A1VTQTEOMAwGA1UECBMFVGV4YXMxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ0wCwYD\n"
+ "VQQKEwRUZXN0MREwDwYDVQQLEwhUb3AgQ0EgMjEWMBQGA1UEAxMNVG9wIENBIDIg\n"
+ "VGVzdDAeFw0xMjA0MTgyMDUyMTNaFw0yMzA3MDYyMDUyMTNaMGsxDDAKBgNVBAYT\n"
+ "A1VTQTEOMAwGA1UECBMFVGV4YXMxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ0wCwYD\n"
+ "VQQKEwRUZXN0MREwDwYDVQQLEwhFbmQgVXNlcjETMBEGA1UEAxMKd3d3LmV1Lm9y\n"
+ "ZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAlfUQAPG6idIoK3gi29XAECpb\n"
+ "vUnf2q5F+DeNoImnTIBpAwx/ep4brNsfy44dviOwv6VLk1QPN8kcSBOKHNTmFzbG\n"
+ "8TamYUfKz23k9ZfziVCUdqIZPMMWKXVox01cG+r9KQ5FaBjdm6t0L5KKcxkSqASp\n"
+ "iZYWeowsiUPjyom7/EMCAwEAAaOBzDCByTAMBgNVHRMBAf8EAjAAMIGZBgNVHSME\n"
+ "gZEwgY6AFIHKHyKCb/UX5l1k/k4FDyDD4jfboW6kbDBqMRQwEgYDVQQDEwtUb3Ag\n"
+ "Q0EgVGVzdDEPMA0GA1UECxMGVG9wIENBMQ0wCwYDVQQKEwRUZXN0MRQwEgYDVQQH\n"
+ "EwtTYW4gQW50b25pbzEOMAwGA1UECBMFVGV4YXMxDDAKBgNVBAYTA1VTQYIGATbH\n"
+ "OSgXMB0GA1UdDgQWBBRdttAMJYQrChBJCpkqC1Yvy8nCuzANBgkqhkiG9w0BAQUF\n"
+ "AAOBgQA8LuaDGGmzCK5VEtPRGJdzBpYYFQUtoAEHoNBSmzBAZIwqAtKU/QmxbHOV\n"
+ "gDIO5BgO7+ZXFQpWOn6wjLIR9mvpixnEzcnZVPB2g/b32EqahhUZztBuK7EM3TzK\n"
+ "7bYqlQTqCxN/L+76HLrWXAU6WWlRJPuqc0byOzsSSRrdxrSBrg==\n"
+ "-----END CERTIFICATE-----\n";
protected static final String testChain = "-----BEGIN CERTIFICATE-----\n"
+ "MIIDHjCCAoegAwIBAgIGATbHOSgXMA0GCSqGSIb3DQEBBQUAMGoxFDASBgNVBAMT\n"
+ "C1RvcCBDQSBUZXN0MQ8wDQYDVQQLEwZUb3AgQ0ExDTALBgNVBAoTBFRlc3QxFDAS\n"
+ "BgNVBAcTC1NhbiBBbnRvbmlvMQ4wDAYDVQQIEwVUZXhhczEMMAoGA1UEBhMDVVNB\n"
+ "MB4XDTEyMDQxODIwNTExM1oXDTIzMDcwNjIwNTExM1owbjEMMAoGA1UEBhMDVVNB\n"
+ "MQ4wDAYDVQQIEwVUZXhhczEUMBIGA1UEBxMLU2FuIEFudG9uaW8xDTALBgNVBAoT\n"
+ "BFRlc3QxETAPBgNVBAsTCFRvcCBDQSAyMRYwFAYDVQQDEw1Ub3AgQ0EgMiBUZXN0\n"
+ "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCZHmTOiuV071K1b/8cQYPkwq7l\n"
+ "OH+qpEvqiRugkk6UAlPsjbtr3l0BjVG6SMmQrxedx5lMaPxbqKCu8fkN9xpjVhpH\n"
+ "uhN3aCR/6AzOVPKP2OLMzxb2SpjkSmCyvfTcIy1GHsERvDivTuOTOeL6NldLj/gX\n"
+ "lAh1jCmE0nfyqpMu+QIDAQABo4HKMIHHMA8GA1UdEwEB/wQFMAMBAf8wgZQGA1Ud\n"
+ "IwSBjDCBiYAUY3Vobf2d4HtKZVE17BoxFoxEFQKhbqRsMGoxFDASBgNVBAMTC1Rv\n"
+ "cCBDQSBUZXN0MQ8wDQYDVQQLEwZUb3AgQ0ExDTALBgNVBAoTBFRlc3QxFDASBgNV\n"
+ "BAcTC1NhbiBBbnRvbmlvMQ4wDAYDVQQIEwVUZXhhczEMMAoGA1UEBhMDVVNBggEB\n"
+ "MB0GA1UdDgQWBBSByh8igm/1F+ZdZP5OBQ8gw+I32zANBgkqhkiG9w0BAQUFAAOB\n"
+ "gQCbb74q/rHQskgru1beKiO2grOooYhrnBfZP9saOyn8q1/9GNVgOxsRzIfCu2JU\n"
+ "CJlY0o/8YFKUioOD1nGVUQs+FI9Ui2VZFzYaDIcHJwvD+ynFoFObFeYVRh8kVMT9\n"
+ "gTDV9+xVOqql+ezaJ3XGikQPyPHA+japgpHimuvixAep4w==\n"
+ "-----END CERTIFICATE-----\n"
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIICfDCCAeWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBqMRQwEgYDVQQDEwtUb3Ag\n"
+ "Q0EgVGVzdDEPMA0GA1UECxMGVG9wIENBMQ0wCwYDVQQKEwRUZXN0MRQwEgYDVQQH\n"
+ "EwtTYW4gQW50b25pbzEOMAwGA1UECBMFVGV4YXMxDDAKBgNVBAYTA1VTQTAeFw0x\n"
+ "MjA0MTgyMDUwMTZaFw0yMzA3MDYyMDUwMTZaMGoxFDASBgNVBAMTC1RvcCBDQSBU\n"
+ "ZXN0MQ8wDQYDVQQLEwZUb3AgQ0ExDTALBgNVBAoTBFRlc3QxFDASBgNVBAcTC1Nh\n"
+ "biBBbnRvbmlvMQ4wDAYDVQQIEwVUZXhhczEMMAoGA1UEBhMDVVNBMIGfMA0GCSqG\n"
+ "SIb3DQEBAQUAA4GNADCBiQKBgQC55/X9PEfTjdH9hwG5Ka8CNgHwz3AkAb0BOSUm\n"
+ "8e0rGawIcJNwHEN/Lhv8pjsx0u7WfUAoEaJu2EdLkC1tJgIi98TEAjDDBiArbYsK\n"
+ "QFJn+LdO6jpNbbzEeSP0MZn0f5G3Vl2UFncsiCQq32mJqQ0cD2ZN6+16ileEscvW\n"
+ "p0jiXwIDAQABozIwMDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRjdWht/Z3g\n"
+ "e0plUTXsGjEWjEQVAjANBgkqhkiG9w0BAQUFAAOBgQBKh7/4GOO6i/Id5sXDsJsg\n"
+ "h9QI4hpwHdnF9tZLjKQI33ZT5pM+IWEH0KF7OLovNd+vJG0K//bahaSrIuqWFrzs\n"
+ "LeZnkJImpkWH4AoCHGtVRs9P4hJpgSLou/bgM2kw/gh5QK5ZyJpTBNCpbmzXv32z\n"
+ "8+ZxXJuXPBYk2O1RnJKCjA==\n"
+ "-----END CERTIFICATE-----\n";
static {
zeusUtils = new ZeusUtils();
}
public static class WhenTestingOrderOfZeusApiCalls {
private LoadBalancerEndpointConfiguration dummyConfig;
private ReverseProxyLoadBalancerAdapter adapterSpy;
private ZxtmServiceStubs serviceStubs;
private PoolBindingStub poolStub;
private VirtualServerBindingStub vsStub;
private TrafficIPGroupsBindingStub trafficIpGroupStub;
private CatalogProtectionBindingStub protectionStub;
private CatalogPersistenceBindingStub persistenceStub;
private CatalogMonitorBindingStub monitorStub;
private CatalogRuleBindingStub ruleStub;
private CatalogRateBindingStub rateStub;
private LoadBalancer lb;
private static final String ZXTM_USERNAME = "mocked_username";
private static final String ZXTM_PASSWORD = "mocked_password";
private static final String ZXTM_ENDPOINT_URI = "https://mock.endpoint.uri:9090/soap";
private static final String ZXTM_REST_ENDPOINT_URI = "https://mock.endpoint.uri:9090/tm/2.0/config/active/";
private static final String TARGET_HOST = "ztm-n01.mock.endpoint.uri";
private static final String FAILOVER_HOST_1 = "ztm-n03.mock.endpoint.uri";
private static final String FAILOVER_HOST_2 = "ztm-n04.mock.endpoint.uri";
@Before
public void standUp() throws RemoteException, MalformedURLException {
List<String> targetFailoverHosts = new ArrayList<String>();
targetFailoverHosts.add(FAILOVER_HOST_1);
targetFailoverHosts.add(FAILOVER_HOST_2);
Host soapEndpointHost = new Host();
soapEndpointHost.setEndpoint(ZXTM_ENDPOINT_URI);
soapEndpointHost.setRestEndpoint(ZXTM_REST_ENDPOINT_URI);
Host trafficManagerHost = new Host();
trafficManagerHost.setTrafficManagerName(TARGET_HOST);
trafficManagerHost.setEndpoint(ZXTM_ENDPOINT_URI);
List<Host> failoverHosts = new ArrayList<Host>();
failoverHosts.add(trafficManagerHost);
dummyConfig = new LoadBalancerEndpointConfiguration(soapEndpointHost, ZXTM_USERNAME, ZXTM_PASSWORD, trafficManagerHost, targetFailoverHosts, failoverHosts);
adapterSpy = spy(new ZxtmAdapterImpl());
serviceStubs = mock(ZxtmServiceStubs.class);
doReturn(serviceStubs).when(adapterSpy).getServiceStubs(Matchers.<LoadBalancerEndpointConfiguration>anyObject());
poolStub = mock(PoolBindingStub.class);
vsStub = mock(VirtualServerBindingStub.class);
trafficIpGroupStub = mock(TrafficIPGroupsBindingStub.class);
protectionStub = mock(CatalogProtectionBindingStub.class);
persistenceStub = mock(CatalogPersistenceBindingStub.class);
monitorStub = mock(CatalogMonitorBindingStub.class);
ruleStub = mock(CatalogRuleBindingStub.class);
rateStub = mock(CatalogRateBindingStub.class);
when(serviceStubs.getPoolBinding()).thenReturn(poolStub);
when(serviceStubs.getVirtualServerBinding()).thenReturn(vsStub);
when(serviceStubs.getTrafficIpGroupBinding()).thenReturn(trafficIpGroupStub);
when(serviceStubs.getProtectionBinding()).thenReturn(protectionStub);
when(serviceStubs.getPersistenceBinding()).thenReturn(persistenceStub);
when(serviceStubs.getMonitorBinding()).thenReturn(monitorStub);
when(serviceStubs.getZxtmRuleCatalogService()).thenReturn(ruleStub);
when(serviceStubs.getZxtmRateCatalogService()).thenReturn(rateStub);
when(serviceStubs.getPoolBinding().getLoadBalancingAlgorithm(Matchers.<String[]>any())).thenReturn(new PoolLoadBalancingAlgorithm[]{PoolLoadBalancingAlgorithm.wroundrobin});
when(serviceStubs.getVirtualServerBinding().getRules(Matchers.<String[]>any())).thenReturn(new VirtualServerRule[][]{{}});
when(serviceStubs.getVirtualServerBinding().getListenOnAllAddresses(Matchers.<String[]>any())).thenReturn(new boolean[]{false});
when(serviceStubs.getVirtualServerBinding().getProtocol(Matchers.<String[]>any())).thenReturn(new VirtualServerProtocol[]{VirtualServerProtocol.fromValue(VirtualServerProtocol._http)});
when(serviceStubs.getVirtualServerBinding().getVirtualServerNames()).thenReturn(new String[]{});
when(serviceStubs.getZxtmRuleCatalogService().getRuleNames()).thenReturn(new String[]{});
}
@Before
public void setupSimpleLoadBalancer() {
Set<LoadBalancerJoinVip> vipList = new HashSet<LoadBalancerJoinVip>();
VirtualIp vip = new VirtualIp();
vip.setId(1234);
vip.setIpAddress("10.69.0.60");
LoadBalancerJoinVip loadBalancerJoinVip = new LoadBalancerJoinVip();
loadBalancerJoinVip.setVirtualIp(vip);
vipList.add(loadBalancerJoinVip);
Set<Node> nodeList = new HashSet<Node>();
Node node1 = new Node();
Node node2 = new Node();
node1.setIpAddress("127.0.0.1");
node2.setIpAddress("127.0.0.2");
node1.setPort(80);
node2.setPort(80);
node1.setCondition(DRAINING);
node2.setCondition(DISABLED);
node1.setWeight(5);
node2.setWeight(10);
nodeList.add(node1);
nodeList.add(node2);
lb = new LoadBalancer();
lb.setId(1234);
lb.setAccountId(1234);
lb.setPort(80);
lb.setAlgorithm(ROUND_ROBIN);
lb.setName("integration_test_lb");
lb.setProtocol(HTTP);
lb.setHttpsRedirect(false);
lb.setNodes(nodeList);
lb.setLoadBalancerJoinVipSet(vipList);
}
@Test
public void shouldRunInOrderWhenCreatingASimpleLoadBalancer() throws InsufficientRequestException, RemoteException, RollBackException {
InOrder inOrder = inOrder(poolStub, vsStub, trafficIpGroupStub, ruleStub, rateStub);
adapterSpy.createLoadBalancer(dummyConfig, lb);
inOrder.verify(poolStub).addPool(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(poolStub).setLoadBalancingAlgorithm(Matchers.<String[]>anyObject(), Matchers.<PoolLoadBalancingAlgorithm[]>anyObject());
inOrder.verify(poolStub).setDisabledNodes(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(poolStub).setDrainingNodes(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(poolStub).setNodesWeightings(Matchers.<String[]>anyObject(), Matchers.<PoolWeightingsDefinition[][]>anyObject());
inOrder.verify(vsStub).addVirtualServer(Matchers.<String[]>anyObject(), Matchers.<VirtualServerBasicInfo[]>anyObject());
inOrder.verify(trafficIpGroupStub).addTrafficIPGroup(Matchers.<String[]>anyObject(), Matchers.<TrafficIPGroupsDetails[]>anyObject());
inOrder.verify(vsStub).setListenTrafficIPGroups(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
// inOrder.verify(ruleStub).getRuleNames();
// inOrder.verify(vsStub).getProtocol(Matchers.<String[]>any());
}
@Test
public void shouldRunInOrderWhenCreatingAFullyConfiguredLoadBalancer() throws InsufficientRequestException, RemoteException, RollBackException {
lb.setAlgorithm(LoadBalancerAlgorithm.WEIGHTED_ROUND_ROBIN);
lb.setSessionPersistence(HTTP_COOKIE);
HealthMonitor monitor = new HealthMonitor();
monitor.setType(HealthMonitorType.CONNECT);
monitor.setDelay(10);
monitor.setTimeout(20);
monitor.setAttemptsBeforeDeactivation(3);
lb.setHealthMonitor(monitor);
ConnectionLimit limit = new ConnectionLimit();
limit.setMaxConnections(50);
limit.setRateInterval(10);
limit.setMaxConnectionRate(10);
limit.setMinConnections(1);
lb.setConnectionLimit(limit);
lb.setConnectionLogging(true);
Set<AccessList> networkItems = new HashSet<AccessList>();
AccessList item1 = new AccessList();
AccessList item2 = new AccessList();
item1.setIpAddress("0.0.0.0/0");
item2.setIpAddress("127.0.0.1");
item1.setType(DENY);
item2.setType(ALLOW);
networkItems.add(item1);
networkItems.add(item2);
lb.setAccessLists(networkItems);
InOrder inOrder = inOrder(poolStub, vsStub, trafficIpGroupStub, monitorStub, protectionStub);
adapterSpy.createLoadBalancer(dummyConfig, lb);
inOrder.verify(poolStub).addPool(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(poolStub).setLoadBalancingAlgorithm(Matchers.<String[]>anyObject(), Matchers.<PoolLoadBalancingAlgorithm[]>anyObject());
inOrder.verify(poolStub).setDisabledNodes(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(poolStub).setDrainingNodes(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(poolStub).setNodesWeightings(Matchers.<String[]>anyObject(), Matchers.<PoolWeightingsDefinition[][]>anyObject());
inOrder.verify(vsStub).addVirtualServer(Matchers.<String[]>anyObject(), Matchers.<VirtualServerBasicInfo[]>anyObject());
inOrder.verify(trafficIpGroupStub).addTrafficIPGroup(Matchers.<String[]>anyObject(), Matchers.<TrafficIPGroupsDetails[]>anyObject());
inOrder.verify(vsStub).setListenTrafficIPGroups(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(poolStub).setPersistence(Matchers.<String[]>anyObject(), Matchers.<String[]>anyObject());
inOrder.verify(monitorStub).setType(Matchers.<String[]>anyObject(), Matchers.<CatalogMonitorType[]>anyObject());
inOrder.verify(vsStub).setProtection(Matchers.<String[]>anyObject(), Matchers.<String[]>anyObject());
inOrder.verify(vsStub).setLogEnabled(Matchers.<String[]>anyObject(), Matchers.<boolean[]>anyObject());
inOrder.verify(protectionStub).setAllowedAddresses(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(protectionStub).setBannedAddresses(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
}
@Test
public void shouldRunInOrderWhenDeletingALoadBalancer() throws InsufficientRequestException, RemoteException, RollBackException {
InOrder inOrder = inOrder(poolStub, vsStub, monitorStub, protectionStub, trafficIpGroupStub);
adapterSpy.deleteLoadBalancer(dummyConfig, lb);
inOrder.verify(vsStub).deleteVirtualServer(Matchers.<String[]>anyObject());
inOrder.verify(poolStub).deletePool(Matchers.<String[]>anyObject());
inOrder.verify(protectionStub).deleteProtection(Matchers.<String[]>anyObject());
inOrder.verify(poolStub).removeMonitors(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(monitorStub).deleteMonitors(Matchers.<String[]>anyObject());
inOrder.verify(trafficIpGroupStub).deleteTrafficIPGroup(Matchers.<String[]>anyObject());
}
}
public static class WhenSettingUpHostSubnets {
private Hostssubnet hs1;
private Hostssubnet hs2;
private Hostssubnet hs3;
private Hostssubnet hs4;
private List<Hostssubnet> hList;
@Before
public void setUpClass() throws Exception {
hs1 = new Hostssubnet();
Hostsubnet hostsubnet;
hostsubnet = new Hostsubnet();
hostsubnet.setName("n01.zeus.something");
hostsubnet.getNetInterfaces().add(newNetInterface("eth0", "192.168.0.0/16", "172.16.0.0/12"));
hostsubnet.getNetInterfaces().add(newNetInterface("eth1", "10.69.0.0/24"));
hs1.getHostsubnets().add(hostsubnet);
hs2 = new Hostssubnet();
hostsubnet = new Hostsubnet();
hostsubnet.setName("n01.zeus.something");
hostsubnet.getNetInterfaces().add(newNetInterface("eth1", "10.69.1.0/24"));
hostsubnet.getNetInterfaces().add(newNetInterface("eth0", "169.254.0.0/16"));
hostsubnet.getNetInterfaces().add(newNetInterface("lo", "127.0.0.0/8"));
hs2.getHostsubnets().add(hostsubnet);
hList = new ArrayList<Hostssubnet>();
hList.add(hs1);
hList.add(hs2);
hs3 = new Hostssubnet();
hostsubnet = new Hostsubnet();
hostsubnet.setName("test");
hostsubnet.getNetInterfaces().add(newNetInterface("eth0", "192.168.1.0/24", "192.168.2.0/24", "192.168.3.0/24"));
hostsubnet.getNetInterfaces().add(newNetInterface("eth1", "127.0.0.0/8", "10.69.2.0/24", "10.69.1.0/24"));
hostsubnet.getNetInterfaces().add(newNetInterface("lo", "169.254.0.0/16"));
hs3.getHostsubnets().add(hostsubnet);
hs4 = new Hostssubnet();
hostsubnet = new Hostsubnet();
hostsubnet.setName("test");
hostsubnet.getNetInterfaces().add(newNetInterface("eth0", "192.168.2.0/24"));
hostsubnet.getNetInterfaces().add(newNetInterface("eth1", "127.0.0.0/8"));
hostsubnet.getNetInterfaces().add(newNetInterface("lo", "169.254.0.0/16"));
hs4.getHostsubnets().add(hostsubnet);
}
@Test
public void testdomainUnionSubnetMapping() {
Hostssubnet resp = ZxtmAdapterImpl.domainUnionSubnetMapping(hList);
Assert.assertTrue(resp.getHostsubnets().size() == 1);
Assert.assertTrue(resp.getHostsubnets().get(0).getNetInterfaces().size() == 3);
}
@Test
public void domainSubnetMappingRemove() {
Hostssubnet resp = ZxtmAdapterImpl.domainSubnetMappingRemove(hs3, hs4);
Assert.assertTrue(resp.getHostsubnets().size() == 1);
Assert.assertTrue(resp.getHostsubnets().get(0).getNetInterfaces().size() == 2);
}
public static NetInterface newNetInterface(String name, String... blocks) {
int i;
NetInterface iface = new NetInterface();
Cidr cidr;
iface.setName(name);
for (i = 0; i < blocks.length; i++) {
cidr = new Cidr();
cidr.setBlock(blocks[i]);
iface.getCidrs().add(cidr);
}
return iface;
}
}
public static class WhenVerifyingSSLTermination {
//TODO: move...
private LoadBalancerEndpointConfiguration dummyConfig;
private ReverseProxyLoadBalancerAdapter adapterSpy;
private ZxtmServiceStubs serviceStubs;
private PoolBindingStub poolStub;
private VirtualServerBindingStub vsStub;
private TrafficIPGroupsBindingStub trafficIpGroupStub;
private CatalogProtectionBindingStub protectionStub;
private CatalogPersistenceBindingStub persistenceStub;
private CatalogMonitorBindingStub monitorStub;
private CatalogRuleBindingStub ruleStub;
private CatalogRateBindingStub rateStub;
private CatalogSSLCertificatesBindingStub certificateCatalogService;
private LoadBalancer lb;
private static final String ZXTM_USERNAME = "mocked_username";
private static final String ZXTM_PASSWORD = "mocked_password";
private static final String ZXTM_ENDPOINT_URI = "https://mock.endpoint.uri:9090/soap/";
private static final String ZXTM_REST_ENDPOINT_URI = "https://mock.endpoint.uri:9090/tm/2.0/config/active/";
private static final String TARGET_HOST = "ztm-n01.mock.endpoint.uri";
private static final String FAILOVER_HOST_1 = "ztm-n03.mock.endpoint.uri";
private static final String FAILOVER_HOST_2 = "ztm-n04.mock.endpoint.uri";
private SslTermination sslTermination;
@Before
public void setupSimpleLoadBalancer() {
Set<LoadBalancerJoinVip> vipList = new HashSet<LoadBalancerJoinVip>();
VirtualIp vip = new VirtualIp();
vip.setId(1234);
vip.setIpAddress("10.69.0.60");
LoadBalancerJoinVip loadBalancerJoinVip = new LoadBalancerJoinVip();
loadBalancerJoinVip.setVirtualIp(vip);
vipList.add(loadBalancerJoinVip);
Set<Node> nodeList = new HashSet<Node>();
Node node1 = new Node();
Node node2 = new Node();
node1.setIpAddress("127.0.0.1");
node2.setIpAddress("127.0.0.2");
node1.setPort(80);
node2.setPort(80);
node1.setCondition(DRAINING);
node2.setCondition(DISABLED);
node1.setWeight(5);
node2.setWeight(10);
nodeList.add(node1);
nodeList.add(node2);
lb = new LoadBalancer();
lb.setId(1234);
lb.setAccountId(1234);
lb.setPort(80);
lb.setAlgorithm(ROUND_ROBIN);
lb.setName("integration_test_lb");
lb.setProtocol(HTTP);
lb.setNodes(nodeList);
lb.setLoadBalancerJoinVipSet(vipList);
}
@Before
public void setUpClass() throws Exception {
List<String> targetFailoverHosts = new ArrayList<String>();
targetFailoverHosts.add(FAILOVER_HOST_1);
targetFailoverHosts.add(FAILOVER_HOST_2);
Host soapEndpointHost = new Host();
soapEndpointHost.setEndpoint(ZXTM_ENDPOINT_URI);
soapEndpointHost.setRestEndpoint(ZXTM_REST_ENDPOINT_URI);
Host trafficManagerHost = new Host();
trafficManagerHost.setTrafficManagerName(TARGET_HOST);
trafficManagerHost.setEndpoint(ZXTM_ENDPOINT_URI);
List<Host> failoverHosts = new ArrayList<Host>();
failoverHosts.add(trafficManagerHost);
dummyConfig = new LoadBalancerEndpointConfiguration(soapEndpointHost, ZXTM_USERNAME, ZXTM_PASSWORD, trafficManagerHost, targetFailoverHosts, failoverHosts);
RsaConst.init();
adapterSpy = spy(new ZxtmAdapterImpl());
serviceStubs = mock(ZxtmServiceStubs.class);
doReturn(serviceStubs).when(adapterSpy).getServiceStubs(Matchers.<LoadBalancerEndpointConfiguration>anyObject());
poolStub = mock(PoolBindingStub.class);
vsStub = mock(VirtualServerBindingStub.class);
trafficIpGroupStub = mock(TrafficIPGroupsBindingStub.class);
protectionStub = mock(CatalogProtectionBindingStub.class);
persistenceStub = mock(CatalogPersistenceBindingStub.class);
monitorStub = mock(CatalogMonitorBindingStub.class);
ruleStub = mock(CatalogRuleBindingStub.class);
rateStub = mock(CatalogRateBindingStub.class);
certificateCatalogService = mock(CatalogSSLCertificatesBindingStub.class);
when(serviceStubs.getPoolBinding()).thenReturn(poolStub);
when(serviceStubs.getVirtualServerBinding()).thenReturn(vsStub);
when(serviceStubs.getTrafficIpGroupBinding()).thenReturn(trafficIpGroupStub);
when(serviceStubs.getProtectionBinding()).thenReturn(protectionStub);
when(serviceStubs.getPersistenceBinding()).thenReturn(persistenceStub);
when(serviceStubs.getMonitorBinding()).thenReturn(monitorStub);
when(serviceStubs.getZxtmRuleCatalogService()).thenReturn(ruleStub);
when(serviceStubs.getZxtmRateCatalogService()).thenReturn(rateStub);
when(serviceStubs.getZxtmCatalogSSLCertificatesBinding()).thenReturn(certificateCatalogService);
when(serviceStubs.getPoolBinding().getLoadBalancingAlgorithm(Matchers.<String[]>any())).thenReturn(new PoolLoadBalancingAlgorithm[]{PoolLoadBalancingAlgorithm.wroundrobin});
when(serviceStubs.getVirtualServerBinding().getRules(Matchers.<String[]>any())).thenReturn(new VirtualServerRule[][]{{}});
when(serviceStubs.getVirtualServerBinding().getListenOnAllAddresses(Matchers.<String[]>any())).thenReturn(new boolean[]{false});
when(serviceStubs.getVirtualServerBinding().getProtocol(Matchers.<String[]>any())).thenReturn(new VirtualServerProtocol[]{VirtualServerProtocol.fromValue(VirtualServerProtocol._http)});
when(serviceStubs.getVirtualServerBinding().getVirtualServerNames()).thenReturn(new String[]{});
when(serviceStubs.getVirtualServerBinding().getPort(Matchers.<String[]>any())).thenReturn(new UnsignedInt[]{new UnsignedInt(80)});
when(serviceStubs.getZxtmRuleCatalogService().getRuleNames()).thenReturn(new String[]{});
}
@Test
public void WhenAddingSslTermination() throws RollBackException, InsufficientRequestException, RemoteException {
lb.setAlgorithm(LoadBalancerAlgorithm.WEIGHTED_ROUND_ROBIN);
lb.setSessionPersistence(HTTP_COOKIE);
HealthMonitor monitor = new HealthMonitor();
monitor.setType(HealthMonitorType.CONNECT);
monitor.setDelay(10);
monitor.setTimeout(20);
monitor.setAttemptsBeforeDeactivation(3);
lb.setHealthMonitor(monitor);
ConnectionLimit limit = new ConnectionLimit();
limit.setMaxConnections(50);
limit.setRateInterval(10);
limit.setMaxConnectionRate(10);
limit.setMinConnections(1);
lb.setConnectionLimit(limit);
lb.setConnectionLogging(true);
Set<AccessList> networkItems = new HashSet<AccessList>();
AccessList item1 = new AccessList();
AccessList item2 = new AccessList();
item1.setIpAddress("0.0.0.0/0");
item2.setIpAddress("127.0.0.1");
item1.setType(DENY);
item2.setType(ALLOW);
networkItems.add(item1);
networkItems.add(item2);
lb.setAccessLists(networkItems);
SslTermination sslTermination = new SslTermination();
sslTermination.setIntermediateCertificate(testChain);
sslTermination.setCertificate(testCrt);
sslTermination.setPrivatekey(testpkcs8);
sslTermination.setEnabled(true);
sslTermination.setSecurePort(443);
sslTermination.setSecureTrafficOnly(false);
lb.setSslTermination(sslTermination);
ZeusCrtFile zcf = zeusUtils.buildZeusCrtFileLbassValidation(testpkcs8, testCrt, testChain);
String pkcs1 = zcf.getPrivate_key();
String errors = StringUtils.joinString(zcf.getFatalErrorList(), ",");
Assert.assertFalse(errors, zcf.hasFatalErrors());
ZeusSslTermination zeusSslTermination = new ZeusSslTermination();
zeusSslTermination.setCertIntermediateCert(testChain);
zeusSslTermination.setSslTermination(sslTermination);
lb.setHttpsRedirect(false);
InOrder inOrder = inOrder(vsStub, vsStub, vsStub, protectionStub, protectionStub, certificateCatalogService, vsStub, vsStub);
adapterSpy.updateSslTermination(dummyConfig, lb, zeusSslTermination);
inOrder.verify(vsStub).addVirtualServer(Matchers.<String[]>anyObject(), Matchers.<VirtualServerBasicInfo[]>anyObject());
inOrder.verify(vsStub).setProtection(Matchers.<String[]>anyObject(), Matchers.<String[]>anyObject());
inOrder.verify(vsStub).setLogEnabled(Matchers.<String[]>anyObject(), Matchers.<boolean[]>anyObject());
inOrder.verify(protectionStub).setAllowedAddresses(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(protectionStub).setBannedAddresses(Matchers.<String[]>anyObject(), Matchers.<String[][]>anyObject());
inOrder.verify(certificateCatalogService).importCertificate(Matchers.<String[]>anyObject(), Matchers.<CertificateFiles[]>anyObject());
inOrder.verify(vsStub).setSSLCertificate(Matchers.<String[]>anyObject(), Matchers.<String[]>anyObject());
inOrder.verify(vsStub).setSSLDecrypt(Matchers.<String[]>anyObject(), Matchers.<boolean[]>anyObject());
}
@Test
public void WhenDeletingSslTermination() throws RollBackException, InsufficientRequestException, RemoteException {
SslTermination sslTermination = new SslTermination();
sslTermination.setIntermediateCertificate("iCert");
sslTermination.setCertificate("cert");
sslTermination.setPrivatekey("aPrivateKey");
sslTermination.setEnabled(true);
sslTermination.setSecurePort(443);
sslTermination.setSecureTrafficOnly(false);
lb.setSslTermination(sslTermination);
InOrder inOrder = inOrder(vsStub, vsStub, certificateCatalogService, vsStub);
adapterSpy.removeSslTermination(dummyConfig, lb);
inOrder.verify(vsStub).setSSLDecrypt(Matchers.<String[]>anyObject(), Matchers.<boolean[]>anyObject());
inOrder.verify(vsStub).setSSLCertificate(Matchers.<String[]>anyObject(), Matchers.<String[]>anyObject());
inOrder.verify(certificateCatalogService).deleteCertificate(Matchers.<String[]>anyObject());
inOrder.verify(vsStub).deleteVirtualServer(Matchers.<String[]>anyObject());
}
}
}