Skip to content

Commit 83e6888

Browse files
committed
Fixes and improvements
1 parent 8acd7f5 commit 83e6888

File tree

14 files changed

+88
-33
lines changed

14 files changed

+88
-33
lines changed

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,6 @@ public class ApiConstants {
532532
public static final String SHOW_CAPACITIES = "showcapacities";
533533
public static final String SHOW_REMOVED = "showremoved";
534534
public static final String SHOW_RESOURCE_ICON = "showicon";
535-
public static final String SHOW_COMPLETED = "showcompleted";
536535
public static final String SHOW_INACTIVE = "showinactive";
537536
public static final String SHOW_UNIQUE = "showunique";
538537
public static final String SIGNATURE = "signature";

api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ListImportVMTasksCmd.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.cloudstack.api.response.ListResponse;
3636
import org.apache.cloudstack.api.response.ZoneResponse;
3737
import org.apache.cloudstack.context.CallContext;
38+
import org.apache.cloudstack.vm.ImportVmTask;
3839
import org.apache.cloudstack.vm.ImportVmTasksManager;
3940

4041
import javax.inject.Inject;
@@ -75,8 +76,8 @@ public class ListImportVMTasksCmd extends BaseListCmd {
7576
description = "Conversion host of the importing task")
7677
private Long convertHostId;
7778

78-
@Parameter(name = ApiConstants.SHOW_COMPLETED, type = CommandType.BOOLEAN, description = "Whether to list completed tasks.")
79-
private boolean showCompleted = false;
79+
@Parameter(name = ApiConstants.STATE, type = CommandType.STRING, description = "List tasks by status, valid options are: Running, Completed, Failed")
80+
private String state;
8081

8182
public Long getZoneId() {
8283
return zoneId;
@@ -94,8 +95,8 @@ public Long getConvertHostId() {
9495
return convertHostId;
9596
}
9697

97-
public boolean isShowCompleted() {
98-
return showCompleted;
98+
public String getState() {
99+
return state == null ? ImportVmTask.TaskState.Running.name() : state;
99100
}
100101

101102
@Override

api/src/main/java/org/apache/cloudstack/api/response/ImportVMTaskResponse.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ public class ImportVMTaskResponse extends BaseResponse {
5555
@Param(description = "the display name of the importing VM")
5656
private String displayName;
5757

58+
@SerializedName(ApiConstants.STATE)
59+
@Param(description = "the state of the importing VM task")
60+
private String state;
61+
5862
@SerializedName(ApiConstants.VCENTER)
5963
@Param(description = "the vcenter name of the importing VM task")
6064
private String vcenter;
@@ -242,4 +246,12 @@ public Date getLastUpdated() {
242246
public void setLastUpdated(Date lastUpdated) {
243247
this.lastUpdated = lastUpdated;
244248
}
249+
250+
public String getState() {
251+
return state;
252+
}
253+
254+
public void setState(String state) {
255+
this.state = state;
256+
}
245257
}

api/src/main/java/org/apache/cloudstack/vm/ImportVmTask.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@
2323

2424
public interface ImportVmTask extends Identity, InternalIdentity {
2525
enum Step {
26-
Prepare, CloningInstance, ConvertingInstance, Importing, Cleaning, Completed
26+
Prepare, CloningInstance, ConvertingInstance, Importing, Completed
27+
}
28+
29+
enum TaskState {
30+
Running, Completed, Failed;
31+
32+
public static TaskState getValue(String state) {
33+
for (TaskState s : TaskState.values()) {
34+
if (s.name().equalsIgnoreCase(state)) {
35+
return s;
36+
}
37+
}
38+
throw new IllegalArgumentException("Invalid task state: " + state);
39+
}
2740
}
2841
}

api/src/main/java/org/apache/cloudstack/vm/ImportVmTasksManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ ImportVmTask createImportVMTaskRecord(DataCenter zone, Account owner, long userI
3434
void updateImportVMTaskStep(ImportVmTask importVMTaskVO, DataCenter zone, Account owner, Host convertHost,
3535
Host importHost, Long vmId, ImportVmTask.Step step);
3636

37-
boolean removeImportVMTask(long taskId);
37+
void updateImportVMTaskErrorState(ImportVmTask importVMTaskVO, ImportVmTask.TaskState state, String errorMsg);
3838
}

engine/schema/src/main/java/com/cloud/vm/ImportVMTaskVO.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ public ImportVMTaskVO() {
9393
@Column(name = "step")
9494
private Step step;
9595

96+
@Column(name = "state")
97+
private TaskState state;
98+
9699
@Column(name = "description")
97100
private String description;
98101

@@ -217,6 +220,14 @@ public void setStep(Step step) {
217220
this.step = step;
218221
}
219222

223+
public TaskState getState() {
224+
return state;
225+
}
226+
227+
public void setState(TaskState state) {
228+
this.state = state;
229+
}
230+
220231
public String getDescription() {
221232
return description;
222233
}

engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDao.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@
2121
import com.cloud.utils.Pair;
2222
import com.cloud.utils.db.GenericDao;
2323
import com.cloud.vm.ImportVMTaskVO;
24-
24+
import org.apache.cloudstack.vm.ImportVmTask;
2525
import java.util.List;
2626

2727
public interface ImportVMTaskDao extends GenericDao<ImportVMTaskVO, Long> {
2828

29-
Pair<List<ImportVMTaskVO>, Integer> listImportVMTasks(Long zoneId, Long accountId, String vcenter, Long convertHostId, boolean showCompleted, Long startIndex, Long pageSizeVal);
29+
Pair<List<ImportVMTaskVO>, Integer> listImportVMTasks(Long zoneId, Long accountId, String vcenter, Long convertHostId,
30+
ImportVmTask.TaskState state, Long startIndex, Long pageSizeVal);
3031
}

engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.cloud.utils.db.SearchBuilder;
2323
import com.cloud.utils.db.SearchCriteria;
2424
import com.cloud.vm.ImportVMTaskVO;
25+
import org.apache.cloudstack.vm.ImportVmTask;
2526
import org.apache.commons.lang3.StringUtils;
2627
import org.springframework.stereotype.Component;
2728

@@ -43,12 +44,14 @@ void init() {
4344
AllFieldsSearch.and("accountId", AllFieldsSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
4445
AllFieldsSearch.and("vcenter", AllFieldsSearch.entity().getVcenter(), SearchCriteria.Op.EQ);
4546
AllFieldsSearch.and("convertHostId", AllFieldsSearch.entity().getConvertHostId(), SearchCriteria.Op.EQ);
47+
AllFieldsSearch.and("state", AllFieldsSearch.entity().getState(), SearchCriteria.Op.EQ);
4648
AllFieldsSearch.done();
4749
}
4850

4951

5052
@Override
51-
public Pair<List<ImportVMTaskVO>, Integer> listImportVMTasks(Long zoneId, Long accountId, String vcenter, Long convertHostId, boolean showCompleted, Long startIndex, Long pageSizeVal) {
53+
public Pair<List<ImportVMTaskVO>, Integer> listImportVMTasks(Long zoneId, Long accountId, String vcenter, Long convertHostId,
54+
ImportVmTask.TaskState state, Long startIndex, Long pageSizeVal) {
5255
SearchCriteria<ImportVMTaskVO> sc = AllFieldsSearch.create();
5356
if (zoneId != null) {
5457
sc.setParameters("zoneId", zoneId);
@@ -62,7 +65,8 @@ public Pair<List<ImportVMTaskVO>, Integer> listImportVMTasks(Long zoneId, Long a
6265
if (convertHostId != null) {
6366
sc.setParameters("convertHostId", convertHostId);
6467
}
68+
sc.setParameters("state", state);
6569
Filter filter = new Filter(ImportVMTaskVO.class, "created", false, startIndex, pageSizeVal);
66-
return searchAndCount(sc, filter, showCompleted);
70+
return searchAndCount(sc, filter);
6771
}
6872
}

engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ CREATE TABLE IF NOT EXISTS `cloud`.`import_vm_task`(
6262
`source_vm_name` varchar(255) COMMENT 'Source VM name on vCenter',
6363
`convert_host_id` bigint unsigned COMMENT 'Convert Host ID',
6464
`import_host_id` bigint unsigned COMMENT 'Import Host ID',
65-
`step` varchar(20) NOT NULL COMMENT 'Importing VM Task Step',
65+
`step` varchar(20) COMMENT 'Importing VM Task Step',
66+
`state` varchar(20) COMMENT 'Importing VM Task State',
6667
`description` varchar(255) COMMENT 'Importing VM Task Description',
6768
`duration` bigint unsigned COMMENT 'Duration in milliseconds for the completed tasks',
6869
`created` datetime NOT NULL COMMENT 'date created',

server/src/main/java/org/apache/cloudstack/vm/ImportVmTasksManagerImpl.java

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import com.cloud.vm.UserVmVO;
3131
import com.cloud.vm.dao.ImportVMTaskDao;
3232
import com.cloud.vm.dao.UserVmDao;
33+
import org.apache.cloudstack.api.ApiErrorCode;
34+
import org.apache.cloudstack.api.ServerApiException;
3335
import org.apache.cloudstack.api.command.admin.vm.ListImportVMTasksCmd;
3436
import org.apache.cloudstack.api.response.ImportVMTaskResponse;
3537
import org.apache.cloudstack.api.response.ListResponse;
@@ -73,11 +75,17 @@ public ListResponse<ImportVMTaskResponse> listImportVMTasks(ListImportVMTasksCmd
7375
Long accountId = cmd.getAccountId();
7476
String vcenter = cmd.getVcenter();
7577
Long convertHostId = cmd.getConvertHostId();
76-
boolean showCompleted = cmd.isShowCompleted();
7778
Long startIndex = cmd.getStartIndex();
7879
Long pageSizeVal = cmd.getPageSizeVal();
7980

80-
Pair<List<ImportVMTaskVO>, Integer> result = importVMTaskDao.listImportVMTasks(zoneId, accountId, vcenter, convertHostId, showCompleted, startIndex, pageSizeVal);
81+
ImportVmTask.TaskState state;
82+
try {
83+
state = ImportVmTask.TaskState.getValue(cmd.getState());
84+
} catch (IllegalArgumentException e) {
85+
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid value for task state: " + cmd.getState());
86+
}
87+
88+
Pair<List<ImportVMTaskVO>, Integer> result = importVMTaskDao.listImportVMTasks(zoneId, accountId, vcenter, convertHostId, state, startIndex, pageSizeVal);
8189
List<ImportVMTaskVO> tasks = result.first();
8290

8391
List<ImportVMTaskResponse> responses = new ArrayList<>();
@@ -96,6 +104,7 @@ public ImportVmTask createImportVMTaskRecord(DataCenter zone, Account owner, lon
96104
sourceVMName, owner.getAccountName(), zone.getName(), displayName, vcenter, datacenterName);
97105
ImportVMTaskVO importVMTaskVO = new ImportVMTaskVO(zone.getId(), owner.getAccountId(), userId, displayName,
98106
vcenter, datacenterName, sourceVMName, convertHost.getId(), importHost.getId());
107+
importVMTaskVO.setState(ImportVmTask.TaskState.Running);
99108
return importVMTaskDao.persist(importVMTaskVO);
100109
}
101110

@@ -109,7 +118,6 @@ private String getStepDescription(ImportVMTaskVO importVMTaskVO, Host convertHos
109118
if (Completed == step) {
110119
stringBuilder.append("Completed at ").append(DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), updatedDate));
111120
} else {
112-
stringBuilder.append(String.format("[%s] ", DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), updatedDate)));
113121
if (CloningInstance == step) {
114122
stringBuilder.append(String.format("Cloning source instance: %s on vCenter: %s / datacenter: %s", sourceVMName, vcenter, datacenter));
115123
} else if (ConvertingInstance == step) {
@@ -140,13 +148,19 @@ public void updateImportVMTaskStep(ImportVmTask importVMTask, DataCenter zone, A
140148
Duration duration = Duration.between(importVMTaskVO.getCreated().toInstant(), updatedDate.toInstant());
141149
importVMTaskVO.setDuration(duration.toMillis());
142150
importVMTaskVO.setVmId(vmId);
151+
importVMTaskVO.setState(ImportVmTask.TaskState.Completed);
143152
}
144153
importVMTaskDao.update(importVMTaskVO.getId(), importVMTaskVO);
145154
}
146155

147156
@Override
148-
public boolean removeImportVMTask(long taskId) {
149-
return importVMTaskDao.remove(taskId);
157+
public void updateImportVMTaskErrorState(ImportVmTask importVMTask, ImportVmTask.TaskState state, String errorMsg) {
158+
ImportVMTaskVO importVMTaskVO = (ImportVMTaskVO) importVMTask;
159+
Date updatedDate = DateUtil.now();
160+
importVMTaskVO.setUpdated(updatedDate);
161+
importVMTaskVO.setState(state);
162+
importVMTaskVO.setDescription(errorMsg);
163+
importVMTaskDao.update(importVMTaskVO.getId(), importVMTaskVO);
150164
}
151165

152166
private ImportVMTaskResponse createImportVMTaskResponse(ImportVMTaskVO task) {
@@ -167,19 +181,21 @@ private ImportVMTaskResponse createImportVMTaskResponse(ImportVMTaskVO task) {
167181
response.setDisplayName(task.getDisplayName());
168182
response.setStep(getStepDisplayField(task.getStep()));
169183
response.setDescription(task.getDescription());
184+
response.setState(task.getState().name());
170185

171186
Date updated = task.getUpdated();
172187
Date currentDate = new Date();
173-
if (updated != null && Completed != task.getStep()) {
174-
Duration stepDuration = Duration.between(updated.toInstant(), currentDate.toInstant());
175-
response.setStepDuration(getDurationDisplay(stepDuration.toMillis()));
176-
}
177-
if (Completed == task.getStep()) {
178-
response.setStepDuration(getDurationDisplay(task.getDuration()));
179-
} else {
180-
Duration totalDuration = Duration.between(task.getCreated().toInstant(), currentDate.toInstant());
181-
response.setDuration(getDurationDisplay(totalDuration.toMillis()));
188+
189+
if (updated != null) {
190+
if (ImportVmTask.TaskState.Running == task.getState()) {
191+
Duration stepDuration = Duration.between(updated.toInstant(), currentDate.toInstant());
192+
response.setStepDuration(getDurationDisplay(stepDuration.toMillis()));
193+
} else {
194+
Duration totalDuration = Duration.between(task.getCreated().toInstant(), updated.toInstant());
195+
response.setDuration(getDurationDisplay(totalDuration.toMillis()));
196+
}
182197
}
198+
183199
HostVO host = hostDao.findById(task.getConvertHostId());
184200
if (host != null) {
185201
response.setConvertInstanceHostId(host.getUuid());

0 commit comments

Comments
 (0)