@Override public void store(IFrontendActionAsyncCallback callback) { if (getProgress() != null || !validate()) { return; } ArrayList<VdcActionType> actionTypes = new ArrayList<>(); ArrayList<VdcActionParametersBase> paramerterList = new ArrayList<>(); ArrayList<IFrontendActionAsyncCallback> callbacks = new ArrayList<>(); IFrontendActionAsyncCallback onFinishCallback = callback != null ? callback : new IFrontendActionAsyncCallback() { @Override public void executed(FrontendActionAsyncResult result) { NewDiskModel diskModel = (NewDiskModel) result.getState(); diskModel.stopProgress(); diskModel.cancel(); } }; List<EntityModel<DiskModel>> disksToAttach = getSelectedDisks(); for (int i = 0; i < disksToAttach.size(); i++) { DiskModel disk = disksToAttach.get(i).getEntity(); /* IDE disks can be activated only when the VM is down. Other disks can be hot plugged. */ boolean activate = false; if (getIsPlugged().getEntity()) { activate = disk.getDisk().getDiskInterface() == DiskInterface.IDE ? getVm().getStatus() == VMStatus.Down : true; } // Disk is attached to VM as read only or not, null is applicable only for floating disks // but this is not a case here. AttachDetachVmDiskParameters parameters = new AttachDetachVmDiskParameters( getVm().getId(), disk.getDisk().getId(), activate, Boolean.TRUE.equals(disk.getDisk().getReadOnly())); actionTypes.add(VdcActionType.AttachDiskToVm); paramerterList.add(parameters); callbacks.add(i == disksToAttach.size() - 1 ? onFinishCallback : null); } startProgress(); Frontend.getInstance().runMultipleActions(actionTypes, paramerterList, callbacks, null, this); }