/******************************************************************************* * Copyright (c) 2006-2011 Gluster, Inc. <http://www.gluster.com> * This file is part of Gluster Management Console. * * Gluster Management Console is free software; you can redistribute * it and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * Gluster Management Console is distributed in the hope that it * will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ package org.gluster.storage.management.console.dialogs; import java.util.List; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.gluster.storage.management.console.GlusterDataModelManager; import org.gluster.storage.management.console.TableLabelProviderAdapter; import org.gluster.storage.management.console.utils.GUIHelper; import org.gluster.storage.management.core.model.Brick; import org.gluster.storage.management.core.model.Device; import org.gluster.storage.management.core.model.Volume; import org.gluster.storage.management.core.utils.NumberUtil; public class MigrateBrickPage1 extends WizardPage { private static final String PAGE_NAME = "migrate.disk.page.1"; private enum DISK_TABLE_COLUMN_INDICES { SERVER, BRICK_DIRECTORY, FREE_SPACE, TOTAL_SPACE } private static final String[] DISK_TABLE_COLUMN_NAMES = { "Server", "Brick Directory", "Free Space (GB)", "Total Space (GB)" }; private Volume volume; private Brick fromBrick; private static final GUIHelper guiHelper = GUIHelper.getInstance(); private TableViewer tableViewerTo; private TableViewer tableViewerFrom; private Button autoCompleteCheckbox; private ITableLabelProvider getBrickLabelProvider(final String volumeName) { return new TableLabelProviderAdapter() { @Override public String getColumnText(Object element, int columnIndex) { if (!(element instanceof Brick)) { return null; } Brick brick = (Brick) element; GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); Device device = modelManager.getDeviceForBrickDir(brick); // convert MB to GB String freeSpace = (device == null ? "NA" : NumberUtil.formatNumber(device.getFreeSpace() / 1024)); String totalSpace = (device == null ? "NA" : NumberUtil.formatNumber(device.getSpace() / 1024)); return (columnIndex == DISK_TABLE_COLUMN_INDICES.SERVER.ordinal() ? brick.getServerName() : columnIndex == DISK_TABLE_COLUMN_INDICES.BRICK_DIRECTORY.ordinal() ? brick.getBrickDirectory() : columnIndex == DISK_TABLE_COLUMN_INDICES.FREE_SPACE.ordinal() ? freeSpace : columnIndex == DISK_TABLE_COLUMN_INDICES.TOTAL_SPACE.ordinal() ? totalSpace : "Invalid"); } }; } private ITableLabelProvider getDiskLabelProvider(final String volumeName) { return new TableLabelProviderAdapter() { @Override public String getColumnText(Object element, int columnIndex) { if (!(element instanceof Device)) { return null; } Device device = (Device) element; return (columnIndex == DISK_TABLE_COLUMN_INDICES.SERVER.ordinal() ? device.getServerName() : columnIndex == DISK_TABLE_COLUMN_INDICES.BRICK_DIRECTORY.ordinal() ? device.getMountPoint() + "/" + volumeName : columnIndex == DISK_TABLE_COLUMN_INDICES.FREE_SPACE.ordinal() ? NumberUtil.formatNumber(device.getFreeSpace() / 1024 ) /* Coverted to GB */ : columnIndex == DISK_TABLE_COLUMN_INDICES.TOTAL_SPACE.ordinal() ? NumberUtil.formatNumber(device.getSpace() / 1024) : "Invalid"); } }; } private void setupDiskTable(Composite parent, Table table) { table.setHeaderVisible(true); table.setLinesVisible(false); TableColumnLayout tableColumnLayout = guiHelper.createTableColumnLayout(table, DISK_TABLE_COLUMN_NAMES); parent.setLayout(tableColumnLayout); setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.SERVER, SWT.CENTER, 100); setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.BRICK_DIRECTORY, SWT.CENTER, 100); setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.FREE_SPACE, SWT.CENTER, 90); setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.TOTAL_SPACE, SWT.CENTER, 90); } /** * Sets properties for alignment and weight of given column of given table * * @param table * @param columnIndex * @param alignment * @param weight */ public void setColumnProperties(Table table, DISK_TABLE_COLUMN_INDICES columnIndex, int alignment, int weight) { TableColumn column = table.getColumn(columnIndex.ordinal()); column.setAlignment(alignment); TableColumnLayout tableColumnLayout = (TableColumnLayout) table.getParent().getLayout(); tableColumnLayout.setColumnData(column, new ColumnWeightData(weight)); } /** * Create the wizard. */ public MigrateBrickPage1(Volume volume, Brick brick) { super(PAGE_NAME); this.volume = volume; this.fromBrick = brick; setTitle("Migrate Brick [" + volume.getName() + "]"); setPageDescription(fromBrick.getQualifiedName(), null); setPageComplete(false); } private void setPageDescription(String source, String target) { if (source == null) { source = ""; } if (target == null) { target = ""; } setDescription("Migrate data from \"" + source + "\" to \"" + target + "\""); } private Object getSelectedItem(TableViewer tableViewer) { TableItem[] selectedItems = tableViewer.getTable().getSelection(); Object selectedDevice = null; for (TableItem item : selectedItems) { selectedDevice = item.getData(); } return selectedDevice; } private void setupPageLayout(Composite container) { final GridLayout layout = new GridLayout(2, false); layout.verticalSpacing = 10; layout.horizontalSpacing = 10; layout.marginTop = 10; layout.marginLeft = 10; layout.marginRight = 10; container.setLayout(layout); } private Composite createTableViewerComposite(Composite parent) { Composite tableViewerComposite = new Composite(parent, SWT.NONE); tableViewerComposite.setLayout(new FillLayout(SWT.HORIZONTAL)); tableViewerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); return tableViewerComposite; } public String getSourceBrickDir() { Brick sourceBrick = (Brick)getSelectedItem(tableViewerFrom); return sourceBrick.getQualifiedName(); } public String getTargetBrickDir() { Device targetDevice = (Device)getSelectedItem(tableViewerTo); if (targetDevice == null) { return ""; } return targetDevice.getQualifiedBrickName(volume.getName()); } public Boolean getAutoCommitSelection() { return autoCompleteCheckbox.getSelection(); } /** * Create contents of the wizard. * * @param parent */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); setControl(container); setupPageLayout(container); GridData labelLayoutData = new GridData(SWT.LEFT, SWT.BOTTOM, true, false); labelLayoutData.minimumWidth = 100; labelLayoutData.verticalAlignment = SWT.BOTTOM; //labelLayoutData.verticalIndent = 10; Label lblFromDisk = new Label(container, SWT.NONE); lblFromDisk.setText("From Brick:"); lblFromDisk.setLayoutData(labelLayoutData); Label lblToDisk = new Label(container, SWT.NONE); lblToDisk.setText("To Brick:"); lblToDisk.setLayoutData(labelLayoutData); Text txtFilterFrom = guiHelper.createFilterText(container); Text txtFilterTo = guiHelper.createFilterText(container); GlusterDataModelManager glusterDataModelManager = GlusterDataModelManager.getInstance(); List<Brick> fromBricks = volume.getBricks(); List<Device> toDevices = glusterDataModelManager.getReadyDevicesOfAllServersExcluding(glusterDataModelManager .getDevicesOfVolume(volume)); tableViewerFrom = createTableViewer(container, getBrickLabelProvider(volume.getName()), fromBricks, txtFilterFrom); if(fromBrick != null) { setFromDisk(tableViewerFrom, fromBrick); } tableViewerTo = createTableViewer(container, getDiskLabelProvider(volume.getName()), toDevices, txtFilterTo); tableViewerTo.setSelection(new StructuredSelection(fromBrick)); // Auto commit selection field Composite autoCommitContainer = new Composite(container, SWT.NONE); GridData data = new GridData(); data.horizontalSpan = 2; autoCommitContainer.setLayoutData(data); autoCompleteCheckbox = new Button(autoCommitContainer, SWT.CHECK); autoCompleteCheckbox.setSelection(true); Label lblAutoComplete = new Label(autoCommitContainer, SWT.NONE); lblAutoComplete.setText("Auto commit on migration complete"); autoCommitContainer.setLayout( container.getLayout()); } private void setFromDisk(TableViewer tableViewer, Brick brickToSelect) { Table table = tableViewer.getTable(); for (int i = 0; i < table.getItemCount(); i++) { TableItem item = table.getItem(i); if (item.getData() == brickToSelect) { table.select(i); return; } } } private void refreshButtonStatus() { if(tableViewerFrom.getSelection().isEmpty() || tableViewerTo.getSelection().isEmpty()) { setPageComplete(false); } else { setPageComplete(true); } } private <T> TableViewer createTableViewer(Composite container, ITableLabelProvider diskLabelProvider, List<T> bricks, Text txtFilterText) { Composite tableViewerComposite = createTableViewerComposite(container); TableViewer tableViewer = new TableViewer(tableViewerComposite, SWT.SINGLE); tableViewer.setContentProvider(new ArrayContentProvider()); tableViewer.setLabelProvider(diskLabelProvider); setupDiskTable(tableViewerComposite, tableViewer.getTable()); guiHelper.createFilter(tableViewer, txtFilterText, false); tableViewer.setInput(bricks.toArray()); tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { refreshButtonStatus(); setPageDescription(getSourceBrickDir(), getTargetBrickDir()); } }); return tableViewer; } }