package org.ovirt.engine.ui.uicommonweb.models.gluster; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.action.gluster.CreateBrickParameters; import org.ovirt.engine.core.common.action.gluster.SyncGlusterStorageDevicesParameter; import org.ovirt.engine.core.common.businessentities.RaidType; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.gluster.StorageDevice; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.core.common.queries.ConfigurationValues; import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.Linq; 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.SearchableListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; public class HostGlusterStorageDevicesListModel extends SearchableListModel<VDS, StorageDevice> { public HostGlusterStorageDevicesListModel() { setTitle(ConstantsManager.getInstance().getConstants().storageDevices()); setHelpTag(HelpTag.gluster_storage_devices); setHashName("gluster_storage_devices"); //$NON-NLS-1$ setSyncStorageDevicesCommand(new UICommand("sync", this)); //$NON-NLS-1$ setCreateBrickCommand(new UICommand("createBrick", this)); //$NON-NLS-1$ setAvailableInModes(ApplicationMode.GlusterOnly); } @Override public VDS getEntity() { return super.getEntity(); } public void setEntity(VDS value) { super.setEntity(value); updateActionAvailability(); } private UICommand createBrickCommand; public UICommand getCreateBrickCommand() { return createBrickCommand; } public void setCreateBrickCommand(UICommand createBrickCommand) { this.createBrickCommand = createBrickCommand; } private UICommand syncStorageDevicesCommand; public UICommand getSyncStorageDevicesCommand() { return syncStorageDevicesCommand; } public void setSyncStorageDevicesCommand(UICommand syncStorageDevicesCommand) { this.syncStorageDevicesCommand = syncStorageDevicesCommand; } @Override protected void onEntityChanged() { super.onEntityChanged(); getSearchCommand().execute(); } @Override protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) { super.entityPropertyChanged(sender, e); getSearchCommand().execute(); } @Override public void search() { if (getEntity() != null) { super.search(); } } @Override protected void syncSearch() { if (getEntity() == null) { return; } AsyncDataProvider.getInstance().getStorageDevices(new AsyncQuery<>(devices -> { Collections.sort(devices, Linq.StorageDeviceComparer); setItems(devices); }), getEntity().getId()); } @Override protected String getListName() { return "HostGlusterStorageDevicesListModel"; //$NON-NLS-1$ } private void createBrick() { if (getWindow() != null) { return; } VDS host = getEntity(); if (host == null) { return; } final CreateBrickModel lvModel = new CreateBrickModel(); lvModel.setTitle(ConstantsManager.getInstance().getConstants().createBrick()); lvModel.setHelpTag(HelpTag.create_brick); lvModel.setHashName("create_brick"); //$NON-NLS-1$ lvModel.startProgress(ConstantsManager.getInstance().getConstants().fetchingDataMessage()); setWindow(lvModel); lvModel.getRaidTypeList().setSelectedItem(RaidType.RAID6); List<StorageDevice> selectedDevices = getSelectedItems(); lvModel.getStorageDevices().setItems(selectedDevices); lvModel.setSelectedDevices(selectedDevices); AsyncQuery<String> asyncQueryForDefaultMountPoint = lvModel.asyncQuery(defaultMountPoint -> { lvModel.stopProgress(); lvModel.getDefaultMountFolder().setEntity(defaultMountPoint); }); AsyncDataProvider.getInstance() .getConfigFromCache(new GetConfigurationValueParameters(ConfigurationValues.GlusterDefaultBrickMountPoint, AsyncDataProvider.getInstance().getDefaultConfigurationVersion()), asyncQueryForDefaultMountPoint); UICommand okCommand = UICommand.createDefaultOkUiCommand("onCreateBrick", this); //$NON-NLS-1$ lvModel.getCommands().add(okCommand); UICommand cancelCommand = UICommand.createCancelUiCommand("closeWindow", this); //$NON-NLS-1$ lvModel.getCommands().add(cancelCommand); } private void syncStorageDevices() { Frontend.getInstance() .runAction(VdcActionType.SyncStorageDevices, new SyncGlusterStorageDevicesParameter(getEntity().getId()), null, true, true); } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); updateActionAvailability(); } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } private void updateActionAvailability() { VDS vds = getEntity(); if (vds != null && vds.getStatus() == VDSStatus.Up) { getSyncStorageDevicesCommand().setIsExecutionAllowed(true); getCreateBrickCommand().setIsExecutionAllowed(canCreateBrick()); } else { getSyncStorageDevicesCommand().setIsExecutionAllowed(false); getCreateBrickCommand().setIsExecutionAllowed(false); } } private boolean canCreateBrick(){ boolean canCreateBrick = false; List<StorageDevice> selectedDevices = getSelectedItems(); if (selectedDevices != null) { for (StorageDevice device : selectedDevices) { if (device.getCanCreateBrick()) { canCreateBrick = true; } else { canCreateBrick = false; break; } } } return canCreateBrick; } private void onCreateBrick() { CreateBrickModel lvModel = (CreateBrickModel) getWindow(); if (lvModel == null) { return; } if (!lvModel.validate()) { return; } VDS host = getEntity(); if (host == null) { return; } lvModel.startProgress(); List<StorageDevice> selectedDevices = new ArrayList<>(); for (StorageDevice device : lvModel.getStorageDevices().getSelectedItems()) { selectedDevices.add(device); } CreateBrickParameters parameters = new CreateBrickParameters(host.getId(), lvModel.getLvName().getEntity(), lvModel.getMountPoint().getEntity(), lvModel.getRaidTypeList().getSelectedItem(), lvModel.getNoOfPhysicalDisksInRaidVolume().getEntity(), lvModel.getStripeSize().getEntity(), selectedDevices); Frontend.getInstance().runAction(VdcActionType.CreateBrick, parameters, result -> postCreateBrick(result.getReturnValue()), this); } private void postCreateBrick(VdcReturnValueBase returnValue) { CreateBrickModel model = (CreateBrickModel) getWindow(); model.stopProgress(); if (returnValue != null && returnValue.getSucceeded()) { setWindow(null); } } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command.equals(getCreateBrickCommand())) { createBrick(); } else if (command.getName().equals("onCreateBrick")) { //$NON-NLS-1$ onCreateBrick(); } else if (command.getName().equals("closeWindow")) { //$NON-NLS-1$ setWindow(null); } else if (command.equals(getSyncStorageDevicesCommand())) { syncStorageDevices(); } } }