diff --git a/api/src/com/cloud/api/commands/CopyIsoCmd.java b/api/src/com/cloud/api/commands/CopyIsoCmd.java old mode 100644 new mode 100755 index be1b2570d37..02c98033d61 --- a/api/src/com/cloud/api/commands/CopyIsoCmd.java +++ b/api/src/com/cloud/api/commands/CopyIsoCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.ServerApiException; import com.cloud.api.response.TemplateResponse; import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; +import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.StorageUnavailableException; import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; @@ -119,6 +120,9 @@ public class CopyIsoCmd extends BaseAsyncCmd { } catch (StorageUnavailableException ex) { s_logger.warn("Exception: ", ex); throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage()); - } + } catch (ResourceAllocationException ex) { + s_logger.warn("Exception: ", ex); + throw new ServerApiException(BaseCmd.RESOURCE_ALLOCATION_ERROR, ex.getMessage()); + } } } diff --git a/api/src/com/cloud/api/commands/CopyTemplateCmd.java b/api/src/com/cloud/api/commands/CopyTemplateCmd.java old mode 100644 new mode 100755 index abcb93e8923..7f2e5d17d5c --- a/api/src/com/cloud/api/commands/CopyTemplateCmd.java +++ b/api/src/com/cloud/api/commands/CopyTemplateCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.ServerApiException; import com.cloud.api.response.TemplateResponse; import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; +import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.StorageUnavailableException; import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; @@ -121,7 +122,10 @@ public class CopyTemplateCmd extends BaseAsyncCmd { } catch (StorageUnavailableException ex) { s_logger.warn("Exception: ", ex); throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage()); - } + } catch (ResourceAllocationException ex) { + s_logger.warn("Exception: ", ex); + throw new ServerApiException(BaseCmd.RESOURCE_ALLOCATION_ERROR, ex.getMessage()); + } } } diff --git a/api/src/com/cloud/template/TemplateService.java b/api/src/com/cloud/template/TemplateService.java old mode 100644 new mode 100755 index 14a43e00591..76ad1303d28 --- a/api/src/com/cloud/template/TemplateService.java +++ b/api/src/com/cloud/template/TemplateService.java @@ -39,8 +39,8 @@ public interface TemplateService { VirtualMachineTemplate registerTemplate(RegisterTemplateCmd cmd) throws URISyntaxException, ResourceAllocationException; VirtualMachineTemplate registerIso(RegisterIsoCmd cmd) throws IllegalArgumentException, ResourceAllocationException; - VirtualMachineTemplate copyIso(CopyIsoCmd cmd) throws StorageUnavailableException; - VirtualMachineTemplate copyTemplate(CopyTemplateCmd cmd) throws StorageUnavailableException; + VirtualMachineTemplate copyIso(CopyIsoCmd cmd) throws StorageUnavailableException, ResourceAllocationException; + VirtualMachineTemplate copyTemplate(CopyTemplateCmd cmd) throws StorageUnavailableException, ResourceAllocationException; boolean detachIso(DetachIsoCmd cmd); boolean attachIso(AttachIsoCmd cmd); /** diff --git a/server/src/com/cloud/template/TemplateManager.java b/server/src/com/cloud/template/TemplateManager.java index 3d9da38deb2..8a5971847cf 100755 --- a/server/src/com/cloud/template/TemplateManager.java +++ b/server/src/com/cloud/template/TemplateManager.java @@ -22,6 +22,7 @@ import java.util.List; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.StorageUnavailableException; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; @@ -104,9 +105,10 @@ public interface TemplateManager { throw new IllegalArgumentException("The template hasnt been downloaded "); } * @throws StorageUnavailableException + * @throws ResourceAllocationException * @throws InvalidParameterValueException */ - boolean copy(long userId, long templateId, long sourceZoneId, long destZoneId) throws StorageUnavailableException; + boolean copy(long userId, long templateId, long sourceZoneId, long destZoneId) throws StorageUnavailableException, ResourceAllocationException; /** * Deletes a template from secondary storage servers diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index b511e9f960b..64edb7c4c0d 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -700,7 +700,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe @Override @DB - public boolean copy(long userId, long templateId, long sourceZoneId, long destZoneId) throws StorageUnavailableException { + public boolean copy(long userId, long templateId, long sourceZoneId, long destZoneId) throws StorageUnavailableException, ResourceAllocationException { HostVO srcSecHost = _storageMgr.getSecondaryStorageHost(sourceZoneId); HostVO dstSecHost = _storageMgr.getSecondaryStorageHost(destZoneId); DataCenterVO destZone = _dcDao.findById(destZoneId); @@ -731,10 +731,16 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe srcTmpltHost = _tmpltHostDao.findByHostTemplate(srcSecHost.getId(), templateId); if (srcTmpltHost == null || srcTmpltHost.getDestroyed() || srcTmpltHost.getDownloadState() != VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { throw new InvalidParameterValueException("Please specify a template that is installed on secondary storage host: " + srcSecHost.getName()); - } + } - // Event details - Account account = _accountDao.findById(vmTemplate.getAccountId()); + AccountVO account = _accountDao.findById(vmTemplate.getAccountId()); + if (_accountMgr.resourceLimitExceeded(account, ResourceType.template)) { + ResourceAllocationException rae = new ResourceAllocationException("Maximum number of templates and ISOs for account: " + account.getAccountName() + " has been exceeded."); + rae.setResourceType("template"); + throw rae; + } + + // Event details String copyEventType; String createEventType; if (vmTemplate.getFormat().equals(ImageFormat.ISO)){ @@ -788,7 +794,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } @Override - public VirtualMachineTemplate copyIso(CopyIsoCmd cmd) throws StorageUnavailableException { + public VirtualMachineTemplate copyIso(CopyIsoCmd cmd) throws StorageUnavailableException, ResourceAllocationException { Long isoId = cmd.getId(); Long userId = UserContext.current().getCallerUserId(); Long sourceZoneId = cmd.getSourceZoneId(); @@ -822,7 +828,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe @Override - public VirtualMachineTemplate copyTemplate(CopyTemplateCmd cmd) throws StorageUnavailableException { + public VirtualMachineTemplate copyTemplate(CopyTemplateCmd cmd) throws StorageUnavailableException, ResourceAllocationException { Long templateId = cmd.getId(); Long userId = UserContext.current().getCallerUserId(); Long sourceZoneId = cmd.getSourceZoneId();