diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-03-25 16:18:22 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-03-25 16:18:22 +0530 |
| commit | 4f208ebaa0d1910e635314f4a7261bc31c98ff8f (patch) | |
| tree | ee517cd512150ce2e11d3da09bbba9df74108575 | |
| parent | e40556bdf8fd27e35878a8c1942573da46204b7e (diff) | |
Create Volume - validations
6 files changed, 96 insertions, 46 deletions
diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java index 4d594f36..de0112db 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -143,16 +143,6 @@ public class GlusterDataModelManager { return volume; } - public void addVolume(Volume volume ) { - Cluster cluster = (Cluster)model.getChildren().get(0); - cluster.addVolume(volume); - - for(ClusterListener listener : listeners) { - listener.volumeCreated(volume); - } - } - - private void initializeVolumes(Cluster cluster) { List<Volume> volumes = new ArrayList<Volume>(); @@ -342,4 +332,13 @@ public class GlusterDataModelManager { listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_STATUS_CHANGED, newStatus)); } } + + public void addVolume(Volume volume) { + Cluster cluster = (Cluster)model.getChildren().get(0); + cluster.addVolume(volume); + + for(ClusterListener listener : listeners) { + listener.volumeCreated(volume); + } + } } diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java index eb974fd9..1a39a014 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java @@ -26,37 +26,55 @@ public class DefaultClusterListener implements ClusterListener { @Override public void serverAdded(GlusterServer server) { + clusterChanged(); } @Override public void serverRemoved(GlusterServer server) { + clusterChanged(); } @Override public void serverChanged(GlusterServer server, Event event) { + clusterChanged(); } @Override public void volumeAdded(Volume volume) { + clusterChanged(); } @Override public void volumeRemoved(Volume volume) { + clusterChanged(); } @Override - public void volumeChanged(Volume volume, Event event) { + public void volumeChanged(Volume volume, Event event) { + clusterChanged(); } @Override public void discoveredServerAdded(Server server) { + clusterChanged(); } @Override public void discoveredServerRemoved(Server server) { + clusterChanged(); } @Override public void volumeCreated(Volume volume) { + clusterChanged(); + } + + /** + * This method is called by every other event method. Thus, if a view/listener is interested in performing the same + * task on any change happening in the cluster data model, it can simply override this method and implement the + * logic. e.g. A view may simply refresh its tree/table viewer whenever the cluster data model changes. + */ + public void clusterChanged() { + } } diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java index 7e2cfc31..ad5b4c2b 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java @@ -20,6 +20,7 @@ */ package com.gluster.storage.management.core.utils; +import java.io.File; import java.util.ArrayList; import java.util.List; @@ -199,6 +200,13 @@ public class GlusterUtil { private String getBrickNotation(Volume vol, Disk disk) { // TODO: Figure out an appropriate directory INSIDE the DISK having given NAME (e.g. sda, sdb, etc) // String dirName = "/export/" + vol.getName() + "/" + disk.getName(); + + // if /export directory is not exist then create the directory + boolean exists = (new File("/export")).exists(); + + if (!exists) { + processUtil.executeCommand("mkdir", "/export"); + } String dirName = "/export/" + vol.getName() ; return disk.getServerName() + ":" + dirName; } diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java index 50f5e013..a4e0b715 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java @@ -24,6 +24,7 @@ import java.util.Set; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; +import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; @@ -102,10 +103,34 @@ public class CreateVolumePage1 extends WizardPage { setPageComplete(false); setErrorMessage("Please enter Access Control"); } - // TODO: acl validation - // String[] aclList = accessControl.split(","); - } + + // acl validation + String[] aclList = accessControl.split(","); + for (String ip : aclList) { + if (!isValidIP(ip)) { + setPageComplete(false); + setErrorMessage("Please enter valid access control list"); + } + } + + } + + private Boolean isValidIP(String ip) { + // String pattern = "^.[0-9]{1,3}/..[0-9]{1,3}/..[0-9]{1,3}/..[0-9]{1,3}"; + String pattern = "^.[0-9]{1,3}/."; + if (ip == "*") { + return true; + } + String[] ipQuads = ip.split("."); + for (String quad : ipQuads) { + if (!quad.matches(pattern)) { + return false; + } + } + return true; + + } } /** @@ -221,7 +246,6 @@ public class CreateVolumePage1 extends WizardPage { } public Volume getVolume() { - volume.setName(txtName.getText()); IStructuredSelection selection = (IStructuredSelection)typeComboViewer.getSelection(); @@ -242,4 +266,16 @@ public class CreateVolumePage1 extends WizardPage { public Boolean getStartVolumeRequest() { return btnStartVolume.getSelection(); } + + public Boolean isValidCreateVolumeForm() { + IStructuredSelection selection = (IStructuredSelection)typeComboViewer.getSelection(); + if (selection.getFirstElement().equals(VOLUME_TYPE.DISTRIBUTED_MIRROR) && ((int)volume.getDisks().size()) % 2 != 0 ) { + setErrorMessage("Mirror type volume requires disk in multiples of two"); + return false; + } else if(selection.getFirstElement().equals(VOLUME_TYPE.DISTRIBUTED_STRIPE) && ((int)volume.getDisks().size()) % 4 != 0) { + setErrorMessage("Stripe type volume requires disk in multiples of four"); + return false; + } + return true; + } } diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeWizard.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeWizard.java index dfa5a97c..36755bec 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeWizard.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeWizard.java @@ -18,9 +18,6 @@ *******************************************************************************/ package com.gluster.storage.management.gui.dialogs; -import java.util.HashSet; -import java.util.Set; - import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.Wizard; @@ -45,22 +42,25 @@ public class CreateVolumeWizard extends Wizard { @Override public boolean performFinish() { CreateVolumePage1 page = (CreateVolumePage1) getPage(CreateVolumePage1.PAGE_NAME); - Volume newVol = page.getVolume(); + if (!page.isValidCreateVolumeForm()) { + return false; + } + + Volume newVolume = page.getVolume(); GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); VolumesClient volumesClient = new VolumesClient(modelManager.getSecurityToken()); - Status status = volumesClient.createVolume(newVol); + Status status = volumesClient.createVolume(newVolume); if (status.isSuccess()) { - newVol.setStatus(VOLUME_STATUS.OFFLINE); - + newVolume.setStatus(VOLUME_STATUS.OFFLINE); if (page.getStartVolumeRequest()) { - Status volumeStartStatus = volumesClient.startVolume(newVol.getName()); + Status volumeStartStatus = volumesClient.startVolume(newVolume.getName()); if (volumeStartStatus.isSuccess()) { - newVol.setStatus(VOLUME_STATUS.ONLINE); + newVolume.setStatus(VOLUME_STATUS.ONLINE); } } - - modelManager.addVolume(newVol); + //update the model + modelManager.addVolume(newVolume); MessageDialog.openInformation(getShell(), "Create Volume", "Volume created successfully and configuration added!"); } else { MessageDialog.openError(getShell(), "Create Volume", "Volume creation failed! [" + status.getCode() + "][" diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java index 35b5cd7a..4ad7ff67 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java @@ -84,29 +84,24 @@ public class NavigationView extends ViewPart implements ISelectionListener { // Refresh the navigation tree whenever there is a change to the data model GlusterDataModelManager.getInstance().addClusterListener(new DefaultClusterListener() { - @Override - public void serverAdded(GlusterServer server) { + public void clusterChanged() { treeViewer.refresh(); } - - /* - * (non-Javadoc) - * - * @see - * com.gluster.storage.management.core.model.DefaultClusterListener#volumeChanged(com.gluster.storage.management - * .core.model.Volume, com.gluster.storage.management.core.model.Event) - */ + @Override public void volumeChanged(Volume volume, Event event) { - treeViewer.refresh(); + super.volumeChanged(volume, event); selectEntity(volume); // this makes sure that the toolbar buttons get updated accoring to new status } + + @Override + public void volumeCreated(Volume volume) { + super.volumeCreated(volume); + selectEntity(volume); + } }); } - /** - * - */ private void setupContextMenu() { MenuManager menuManager = new MenuManager("&Gluster", "gluster.context.menu"); Menu contextMenu = menuManager.createContextMenu(treeViewer.getControl()); @@ -125,12 +120,6 @@ public class NavigationView extends ViewPart implements ISelectionListener { treeViewer.getControl().setFocus(); } - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, - * org.eclipse.jface.viewers.ISelection) - */ @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (part instanceof NavigationView && selection instanceof TreeSelection) { |
