From b14b39a69fa295d1d20484170b95b97fe310af28 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Thu, 20 Dec 2012 16:52:52 -0800 Subject: [PATCH] Remove IdentityProxy from BaseResponse, ExtractResponse. Now IdentityProxy is only referenced in CreateCmdResponse, which involves some async job logic change. Since it is not impacting list performance, will leave it there for now. Signed-off-by: Min Chen --- api/src/com/cloud/storage/Upload.java | 2 + .../apache/cloudstack/api/BaseAsyncCmd.java | 3 +- .../cloudstack/api/BaseAsyncCreateCmd.java | 5 +- .../org/apache/cloudstack/api/BaseCmd.java | 5 +- .../apache/cloudstack/api/BaseResponse.java | 19 +-- .../apache/cloudstack/api/ResponseObject.java | 24 +--- .../command/user/volume/CreateVolumeCmd.java | 2 +- .../command/user/volume/ExtractVolumeCmd.java | 16 ++- .../api/response/AccountResponse.java | 6 + .../api/response/AutoScalePolicyResponse.java | 6 + .../response/AutoScaleVmGroupResponse.java | 7 + .../response/AutoScaleVmProfileResponse.java | 7 + .../api/response/ConditionResponse.java | 6 + .../api/response/CounterResponse.java | 6 + .../api/response/DomainRouterResponse.java | 6 +- .../api/response/ExtractResponse.java | 54 ++++--- .../api/response/FirewallRuleResponse.java | 6 + .../cloudstack/api/response/HostResponse.java | 5 + .../api/response/IPAddressResponse.java | 5 + .../api/response/IsoVmResponse.java | 5 + .../cloudstack/api/response/NicResponse.java | 4 - .../api/response/PhysicalNetworkResponse.java | 7 + .../api/response/PrivateGatewayResponse.java | 5 + .../api/response/SecurityGroupResponse.java | 6 +- .../api/response/SnapshotResponse.java | 5 + .../api/response/StaticRouteResponse.java | 6 + .../api/response/StoragePoolResponse.java | 6 + .../api/response/SystemVmResponse.java | 12 +- .../api/response/TemplateResponse.java | 5 + .../api/response/TrafficTypeResponse.java | 6 + .../cloudstack/api/response/UserResponse.java | 6 + .../api/response/UserVmResponse.java | 4 +- .../api/response/VolumeResponse.java | 5 + .../apache/cloudstack/query/QueryService.java | 2 +- core/src/com/cloud/storage/UploadVO.java | 44 +++--- server/src/com/cloud/api/ApiDBUtils.java | 129 +++++++++++++++++ .../src/com/cloud/api/ApiResponseHelper.java | 133 ++---------------- server/src/com/cloud/api/ApiServer.java | 27 ++-- .../com/cloud/api/query/QueryManagerImpl.java | 6 +- .../cloud/server/ManagementServerImpl.java | 6 +- .../cloud/storage/upload/UploadListener.java | 118 +++++++++------- setup/db/create-schema.sql | 1 + 42 files changed, 443 insertions(+), 295 deletions(-) diff --git a/api/src/com/cloud/storage/Upload.java b/api/src/com/cloud/storage/Upload.java index d73a9d8604c..d67c15f946e 100755 --- a/api/src/com/cloud/storage/Upload.java +++ b/api/src/com/cloud/storage/Upload.java @@ -36,6 +36,8 @@ public interface Upload { long getId(); + String getUuid(); + Date getCreated(); Date getLastUpdated(); diff --git a/api/src/org/apache/cloudstack/api/BaseAsyncCmd.java b/api/src/org/apache/cloudstack/api/BaseAsyncCmd.java index 2bc8a6e8002..fd67ed89675 100644 --- a/api/src/org/apache/cloudstack/api/BaseAsyncCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseAsyncCmd.java @@ -57,7 +57,8 @@ public abstract class BaseAsyncCmd extends BaseCmd { public ResponseObject getResponse(long jobId) { AsyncJobResponse response = new AsyncJobResponse(); - response.setJobId(jobId); + AsyncJob job = _entityMgr.findById(AsyncJob.class, jobId); + response.setJobId(job.getUuid()); response.setResponseName(getCommandName()); return response; } diff --git a/api/src/org/apache/cloudstack/api/BaseAsyncCreateCmd.java b/api/src/org/apache/cloudstack/api/BaseAsyncCreateCmd.java index 63cab8be63b..ad9f4c6b31f 100644 --- a/api/src/org/apache/cloudstack/api/BaseAsyncCreateCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseAsyncCreateCmd.java @@ -17,6 +17,8 @@ package org.apache.cloudstack.api; import org.apache.cloudstack.api.response.CreateCmdResponse; + +import com.cloud.async.AsyncJob; import com.cloud.exception.ResourceAllocationException; public abstract class BaseAsyncCreateCmd extends BaseAsyncCmd { @@ -37,7 +39,8 @@ public abstract class BaseAsyncCreateCmd extends BaseAsyncCmd { public String getResponse(long jobId, long objectId, String objectEntityTable) { CreateCmdResponse response = new CreateCmdResponse(); - response.setJobId(jobId); + AsyncJob job = _entityMgr.findById(AsyncJob.class, jobId); + response.setJobId(job.getUuid()); response.setId(objectId); response.setIdEntityTable(objectEntityTable); response.setResponseName(getCommandName()); diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index d89f5ea1b3c..d964e70b84f 100644 --- a/api/src/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java @@ -512,8 +512,9 @@ public abstract class BaseCmd { throw new PermissionDeniedException("Can't add resources to the account id=" + account.getId() + " in state=" + account.getState() + " as it's no longer active"); } } else { - List idList = new ArrayList(); - idList.add(new IdentityProxy("domain", domainId, "domainId")); + // idList is not used anywhere, so removed it now + //List idList = new ArrayList(); + //idList.add(new IdentityProxy("domain", domainId, "domainId")); throw new InvalidParameterValueException("Unable to find account by name " + accountName + " in domain with specified id"); } } diff --git a/api/src/org/apache/cloudstack/api/BaseResponse.java b/api/src/org/apache/cloudstack/api/BaseResponse.java index 06171d9d944..a3fe6b0ee01 100644 --- a/api/src/org/apache/cloudstack/api/BaseResponse.java +++ b/api/src/org/apache/cloudstack/api/BaseResponse.java @@ -46,18 +46,12 @@ public abstract class BaseResponse implements ResponseObject { this.objectName = objectName; } - //TODO: TO be replaced by getObjectUuid() after all response refactoring - public Long getObjectId() { - return null; - } - - public String getObjectUuid(){ + public String getObjectId() { return null; } // For use by list commands with pending async jobs - //TODO: To be replaced by jobUuid after all response refactoring - protected IdentityProxy jobId = new IdentityProxy("async_job"); + protected String jobId; @SerializedName(ApiConstants.JOB_ID) @Param(description="the UUID of the latest async job acting on this object") protected String jobUuid; @@ -65,13 +59,12 @@ public abstract class BaseResponse implements ResponseObject { @SerializedName(ApiConstants.JOB_STATUS) @Param(description="the current status of the latest async job acting on this object") private Integer jobStatus; - //TODO: TO be replaced by getter and setters for jobUuid. - public Long getJobId() { - return jobId.getValue(); + public String getJobId() { + return jobId; } - public void setJobId(Long jobId) { - this.jobId.setValue(jobId); + public void setJobId(String jobId) { + this.jobId = jobId; } public String getJobUuid() { diff --git a/api/src/org/apache/cloudstack/api/ResponseObject.java b/api/src/org/apache/cloudstack/api/ResponseObject.java index fd327fab09a..c8bd45727c9 100644 --- a/api/src/org/apache/cloudstack/api/ResponseObject.java +++ b/api/src/org/apache/cloudstack/api/ResponseObject.java @@ -45,40 +45,24 @@ public interface ResponseObject { void setObjectName(String name); /** - * Returns the object Id + * Returns the object UUid */ - Long getObjectId(); - - /** - * Returns the object uuid. To replace getObjectId() later. - */ - String getObjectUuid(); + String getObjectId(); /** * Returns the job id * * @return */ - Long getJobId(); + String getJobId(); - /** - * Return the async job uuid. To replace getJobId() later. - * @return - */ - String getJobUuid(); /** * Sets the job id * * @param jobId */ - void setJobId(Long jobId); - - /** - * Set the job uuid. To replace setJobId() later. - * @param jobUuid job uuid - */ - void setJobUuid(String jobUuid); + void setJobId(String jobId); /** * Returns the job status diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java index ca886396656..a82c36343c1 100644 --- a/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java @@ -167,7 +167,7 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd { VolumeResponse response = _responseGenerator.createVolumeResponse(volume); //FIXME - have to be moved to ApiResponseHelper if (getSnapshotId() != null) { - Snapshot snap = _queryService.findSnapshotById(getSnapshotId()); + Snapshot snap = _entityMgr.findById(Snapshot.class, getSnapshotId()); if (snap != null) { response.setSnapshotId(snap.getUuid()); // if the volume was // created from a diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java index 787e096f26a..39dcfe66e0d 100644 --- a/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java @@ -133,15 +133,17 @@ public class ExtractVolumeCmd extends BaseAsyncCmd { ExtractResponse response = new ExtractResponse(); response.setResponseName(getCommandName()); response.setObjectName("volume"); - response.setIdentityTableName("volumes"); - response.setId(id); - response.setName(_entityMgr.findById(Volume.class, id).getName()); - response.setZoneId(zoneId); - response.setZoneName(_entityMgr.findById(DataCenter.class, zoneId).getName()); + Volume vol = _entityMgr.findById(Volume.class, id); + response.setId(vol.getUuid()); + response.setName(vol.getName()); + DataCenter zone = _entityMgr.findById(DataCenter.class, id); + response.setZoneId(zone.getUuid()); + response.setZoneName(zone.getName()); response.setMode(mode); - response.setUploadId(uploadId); + response.setUploadId(uploadInfo.getUuid()); response.setState(uploadInfo.getUploadState().toString()); - response.setAccountId(getEntityOwnerId()); + Account account = _entityMgr.findById(Account.class, getEntityOwnerId()); + response.setAccountId(account.getUuid()); response.setUrl(uploadInfo.getUploadUrl()); this.setResponseObject(response); } else { diff --git a/api/src/org/apache/cloudstack/api/response/AccountResponse.java b/api/src/org/apache/cloudstack/api/response/AccountResponse.java index dcb9142f2e8..2f186fb4032 100644 --- a/api/src/org/apache/cloudstack/api/response/AccountResponse.java +++ b/api/src/org/apache/cloudstack/api/response/AccountResponse.java @@ -149,6 +149,12 @@ public class AccountResponse extends BaseResponse { @SerializedName(ApiConstants.ACCOUNT_DETAILS) @Param(description="details for the account") private Map details; + + @Override + public String getObjectId() { + return this.id; + } + public void setId(String id) { this.id = id; } diff --git a/api/src/org/apache/cloudstack/api/response/AutoScalePolicyResponse.java b/api/src/org/apache/cloudstack/api/response/AutoScalePolicyResponse.java index b1331394f58..3be8a425f0d 100644 --- a/api/src/org/apache/cloudstack/api/response/AutoScalePolicyResponse.java +++ b/api/src/org/apache/cloudstack/api/response/AutoScalePolicyResponse.java @@ -60,6 +60,12 @@ public class AutoScalePolicyResponse extends BaseResponse implements ControlledE @SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name of the autoscale policy") private String domainName; + + @Override + public String getObjectId() { + return this.id; + } + public void setId(String id) { this.id = id; } diff --git a/api/src/org/apache/cloudstack/api/response/AutoScaleVmGroupResponse.java b/api/src/org/apache/cloudstack/api/response/AutoScaleVmGroupResponse.java index a4f3da6899c..125aa9bf9e1 100644 --- a/api/src/org/apache/cloudstack/api/response/AutoScaleVmGroupResponse.java +++ b/api/src/org/apache/cloudstack/api/response/AutoScaleVmGroupResponse.java @@ -81,6 +81,13 @@ public class AutoScaleVmGroupResponse extends BaseResponse implements Controlled } + + @Override + public String getObjectId() { + return this.id; + } + + public void setId(String id) { this.id = id; } diff --git a/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java b/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java index 0041be91d66..f5ed4b1bdba 100644 --- a/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java +++ b/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java @@ -92,6 +92,13 @@ public class AutoScaleVmProfileResponse extends BaseResponse implements Controll } + + @Override + public String getObjectId() { + return this.id; + } + + public void setId(String id) { this.id = id; } diff --git a/api/src/org/apache/cloudstack/api/response/ConditionResponse.java b/api/src/org/apache/cloudstack/api/response/ConditionResponse.java index c90e78a3534..168ba5c90c8 100644 --- a/api/src/org/apache/cloudstack/api/response/ConditionResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ConditionResponse.java @@ -70,10 +70,16 @@ public class ConditionResponse extends BaseResponse implements ControlledEntityR // ///////////////// Setters /////////////////////// // /////////////////////////////////////////////////// + public void setId(String id) { this.id = id; } + @Override + public String getObjectId() { + return this.id; + } + public void setThreshold(long threshold) { this.threshold = threshold; } diff --git a/api/src/org/apache/cloudstack/api/response/CounterResponse.java b/api/src/org/apache/cloudstack/api/response/CounterResponse.java index 1d13d68fdf6..6afc0dea40c 100644 --- a/api/src/org/apache/cloudstack/api/response/CounterResponse.java +++ b/api/src/org/apache/cloudstack/api/response/CounterResponse.java @@ -48,6 +48,12 @@ public class CounterResponse extends BaseResponse { @Param(description = "zone id of counter") private String zoneId; + + @Override + public String getObjectId() { + return this.id; + } + public void setId(String id) { this.id = id; } diff --git a/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java b/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java index 7db014e109a..bd44f2614f2 100644 --- a/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java +++ b/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java @@ -154,11 +154,15 @@ public class DomainRouterResponse extends BaseResponse implements ControlledView nics = new HashSet(); } + + @Override - public String getObjectUuid() { + public String getObjectId() { return this.getId(); } + + public String getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/ExtractResponse.java b/api/src/org/apache/cloudstack/api/response/ExtractResponse.java index ac5cc3d3e79..5d415e94349 100644 --- a/api/src/org/apache/cloudstack/api/response/ExtractResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ExtractResponse.java @@ -19,20 +19,19 @@ package org.apache.cloudstack.api.response; import java.util.Date; import org.apache.cloudstack.api.ApiConstants; -import com.cloud.utils.IdentityProxy; import com.cloud.serializer.Param; import com.google.gson.annotations.SerializedName; import org.apache.cloudstack.api.BaseResponse; public class ExtractResponse extends BaseResponse { @SerializedName(ApiConstants.ID) @Param(description="the id of extracted object") - private IdentityProxy id = new IdentityProxy("vm_template"); + private String id; @SerializedName(ApiConstants.NAME) @Param(description="the name of the extracted object") private String name; @SerializedName("extractId") @Param(description="the upload id of extracted object") - private IdentityProxy uploadId = new IdentityProxy("async_job"); + private String uploadId; @SerializedName("uploadpercentage") @Param(description="the percentage of the entity uploaded to the specified location") private Integer uploadPercent; @@ -41,7 +40,7 @@ public class ExtractResponse extends BaseResponse { private String status; @SerializedName("accountid") @Param(description="the account id to which the extracted object belongs") - private IdentityProxy accountId = new IdentityProxy("account"); + private String accountId; @SerializedName("resultstring") @Param(includeInApiDoc=false) private String resultString; @@ -59,7 +58,7 @@ public class ExtractResponse extends BaseResponse { private String storage; @SerializedName(ApiConstants.ZONE_ID) @Param(description="zone ID the object was extracted from") - private IdentityProxy zoneId = new IdentityProxy("data_center"); + private String zoneId; @SerializedName(ApiConstants.ZONE_NAME) @Param(description="zone name the object was extracted from") private String zoneName; @@ -73,26 +72,23 @@ public class ExtractResponse extends BaseResponse { public ExtractResponse(){ } - public ExtractResponse(Long typeId, String typeName, long accountId, - String state, Long uploadId) { - this.id.setValue(typeId); + public ExtractResponse(String typeId, String typeName, String accountId, + String state, String uploadId) { + this.id = typeId; this.name = typeName; - this.accountId.setValue(accountId); + this.accountId = accountId; this.state = state; - this.uploadId.setValue(uploadId); + this.uploadId = uploadId; } - public Long getId() { - return id.getValue(); + public String getId() { + return id; } - public void setId(long id) { - this.id.setValue(id); + public void setId(String id) { + this.id = id; } - public void setIdentityTableName(String tableName) { - this.id.setTableName(tableName); - } public String getName() { return name; @@ -102,12 +98,12 @@ public class ExtractResponse extends BaseResponse { this.name = name; } - public Long getUploadId() { - return uploadId.getValue(); + public String getUploadId() { + return uploadId; } - public void setUploadId(Long uploadId) { - this.uploadId.setValue(uploadId); + public void setUploadId(String uploadId) { + this.uploadId = uploadId; } public Integer getUploadPercent() { @@ -126,12 +122,12 @@ public class ExtractResponse extends BaseResponse { this.status = status; } - public Long getAccountId() { - return accountId.getValue(); + public String getAccountId() { + return accountId; } - public void setAccountId(long accountId) { - this.accountId.setValue(accountId); + public void setAccountId(String accountId) { + this.accountId = accountId; } public String getResultString() { @@ -174,12 +170,12 @@ public class ExtractResponse extends BaseResponse { this.storage = storage; } - public Long getZoneId() { - return zoneId.getValue(); + public String getZoneId() { + return zoneId; } - public void setZoneId(Long zoneId) { - this.zoneId.setValue(zoneId); + public void setZoneId(String zoneId) { + this.zoneId = zoneId; } public String getZoneName() { diff --git a/api/src/org/apache/cloudstack/api/response/FirewallRuleResponse.java b/api/src/org/apache/cloudstack/api/response/FirewallRuleResponse.java index 040878abe8f..4dae4c5b857 100644 --- a/api/src/org/apache/cloudstack/api/response/FirewallRuleResponse.java +++ b/api/src/org/apache/cloudstack/api/response/FirewallRuleResponse.java @@ -67,6 +67,12 @@ public class FirewallRuleResponse extends BaseResponse { @SerializedName(ApiConstants.TAGS) @Param(description="the list of resource tags associated with the rule", responseObject = ResourceTagResponse.class) private List tags; + + @Override + public String getObjectId() { + return this.getId(); + } + public String getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/HostResponse.java b/api/src/org/apache/cloudstack/api/response/HostResponse.java index e4aae571058..39309caef6c 100644 --- a/api/src/org/apache/cloudstack/api/response/HostResponse.java +++ b/api/src/org/apache/cloudstack/api/response/HostResponse.java @@ -160,6 +160,11 @@ public class HostResponse extends BaseResponse { private Boolean haHost; + @Override + public String getObjectId() { + return this.getId(); + } + public String getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java b/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java index d614e34db1a..18d32068e6b 100644 --- a/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java +++ b/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java @@ -117,6 +117,11 @@ public class IPAddressResponse extends BaseResponse implements ControlledEntityR this.ipAddress = ipAddress; } + @Override + public String getObjectId() { + return this.getId(); + } + public void setAllocated(Date allocated) { this.allocated = allocated; } diff --git a/api/src/org/apache/cloudstack/api/response/IsoVmResponse.java b/api/src/org/apache/cloudstack/api/response/IsoVmResponse.java index ddb1c3f30dc..a667e50c5f9 100644 --- a/api/src/org/apache/cloudstack/api/response/IsoVmResponse.java +++ b/api/src/org/apache/cloudstack/api/response/IsoVmResponse.java @@ -55,6 +55,11 @@ public class IsoVmResponse extends BaseResponse { private String virtualMachineState; + @Override + public String getObjectId() { + return this.getId(); + } + public String getOsTypeId() { return osTypeId; } diff --git a/api/src/org/apache/cloudstack/api/response/NicResponse.java b/api/src/org/apache/cloudstack/api/response/NicResponse.java index 1ac00846190..a6ca5b8232d 100644 --- a/api/src/org/apache/cloudstack/api/response/NicResponse.java +++ b/api/src/org/apache/cloudstack/api/response/NicResponse.java @@ -68,10 +68,6 @@ public class NicResponse extends BaseResponse { this.id = id; } - @Override - public String getObjectUuid() { - return this.getId(); - } public void setNetworkid(String networkid) { this.networkId = networkid; diff --git a/api/src/org/apache/cloudstack/api/response/PhysicalNetworkResponse.java b/api/src/org/apache/cloudstack/api/response/PhysicalNetworkResponse.java index 4f7f832c60d..0f1e166ef4b 100644 --- a/api/src/org/apache/cloudstack/api/response/PhysicalNetworkResponse.java +++ b/api/src/org/apache/cloudstack/api/response/PhysicalNetworkResponse.java @@ -60,6 +60,13 @@ public class PhysicalNetworkResponse extends BaseResponse { @SerializedName(ApiConstants.NETWORK_SPEED) @Param(description="the speed of the physical network") private String networkSpeed; + + @Override + public String getObjectId() { + return this.id; + + } + public void setId(String uuid) { this.id = uuid; } diff --git a/api/src/org/apache/cloudstack/api/response/PrivateGatewayResponse.java b/api/src/org/apache/cloudstack/api/response/PrivateGatewayResponse.java index fb5c9890f9f..143a61aa618 100644 --- a/api/src/org/apache/cloudstack/api/response/PrivateGatewayResponse.java +++ b/api/src/org/apache/cloudstack/api/response/PrivateGatewayResponse.java @@ -72,6 +72,11 @@ public class PrivateGatewayResponse extends BaseResponse implements ControlledEn private String state; + @Override + public String getObjectId() { + return this.id; + } + public void setId(String id) { this.id = id; } diff --git a/api/src/org/apache/cloudstack/api/response/SecurityGroupResponse.java b/api/src/org/apache/cloudstack/api/response/SecurityGroupResponse.java index 6900ca519bf..049709e4e20 100644 --- a/api/src/org/apache/cloudstack/api/response/SecurityGroupResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SecurityGroupResponse.java @@ -69,11 +69,15 @@ public class SecurityGroupResponse extends BaseResponse implements ControlledVie this.tags = new HashSet(); } + + @Override - public String getObjectUuid() { + public String getObjectId() { return this.getId(); } + + public String getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java b/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java index 28d768d51a2..1c06b0a95bf 100644 --- a/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java @@ -85,6 +85,11 @@ public class SnapshotResponse extends BaseResponse implements ControlledEntityRe private List tags; + @Override + public String getObjectId() { + return this.getId(); + } + private String getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/StaticRouteResponse.java b/api/src/org/apache/cloudstack/api/response/StaticRouteResponse.java index e7de3209734..54831fe4a49 100644 --- a/api/src/org/apache/cloudstack/api/response/StaticRouteResponse.java +++ b/api/src/org/apache/cloudstack/api/response/StaticRouteResponse.java @@ -62,6 +62,12 @@ public class StaticRouteResponse extends BaseResponse implements ControlledEntit responseObject = ResourceTagResponse.class) private List tags; + + @Override + public String getObjectId() { + return this.id; + } + public void setId(String id) { this.id = id; } diff --git a/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java b/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java index 12676687873..707c852d262 100644 --- a/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java +++ b/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java @@ -80,6 +80,12 @@ public class StoragePoolResponse extends BaseResponse { private StoragePoolStatus state; + + @Override + public String getObjectId() { + return this.getId(); + } + public String getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java index 6a8e79d92cd..806cada0877 100644 --- a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java @@ -108,15 +108,15 @@ public class SystemVmResponse extends BaseResponse { @SerializedName("activeviewersessions") @Param(description="the number of active console sessions for the console proxy system vm") private Integer activeViewerSessions; - private Long objectId; + // private Long objectId; - public Long getObjectId() { - return objectId; + + + @Override + public String getObjectId() { + return this.getId(); } - public void setObjectId(Long objectId) { - this.objectId = objectId; - } public String getId() { return id; diff --git a/api/src/org/apache/cloudstack/api/response/TemplateResponse.java b/api/src/org/apache/cloudstack/api/response/TemplateResponse.java index 785b647a9e4..d9daf3ac27d 100644 --- a/api/src/org/apache/cloudstack/api/response/TemplateResponse.java +++ b/api/src/org/apache/cloudstack/api/response/TemplateResponse.java @@ -135,6 +135,11 @@ public class TemplateResponse extends BaseResponse implements ControlledEntityRe + @Override + public String getObjectId() { + return this.getId(); + } + public String getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/TrafficTypeResponse.java b/api/src/org/apache/cloudstack/api/response/TrafficTypeResponse.java index b2f6e946b35..6f88d9c025c 100644 --- a/api/src/org/apache/cloudstack/api/response/TrafficTypeResponse.java +++ b/api/src/org/apache/cloudstack/api/response/TrafficTypeResponse.java @@ -41,6 +41,12 @@ public class TrafficTypeResponse extends BaseResponse { @SerializedName(ApiConstants.VMWARE_NETWORK_LABEL) @Param(description="The network name label of the physical device dedicated to this traffic on a VMware host") private String vmwareNetworkLabel; + + @Override + public String getObjectId() { + return this.id; + } + public void setPhysicalNetworkId(String physicalNetworkId) { this.physicalNetworkId = physicalNetworkId; } diff --git a/api/src/org/apache/cloudstack/api/response/UserResponse.java b/api/src/org/apache/cloudstack/api/response/UserResponse.java index 8c070fd5eb8..6f1badf92a2 100644 --- a/api/src/org/apache/cloudstack/api/response/UserResponse.java +++ b/api/src/org/apache/cloudstack/api/response/UserResponse.java @@ -72,6 +72,12 @@ public class UserResponse extends BaseResponse { @SerializedName("accountid") @Param(description="the account ID of the user") private String accountId; + + @Override + public String getObjectId() { + return this.getId(); + } + public String getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/UserVmResponse.java b/api/src/org/apache/cloudstack/api/response/UserVmResponse.java index 767ee0f4a7e..d90362b29d7 100644 --- a/api/src/org/apache/cloudstack/api/response/UserVmResponse.java +++ b/api/src/org/apache/cloudstack/api/response/UserVmResponse.java @@ -185,8 +185,10 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp return this.id; } + + @Override - public String getObjectUuid() { + public String getObjectId() { return this.getId(); } diff --git a/api/src/org/apache/cloudstack/api/response/VolumeResponse.java b/api/src/org/apache/cloudstack/api/response/VolumeResponse.java index 730314a6a3c..1c6f4f3db96 100644 --- a/api/src/org/apache/cloudstack/api/response/VolumeResponse.java +++ b/api/src/org/apache/cloudstack/api/response/VolumeResponse.java @@ -157,6 +157,11 @@ public class VolumeResponse extends BaseResponse implements ControlledEntityResp + @Override + public String getObjectId() { + return this.getId(); + } + public Boolean getDestroyed() { return destroyed; } diff --git a/api/src/org/apache/cloudstack/query/QueryService.java b/api/src/org/apache/cloudstack/query/QueryService.java index 1bc04f313c4..da526e0539f 100644 --- a/api/src/org/apache/cloudstack/query/QueryService.java +++ b/api/src/org/apache/cloudstack/query/QueryService.java @@ -39,6 +39,7 @@ import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; +import com.cloud.async.AsyncJob; import com.cloud.exception.PermissionDeniedException; import com.cloud.storage.Snapshot; @@ -69,6 +70,5 @@ public interface QueryService { public ListResponse listProjectAccounts(ListProjectAccountsCmd cmd); - public Snapshot findSnapshotById(long snapshotId); } diff --git a/core/src/com/cloud/storage/UploadVO.java b/core/src/com/cloud/storage/UploadVO.java index b39553e8638..95f66e71b06 100755 --- a/core/src/com/cloud/storage/UploadVO.java +++ b/core/src/com/cloud/storage/UploadVO.java @@ -38,47 +38,50 @@ public class UploadVO implements Upload { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) long id; - + + @Column(name="uuid") + private String uuid; + @Column(name="host_id") private long hostId; - + @Column(name="type_id") private long typeId; - + @Column(name=GenericDaoBase.CREATED_COLUMN) private Date created = null; - + @Column(name="last_updated") @Temporal(value=TemporalType.TIMESTAMP) - private Date lastUpdated = null; - + private Date lastUpdated = null; + @Column (name="upload_pct") - private int uploadPercent; - + private int uploadPercent; + @Column (name="type") @Enumerated(EnumType.STRING) private Type type; - + @Column (name="mode") @Enumerated(EnumType.STRING) private Mode mode = Mode.FTP_UPLOAD; - + @Column (name="upload_state") @Enumerated(EnumType.STRING) private Status uploadState; - + @Column (name="error_str") private String errorString; @Column (name="job_id") private String jobId; - + @Column (name="url") private String uploadUrl; @Column (name="install_path") private String installPath; - + @Override public long getHostId() { return hostId; @@ -93,7 +96,12 @@ public class UploadVO implements Upload { return id; } - @Override + + public String getUuid() { + return uuid; + } + + @Override public Date getCreated() { return created; } @@ -102,7 +110,7 @@ public class UploadVO implements Upload { public Date getLastUpdated() { return lastUpdated; } - + public void setLastUpdated(Date date) { lastUpdated = date; } @@ -125,7 +133,7 @@ public class UploadVO implements Upload { this.type = type; this.uploadUrl = uploadUrl; } - + public UploadVO(long hostId, long typeId, Date lastUpdated, Status uploadState, int uploadPercent, Type type, Mode mode) { @@ -139,7 +147,7 @@ public class UploadVO implements Upload { this.mode = mode; } - protected UploadVO() { + protected UploadVO() { } public UploadVO(Long uploadId) { @@ -219,7 +227,7 @@ public class UploadVO implements Upload { return mode; } - public void setMode(Mode mode) { + public void setMode(Mode mode) { this.mode = mode; } diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 960ee5454be..2aaee2e2fc5 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -52,8 +52,10 @@ import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; +import com.cloud.async.AsyncJob; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; +import com.cloud.async.dao.AsyncJobDao; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity; @@ -95,6 +97,7 @@ import com.cloud.network.NetworkManager; import com.cloud.network.NetworkProfile; import com.cloud.network.NetworkRuleConfigVO; import com.cloud.network.NetworkVO; +import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.PhysicalNetworkVO; import com.cloud.network.Site2SiteVpnGatewayVO; import com.cloud.network.Site2SiteCustomerGatewayVO; @@ -311,6 +314,7 @@ public class ApiDBUtils { private static VpcDao _vpcDao; private static VpcOfferingDao _vpcOfferingDao; private static SnapshotPolicyDao _snapshotPolicyDao; + private static AsyncJobDao _asyncJobDao; static { _ms = (ManagementServer) ComponentLocator.getComponent(ManagementServer.Name); @@ -397,6 +401,7 @@ public class ApiDBUtils { _vpcDao = locator.getDao(VpcDao.class); _vpcOfferingDao = locator.getDao(VpcOfferingDao.class); _snapshotPolicyDao = locator.getDao(SnapshotPolicyDao.class); + _asyncJobDao = locator.getDao(AsyncJobDao.class); // Note: stats collector should already have been initialized by this time, otherwise a null instance is returned _statsCollector = StatsCollector.getInstance(); @@ -1044,6 +1049,130 @@ public class ApiDBUtils { public static VpcOffering findVpcOfferingById(long offeringId){ return _vpcOfferingDao.findById(offeringId); } + + + public static AsyncJob findAsyncJobById(long jobId){ + return _asyncJobDao.findById(jobId); + } + + public static String findJobInstanceUuid(AsyncJob job){ + if ( job == null ) + return null; + String jobInstanceId = null; + if (job.getInstanceType() == AsyncJob.Type.Volume) { + VolumeVO volume = ApiDBUtils.findVolumeById(job.getInstanceId()); + if (volume != null) { + jobInstanceId = volume.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.Template || job.getInstanceType() == AsyncJob.Type.Iso) { + VMTemplateVO template = ApiDBUtils.findTemplateById(job.getInstanceId()); + if (template != null) { + jobInstanceId = template.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.VirtualMachine || job.getInstanceType() == AsyncJob.Type.ConsoleProxy + || job.getInstanceType() == AsyncJob.Type.SystemVm || job.getInstanceType() == AsyncJob.Type.DomainRouter) { + VMInstanceVO vm = ApiDBUtils.findVMInstanceById(job.getInstanceId()); + if (vm != null) { + jobInstanceId = vm.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.Snapshot) { + Snapshot snapshot = ApiDBUtils.findSnapshotById(job.getInstanceId()); + if (snapshot != null) { + jobInstanceId = snapshot.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.Host) { + Host host = ApiDBUtils.findHostById(job.getInstanceId()); + if (host != null) { + jobInstanceId = host.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.StoragePool) { + StoragePoolVO spool = ApiDBUtils.findStoragePoolById(job.getInstanceId()); + if (spool != null) { + jobInstanceId = spool.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.IpAddress) { + IPAddressVO ip = ApiDBUtils.findIpAddressById(job.getInstanceId()); + if (ip != null) { + jobInstanceId = ip.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.SecurityGroup) { + SecurityGroup sg = ApiDBUtils.findSecurityGroupById(job.getInstanceId()); + if (sg != null) { + jobInstanceId = sg.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.PhysicalNetwork) { + PhysicalNetworkVO pnet = ApiDBUtils.findPhysicalNetworkById(job.getInstanceId()); + if (pnet != null) { + jobInstanceId = pnet.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.TrafficType) { + PhysicalNetworkTrafficTypeVO trafficType = ApiDBUtils.findPhysicalNetworkTrafficTypeById(job.getInstanceId()); + if (trafficType != null) { + jobInstanceId = trafficType.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.PhysicalNetworkServiceProvider) { + PhysicalNetworkServiceProvider sp = ApiDBUtils.findPhysicalNetworkServiceProviderById(job.getInstanceId()); + if (sp != null) { + jobInstanceId = sp.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.FirewallRule) { + FirewallRuleVO fw = ApiDBUtils.findFirewallRuleById(job.getInstanceId()); + if (fw != null) { + jobInstanceId = fw.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.Account) { + Account acct = ApiDBUtils.findAccountById(job.getInstanceId()); + if (acct != null) { + jobInstanceId = acct.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.User) { + User usr = ApiDBUtils.findUserById(job.getInstanceId()); + if (usr != null) { + jobInstanceId = usr.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.StaticRoute) { + StaticRouteVO route = ApiDBUtils.findStaticRouteById(job.getInstanceId()); + if (route != null) { + jobInstanceId = route.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.PrivateGateway) { + VpcGatewayVO gateway = ApiDBUtils.findVpcGatewayById(job.getInstanceId()); + if (gateway != null) { + jobInstanceId = gateway.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.Counter) { + CounterVO counter = ApiDBUtils.getCounter(job.getInstanceId()); + if (counter != null) { + jobInstanceId = counter.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.Condition) { + ConditionVO condition = ApiDBUtils.findConditionById(job.getInstanceId()); + if (condition != null) { + jobInstanceId = condition.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.AutoScalePolicy) { + AutoScalePolicyVO policy = ApiDBUtils.findAutoScalePolicyById(job.getInstanceId()); + if (policy != null) { + jobInstanceId = policy.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.AutoScaleVmProfile) { + AutoScaleVmProfileVO profile = ApiDBUtils.findAutoScaleVmProfileById(job.getInstanceId()); + if (profile != null) { + jobInstanceId = profile.getUuid(); + } + } else if (job.getInstanceType() == AsyncJob.Type.AutoScaleVmGroup) { + AutoScaleVmGroupVO group = ApiDBUtils.findAutoScaleVmGroupById(job.getInstanceId()); + if (group != null) { + jobInstanceId = group.getUuid(); + } + } else if (job.getInstanceType() != AsyncJob.Type.None) { + // TODO : when we hit here, we need to add instanceType -> UUID + // entity table mapping + assert (false); + } + return jobInstanceId; + } + /////////////////////////////////////////////////////////////////////// // Newly Added Utility Methods for List API refactoring // /////////////////////////////////////////////////////////////////////// diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index c602577ac9b..5640ab7f22d 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -1480,7 +1480,7 @@ public class ApiResponseHelper implements ResponseGenerator { 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()); @@ -2089,16 +2089,19 @@ public class ApiResponseHelper implements ResponseGenerator { UploadVO uploadInfo = ApiDBUtils.findUploadById(uploadId); ExtractResponse response = new ExtractResponse(); response.setObjectName("template"); - response.setId(id); - response.setName(ApiDBUtils.findTemplateById(id).getName()); + VMTemplateVO template = ApiDBUtils.findTemplateById(id); + response.setId(template.getUuid()); + response.setName(template.getName()); if (zoneId != null) { - response.setZoneId(zoneId); - response.setZoneName(ApiDBUtils.findZoneById(zoneId).getName()); + DataCenter zone = ApiDBUtils.findZoneById(zoneId); + response.setZoneId(zone.getUuid()); + response.setZoneName(zone.getName()); } response.setMode(mode); - response.setUploadId(uploadId); + response.setUploadId(uploadInfo.getUuid()); response.setState(uploadInfo.getUploadState().toString()); - response.setAccountId(accountId); + Account account = ApiDBUtils.findAccountById(accountId); + response.setAccountId(account.getUuid()); response.setUrl(uploadInfo.getUploadUrl()); return response; @@ -2122,124 +2125,14 @@ public class ApiResponseHelper implements ResponseGenerator { } jobResponse.setCmd(job.getCmd()); jobResponse.setCreated(job.getCreated()); - jobResponse.setJobId(job.getId()); + jobResponse.setJobId(job.getUuid()); jobResponse.setJobStatus(job.getStatus()); jobResponse.setJobProcStatus(job.getProcessStatus()); if (job.getInstanceType() != null && job.getInstanceId() != null) { jobResponse.setJobInstanceType(job.getInstanceType().toString()); - String jobInstanceId = null; - if (job.getInstanceType() == AsyncJob.Type.Volume) { - VolumeVO volume = ApiDBUtils.findVolumeById(job.getInstanceId()); - if (volume != null) { - jobInstanceId = volume.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.Template || job.getInstanceType() == AsyncJob.Type.Iso) { - VMTemplateVO template = ApiDBUtils.findTemplateById(job.getInstanceId()); - if (template != null) { - jobInstanceId = template.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.VirtualMachine || job.getInstanceType() == AsyncJob.Type.ConsoleProxy - || job.getInstanceType() == AsyncJob.Type.SystemVm || job.getInstanceType() == AsyncJob.Type.DomainRouter) { - VMInstanceVO vm = ApiDBUtils.findVMInstanceById(job.getInstanceId()); - if (vm != null) { - jobInstanceId = vm.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.Snapshot) { - Snapshot snapshot = ApiDBUtils.findSnapshotById(job.getInstanceId()); - if (snapshot != null) { - jobInstanceId = snapshot.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.Host) { - Host host = ApiDBUtils.findHostById(job.getInstanceId()); - if (host != null) { - jobInstanceId = host.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.StoragePool) { - StoragePoolVO spool = ApiDBUtils.findStoragePoolById(job.getInstanceId()); - if (spool != null) { - jobInstanceId = spool.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.IpAddress) { - IPAddressVO ip = ApiDBUtils.findIpAddressById(job.getInstanceId()); - if (ip != null) { - jobInstanceId = ip.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.SecurityGroup) { - SecurityGroup sg = ApiDBUtils.findSecurityGroupById(job.getInstanceId()); - if (sg != null) { - jobInstanceId = sg.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.PhysicalNetwork) { - PhysicalNetworkVO pnet = ApiDBUtils.findPhysicalNetworkById(job.getInstanceId()); - if (pnet != null) { - jobInstanceId = pnet.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.TrafficType) { - PhysicalNetworkTrafficTypeVO trafficType = ApiDBUtils.findPhysicalNetworkTrafficTypeById(job.getInstanceId()); - if (trafficType != null) { - jobInstanceId = trafficType.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.PhysicalNetworkServiceProvider) { - PhysicalNetworkServiceProvider sp = ApiDBUtils.findPhysicalNetworkServiceProviderById(job.getInstanceId()); - if (sp != null) { - jobInstanceId = sp.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.FirewallRule) { - FirewallRuleVO fw = ApiDBUtils.findFirewallRuleById(job.getInstanceId()); - if (fw != null) { - jobInstanceId = fw.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.Account) { - Account acct = ApiDBUtils.findAccountById(job.getInstanceId()); - if (acct != null) { - jobInstanceId = acct.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.User) { - User usr = ApiDBUtils.findUserById(job.getInstanceId()); - if (usr != null) { - jobInstanceId = usr.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.StaticRoute) { - StaticRouteVO route = ApiDBUtils.findStaticRouteById(job.getInstanceId()); - if (route != null) { - jobInstanceId = route.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.PrivateGateway) { - VpcGatewayVO gateway = ApiDBUtils.findVpcGatewayById(job.getInstanceId()); - if (gateway != null) { - jobInstanceId = gateway.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.Counter) { - CounterVO counter = ApiDBUtils.getCounter(job.getInstanceId()); - if (counter != null) { - jobInstanceId = counter.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.Condition) { - ConditionVO condition = ApiDBUtils.findConditionById(job.getInstanceId()); - if (condition != null) { - jobInstanceId = condition.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.AutoScalePolicy) { - AutoScalePolicyVO policy = ApiDBUtils.findAutoScalePolicyById(job.getInstanceId()); - if (policy != null) { - jobInstanceId = policy.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.AutoScaleVmProfile) { - AutoScaleVmProfileVO profile = ApiDBUtils.findAutoScaleVmProfileById(job.getInstanceId()); - if (profile != null) { - jobInstanceId = profile.getUuid(); - } - } else if (job.getInstanceType() == AsyncJob.Type.AutoScaleVmGroup) { - AutoScaleVmGroupVO group = ApiDBUtils.findAutoScaleVmGroupById(job.getInstanceId()); - if (group != null) { - jobInstanceId = group.getUuid(); - } - } else if (job.getInstanceType() != AsyncJob.Type.None) { - // TODO : when we hit here, we need to add instanceType -> UUID - // entity table mapping - assert (false); - } + String jobInstanceId = ApiDBUtils.findJobInstanceUuid(job); + if (jobInstanceId != null) { jobResponse.setJobInstanceId(jobInstanceId); } diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index e685aef4b3e..651de7ff67f 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -51,6 +51,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.cloudstack.api.*; +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.vm.ListVMsCmd; import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd; @@ -85,6 +86,8 @@ import org.apache.http.protocol.ResponseServer; import org.apache.log4j.Logger; import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; +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 com.cloud.acl.ControlledEntity; @@ -454,7 +457,10 @@ public class ApiServer implements HttpRequestHandler { && !(cmdObj instanceof ListSecurityGroupsCmd) && !(cmdObj instanceof ListTagsCmd) && !(cmdObj instanceof ListEventsCmd) - && !(cmdObj instanceof ListVMGroupsCmd)) { + && !(cmdObj instanceof ListVMGroupsCmd) + && !(cmdObj instanceof ListProjectsCmd) + && !(cmdObj instanceof ListProjectAccountsCmd) + && !(cmdObj instanceof ListProjectInvitationsCmd)) { buildAsyncListResponse((BaseListCmd) cmdObj, caller); } @@ -479,17 +485,22 @@ public class ApiServer implements HttpRequestHandler { return; } - // Using maps might possibly be more efficient if the set is large enough but for now, we'll just do a - // comparison of two lists. Either way, there shouldn't be too many async jobs active for the account. + Map objectJobMap = new HashMap(); for (AsyncJob job : jobs) { if (job.getInstanceId() == null) { continue; } - for (ResponseObject response : responses) { - if (response.getObjectId() != null && job.getInstanceId().longValue() == response.getObjectId().longValue()) { - response.setJobId(job.getId()); - response.setJobStatus(job.getStatus()); - } + String instanceUuid = ApiDBUtils.findJobInstanceUuid(job); + if (instanceUuid != null) { + objectJobMap.put(instanceUuid, job); + } + } + + for (ResponseObject response : responses) { + if (response.getObjectId() != null && objectJobMap.containsKey(response.getObjectId())) { + AsyncJob job = objectJobMap.get(response.getObjectId()); + response.setJobId(job.getUuid()); + response.setJobStatus(job.getStatus()); } } } diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index 4cad6c3b66e..b9ed92a3069 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -71,6 +71,7 @@ import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; +import com.cloud.async.AsyncJob; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; @@ -1308,10 +1309,5 @@ public class QueryManagerImpl implements QueryService, Manager { return _projectAccountJoinDao.searchAndCount(sc, searchFilter); } - @Override - public Snapshot findSnapshotById(long snapshotId) { - return ApiDBUtils.findSnapshotById(snapshotId); - } - } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index ddf91dc3500..8c73bad98a6 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2891,8 +2891,10 @@ public class ManagementServerImpl implements ManagementServer { uploadJob = _uploadDao.createForUpdate(uploadJob.getId()); // Update the async Job - ExtractResponse resultObj = new ExtractResponse(volumeId, volume.getName(), accountId, UploadVO.Status.COPY_IN_PROGRESS.toString(), - uploadJob.getId()); + + ExtractResponse resultObj = new ExtractResponse(ApiDBUtils.findVolumeById(volumeId).getUuid(), + volume.getName(), ApiDBUtils.findAccountById(accountId).getUuid(), UploadVO.Status.COPY_IN_PROGRESS.toString(), + uploadJob.getUuid()); resultObj.setResponseName(cmd.getCommandName()); AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); if (asyncExecutor != null) { diff --git a/server/src/com/cloud/storage/upload/UploadListener.java b/server/src/com/cloud/storage/upload/UploadListener.java index 4303e437bb6..ee13cf9b0d8 100755 --- a/server/src/com/cloud/storage/upload/UploadListener.java +++ b/server/src/com/cloud/storage/upload/UploadListener.java @@ -42,6 +42,8 @@ import com.cloud.agent.api.storage.UploadProgressCommand; import com.cloud.agent.api.storage.UploadProgressCommand.RequestType; import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd; import org.apache.cloudstack.api.response.ExtractResponse; + +import com.cloud.api.ApiDBUtils; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobResult; import com.cloud.exception.AgentUnavailableException; @@ -55,12 +57,12 @@ import com.cloud.storage.upload.UploadState.UploadEvent; import com.cloud.utils.exception.CloudRuntimeException; public class UploadListener implements Listener { - + private static final class StatusTask extends TimerTask { private final UploadListener ul; private final RequestType reqType; - + public StatusTask( UploadListener ul, RequestType req) { this.reqType = req; this.ul = ul; @@ -72,10 +74,10 @@ public class UploadListener implements Listener { } } - + private static final class TimeoutTask extends TimerTask { private final UploadListener ul; - + public TimeoutTask( UploadListener ul) { this.ul = ul; } @@ -89,13 +91,13 @@ public class UploadListener implements Listener { public static final Logger s_logger = Logger.getLogger(UploadListener.class.getName()); public static final int SMALL_DELAY = 100; public static final long STATUS_POLL_INTERVAL = 10000L; - + public static final String UPLOADED=Status.UPLOADED.toString(); public static final String NOT_UPLOADED=Status.NOT_UPLOADED.toString(); public static final String UPLOAD_ERROR=Status.UPLOAD_ERROR.toString(); public static final String UPLOAD_IN_PROGRESS=Status.UPLOAD_IN_PROGRESS.toString(); public static final String UPLOAD_ABANDONED=Status.ABANDONED.toString(); - public static final Map responseNameMap; + public static final Map responseNameMap; static{ MaptempMap = new HashMap(); tempMap.put(Type.ISO.toString(), ExtractIsoCmd.getStaticName()); @@ -106,16 +108,16 @@ public class UploadListener implements Listener { } - private HostVO sserver; - + private HostVO sserver; + private boolean uploadActive = true; - + private UploadDao uploadDao; - + private final UploadMonitorImpl uploadMonitor; - + private UploadState currState; - + private UploadCommand cmd; private Timer timer; @@ -131,7 +133,7 @@ public class UploadListener implements Listener { private long eventId; private AsyncJobManager asyncMgr; private ExtractResponse resultObj; - + public AsyncJobManager getAsyncMgr() { return asyncMgr; } @@ -157,12 +159,12 @@ public class UploadListener implements Listener { } private final Map stateMap = new HashMap(); - private Long uploadId; - + private Long uploadId; + public UploadListener(HostVO host, Timer _timer, UploadDao uploadDao, UploadVO uploadObj, UploadMonitorImpl uploadMonitor, UploadCommand cmd, Long accountId, String typeName, Type type, long eventId, long asyncJobId, AsyncJobManager asyncMgr) { - this.sserver = host; + this.sserver = host; this.uploadDao = uploadDao; this.uploadMonitor = uploadMonitor; this.cmd = cmd; @@ -178,15 +180,23 @@ public class UploadListener implements Listener { this.eventId = eventId; this.asyncJobId = asyncJobId; this.asyncMgr = asyncMgr; - this.resultObj = new ExtractResponse(uploadObj.getTypeId(), typeName, accountId, Status.NOT_UPLOADED.toString(), uploadId); + String extractId = null; + if ( type == Type.VOLUME ){ + extractId = ApiDBUtils.findVolumeById(uploadObj.getTypeId()).getUuid(); + } + else{ + extractId = ApiDBUtils.findTemplateById(uploadObj.getTypeId()).getUuid(); + } + this.resultObj = new ExtractResponse(extractId, typeName, ApiDBUtils.findAccountById(accountId).getUuid(), Status.NOT_UPLOADED.toString(), + ApiDBUtils.findUploadById(uploadId).getUuid()); resultObj.setResponseName(responseNameMap.get(type.toString())); updateDatabase(Status.NOT_UPLOADED, cmd.getUrl(),""); } - + public UploadListener(UploadMonitorImpl monitor) { uploadMonitor = monitor; - } - + } + public void checkProgress() { transition(UploadEvent.TIMEOUT_CHECK, null); } @@ -204,15 +214,15 @@ public class UploadListener implements Listener { public void setCommand(UploadCommand _cmd) { this.cmd = _cmd; } - + public void setJobId(String _jobId) { this.jobId = _jobId; } - + public String getJobId() { return jobId; } - + @Override public boolean processAnswers(long agentId, long seq, Answer[] answers) { boolean processed = false; @@ -230,7 +240,7 @@ public class UploadListener implements Listener { } return processed; } - + @Override public boolean processCommands(long agentId, long seq, Command[] commands) { @@ -238,13 +248,13 @@ public class UploadListener implements Listener { } @Override - public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) { + public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) { if (!(cmd instanceof StartupStorageCommand)) { return; } - + long agentId = agent.getId(); - + StartupStorageCommand storage = (StartupStorageCommand)cmd; if (storage.getResourceType() == Storage.StorageResourceType.STORAGE_HOST || storage.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE ) @@ -258,35 +268,35 @@ public class UploadListener implements Listener { AgentControlCommand cmd) { return null; } - + public void setUploadInactive(Status reason) { uploadActive=false; uploadMonitor.handleUploadEvent(sserver, accountId, typeName, type, uploadId, reason, eventId); } - + public void logUploadStart() { //uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO, eventId); } - + public void cancelTimeoutTask() { if (timeoutTask != null) timeoutTask.cancel(); } - + public void cancelStatusTask() { if (statusTask != null) statusTask.cancel(); } @Override - public boolean processDisconnect(long agentId, com.cloud.host.Status state) { + public boolean processDisconnect(long agentId, com.cloud.host.Status state) { setDisconnected(); return true; } @Override - public boolean processTimeout(long agentId, long seq) { + public boolean processTimeout(long agentId, long seq) { return true; } - + private void initStateMachine() { stateMap.put(Status.NOT_UPLOADED.toString(), new NotUploadedState(this)); stateMap.put(Status.UPLOADED.toString(), new UploadCompleteState(this)); @@ -294,7 +304,7 @@ public class UploadListener implements Listener { stateMap.put(Status.UPLOAD_IN_PROGRESS.toString(), new UploadInProgressState(this)); stateMap.put(Status.ABANDONED.toString(), new UploadAbandonedState(this)); } - + private UploadState getState(String stateName) { return stateMap.get(stateName); } @@ -316,15 +326,15 @@ public class UploadListener implements Listener { throw new CloudRuntimeException("Unhandled event transition: currState="+prevName+", evt="+event); } } - + public Date getLastUpdated() { return lastUpdated; } - + public void setLastUpdated() { lastUpdated = new Date(); } - + public void log(String message, Level level) { s_logger.log(level, message + ", " + type.toString() + " = " + typeName + " at host " + sserver.getName()); } @@ -332,7 +342,7 @@ public class UploadListener implements Listener { public void setDisconnected() { transition(UploadEvent.DISCONNECT, null); } - + public void scheduleStatusCheck(com.cloud.agent.api.storage.UploadProgressCommand.RequestType getStatus) { if (statusTask != null) statusTask.cancel(); @@ -349,27 +359,27 @@ public class UploadListener implements Listener { log("Scheduling timeout at " + delay + " ms", Level.DEBUG); } } - + public void updateDatabase(Status state, String uploadErrorString) { resultObj.setResultString(uploadErrorString); resultObj.setState(state.toString()); asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); - + UploadVO vo = uploadDao.createForUpdate(); vo.setUploadState(state); vo.setLastUpdated(new Date()); vo.setErrorString(uploadErrorString); uploadDao.update(getUploadId(), vo); } - + public void updateDatabase(Status state, String uploadUrl,String uploadErrorString) { resultObj.setResultString(uploadErrorString); resultObj.setState(state.toString()); asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); - - + + UploadVO vo = uploadDao.createForUpdate(); vo.setUploadState(state); vo.setLastUpdated(new Date()); @@ -377,23 +387,23 @@ public class UploadListener implements Listener { vo.setJobId(null); vo.setUploadPercent(0); vo.setErrorString(uploadErrorString); - + uploadDao.update(getUploadId(), vo); } - + private Long getUploadId() { return uploadId; } - public synchronized void updateDatabase(UploadAnswer answer) { - + public synchronized void updateDatabase(UploadAnswer answer) { + if(answer.getErrorString().startsWith("553")){ answer.setErrorString(answer.getErrorString().concat("Please check if the file name already exists.")); } resultObj.setResultString(answer.getErrorString()); resultObj.setState(answer.getUploadStatus().toString()); resultObj.setUploadPercent(answer.getUploadPct()); - + if (answer.getUploadStatus() == Status.UPLOAD_IN_PROGRESS){ asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); @@ -409,7 +419,7 @@ public class UploadListener implements Listener { updateBuilder.setLastUpdated(new Date()); updateBuilder.setErrorString(answer.getErrorString()); updateBuilder.setJobId(answer.getJobId()); - + uploadDao.update(getUploadId(), updateBuilder); } @@ -425,9 +435,9 @@ public class UploadListener implements Listener { setDisconnected(); } } - + } - + private UploadCommand getCommand() { return cmd; } @@ -435,7 +445,7 @@ public class UploadListener implements Listener { public void logDisconnect() { s_logger.warn("Unable to monitor upload progress of " + typeName + " at host " + sserver.getName()); } - + public void scheduleImmediateStatusCheck(RequestType request) { if (statusTask != null) statusTask.cancel(); statusTask = new StatusTask(this, request); @@ -443,6 +453,6 @@ public class UploadListener implements Listener { } public void setCurrState(Status uploadState) { - this.currState = getState(currState.toString()); + this.currState = getState(currState.toString()); } } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 9891371bbb2..c01a5cdccac 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -2511,6 +2511,7 @@ INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (100,'net SET foreign_key_checks = 1; +ALTER TABLE upload ADD uuid VARCHAR(40); --- DB views for list api --- DROP VIEW IF EXISTS `cloud`.`user_vm_view`;