diff --git a/api/src/com/cloud/api/response/TemplateResponse.java b/api/src/com/cloud/api/response/TemplateResponse.java index afefc644497..696848a4efa 100755 --- a/api/src/com/cloud/api/response/TemplateResponse.java +++ b/api/src/com/cloud/api/response/TemplateResponse.java @@ -110,6 +110,9 @@ public class TemplateResponse extends BaseResponse { @SerializedName("checksum") @Param(description="checksum of the template") private String checksum; + @SerializedName("sourcetemplateid") @Param(description="the template ID of the parent template if present") + private Long sourcetemplateId; + public Long getObjectId() { return getId(); } @@ -336,5 +339,13 @@ public class TemplateResponse extends BaseResponse { public void setChecksum(String checksum) { this.checksum = checksum; - } + } + + public Long getSourceTemplateId() { + return sourcetemplateId; + } + + public void setSourceTemplateId(Long sourcetemplateId) { + this.sourcetemplateId = sourcetemplateId; + } } diff --git a/api/src/com/cloud/template/VirtualMachineTemplate.java b/api/src/com/cloud/template/VirtualMachineTemplate.java index 3a40f25f1fb..4a512a302aa 100755 --- a/api/src/com/cloud/template/VirtualMachineTemplate.java +++ b/api/src/com/cloud/template/VirtualMachineTemplate.java @@ -83,4 +83,6 @@ public interface VirtualMachineTemplate extends ControlledEntity { String getUrl(); String getChecksum(); + + Long getSourceTemplateId(); } diff --git a/core/src/com/cloud/storage/VMTemplateVO.java b/core/src/com/cloud/storage/VMTemplateVO.java index 32ad806d72a..000ffcd6a5a 100755 --- a/core/src/com/cloud/storage/VMTemplateVO.java +++ b/core/src/com/cloud/storage/VMTemplateVO.java @@ -112,7 +112,10 @@ public class VMTemplateVO implements VirtualMachineTemplate { @Column(name="extractable") private boolean extractable = true; - @Override + @Column(name="source_template_id") + private Long sourceTemplateId; + + @Override public String getUniqueName() { return uniqueName; } @@ -355,6 +358,15 @@ public class VMTemplateVO implements VirtualMachineTemplate { public void setExtractable(boolean extractable) { this.extractable = extractable; } + + @Override + public Long getSourceTemplateId() { + return sourceTemplateId; + } + + public void setSourceTemplateId(Long sourceTemplateId) { + this.sourceTemplateId = sourceTemplateId; + } @Override public long getDomainId() { diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 629843bd1dc..a86073089b3 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -1519,7 +1519,8 @@ public class ApiResponseHelper implements ResponseGenerator { } templateResponse.setChecksum(template.getChecksum()); - + templateResponse.setSourceTemplateId(template.getSourceTemplateId()); + templateResponse.setObjectName("template"); responses.add(templateResponse); } @@ -1580,7 +1581,8 @@ public class ApiResponseHelper implements ResponseGenerator { templateResponse.setHypervisor(template.getHypervisorType().toString()); templateResponse.setObjectName("template"); templateResponse.setChecksum(template.getChecksum()); - + templateResponse.setSourceTemplateId(template.getSourceTemplateId()); + responses.add(templateResponse); } response.setResponses(responses); @@ -1741,6 +1743,7 @@ public class ApiResponseHelper implements ResponseGenerator { templateResponse.setPasswordEnabled(template.getEnablePassword()); templateResponse.setZoneId(destZoneId); templateResponse.setZoneName(ApiDBUtils.findZoneById(destZoneId).getName()); + templateResponse.setSourceTemplateId(template.getSourceTemplateId()); GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); if (os != null) { @@ -1942,6 +1945,8 @@ public class ApiResponseHelper implements ResponseGenerator { response.setZoneName(zone.getName()); } + response.setSourceTemplateId(template.getSourceTemplateId()); + response.setObjectName("template"); return response; diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index e34a4479398..a3d47a672bb 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1374,12 +1374,20 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager Long nextTemplateId = _templateDao.getNextInSequence(Long.class, "id"); String description = cmd.getDisplayText(); boolean isExtractable = false; + Long sourceTemplateId = null; if (volume != null) { VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId()); isExtractable = template != null && template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM; + sourceTemplateId = template.getId(); } privateTemplate = new VMTemplateVO(nextTemplateId, uniqueName, name, ImageFormat.RAW, isPublic, featured, isExtractable, TemplateType.USER, null, null, requiresHvmValue, bitsValue, accountId, null, description, passwordEnabledValue, guestOS.getId(), true, hyperType); + if(sourceTemplateId != null){ + if(s_logger.isDebugEnabled()){ + s_logger.debug("This template is getting created from other template, setting source template Id to: "+sourceTemplateId); + } + } + privateTemplate.setSourceTemplateId(sourceTemplateId); VMTemplateVO template = _templateDao.persist(privateTemplate); // Increment the number of templates @@ -1954,7 +1962,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Override public UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, String userData, String sshKeyPair, Host destinationHost) - throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { + throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { Account caller = UserContext.current().getCaller(); List networkList = new ArrayList(); @@ -2052,7 +2060,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Override public UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, String userData, String sshKeyPair, Host destinationHost) - throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { + throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { Account caller = UserContext.current().getCaller(); List networkList = new ArrayList(); @@ -2397,7 +2405,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } protected UserVm startVirtualMachine(DeployVMCmd cmd, Map additonalParams) throws ResourceUnavailableException, InsufficientCapacityException, - ConcurrentOperationException { + ConcurrentOperationException { long vmId = cmd.getEntityId(); UserVmVO vm = _vmDao.findById(vmId); _vmDao.loadDetails(vm); @@ -2955,7 +2963,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Override public UserVm createVirtualMachine(DeployVMCmd cmd) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, StorageUnavailableException, - ResourceAllocationException { + ResourceAllocationException { // TODO Auto-generated method stub return null; } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 650f175923d..6c59208386a 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -785,6 +785,7 @@ CREATE TABLE `cloud`.`vm_template` ( `cross_zones` int(1) unsigned NOT NULL default 0 COMMENT 'Make this template available in all zones', `extractable` int(1) unsigned NOT NULL default 0 COMMENT 'Is this template extractable', `hypervisor_type` varchar(32) COMMENT 'hypervisor that the template is belonged to', + `source_template_id` bigint unsigned COMMENT 'Id of the original template, if this template is created from snapshot', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/setup/db/db/schema-224to225.sql b/setup/db/db/schema-224to225.sql index c6f41ad7082..4bb38d5dcee 100644 --- a/setup/db/db/schema-224to225.sql +++ b/setup/db/db/schema-224to225.sql @@ -43,3 +43,5 @@ ALTER TABLE `cloud`.`security_ingress_rule` DROP COLUMN `allowed_sec_grp_acct`; ALTER TABLE `cloud`.`data_center` ADD COLUMN `zone_token` varchar(255); ALTER TABLE `cloud`.`data_center` ADD INDEX `i_data_center__zone_token`(`zone_token`); + +ALTER TABLE `cloud`.`vm_template` ADD COLUMN `source_template_id` bigint unsigned COMMENT 'Id of the original template, if this template is created from snapshot';