/**
* 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.appslibrary;
import static com.abiquo.api.common.Assert.assertError;
import static com.abiquo.api.common.UriTestResolver.resolveStatefulVirtualMachineTemplatesURI;
import static com.abiquo.api.common.UriTestResolver.resolveStatefulVirtualMachineTemplatesURIWithCategory;
import static com.abiquo.api.common.UriTestResolver.resolveStatefulVirtualMachineTemplatesURIWithCategoryAndVirtualDatacenter;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualMachineTemplatesURI;
import static org.testng.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.Response.Status;
import org.apache.wink.client.ClientResponse;
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.ConversionState;
import com.abiquo.model.enumerator.DiskFormatType;
import com.abiquo.model.enumerator.HypervisorType;
import com.abiquo.model.enumerator.RemoteServiceType;
import com.abiquo.model.enumerator.StatefulInclusion;
import com.abiquo.model.enumerator.VolumeState;
import com.abiquo.server.core.appslibrary.Category;
import com.abiquo.server.core.appslibrary.VirtualImageConversion;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplate;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
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.RemoteService;
import com.abiquo.server.core.infrastructure.Repository;
import com.abiquo.server.core.infrastructure.storage.VolumeManagement;
@Test
public class VirtualMachineTemplatesResourceIT extends AbstractJpaGeneratorIT
{
private static final String SYSADMIN = "sysadmin";
private final static String AM_BASE_URI = "http://localhost:"
+ String.valueOf(getEmbededServerPort()) + "/am";
private Enterprise ent;
private Datacenter datacenter;
private Repository repository;
// Only used in stateful tests
private VolumeManagement volume;
@BeforeMethod
public void setUpDatacenterRepository()
{
ent = enterpriseGenerator.createUniqueInstance();
datacenter = datacenterGenerator.createUniqueInstance();
repository = repositoryGenerator.createInstance(datacenter);
volume = volumeManagementGenerator.createInstance(datacenter, ent);
RemoteService am =
remoteServiceGenerator.createInstance(RemoteServiceType.APPLIANCE_MANAGER, datacenter);
am.setUri(AM_BASE_URI);
Role role = roleGenerator.createInstanceSysAdmin();
User user = userGenerator.createInstance(ent, role, SYSADMIN, SYSADMIN);
List<Object> entitiesToSetup = new ArrayList<Object>();
entitiesToSetup.add(ent);
entitiesToSetup.add(datacenter);
entitiesToSetup.add(volume.getStoragePool().getDevice());
entitiesToSetup.add(volume.getStoragePool().getTier());
entitiesToSetup.add(volume.getStoragePool());
entitiesToSetup.add(volume.getRasd());
entitiesToSetup.add(volume.getVirtualDatacenter());
entitiesToSetup.add(volume);
entitiesToSetup.add(repository);
entitiesToSetup.add(am);
for (Privilege p : role.getPrivileges())
{
entitiesToSetup.add(p);
}
entitiesToSetup.add(role);
entitiesToSetup.add(user);
setup(entitiesToSetup.toArray());
}
@Test
public void testGetVirtualMachineTemplatesRaises409WhenNoDatacenterLimits()
{
String uri = resolveVirtualMachineTemplatesURI(ent.getId(), datacenter.getId());
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertError(response, 409, APIError.ENTERPRISE_NOT_ALLOWED_DATACENTER);
}
@Test
public void testGetVirtualMachineTemplatesRaises404WhenInvalidEnterprise()
{
String uri = resolveVirtualMachineTemplatesURI(ent.getId() + 100, datacenter.getId());
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertError(response, 404, APIError.NON_EXISTENT_ENTERPRISE);
}
/*
* @Test public void testGetVirtualImagesRaises404WhenInvalidDatacenter() { String uri =
* resolveVirtualImagesURI(ent.getId(), datacenter.getId() + 100); ClientResponse response =
* get(uri, SYSADMIN, SYSADMIN); assertError(response, 404, APIError.NON_EXISTENT_DATACENTER); }
*/
@Test
public void testGetVirtualMachineTemplatesRaises400WhenInvalidHypervisorType()
{
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits);
String uri = resolveVirtualMachineTemplatesURI(ent.getId(), datacenter.getId());
uri += "?hypervisorTypeName=INVALID";
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 400);
// TODO: Specific APiError
// assertError(response, 400);
}
@Test
public void testGetStatefulVirtualMachineTemplatesRaises404WhenInvalidDatacenter()
{
String uri =
resolveStatefulVirtualMachineTemplatesURI(ent.getId(), datacenter.getId() + 100,
StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertError(response, 404, APIError.NON_EXISTENT_DATACENTER);
}
@Test
public void testGetStatefulVirtualMachineTemplatesRaises404WhenInvalidEnterprise()
{
String uri =
resolveStatefulVirtualMachineTemplatesURI(ent.getId() + 100, datacenter.getId(),
StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertError(response, 404, APIError.NON_EXISTENT_ENTERPRISE);
}
@Test
public void testGetStatefulVirtualMachineTemplatesRaises404WhenNoDatacenterLimits()
{
String uri =
resolveStatefulVirtualMachineTemplatesURI(ent.getId(), datacenter.getId(),
StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertError(response, 409, APIError.ENTERPRISE_NOT_ALLOWED_DATACENTER);
}
@Test
public void testGetStatefulVirtualMachineTemplatesRaises404WhenInvalidCategory()
{
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits);
String uri =
resolveStatefulVirtualMachineTemplatesURIWithCategory(ent.getId(), datacenter.getId(),
"nonexisting", StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertError(response, 404, APIError.NON_EXISTENT_CATEGORY);
}
@Test
public void testGetVirtualMachineTemplates()
{
VirtualMachineTemplate vi1 =
virtualMachineTemplateGenerator.createInstance(ent, repository);
VirtualMachineTemplate vi2 =
virtualMachineTemplateGenerator.createInstance(ent, repository);
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits, vi1.getCategory(), vi2.getCategory(), vi1, vi2);
String uri = resolveVirtualMachineTemplatesURI(ent.getId(), datacenter.getId());
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), Status.OK.getStatusCode());
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 2);
}
@Test
public void testGetStatefulVirtualMachineTemplatesWithoutResults()
{
VirtualMachineTemplate vi1 =
virtualMachineTemplateGenerator.createInstance(ent, repository);
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits, vi1.getCategory(), vi1);
String uri =
resolveStatefulVirtualMachineTemplatesURI(ent.getId(), datacenter.getId(),
StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 0);
}
@Test
public void testGetStatefulVirtualMachineTemplates()
{
VirtualMachineTemplate vmtemplate =
virtualMachineTemplateGenerator.createInstance(ent, repository);
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits, vmtemplate.getCategory(), vmtemplate);
volume.setVirtualMachineTemplate(vmtemplate);
update(volume, vmtemplate);
String uri =
resolveStatefulVirtualMachineTemplatesURI(ent.getId(), datacenter.getId(),
StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 1);
}
@Test
public void testGetStatefulVirtualMachineTemplatesUsed()
{
VirtualMachineTemplate vmtemplate =
virtualMachineTemplateGenerator.createInstance(ent, repository);
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits, vmtemplate.getCategory(), vmtemplate);
volume.setVirtualMachineTemplate(vmtemplate);
volume.setState(VolumeState.ATTACHED);
update(volume, vmtemplate);
String uri =
resolveStatefulVirtualMachineTemplatesURI(ent.getId(), datacenter.getId(),
StatefulInclusion.USED);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 1);
}
@Test
public void testGetStatefulVirtualMachineTemplatesNotUsed()
{
VirtualMachineTemplate vmtemplate =
virtualMachineTemplateGenerator.createInstance(ent, repository);
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits, vmtemplate.getCategory(), vmtemplate);
volume.setVirtualMachineTemplate(vmtemplate);
volume.setState(VolumeState.DETACHED);
update(volume, vmtemplate);
String uri =
resolveStatefulVirtualMachineTemplatesURI(ent.getId(), datacenter.getId(),
StatefulInclusion.NOTUSED);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 1);
}
@Test
public void testGetStatefulVirtualMachineTemplatesByCategory()
{
VirtualMachineTemplate vmtemplate =
virtualMachineTemplateGenerator.createInstance(ent, repository);
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits, vmtemplate.getCategory(), vmtemplate);
volume.setVirtualMachineTemplate(vmtemplate);
update(volume, vmtemplate);
String uri =
resolveStatefulVirtualMachineTemplatesURIWithCategory(ent.getId(), datacenter.getId(),
vmtemplate.getCategory().getName(), StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 1);
}
@Test
public void testGetStatefulVirtualMachineTemplatesByCategoryAndVirtualDatacenter()
{
VirtualMachineTemplate vmtemplate =
virtualMachineTemplateGenerator.createInstance(ent, repository);
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits, vmtemplate.getCategory(), vmtemplate);
volume.setVirtualMachineTemplate(vmtemplate);
update(volume, vmtemplate);
String uri =
resolveStatefulVirtualMachineTemplatesURIWithCategoryAndVirtualDatacenter(ent.getId(),
datacenter.getId(), vmtemplate.getCategory().getName(), volume
.getVirtualDatacenter().getId(), StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 1);
}
@Test
public void testGetStatefulVirtualMachineTemplatesByCategoryWithoutResults()
{
Category anotherCategory = categoryGenerator.createUniqueInstance();
VirtualMachineTemplate template =
virtualMachineTemplateGenerator.createInstance(ent, repository);
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
setup(limits, template.getCategory(), template, anotherCategory);
volume.setVirtualMachineTemplate(template);
update(volume, template);
String uri =
resolveStatefulVirtualMachineTemplatesURIWithCategory(ent.getId(), datacenter.getId(),
anotherCategory.getName(), StatefulInclusion.ALL);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, VirtualMachineTemplatesDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 0);
}
@Test
public void testGetVirtualMachineTemplatesCompatibles_compatibleConversionNoCompatible()
{
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
VirtualMachineTemplate vi1 =
virtualMachineTemplateGenerator.createInstance(ent, repository,
DiskFormatType.VDI_FLAT, "compatible-vbox");
VirtualMachineTemplate vi2 =
virtualMachineTemplateGenerator.createInstance(ent, repository,
DiskFormatType.VMDK_STREAM_OPTIMIZED, "No-compatible-vbox");
VirtualImageConversion conversion1 =
conversionGenerator.createInstance(vi1, DiskFormatType.VMDK_STREAM_OPTIMIZED);
setup(limits, vi1.getCategory(), vi1, vi2.getCategory(), vi2, conversion1);
String uri = resolveVirtualMachineTemplatesURI(ent.getId(), datacenter.getId());
ClientResponse response =
resource(uri, SYSADMIN, SYSADMIN).queryParam("hypervisorTypeName",
HypervisorType.VBOX.name()).accept(VirtualMachineTemplatesDto.MEDIA_TYPE).get();
assertEquals(response.getStatusCode(), 200, VirtualMachineTemplatesDto.MEDIA_TYPE);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 1);
}
@Test
public void testGetVirtualMachineTemplatesCompatibles_NoCompatibleConversionCompatible()
{
DatacenterLimits limits = datacenterLimitsGenerator.createInstance(ent, datacenter);
VirtualMachineTemplate vi1 =
virtualMachineTemplateGenerator.createInstance(ent, repository,
DiskFormatType.VMDK_STREAM_OPTIMIZED, "compatible-vbox");
VirtualMachineTemplate vi2 =
virtualMachineTemplateGenerator.createInstance(ent, repository,
DiskFormatType.VMDK_STREAM_OPTIMIZED, "No-compatible-vbox");
VirtualImageConversion conversion1 =
conversionGenerator.createInstance(vi1, DiskFormatType.VDI_FLAT);
conversion1.setState(ConversionState.FINISHED);
setup(limits, vi1.getCategory(), vi1, vi2.getCategory(), vi2, conversion1);
String uri = resolveVirtualMachineTemplatesURI(ent.getId(), datacenter.getId());
ClientResponse response =
resource(uri, SYSADMIN, SYSADMIN).queryParam("hypervisorTypeName",
HypervisorType.VBOX.name()).accept(VirtualMachineTemplatesDto.MEDIA_TYPE).get();
assertEquals(response.getStatusCode(), 200);
VirtualMachineTemplatesDto dto = response.getEntity(VirtualMachineTemplatesDto.class);
assertEquals(dto.getCollection().size(), 1);
}
}