diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java index d58ea3ec384..674f67c2c51 100755 --- a/api/src/com/cloud/server/ManagementService.java +++ b/api/src/com/cloud/server/ManagementService.java @@ -219,28 +219,6 @@ public interface ManagementService { */ List listCapacities(ListCapacityCmd cmd); - /** - * List ISOs that match the specified criteria. - * - * @param cmd - * The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, - * and zoneId - * parameters. - * @return list of ISOs - */ - Set> listIsos(ListIsosCmd cmd); - - /** - * List templates that match the specified criteria. - * - * @param cmd - * The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, - * and zoneId - * parameters. - * @return list of ISOs - */ - Set> listTemplates(ListTemplatesCmd cmd); - /** * List system VMs by the given search criteria diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java index 3d381b0300a..77d3bea59cd 100644 --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java @@ -241,7 +241,7 @@ public interface ResponseGenerator { Host findHostById(Long hostId); - List createTemplateResponses(long templateId, long zoneId, boolean readyOnly); + //List createTemplateResponses(long templateId, long zoneId, boolean readyOnly); VpnUsersResponse createVpnUserResponse(VpnUser user); @@ -267,7 +267,9 @@ public interface ResponseGenerator { //List createEventResponse(EventJoinVO... events); - TemplateResponse createIsoResponse(VirtualMachineTemplate result); + TemplateResponse createTemplateUpdateResponse(VirtualMachineTemplate result); + + List createTemplateResponses(VirtualMachineTemplate result, Long zoneId, boolean readyOnly); List createCapacityResponse(List result, DecimalFormat format); @@ -287,13 +289,13 @@ public interface ResponseGenerator { Long getSecurityGroupId(String groupName, long accountId); - List createIsoResponses(long isoId, Long zoneId, boolean readyOnly); + List createIsoResponses(VirtualMachineTemplate iso, Long zoneId, boolean readyOnly); + + // List createIsoResponses(long isoId, Long zoneId, boolean readyOnly); + //List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly); ProjectResponse createProjectResponse(Project project); - - List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly); - List createTemplateResponses(long templateId, Long vmId); FirewallResponse createFirewallResponse(FirewallRule fwRule); diff --git a/api/src/org/apache/cloudstack/api/command/admin/template/PrepareTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/template/PrepareTemplateCmd.java index 7d41d10ae08..aee35ade978 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/template/PrepareTemplateCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/template/PrepareTemplateCmd.java @@ -80,7 +80,7 @@ public class PrepareTemplateCmd extends BaseCmd { ListResponse response = new ListResponse(); VirtualMachineTemplate vmTemplate = _templateService.prepareTemplate(templateId, zoneId); - List templateResponses = _responseGenerator.createTemplateResponses(vmTemplate.getId(), zoneId, true); + List templateResponses = _responseGenerator.createTemplateResponses(vmTemplate, zoneId, true); response.setResponses(templateResponses); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java b/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java index 3219601156e..b490ca9966a 100644 --- a/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java @@ -148,16 +148,7 @@ public class ListIsosCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - Set> isoZonePairSet = _mgr.listIsos(this); - ListResponse response = new ListResponse(); - List templateResponses = new ArrayList(); - - for (Pair iso : isoZonePairSet) { - List responses = new ArrayList(); - responses = _responseGenerator.createIsoResponses(iso.first(), iso.second(), listInReadyState()); - templateResponses.addAll(responses); - } - response.setResponses(templateResponses); + ListResponse response = _queryService.listIsos(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java index 284d5530846..0fa47eb1d17 100644 --- a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java @@ -88,7 +88,7 @@ public class RegisterIsoCmd extends BaseCmd { @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID, entityType = ProjectResponse.class, description="Register iso for the project") private Long projectId; - + @Parameter(name=ApiConstants.IMAGE_STORE_UUID, type=CommandType.STRING, description="Image store uuid") private String imageStoreUuid; @@ -144,7 +144,7 @@ public class RegisterIsoCmd extends BaseCmd { public String getChecksum() { return checksum; } - + public String getImageStoreUuid() { return this.imageStoreUuid; } @@ -173,7 +173,7 @@ public class RegisterIsoCmd extends BaseCmd { VirtualMachineTemplate template = _templateService.registerIso(this); if (template != null) { ListResponse response = new ListResponse(); - List templateResponses = _responseGenerator.createIsoResponses(template.getId(), zoneId, false); + List templateResponses = _responseGenerator.createIsoResponses(template, zoneId, false); response.setResponses(templateResponses); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java b/api/src/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java index 1384fa8c573..1d848472fad 100644 --- a/api/src/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java @@ -68,7 +68,7 @@ public class UpdateIsoCmd extends BaseUpdateTemplateOrIsoCmd { public void execute(){ VirtualMachineTemplate result = _templateService.updateTemplate(this); if (result != null) { - TemplateResponse response = _responseGenerator.createIsoResponse(result); + TemplateResponse response = _responseGenerator.createTemplateUpdateResponse(result); response.setResponseName(getCommandName()); this.setResponseObject(response); } else { diff --git a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java index a4f05821244..34ee4bdc786 100644 --- a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java @@ -124,7 +124,7 @@ public class CopyTemplateCmd extends BaseAsyncCmd { VirtualMachineTemplate template = _templateService.copyTemplate(this); if (template != null){ - List listResponse = _responseGenerator.createTemplateResponses(template.getId(), getDestinationZoneId(), false); + List listResponse = _responseGenerator.createTemplateResponses(template, getDestinationZoneId(), false); TemplateResponse response = new TemplateResponse(); if (listResponse != null && !listResponse.isEmpty()) { response = listResponse.get(0); diff --git a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java index aeb76f507f3..0b937be6d59 100644 --- a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java @@ -26,6 +26,7 @@ import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.TemplateResponse; +import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.log4j.Logger; @@ -55,7 +56,7 @@ public class ListTemplatesCmd extends BaseListTaggedResourcesCmd { @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, description="the template name") private String templateName; - @Parameter(name=ApiConstants.TEMPLATE_FILTER, type=CommandType.STRING, required=true, description="possible values are \"featured\", \"self\", \"selfexecutable\",\"sharedexecutable\",\"executable\", and \"community\". " + + @Parameter(name=ApiConstants.TEMPLATE_FILTER, type=CommandType.STRING, required=true, description="possible values are \"featured\", \"self\", \"selfexecutable\",\"sharedexecutable\",\"executable\", and \"community\". " + "* featured : templates that have been marked as featured and public. " + "* self : templates that have been registered or created by the calling user. " + "* selfexecutable : same as self, but only returns templates that can be used to deploy a new VM. " + @@ -119,18 +120,7 @@ public class ListTemplatesCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - Set> templateZonePairSet = _mgr.listTemplates(this); - - ListResponse response = new ListResponse(); - List templateResponses = new ArrayList(); - - for (Pair template : templateZonePairSet) { - List responses = new ArrayList(); - responses = _responseGenerator.createTemplateResponses(template.first().longValue(), template.second(), listInReadyState()); - templateResponses.addAll(responses); - } - - response.setResponses(templateResponses); + ListResponse response = _queryService.listTemplates(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java index f93c9f4254c..974edb37537 100644 --- a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java @@ -230,7 +230,7 @@ public class RegisterTemplateCmd extends BaseCmd { VirtualMachineTemplate template = _templateService.registerTemplate(this); if (template != null){ ListResponse response = new ListResponse(); - List templateResponses = _responseGenerator.createTemplateResponses(template.getId(), zoneId, false); + List templateResponses = _responseGenerator.createTemplateResponses(template, zoneId, false); response.setResponses(templateResponses); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java index e342fb1c204..9f55f9df6c7 100644 --- a/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java @@ -68,7 +68,7 @@ public class UpdateTemplateCmd extends BaseUpdateTemplateOrIsoCmd { public void execute(){ VirtualMachineTemplate result = _templateService.updateTemplate(this); if (result != null) { - TemplateResponse response = _responseGenerator.createIsoResponse(result); + TemplateResponse response = _responseGenerator.createTemplateUpdateResponse(result); response.setObjectName("template"); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/response/TemplateResponse.java b/api/src/org/apache/cloudstack/api/response/TemplateResponse.java index ed933ff18c3..225edd553db 100644 --- a/api/src/org/apache/cloudstack/api/response/TemplateResponse.java +++ b/api/src/org/apache/cloudstack/api/response/TemplateResponse.java @@ -17,8 +17,10 @@ package org.apache.cloudstack.api.response; import java.util.Date; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; @@ -31,7 +33,7 @@ import com.google.gson.annotations.SerializedName; @EntityReference(value=VirtualMachineTemplate.class) @SuppressWarnings("unused") -public class TemplateResponse extends BaseResponse implements ControlledEntityResponse { +public class TemplateResponse extends BaseResponse implements ControlledViewEntityResponse { @SerializedName(ApiConstants.ID) @Param(description="the template ID") private String id; @@ -82,6 +84,8 @@ public class TemplateResponse extends BaseResponse implements ControlledEntityRe @SerializedName(ApiConstants.ACCOUNT) @Param(description="the account name to which the template belongs") private String account; + //TODO: since a template can be associated to more than one zones, this model is not accurate. For backward-compatibility, keep these fields + // here, but add a zones field to capture multiple zones. @SerializedName(ApiConstants.ZONE_ID) @Param(description="the ID of the zone for this template") private String zoneId; @@ -133,12 +137,20 @@ public class TemplateResponse extends BaseResponse implements ControlledEntityRe @SerializedName(ApiConstants.DETAILS) @Param(description="additional key/value details tied with template") private Map details; + @SerializedName("zones") @Param(description="list of zones associated with tempate", responseObject = TemplateZoneResponse.class) + private Set zones; + @SerializedName(ApiConstants.TAGS) @Param(description="the list of resource tags associated with tempate", responseObject = ResourceTagResponse.class) - private List tags; + private Set tags; @SerializedName(ApiConstants.SSHKEY_ENABLED) @Param(description="true if template is sshkey enabled, false otherwise") private Boolean sshKeyEnabled; + public TemplateResponse(){ + zones = new LinkedHashSet(); + tags = new LinkedHashSet(); + } + @Override public String getObjectId() { return this.getId(); @@ -288,12 +300,29 @@ public class TemplateResponse extends BaseResponse implements ControlledEntityRe this.details = details; } - public void setTags(List tags) { + public void setTags(Set tags) { this.tags = tags; } + public void addTag(ResourceTagResponse tag){ + this.tags.add(tag); + } + + public void setZones(Set zones){ + this.zones = zones; + } + + public void addZone(TemplateZoneResponse zone){ + this.zones.add(zone); + } + public void setSshKeyEnabled(boolean sshKeyEnabled) { this.sshKeyEnabled = sshKeyEnabled; } + public String getZoneId() { + return zoneId; + } + + } diff --git a/api/src/org/apache/cloudstack/api/response/TemplateZoneResponse.java b/api/src/org/apache/cloudstack/api/response/TemplateZoneResponse.java new file mode 100644 index 00000000000..9d26ad9fc10 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/TemplateZoneResponse.java @@ -0,0 +1,90 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.response; + +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +public class TemplateZoneResponse extends BaseResponse { + @SerializedName(ApiConstants.ZONE_ID) @Param(description="the ID of the zone for the template") + private String zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) @Param(description="the name of the zone for the template") + private String zoneName; + + + public TemplateZoneResponse(){ + super(); + } + + public TemplateZoneResponse(String zoneId, String zoneName){ + super(); + this.zoneId = zoneId; + this.zoneName = zoneName; + } + + + + public String getZoneId() { + return zoneId; + } + + public void setZoneId(String zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(String zoneName) { + this.zoneName = zoneName; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + String oid = this.getZoneId(); + result = prime * result + ((oid== null) ? 0 : oid.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TemplateZoneResponse other = (TemplateZoneResponse) obj; + String oid = this.getZoneId(); + if (oid == null) { + if (other.getZoneId() != null) + return false; + } else if (!oid.equals(other.getZoneId())) + return false; + else if ( this.getZoneName().equals(other.getZoneName())) + return false; + return true; + } + +} diff --git a/api/src/org/apache/cloudstack/query/QueryService.java b/api/src/org/apache/cloudstack/query/QueryService.java index 66f63993dfd..4efbd1c2232 100644 --- a/api/src/org/apache/cloudstack/query/QueryService.java +++ b/api/src/org/apache/cloudstack/query/QueryService.java @@ -24,6 +24,7 @@ import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; import org.apache.cloudstack.api.command.user.account.ListAccountsCmd; import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd; import org.apache.cloudstack.api.command.user.event.ListEventsCmd; +import org.apache.cloudstack.api.command.user.iso.ListIsosCmd; import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd; import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd; import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd; @@ -31,6 +32,7 @@ import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd; import org.apache.cloudstack.api.command.user.project.ListProjectsCmd; import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd; import org.apache.cloudstack.api.command.user.tag.ListTagsCmd; +import org.apache.cloudstack.api.command.user.template.ListTemplatesCmd; import org.apache.cloudstack.api.command.user.vm.ListVMsCmd; import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd; import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd; @@ -51,6 +53,7 @@ import org.apache.cloudstack.api.response.ResourceTagResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; +import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; @@ -101,4 +104,8 @@ public interface QueryService { public ListResponse searchForServiceOfferings(ListServiceOfferingsCmd cmd); public ListResponse listDataCenters(ListZonesByCmd cmd); + + public ListResponse listTemplates(ListTemplatesCmd cmd); + + public ListResponse listIsos(ListIsosCmd cmd); } diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 6b8607f6a85..00358d7f0bd 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -42,6 +42,7 @@ import org.apache.cloudstack.api.response.ResourceTagResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; +import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; @@ -65,6 +66,7 @@ import com.cloud.api.query.dao.ResourceTagJoinDao; import com.cloud.api.query.dao.SecurityGroupJoinDao; import com.cloud.api.query.dao.ServiceOfferingJoinDao; import com.cloud.api.query.dao.StoragePoolJoinDao; +import com.cloud.api.query.dao.TemplateJoinDao; import com.cloud.api.query.dao.UserAccountJoinDao; import com.cloud.api.query.dao.UserVmJoinDao; import com.cloud.api.query.dao.VolumeJoinDao; @@ -84,6 +86,7 @@ import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.api.query.vo.ServiceOfferingJoinVO; import com.cloud.api.query.vo.StoragePoolJoinVO; +import com.cloud.api.query.vo.TemplateJoinVO; import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.api.query.vo.VolumeJoinVO; @@ -240,6 +243,7 @@ import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeHostDao; import com.cloud.storage.snapshot.SnapshotPolicy; import com.cloud.template.TemplateManager; +import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.user.AccountDetailsDao; import com.cloud.user.AccountVO; @@ -369,6 +373,7 @@ public class ApiDBUtils { static ImageStoreJoinDao _imageStoreJoinDao; static AccountJoinDao _accountJoinDao; static AsyncJobJoinDao _jobJoinDao; + static TemplateJoinDao _templateJoinDao; static PhysicalNetworkTrafficTypeDao _physicalNetworkTrafficTypeDao; static PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao; @@ -474,6 +479,7 @@ public class ApiDBUtils { @Inject private ImageStoreJoinDao imageStoreJoinDao; @Inject private AccountJoinDao accountJoinDao; @Inject private AsyncJobJoinDao jobJoinDao; + @Inject private TemplateJoinDao templateJoinDao; @Inject private PhysicalNetworkTrafficTypeDao physicalNetworkTrafficTypeDao; @Inject private PhysicalNetworkServiceProviderDao physicalNetworkServiceProviderDao; @@ -575,6 +581,7 @@ public class ApiDBUtils { _imageStoreJoinDao = imageStoreJoinDao; _accountJoinDao = accountJoinDao; _jobJoinDao = jobJoinDao; + _templateJoinDao = templateJoinDao; _physicalNetworkTrafficTypeDao = physicalNetworkTrafficTypeDao; _physicalNetworkServiceProviderDao = physicalNetworkServiceProviderDao; @@ -1606,4 +1613,33 @@ public class ApiDBUtils { public static List findNicSecondaryIps(long nicId) { return _nicSecondaryIpDao.listByNicId(nicId); } + + + public static TemplateResponse newTemplateUpdateResponse(TemplateJoinVO vr) { + return _templateJoinDao.newUpdateResponse(vr); + } + + + public static TemplateResponse newTemplateResponse(TemplateJoinVO vr) { + return _templateJoinDao.newTemplateResponse(vr); + } + + + public static TemplateResponse newIsoResponse(TemplateJoinVO vr) { + return _templateJoinDao.newIsoResponse(vr); + } + + public static TemplateResponse fillTemplateDetails(TemplateResponse vrData, TemplateJoinVO vr){ + return _templateJoinDao.setTemplateResponse(vrData, vr); + } + + public static List newTemplateView(VirtualMachineTemplate vr){ + return _templateJoinDao.newTemplateView(vr); + } + + + public static List newTemplateView(VirtualMachineTemplate vr, long zoneId, boolean readyOnly){ + return _templateJoinDao.newTemplateView(vr, zoneId, readyOnly); + } + } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index e9255c452f4..a0c9d38cd24 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -151,6 +151,7 @@ import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.api.query.vo.ServiceOfferingJoinVO; import com.cloud.api.query.vo.StoragePoolJoinVO; +import com.cloud.api.query.vo.TemplateJoinVO; import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.api.query.vo.VolumeJoinVO; @@ -281,8 +282,10 @@ public class ApiResponseHelper implements ResponseGenerator { public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class); private static final DecimalFormat s_percentFormat = new DecimalFormat("##.##"); - @Inject private EntityManager _entityMgr = null; - @Inject private UsageService _usageSvc = null; + @Inject + private EntityManager _entityMgr = null; + @Inject + private UsageService _usageSvc = null; @Override public UserResponse createUserResponse(User user) { @@ -290,9 +293,8 @@ public class ApiResponseHelper implements ResponseGenerator { return ApiDBUtils.newUserResponse(vUser); } - - - // this method is used for response generation via createAccount (which creates an account + user) + // this method is used for response generation via createAccount (which + // creates an account + user) @Override public AccountResponse createUserAccountResponse(UserAccount user) { return ApiDBUtils.newAccountResponse(ApiDBUtils.findAccountViewById(user.getAccountId())); @@ -304,7 +306,6 @@ public class ApiResponseHelper implements ResponseGenerator { return ApiDBUtils.newAccountResponse(vUser); } - @Override public UserResponse createUserResponse(UserAccount user) { UserAccountJoinVO vUser = ApiDBUtils.newUserView(user); @@ -352,8 +353,8 @@ public class ApiResponseHelper implements ResponseGenerator { populateDomain(resourceLimitResponse, accountTemp.getDomainId()); } resourceLimitResponse.setResourceType(Integer.valueOf(limit.getType().getOrdinal()).toString()); - if(limit.getType() == ResourceType.primary_storage || limit.getType() == ResourceType.secondary_storage) { - resourceLimitResponse.setMax((long) Math.ceil(limit.getMax()/ResourceType.bytesToGiB)); + if (limit.getType() == ResourceType.primary_storage || limit.getType() == ResourceType.secondary_storage) { + resourceLimitResponse.setMax((long) Math.ceil(limit.getMax() / ResourceType.bytesToGiB)); } else { resourceLimitResponse.setMax(limit.getMax()); } @@ -420,7 +421,7 @@ public class ApiResponseHelper implements ResponseGenerator { snapshotResponse.setIntervalType(ApiDBUtils.getSnapshotIntervalTypes(snapshot.getId())); snapshotResponse.setState(snapshot.getState()); - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Snapshot, snapshot.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -443,9 +444,9 @@ public class ApiResponseHelper implements ResponseGenerator { vmSnapshotResponse.setDescription(vmSnapshot.getDescription()); vmSnapshotResponse.setDisplayName(vmSnapshot.getDisplayName()); UserVm vm = ApiDBUtils.findUserVmById(vmSnapshot.getVmId()); - if(vm!=null) + if (vm != null) vmSnapshotResponse.setVirtualMachineid(vm.getUuid()); - if(vmSnapshot.getParent() != null) + if (vmSnapshot.getParent() != null) vmSnapshotResponse.setParentName(ApiDBUtils.getVMSnapshotById(vmSnapshot.getParent()).getDisplayName()); vmSnapshotResponse.setCurrent(vmSnapshot.getCurrent()); vmSnapshotResponse.setType(vmSnapshot.getType().toString()); @@ -542,9 +543,9 @@ public class ApiResponseHelper implements ResponseGenerator { // get start ip and end ip of corresponding vlan String ipRange = vlan.getIpRange(); if (ipRange != null) { - String[] range = ipRange.split("-"); - vlanResponse.setStartIp(range[0]); - vlanResponse.setEndIp(range[1]); + String[] range = ipRange.split("-"); + vlanResponse.setStartIp(range[0]); + vlanResponse.setEndIp(range[1]); } vlanResponse.setIp6Gateway(vlan.getIp6Gateway()); @@ -552,9 +553,9 @@ public class ApiResponseHelper implements ResponseGenerator { String ip6Range = vlan.getIp6Range(); if (ip6Range != null) { - String[] range = ip6Range.split("-"); - vlanResponse.setStartIpv6(range[0]); - vlanResponse.setEndIpv6(range[1]); + String[] range = ip6Range.split("-"); + vlanResponse.setStartIpv6(range[0]); + vlanResponse.setEndIpv6(range[1]); } if (vlan.getNetworkId() != null) { @@ -683,7 +684,7 @@ public class ApiResponseHelper implements ResponseGenerator { } } - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.PublicIpAddress, ipAddr.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -723,7 +724,7 @@ public class ApiResponseHelper implements ResponseGenerator { lbResponse.setZoneId(zone.getUuid()); } - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, loadBalancer.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -788,7 +789,8 @@ public class ApiResponseHelper implements ResponseGenerator { capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); } if (capacityResponse.getCapacityTotal() != 0) { - capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); + capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() + / (float) capacityResponse.getCapacityTotal() * 100f)); } else { capacityResponse.setPercentUsed(s_percentFormat.format(0L)); } @@ -808,7 +810,7 @@ public class ApiResponseHelper implements ResponseGenerator { return ApiDBUtils.newDataCenterResponse(vOffering, showCapacities); } - public static List getDataCenterCapacityResponse(Long zoneId){ + public static List getDataCenterCapacityResponse(Long zoneId) { List capacities = ApiDBUtils.getCapacityByClusterPodZone(zoneId, null, null); Set capacityResponses = new HashSet(); float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); @@ -827,7 +829,8 @@ public class ApiResponseHelper implements ResponseGenerator { capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); } if (capacityResponse.getCapacityTotal() != 0) { - capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); + capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() + / (float) capacityResponse.getCapacityTotal() * 100f)); } else { capacityResponse.setPercentUsed(s_percentFormat.format(0L)); } @@ -853,7 +856,8 @@ public class ApiResponseHelper implements ResponseGenerator { capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); if (capacityResponse.getCapacityTotal() != 0) { - capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); + capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() + / (float) capacityResponse.getCapacityTotal() * 100f)); } else { capacityResponse.setPercentUsed(s_percentFormat.format(0L)); } @@ -878,31 +882,26 @@ public class ApiResponseHelper implements ResponseGenerator { } - - @Override public StoragePoolResponse createStoragePoolResponse(StoragePool pool) { List viewPools = ApiDBUtils.newStoragePoolView(pool); - List listPools = ViewResponseHelper.createStoragePoolResponse(viewPools.toArray(new StoragePoolJoinVO[viewPools.size()])); + List listPools = ViewResponseHelper + .createStoragePoolResponse(viewPools.toArray(new StoragePoolJoinVO[viewPools.size()])); assert listPools != null && listPools.size() == 1 : "There should be one storage pool returned"; return listPools.get(0); - } - @Override public ImageStoreResponse createImageStoreResponse(ImageStore os) { List viewStores = ApiDBUtils.newImageStoreView(os); - List listStores = ViewResponseHelper.createImageStoreResponse(viewStores.toArray(new ImageStoreJoinVO[viewStores.size()])); + List listStores = ViewResponseHelper + .createImageStoreResponse(viewStores.toArray(new ImageStoreJoinVO[viewStores.size()])); assert listStores != null && listStores.size() == 1 : "There should be one image data store returned"; return listStores.get(0); - } - - @Override public ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities) { ClusterResponse clusterResponse = new ClusterResponse(); @@ -922,12 +921,11 @@ public class ApiResponseHelper implements ResponseGenerator { clusterResponse.setClusterType(cluster.getClusterType().toString()); clusterResponse.setAllocationState(cluster.getAllocationState().toString()); clusterResponse.setManagedState(cluster.getManagedState().toString()); - String cpuOvercommitRatio=ApiDBUtils.findClusterDetails(cluster.getId(),"cpuOvercommitRatio").getValue(); - String memoryOvercommitRatio=ApiDBUtils.findClusterDetails(cluster.getId(),"memoryOvercommitRatio").getValue(); + String cpuOvercommitRatio = ApiDBUtils.findClusterDetails(cluster.getId(), "cpuOvercommitRatio").getValue(); + String memoryOvercommitRatio = ApiDBUtils.findClusterDetails(cluster.getId(), "memoryOvercommitRatio").getValue(); clusterResponse.setCpuovercommitratio(cpuOvercommitRatio); clusterResponse.setRamovercommitratio(memoryOvercommitRatio); - if (showCapacities != null && showCapacities) { List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, null, cluster.getId()); Set capacityResponses = new HashSet(); @@ -939,10 +937,9 @@ public class ApiResponseHelper implements ResponseGenerator { if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * Float.parseFloat(cpuOvercommitRatio)))); - }else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_MEMORY){ + } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_MEMORY) { capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * Float.parseFloat(memoryOvercommitRatio)))); - } - else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { + } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, null, cluster.getId()); capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity()); @@ -950,7 +947,8 @@ public class ApiResponseHelper implements ResponseGenerator { capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); } if (capacityResponse.getCapacityTotal() != 0) { - capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); + capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() + / (float) capacityResponse.getCapacityTotal() * 100f)); } else { capacityResponse.setPercentUsed(s_percentFormat.format(0L)); } @@ -999,7 +997,7 @@ public class ApiResponseHelper implements ResponseGenerator { stateToSet = "Deleting"; } - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.PortForwardingRule, fwRule.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -1062,8 +1060,6 @@ public class ApiResponseHelper implements ResponseGenerator { return ViewResponseHelper.createUserVmResponse(objectName, viewVms.toArray(new UserVmJoinVO[viewVms.size()])); } - - @Override public DomainRouterResponse createDomainRouterResponse(VirtualRouter router) { List viewVrs = ApiDBUtils.newDomainRouterView(router); @@ -1072,26 +1068,25 @@ public class ApiResponseHelper implements ResponseGenerator { return listVrs.get(0); } - @Override public SystemVmResponse createSystemVmResponse(VirtualMachine vm) { SystemVmResponse vmResponse = new SystemVmResponse(); if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy) { // SystemVm vm = (SystemVm) systemVM; vmResponse.setId(vm.getUuid()); - //vmResponse.setObjectId(vm.getId()); + // vmResponse.setObjectId(vm.getId()); vmResponse.setSystemVmType(vm.getType().toString().toLowerCase()); vmResponse.setName(vm.getHostName()); - if ( vm.getPodIdToDeployIn() != null ){ + if (vm.getPodIdToDeployIn() != null) { HostPodVO pod = ApiDBUtils.findPodById(vm.getPodIdToDeployIn()); - if ( pod != null ){ - vmResponse.setPodId(pod.getUuid()); + if (pod != null) { + vmResponse.setPodId(pod.getUuid()); } } VMTemplateVO template = ApiDBUtils.findTemplateById(vm.getTemplateId()); - if (template != null){ - vmResponse.setTemplateId(template.getUuid()); + if (template != null) { + vmResponse.setTemplateId(template.getUuid()); } vmResponse.setCreated(vm.getCreated()); @@ -1215,267 +1210,45 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public TemplateResponse createIsoResponse(VirtualMachineTemplate result) { - TemplateResponse response = new TemplateResponse(); - response.setId(result.getUuid()); - response.setName(result.getName()); - response.setDisplayText(result.getDisplayText()); - response.setPublic(result.isPublicTemplate()); - response.setCreated(result.getCreated()); - response.setFormat(result.getFormat()); - GuestOS os = ApiDBUtils.findGuestOSById(result.getGuestOSId()); - if (os != null) { - response.setOsTypeId(os.getUuid()); - response.setOsTypeName(os.getDisplayName()); - } - response.setDetails(result.getDetails()); - Account caller = UserContext.current().getCaller(); + public TemplateResponse createTemplateUpdateResponse(VirtualMachineTemplate result) { + List tvo = ApiDBUtils.newTemplateView(result); + List listVrs = ViewResponseHelper.createTemplateUpdateResponse(tvo.toArray(new TemplateJoinVO[tvo.size()])); + assert listVrs != null && listVrs.size() == 1 : "There should be one template returned"; + return listVrs.get(0); + } - if (result.getFormat() == ImageFormat.ISO) { // Templates are always bootable - response.setBootable(result.isBootable()); + @Override + public List createTemplateResponses(VirtualMachineTemplate result, Long zoneId, boolean readyOnly) { + List tvo = null; + if (zoneId == null || zoneId == -1) { + tvo = ApiDBUtils.newTemplateView(result); } else { - response.setHypervisor(result.getHypervisorType().toString());// hypervisors are associated with templates + tvo = ApiDBUtils.newTemplateView(result, zoneId, readyOnly); + } - - // add account ID and name - Account owner = ApiDBUtils.findAccountById(result.getAccountId()); - populateAccount(response, owner.getId()); - populateDomain(response, owner.getDomainId()); - - //set tag information - List tags = null; - if (result.getFormat() == ImageFormat.ISO) { - tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, result.getId()); - } else { - tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Template, result.getId()); - } - - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - - response.setObjectName("iso"); - return response; + return ViewResponseHelper.createTemplateResponse(tvo.toArray(new TemplateJoinVO[tvo.size()])); } @Override public List createTemplateResponses(long templateId, Long zoneId, boolean readyOnly) { - if (zoneId == null || zoneId == -1) { - List responses = new ArrayList(); - List dcs = new ArrayList(); - responses = createSwiftTemplateResponses(templateId); - if (!responses.isEmpty()) { - return responses; - } - dcs.addAll(ApiDBUtils.listZones()); - for (DataCenterVO dc : dcs) { - responses.addAll(createTemplateResponses(templateId, dc.getId(), readyOnly)); - } - return responses; - } else { - return createTemplateResponses(templateId, zoneId.longValue(), readyOnly); - } - } - - private List createSwiftTemplateResponses(long templateId) { VirtualMachineTemplate template = findTemplateById(templateId); - List responses = new ArrayList(); - VMTemplateSwiftVO templateSwiftRef = ApiDBUtils.findTemplateSwiftRef(templateId); - if (templateSwiftRef == null) { - return responses; - } - - TemplateResponse templateResponse = new TemplateResponse(); - templateResponse.setId(template.getUuid()); - templateResponse.setName(template.getName()); - templateResponse.setDisplayText(template.getDisplayText()); - templateResponse.setPublic(template.isPublicTemplate()); - templateResponse.setCreated(templateSwiftRef.getCreated()); - - templateResponse.setReady(true); - templateResponse.setFeatured(template.isFeatured()); - templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); - templateResponse.setPasswordEnabled(template.getEnablePassword()); - templateResponse.setSshKeyEnabled(template.getEnableSshKey()); - templateResponse.setCrossZones(template.isCrossZones()); - templateResponse.setFormat(template.getFormat()); - templateResponse.setDetails(template.getDetails()); - if (template.getTemplateType() != null) { - templateResponse.setTemplateType(template.getTemplateType().toString()); - } - - templateResponse.setHypervisor(template.getHypervisorType().toString()); - - GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); - if (os != null) { - templateResponse.setOsTypeId(os.getUuid()); - templateResponse.setOsTypeName(os.getDisplayName()); - } else { - templateResponse.setOsTypeId("-1"); - templateResponse.setOsTypeName(""); - } - - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(template.getAccountId()); - populateAccount(templateResponse, account.getId()); - populateDomain(templateResponse, account.getDomainId()); - - Account caller = UserContext.current().getCaller(); - boolean isAdmin = false; - if (BaseCmd.isAdmin(caller.getType())) { - isAdmin = true; - } - - // If the user is an Admin, add the template download status - if (isAdmin || caller.getId() == template.getAccountId()) { - // add download status - templateResponse.setStatus("Successfully Installed"); - } - - Long templateSize = templateSwiftRef.getSize(); - if (templateSize > 0) { - templateResponse.setSize(templateSize); - } - - templateResponse.setChecksum(template.getChecksum()); - if (template.getSourceTemplateId() != null) { - VirtualMachineTemplate tmpl = ApiDBUtils.findTemplateById(template.getSourceTemplateId()); - if (tmpl != null) { - templateResponse.setSourceTemplateId(tmpl.getUuid()); - } - } - - templateResponse.setChecksum(template.getChecksum()); - - templateResponse.setTemplateTag(template.getTemplateTag()); - - templateResponse.setObjectName("template"); - responses.add(templateResponse); - return responses; + return createTemplateResponses(template, zoneId, readyOnly); } + @Override - public List createTemplateResponses(long templateId, long zoneId, boolean readyOnly) { - VirtualMachineTemplate template = findTemplateById(templateId); - List responses = new ArrayList(); - VMTemplateHostVO templateHostRef = ApiDBUtils.findTemplateHostRef(templateId, zoneId, readyOnly); - if (templateHostRef == null) { - return responses; - } - - HostVO host = ApiDBUtils.findHostById(templateHostRef.getHostId()); - if (host.getType() == Host.Type.LocalSecondaryStorage && host.getStatus() != com.cloud.host.Status.Up) { - return responses; - } - - TemplateResponse templateResponse = new TemplateResponse(); - templateResponse.setId(template.getUuid()); - templateResponse.setName(template.getName()); - templateResponse.setDisplayText(template.getDisplayText()); - templateResponse.setPublic(template.isPublicTemplate()); - templateResponse.setCreated(templateHostRef.getCreated()); - - templateResponse.setReady(templateHostRef.getDownloadState() == Status.DOWNLOADED); - templateResponse.setFeatured(template.isFeatured()); - templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); - templateResponse.setPasswordEnabled(template.getEnablePassword()); - templateResponse.setSshKeyEnabled(template.getEnableSshKey()); - templateResponse.setCrossZones(template.isCrossZones()); - templateResponse.setFormat(template.getFormat()); - if (template.getTemplateType() != null) { - templateResponse.setTemplateType(template.getTemplateType().toString()); - } - - templateResponse.setHypervisor(template.getHypervisorType().toString()); - templateResponse.setDetails(template.getDetails()); - - GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); - if (os != null) { - templateResponse.setOsTypeId(os.getUuid()); - templateResponse.setOsTypeName(os.getDisplayName()); + public List createIsoResponses(VirtualMachineTemplate result, Long zoneId, boolean readyOnly) { + List tvo = null; + if (zoneId == null || zoneId == -1) { + tvo = ApiDBUtils.newTemplateView(result); } else { - templateResponse.setOsTypeId("-1"); - templateResponse.setOsTypeName(""); + tvo = ApiDBUtils.newTemplateView(result, zoneId, readyOnly); + } - - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(template.getAccountId()); - populateAccount(templateResponse, account.getId()); - populateDomain(templateResponse, account.getDomainId()); - - DataCenter datacenter = ApiDBUtils.findZoneById(zoneId); - - if (datacenter != null) { - // Add the zone ID - templateResponse.setZoneId(datacenter.getUuid()); - templateResponse.setZoneName(datacenter.getName()); - } - - boolean isAdmin = false; - Account caller = UserContext.current().getCaller(); - if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { - isAdmin = true; - } - - // If the user is an Admin, add the template download status - if (isAdmin || caller.getId() == template.getAccountId()) { - // add download status - if (templateHostRef.getDownloadState() != Status.DOWNLOADED) { - String templateStatus = "Processing"; - if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (templateHostRef.getDownloadPercent() == 100) { - templateStatus = "Installing Template"; - } else { - templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded"; - } - } else { - templateStatus = templateHostRef.getErrorString(); - } - templateResponse.setStatus(templateStatus); - } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - templateResponse.setStatus("Download Complete"); - } else { - templateResponse.setStatus("Successfully Installed"); - } - } - - Long templateSize = templateHostRef.getSize(); - if (templateSize > 0) { - templateResponse.setSize(templateSize); - } - - templateResponse.setChecksum(template.getChecksum()); - if (template.getSourceTemplateId() != null) { - VirtualMachineTemplate tmpl = ApiDBUtils.findTemplateById(template.getSourceTemplateId()); - if (tmpl != null) { - templateResponse.setSourceTemplateId(tmpl.getUuid()); - } - } - - templateResponse.setChecksum(template.getChecksum()); - - templateResponse.setTemplateTag(template.getTemplateTag()); - - //set tag information - List tags = null; - if (template.getFormat() == ImageFormat.ISO) { - tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, template.getId()); - } else { - tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Template, template.getId()); - } - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - templateResponse.setTags(tagResponses); - - templateResponse.setObjectName("template"); - responses.add(templateResponse); - return responses; + return ViewResponseHelper.createIsoResponse(tvo.toArray(new TemplateJoinVO[tvo.size()])); } + /* @Override public List createIsoResponses(long isoId, Long zoneId, boolean readyOnly) { @@ -1503,8 +1276,8 @@ public class ApiResponseHelper implements ResponseGenerator { populateAccount(isoResponse, owner.getId()); populateDomain(isoResponse, owner.getDomainId()); - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, iso.getId()); + // set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, iso.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); @@ -1727,8 +1500,8 @@ public class ApiResponseHelper implements ResponseGenerator { isoResponse.setSize(isoSize); } - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, iso.getId()); + // set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, iso.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -1741,8 +1514,7 @@ public class ApiResponseHelper implements ResponseGenerator { isoResponses.add(isoResponse); return isoResponses; } - - +*/ @Override public SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group) { @@ -1806,8 +1578,6 @@ public class ApiResponseHelper implements ResponseGenerator { return createTemplateResponses(templateId, host.getDataCenterId(), true); } - - @Override public EventResponse createEventResponse(Event event) { EventJoinVO vEvent = ApiDBUtils.newEventView(event); @@ -1824,14 +1594,17 @@ public class ApiResponseHelper implements ResponseGenerator { List allStoragePools = ApiDBUtils.searchForStoragePools(c); for (StoragePoolVO pool : allStoragePools) { StoragePoolType poolType = pool.getPoolType(); - if (!(poolType.isShared())) {// All the non shared storages shouldn't show up in the capacity calculation + if (!(poolType.isShared())) {// All the non shared storages + // shouldn't show up in the capacity + // calculation poolIdsToIgnore.add(pool.getId()); } } float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); - // collect all the capacity types, sum allocated/used and sum total...get one capacity number for each + // collect all the capacity types, sum allocated/used and sum + // total...get one capacity number for each for (Capacity capacity : hostCapacities) { // check if zone exist @@ -1991,10 +1764,11 @@ public class ApiResponseHelper implements ResponseGenerator { capacityResponse.setZoneId(zone.getUuid()); capacityResponse.setZoneName(zone.getName()); } - if (summedCapacity.getUsedPercentage() != null){ + if (summedCapacity.getUsedPercentage() != null) { capacityResponse.setPercentUsed(format.format(summedCapacity.getUsedPercentage() * 100f)); } else if (summedCapacity.getTotalCapacity() != 0) { - capacityResponse.setPercentUsed(format.format((float) summedCapacity.getUsedCapacity() / (float) summedCapacity.getTotalCapacity() * 100f)); + capacityResponse.setPercentUsed(format.format((float) summedCapacity.getUsedCapacity() / (float) summedCapacity.getTotalCapacity() + * 100f)); } else { capacityResponse.setPercentUsed(format.format(0L)); } @@ -2012,7 +1786,8 @@ public class ApiResponseHelper implements ResponseGenerator { VirtualMachineTemplate template = ApiDBUtils.findTemplateById(id); Account templateOwner = ApiDBUtils.findAccountById(template.getAccountId()); if (isAdmin) { - // FIXME: we have just template id and need to get template owner from that + // FIXME: we have just template id and need to get template owner + // from that if (templateOwner != null) { templateOwnerDomain = templateOwner.getDomainId(); } @@ -2193,10 +1968,10 @@ public class ApiResponseHelper implements ResponseGenerator { eLb.setValue(offering.getElasticLb() ? "true" : "false"); lbCapResponse.add(eLb); - CapabilityResponse inline = new CapabilityResponse(); - inline.setName(Capability.InlineMode.getName()); - inline.setValue(offering.isInline() ? "true" : "false"); - lbCapResponse.add(inline); + CapabilityResponse inline = new CapabilityResponse(); + inline.setName(Capability.InlineMode.getName()); + inline.setValue(offering.isInline() ? "true" : "false"); + lbCapResponse.add(inline); svcRsp.setCapabilities(lbCapResponse); } else if (Service.SourceNat == service) { @@ -2234,7 +2009,8 @@ public class ApiResponseHelper implements ResponseGenerator { @Override public NetworkResponse createNetworkResponse(Network network) { - // need to get network profile in order to retrieve dns information from there + // need to get network profile in order to retrieve dns information from + // there NetworkProfile profile = ApiDBUtils.getNetworkProfile(network.getId()); NetworkResponse response = new NetworkResponse(); response.setId(network.getUuid()); @@ -2257,8 +2033,10 @@ public class ApiResponseHelper implements ResponseGenerator { // FIXME - either set netmask or cidr response.setCidr(network.getCidr()); response.setNetworkCidr((network.getNetworkCidr())); - // If network has reservation its entire network cidr is defined by getNetworkCidr() - // if no reservation is present then getCidr() will define the entire network cidr + // If network has reservation its entire network cidr is defined by + // getNetworkCidr() + // if no reservation is present then getCidr() will define the entire + // network cidr if (network.getNetworkCidr() != null) { response.setNetmask(NetUtils.cidr2Netmask(network.getNetworkCidr())); } @@ -2269,44 +2047,45 @@ public class ApiResponseHelper implements ResponseGenerator { response.setIp6Gateway(network.getIp6Gateway()); response.setIp6Cidr(network.getIp6Cidr()); - // create response for reserved IP ranges that can be used for non-cloudstack purposes - String reservation = null; + // create response for reserved IP ranges that can be used for + // non-cloudstack purposes + String reservation = null; if ((network.getCidr() != null) && (NetUtils.isNetworkAWithinNetworkB(network.getCidr(), network.getNetworkCidr()))) { - String[] guestVmCidrPair = network.getCidr().split("\\/"); - String[] guestCidrPair = network.getNetworkCidr().split("\\/"); + String[] guestVmCidrPair = network.getCidr().split("\\/"); + String[] guestCidrPair = network.getNetworkCidr().split("\\/"); - Long guestVmCidrSize = Long.valueOf(guestVmCidrPair[1]); - Long guestCidrSize = Long.valueOf(guestCidrPair[1]); + Long guestVmCidrSize = Long.valueOf(guestVmCidrPair[1]); + Long guestCidrSize = Long.valueOf(guestCidrPair[1]); - String[] guestVmIpRange = NetUtils.getIpRangeFromCidr(guestVmCidrPair[0], guestVmCidrSize); - String[] guestIpRange = NetUtils.getIpRangeFromCidr(guestCidrPair[0], guestCidrSize); - long startGuestIp = NetUtils.ip2Long(guestIpRange[0]); - long endGuestIp = NetUtils.ip2Long(guestIpRange[1]); - long startVmIp = NetUtils.ip2Long(guestVmIpRange[0]); - long endVmIp = NetUtils.ip2Long(guestVmIpRange[1]); + String[] guestVmIpRange = NetUtils.getIpRangeFromCidr(guestVmCidrPair[0], guestVmCidrSize); + String[] guestIpRange = NetUtils.getIpRangeFromCidr(guestCidrPair[0], guestCidrSize); + long startGuestIp = NetUtils.ip2Long(guestIpRange[0]); + long endGuestIp = NetUtils.ip2Long(guestIpRange[1]); + long startVmIp = NetUtils.ip2Long(guestVmIpRange[0]); + long endVmIp = NetUtils.ip2Long(guestVmIpRange[1]); - if (startVmIp == startGuestIp && endVmIp < endGuestIp -1) { - reservation = (NetUtils.long2Ip(endVmIp + 1) + "-" + NetUtils.long2Ip(endGuestIp)); - } - if (endVmIp == endGuestIp && startVmIp > startGuestIp + 1) { - reservation = (NetUtils.long2Ip(startGuestIp) + "-" + NetUtils.long2Ip(startVmIp-1)); - } - if(startVmIp > startGuestIp + 1 && endVmIp < endGuestIp - 1) { - reservation = (NetUtils.long2Ip(startGuestIp) + "-" + NetUtils.long2Ip(startVmIp-1) + " , " + - NetUtils.long2Ip(endVmIp + 1) + "-"+ NetUtils.long2Ip(endGuestIp)); + if (startVmIp == startGuestIp && endVmIp < endGuestIp - 1) { + reservation = (NetUtils.long2Ip(endVmIp + 1) + "-" + NetUtils.long2Ip(endGuestIp)); + } + if (endVmIp == endGuestIp && startVmIp > startGuestIp + 1) { + reservation = (NetUtils.long2Ip(startGuestIp) + "-" + NetUtils.long2Ip(startVmIp - 1)); + } + if (startVmIp > startGuestIp + 1 && endVmIp < endGuestIp - 1) { + reservation = (NetUtils.long2Ip(startGuestIp) + "-" + NetUtils.long2Ip(startVmIp - 1) + " , " + NetUtils.long2Ip(endVmIp + 1) + "-" + NetUtils + .long2Ip(endGuestIp)); } } response.setReservedIpRange(reservation); - //return vlan information only to Root admin + // return vlan information only to Root admin if (network.getBroadcastUri() != null && UserContext.current().getCaller().getType() == Account.ACCOUNT_TYPE_ADMIN) { String broadcastUri = network.getBroadcastUri().toString(); response.setBroadcastUri(broadcastUri); - String vlan="N/A"; + String vlan = "N/A"; if (broadcastUri.startsWith("vlan")) { vlan = broadcastUri.substring("vlan://".length(), broadcastUri.length()); } - //return vlan information only to Root admin + // return vlan information only to Root admin response.setVlan(vlan); } @@ -2410,7 +2189,7 @@ public class ApiResponseHelper implements ResponseGenerator { } response.setCanUseForDeploy(ApiDBUtils.canUseForDeploy(network)); - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Network, network.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -2441,9 +2220,6 @@ public class ApiResponseHelper implements ResponseGenerator { return listPrjs.get(0); } - - - @Override public FirewallResponse createFirewallResponse(FirewallRule fwRule) { FirewallResponse response = new FirewallResponse(); @@ -2479,7 +2255,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setIcmpCode(fwRule.getIcmpCode()); response.setIcmpType(fwRule.getIcmpType()); - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.FirewallRule, fwRule.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -2523,7 +2299,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setState(stateToSet); - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.NetworkACL, networkACL.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -2547,7 +2323,8 @@ public class ApiResponseHelper implements ResponseGenerator { return hpvCapabilitiesResponse; } - // TODO: we may need to refactor once ControlledEntityResponse and ControlledEntity id to uuid conversion are all done. + // TODO: we may need to refactor once ControlledEntityResponse and + // ControlledEntity id to uuid conversion are all done. // currently code is scattered in private void populateOwner(ControlledEntityResponse response, ControlledEntity object) { Account account = ApiDBUtils.findAccountByIdIncludingRemoved(object.getAccountId()); @@ -2606,16 +2383,12 @@ public class ApiResponseHelper implements ResponseGenerator { return listProjs.get(0); } - - - @Override public ProjectInvitationResponse createProjectInvitationResponse(ProjectInvitation invite) { ProjectInvitationJoinVO vInvite = ApiDBUtils.newProjectInvitationView(invite); return ApiDBUtils.newProjectInvitationResponse(vInvite); } - @Override public SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine vm) { SystemVmInstanceResponse vmResponse = new SystemVmInstanceResponse(); @@ -2685,9 +2458,8 @@ public class ApiResponseHelper implements ResponseGenerator { CapabilityResponse capabilityResponse = new CapabilityResponse(); capabilityResponse.setName(cap.getName()); capabilityResponse.setObjectName("capability"); - if (cap.getName().equals(Capability.SupportedLBIsolation.getName()) || - cap.getName().equals(Capability.SupportedSourceNatTypes.getName()) || - cap.getName().equals(Capability.RedundantRouter.getName())) { + if (cap.getName().equals(Capability.SupportedLBIsolation.getName()) || cap.getName().equals(Capability.SupportedSourceNatTypes.getName()) + || cap.getName().equals(Capability.RedundantRouter.getName())) { capabilityResponse.setCanChoose(true); } else { capabilityResponse.setCanChoose(false); @@ -2700,7 +2472,8 @@ public class ApiResponseHelper implements ResponseGenerator { List serviceProviders = ApiDBUtils.getProvidersForService(service); List serviceProvidersResponses = new ArrayList(); for (Network.Provider serviceProvider : serviceProviders) { - // return only Virtual Router/JuniperSRX as a provider for the firewall + // return only Virtual Router/JuniperSRX as a provider for the + // firewall if (service == Service.Firewall && !(serviceProvider == Provider.VirtualRouter || serviceProvider == Provider.JuniperSRX)) { continue; } @@ -2784,8 +2557,7 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public LBStickinessResponse createLBStickinessPolicyResponse( - StickinessPolicy stickinessPolicy, LoadBalancer lb) { + public LBStickinessResponse createLBStickinessPolicyResponse(StickinessPolicy stickinessPolicy, LoadBalancer lb) { LBStickinessResponse spResponse = new LBStickinessResponse(); spResponse.setlbRuleId(lb.getUuid()); @@ -2800,8 +2572,7 @@ public class ApiResponseHelper implements ResponseGenerator { } List responses = new ArrayList(); - LBStickinessPolicyResponse ruleResponse = new LBStickinessPolicyResponse( - stickinessPolicy); + LBStickinessPolicyResponse ruleResponse = new LBStickinessPolicyResponse(stickinessPolicy); responses.add(ruleResponse); spResponse.setRules(responses); @@ -2811,8 +2582,7 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public LBStickinessResponse createLBStickinessPolicyResponse( - List stickinessPolicies, LoadBalancer lb) { + public LBStickinessResponse createLBStickinessPolicyResponse(List stickinessPolicies, LoadBalancer lb) { LBStickinessResponse spResponse = new LBStickinessResponse(); if (lb == null) @@ -2840,8 +2610,7 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public LBHealthCheckResponse createLBHealthCheckPolicyResponse( - List healthcheckPolicies, LoadBalancer lb) { + public LBHealthCheckResponse createLBHealthCheckPolicyResponse(List healthcheckPolicies, LoadBalancer lb) { LBHealthCheckResponse hcResponse = new LBHealthCheckResponse(); if (lb == null) @@ -2892,9 +2661,8 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public LDAPConfigResponse createLDAPConfigResponse(String hostname, - Integer port, Boolean useSSL, String queryFilter, - String searchBase, String bindDN) { + public LDAPConfigResponse createLDAPConfigResponse(String hostname, Integer port, Boolean useSSL, String queryFilter, String searchBase, + String bindDN) { LDAPConfigResponse lr = new LDAPConfigResponse(); lr.setHostname(hostname); lr.setPort(port.toString()); @@ -2922,15 +2690,15 @@ public class ApiResponseHelper implements ResponseGenerator { return response; } - @Override - public RegionResponse createRegionResponse(Region region) { - RegionResponse response = new RegionResponse(); - response.setId(region.getId()); - response.setName(region.getName()); - response.setEndPoint(region.getEndPoint()); - response.setObjectName("region"); - return response; - } + @Override + public RegionResponse createRegionResponse(Region region) { + RegionResponse response = new RegionResponse(); + response.setId(region.getId()); + response.setName(region.getName()); + response.setEndPoint(region.getEndPoint()); + response.setObjectName("region"); + return response; + } @Override public ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly) { @@ -2938,8 +2706,6 @@ public class ApiResponseHelper implements ResponseGenerator { return ApiDBUtils.newResourceTagResponse(rto, keyValueOnly); } - - @Override public VpcOfferingResponse createVpcOfferingResponse(VpcOffering offering) { VpcOfferingResponse response = new VpcOfferingResponse(); @@ -2975,7 +2741,6 @@ public class ApiResponseHelper implements ResponseGenerator { return response; } - @Override public VpcResponse createVpcResponse(Vpc vpc) { VpcResponse response = new VpcResponse(); @@ -3030,7 +2795,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setServices(serviceResponses); populateOwner(response, vpc); - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Vpc, vpc.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -3071,7 +2836,6 @@ public class ApiResponseHelper implements ResponseGenerator { response.setObjectName("privategateway"); - return response; } @@ -3216,7 +2980,7 @@ public class ApiResponseHelper implements ResponseGenerator { populateAccount(response, result.getAccountId()); populateDomain(response, result.getDomainId()); - //set tag information + // set tag information List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.StaticRoute, result.getId()); List tagResponses = new ArrayList(); for (ResourceTag tag : tags) { @@ -3275,7 +3039,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setId(result.getUuid()); Long vpnGatewayId = result.getVpnGatewayId(); - if(vpnGatewayId != null) { + if (vpnGatewayId != null) { Site2SiteVpnGateway vpnGateway = ApiDBUtils.findVpnGatewayById(vpnGatewayId); if (vpnGateway != null) { response.setVpnGatewayId(vpnGateway.getUuid()); @@ -3286,7 +3050,7 @@ public class ApiResponseHelper implements ResponseGenerator { } Long customerGatewayId = result.getCustomerGatewayId(); - if(customerGatewayId != null) { + if (customerGatewayId != null) { Site2SiteCustomerGateway customerGateway = ApiDBUtils.findCustomerGatewayById(customerGatewayId); if (customerGateway != null) { response.setCustomerGatewayId(customerGateway.getUuid()); @@ -3310,13 +3074,14 @@ public class ApiResponseHelper implements ResponseGenerator { response.setObjectName("vpnconnection"); return response; } + @Override public GuestOSResponse createGuestOSResponse(GuestOS guestOS) { GuestOSResponse response = new GuestOSResponse(); response.setDescription(guestOS.getDisplayName()); response.setId(guestOS.getUuid()); GuestOSCategoryVO category = ApiDBUtils.findGuestOsCategoryById(guestOS.getCategoryId()); - if ( category != null ){ + if (category != null) { response.setOsCategoryId(category.getUuid()); } @@ -3324,8 +3089,6 @@ public class ApiResponseHelper implements ResponseGenerator { return response; } - - @Override public SnapshotScheduleResponse createSnapshotScheduleResponse(SnapshotSchedule snapshotSchedule) { SnapshotScheduleResponse response = new SnapshotScheduleResponse(); @@ -3348,172 +3111,171 @@ public class ApiResponseHelper implements ResponseGenerator { return response; } + @Override + public UsageRecordResponse createUsageResponse(Usage usageRecord) { + UsageRecordResponse usageRecResponse = new UsageRecordResponse(); - @Override - public UsageRecordResponse createUsageResponse(Usage usageRecord) { - UsageRecordResponse usageRecResponse = new UsageRecordResponse(); + Account account = ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId()); + if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { + // find the project + Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId()); + usageRecResponse.setProjectId(project.getUuid()); + usageRecResponse.setProjectName(project.getName()); + } else { + usageRecResponse.setAccountId(account.getUuid()); + usageRecResponse.setAccountName(account.getAccountName()); + } - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId()); - if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { - //find the project - Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId()); - usageRecResponse.setProjectId(project.getUuid()); - usageRecResponse.setProjectName(project.getName()); - } else { - usageRecResponse.setAccountId(account.getUuid()); - usageRecResponse.setAccountName(account.getAccountName()); - } + Domain domain = ApiDBUtils.findDomainById(usageRecord.getDomainId()); + if (domain != null) { + usageRecResponse.setDomainId(domain.getUuid()); + } - Domain domain = ApiDBUtils.findDomainById(usageRecord.getDomainId()); - if (domain != null) { - usageRecResponse.setDomainId(domain.getUuid()); - } + if (usageRecord.getZoneId() != null) { + DataCenter zone = ApiDBUtils.findZoneById(usageRecord.getZoneId()); + if (zone != null) { + usageRecResponse.setZoneId(zone.getUuid()); + } + } + usageRecResponse.setDescription(usageRecord.getDescription()); + usageRecResponse.setUsage(usageRecord.getUsageDisplay()); + usageRecResponse.setUsageType(usageRecord.getUsageType()); + if (usageRecord.getVmInstanceId() != null) { + VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId()); + usageRecResponse.setVirtualMachineId(vm.getUuid()); + } + usageRecResponse.setVmName(usageRecord.getVmName()); + if (usageRecord.getTemplateId() != null) { + VMTemplateVO template = ApiDBUtils.findTemplateById(usageRecord.getTemplateId()); + if (template != null) { + usageRecResponse.setTemplateId(template.getUuid()); + } + } - if (usageRecord.getZoneId() != null) { - DataCenter zone = ApiDBUtils.findZoneById(usageRecord.getZoneId()); - if (zone != null) { - usageRecResponse.setZoneId(zone.getUuid()); - } - } - usageRecResponse.setDescription(usageRecord.getDescription()); - usageRecResponse.setUsage(usageRecord.getUsageDisplay()); - usageRecResponse.setUsageType(usageRecord.getUsageType()); - if (usageRecord.getVmInstanceId() != null) { - VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId()); - usageRecResponse.setVirtualMachineId(vm.getUuid()); - } - usageRecResponse.setVmName(usageRecord.getVmName()); - if (usageRecord.getTemplateId() != null) { - VMTemplateVO template = ApiDBUtils.findTemplateById(usageRecord.getTemplateId()); - if (template != null) { - usageRecResponse.setTemplateId(template.getUuid()); - } - } + if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) { + ServiceOfferingVO svcOffering = _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class, usageRecord.getOfferingId().toString()); + // Service Offering Id + usageRecResponse.setOfferingId(svcOffering.getUuid()); + // VM Instance ID + VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(vm.getUuid()); + // Hypervisor Type + usageRecResponse.setType(usageRecord.getType()); - if(usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM){ - ServiceOfferingVO svcOffering = _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class, usageRecord.getOfferingId().toString()); - //Service Offering Id - usageRecResponse.setOfferingId(svcOffering.getUuid()); - //VM Instance ID - VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(vm.getUuid()); - //Hypervisor Type - usageRecResponse.setType(usageRecord.getType()); + } else if (usageRecord.getUsageType() == UsageTypes.IP_ADDRESS) { + // isSourceNAT + usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat")) ? true : false); + // isSystem + usageRecResponse.setSystem((usageRecord.getSize() == 1) ? true : false); + // IP Address ID + IPAddressVO ip = _entityMgr.findByIdIncludingRemoved(IPAddressVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(ip.getUuid()); - } else if(usageRecord.getUsageType() == UsageTypes.IP_ADDRESS){ - //isSourceNAT - usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat"))?true:false); - //isSystem - usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false); - //IP Address ID - IPAddressVO ip = _entityMgr.findByIdIncludingRemoved(IPAddressVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(ip.getUuid()); + } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED) { + // Device Type + usageRecResponse.setType(usageRecord.getType()); + if (usageRecord.getType().equals("DomainRouter")) { + // Domain Router Id + VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(vm.getUuid()); + } else { + // External Device Host Id + HostVO host = _entityMgr.findByIdIncludingRemoved(HostVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(host.getUuid()); + } + // Network ID + NetworkVO network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString()); + usageRecResponse.setNetworkId(network.getUuid()); - } else if(usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED){ - //Device Type - usageRecResponse.setType(usageRecord.getType()); - if(usageRecord.getType().equals("DomainRouter")){ - //Domain Router Id - VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(vm.getUuid()); - } else { - //External Device Host Id - HostVO host = _entityMgr.findByIdIncludingRemoved(HostVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(host.getUuid()); - } - //Network ID - NetworkVO network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString()); - usageRecResponse.setNetworkId(network.getUuid()); + } else if (usageRecord.getUsageType() == UsageTypes.VOLUME) { + // Volume ID + VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(volume.getUuid()); + // Volume Size + usageRecResponse.setSize(usageRecord.getSize()); + // Disk Offering Id + if (usageRecord.getOfferingId() != null) { + DiskOfferingVO diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId().toString()); + usageRecResponse.setOfferingId(diskOff.getUuid()); + } - } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){ - //Volume ID - VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(volume.getUuid()); - //Volume Size - usageRecResponse.setSize(usageRecord.getSize()); - //Disk Offering Id - if(usageRecord.getOfferingId() != null){ - DiskOfferingVO diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId().toString()); - usageRecResponse.setOfferingId(diskOff.getUuid()); - } + } else if (usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO) { + // Template/ISO ID + VMTemplateVO tmpl = _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(tmpl.getUuid()); + // Template/ISO Size + usageRecResponse.setSize(usageRecord.getSize()); - } else if(usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO){ - //Template/ISO ID - VMTemplateVO tmpl = _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(tmpl.getUuid()); - //Template/ISO Size - usageRecResponse.setSize(usageRecord.getSize()); + } else if (usageRecord.getUsageType() == UsageTypes.SNAPSHOT) { + // Snapshot ID + SnapshotVO snap = _entityMgr.findByIdIncludingRemoved(SnapshotVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(snap.getUuid()); + // Snapshot Size + usageRecResponse.setSize(usageRecord.getSize()); - } else if(usageRecord.getUsageType() == UsageTypes.SNAPSHOT){ - //Snapshot ID - SnapshotVO snap = _entityMgr.findByIdIncludingRemoved(SnapshotVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(snap.getUuid()); - //Snapshot Size - usageRecResponse.setSize(usageRecord.getSize()); + } else if (usageRecord.getUsageType() == UsageTypes.LOAD_BALANCER_POLICY) { + // Load Balancer Policy ID + usageRecResponse.setUsageId(usageRecord.getUsageId().toString()); - } else if(usageRecord.getUsageType() == UsageTypes.LOAD_BALANCER_POLICY){ - //Load Balancer Policy ID - usageRecResponse.setUsageId(usageRecord.getUsageId().toString()); + } else if (usageRecord.getUsageType() == UsageTypes.PORT_FORWARDING_RULE) { + // Port Forwarding Rule ID + usageRecResponse.setUsageId(usageRecord.getUsageId().toString()); - } else if(usageRecord.getUsageType() == UsageTypes.PORT_FORWARDING_RULE){ - //Port Forwarding Rule ID - usageRecResponse.setUsageId(usageRecord.getUsageId().toString()); + } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_OFFERING) { + // Network Offering Id + NetworkOfferingVO netOff = _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class, usageRecord.getOfferingId().toString()); + usageRecResponse.setOfferingId(netOff.getUuid()); + // is Default + usageRecResponse.setDefault((usageRecord.getUsageId() == 1) ? true : false); - } else if(usageRecord.getUsageType() == UsageTypes.NETWORK_OFFERING){ - //Network Offering Id - NetworkOfferingVO netOff = _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class, usageRecord.getOfferingId().toString()); - usageRecResponse.setOfferingId(netOff.getUuid()); - //is Default - usageRecResponse.setDefault((usageRecord.getUsageId() == 1)? true:false); + } else if (usageRecord.getUsageType() == UsageTypes.VPN_USERS) { + // VPN User ID + usageRecResponse.setUsageId(usageRecord.getUsageId().toString()); - } else if(usageRecord.getUsageType() == UsageTypes.VPN_USERS){ - //VPN User ID - usageRecResponse.setUsageId(usageRecord.getUsageId().toString()); + } else if (usageRecord.getUsageType() == UsageTypes.SECURITY_GROUP) { + // Security Group Id + SecurityGroupVO sg = _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(sg.getUuid()); + } - } else if(usageRecord.getUsageType() == UsageTypes.SECURITY_GROUP){ - //Security Group Id - SecurityGroupVO sg = _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(sg.getUuid()); - } + if (usageRecord.getRawUsage() != null) { + DecimalFormat decimalFormat = new DecimalFormat("###########.######"); + usageRecResponse.setRawUsage(decimalFormat.format(usageRecord.getRawUsage())); + } - if (usageRecord.getRawUsage() != null) { - DecimalFormat decimalFormat = new DecimalFormat("###########.######"); - usageRecResponse.setRawUsage(decimalFormat.format(usageRecord.getRawUsage())); - } - - if (usageRecord.getStartDate() != null) { - usageRecResponse.setStartDate(getDateStringInternal(usageRecord.getStartDate())); - } - if (usageRecord.getEndDate() != null) { - usageRecResponse.setEndDate(getDateStringInternal(usageRecord.getEndDate())); - } - - return usageRecResponse; - } + if (usageRecord.getStartDate() != null) { + usageRecResponse.setStartDate(getDateStringInternal(usageRecord.getStartDate())); + } + if (usageRecord.getEndDate() != null) { + usageRecResponse.setEndDate(getDateStringInternal(usageRecord.getEndDate())); + } + return usageRecResponse; + } public String getDateStringInternal(Date inputDate) { - if (inputDate == null) return null; + if (inputDate == null) + return null; TimeZone tz = _usageSvc.getUsageTimezone(); Calendar cal = Calendar.getInstance(tz); cal.setTime(inputDate); StringBuffer sb = new StringBuffer(); - sb.append(cal.get(Calendar.YEAR)+"-"); + sb.append(cal.get(Calendar.YEAR) + "-"); int month = cal.get(Calendar.MONTH) + 1; if (month < 10) { sb.append("0" + month + "-"); } else { - sb.append(month+"-"); + sb.append(month + "-"); } int day = cal.get(Calendar.DAY_OF_MONTH); if (day < 10) { sb.append("0" + day); } else { - sb.append(""+day); + sb.append("" + day); } sb.append("'T'"); @@ -3522,38 +3284,40 @@ public class ApiResponseHelper implements ResponseGenerator { if (hour < 10) { sb.append("0" + hour + ":"); } else { - sb.append(hour+":"); + sb.append(hour + ":"); } int minute = cal.get(Calendar.MINUTE); if (minute < 10) { sb.append("0" + minute + ":"); } else { - sb.append(minute+":"); + sb.append(minute + ":"); } int seconds = cal.get(Calendar.SECOND); if (seconds < 10) { sb.append("0" + seconds); } else { - sb.append(""+seconds); + sb.append("" + seconds); } double offset = cal.get(Calendar.ZONE_OFFSET); if (tz.inDaylightTime(inputDate)) { - offset += (1.0*tz.getDSTSavings()); // add the timezone's DST value (typically 1 hour expressed in milliseconds) + offset += (1.0 * tz.getDSTSavings()); // add the timezone's DST + // value (typically 1 hour + // expressed in milliseconds) } - offset = offset / (1000d*60d*60d); - int hourOffset = (int)offset; + offset = offset / (1000d * 60d * 60d); + int hourOffset = (int) offset; double decimalVal = Math.abs(offset) - Math.abs(hourOffset); - int minuteOffset = (int)(decimalVal * 60); + int minuteOffset = (int) (decimalVal * 60); if (hourOffset < 0) { if (hourOffset > -10) { - sb.append("-0"+Math.abs(hourOffset)); + sb.append("-0" + Math.abs(hourOffset)); } else { - sb.append("-"+Math.abs(hourOffset)); + sb.append("-" + Math.abs(hourOffset)); } } else { if (hourOffset < 10) { @@ -3607,7 +3371,7 @@ public class ApiResponseHelper implements ResponseGenerator { List secondaryIps = ApiDBUtils.findNicSecondaryIps(result.getId()); if (secondaryIps != null) { List ipList = new ArrayList(); - for (NicSecondaryIpVO ip: secondaryIps) { + for (NicSecondaryIpVO ip : secondaryIps) { NicSecondaryIpResponse ipRes = new NicSecondaryIpResponse(); ipRes.setId(ip.getUuid()); ipRes.setIpAddr(ip.getIp4Address()); diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index 4b4c86e2f4e..71a0f29d45c 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -16,9 +16,13 @@ // under the License. package com.cloud.api.query; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -27,6 +31,7 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.command.admin.host.ListHostsCmd; import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; import org.apache.cloudstack.api.command.admin.storage.ListImageStoresCmd; @@ -35,6 +40,7 @@ import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; import org.apache.cloudstack.api.command.user.account.ListAccountsCmd; import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd; import org.apache.cloudstack.api.command.user.event.ListEventsCmd; +import org.apache.cloudstack.api.command.user.iso.ListIsosCmd; import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd; import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd; import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd; @@ -42,6 +48,7 @@ import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd; import org.apache.cloudstack.api.command.user.project.ListProjectsCmd; import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd; import org.apache.cloudstack.api.command.user.tag.ListTagsCmd; +import org.apache.cloudstack.api.command.user.template.ListTemplatesCmd; import org.apache.cloudstack.api.command.user.vm.ListVMsCmd; import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd; import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd; @@ -62,6 +69,7 @@ import org.apache.cloudstack.api.response.ResourceTagResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; +import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; @@ -85,6 +93,7 @@ import com.cloud.api.query.dao.ResourceTagJoinDao; import com.cloud.api.query.dao.SecurityGroupJoinDao; import com.cloud.api.query.dao.ServiceOfferingJoinDao; import com.cloud.api.query.dao.StoragePoolJoinDao; +import com.cloud.api.query.dao.TemplateJoinDao; import com.cloud.api.query.dao.UserAccountJoinDao; import com.cloud.api.query.dao.UserVmJoinDao; import com.cloud.api.query.dao.VolumeJoinDao; @@ -104,6 +113,7 @@ import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.api.query.vo.ServiceOfferingJoinVO; import com.cloud.api.query.vo.StoragePoolJoinVO; +import com.cloud.api.query.vo.TemplateJoinVO; import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.api.query.vo.VolumeJoinVO; @@ -127,12 +137,20 @@ import com.cloud.projects.Project; import com.cloud.projects.ProjectManager; import com.cloud.projects.dao.ProjectAccountDao; import com.cloud.projects.dao.ProjectDao; +import com.cloud.resource.ResourceManager; import com.cloud.server.Criteria; +import com.cloud.server.ResourceTag.TaggedResourceType; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.ImageStore; import com.cloud.storage.ScopeType; +import com.cloud.storage.Storage; +import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; @@ -146,6 +164,7 @@ import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.Filter; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.vm.DomainRouterVO; @@ -255,6 +274,15 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { @Inject private HighAvailabilityManager _haMgr; + @Inject + private VMTemplateDao _templateDao; + + @Inject + private TemplateJoinDao _templateJoinDao; + + @Inject + ResourceManager _resourceMgr; + /* (non-Javadoc) * @see com.cloud.api.query.QueryService#searchForUsers(org.apache.cloudstack.api.command.admin.user.ListUsersCmd) */ @@ -2419,5 +2447,298 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { return false; } + @Override + public ListResponse listTemplates(ListTemplatesCmd cmd) { + Pair, Integer> result = searchForTemplatesInternal(cmd); + ListResponse response = new ListResponse(); + + List templateResponses = ViewResponseHelper.createTemplateResponse(result.first().toArray(new TemplateJoinVO[result.first().size()])); + response.setResponses(templateResponses, result.second()); + return response; + } + + private Pair, Integer> searchForTemplatesInternal(ListTemplatesCmd cmd) { + TemplateFilter templateFilter = TemplateFilter.valueOf(cmd.getTemplateFilter()); + Long id = cmd.getId(); + Map tags = cmd.getTags(); + Account caller = UserContext.current().getCaller(); + + boolean listAll = false; + if (templateFilter != null && templateFilter == TemplateFilter.all) { + if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { + throw new InvalidParameterValueException("Filter " + TemplateFilter.all + " can be specified by admin only"); + } + listAll = true; + } + + List permittedAccountIds = new ArrayList(); + Ternary domainIdRecursiveListProject = new Ternary( + cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, + listAll, false); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + List permittedAccounts = new ArrayList(); + for (Long accountId : permittedAccountIds) { + permittedAccounts.add(_accountMgr.getAccount(accountId)); + } + + boolean showDomr = ((templateFilter != TemplateFilter.selfexecutable) && (templateFilter != TemplateFilter.featured)); + HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor()); + + return searchForTemplatesInternal(id, cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, cmd.getPageSizeVal(), cmd.getStartIndex(), + cmd.getZoneId(), hypervisorType, showDomr, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria, tags); + } + + private Pair, Integer> searchForTemplatesInternal(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, + Boolean bootable, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean showDomr, boolean onlyReady, + List permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags) { + VMTemplateVO template = null; + + // verify templateId parameter + if (templateId != null) { + template = _templateDao.findById(templateId); + if (template == null) { + throw new InvalidParameterValueException("Please specify a valid template ID."); + }// If ISO requested then it should be ISO. + if (isIso && template.getFormat() != ImageFormat.ISO) { + s_logger.error("Template Id " + templateId + " is not an ISO"); + InvalidParameterValueException ex = new InvalidParameterValueException("Specified Template Id is not an ISO"); + ex.addProxyObject(template, templateId, "templateId"); + throw ex; + }// If ISO not requested then it shouldn't be an ISO. + if (!isIso && template.getFormat() == ImageFormat.ISO) { + s_logger.error("Incorrect format of the template id " + templateId); + InvalidParameterValueException ex = new InvalidParameterValueException("Incorrect format " + template.getFormat() + + " of the specified template id"); + ex.addProxyObject(template, templateId, "templateId"); + throw ex; + } + + // if template is not public, perform permission check here + if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { + Account owner = _accountMgr.getAccount(template.getAccountId()); + _accountMgr.checkAccess(caller, null, true, owner); + } + } + + DomainVO domain = null; + if (!permittedAccounts.isEmpty()) { + domain = _domainDao.findById(permittedAccounts.get(0).getDomainId()); + } else { + domain = _domainDao.findById(DomainVO.ROOT_DOMAIN); + } + + List hypers = null; + if (!isIso) { + hypers = _resourceMgr.listAvailHypervisorInZone(null, null); + } + + Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm")); + isAscending = (isAscending == null ? true : isAscending); + Filter searchFilter = new Filter(TemplateJoinVO.class, "sort_key", isAscending, startIndex, pageSize); + SearchCriteria sc = _templateJoinDao.createSearchCriteria(); + + // add criteria for project or not + if (listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources) { + sc.addAnd("accountType", SearchCriteria.Op.NEQ, Account.ACCOUNT_TYPE_PROJECT); + } else if (listProjectResourcesCriteria == ListProjectResourcesCriteria.ListProjectResourcesOnly){ + sc.addAnd("accountType", SearchCriteria.Op.EQ, Account.ACCOUNT_TYPE_PROJECT); + } + + // add criteria for domain path in case of domain admin + if ((templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) && + (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN)) { + sc.addAnd("domainPath", SearchCriteria.Op.LIKE, domain.getPath() + "%"); + } + + List relatedDomainIds = new ArrayList(); + List permittedAccountIds = new ArrayList(); + if (!permittedAccounts.isEmpty()) { + for (Account account : permittedAccounts) { + permittedAccountIds.add(account.getId()); + DomainVO accountDomain = _domainDao.findById(account.getDomainId()); + + // get all parent domain ID's all the way till root domain + DomainVO domainTreeNode = accountDomain; + relatedDomainIds.add(domainTreeNode.getId()); + while (domainTreeNode.getParent() != null ){ + domainTreeNode = _domainDao.findById(domainTreeNode.getParent()); + relatedDomainIds.add(domainTreeNode.getId()); + } + + // get all child domain ID's + if (_accountMgr.isAdmin(account.getType()) ) { + List allChildDomains = _domainDao.findAllChildren(accountDomain.getPath(), accountDomain.getId()); + for (DomainVO childDomain : allChildDomains) { + relatedDomainIds.add(childDomain.getId()); + } + } + } + } + + // add hypervisor criteria + if ( !hypers.isEmpty()){ + String[] relatedHypers = new String[hypers.size()]; + for (int i = 0; i < hypers.size(); i++){ + relatedHypers[i] = hypers.get(i).toString(); + } + sc.addAnd("hypervisorType", SearchCriteria.Op.IN, relatedHypers); + } + + // control different template filters + if (templateFilter == TemplateFilter.featured || templateFilter == TemplateFilter.community) { + sc.addAnd("publicTemplate", SearchCriteria.Op.EQ, true); + if ( templateFilter == TemplateFilter.featured){ + sc.addAnd("featured", SearchCriteria.Op.EQ, true); + } + else{ + sc.addAnd("featured", SearchCriteria.Op.EQ, false); + } + if (!permittedAccounts.isEmpty()) { + SearchCriteria scc = _templateJoinDao.createSearchCriteria(); + scc.addOr("domainId", SearchCriteria.Op.IN, relatedDomainIds.toArray()); + scc.addOr("domainId", SearchCriteria.Op.NULL); + sc.addAnd("domainId", SearchCriteria.Op.SC, scc); + + if (!_accountMgr.isAdmin(caller.getType())){ + // for non-root users, we should only show featured and community templates that they can see + sc.addAnd("accountId", SearchCriteria.Op.IN, permittedAccountIds.toArray()); + } + } + } else if (templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable ) { + if ( !permittedAccounts.isEmpty()){ + sc.addAnd("accountId", SearchCriteria.Op.IN, permittedAccountIds.toArray()); + } + } else if (templateFilter == TemplateFilter.sharedexecutable || templateFilter == TemplateFilter.shared ) { + SearchCriteria scc = _templateJoinDao.createSearchCriteria(); + scc.addOr("accountId", SearchCriteria.Op.IN, permittedAccountIds.toArray()); + scc.addOr("sharedAccountId", SearchCriteria.Op.IN, permittedAccountIds.toArray()); + sc.addAnd("accountId", SearchCriteria.Op.SC, scc); + } else if (templateFilter == TemplateFilter.executable ) { + SearchCriteria scc = _templateJoinDao.createSearchCriteria(); + scc.addOr("publicTemplate", SearchCriteria.Op.EQ, true); + if ( !permittedAccounts.isEmpty()){ + scc.addOr("accountId", SearchCriteria.Op.IN, permittedAccountIds.toArray()); + } + sc.addAnd("publicTemplate", SearchCriteria.Op.SC, scc); + } + + // add tags criteria + if (tags != null && !tags.isEmpty()) { + SearchCriteria scc = _templateJoinDao.createSearchCriteria(); + int count = 0; + for (String key : tags.keySet()) { + SearchCriteria scTag = _templateJoinDao.createSearchCriteria(); + scTag.addAnd("tagKey", SearchCriteria.Op.EQ, key); + scTag.addAnd("tagValue", SearchCriteria.Op.EQ, tags.get(key)); + if ( isIso){ + scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, TaggedResourceType.ISO); + } else { + scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, TaggedResourceType.Template); + } + scc.addOr("tagKey", SearchCriteria.Op.SC, scTag); + count++; + } + sc.addAnd("tagKey", SearchCriteria.Op.SC, scc); + } + + // other criteria + if (keyword != null) { + sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + } else if (name != null) { + sc.addAnd("name", SearchCriteria.Op.EQ, name); + } + + if (isIso) { + sc.addAnd("format", SearchCriteria.Op.EQ, "ISO"); + + } else { + sc.addAnd("format", SearchCriteria.Op.NEQ, "ISO"); + } + + if (!hyperType.equals(HypervisorType.None)) { + sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, hyperType); + } + + if (bootable != null) { + sc.addAnd("bootable", SearchCriteria.Op.EQ, bootable); + } + + if (onlyReady){ + sc.addAnd("downlaadState", SearchCriteria.Op.EQ, Status.DOWNLOADED); + sc.addAnd("destroyed", SearchCriteria.Op.EQ, false); + } + + if (zoneId != null){ + sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); + } + + if (!showDomr){ + // excluding system template + sc.addAnd("type", SearchCriteria.Op.NEQ, Storage.TemplateType.SYSTEM); + } + + // search unique templates and find details by Ids + Pair, Integer> uniqueTmplPair = _templateJoinDao.searchAndCount(sc, searchFilter); + Integer count = uniqueTmplPair.second(); + if (count.intValue() == 0) { + // empty result + return uniqueTmplPair; + } + List uniqueTmpls = uniqueTmplPair.first(); + Long[] vrIds = new Long[uniqueTmpls.size()]; + int i = 0; + for (TemplateJoinVO v : uniqueTmpls) { + vrIds[i++] = v.getId(); + } + List vrs = _templateJoinDao.searchByIds(vrIds); + return new Pair, Integer>(vrs, count); + + //TODO: revisit the special logic for iso search in VMTemplateDaoImpl.searchForTemplates and understand why we need to + //specially handle ISO. The original logic is very twisted and no idea about what the code was doing. + + } + + @Override + public ListResponse listIsos(ListIsosCmd cmd) { + Pair, Integer> result = searchForIsosInternal(cmd); + ListResponse response = new ListResponse(); + + List templateResponses = ViewResponseHelper.createIsoResponse(result.first().toArray(new TemplateJoinVO[result.first().size()])); + response.setResponses(templateResponses, result.second()); + return response; + } + + private Pair, Integer> searchForIsosInternal(ListIsosCmd cmd) { + TemplateFilter isoFilter = TemplateFilter.valueOf(cmd.getIsoFilter()); + Long id = cmd.getId(); + Map tags = cmd.getTags(); + Account caller = UserContext.current().getCaller(); + + boolean listAll = false; + if (isoFilter != null && isoFilter == TemplateFilter.all) { + if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { + throw new InvalidParameterValueException("Filter " + TemplateFilter.all + " can be specified by admin only"); + } + listAll = true; + } + + List permittedAccountIds = new ArrayList(); + Ternary domainIdRecursiveListProject = new Ternary( + cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, + listAll, false); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + List permittedAccounts = new ArrayList(); + for (Long accountId : permittedAccountIds) { + permittedAccounts.add(_accountMgr.getAccount(accountId)); + } + + HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor()); + + return searchForTemplatesInternal(cmd.getId(), cmd.getIsoName(), cmd.getKeyword(), isoFilter, true, cmd.isBootable(), cmd.getPageSizeVal(), + cmd.getStartIndex(), cmd.getZoneId(), hypervisorType, true, cmd.listInReadyState(), permittedAccounts, caller, + listProjectResourcesCriteria, tags); + } } diff --git a/server/src/com/cloud/api/query/ViewResponseHelper.java b/server/src/com/cloud/api/query/ViewResponseHelper.java index 5b3c9346d9b..8ac99d23a86 100644 --- a/server/src/com/cloud/api/query/ViewResponseHelper.java +++ b/server/src/com/cloud/api/query/ViewResponseHelper.java @@ -38,6 +38,7 @@ import org.apache.cloudstack.api.response.ResourceTagResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; +import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; @@ -61,6 +62,7 @@ import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.api.query.vo.ServiceOfferingJoinVO; import com.cloud.api.query.vo.StoragePoolJoinVO; +import com.cloud.api.query.vo.TemplateJoinVO; import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.api.query.vo.VolumeJoinVO; @@ -323,4 +325,55 @@ public class ViewResponseHelper { } return respList; } + + public static List createTemplateResponse(TemplateJoinVO... templates) { + Hashtable vrDataList = new Hashtable(); + for (TemplateJoinVO vr : templates) { + TemplateResponse vrData = vrDataList.get(vr.getId()); + if ( vrData == null ){ + // first time encountering this volume + vrData = ApiDBUtils.newTemplateResponse(vr); + } + else{ + // update tags + vrData = ApiDBUtils.fillTemplateDetails(vrData, vr); + } + vrDataList.put(vr.getId(), vrData); + } + return new ArrayList(vrDataList.values()); + } + + public static List createTemplateUpdateResponse(TemplateJoinVO... templates) { + Hashtable vrDataList = new Hashtable(); + for (TemplateJoinVO vr : templates) { + TemplateResponse vrData = vrDataList.get(vr.getId()); + if ( vrData == null ){ + // first time encountering this volume + vrData = ApiDBUtils.newTemplateUpdateResponse(vr); + } + else{ + // update tags + vrData = ApiDBUtils.fillTemplateDetails(vrData, vr); + } + vrDataList.put(vr.getId(), vrData); + } + return new ArrayList(vrDataList.values()); + } + + public static List createIsoResponse(TemplateJoinVO... templates) { + Hashtable vrDataList = new Hashtable(); + for (TemplateJoinVO vr : templates) { + TemplateResponse vrData = vrDataList.get(vr.getId()); + if ( vrData == null ){ + // first time encountering this volume + vrData = ApiDBUtils.newIsoResponse(vr); + } + else{ + // update tags + vrData = ApiDBUtils.fillTemplateDetails(vrData, vr); + } + vrDataList.put(vr.getId(), vrData); + } + return new ArrayList(vrDataList.values()); + } } diff --git a/server/src/com/cloud/api/query/dao/TemplateJoinDao.java b/server/src/com/cloud/api/query/dao/TemplateJoinDao.java new file mode 100644 index 00000000000..3897db54746 --- /dev/null +++ b/server/src/com/cloud/api/query/dao/TemplateJoinDao.java @@ -0,0 +1,42 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.api.query.dao; + +import java.util.List; + +import org.apache.cloudstack.api.response.TemplateResponse; +import com.cloud.api.query.vo.TemplateJoinVO; +import com.cloud.template.VirtualMachineTemplate; +import com.cloud.utils.db.GenericDao; + +public interface TemplateJoinDao extends GenericDao { + + TemplateResponse newTemplateResponse(TemplateJoinVO tmpl); + + TemplateResponse newIsoResponse(TemplateJoinVO tmpl); + + TemplateResponse newUpdateResponse(TemplateJoinVO tmpl); + + TemplateResponse setTemplateResponse(TemplateResponse tmplData, TemplateJoinVO tmpl); + + List newTemplateView(VirtualMachineTemplate tmpl); + + List newTemplateView(VirtualMachineTemplate tmpl, long zoneId, boolean readyOnly); + + List searchByIds(Long... ids); + + } diff --git a/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java new file mode 100644 index 00000000000..0e5001be098 --- /dev/null +++ b/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java @@ -0,0 +1,441 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.api.query.dao; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.ejb.Local; +import javax.inject.Inject; + +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.response.ResourceTagResponse; +import org.apache.cloudstack.api.response.TemplateResponse; +import org.apache.cloudstack.api.response.TemplateZoneResponse; +import org.apache.cloudstack.api.response.VolumeResponse; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import com.cloud.api.ApiDBUtils; +import com.cloud.api.ApiResponseHelper; +import com.cloud.api.query.vo.ResourceTagJoinVO; +import com.cloud.api.query.vo.TemplateJoinVO; +import com.cloud.api.query.vo.VolumeJoinVO; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.DataCenter; +import com.cloud.offering.ServiceOffering; +import com.cloud.server.ResourceTag; +import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.storage.GuestOS; +import com.cloud.storage.Storage; +import com.cloud.storage.VMTemplateHostVO; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.Storage.TemplateType; +import com.cloud.storage.VMTemplateStorageResourceAssoc; +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; +import com.cloud.storage.Volume; +import com.cloud.template.VirtualMachineTemplate; +import com.cloud.user.Account; +import com.cloud.user.UserContext; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; + + +@Component +@Local(value={TemplateJoinDao.class}) +public class TemplateJoinDaoImpl extends GenericDaoBase implements TemplateJoinDao { + + + + public static final Logger s_logger = Logger.getLogger(TemplateJoinDaoImpl.class); + + @Inject + private ConfigurationDao _configDao; + + private final SearchBuilder tmpltSearch; + + private final SearchBuilder tmpltIdSearch; + + private final SearchBuilder tmpltZoneSearch; + + + protected TemplateJoinDaoImpl() { + + tmpltSearch = createSearchBuilder(); + tmpltSearch.and("idIN", tmpltSearch.entity().getId(), SearchCriteria.Op.IN); + tmpltSearch.done(); + + tmpltIdSearch = createSearchBuilder(); + tmpltIdSearch.and("id", tmpltIdSearch.entity().getId(), SearchCriteria.Op.EQ); + tmpltIdSearch.done(); + + tmpltZoneSearch = createSearchBuilder(); + tmpltZoneSearch.and("id", tmpltZoneSearch.entity().getId(), SearchCriteria.Op.EQ); + tmpltZoneSearch.and("dataCenterId", tmpltZoneSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + tmpltZoneSearch.and("downloadState", tmpltZoneSearch.entity().getDownloadState(), SearchCriteria.Op.EQ); + tmpltZoneSearch.done(); + + // select distinct pair (template_id, zone_id) + this._count = "select count(distinct id) from template_view WHERE "; + } + + + + + @Override + public TemplateResponse newTemplateResponse(TemplateJoinVO template) { + TemplateResponse templateResponse = new TemplateResponse(); + templateResponse.setId(template.getUuid()); + templateResponse.setName(template.getName()); + templateResponse.setDisplayText(template.getDisplayText()); + templateResponse.setPublic(template.isPublicTemplate()); + templateResponse.setCreated(template.getCreatedOnStore()); + templateResponse.setReady(template.getDownloadState() == Status.DOWNLOADED); + templateResponse.setFeatured(template.isFeatured()); + templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); + templateResponse.setPasswordEnabled(template.isEnablePassword()); + templateResponse.setSshKeyEnabled(template.isEnableSshKey()); + templateResponse.setCrossZones(template.isCrossZones()); + templateResponse.setFormat(template.getFormat()); + if (template.getTemplateType() != null) { + templateResponse.setTemplateType(template.getTemplateType().toString()); + } + + templateResponse.setHypervisor(template.getHypervisorType().toString()); + + + templateResponse.setOsTypeId(template.getGuestOSUuid()); + templateResponse.setOsTypeName(template.getGuestOSName()); + + // populate owner. + ApiResponseHelper.populateOwner(templateResponse, template); + + // populate domain + templateResponse.setDomainId(template.getDomainUuid()); + templateResponse.setDomainName(template.getDomainName()); + + + + boolean isAdmin = false; + Account caller = UserContext.current().getCaller(); + if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { + isAdmin = true; + } + + // If the user is an Admin, add the template download status + if (isAdmin || caller.getId() == template.getAccountId()) { + // add download status + if (template.getDownloadState() != Status.DOWNLOADED) { + String templateStatus = "Processing"; + if (template.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (template.getDownloadPercent() == 100) { + templateStatus = "Installing Template"; + } else { + templateStatus = template.getDownloadPercent() + "% Downloaded"; + } + } else { + templateStatus = template.getErrorString(); + } + templateResponse.setStatus(templateStatus); + } else if (template.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + templateResponse.setStatus("Download Complete"); + } else { + templateResponse.setStatus("Successfully Installed"); + } + } + + Long templateSize = template.getSize(); + if (templateSize > 0) { + templateResponse.setSize(templateSize); + } + + templateResponse.setChecksum(template.getChecksum()); + if (template.getSourceTemplateId() != null) { + templateResponse.setSourceTemplateId(template.getSourceTemplateUuid()); + } + templateResponse.setTemplateTag(template.getTemplateTag()); + + // set template zone information + if (template.getDataCenterId() > 0 ){ + TemplateZoneResponse tmplZoneResp = new TemplateZoneResponse(template.getDataCenterUuid(), template.getDataCenterName()); + templateResponse.addZone(tmplZoneResp); + // set the first found associated zone directly in TemplateResponse + templateResponse.setZoneId(template.getDataCenterUuid()); + templateResponse.setZoneName(template.getDataCenterName()); + } + + // set details map + if (template.getDetailName() != null){ + Map details = new HashMap(); + details.put(template.getDetailName(), template.getDetailValue()); + templateResponse.setDetails(details); + } + + // update tag information + long tag_id = template.getTagId(); + if (tag_id > 0) { + ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); + if ( vtag != null ){ + templateResponse.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); + } + } + + + templateResponse.setObjectName("template"); + return templateResponse; + } + + + //TODO: This is to keep compatibility with 4.1 API, where updateTemplateCmd and updateIsoCmd will return a simpler TemplateResponse + // compared to listTemplates and listIsos. + @Override + public TemplateResponse newUpdateResponse(TemplateJoinVO result) { + TemplateResponse response = new TemplateResponse(); + response.setId(result.getUuid()); + response.setName(result.getName()); + response.setDisplayText(result.getDisplayText()); + response.setPublic(result.isPublicTemplate()); + response.setCreated(result.getCreated()); + response.setFormat(result.getFormat()); + response.setOsTypeId(result.getGuestOSUuid()); + response.setOsTypeName(result.getGuestOSName()); + response.setBootable(result.isBootable()); + response.setHypervisor(result.getHypervisorType().toString()); + + // populate owner. + ApiResponseHelper.populateOwner(response, result); + + // populate domain + response.setDomainId(result.getDomainUuid()); + response.setDomainName(result.getDomainName()); + + // set details map + if (result.getDetailName() != null) { + Map details = new HashMap(); + details.put(result.getDetailName(), result.getDetailValue()); + response.setDetails(details); + } + + // update tag information + long tag_id = result.getTagId(); + if (tag_id > 0) { + ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); + if (vtag != null) { + response.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); + } + } + + response.setObjectName("iso"); + return response; + } + + + + + @Override + public TemplateResponse setTemplateResponse(TemplateResponse templateResponse, TemplateJoinVO template) { + + // update template zone information + if (template.getDataCenterId() > 0 ){ + TemplateZoneResponse tmplZoneResp = new TemplateZoneResponse(template.getDataCenterUuid(), template.getDataCenterName()); + templateResponse.addZone(tmplZoneResp); + if (templateResponse.getZoneId() == null) { + // set the first found associated zone directly in + // TemplateResponse + templateResponse.setZoneId(template.getDataCenterUuid()); + templateResponse.setZoneName(template.getDataCenterName()); + } + } + + // update details map + if (template.getDetailName() != null){ + Map details = templateResponse.getDetails(); + if ( details == null ){ + details = new HashMap(); + } + details.put(template.getDetailName(), template.getDetailValue()); + templateResponse.setDetails(details); + } + + // update tag information + long tag_id = template.getTagId(); + if (tag_id > 0) { + ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); + if ( vtag != null ){ + templateResponse.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); + } + } + + return templateResponse; + } + + + @Override + public TemplateResponse newIsoResponse(TemplateJoinVO iso) { + + TemplateResponse isoResponse = new TemplateResponse(); + isoResponse.setId(iso.getUuid()); + isoResponse.setName(iso.getName()); + isoResponse.setDisplayText(iso.getDisplayText()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); + isoResponse.setCreated(iso.getCreatedOnStore()); + isoResponse.setReady(iso.getDownloadState() == Status.DOWNLOADED); + isoResponse.setBootable(iso.isBootable()); + isoResponse.setFeatured(iso.isFeatured()); + isoResponse.setCrossZones(iso.isCrossZones()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setChecksum(iso.getChecksum()); + + isoResponse.setOsTypeId(iso.getGuestOSUuid()); + isoResponse.setOsTypeName(iso.getGuestOSName()); + + // populate owner. + ApiResponseHelper.populateOwner(isoResponse, iso); + + // populate domain + isoResponse.setDomainId(iso.getDomainUuid()); + isoResponse.setDomainName(iso.getDomainName()); + + // set template zone information + if (iso.getDataCenterId() > 0 ){ + TemplateZoneResponse tmplZoneResp = new TemplateZoneResponse(iso.getDataCenterUuid(), iso.getDataCenterName()); + isoResponse.addZone(tmplZoneResp); + // set the first found associated zone directly in TemplateResponse + isoResponse.setZoneId(iso.getDataCenterUuid()); + isoResponse.setZoneName(iso.getDataCenterName()); + } + + + Account caller = UserContext.current().getCaller(); + boolean isAdmin = false; + if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { + isAdmin = true; + } + + + // If the user is an admin, add the template download status + if (isAdmin || caller.getId() == iso.getAccountId()) { + // add download status + if (iso.getDownloadState() != Status.DOWNLOADED) { + String isoStatus = "Processing"; + if (iso.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + isoStatus = "Download Complete"; + } else if (iso.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (iso.getDownloadPercent() == 100) { + isoStatus = "Installing ISO"; + } else { + isoStatus = iso.getDownloadPercent() + "% Downloaded"; + } + } else { + isoStatus = iso.getErrorString(); + } + isoResponse.setStatus(isoStatus); + } else { + isoResponse.setStatus("Successfully Installed"); + } + } + + Long isoSize = iso.getSize(); + if (isoSize > 0) { + isoResponse.setSize(isoSize); + } + + // update tag information + long tag_id = iso.getTagId(); + if (tag_id > 0) { + ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); + if ( vtag != null ){ + isoResponse.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); + } + } + + isoResponse.setObjectName("iso"); + return isoResponse; + + } + + @Override + public List newTemplateView(VirtualMachineTemplate template) { + SearchCriteria sc = tmpltIdSearch.create(); + sc.setParameters("id", template.getId()); + return searchIncludingRemoved(sc, null, null, false); + } + + @Override + public List newTemplateView(VirtualMachineTemplate template, long zoneId, boolean readyOnly) { + SearchCriteria sc = tmpltZoneSearch.create(); + sc.setParameters("id", template.getId()); + sc.setParameters("dataCenterId", zoneId); + if ( readyOnly ){ + sc.setParameters("downloadState", VMTemplateStorageResourceAssoc.Status.DOWNLOADED); + } + return searchIncludingRemoved(sc, null, null, false); + } + + + + @Override + public List searchByIds(Long... tmplIds) { + // set detail batch query size + int DETAILS_BATCH_SIZE = 2000; + String batchCfg = _configDao.getValue("detail.batch.query.size"); + if ( batchCfg != null ){ + DETAILS_BATCH_SIZE = Integer.parseInt(batchCfg); + } + // query details by batches + List uvList = new ArrayList(); + // query details by batches + int curr_index = 0; + if ( tmplIds.length > DETAILS_BATCH_SIZE ){ + while ( (curr_index + DETAILS_BATCH_SIZE ) <= tmplIds.length ) { + Long[] ids = new Long[DETAILS_BATCH_SIZE]; + for (int k = 0, j = curr_index; j < curr_index + DETAILS_BATCH_SIZE; j++, k++) { + ids[k] = tmplIds[j]; + } + SearchCriteria sc = tmpltSearch.create(); + sc.setParameters("idIN", ids); + List vms = searchIncludingRemoved(sc, null, null, false); + if (vms != null) { + uvList.addAll(vms); + } + curr_index += DETAILS_BATCH_SIZE; + } + } + if (curr_index < tmplIds.length) { + int batch_size = (tmplIds.length - curr_index); + // set the ids value + Long[] ids = new Long[batch_size]; + for (int k = 0, j = curr_index; j < curr_index + batch_size; j++, k++) { + ids[k] = tmplIds[j]; + } + SearchCriteria sc = tmpltSearch.create(); + sc.setParameters("idIN", ids); + List vms = searchIncludingRemoved(sc, null, null, false); + if (vms != null) { + uvList.addAll(vms); + } + } + return uvList; + } + + + +} diff --git a/server/src/com/cloud/api/query/vo/TemplateJoinVO.java b/server/src/com/cloud/api/query/vo/TemplateJoinVO.java new file mode 100644 index 00000000000..0a6b0f9977c --- /dev/null +++ b/server/src/com/cloud/api/query/vo/TemplateJoinVO.java @@ -0,0 +1,1006 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.api.query.vo; + +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.storage.Storage; +import com.cloud.storage.Volume; +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; +import com.cloud.utils.db.GenericDao; +import com.cloud.vm.VirtualMachine; + +@Entity +@Table(name="template_view") +public class TemplateJoinVO extends BaseViewVO implements ControlledViewEntity { + + @Id + @Column(name="id") + private long id; + + @Column(name="uuid") + private String uuid; + + @Column(name="unique_name") + private String uniqueName; + + @Column(name="name") + private String name; + + @Column(name="format") + private Storage.ImageFormat format; + + @Column(name="public") + private boolean publicTemplate = true; + + @Column(name="featured") + private boolean featured; + + @Column(name="type") + private Storage.TemplateType templateType; + + @Column(name="url") + private String url = null; + + @Column(name="hvm") + private boolean requiresHvm; + + @Column(name="bits") + private int bits; + + @Temporal(value=TemporalType.TIMESTAMP) + @Column(name=GenericDao.CREATED_COLUMN) + private Date created = null; + + @Temporal(value=TemporalType.TIMESTAMP) + @Column(name="created_on_store") + private Date createdOnStore = null; + + @Column(name=GenericDao.REMOVED) + @Temporal(TemporalType.TIMESTAMP) + private Date removed; + + @Column(name="checksum") + private String checksum; + + @Column(name="display_text", length=4096) + private String displayText; + + @Column(name="enable_password") + private boolean enablePassword; + + @Column(name="guest_os_id") + private long guestOSId; + + @Column(name="guest_os_uuid") + private String guestOSUuid; + + @Column(name="guest_os_name") + private String guestOSName; + + @Column(name="bootable") + private boolean bootable = true; + + @Column(name="prepopulate") + private boolean prepopulate = false; + + @Column(name="cross_zones") + private boolean crossZones = false; + + @Column(name="hypervisor_type") + @Enumerated(value=EnumType.STRING) + private HypervisorType hypervisorType; + + @Column(name="extractable") + private boolean extractable = true; + + @Column(name="source_template_id") + private Long sourceTemplateId; + + @Column(name="source_template_uuid") + private String sourceTemplateUuid; + + + @Column(name="template_tag") + private String templateTag; + + @Column(name="sort_key") + private int sortKey; + + @Column(name="enable_sshkey") + private boolean enableSshKey; + + @Column(name="account_id") + private long accountId; + + @Column(name="account_uuid") + private String accountUuid; + + @Column(name="account_name") + private String accountName = null; + + @Column(name="account_type") + private short accountType; + + @Column(name="domain_id") + private long domainId; + + @Column(name="domain_uuid") + private String domainUuid; + + @Column(name="domain_name") + private String domainName = null; + + @Column(name="domain_path") + private String domainPath = null; + + @Column(name="project_id") + private long projectId; + + @Column(name="project_uuid") + private String projectUuid; + + @Column(name="project_name") + private String projectName; + + @Column(name="data_center_id") + private long dataCenterId; + + @Column(name="data_center_uuid") + private String dataCenterUuid; + + @Column(name="data_center_name") + private String dataCenterName; + + @Column (name="download_state") + @Enumerated(EnumType.STRING) + private Status downloadState; + + @Column (name="download_pct") + private int downloadPercent; + + @Column (name="error_str") + private String errorString; + + @Column (name="size") + private long size; + + @Column(name="destroyed") + boolean destroyed = false; + + @Column(name="lp_account_id") + private Long sharedAccountId; + + @Column(name="detail_name") + private String detailName; + + @Column(name="detail_value") + private String detailValue; + + + @Column(name="tag_id") + private long tagId; + + @Column(name="tag_uuid") + private String tagUuid; + + @Column(name="tag_key") + private String tagKey; + + @Column(name="tag_value") + private String tagValue; + + @Column(name="tag_domain_id") + private long tagDomainId; + + @Column(name="tag_account_id") + private long tagAccountId; + + @Column(name="tag_resource_id") + private long tagResourceId; + + @Column(name="tag_resource_uuid") + private String tagResourceUuid; + + @Column(name="tag_resource_type") + @Enumerated(value=EnumType.STRING) + private TaggedResourceType tagResourceType; + + @Column(name="tag_customer") + private String tagCustomer; + + + + public TemplateJoinVO() { + } + + + + @Override + public long getId() { + return id; + } + + + + @Override + public void setId(long id) { + this.id = id; + } + + + + @Override + public String getUuid() { + return uuid; + } + + + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + + + public String getName() { + return name; + } + + + + public void setName(String name) { + this.name = name; + } + + + public Date getCreated() { + return created; + } + + + + public void setCreated(Date created) { + this.created = created; + } + + + + public Date getRemoved() { + return removed; + } + + + + public void setRemoved(Date removed) { + this.removed = removed; + } + + + + @Override + public long getAccountId() { + return accountId; + } + + + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + + + + @Override + public String getAccountUuid() { + return accountUuid; + } + + + + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + + + @Override + public String getAccountName() { + return accountName; + } + + + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + + + @Override + public short getAccountType() { + return accountType; + } + + + + public void setAccountType(short accountType) { + this.accountType = accountType; + } + + + + @Override + public long getDomainId() { + return domainId; + } + + + + public void setDomainId(long domainId) { + this.domainId = domainId; + } + + + + @Override + public String getDomainUuid() { + return domainUuid; + } + + + + public void setDomainUuid(String domainUuid) { + this.domainUuid = domainUuid; + } + + + + @Override + public String getDomainName() { + return domainName; + } + + + + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + + + @Override + public String getDomainPath() { + return domainPath; + } + + + + public void setDomainPath(String domainPath) { + this.domainPath = domainPath; + } + + + + public long getProjectId() { + return projectId; + } + + + + public void setProjectId(long projectId) { + this.projectId = projectId; + } + + + + @Override + public String getProjectUuid() { + return projectUuid; + } + + + + public void setProjectUuid(String projectUuid) { + this.projectUuid = projectUuid; + } + + + + @Override + public String getProjectName() { + return projectName; + } + + + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + + + + public boolean isExtractable() { + return extractable; + } + + + + public void setExtractable(boolean extractable) { + this.extractable = extractable; + } + + + + public Storage.TemplateType getTemplateType() { + return templateType; + } + + + + public void setTemplateType(Storage.TemplateType templateType) { + this.templateType = templateType; + } + + + + + + + public long getTagId() { + return tagId; + } + + + + public void setTagId(long tagId) { + this.tagId = tagId; + } + + + + public String getTagUuid() { + return tagUuid; + } + + + + public void setTagUuid(String tagUuid) { + this.tagUuid = tagUuid; + } + + + + public String getTagKey() { + return tagKey; + } + + + + public void setTagKey(String tagKey) { + this.tagKey = tagKey; + } + + + + public String getTagValue() { + return tagValue; + } + + + + public void setTagValue(String tagValue) { + this.tagValue = tagValue; + } + + + + public long getTagDomainId() { + return tagDomainId; + } + + + + public void setTagDomainId(long tagDomainId) { + this.tagDomainId = tagDomainId; + } + + + + public long getTagAccountId() { + return tagAccountId; + } + + + + public void setTagAccountId(long tagAccountId) { + this.tagAccountId = tagAccountId; + } + + + + public long getTagResourceId() { + return tagResourceId; + } + + + + public void setTagResourceId(long tagResourceId) { + this.tagResourceId = tagResourceId; + } + + + + public String getTagResourceUuid() { + return tagResourceUuid; + } + + + + public void setTagResourceUuid(String tagResourceUuid) { + this.tagResourceUuid = tagResourceUuid; + } + + + + public TaggedResourceType getTagResourceType() { + return tagResourceType; + } + + + + public void setTagResourceType(TaggedResourceType tagResourceType) { + this.tagResourceType = tagResourceType; + } + + + + public String getTagCustomer() { + return tagCustomer; + } + + + + public void setTagCustomer(String tagCustomer) { + this.tagCustomer = tagCustomer; + } + + + + public long getDataCenterId() { + return dataCenterId; + } + + + + public void setDataCenterId(long dataCenterId) { + this.dataCenterId = dataCenterId; + } + + + + public String getDataCenterUuid() { + return dataCenterUuid; + } + + + + public void setDataCenterUuid(String dataCenterUuid) { + this.dataCenterUuid = dataCenterUuid; + } + + + + public String getDataCenterName() { + return dataCenterName; + } + + + + public void setDataCenterName(String dataCenterName) { + this.dataCenterName = dataCenterName; + } + + + + public String getUniqueName() { + return uniqueName; + } + + + + public void setUniqueName(String uniqueName) { + this.uniqueName = uniqueName; + } + + + + public boolean isPublicTemplate() { + return publicTemplate; + } + + + + public void setPublicTemplate(boolean publicTemplate) { + this.publicTemplate = publicTemplate; + } + + + + public boolean isFeatured() { + return featured; + } + + + + public void setFeatured(boolean featured) { + this.featured = featured; + } + + + + public String getUrl() { + return url; + } + + + + public void setUrl(String url) { + this.url = url; + } + + + + public boolean isRequiresHvm() { + return requiresHvm; + } + + + + public void setRequiresHvm(boolean requiresHvm) { + this.requiresHvm = requiresHvm; + } + + + + public int getBits() { + return bits; + } + + + + public void setBits(int bits) { + this.bits = bits; + } + + + + public String getChecksum() { + return checksum; + } + + + + public void setChecksum(String checksum) { + this.checksum = checksum; + } + + + + public String getDisplayText() { + return displayText; + } + + + + public void setDisplayText(String displayText) { + this.displayText = displayText; + } + + + + public boolean isEnablePassword() { + return enablePassword; + } + + + + public void setEnablePassword(boolean enablePassword) { + this.enablePassword = enablePassword; + } + + + + public long getGuestOSId() { + return guestOSId; + } + + + + public void setGuestOSId(long guestOSId) { + this.guestOSId = guestOSId; + } + + + + public String getGuestOSUuid() { + return guestOSUuid; + } + + + + public void setGuestOSUuid(String guestOSUuid) { + this.guestOSUuid = guestOSUuid; + } + + + + public String getGuestOSName() { + return guestOSName; + } + + + + public void setGuestOSName(String guestOSName) { + this.guestOSName = guestOSName; + } + + + + public boolean isBootable() { + return bootable; + } + + + + public void setBootable(boolean bootable) { + this.bootable = bootable; + } + + + + public boolean isPrepopulate() { + return prepopulate; + } + + + + public void setPrepopulate(boolean prepopulate) { + this.prepopulate = prepopulate; + } + + + + public boolean isCrossZones() { + return crossZones; + } + + + + public void setCrossZones(boolean crossZones) { + this.crossZones = crossZones; + } + + + + public HypervisorType getHypervisorType() { + return hypervisorType; + } + + + + public void setHypervisorType(HypervisorType hypervisorType) { + this.hypervisorType = hypervisorType; + } + + + + public Long getSourceTemplateId() { + return sourceTemplateId; + } + + + + public void setSourceTemplateId(Long sourceTemplateId) { + this.sourceTemplateId = sourceTemplateId; + } + + + + public String getSourceTemplateUuid() { + return sourceTemplateUuid; + } + + + + public void setSourceTemplateUuid(String sourceTemplateUuid) { + this.sourceTemplateUuid = sourceTemplateUuid; + } + + + + public String getTemplateTag() { + return templateTag; + } + + + + public void setTemplateTag(String templateTag) { + this.templateTag = templateTag; + } + + + + public int getSortKey() { + return sortKey; + } + + + + public void setSortKey(int sortKey) { + this.sortKey = sortKey; + } + + + + public boolean isEnableSshKey() { + return enableSshKey; + } + + + + public void setEnableSshKey(boolean enableSshKey) { + this.enableSshKey = enableSshKey; + } + + + + public Status getDownloadState() { + return downloadState; + } + + + + public void setDownloadState(Status downloadState) { + this.downloadState = downloadState; + } + + + + public long getSize() { + return size; + } + + + + public void setSize(long size) { + this.size = size; + } + + + + public boolean isDestroyed() { + return destroyed; + } + + + + public void setDestroyed(boolean destroyed) { + this.destroyed = destroyed; + } + + + + public Long getSharedAccountId() { + return sharedAccountId; + } + + + + public void setSharedAccountId(Long sharedAccountId) { + this.sharedAccountId = sharedAccountId; + } + + + + public String getDetailName() { + return detailName; + } + + + + public void setDetailName(String detailName) { + this.detailName = detailName; + } + + + + public String getDetailValue() { + return detailValue; + } + + + + public void setDetailValue(String detailValue) { + this.detailValue = detailValue; + } + + + + public Date getCreatedOnStore() { + return createdOnStore; + } + + + + public void setCreatedOnStore(Date createdOnStore) { + this.createdOnStore = createdOnStore; + } + + + + public Storage.ImageFormat getFormat() { + return format; + } + + + + public void setFormat(Storage.ImageFormat format) { + this.format = format; + } + + + + public int getDownloadPercent() { + return downloadPercent; + } + + + + public void setDownloadPercent(int downloadPercent) { + this.downloadPercent = downloadPercent; + } + + + + public String getErrorString() { + return errorString; + } + + + + public void setErrorString(String errorString) { + this.errorString = errorString; + } + + + +} diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index ff60ce53fed..c2871d9f4d8 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1112,70 +1112,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe return new Pair, Integer>(result.first(), result.second()); } - @Override - public Set> listIsos(ListIsosCmd cmd) throws IllegalArgumentException, InvalidParameterValueException { - TemplateFilter isoFilter = TemplateFilter.valueOf(cmd.getIsoFilter()); - Account caller = UserContext.current().getCaller(); - Map tags = cmd.getTags(); - boolean listAll = false; - if (isoFilter != null && isoFilter == TemplateFilter.all) { - if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { - throw new InvalidParameterValueException("Filter " + TemplateFilter.all + " can be specified by admin only"); - } - listAll = true; - } - List permittedAccountIds = new ArrayList(); - Ternary domainIdRecursiveListProject = new Ternary( - cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, cmd.getId(), cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, - domainIdRecursiveListProject, listAll, false); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - - List permittedAccounts = new ArrayList(); - for (Long accountId : permittedAccountIds) { - permittedAccounts.add(_accountMgr.getAccount(accountId)); - } - - HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor()); - return listTemplates(cmd.getId(), cmd.getIsoName(), cmd.getKeyword(), isoFilter, true, cmd.isBootable(), cmd.getPageSizeVal(), - cmd.getStartIndex(), cmd.getZoneId(), hypervisorType, true, cmd.listInReadyState(), permittedAccounts, caller, - listProjectResourcesCriteria, tags); - } - - @Override - public Set> listTemplates(ListTemplatesCmd cmd) throws IllegalArgumentException, InvalidParameterValueException { - TemplateFilter templateFilter = TemplateFilter.valueOf(cmd.getTemplateFilter()); - Long id = cmd.getId(); - Map tags = cmd.getTags(); - Account caller = UserContext.current().getCaller(); - - boolean listAll = false; - if (templateFilter != null && templateFilter == TemplateFilter.all) { - if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { - throw new InvalidParameterValueException("Filter " + TemplateFilter.all + " can be specified by admin only"); - } - listAll = true; - } - - List permittedAccountIds = new ArrayList(); - Ternary domainIdRecursiveListProject = new Ternary( - cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, - listAll, false); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - List permittedAccounts = new ArrayList(); - for (Long accountId : permittedAccountIds) { - permittedAccounts.add(_accountMgr.getAccount(accountId)); - } - - boolean showDomr = ((templateFilter != TemplateFilter.selfexecutable) && (templateFilter != TemplateFilter.featured)); - HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor()); - - return listTemplates(id, cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, cmd.getPageSizeVal(), cmd.getStartIndex(), - cmd.getZoneId(), hypervisorType, showDomr, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria, tags); - } + /* TODO: this method should go away. Keep here just in case that our latest refactoring using template_store_ref missed anything + * in handling Swift or S3. private Set> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean showDomr, boolean onlyReady, List permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags) { @@ -1274,7 +1214,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe return templateZonePairSet; } - +*/ @Override diff --git a/server/src/com/cloud/storage/dao/VMTemplateDao.java b/server/src/com/cloud/storage/dao/VMTemplateDao.java index 726337129a3..8c2b941c7b1 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDao.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDao.java @@ -37,11 +37,11 @@ import com.cloud.utils.fsm.StateDao; * Data Access Object for vm_templates table */ public interface VMTemplateDao extends GenericDao, StateDao { - - + + public List listByPublic(); public VMTemplateVO findByName(String templateName); - public VMTemplateVO findByTemplateName(String templateName); + public VMTemplateVO findByTemplateName(String templateName); //public void update(VMTemplateVO template); @@ -53,11 +53,13 @@ public interface VMTemplateDao extends GenericDao, StateDao< public List findIsosByIdAndPath(Long domainId, Long accountId, String path); public List listReadyTemplates(); public List listByAccountId(long accountId); + + /* TODO: these routines should go away, the logic has been consolidated and refactored in QueryService public Set> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags); - + public Set> searchSwiftTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, Map tags); @@ -65,10 +67,11 @@ public interface VMTemplateDao extends GenericDao, StateDao< public Set> searchS3Templates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, Map tags); + */ public long addTemplateToZone(VMTemplateVO tmplt, long zoneId); - public List listAllInZone(long dataCenterId); - + public List listAllInZone(long dataCenterId); + public List listByHypervisorType(List hyperTypes); public List publicIsoSearch(Boolean bootable, boolean listRemoved, Map tags); public List userIsoSearch(boolean listRemoved); @@ -78,7 +81,7 @@ public interface VMTemplateDao extends GenericDao, StateDao< VMTemplateVO findRoutingTemplate(HypervisorType type); List listPrivateTemplatesByHost(Long hostId); public Long countTemplatesForAccount(long accountId); - + List findTemplatesToSyncToS3(); } diff --git a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index d9a26d3ca66..1bc77df3d3c 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -16,25 +16,17 @@ // under the License. package com.cloud.storage.dao; -import static com.cloud.utils.StringUtils.join; -import static com.cloud.utils.db.DbUtil.closeResources; - import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; -import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Set; - import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateEvent; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState; import org.apache.log4j.Logger; @@ -42,25 +34,19 @@ import org.springframework.stereotype.Component; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.dao.DataCenterDao; -import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.projects.Project.ListProjectResourcesCriteria; import com.cloud.server.ResourceTag.TaggedResourceType; import com.cloud.storage.Storage; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; -import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateZoneVO; import com.cloud.tags.ResourceTagVO; import com.cloud.tags.dao.ResourceTagDao; -import com.cloud.template.VirtualMachineTemplate.TemplateFilter; -import com.cloud.user.Account; -import com.cloud.utils.Pair; import com.cloud.utils.db.DB; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; @@ -92,6 +78,9 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem DomainDao _domainDao; @Inject DataCenterDao _dcDao; + + /* TODO: these direct sql should go away with recent QueryService refactoring to handle listTemplatesCmd. Keep here just for + * potential bug reference. private final String SELECT_TEMPLATE_HOST_REF = "SELECT t.id, h.data_center_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; @@ -103,6 +92,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem private final String SELECT_TEMPLATE_S3_REF = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; + */ private static final String SELECT_S3_CANDIDATE_TEMPLATES = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, " + "t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, t.checksum, t.display_text, " + @@ -397,6 +387,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem return routerTmpltName; } + /* @Override public Set> searchSwiftTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, Map tags) { @@ -538,7 +529,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem Transaction txn = Transaction.currentTxn(); txn.start(); - /* Use LinkedHashSet here to guarantee iteration order */ + // Use LinkedHashSet here to guarantee iteration order Set> templateZonePairList = new LinkedHashSet>(); PreparedStatement pstmt = null; ResultSet rs = null; @@ -751,7 +742,9 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem return templateZonePairList; } + */ + /* private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, boolean showDomr) { String sql = ""; if (keyword != null) { @@ -811,6 +804,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem } return sql; } + */ @Override @DB @@ -873,7 +867,8 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem } } - public VMTemplateVO findSystemVMTemplate(long zoneId, HypervisorType hType) { + @Override + public VMTemplateVO findSystemVMTemplate(long zoneId, HypervisorType hType) { SearchCriteria sc = tmpltTypeHyperSearch.create(); sc.setParameters("templateType", Storage.TemplateType.SYSTEM); sc.setJoinParameters("tmplHyper", "type", Host.Type.Routing); @@ -938,18 +933,14 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem return result; } - private boolean isAdmin(short accountType) { - return ((accountType == Account.ACCOUNT_TYPE_ADMIN) || - (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) || - (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || - (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); - } + @Override public List findTemplatesToSyncToS3() { return executeList(SELECT_S3_CANDIDATE_TEMPLATES, new Object[] {}); } + /* @Override public Set> searchS3Templates(final String name, final String keyword, final TemplateFilter templateFilter, @@ -1083,6 +1074,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem return templateZonePairList; } +*/ @Override public boolean updateState(TemplateState currentState, TemplateEvent event, diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 9e524228fe1..619cd7ece4c 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -2118,6 +2118,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, @Override public VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId, boolean readyOnly) { + // readyOnly flag is not used at all List hosts = _ssvmMgr .listSecondaryStorageHostsInOneZone(zoneId); if (hosts == null || hosts.size() == 0) { diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index fd030889909..6a7365f9054 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -519,3 +519,98 @@ INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, VALUES (10, 'routing-10', 'SystemVM Template (LXC)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (LXC)', 'QCOW2', 15, 0, 1, 'LXC'); -- END: support for LXC + +DROP VIEW IF EXISTS `cloud`.`template_view`; +CREATE VIEW `cloud`.`template_view` AS + select + vm_template.id, + vm_template.uuid, + vm_template.unique_name, + vm_template.name, + vm_template.public, + vm_template.featured, + vm_template.type, + vm_template.hvm, + vm_template.bits, + vm_template.url, + vm_template.format, + vm_template.created, + vm_template.checksum, + vm_template.display_text, + vm_template.enable_password, + vm_template.guest_os_id, + guest_os.uuid guest_os_uuid, + guest_os.display_name guest_os_name, + vm_template.bootable, + vm_template.prepopulate, + vm_template.cross_zones, + vm_template.hypervisor_type, + vm_template.extractable, + vm_template.template_tag, + vm_template.sort_key, + source_template.id source_template_id, + source_template.uuid source_template_uuid, + account.id account_id, + account.uuid account_uuid, + account.account_name account_name, + account.type account_type, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path, + projects.id project_id, + projects.uuid project_uuid, + projects.name project_name, + data_center.id data_center_id, + data_center.uuid data_center_uuid, + data_center.name data_center_name, + launch_permission.account_id lp_account_id, + template_store_ref.download_state, + template_store_ref.download_pct, + template_store_ref.error_str, + template_store_ref.size, + template_store_ref.destroyed, + template_store_ref.created created_on_store, + vm_template_details.name detail_name, + vm_template_details.value detail_value, + resource_tags.id tag_id, + resource_tags.uuid tag_uuid, + resource_tags.key tag_key, + resource_tags.value tag_value, + resource_tags.domain_id tag_domain_id, + resource_tags.account_id tag_account_id, + resource_tags.resource_id tag_resource_id, + resource_tags.resource_uuid tag_resource_uuid, + resource_tags.resource_type tag_resource_type, + resource_tags.customer tag_customer + from + `cloud`.`vm_template` + inner join + `cloud`.`guest_os` ON guest_os.id = vm_template.guest_os_id + inner join + `cloud`.`account` ON account.id = vm_template.account_id + inner join + `cloud`.`domain` ON domain.id = account.domain_id + left join + `cloud`.`projects` ON projects.project_account_id = account.id + left join + `cloud`.`vm_template_details` ON vm_template_details.template_id = vm_template.id + left join + `cloud`.`vm_template` source_template ON source_template.id = vm_template.source_template_id + left join + `cloud`.`template_zone_ref` ON template_zone_ref.template_id = vm_template.id + AND template_zone_ref.removed is null + left join + `cloud`.`data_center` ON template_zone_ref.zone_id = data_center.id + left join + `cloud`.`image_store` ON image_store.data_center_id = data_center.id OR image_store.scope = 'REGION' + left join + `cloud`.`template_store_ref` ON template_store_ref.template_id = vm_template.id AND template_store_ref.store_id = image_store.id + left join + `cloud`.`launch_permission` ON launch_permission.template_id = vm_template.id + left join + `cloud`.`resource_tags` ON resource_tags.resource_id = vm_template.id + and (resource_tags.resource_type = 'Template' or resource_tags.resource_type='ISO'); + + +