blob: e8eb5db0939556a573584544efa9a28a8100cf06 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.aws.ec2.features;
import static javax.ws.rs.core.Response.Status.PRECONDITION_FAILED;
import static org.jclouds.aws.ec2.options.RouteOptions.Builder.destinationCidrBlock;
import static org.jclouds.aws.ec2.options.RouteOptions.Builder.gatewayId;
import static org.jclouds.aws.ec2.options.RouteTableOptions.Builder.dryRun;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import okhttp3.mockwebserver.MockResponse;
import org.jclouds.aws.AWSResponseException;
import org.jclouds.aws.ec2.domain.Route;
import org.jclouds.aws.ec2.domain.RouteTable;
import org.jclouds.aws.ec2.internal.BaseAWSEC2ApiMockTest;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
@Test(groups = "unit", testName = "RouteTableApiMockTest", singleThreaded = true)
public class RouteTableApiMockTest extends BaseAWSEC2ApiMockTest {
public void describeRouteTables() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404));
final ImmutableList<RouteTable> routeTables = routeTableApi().describeRouteTables(DEFAULT_REGION).toList();
assertTrue(routeTables.isEmpty(), "Returned " + routeTables.size() + " results for 404 response: " + routeTables);
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DescribeRouteTables");
}
public void describeRouteTablesNotFound() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/describe_route_tables.xml");
final ImmutableList<RouteTable> routeTables = routeTableApi().describeRouteTables(DEFAULT_REGION).toList();
assertNotNull(routeTables, "Failed to create route table description object");
assertEquals(routeTables.size(), 3, "Failed to return all entries from test data, returned: " + routeTables);
for (RouteTable table : routeTables) {
if (ImmutableList.of("rtb-80a3fae4", "rtb-d4605bb0").contains(table.id())) {
assertRoutesForNormalVpc(table, table.id());
} else if (table.id().equals("rtb-e6c98381")) {
assertRoutesForTestVpc(table, table.id());
}
}
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DescribeRouteTables");
}
public void describeRouteTablesWithInvalidStateValue() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/describe_route_tables_invalid.xml");
final ImmutableList<RouteTable> routeTables = routeTableApi().describeRouteTables(DEFAULT_REGION).toList();
assertNotNull(routeTables, "Failed to create route table description object");
assertEquals(routeTables.size(), 1, "Failed to return expected entry from test data, returned: " + routeTables);
assertEquals(routeTables.get(0).routeSet().get(0).state(), Route.RouteState.UNRECOGNIZED);
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DescribeRouteTables");
}
private void assertRoutesForNormalVpc(RouteTable table, String id) {
assertEquals(table.routeSet().size(), 2, "Failed to match test data route set size for " + id);
final String actual = table.associationSet().get(0).routeTableId();
assertEquals(actual, id, "Test data mismatch in " + id + " association set routeTableId(): " + actual);
assertTrue(table.associationSet().get(0).main(), "Test data mismatch in " + id + " association 'main'");
}
private void assertRoutesForTestVpc(RouteTable table, String id) {
assertEquals(table.routeSet().size(), 1, "Failed to match test data route set size for " + id);
assertEquals(table.routeSet().get(0).destinationCidrBlock(), "10.20.30.0/24",
"Mismatch in test data for " + id + " route set destinationCidrBlock");
assertEquals(table.routeSet().get(0).gatewayId(), "local",
"Mismatch in test data for " + id + " route set gatewayId");
assertEquals(table.routeSet().get(0).state(), Route.RouteState.ACTIVE,
"Mismatch in test data for " + id + " route set state");
final String actual = table.associationSet().get(0).routeTableId();
assertEquals(actual, id, "Test data mismatch in " + id + " association set routeTableId(): " + actual);
assertTrue(table.associationSet().get(0).main(), "Test data mismatch in " + id + " association 'main'");
}
public void createRouteTable() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/create_route_table.xml");
RouteTable result = routeTableApi().createRouteTable(DEFAULT_REGION, "vpc-1a2b3c4d");
assertNotNull(result, "Failed to create RouteTable object");
assertEquals(result.id(), "rtb-8bda6cef", "Gateway id does not match mock data: " + result.id());
assertEquals(result.routeSet().size(), 2, "Should have 2 routes");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=CreateRouteTable&VpcId=vpc-1a2b3c4d");
}
public void createRouteTableWithOptions() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(PRECONDITION_FAILED, DEFAULT_REGION, "/dry_run.xml");
try {
routeTableApi().createRouteTable(DEFAULT_REGION, "vpc-1a2b3c4d", dryRun());
Assert.fail("Expected 'DryRunOperation' exception was not thrown");
} catch (AWSResponseException e) {
assertDryRun(e);
}
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=CreateRouteTable&VpcId=vpc-1a2b3c4d&DryRun=true");
}
public void deleteRouteTable() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/delete_route_table.xml");
final boolean deleted = routeTableApi().deleteRouteTable(DEFAULT_REGION, "rtb-8bda6cef");
assertTrue(deleted, "Failed to match 'true' data in test response");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DeleteRouteTable&RouteTableId=rtb-8bda6cef");
}
public void deleteRouteTableWithOptions() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(PRECONDITION_FAILED, DEFAULT_REGION, "/dry_run.xml");
try {
routeTableApi().deleteRouteTable(DEFAULT_REGION, "rtb-8bda6cef", dryRun());
Assert.fail("Expected 'DryRunOperation' exception was not thrown");
} catch (AWSResponseException e) {
assertDryRun(e);
}
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DeleteRouteTable&RouteTableId=rtb-8bda6cef&DryRun=true");
}
public void deleteRouteTableNotFound() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404));
final boolean deleted = routeTableApi().deleteRouteTable(DEFAULT_REGION, "rtb-8bda6cef");
assertFalse(deleted, "Non-existent table reported as successfully deleted");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DeleteRouteTable&RouteTableId=rtb-8bda6cef");
}
public void associateRouteTable() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/associate_route_table.xml");
final String associationId = routeTableApi().associateRouteTable(DEFAULT_REGION, "rtb-8c95c0eb", "subnet-6986410e");
assertEquals(associationId, "rtbassoc-fb7fed9d", "Failed to associate route");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=AssociateRouteTable&RouteTableId=rtb-8c95c0eb&SubnetId=subnet-6986410e");
}
public void associateRouteTableNotFound() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404));
final String associationId = routeTableApi().associateRouteTable(DEFAULT_REGION, "rtb-8c95c0eb", "subnet-6986410e");
assertNull(associationId, "Returned id for non-existent route table: " + associationId);
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=AssociateRouteTable&RouteTableId=rtb-8c95c0eb&SubnetId=subnet-6986410e");
}
public void associateRouteTableWithOptions() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(PRECONDITION_FAILED, DEFAULT_REGION, "/dry_run.xml");
try {
routeTableApi().associateRouteTable(DEFAULT_REGION, "rtb-8c95c0eb", "subnet-6986410e", dryRun());
} catch (AWSResponseException e) {
assertDryRun(e);
}
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION,
"Action=AssociateRouteTable&RouteTableId=rtb-8c95c0eb&SubnetId=subnet-6986410e&DryRun=true");
}
public void disassociateRouteTable() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/disassociate_route_table.xml");
final boolean result = routeTableApi().disassociateRouteTable(DEFAULT_REGION, "rtbassoc-fb7fed9d");
assertTrue(result, "Failed to disassociate route");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DisassociateRouteTable&AssociationId=rtbassoc-fb7fed9d");
}
public void disassociateRouteTableNotFound() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404));
final boolean result = routeTableApi().disassociateRouteTable(DEFAULT_REGION, "rtbassoc-fb7fed9d");
assertFalse(result, "Non-existent table reported as successfully disassociated");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DisassociateRouteTable&AssociationId=rtbassoc-fb7fed9d");
}
public void disassociateRouteTablewithOptions() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(PRECONDITION_FAILED, DEFAULT_REGION, "/dry_run.xml");
try {
routeTableApi().disassociateRouteTable(DEFAULT_REGION, "rtbassoc-fb7fed9d", dryRun());
} catch (AWSResponseException e) {
assertDryRun(e);
}
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DisassociateRouteTable&AssociationId=rtbassoc-fb7fed9d&DryRun=true");
}
public void createRoute() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/create_route.xml");
final boolean created = routeTableApi().createRoute(DEFAULT_REGION, "rtb-a77f2ac0",
gatewayId("igw-97e68af3").destinationCidrBlock("172.18.19.0/24"));
assertTrue(created, "Failed to match 'true' in test data response");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION,
"Action=CreateRoute&RouteTableId=rtb-a77f2ac0&GatewayId=igw-97e68af3&DestinationCidrBlock=172.18.19.0/24");
}
public void createRouteNotFound() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/create_route.xml");
final boolean created = routeTableApi().createRoute(DEFAULT_REGION, "rtb-a77f2ac0",
gatewayId("igw-97e68af3").destinationCidrBlock("172.18.19.0/24"));
assertTrue(created, "Failed to match 'true' in test data response");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION,
"Action=CreateRoute&RouteTableId=rtb-a77f2ac0&GatewayId=igw-97e68af3&DestinationCidrBlock=172.18.19.0/24");
}
public void replaceRoute() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404));
final boolean created = routeTableApi().replaceRoute(DEFAULT_REGION, "rtb-a77f2ac0",
gatewayId("vgw-1d00376e").destinationCidrBlock("172.18.19.0/24"));
assertFalse(created, "Reported successful replace of route in non-existent route table");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION,
"Action=ReplaceRoute&RouteTableId=rtb-a77f2ac0&GatewayId=vgw-1d00376e&DestinationCidrBlock=172.18.19.0/24");
}
public void replaceRouteNotFound() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/replace_route.xml");
final boolean created = routeTableApi().replaceRoute(DEFAULT_REGION, "rtb-a77f2ac0",
gatewayId("vgw-1d00376e").destinationCidrBlock("172.18.19.0/24"));
assertTrue(created, "Failed to match 'true' in test data response");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION,
"Action=ReplaceRoute&RouteTableId=rtb-a77f2ac0&GatewayId=vgw-1d00376e&DestinationCidrBlock=172.18.19.0/24");
}
public void deleteRoute() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueueXml(DEFAULT_REGION, "/delete_route.xml");
final boolean deleted = routeTableApi().deleteRoute(DEFAULT_REGION, "rtb-a77f2ac0",
destinationCidrBlock("172.18.19.0/24"));
assertTrue(deleted, "Failed to match 'true' in test data response");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DeleteRoute&RouteTableId=rtb-a77f2ac0&DestinationCidrBlock=172.18.19.0/24");
}
public void deleteRouteNotFound() throws Exception {
enqueueRegions(DEFAULT_REGION);
enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404));
final boolean deleted = routeTableApi().deleteRoute(DEFAULT_REGION, "rtb-a77f2ac0",
destinationCidrBlock("172.18.19.0/24"));
assertFalse(deleted, "Reported successful delete of route in non-existent route table");
assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
assertPosted(DEFAULT_REGION, "Action=DeleteRoute&RouteTableId=rtb-a77f2ac0&DestinationCidrBlock=172.18.19.0/24");
}
private void assertDryRun(AWSResponseException e) {
assertEquals(e.getError().getCode(), "DryRunOperation", "Expected DryRunOperation but got " + e.getError());
}
private RouteTableApi routeTableApi() {
return api().getRouteTableApi().get();
}
}