package org.ovirt.engine.ui.uicommonweb.models.storage; import java.util.ArrayList; import java.util.Collections; import org.ovirt.engine.core.common.action.RemoveVmFromImportExportParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.ArchitectureType; import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.comparators.LexoNumericNameableComparator; import org.ovirt.engine.core.common.queries.GetAllFromExportDomainQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.help.HelpTag; import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportVmData; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportVmFromExportDomainModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmAppListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import com.google.inject.Inject; import com.google.inject.Provider; public class VmBackupModel extends ManageBackupModel<VM> { private VmAppListModel appListModel; protected ImportVmFromExportDomainModel importModel; protected Provider<? extends ImportVmFromExportDomainModel> importModelProvider; public VmAppListModel getAppListModel() { return appListModel; } protected void setModelProvider(Provider<? extends ImportVmFromExportDomainModel> importModelProvider) { this.importModelProvider = importModelProvider; } @Inject public VmBackupModel(Provider<ImportVmFromExportDomainModel> importModelProvider) { this(); setModelProvider(importModelProvider); } public VmBackupModel() { setTitle(ConstantsManager.getInstance().getConstants().vmImportTitle()); setHelpTag(HelpTag.vm_import); setHashName("vm_import"); // //$NON-NLS-1$ appListModel = new VmAppListModel(); setIsTimerDisabled(true); } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); if (getAppListModel() != null) { getAppListModel().setEntity(getSelectedItem()); } } @Override protected void remove() { if (getWindow() != null) { return; } ConfirmationModel model = new ConfirmationModel(); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().removeBackedUpVMsTitle()); model.setHelpTag(HelpTag.remove_backed_up_vm); model.setHashName("remove_backed_up_vm"); //$NON-NLS-1$ ArrayList<String> items = new ArrayList<>(); for (VM vm : getSelectedItems()) { items.add(vm.getName()); } model.setItems(items); model.setNote(ConstantsManager.getInstance().getConstants().noteTheDeletedItemsMightStillAppearOntheSubTab()); model.getCommands().add(UICommand.createDefaultOkUiCommand("OnRemove", this)); //$NON-NLS-1$ model.getCommands().add(UICommand.createCancelUiCommand(CANCEL_COMMAND, this)); //$NON-NLS-1$ } private void onRemove() { ConfirmationModel model = (ConfirmationModel) getWindow(); if (model.getProgress() != null) { return; } model.startProgress(); AsyncDataProvider.getInstance().getDataCentersByStorageDomain(new AsyncQuery<>(pools -> { if (pools != null && pools.size() > 0) { StoragePool pool = pools.get(0); ArrayList<VdcActionParametersBase> list = new ArrayList<>(); for (VM vm : getSelectedItems()) { list.add(new RemoveVmFromImportExportParameters(vm.getId(), getEntity().getId(), pool.getId())); } Frontend.getInstance().runMultipleAction( VdcActionType.RemoveVmFromImportExport, list, result -> { ConfirmationModel localModel = (ConfirmationModel) result.getState(); localModel.stopProgress(); cancel(); onEntityChanged(); }, getWindow()); } }), getEntity().getId()); } protected ArchitectureType getArchitectureFromItem(VM vm) { return vm.getClusterArch(); } @Override protected void restore() { if (getWindow() != null) { return; } if (!validateSingleArchitecture()) { return; } ImportVmFromExportDomainModel model = importModelProvider.get(); model.setEntity(getEntity().getId()); setWindow(model); model.startProgress(); model.setTitle(ConstantsManager.getInstance().getConstants().importVirtualMachinesTitle()); model.getCommands().add(UICommand.createDefaultOkUiCommand("OnRestore", this)); //$NON-NLS-1$ model.getCommands().add(UICommand.createCancelUiCommand(CANCEL_COMMAND, this)); //$NON-NLS-1$); model.init(getSelectedItems(), getEntity().getId()); model.setTargetArchitecture(getArchitectureFromItem(getSelectedItems().get(0))); // Add 'Close' command model.setCloseCommand(new UICommand(CANCEL_COMMAND, this) //$NON-NLS-1$ .setTitle(ConstantsManager.getInstance().getConstants().close()) .setIsDefault(true) .setIsCancel(true) ); } public void onRestore() { importModel = (ImportVmFromExportDomainModel) getWindow(); if (importModel.getProgress() != null) { return; } if (!importModel.validate()) { return; } executeImport(); } protected String getObjectName(Object object) { return ((ImportVmData) object).getVm().getName(); } protected void setObjectName(Object object, String name) { ((ImportVmData) object).getVm().setName(name); } protected void executeImport() { importModel.importVms( result -> { getWindow().stopProgress(); cancel(); ArrayList<VdcReturnValueBase> retVals = (ArrayList<VdcReturnValueBase>) result .getReturnValue(); if (retVals != null && getSelectedItems().size() == retVals .size()) { StringBuilder importedVms = new StringBuilder(); int counter = 0; boolean toShowConfirmWindow = false; for (VM vm : getSelectedItems()) { if (retVals.get(counter) != null && retVals.get(counter).isValid()) { importedVms.append(vm.getName()).append(", "); //$NON-NLS-1$ toShowConfirmWindow = true; } counter++; } // show the confirm window only if the import has been successfully started for at least one // VM if (toShowConfirmWindow) { ConfirmationModel confirmModel = new ConfirmationModel(); setConfirmWindow(confirmModel); confirmModel.setTitle(ConstantsManager.getInstance() .getConstants() .importVirtualMachinesTitle()); confirmModel.setHelpTag(HelpTag.import_virtual_machine); confirmModel.setHashName("import_virtual_machine"); //$NON-NLS-1$ confirmModel.setMessage(ConstantsManager.getInstance() .getMessages() .importProcessHasBegunForVms(StringHelper.trimEnd(importedVms.toString().trim(), ','))); confirmModel.getCommands().add(new UICommand(CANCEL_CONFIRMATION_COMMAND, VmBackupModel.this) .setTitle(ConstantsManager.getInstance().getConstants().close()) .setIsDefault(true) .setIsCancel(true) ); } } }); } @Override protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) { super.entityPropertyChanged(sender, e); if (e.propertyName.equals("storage_domain_shared_status")) { //$NON-NLS-1$ getSearchCommand().execute(); } } @Override protected void syncSearch() { super.syncSearch(); if (getEntity() == null || getEntity().getStorageDomainType() != StorageDomainType.ImportExport || getEntity().getStorageDomainSharedStatus() != StorageDomainSharedStatus.Active) { setItems(Collections.<VM>emptyList()); } else { AsyncDataProvider.getInstance().getDataCentersByStorageDomain(new AsyncQuery<>(list -> { if (list != null && list.size() > 0) { StoragePool dataCenter = list.get(0); Frontend.getInstance().runQuery(VdcQueryType.GetVmsFromExportDomain, new GetAllFromExportDomainQueryParameters(dataCenter.getId(), getEntity().getId()), new SetSortedItemsAsyncQuery(new LexoNumericNameableComparator<>())); } }), getEntity().getId()); } } private void multipleArchsOK() { setConfirmWindow(null); } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command.getName().equals("OnRemove")) { //$NON-NLS-1$ onRemove(); } else if (command.getName().equals("OnRestore")) { //$NON-NLS-1$ onRestore(); } else if (command.getName().equals("multipleArchsOK")) { //$NON-NLS-1$ multipleArchsOK(); } } @Override protected String getListName() { return "VmBackupModel"; //$NON-NLS-1$ } protected String getImportConflictTitle() { return ConstantsManager.getInstance().getConstants().importVmConflictTitle(); } }