Skip to content

Commit e40a06d

Browse files
committed
Fix extractTemplateCmd.
1 parent b8c5c67 commit e40a06d

12 files changed

Lines changed: 198 additions & 166 deletions

File tree

api/src/com/cloud/template/TemplateApiService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.cloud.exception.ResourceAllocationException;
3737
import com.cloud.exception.StorageUnavailableException;
3838
import com.cloud.user.Account;
39+
import com.cloud.utils.Pair;
3940
import com.cloud.utils.exception.CloudRuntimeException;
4041

4142
public interface TemplateApiService {
@@ -76,7 +77,7 @@ public interface TemplateApiService {
7677
* - the command specifying the mode and id of the ISO
7778
* @return extractId.
7879
*/
79-
Long extract(ExtractIsoCmd cmd) throws InternalErrorException;
80+
Pair<Long, String> extract(ExtractIsoCmd cmd) throws InternalErrorException;
8081

8182
/**
8283
* Extracts a Template
@@ -85,7 +86,7 @@ public interface TemplateApiService {
8586
* - the command specifying the mode and id of the template
8687
* @return extractId
8788
*/
88-
Long extract(ExtractTemplateCmd cmd) throws InternalErrorException;
89+
Pair<Long, String> extract(ExtractTemplateCmd cmd) throws InternalErrorException;
8990

9091
VirtualMachineTemplate getTemplate(long templateId);
9192

api/src/org/apache/cloudstack/api/ResponseGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ LBHealthCheckResponse createLBHealthCheckPolicyResponse(List<? extends HealthChe
257257

258258
SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group);
259259

260-
ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode);
260+
ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode, String url);
261261

262262
String toSerializedString(CreateCmdResponse response, String responseType);
263263

api/src/org/apache/cloudstack/api/command/user/iso/ExtractIsoCmd.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.cloud.template.VirtualMachineTemplate;
3434
import com.cloud.user.Account;
3535
import com.cloud.user.UserContext;
36+
import com.cloud.utils.Pair;
3637

