/** * 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; import static com.abiquo.api.common.Assert.assertErrors; import static com.abiquo.api.common.Assert.assertLinkExist; import static com.abiquo.api.common.UriTestResolver.resolveDatacenterURI; import static com.abiquo.api.common.UriTestResolver.resolveDatacenterURIActionDiscover; import static com.abiquo.api.common.UriTestResolver.resolveDatacenterURIActionDiscoverHypervidor; import static com.abiquo.api.common.UriTestResolver.resolveDatacenterURIActionDiscoverMultiple; import static com.abiquo.api.common.UriTestResolver.resolveEnterprisesByDatacenterURI; import static com.abiquo.api.common.UriTestResolver.resolveHypervisorTypesURI; import static com.abiquo.api.common.UriTestResolver.resolveRacksURI; import static com.abiquo.api.common.UriTestResolver.resolveRemoteServicesURI; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import java.io.IOException; import javax.ws.rs.core.MediaType; 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.apache.wink.common.internal.MultivaluedMapImpl; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.abiquo.api.exceptions.APIError; import com.abiquo.api.services.stub.NodecollectorServiceStubMock; import com.abiquo.model.enumerator.HypervisorType; import com.abiquo.model.enumerator.RemoteServiceType; import com.abiquo.server.core.cloud.Hypervisor; import com.abiquo.server.core.cloud.HypervisorTypesDto; 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.EnterprisesDto; import com.abiquo.server.core.infrastructure.Datacenter; import com.abiquo.server.core.infrastructure.DatacenterDto; import com.abiquo.server.core.infrastructure.Machine; import com.abiquo.server.core.infrastructure.MachineDto; import com.abiquo.server.core.infrastructure.MachinesDto; import com.abiquo.server.core.infrastructure.RemoteService; import com.abiquo.server.core.infrastructure.network.VLANNetwork; public class DatacenterResourceIT extends AbstractJpaGeneratorIT { private String validDatacenterUriDiscover; private String validDatacenterUriDiscoverMultiple; private Datacenter datacenter; @Override @BeforeMethod public void setup() { datacenter = datacenterGenerator.createUniqueInstance(); RemoteService rs = remoteServiceGenerator.createInstance(RemoteServiceType.NODE_COLLECTOR, datacenter); setup(datacenter, rs); } @Test public void getDatacenterDoesntExist() throws ClientWebException { ClientResponse response = get(resolveDatacenterURI(12345), DatacenterDto.MEDIA_TYPE); assertEquals(response.getStatusCode(), Status.NOT_FOUND.getStatusCode()); assertErrors(response, Status.NOT_FOUND.getStatusCode(), APIError.NON_EXISTENT_DATACENTER.getCode()); } @Test public void existsLinks() { DatacenterDto dc = createDatacenter(); assertNotNull(dc); assertLinkExist(dc, resolveRacksURI(dc.getId()), RacksResource.RACKS_PATH); assertLinkExist(dc, resolveHypervisorTypesURI(dc.getId()), DatacenterResource.HYPERVISORS_PATH); assertLinkExist(dc, resolveRemoteServicesURI(dc.getId()), RemoteServicesResource.REMOTE_SERVICES_PATH); assertLinkExist(dc, resolveDatacenterURI(dc.getId()), "edit"); assertLinkExist(dc, resolveDatacenterURIActionDiscover(dc.getId()), DatacenterResource.ACTION_DISCOVER_SINGLE_REL); assertLinkExist(dc, resolveDatacenterURIActionDiscoverMultiple(dc.getId()), DatacenterResource.ACTION_DISCOVER_MULTIPLE_REL); } @Test public void modifyDatacenter() throws ClientWebException { DatacenterDto dc = createDatacenter(); String uri = dc.getEditLink().getHref(); DatacenterDto datacenter = get(uri, DatacenterDto.MEDIA_TYPE).getEntity(DatacenterDto.class); datacenter.setLocation("datacenter_situation_changed"); ClientResponse response = put(uri, datacenter); assertEquals(response.getStatusCode(), Status.OK.getStatusCode()); datacenter = get(uri, datacenter.getMediaType()).getEntity(DatacenterDto.class); assertEquals("datacenter_situation_changed", datacenter.getLocation()); } @Test public void getHypervisorTypes() throws ClientWebException, IOException { Datacenter datacenter = datacenterGenerator.createUniqueInstance(); Machine m0 = machineGenerator.createMachine(datacenter); Machine m1 = machineGenerator.createMachine(datacenter); // m0.setHypervisor(hypervisorGenerator.createInstance(m0)); // m1.setHypervisor(hypervisorGenerator.createInstance(m1)); Hypervisor h1 = hypervisorGenerator.createInstance(m0); Hypervisor h2 = hypervisorGenerator.createInstance(m1); setup(datacenter, m0, m1, h1, h2); String uri = resolveHypervisorTypesURI(datacenter.getId()); ClientResponse response = get(uri, HypervisorTypesDto.MEDIA_TYPE); assertEquals(response.getStatusCode(), Status.OK.getStatusCode()); HypervisorTypesDto types = response.getEntity(HypervisorTypesDto.class); assertNotNull(types); assertEquals(types.getCollection().isEmpty(), false); response = get(resolveHypervisorTypesURI(12345), HypervisorTypesDto.MEDIA_TYPE); assertEquals(response.getStatusCode(), Status.NOT_FOUND.getStatusCode()); assertErrors(response, Status.NOT_FOUND.getStatusCode(), APIError.NON_EXISTENT_DATACENTER.getCode()); } @Test public void getEnterprisesByDatacenters() throws ClientWebException, IOException { Datacenter datacenter = datacenterGenerator.createUniqueInstance(); Enterprise enterprise = enterpriseGenerator.createUniqueInstance(); DatacenterLimits dcl = datacenterLimitsGenerator.createInstance(enterprise, datacenter); setup(enterprise, datacenter, dcl); Integer datacenterId = datacenter.getId(); String uri = resolveEnterprisesByDatacenterURI(datacenterId); ClientResponse response = get(uri, EnterprisesDto.MEDIA_TYPE); assertEquals(response.getStatusCode(), Status.OK.getStatusCode()); EnterprisesDto enterprises = response.getEntity(EnterprisesDto.class); assertNotNull(enterprises); assertEquals(enterprises.getCollection().isEmpty(), false); assertEquals(enterprises.getCollection().get(0).getName(), enterprise.getName()); assertEquals(enterprises.getCollection().get(0).getId(), enterprise.getId()); } @Test public void getEnterprisesWithNetworkByDatacenters() throws ClientWebException, IOException { RemoteService rs; VLANNetwork vlan; VirtualDatacenter vdc; rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE); vdc = vdcGenerator.createInstance(rs.getDatacenter()); setup(vdc.getDatacenter(), rs, vdc.getEnterprise(), vdc.getNetwork(), vdc); vlan = vlanGenerator.createInstance(vdc.getNetwork(), rs, "255.255.255.0"); setup(vlan); Enterprise enterprise = enterpriseGenerator.createUniqueInstance(); DatacenterLimits dcl = datacenterLimitsGenerator.createInstance(enterprise, vdc.getDatacenter()); DatacenterLimits dcl2 = datacenterLimitsGenerator.createInstance(vdc.getEnterprise(), vdc.getDatacenter()); setup(enterprise, dcl, dcl2); Integer datacenterId = vdc.getDatacenter().getId(); String uri0 = resolveEnterprisesByDatacenterURI(datacenterId); String uri1 = uri0 + "?network=true"; String uri2 = uri0 + "?network=true&startwith=2&limit=1"; ClientResponse response0 = get(uri0, EnterprisesDto.MEDIA_TYPE); ClientResponse response1 = get(uri1, EnterprisesDto.MEDIA_TYPE); ClientResponse response2 = get(uri2, EnterprisesDto.MEDIA_TYPE); assertEquals(response0.getStatusCode(), Status.OK.getStatusCode()); assertEquals(response1.getStatusCode(), Status.OK.getStatusCode()); assertEquals(response2.getStatusCode(), Status.OK.getStatusCode()); EnterprisesDto enterprises0 = response0.getEntity(EnterprisesDto.class); EnterprisesDto enterprises1 = response1.getEntity(EnterprisesDto.class); EnterprisesDto enterprises2 = response2.getEntity(EnterprisesDto.class); assertNotNull(enterprises0); assertEquals(enterprises0.getCollection().size(), 2); assertEquals(enterprises1.getCollection().size(), 1); assertEquals(enterprises2.getCollection().size(), 1); assertEquals(enterprises1.getCollection().get(0).getName(), vdc.getEnterprise().getName()); } /* delete is disabled at this moment */ @Test(enabled = false) public void removeDatacenter() throws ClientWebException { DatacenterDto dc = createDatacenter(); Resource resource = client.resource(dc.getEditLink().getHref()); ClientResponse response = resource.accept(MediaType.APPLICATION_XML).delete(); assertEquals(204, response.getStatusCode()); } protected DatacenterDto createDatacenter() { Datacenter datacenter = datacenterGenerator.createUniqueInstance(); setup(datacenter); String href = resolveDatacenterURI(datacenter.getId()); return get(href, DatacenterDto.MEDIA_TYPE).getEntity(DatacenterDto.class); } /** * Test the discover machine functionality for a correct behaviour. As you see, here we use the * {@link NodecollectorServiceStubMock} mock class. Because we don't test the nodecollector * behaviour, but the service behaviour in front of a correct response. * * @throws Exception */ @Test public void discoverMachineFunctionality() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(datacenter.getId()); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP, NodecollectorServiceStubMock.IP_CORRECT_1); params.putSingle(DatacenterResource.HYPERVISOR, HypervisorType.VMX_04.getValue()); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); MachineDto machine = response.getEntity(MachineDto.class); assertNotNull(machine); } /** * Test the constraints check the id of the datacenter can not be less than 1. */ @Test public void discoverMachineRaises400WhenDatacenterIdIsMinorThan1() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(0); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP, NodecollectorServiceStubMock.IP_CORRECT_1); params.putSingle(DatacenterResource.HYPERVISOR, HypervisorType.VMX_04.getValue()); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); } /** * Test the constraint @IP raises when it is not really an IP address * * @throws Exception */ @Test public void discoverMachineRaises400WhenParameterIPIsInvalid() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(0); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP, "234.12..1"); params.putSingle(DatacenterResource.HYPERVISOR, HypervisorType.VMX_04.getValue()); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); } /** * Test the constraint @Hypervisor raises when it is not really an IP address * * @throws Exception */ @Test public void discoverMachineRaises400WhenParameterHypervisorIsInvalid() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(0); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP, NodecollectorServiceStubMock.IP_CORRECT_1); params.putSingle(DatacenterResource.HYPERVISOR, "tetas"); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); } /** * Test the constraint @Port when the value is bigger than 65535. * * @throws Exception */ @Test public void discoverMachineRaises400WhenParameterPortIsInvalid() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(0); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP, NodecollectorServiceStubMock.IP_CORRECT_1); params.putSingle(DatacenterResource.HYPERVISOR, HypervisorType.VMX_04.getValue()); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); params.putSingle(DatacenterResource.PORT, "70000"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); } /** * Test the discover multiple machines functionality and check some errors are ignored and only * returns the machines that match the query. * * @throws Exception */ @Test public void discoverMultipleMachinesFunctionality() throws Exception { validDatacenterUriDiscoverMultiple = resolveDatacenterURIActionDiscoverMultiple(datacenter.getId()); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP_FROM, NodecollectorServiceStubMock.IP_CORRECT_1); params.putSingle(DatacenterResource.IP_TO, NodecollectorServiceStubMock.IP_CORRECT_3); params.putSingle(DatacenterResource.HYPERVISOR, HypervisorType.VMX_04.getValue()); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); Resource resource = client.resource(validDatacenterUriDiscoverMultiple).queryParams(params); ClientResponse response = resource.get(); MachinesDto machines = response.getEntity(MachinesDto.class); assertNotNull(machines); assertEquals(machines.getCollection().size(), 3); } /** * Test the constraint @IP raises when the parameter IpFrom it is not really an IP address * * @throws Exception */ @Test public void discoverMachineRaises400WhenParameterIPFromIsInvalid() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(0); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP_FROM, "234.12..1"); params.putSingle(DatacenterResource.IP_TO, NodecollectorServiceStubMock.IP_CORRECT_3); params.putSingle(DatacenterResource.HYPERVISOR, HypervisorType.VMX_04.getValue()); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); } /** * Test the constraint @IP raises when the parameter IpTo it is not really an IP address * * @throws Exception */ @Test public void discoverMachineRaises400WhenParameterIPToIsInvalid() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(0); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP_FROM, NodecollectorServiceStubMock.IP_CORRECT_1); params.putSingle(DatacenterResource.IP_TO, "234.12..1"); params.putSingle(DatacenterResource.HYPERVISOR, HypervisorType.VMX_04.getValue()); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); } /** * Test the constraint @Hypervisor raises when it is not really an IP address * * @throws Exception */ @Test public void discoverMultipleMachineRaises400WhenParameterHypervisorIsInvalid() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(0); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP_FROM, NodecollectorServiceStubMock.IP_CORRECT_1); params.putSingle(DatacenterResource.IP_TO, NodecollectorServiceStubMock.IP_CORRECT_3); params.putSingle(DatacenterResource.HYPERVISOR, "tetas"); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); } /** * Test the constraint @Port when the value is bigger than 65535. * * @throws Exception */ @Test public void discoverMultipleMachineRaises400WhenParameterPortIsInvalid() throws Exception { validDatacenterUriDiscover = resolveDatacenterURIActionDiscover(0); MultivaluedMapImpl<String, String> params = new MultivaluedMapImpl<String, String>(); params.putSingle(DatacenterResource.IP_FROM, NodecollectorServiceStubMock.IP_CORRECT_1); params.putSingle(DatacenterResource.IP_TO, NodecollectorServiceStubMock.IP_CORRECT_3); params.putSingle(DatacenterResource.HYPERVISOR, HypervisorType.VMX_04.getValue()); params.putSingle(DatacenterResource.USER, "user"); params.putSingle(DatacenterResource.PASSWORD, "password"); params.putSingle(DatacenterResource.PORT, "70000"); Resource resource = client.resource(validDatacenterUriDiscover).queryParams(params); ClientResponse response = resource.get(); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); } @Test public void discoverHypervisorType() throws Exception { String ip = NodecollectorServiceStubMock.IP_CORRECT_1; ClientResponse response = get(resolveDatacenterURIActionDiscoverHypervidor(datacenter.getId(), ip), "text/plain"); String hType = response.getEntity(String.class); assertNotNull(hType); assertEquals(hType, HypervisorType.VMX_04.getValue()); } }