/** * 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.UriTestResolver.resolveDatacenterURI; import static com.abiquo.api.common.UriTestResolver.resolveEnterpriseURI; import static com.abiquo.api.common.UriTestResolver.resolveVirtualDatacentersURI; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.wink.client.ClientResponse; import org.apache.wink.common.internal.utils.UriHelper; 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.api.resources.DatacenterResource; import com.abiquo.api.resources.EnterpriseResource; import com.abiquo.model.enumerator.HypervisorType; import com.abiquo.model.enumerator.RemoteServiceType; import com.abiquo.model.rest.RESTLink; import com.abiquo.server.core.cloud.Hypervisor; import com.abiquo.server.core.cloud.VirtualDatacenter; import com.abiquo.server.core.cloud.VirtualDatacenterDto; import com.abiquo.server.core.cloud.VirtualDatacentersDto; import com.abiquo.server.core.enterprise.DatacenterLimits; import com.abiquo.server.core.enterprise.Enterprise; import com.abiquo.server.core.enterprise.Privilege; import com.abiquo.server.core.enterprise.Role; import com.abiquo.server.core.enterprise.User; import com.abiquo.server.core.infrastructure.Datacenter; import com.abiquo.server.core.infrastructure.Machine; import com.abiquo.server.core.infrastructure.RemoteService; import com.abiquo.server.core.infrastructure.network.VLANNetwork; import com.abiquo.server.core.infrastructure.network.VLANNetworkDto; @Test public class VirtualDatacentersResourceIT extends AbstractJpaGeneratorIT { Enterprise sysEnterprise; @BeforeMethod public void setupSysadmin() { sysEnterprise = enterpriseGenerator.createUniqueInstance(); Role r = roleGenerator.createUniqueInstance(); User u = userGenerator.createInstance(sysEnterprise, r, "sysadmin", "sysadmin"); List<Object> entitiesToSetup = new ArrayList<Object>(); entitiesToSetup.add(sysEnterprise); for (Privilege p : r.getPrivileges()) { entitiesToSetup.add(p); } entitiesToSetup.add(r); entitiesToSetup.add(u); setup(entitiesToSetup.toArray()); } @Test public void getVirtualDatacentersFilteredByUser() { Enterprise enterprise = enterpriseGenerator.createUniqueInstance(); Datacenter datacenter = datacenterGenerator.createUniqueInstance(); RemoteService rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, datacenter); Role role = roleGenerator.createInstance(); User user = userGenerator.createInstance(enterprise, role, "foo"); VirtualDatacenter vdc1 = vdcGenerator.createInstance(datacenter, enterprise); VLANNetwork vlan1 = vlanGenerator.createInstance(vdc1.getNetwork(), rs, "255.255.255.0"); vdc1.setDefaultVlan(vlan1); VirtualDatacenter vdc2 = vdcGenerator.createInstance(datacenter, enterprise); VLANNetwork vlan2 = vlanGenerator.createInstance(vdc2.getNetwork(), rs, "255.255.255.0"); vdc2.setDefaultVlan(vlan2); VirtualDatacenter vdc3 = vdcGenerator.createInstance(datacenter, enterprise); VLANNetwork vlan3 = vlanGenerator.createInstance(vdc3.getNetwork(), rs, "255.255.255.0"); vdc3.setDefaultVlan(vlan3); setup(enterprise, datacenter, rs, vdc1.getNetwork(), vlan1.getConfiguration(), vlan1, vdc1, vdc2.getNetwork(), vlan2.getConfiguration(), vlan2, vdc2, vdc3.getNetwork(), vlan3 .getConfiguration(), vlan3, vdc3, new DatacenterLimits(enterprise, datacenter)); String ids = vdc1.getId() + "," + vdc2.getId(); user.setAvailableVirtualDatacenters(ids); setup(user.getRole(), user); ClientResponse response = get(resolveVirtualDatacentersURI(), user.getNick(), "foo", VirtualDatacentersDto.MEDIA_TYPE); assertEquals(response.getStatusCode(), 200); VirtualDatacentersDto entity = response.getEntity(VirtualDatacentersDto.class); assertNotNull(entity); assertNotNull(entity.getCollection()); assertEquals(entity.getCollection().size(), 2); } @Test public void getVirtualDatacentersList() throws Exception { VirtualDatacenter vdc = vdcGenerator.createInstance(sysEnterprise); RemoteService rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, vdc .getDatacenter()); VLANNetwork vlan = vlanGenerator.createInstance(vdc.getNetwork(), rs, "255.255.255.0"); vdc.setDefaultVlan(vlan); setup(vdc.getDatacenter(), rs, vdc.getNetwork(), vlan.getConfiguration(), vlan .getConfiguration(), vlan, vdc, new DatacenterLimits(sysEnterprise, vdc.getDatacenter())); ClientResponse response = get(resolveVirtualDatacentersURI(), "sysadmin", "sysadmin", VirtualDatacentersDto.BASE_MEDIA_TYPE); assertEquals(response.getStatusCode(), 200); VirtualDatacentersDto entity = response.getEntity(VirtualDatacentersDto.class); assertNotNull(entity); assertNotNull(entity.getCollection()); assertEquals(entity.getCollection().size(), 1); } @Test public void getVirtualDatacentersFilteredByEnterprise() { VirtualDatacenter vdc = vdcGenerator.createUniqueInstance(); RemoteService rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, vdc .getDatacenter()); VLANNetwork vlan = vlanGenerator.createInstance(vdc.getNetwork(), rs, "255.255.255.0"); vdc.setDefaultVlan(vlan); DatacenterLimits dcl1 = new DatacenterLimits(vdc.getEnterprise(), vdc.getDatacenter()); setup(vdc.getDatacenter(), rs, vdc.getEnterprise(), vdc.getNetwork(), vlan .getConfiguration(), vlan, vdc, dcl1); VirtualDatacenter vdc2 = vdcGenerator.createInstance(vdc.getEnterprise()); DatacenterLimits dcl2 = new DatacenterLimits(vdc2.getEnterprise(), vdc2.getDatacenter()); RemoteService rs2 = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, vdc2 .getDatacenter()); VLANNetwork vlan2 = vlanGenerator.createInstance(vdc2.getNetwork(), rs2, "255.255.255.0"); vdc2.setDefaultVlan(vlan2); setup(vdc2.getDatacenter(), rs2, vdc2.getNetwork(), vlan2.getConfiguration(), vlan2, vdc2, dcl2); VirtualDatacenter vdc3 = vdcGenerator.createInstance(vdc.getDatacenter()); DatacenterLimits dcl3 = new DatacenterLimits(vdc3.getEnterprise(), vdc3.getDatacenter()); VLANNetwork vlan3 = vlanGenerator.createInstance(vdc3.getNetwork(), rs, "255.255.255.0"); vdc3.setDefaultVlan(vlan3); setup(vdc3.getEnterprise(), vdc3.getNetwork(), vlan3.getConfiguration(), vlan3, vdc3, dcl3); String uri = resolveVirtualDatacentersURI(); uri = UriHelper.appendQueryParamsToPath(uri, Collections.singletonMap( EnterpriseResource.ENTERPRISE, new String[] {vdc.getEnterprise().getId().toString()}), false); ClientResponse response = get(uri, "sysadmin", "sysadmin", VirtualDatacentersDto.MEDIA_TYPE); VirtualDatacentersDto entity = response.getEntity(VirtualDatacentersDto.class); assertNotNull(entity); assertNotNull(entity.getCollection()); assertEquals(entity.getCollection().size(), 2); } @Test public void getVirtualDatacentersFilteredByDatacenter() { VirtualDatacenter vdc = vdcGenerator.createInstance(sysEnterprise); RemoteService rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, vdc .getDatacenter()); VLANNetwork vlan = vlanGenerator.createInstance(vdc.getNetwork(), rs, "255.255.255.0"); vdc.setDefaultVlan(vlan); DatacenterLimits dcl1 = new DatacenterLimits(vdc.getEnterprise(), vdc.getDatacenter()); setup(vdc.getDatacenter(), rs, vdc.getNetwork(), vlan.getConfiguration(), vlan, vdc, dcl1); VirtualDatacenter vdc3 = vdcGenerator.createInstance(vdc.getDatacenter(), sysEnterprise); VLANNetwork vlan3 = vlanGenerator.createInstance(vdc3.getNetwork(), rs, "255.255.255.0"); DatacenterLimits dcl3 = new DatacenterLimits(vdc3.getEnterprise(), vdc3.getDatacenter()); vdc3.setDefaultVlan(vlan3); setup(vdc3.getNetwork(), vlan3.getConfiguration(), vdc3, dcl3); VirtualDatacenter vdc2 = vdcGenerator.createInstance(sysEnterprise); RemoteService rs2 = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, vdc2 .getDatacenter()); VLANNetwork vlan2 = vlanGenerator.createInstance(vdc2.getNetwork(), rs2, "255.255.255.0"); DatacenterLimits dcl2 = new DatacenterLimits(vdc2.getEnterprise(), vdc2.getDatacenter()); vdc2.setDefaultVlan(vlan2); setup(vdc2.getDatacenter(), rs2, vdc2.getNetwork(), vlan2.getConfiguration(), vlan2, vdc2, dcl2); String uri = resolveVirtualDatacentersURI(); uri = UriHelper.appendQueryParamsToPath(uri, Collections.singletonMap( DatacenterResource.DATACENTER, new String[] {vdc.getDatacenter().getId().toString()}), false); ClientResponse response = get(uri, "sysadmin", "sysadmin", VirtualDatacentersDto.MEDIA_TYPE); VirtualDatacentersDto entity = response.getEntity(VirtualDatacentersDto.class); assertNotNull(entity); assertNotNull(entity.getCollection()); assertEquals(entity.getCollection().size(), 2); } @Test public void getVirtualDatacentersFilteredByEnterpriseAndDatacenter() { VirtualDatacenter vdc = vdcGenerator.createUniqueInstance(); RemoteService rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, vdc .getDatacenter()); VLANNetwork vlan = vlanGenerator.createInstance(vdc.getNetwork(), rs, "255.255.255.0"); vdc.setDefaultVlan(vlan); DatacenterLimits dcl1 = new DatacenterLimits(vdc.getEnterprise(), vdc.getDatacenter()); setup(vdc.getDatacenter(), rs, vdc.getEnterprise(), vdc.getNetwork(), vlan .getConfiguration(), vlan, vdc, dcl1); VirtualDatacenter vdc2 = vdcGenerator.createInstance(vdc.getEnterprise()); DatacenterLimits dcl2 = new DatacenterLimits(vdc2.getEnterprise(), vdc2.getDatacenter()); RemoteService rs2 = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, vdc2 .getDatacenter()); VLANNetwork vlan2 = vlanGenerator.createInstance(vdc2.getNetwork(), rs2, "255.255.255.0"); vdc2.setDefaultVlan(vlan2); setup(vdc2.getDatacenter(), rs2, vdc2.getNetwork(), vlan2.getConfiguration(), vlan2, vdc2, dcl2); VirtualDatacenter vdc3 = vdcGenerator.createInstance(vdc.getDatacenter()); DatacenterLimits dcl3 = new DatacenterLimits(vdc3.getEnterprise(), vdc3.getDatacenter()); VLANNetwork vlan3 = vlanGenerator.createInstance(vdc3.getNetwork(), rs, "255.255.255.0"); vdc3.setDefaultVlan(vlan3); setup(vdc3.getEnterprise(), vdc3.getNetwork(), vlan3.getConfiguration(), vlan3, vdc3, dcl3); Map<String, String[]> queryParams = new HashMap<String, String[]>(); queryParams.put(DatacenterResource.DATACENTER, new String[] {vdc.getDatacenter().getId() .toString()}); queryParams.put(EnterpriseResource.ENTERPRISE, new String[] {vdc.getEnterprise().getId() .toString()}); String uri = resolveVirtualDatacentersURI(); uri = UriHelper.appendQueryParamsToPath(uri, queryParams, false); ClientResponse response = get(uri, "sysadmin", "sysadmin", VirtualDatacentersDto.MEDIA_TYPE); VirtualDatacentersDto entity = response.getEntity(VirtualDatacentersDto.class); assertNotNull(entity); assertNotNull(entity.getCollection()); assertEquals(entity.getCollection().size(), 1); } @Test public void createVirtualDatacenterRaisesErrorWhenDatacenterDoesNotExist() { VirtualDatacenterDto dto = new VirtualDatacenterDto(); dto.setHypervisorType(HypervisorType.KVM); ClientResponse response = post(resolveVirtualDatacentersURI(), dto); assertEquals(response.getStatusCode(), 404); assertErrors(response, 404, APIError.NON_EXISTENT_DATACENTER.getCode()); RESTLink datacenterLink = new RESTLink("datacenter", "http://localhost:8080/api/foo"); dto.addLink(datacenterLink); response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 404); assertErrors(response, 404, APIError.NON_EXISTENT_DATACENTER.getCode()); dto = new VirtualDatacenterDto(); dto.setHypervisorType(HypervisorType.KVM); datacenterLink = new RESTLink("datacenter", resolveDatacenterURI(1234455)); dto.addLink(datacenterLink); response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 404); assertErrors(response, 404, APIError.NON_EXISTENT_DATACENTER.getCode()); } @Test public void createVirtualDatacenterRaiseErrorWhenEnterpriseDoesNotExist() { Datacenter dc = datacenterGenerator.createUniqueInstance(); setup(dc); VirtualDatacenterDto dto = new VirtualDatacenterDto(); dto.setHypervisorType(HypervisorType.KVM); RESTLink datacenterLink = new RESTLink("datacenter", resolveDatacenterURI(dc.getId())); dto.addLink(datacenterLink); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 404); assertErrors(response, 404, APIError.NON_EXISTENT_ENTERPRISE.getCode()); RESTLink enterpriseLink = new RESTLink("enterprise", "http://localhost:8080/api/foo"); dto.addLink(enterpriseLink); response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 404); assertErrors(response, 404, APIError.NON_EXISTENT_ENTERPRISE.getCode()); dto = new VirtualDatacenterDto(); dto.setHypervisorType(HypervisorType.KVM); dto.addLink(datacenterLink); enterpriseLink = new RESTLink("enterprise", resolveEnterpriseURI(1234455)); dto.addLink(enterpriseLink); response = post(resolveVirtualDatacentersURI(), dto); assertEquals(response.getStatusCode(), 404); assertErrors(response, 404, APIError.NON_EXISTENT_ENTERPRISE.getCode()); } @Test public void createVirtualDatacenterRaiseErrorWhenHypervisorTypeIsNotInDatacenter() { RemoteService rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE); Enterprise e = enterpriseGenerator.createUniqueInstance(); Datacenter dc = rs.getDatacenter(); Machine machine = machineGenerator.createMachine(dc); Hypervisor hypervisor = hypervisorGenerator.createInstance(machine, HypervisorType.HYPERV_301); setup(dc, machine, hypervisor, e, rs, new DatacenterLimits(e, dc)); VirtualDatacenterDto dto = getValidVdc(); RESTLink datacenterLink = new RESTLink("datacenter", resolveDatacenterURI(dc.getId())); dto.addLink(datacenterLink); RESTLink enterpriseLink = new RESTLink("enterprise", resolveEnterpriseURI(e.getId())); dto.addLink(enterpriseLink); dto.setName("vdc_test_create"); dto.setHypervisorType(HypervisorType.KVM); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertErrors(response, APIError.VIRTUAL_DATACENTER_INVALID_HYPERVISOR_TYPE); } @Test public void createVirtualDatacenter() { VirtualDatacenterDto dto = getValidVdc(); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 201); } /** * Test that checks the LIMITS_INVALID_HARD_LIMIT_FOR_VLANS_PER_VDC, that means the number of * VLANs is greater than the allowed by properties. You can change the property * 'abiquo.server.networking.vlanPerVDC' in the POM.xml */ @Test public void createVirtualDatacenterFailsIfTheVlanPerVDCIsNotValid() { VirtualDatacenterDto dto = getValidVdc(); dto.setVlansSoft(1); dto.setVlansHard(100); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 400); assertErrors(response, APIError.LIMITS_INVALID_HARD_LIMIT_FOR_VLANS_PER_VDC); } @Test public void createVirtualDatacenterWithLimits() { VirtualDatacenterDto dto = getValidVdc(); dto.setVlansLimits(1, 2); dto.setCpuCountLimits(1, 2); dto.setPublicIPLimits(1, 2); dto.setHdLimitsInMb(1, 2); dto.setRamLimitsInMb(1, 2); dto.setStorageLimits(1, 2); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 201); } @Test public void createVirtualDatacenterWithLimitsFailsIfSoftIsZeroAndHardIsNot() { VirtualDatacenterDto dto = getValidVdc(); dto.setVlansLimits(0, 2); dto.setCpuCountLimits(0, 2); dto.setPublicIPLimits(0, 2); dto.setHdLimitsInMb(0, 2); dto.setRamLimitsInMb(0, 2); dto.setStorageLimits(0, 2); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 400); } @Test public void createVirtualDatacenterWithLimitsPassIfHardIsZeroAndSoftIsNot() { VirtualDatacenterDto dto = getValidVdc(); dto.setVlansLimits(1, 0); dto.setCpuCountLimits(1, 0); dto.setPublicIPLimits(1, 0); dto.setHdLimitsInMb(1, 0); dto.setRamLimitsInMb(1, 0); dto.setStorageLimits(1, 0); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 201); } @Test public void createVirtualDatacenterWithLimitsPassIfSoftAndHardAreEqual() { VirtualDatacenterDto dto = getValidVdc(); dto.setVlansLimits(1, 1); dto.setCpuCountLimits(1, 1); dto.setPublicIPLimits(1, 1); dto.setHdLimitsInMb(1, 1); dto.setRamLimitsInMb(1, 1); dto.setStorageLimits(1, 1); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 201); } @Test public void createVirtualDatacenterWithLimitsFailIfSoftIsGreated() { VirtualDatacenterDto dto = getValidVdc(); dto.setVlansLimits(2, 1); dto.setCpuCountLimits(2, 1); dto.setPublicIPLimits(2, 1); dto.setHdLimitsInMb(2, 1); dto.setRamLimitsInMb(2, 1); dto.setStorageLimits(2, 1); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 400); } public void createVirtualDatacenterFailsWithInvalidIps() { VirtualDatacenterDto dto = getValidVdc(); dto.getVlan().setAddress("foo"); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 400); } public void createVirtualDatacenterPassWithOptionalDns() { VirtualDatacenterDto dto = getValidVdc(); dto.getVlan().setPrimaryDNS(null); dto.getVlan().setSecondaryDNS(null); ClientResponse response = post(resolveVirtualDatacentersURI(), dto, "sysadmin", "sysadmin"); assertEquals(response.getStatusCode(), 201); } private VirtualDatacenterDto getValidVdc() { RemoteService rs = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE); Enterprise e = enterpriseGenerator.createUniqueInstance(); Machine machine = machineGenerator.createMachine(rs.getDatacenter()); Hypervisor hypervisor = hypervisorGenerator.createInstance(machine); setup(rs.getDatacenter(), machine, hypervisor, e, rs, new DatacenterLimits(e, rs .getDatacenter())); VirtualDatacenterDto dto = new VirtualDatacenterDto(); RESTLink datacenterLink = new RESTLink("datacenter", resolveDatacenterURI(rs.getDatacenter().getId())); dto.addLink(datacenterLink); RESTLink enterpriseLink = new RESTLink("enterprise", resolveEnterpriseURI(e.getId())); dto.addLink(enterpriseLink); dto.setName("vdc_test_create"); dto.setHypervisorType(hypervisor.getType()); VLANNetworkDto networkDto = new VLANNetworkDto(); networkDto.setName("Default Network"); networkDto.setAddress("192.168.0.0"); networkDto.setGateway("192.168.0.1"); networkDto.setMask(24); networkDto.setPrimaryDNS("10.0.0.1"); networkDto.setSecondaryDNS("10.0.0.1"); dto.setVlan(networkDto); return dto; } }