/**
* Abiquo community edition
* cloud management application for hybrid clouds
* Copyright (C) 2008-2010 - Abiquo Holdings S.L.
*
* This application is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC
* LICENSE as published by the Free Software Foundation under
* version 3 of the License
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* LESSER GENERAL PUBLIC LICENSE v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package com.abiquo.api.resources.cloud;
import static com.abiquo.api.common.Assert.assertErrors;
import static com.abiquo.api.common.Assert.assertLinkExist;
import static com.abiquo.api.common.UriTestResolver.resolvePrivateNetworkIPsURI;
import static com.abiquo.api.common.UriTestResolver.resolvePrivateNetworkURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualDatacenterURI;
import static com.abiquo.testng.TestConfig.BASIC_INTEGRATION_TESTS;
import static com.abiquo.testng.TestConfig.NETWORK_INTEGRATION_TESTS;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import java.util.ArrayList;
import java.util.Random;
import javax.ws.rs.core.Response.Status;
import org.apache.wink.client.ClientResponse;
import org.apache.wink.client.ClientWebException;
import org.apache.wink.client.Resource;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.abiquo.api.exceptions.APIError;
import com.abiquo.api.resources.AbstractJpaGeneratorIT;
import com.abiquo.model.enumerator.RemoteServiceType;
import com.abiquo.server.core.cloud.VirtualDatacenter;
import com.abiquo.server.core.enterprise.DatacenterLimits;
import com.abiquo.server.core.enterprise.Enterprise;
import com.abiquo.server.core.enterprise.Role;
import com.abiquo.server.core.enterprise.User;
import com.abiquo.server.core.infrastructure.RemoteService;
import com.abiquo.server.core.infrastructure.network.IpPoolManagement;
import com.abiquo.server.core.infrastructure.network.IpPoolManagementDto;
import com.abiquo.server.core.infrastructure.network.IpsPoolManagementDto;
import com.abiquo.server.core.infrastructure.network.VLANNetwork;
import com.abiquo.server.core.infrastructure.network.VLANNetworkDto;
import com.abiquo.server.core.util.network.IPAddress;
import com.abiquo.server.core.util.network.IPNetworkRang;
@Test(groups = {NETWORK_INTEGRATION_TESTS})
public class PrivateNetworkResourceIT extends AbstractJpaGeneratorIT
{
private String validURI;
VirtualDatacenter vdc;
VLANNetwork vlan;
RemoteService rs;
@Override
@BeforeMethod(groups = {BASIC_INTEGRATION_TESTS, NETWORK_INTEGRATION_TESTS})
public void setup()
{
Enterprise e = enterpriseGenerator.createUniqueInstance();
Role r = roleGenerator.createInstance();
User u = userGenerator.createInstance(e, r, "basicUser", "basicUser");
setup(e, r, u);
rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE);
vdc = vdcGenerator.createInstance(rs.getDatacenter(), e);
DatacenterLimits dclimit = new DatacenterLimits(vdc.getEnterprise(), vdc.getDatacenter());
vlan = vlanGenerator.createInstance(vdc.getNetwork(), rs, "255.255.255.0");
vlan.setEnterprise(vdc.getEnterprise());
vdc.setDefaultVlan(vlan);
setup(vdc.getDatacenter(), rs, vdc.getNetwork(), vlan.getConfiguration(), vlan, vdc,
dclimit);
validURI = resolvePrivateNetworkURI(vdc.getId(), vlan.getId());
}
@Override
@AfterMethod(groups = {BASIC_INTEGRATION_TESTS, NETWORK_INTEGRATION_TESTS})
public void tearDown()
{
super.tearDown();
}
@Test
public void getPrivateNetwork() throws Exception
{
ClientResponse response =
get(validURI, "basicUser", "basicUser", VLANNetworkDto.MEDIA_TYPE);
VLANNetworkDto network = response.getEntity(VLANNetworkDto.class);
assertEquals(200, response.getStatusCode());
assertNotNull(network);
}
@Test
public void getPrivateNetworkDoesntExist() throws Exception
{
String invalidNetworkURI = resolvePrivateNetworkURI(vdc.getId(), vlan.getId() + 1);
ClientResponse response =
get(invalidNetworkURI, "basicUser", "basicUser", VLANNetworkDto.MEDIA_TYPE);
assertErrors(response, 404, APIError.VLANS_NON_EXISTENT_VIRTUAL_NETWORK);
}
@Test
public void getPrivateNetworkWithWrongVirtualDatacenter() throws ClientWebException
{
String invalidVDCURI = resolvePrivateNetworkURI(vdc.getId() + 1, vlan.getId());
ClientResponse response =
get(invalidVDCURI, "basicUser", "basicUser", VLANNetworkDto.MEDIA_TYPE);
assertErrors(response, 404, APIError.NON_EXISTENT_VIRTUAL_DATACENTER);
}
/**
* We create the vdc1 with network vlan1 (in setup). Now we create vcd2 with network vlan2.
* Ensure the uri /cloud/virtualdatacenters/vdc1/privatenetworks/vlan2 throws a
* 404-non_existent_virtual_network
*/
@Test
public void getPrivateNetworkVirtualDatacenterWithUnassignedVLAN() throws Exception
{
// Creation of virtualdatacenter2 and vlan2
VirtualDatacenter vdc2 = vdcGenerator.createInstance(rs.getDatacenter());
DatacenterLimits dclimit = new DatacenterLimits(vdc2.getEnterprise(), vdc2.getDatacenter());
Role r = roleGenerator.createInstance();
User u =
userGenerator.createInstance(vdc2.getEnterprise(), r, "anotherUser", "anotherUser");
setup(vdc2.getEnterprise(), vdc2.getNetwork(), vdc2, dclimit, r, u);
VLANNetwork vlan2 = vlanGenerator.createInstance(vdc2.getNetwork(), rs);
vlan2.setEnterprise(vdc2.getEnterprise());
setup(vlan2.getConfiguration(), vlan2);
// Ensure we have create it correctly.
ClientResponse response =
get(resolvePrivateNetworkURI(vdc2.getId(), vlan2.getId()), "anotherUser",
"anotherUser", VLANNetworkDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VLANNetworkDto network = response.getEntity(VLANNetworkDto.class);
assertNotNull(network);
// Try to cross parameters.
response =
get(resolvePrivateNetworkURI(vdc.getId(), vlan2.getId()), "basicUser", "basicUser",
VLANNetworkDto.MEDIA_TYPE);
// The VLAN does not exist!
assertErrors(response, 404, APIError.VLANS_NON_EXISTENT_VIRTUAL_NETWORK);
}
// PUT VLAN Related Tests //
/**
* Updates VLAN in the right way.
*
* @throws Exception
*/
@Test(groups = {BASIC_INTEGRATION_TESTS})
public void updateVLANTestEndToEnd() throws Exception
{
// Now we create the IPs of the VLAN.
IPAddress ip = IPAddress.newIPAddress(vlan.getConfiguration().getAddress()).nextIPAddress();
IPAddress lastIP =
IPNetworkRang.lastIPAddressWithNumNodes(
IPAddress.newIPAddress(vlan.getConfiguration().getAddress()),
IPNetworkRang.masktoNumberOfNodes(vlan.getConfiguration().getMask()));
ArrayList<Object> ipsObjects = new ArrayList<Object>();
while (!ip.equals(lastIP))
{
IpPoolManagement ippool = ipGenerator.createInstance(vdc, vlan, ip.toString());
ipsObjects.add(ippool.getRasd());
ipsObjects.add(ippool);
ip = ip.nextIPAddress();
}
setup(ipsObjects.toArray());
VLANNetworkDto dto = createTransferObject(vlan);
// modify the name and the primary DNS.
dto.setName("newname");
dto.setPrimaryDNS("45.45.45.0");
ClientResponse response = put(validURI, dto, "basicUser", "basicUser");
assertEquals(response.getStatusCode(), Status.OK.getStatusCode());
// Ensure the VLAN has changed.
VLANNetworkDto dtoResponse = response.getEntity(VLANNetworkDto.class);
assertNotNull(dtoResponse);
assertEquals(dto.getId(), dtoResponse.getId());
assertEquals("newname", dtoResponse.getName());
assertEquals(dto.getAddress(), dtoResponse.getAddress());
assertEquals("45.45.45.0", dtoResponse.getPrimaryDNS());
assertEquals(dto.getSecondaryDNS(), dtoResponse.getSecondaryDNS());
// Ensure the IPs of the VLAN have changed its 'vlanname' attribute. Get a random IP and
// check it
String ipsUri = resolvePrivateNetworkIPsURI(vdc.getId(), vlan.getId());
response = get(ipsUri, "basicUser", "basicUser", IpsPoolManagementDto.MEDIA_TYPE);
IpsPoolManagementDto dtoIPs = response.getEntity(IpsPoolManagementDto.class);
assertNotNull(dtoIPs);
IpPoolManagementDto dtoIP = dtoIPs.getCollection().get(new Random().nextInt(24));
assertEquals(dtoIP.getNetworkName(), "newname");
}
/**
* Throw several request to ensure it controls the path parameter constraints.
*
* @throws Exception
*/
@Test
public void updateVLANparamsInvalids() throws Exception
{
VLANNetworkDto dto = createTransferObject(vlan);
Resource resource = client.resource(resolvePrivateNetworkURI(0, vlan.getId()));
ClientResponse response =
resource.accept(VLANNetworkDto.MEDIA_TYPE).contentType(VLANNetworkDto.MEDIA_TYPE)
.put(dto);
assertEquals(response.getStatusCode(), 400);
response =
put(resolvePrivateNetworkURI(-400, vlan.getId()), dto, "basicUser", "basicUser",
VLANNetworkDto.MEDIA_TYPE, VLANNetworkDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 400);
response =
put(resolvePrivateNetworkURI(vdc.getId(), 0), dto, "basicUser", "basicUser",
VLANNetworkDto.MEDIA_TYPE, VLANNetworkDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 400);
response =
put(resolvePrivateNetworkURI(vdc.getId(), -1000), dto, "basicUser", "basicUser",
VLANNetworkDto.MEDIA_TYPE, VLANNetworkDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 400);
}
// DELETE-related VLAN tests.
@Test
public void deleteVLANparamsInvalids() throws Exception
{
Resource resource = client.resource(resolvePrivateNetworkURI(0, vlan.getId()));
ClientResponse response =
resource.accept(VLANNetworkDto.MEDIA_TYPE).contentType(VLANNetworkDto.MEDIA_TYPE)
.delete();
assertEquals(response.getStatusCode(), 400);
resource = client.resource(resolvePrivateNetworkURI(-400, vlan.getId()));
response =
resource.accept(VLANNetworkDto.MEDIA_TYPE).contentType(VLANNetworkDto.MEDIA_TYPE)
.delete();
assertEquals(response.getStatusCode(), 400);
resource = client.resource(resolvePrivateNetworkURI(vdc.getId(), 0));
response =
resource.accept(VLANNetworkDto.MEDIA_TYPE).contentType(VLANNetworkDto.MEDIA_TYPE)
.delete();
assertEquals(response.getStatusCode(), 400);
resource = client.resource(resolvePrivateNetworkURI(vdc.getId(), -1000));
response =
resource.accept(VLANNetworkDto.MEDIA_TYPE).contentType(VLANNetworkDto.MEDIA_TYPE)
.delete();
assertEquals(response.getStatusCode(), 400);
}
/**
* Performs and end-to-end test for a deletion.
*/
@Test(groups = {BASIC_INTEGRATION_TESTS})
public void deleteVLANTestEndToEnd() throws Exception
{
// Save the second network. The first one is the default, and you can not delete neither
// unique nor default-network.
// So we need to save another VLAN befor create the test
VLANNetwork vlan2 = vlanGenerator.createInstance(vdc.getNetwork(), rs);
vlan2.setEnterprise(vdc.getEnterprise());
setup(vlan2.getConfiguration(), vlan2);
String uri = resolvePrivateNetworkURI(vdc.getId(), vlan2.getId());
ClientResponse response = delete(uri, "basicUser", "basicUser");
// Response ok.
assertEquals(response.getStatusCode(), Status.NO_CONTENT.getStatusCode());
// Perform a GET to ensure the entity has been deleted
response = get(uri, "basicUser", "basicUser", VLANNetworkDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), Status.NOT_FOUND.getStatusCode());
}
// DTO-LInk VLAN Related Tests //
@Test
public void vlanContainsEditLink()
{
assertLinkExist(getValidPrivateNetwork(), validURI, "edit");
}
@Test
public void vlanContainsVirtualDatacenterLink()
{
VLANNetworkDto vlanNetwork = getValidPrivateNetwork();
assertLinkExist(vlanNetwork, resolveVirtualDatacenterURI(vdc.getId()),
VirtualDatacenterResource.VIRTUAL_DATACENTER);
}
@Test
public void vlanContainsIPsLink()
{
VLANNetworkDto vlanNetwork = getValidPrivateNetwork();
assertLinkExist(vlanNetwork, resolvePrivateNetworkIPsURI(vdc.getId(), vlanNetwork.getId()),
IpAddressesResource.IP_ADDRESSES);
}
private VLANNetworkDto getValidPrivateNetwork()
{
return get(validURI, "basicUser", "basicUser", VLANNetworkDto.MEDIA_TYPE).getEntity(
VLANNetworkDto.class);
}
/**
* Creates the VLAN transfer object from the Persistent object.
*
* @param network persistent object
* @param virtualDatacenterId identifier of the virtual datacenter
* @return the {@link VLANNetworkDto} transfer object.
* @throws Exception pim-pam-pum
*/
public static VLANNetworkDto createTransferObject(final VLANNetwork network) throws Exception
{
VLANNetworkDto dto = new VLANNetworkDto();
// ModelTransformer.transportFromPersistence(VLANNetworkDto.class, network);
dto.setId(network.getId());
dto.setAddress(network.getConfiguration().getAddress());
dto.setGateway(network.getConfiguration().getGateway());
dto.setMask(network.getConfiguration().getMask());
dto.setPrimaryDNS(network.getConfiguration().getPrimaryDNS());
dto.setSecondaryDNS(network.getConfiguration().getSecondaryDNS());
dto.setSufixDNS(network.getConfiguration().getSufixDNS());
return dto;
}
}