2525import com .cloud .user .Account ;
2626import com .cloud .user .AccountService ;
2727import com .cloud .utils .DateUtil ;
28+ import com .cloud .utils .Pair ;
2829import com .cloud .vm .ImportVMTaskVO ;
2930import com .cloud .vm .UserVmVO ;
3031import com .cloud .vm .dao .ImportVMTaskDao ;
3132import com .cloud .vm .dao .UserVmDao ;
33+ import org .apache .cloudstack .api .ApiErrorCode ;
34+ import org .apache .cloudstack .api .ServerApiException ;
3235import org .apache .cloudstack .api .command .admin .vm .ListImportVMTasksCmd ;
3336import org .apache .cloudstack .api .response .ImportVMTaskResponse ;
3437import org .apache .cloudstack .api .response .ListResponse ;
38+ import org .apache .commons .lang3 .StringUtils ;
3539import org .apache .logging .log4j .LogManager ;
3640import org .apache .logging .log4j .Logger ;
3741
@@ -72,32 +76,41 @@ public ListResponse<ImportVMTaskResponse> listImportVMTasks(ListImportVMTasksCmd
7276 Long accountId = cmd .getAccountId ();
7377 String vcenter = cmd .getVcenter ();
7478 Long convertHostId = cmd .getConvertHostId ();
75- boolean listAll = cmd .isListAll ();
76- boolean showCompleted = cmd .isShowCompleted ();
79+ Long startIndex = cmd .getStartIndex ();
80+ Long pageSizeVal = cmd .getPageSizeVal ();
7781
78- List <ImportVMTaskVO > tasks ;
79- if (listAll ) {
80- tasks = importVMTaskDao .listAll ();
81- } else {
82- tasks = importVMTaskDao .listImportVMTasks (zoneId , accountId , vcenter , convertHostId , showCompleted );
83- }
82+ ImportVmTask .TaskState state = getStateFromFilter (cmd .getTasksFilter ());
83+ Pair <List <ImportVMTaskVO >, Integer > result = importVMTaskDao .listImportVMTasks (zoneId , accountId , vcenter , convertHostId , state , startIndex , pageSizeVal );
84+ List <ImportVMTaskVO > tasks = result .first ();
8485
8586 List <ImportVMTaskResponse > responses = new ArrayList <>();
8687 for (ImportVMTaskVO task : tasks ) {
8788 responses .add (createImportVMTaskResponse (task ));
8889 }
8990 ListResponse <ImportVMTaskResponse > listResponses = new ListResponse <>();
90- listResponses .setResponses (responses , responses . size ());
91+ listResponses .setResponses (responses , result . second ());
9192 return listResponses ;
9293 }
9394
95+ private ImportVmTask .TaskState getStateFromFilter (String tasksFilter ) {
96+ if (StringUtils .isBlank (tasksFilter ) || tasksFilter .equalsIgnoreCase ("all" )) {
97+ return null ;
98+ }
99+ try {
100+ return ImportVmTask .TaskState .getValue (tasksFilter );
101+ } catch (IllegalArgumentException e ) {
102+ throw new ServerApiException (ApiErrorCode .PARAM_ERROR , String .format ("Invalid value for task state: %s" , tasksFilter ));
103+ }
104+ }
105+
94106 @ Override
95107 public ImportVmTask createImportVMTaskRecord (DataCenter zone , Account owner , long userId , String displayName , String vcenter , String datacenterName , String sourceVMName , Host convertHost , Host importHost ) {
96108 logger .debug ("Creating import VM task entry for VM: {} for account {} on zone {} " +
97109 "from the vCenter: {} / datacenter: {} / source VM: {}" ,
98110 sourceVMName , owner .getAccountName (), zone .getName (), displayName , vcenter , datacenterName );
99111 ImportVMTaskVO importVMTaskVO = new ImportVMTaskVO (zone .getId (), owner .getAccountId (), userId , displayName ,
100112 vcenter , datacenterName , sourceVMName , convertHost .getId (), importHost .getId ());
113+ importVMTaskVO .setState (ImportVmTask .TaskState .Running );
101114 return importVMTaskDao .persist (importVMTaskVO );
102115 }
103116
@@ -111,7 +124,6 @@ private String getStepDescription(ImportVMTaskVO importVMTaskVO, Host convertHos
111124 if (Completed == step ) {
112125 stringBuilder .append ("Completed at " ).append (DateUtil .getDateDisplayString (TimeZone .getTimeZone ("GMT" ), updatedDate ));
113126 } else {
114- stringBuilder .append (String .format ("[%s] " , DateUtil .getDateDisplayString (TimeZone .getTimeZone ("GMT" ), updatedDate )));
115127 if (CloningInstance == step ) {
116128 stringBuilder .append (String .format ("Cloning source instance: %s on vCenter: %s / datacenter: %s" , sourceVMName , vcenter , datacenter ));
117129 } else if (ConvertingInstance == step ) {
@@ -142,13 +154,19 @@ public void updateImportVMTaskStep(ImportVmTask importVMTask, DataCenter zone, A
142154 Duration duration = Duration .between (importVMTaskVO .getCreated ().toInstant (), updatedDate .toInstant ());
143155 importVMTaskVO .setDuration (duration .toMillis ());
144156 importVMTaskVO .setVmId (vmId );
157+ importVMTaskVO .setState (ImportVmTask .TaskState .Completed );
145158 }
146159 importVMTaskDao .update (importVMTaskVO .getId (), importVMTaskVO );
147160 }
148161
149162 @ Override
150- public boolean removeImportVMTask (long taskId ) {
151- return importVMTaskDao .remove (taskId );
163+ public void updateImportVMTaskErrorState (ImportVmTask importVMTask , ImportVmTask .TaskState state , String errorMsg ) {
164+ ImportVMTaskVO importVMTaskVO = (ImportVMTaskVO ) importVMTask ;
165+ Date updatedDate = DateUtil .now ();
166+ importVMTaskVO .setUpdated (updatedDate );
167+ importVMTaskVO .setState (state );
168+ importVMTaskVO .setDescription (errorMsg );
169+ importVMTaskDao .update (importVMTaskVO .getId (), importVMTaskVO );
152170 }
153171
154172 private ImportVMTaskResponse createImportVMTaskResponse (ImportVMTaskVO task ) {
@@ -169,19 +187,21 @@ private ImportVMTaskResponse createImportVMTaskResponse(ImportVMTaskVO task) {
169187 response .setDisplayName (task .getDisplayName ());
170188 response .setStep (getStepDisplayField (task .getStep ()));
171189 response .setDescription (task .getDescription ());
190+ response .setState (task .getState ().name ());
172191
173192 Date updated = task .getUpdated ();
174193 Date currentDate = new Date ();
175- if ( updated != null && Completed != task . getStep ()) {
176- Duration stepDuration = Duration . between ( updated . toInstant (), currentDate . toInstant ());
177- response . setStepDuration ( getDurationDisplay ( stepDuration . toMillis ()));
178- }
179- if ( Completed == task . getStep ()) {
180- response . setStepDuration ( getDurationDisplay ( task . getDuration ()));
181- } else {
182- Duration totalDuration = Duration . between ( task . getCreated (). toInstant (), currentDate . toInstant ( ));
183- response . setDuration ( getDurationDisplay ( totalDuration . toMillis ()));
194+
195+ if ( updated != null ) {
196+ if ( ImportVmTask . TaskState . Running == task . getState ()) {
197+ Duration stepDuration = Duration . between ( updated . toInstant (), currentDate . toInstant ());
198+ response . setStepDuration ( getDurationDisplay ( stepDuration . toMillis ()));
199+ } else {
200+ Duration totalDuration = Duration . between ( task . getCreated (). toInstant (), updated . toInstant ());
201+ response . setDuration ( getDurationDisplay ( totalDuration . toMillis () ));
202+ }
184203 }
204+
185205 HostVO host = hostDao .findById (task .getConvertHostId ());
186206 if (host != null ) {
187207 response .setConvertInstanceHostId (host .getUuid ());
0 commit comments