/** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * * This software is licensed under the GNU General Public License v3 or later. * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ package com.cloud.api.commands; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; import com.cloud.storage.Storage.FileSystem; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; import com.cloud.utils.Pair; public class RegisterIsoCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(RegisterIsoCmd.class.getName()); private static final String s_name = "registerisoresponse"; private static final List> s_properties = new ArrayList>(); static { s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.URL, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.BOOTABLE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); } @Override public String getName() { return s_name; } @Override public List> getProperties() { return s_properties; } @Override public List> execute(Map params) { Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); String accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName()); Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName()); Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName()); String name = (String)params.get(BaseCmd.Properties.NAME.getName()); String displayText = (String)params.get(BaseCmd.Properties.DISPLAY_TEXT.getName()); String url = (String)params.get(BaseCmd.Properties.URL.getName()); Boolean isPublic = (Boolean)params.get(BaseCmd.Properties.IS_PUBLIC.getName()); Boolean featured = (Boolean)params.get(BaseCmd.Properties.IS_FEATURED.getName()); Long guestOSId = (Long) params.get(BaseCmd.Properties.OS_TYPE_ID.getName()); Boolean bootable = (Boolean) params.get(BaseCmd.Properties.BOOTABLE.getName()); Long zoneId = (Long) params.get(BaseCmd.Properties.ZONE_ID.getName()); if (isPublic == null) { isPublic = Boolean.FALSE; } if (zoneId.longValue() == -1) { zoneId = null; } Long accountId = null; if ((account == null) || isAdmin(account.getType())) { if (domainId != null) { if ((account != null) && !getManagementServer().isChildDomain(account.getDomainId(), domainId)) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") "); } if (accountName != null) { Account userAccount = getManagementServer().findActiveAccount(accountName, domainId); if (userAccount == null) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find account " + accountName + " in domain " + domainId); } accountId = userAccount.getId(); } } else { accountId = ((account != null) ? account.getId() : null); } } else { accountId = account.getId(); } if (accountId == null) { throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "No valid account specified for registering ISO."); } boolean isAdmin = getManagementServer().findAccountById(accountId).getType() == Account.ACCOUNT_TYPE_ADMIN; if (!isAdmin && zoneId == null) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Please specify a valid zone Id."); } if((!url.toLowerCase().endsWith("iso"))&&(!url.toLowerCase().endsWith("iso.zip"))&&(!url.toLowerCase().endsWith("iso.bz2")) &&(!url.toLowerCase().endsWith("iso.gz"))){ throw new ServerApiException(BaseCmd.PARAM_ERROR, "Please specify a valid iso"); } boolean allowPublicUserTemplates = Boolean.parseBoolean(getManagementServer().getConfigurationValue("allow.public.user.templates")); if (!isAdmin && !allowPublicUserTemplates && isPublic) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Only private ISOs can be created."); } if (!isAdmin || featured == null) { featured = Boolean.FALSE; } // If command is executed via 8096 port, set userId to the id of System account (1) if (userId == null) { userId = Long.valueOf(1); } if (bootable == null) { bootable = Boolean.TRUE; } //removing support for file:// type urls (bug: 4239) if(url.toLowerCase().contains("file://")){ throw new ServerApiException(BaseCmd.PARAM_ERROR, "File:// type urls are currently unsupported"); } Long templateId; try { templateId = getManagementServer().createTemplate(userId, accountId, zoneId, name, displayText, isPublic.booleanValue(), featured.booleanValue(), ImageFormat.ISO.toString(), FileSystem.cdfs.toString(), url, null, true, 64 /*bits*/, false, guestOSId, bootable); } catch (Exception ex) { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, ex.getMessage()); } VMTemplateVO template = getManagementServer().findTemplateById(templateId); List> isoTags = new ArrayList>(); List iTagList = new ArrayList(); if (template != null) { List zones = null; if (zoneId != null) { zones = new ArrayList(); zones.add(getManagementServer().findDataCenterById(zoneId)); } else { zones = getManagementServer().listDataCenters(); } for (DataCenterVO zone : zones) { VMTemplateHostVO isoHostRef = getManagementServer().findTemplateHostRef(templateId, zone.getId()); // Use embeded object for response List> listForEmbeddedObject = new ArrayList>(); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.ID.getName(), template.getId().toString())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.NAME.getName(), template.getName())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT.getName(), template.getDisplayText())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.IS_PUBLIC.getName(), Boolean.valueOf(template.isPublicTemplate()).toString())); if (isoHostRef != null) { listForEmbeddedObject.add(new Pair(BaseCmd.Properties.CREATED.getName(), getDateString(isoHostRef.getCreated()))); } listForEmbeddedObject.add(new Pair(BaseCmd.Properties.IS_READY.getName(), (isoHostRef != null && isoHostRef.getDownloadState() == Status.DOWNLOADED))); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.IS_FEATURED.getName(), Boolean.valueOf(template.isFeatured()).toString())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.BOOTABLE.getName(), Boolean.valueOf(template.isBootable()).toString())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.OS_TYPE_ID.getName(), template.getGuestOSId())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.OS_TYPE_NAME.getName(), getManagementServer().findGuestOSById(template.getGuestOSId()).getName())); Account owner = getManagementServer().findAccountById(template.getAccountId()); if (owner != null) { listForEmbeddedObject.add(new Pair(BaseCmd.Properties.ACCOUNT_ID.getName(), owner.getId())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.ACCOUNT.getName(), owner.getAccountName())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), owner.getDomainId())); } listForEmbeddedObject.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), zone.getId())); listForEmbeddedObject.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName())); iTagList.add(listForEmbeddedObject); } } Object[] iTag = new Object[iTagList.size()]; for (int i = 0; i < iTagList.size(); i++) { iTag[i] = iTagList.get(i); } Pair templateTag = new Pair("iso", iTag); isoTags.add(templateTag); return isoTags; } }