3738
@APICommand(name = "extractIso", description="Extracts an ISO", responseObject=ExtractResponse.class)
3839
public class ExtractIsoCmd extends BaseAsyncCmd {
@@ -123,9 +124,16 @@ public Long getInstanceId() {
123124
public void execute(){
124125
try {
125126
UserContext.current().setEventDetails(getEventDescription());
126-
Long uploadId = _templateService.extract(this);
127-
if (uploadId != null){
128-
ExtractResponse response = _responseGenerator.createExtractResponse(uploadId, id, zoneId, getEntityOwnerId(), mode);
127+
Pair<Long, String> uploadPair = _templateService.extract(this);
128+
if (uploadPair != null){
129+
ExtractResponse response = null;
130+
if (uploadPair.second() != null ) {
131+
// region-wide image store
132+
response = _responseGenerator.createExtractResponse(null, id, zoneId, getEntityOwnerId(), mode, uploadPair.second());
133+
} else {
134+
// nfs image store
135+
response = _responseGenerator.createExtractResponse(uploadPair.first(), id, zoneId, getEntityOwnerId(), mode, null);
136+
}
129137
response.setResponseName(getCommandName());
130138
response.setObjectName("iso");
131139
this.setResponseObject(response);

api/src/org/apache/cloudstack/api/command/user/template/ExtractTemplateCmd.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.cloud.template.VirtualMachineTemplate;
3535
import com.cloud.user.Account;
3636
import com.cloud.user.UserContext;
37+
import com.cloud.utils.Pair;
3738

3839
@APICommand(name = "extractTemplate", description="Extracts a template", responseObject=ExtractResponse.class)
3940
public class ExtractTemplateCmd extends BaseAsyncCmd {
@@ -125,9 +126,16 @@ public Long getInstanceId() {
125126
public void execute(){
126127
try {
127128
UserContext.current().setEventDetails(getEventDescription());
128-
Long uploadId = _templateService.extract(this);
129-
if (uploadId != null){
130-
ExtractResponse response = _responseGenerator.createExtractResponse(uploadId, id, zoneId, getEntityOwnerId(), mode);
129+
Pair<Long, String> uploadPair = _templateService.extract(this);
130+
if (uploadPair != null){
131+
ExtractResponse response = null;
132+
if (uploadPair.second() != null ) {
133+
// region-wide image store
134+
response = _responseGenerator.createExtractResponse(null, id, zoneId, getEntityOwnerId(), mode, uploadPair.second());
135+
} else {
136+
// nfs image store
137+
response = _responseGenerator.createExtractResponse(uploadPair.first(), id, zoneId, getEntityOwnerId(), mode, null);
138+
}
131139
response.setResponseName(getCommandName());
132140
this.setResponseObject(response);
133141
} else {

engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
public interface EndPoint {
2626
public long getId();
27+
public String getHostAddr();
2728
public Answer sendMessage(Command cmd);
2829
public void sendMessageAsync(Command cmd, AsyncCompletionCallback<Answer> callback);
2930
void sendMessageAsyncWithListener(Command cmd, Listener listner);

engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java renamed to engine/api/src/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java

File renamed without changes.

engine/storage/src/org/apache/cloudstack/storage/LocalHostEndpoint.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,13 @@ public long getId() {
3030
return 0;
3131
}
3232

33+
3334
@Override
35+
public String getHostAddr() {
36+
return "127.0.0.0";
37+
}
38+
39+
@Override
3440
public Answer sendMessage(Command cmd) {
3541
if (cmd instanceof CopyCommand) {
3642
return resource.executeRequest(cmd);
@@ -52,7 +58,7 @@ public void run() {
5258
callback.complete(answer);
5359
}
5460
}
55-
61+
5662
private class CmdRunner2 implements Runnable {
5763
final Command cmd;
5864
final AsyncCompletionCallback<DownloadAnswer> callback;
@@ -71,7 +77,7 @@ public void sendMessageAsync(Command cmd,
7177
AsyncCompletionCallback<Answer> callback) {
7278
executor.schedule(new CmdRunner(cmd, callback), 10, TimeUnit.SECONDS);
7379
}
74-
80+
7581
@Override
7682
public void sendMessageAsyncWithListener(Command cmd, Listener listner) {
7783
if (listner instanceof DownloadListener) {

engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,23 @@ public class RemoteHostEndPoint implements EndPoint {
5151
protected RemoteHostEndPoint() {
5252
executor = Executors.newScheduledThreadPool(10);
5353
}
54-
54+
5555
private void configure(long hostId, String hostAddress) {
5656
this.hostId = hostId;
5757
this.hostAddress = hostAddress;
5858
}
59-
59+
6060
public static RemoteHostEndPoint getHypervisorHostEndPoint(long hostId, String hostAddress) {
6161
RemoteHostEndPoint ep = ComponentContext.inject(RemoteHostEndPoint.class);
6262
ep.configure(hostId, hostAddress);
6363
return ep;
6464
}
65-
65+
66+
@Override
6667
public String getHostAddr() {
6768
return this.hostAddress;
6869
}
69-
70+
7071
public long getId() {
7172
return this.hostId;
7273
}
@@ -85,7 +86,7 @@ public Answer sendMessage(Command cmd) {
8586
}
8687
throw new CloudRuntimeException("Failed to send command, due to Agent:" + getId() + ", " + errMsg);
8788
}
88-
89+
8990
private class CmdRunner implements Runnable {
9091
final Command cmd;
9192
final AsyncCompletionCallback<Answer> callback;
@@ -98,14 +99,14 @@ public void run() {
9899
Answer answer = sendMessage(cmd);
99100
callback.complete(answer);
100101
}
101-
102+
102103
}
103-
104+
104105
@Override
105106
public void sendMessageAsync(Command cmd, AsyncCompletionCallback<Answer> callback) {
106107
executor.schedule(new CmdRunner(cmd, callback), 10, TimeUnit.SECONDS);
107108
}
108-
109+
109110
@Override
110111
public void sendMessageAsyncWithListener(Command cmd, Listener listener) {
111112
try {

server/src/com/cloud/api/ApiResponseHelper.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@
242242
import com.cloud.storage.S3;
243243
import com.cloud.storage.Snapshot;
244244
import com.cloud.storage.SnapshotVO;
245+
import com.cloud.storage.Upload;
245246
import com.cloud.storage.Storage.ImageFormat;
246247
import com.cloud.storage.Storage.StoragePoolType;
247248
import com.cloud.storage.Storage.TemplateType;
@@ -1525,8 +1526,8 @@ public SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group) {
15251526
}
15261527

15271528
@Override
1528-
public ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode) {
1529-
UploadVO uploadInfo = ApiDBUtils.findUploadById(uploadId);
1529+
public ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode, String url) {
1530+
15301531
ExtractResponse response = new ExtractResponse();
15311532
response.setObjectName("template");
15321533
VMTemplateVO template = ApiDBUtils.findTemplateById(id);
@@ -1538,11 +1539,19 @@ public ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId
15381539
response.setZoneName(zone.getName());
15391540
}
15401541
response.setMode(mode);
1541-
response.setUploadId(uploadInfo.getUuid());
1542-
response.setState(uploadInfo.getUploadState().toString());
1542+
if (uploadId == null) {
1543+
// region-wide image store
1544+
response.setUrl(url);
1545+
response.setState(Upload.Status.DOWNLOAD_URL_CREATED.toString());
1546+
} else {
1547+
UploadVO uploadInfo = ApiDBUtils.findUploadById(uploadId);
1548+
response.setUploadId(uploadInfo.getUuid());
1549+
response.setState(uploadInfo.getUploadState().toString());
1550+
response.setUrl(uploadInfo.getUploadUrl());
1551+
}
15431552
Account account = ApiDBUtils.findAccountById(accountId);
15441553
response.setAccountId(account.getUuid());
1545-
response.setUrl(uploadInfo.getUploadUrl());
1554+
15461555
return response;
15471556

15481557
}

server/src/com/cloud/storage/upload/UploadMonitor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package com.cloud.storage.upload;
1818

1919

20+
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
21+
2022
import com.cloud.async.AsyncJobManager;
2123
import com.cloud.host.HostVO;
2224
import com.cloud.storage.Upload.Mode;
@@ -32,12 +34,12 @@
3234
* Monitor upload progress of all entities.
3335
*
3436
*/
35-
public interface UploadMonitor extends Manager{
36-
37+
public interface UploadMonitor extends Manager{
38+
3739
public void cancelAllUploads(Long templateId);
3840

3941
public Long extractTemplate(VMTemplateVO template, String url,
40-
VMTemplateHostVO tmpltHostRef,Long dataCenterId, long eventId, long asyncJobId, AsyncJobManager asyncMgr);
42+
TemplateDataStoreVO tmpltStoreRef,Long dataCenterId, long eventId, long asyncJobId, AsyncJobManager asyncMgr);
4143

4244
boolean isTypeUploadInProgress(Long typeId, Type type);
4345

@@ -51,7 +53,7 @@ void extractVolume(UploadVO uploadVolumeObj, HostVO sserver, VolumeVO volume, St
5153
long asyncJobId, AsyncJobManager asyncMgr);
5254

5355
UploadVO createEntityDownloadURL(VMTemplateVO template,
54-
VMTemplateHostVO vmTemplateHost, Long dataCenterId, long eventId);
56+
TemplateDataStoreVO vmTemplateStore, Long dataCenterId, long eventId);
5557

5658
void createVolumeDownloadURL(Long entityId, String path, Type type,
5759
Long dataCenterId, Long uploadId);

0 commit comments

Comments
 (0)