/** * 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.services.appslibrary; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.persistence.EntityManager; import org.dmtf.schemas.ovf.envelope._1.EnvelopeType; import org.dmtf.schemas.ovf.envelope._1.FileType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.abiquo.api.exceptions.APIError; import com.abiquo.api.services.DefaultApiService; import com.abiquo.api.services.EnterpriseService; import com.abiquo.api.services.stub.AMServiceStub; import com.abiquo.appliancemanager.client.ExternalHttpConnection; import com.abiquo.appliancemanager.repositoryspace.OVFDescription; import com.abiquo.appliancemanager.transport.TemplateStateDto; import com.abiquo.model.enumerator.DiskFormatType; import com.abiquo.ovfmanager.ovf.xml.OVFSerializer; import com.abiquo.server.core.appslibrary.AppsLibraryDAO; import com.abiquo.server.core.appslibrary.AppsLibraryRep; import com.abiquo.server.core.appslibrary.Category; import com.abiquo.server.core.appslibrary.TemplateDefinition; import com.abiquo.server.core.appslibrary.TemplateDefinitionRep; import com.abiquo.server.core.enterprise.Enterprise; @Service public class TemplateDefinitionService extends DefaultApiService { private final static Logger LOGGER = LoggerFactory.getLogger(TemplateDefinitionService.class); @Autowired private TemplateDefinitionRep repo; @Autowired private AppsLibraryRep appslibraryRep; @Autowired private EnterpriseService enterpriseService; @Autowired private AMServiceStub amService; @Autowired protected AppsLibraryDAO appsLibraryDao; public TemplateDefinitionService() { } public TemplateDefinitionService(final EntityManager em) { repo = new TemplateDefinitionRep(em); appslibraryRep = new AppsLibraryRep(em); enterpriseService = new EnterpriseService(em); appsLibraryDao = new AppsLibraryDAO(em); amService = new AMServiceStub(); } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public List<TemplateDefinition> getTemplateDefinitionsByEnterprise(final Integer idEnterprise) { enterpriseService.getEnterprise(idEnterprise); // check can view return repo.getTemplateDefinitionsByEnterprise(idEnterprise); } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public TemplateDefinition getTemplateDefinition(final Integer id, final Integer idEnterprise) { enterpriseService.getEnterprise(idEnterprise); // check can view TemplateDefinition ovfpackage = repo.getTemplateDefinition(id); if (ovfpackage == null) { addNotFoundErrors(APIError.NON_EXISTENT_OVF_PACKAGE); flushErrors(); } return ovfpackage; } @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public TemplateDefinition addTemplateDefinition(final TemplateDefinition templateDef, final Integer idEnterprise) { Enterprise ent = enterpriseService.getEnterprise(idEnterprise); // check can view templateDef.setAppsLibrary(appsLibraryDao.findByEnterpriseOrInitialize(ent)); validate(templateDef); return repo.addTemplateDefinition(templateDef, ent); } @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public TemplateDefinition updateTemplateDefinition(final Integer templateDefId, final TemplateDefinition templateDef, final Integer idEnterprise) { Enterprise enterprise = enterpriseService.getEnterprise(idEnterprise); // check can view templateDef.setAppsLibrary(appsLibraryDao.findByEnterpriseOrInitialize(enterprise)); validate(templateDef); return repo.updateTemplateDefinition(templateDefId, templateDef, enterprise); } @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public void removeTemplateDefinition(final Integer id, final Integer idEnterprise) { enterpriseService.getEnterprise(idEnterprise); // check can view TemplateDefinition templateDef = repo.getTemplateDefinition(id); if (templateDef == null) { addNotFoundErrors(APIError.NON_EXISTENT_OVF_PACKAGE); flushErrors(); } repo.removeTemplateDefinition(id); } /** #################### ApplianceManager communications #################### */ /** #################### */ @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public TemplateStateDto getTemplateState(final Integer id, final Integer datacenterId, final Integer enterpriseId) { final String ovfUrl = getTemplateDefinition(id, enterpriseId).getUrl(); return amService.getTemplateState(datacenterId, enterpriseId, ovfUrl); } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public void installTemplateDefinition(final Integer id, final Integer datacenterId, final Integer enterpriseId) { final String ovfUrl = getTemplateDefinition(id, enterpriseId).getUrl(); amService.install(datacenterId, enterpriseId, ovfUrl); } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public void uninstallTemplateDefinition(final Integer id, final Integer datacenterId, final Integer enterpriseId) { final String ovfUrl = getTemplateDefinition(id, enterpriseId).getUrl(); amService.delete(datacenterId, enterpriseId, ovfUrl); } /** #################### ovfindex.xml #################### */ /** #################### */ @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public TemplateDefinition transformToTemplateDefinition(final OVFDescription descr, final String baseRepositorySpaceURL) { String packageUrl = descr.getOVFFile().startsWith("http://") ? descr.getOVFFile() : baseRepositorySpaceURL + "/" + descr.getOVFFile(); // TODO check not double // String name = descr.getProduct().getValue(); String description = descr.getInfo().getValue(); TemplateDefinition pack = new TemplateDefinition(); pack.setName(name); // TODO data truncation pack.setProductName(name.length() > 45 ? name.substring(0, 44) : name); pack.setDescription(description.length() > 255 ? description.substring(0, 254) : description); /** * TODO product verison .... url ... */ pack.setUrl(packageUrl); if (descr.getIcon() != null && descr.getIcon().size() == 1) { String iconPath = descr.getIcon().get(0).getFileRef(); pack.setIconUrl(iconPath); // TODO start with http:// } DiskFormatType format = findByDiskFormatNameOrUnknow(descr.getDiskFormat()); pack.setType(format); Category category = appslibraryRep.findByCategoryNameOrCreateNew(descr.getOVFCategories()); pack.setCategory(category); Long diskSizeL = null; final String diskSize = descr.getDiskSize(); if (diskSize != null && !diskSize.isEmpty()) { diskSizeL = Long.parseLong(diskSize); } else { diskSizeL = getDiskFileSizeMbFromOvfId(packageUrl); } pack.setDiskFileSize(diskSizeL); return pack; } private Long getDiskFileSizeMbFromOvfId(final String ovfid) { InputStream isovf = null; ExternalHttpConnection connection = new ExternalHttpConnection(); try { isovf = connection.openConnection(ovfid); EnvelopeType envelope = OVFSerializer.getInstance().readXMLEnvelope(isovf); Long accSize = 0l; for (FileType file : envelope.getReferences().getFile()) { if (file.getSize() != null) { accSize += file.getSize().longValue(); } } return accSize / (1024 * 1024); } catch (Exception e) { LOGGER.debug("Cannot retrieve the size of OvfPackage with id " + ovfid + " setting size 0"); return 0L; } finally { connection.releaseConnection(); if (isovf != null) { try { isovf.close(); } catch (IOException e) { // } } }// finally } private DiskFormatType findByDiskFormatNameOrUnknow(final String diskFormatName) { DiskFormatType format; if (diskFormatName == null) { format = DiskFormatType.UNKNOWN; } else if ("STREAM_OPTIMIZED".equalsIgnoreCase(diskFormatName)) // FIXME { format = DiskFormatType.VMDK_STREAM_OPTIMIZED; } else { try { format = DiskFormatType.valueOf(diskFormatName); } catch (Exception e) { format = DiskFormatType.UNKNOWN; } } return format; } }