modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java | 285 +++++++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/StorageGWTService.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java | 21
7 files changed, 260 insertions(+), 76 deletions(-)
New commits:
commit e9976eeee2677b67e7a4eb0ad75840b0151241da
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Mon Aug 19 19:41:08 2013 +0200
Adding the support for storage node (un)deployment in coregui.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java
index d1ea625..c49f697 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java
@@ -124,7 +124,7 @@ public class StorageNodeAdminView extends EnhancedVLayout implements Bookmarkabl
public void onFailure(Throwable caught) {
Message message = new Message("Unable to render storage node alert view: "
+ caught.getMessage(), Message.Severity.Warning);
- CoreGUI.goToView(VIEW_ID.getName(), message);
+ CoreGUI.goToView(StorageNodeTableView.VIEW_PATH, message);
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java
index 685fb5d..9ee4f28 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java
@@ -31,6 +31,7 @@ import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDat
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_MTIME;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_OPERATION_MODE;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_RESOURCE_ID;
+import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_STATUS;
import java.util.ArrayList;
import java.util.List;
@@ -63,7 +64,6 @@ import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.StorageNodeLoadCompositeDatasourceField;
import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.AncestryUtil;
import org.rhq.enterprise.gui.coregui.client.util.Log;
import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
@@ -144,7 +144,7 @@ public class StorageNodeDatasource extends RPCDataSource<StorageNodeLoadComposit
// cqlField.setHidden(true);
// fields.add(cqlField);
- field = FIELD_OPERATION_MODE.getListGridField("90");
+ field = FIELD_STATUS.getListGridField("90");
field.setCellFormatter(new CellFormatter() {
public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
if (listGridRecord.getAttribute(FIELD_ERROR_MESSAGE.propertyName()) != null
@@ -154,6 +154,7 @@ public class StorageNodeDatasource extends RPCDataSource<StorageNodeLoadComposit
return value.toString();
}
});
+
field.setShowHover(true);
field.setHoverCustomizer(new HoverCustomizer() {
public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
@@ -235,6 +236,7 @@ public class StorageNodeDatasource extends RPCDataSource<StorageNodeLoadComposit
record.setAttribute(FIELD_JMX_PORT.propertyName(), node.getJmxPort());
record.setAttribute(FIELD_CQL_PORT.propertyName(), node.getCqlPort());
record.setAttribute(FIELD_OPERATION_MODE.propertyName(), node.getOperationMode());
+ record.setAttribute(FIELD_STATUS.propertyName(), node.getStatus());
record.setAttribute(FIELD_ERROR_MESSAGE.propertyName(), node.getErrorMessage());
if (node.getFailedOperation() != null && node.getFailedOperation().getResource() != null) {
ResourceOperationHistory operationHistory = node.getFailedOperation();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java
index 04a1767..ada97fa 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java
@@ -40,6 +40,8 @@ public enum StorageNodeDatasourceField {
FIELD_OPERATION_MODE("operationMode", CoreGUI.getMessages().view_adminTopology_server_mode()),
+ FIELD_STATUS("status", "Status"),
+
FIELD_MEMORY("memory", "Memory"),
FIELD_DISK("disk", "Disk"),
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java
index 4055e6f..f5de561 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java
@@ -77,6 +77,9 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
public class StorageNodeDetailView extends EnhancedVLayout implements BookmarkableView {
private final int storageNodeId;
+
+// String path = StorageNodeAdminView.VIEW_PATH + "/" + storageNodeId;
+// CoreGUI.goToView(path, message);
private static final int SECTION_COUNT = 3;
private final SectionStack sectionStack;
@@ -121,9 +124,7 @@ public class StorageNodeDetailView extends EnhancedVLayout implements Bookmarkab
new AsyncCallback<PageList<StorageNode>>() {
public void onSuccess(final PageList<StorageNode> storageNodes) {
if (storageNodes == null || storageNodes.isEmpty() || storageNodes.size() != 1) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_adminTopology_message_fetchServerFail(String.valueOf(storageNodeId)));
- initSectionCount = SECTION_COUNT;
+ onFailure(new Exception("No storage nodes have been found."));
}
final StorageNode node = storageNodes.get(0);
header.setContents("<div style='text-align: center; font-weight: bold; font-size: medium;'> Storage Node ("
@@ -166,6 +167,7 @@ public class StorageNodeDetailView extends EnhancedVLayout implements Bookmarkab
Message message = new Message(MSG.view_configurationHistoryDetails_error_loadFailure(),
Message.Severity.Warning);
initSectionCount = SECTION_COUNT;
+ CoreGUI.getMessageCenter().notify(message);
}
@Override
@@ -199,7 +201,10 @@ public class StorageNodeDetailView extends EnhancedVLayout implements Bookmarkab
new AsyncCallback<Map<String, List<MeasurementDataNumericHighLowComposite>>>() {
@Override
public void onFailure(Throwable caught) {
-
+ Message message = new Message("Unable to fetch storage node load data.",
+ Message.Severity.Warning);
+ initSectionCount = SECTION_COUNT;
+ CoreGUI.getMessageCenter().notify(message);
}
@Override
@@ -357,7 +362,6 @@ public class StorageNodeDetailView extends EnhancedVLayout implements Bookmarkab
ResourceOperationHistory operationHistory = storageNode.getFailedOperation();
String value = LinkManager.getSubsystemResourceOperationHistoryLink(operationHistory.getResource().getId(),
operationHistory.getId());
- // String value = "#Resource/" + operationHistory.getResource().getId() + "/Operations/History/" + operationHistory.getId());
lastOperation = new StaticTextItem("lastOp", "Operation");
lastOperation.setValue(LinkManager.getHref(value, operationHistory.getOperationDefinition()
.getDisplayName()));
@@ -389,7 +393,6 @@ public class StorageNodeDetailView extends EnhancedVLayout implements Bookmarkab
loadLayout.setWidth100();
LayoutSpacer spacer = new LayoutSpacer();
spacer.setHeight(10);
-// HTMLFlow loadLabel = new HTMLFlow("<span style='font-weight:bold'>Status</span>");
HTMLFlow loadLabel = new HTMLFlow("Status");
loadLabel.addStyleName("formTitle");
loadLabel.setTooltip("Contains selected metrics collected for last 8 hours.");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
index 84c1586..50cb614 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
@@ -20,7 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.admin.storage;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_ADDRESS;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_ALERTS;
-import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_RESOURCE_ID;
+import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.*;
import java.util.ArrayList;
import java.util.Arrays;
@@ -42,6 +42,7 @@ import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.cloud.StorageNode;
import org.rhq.core.domain.cloud.StorageNode.OperationMode;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
@@ -85,7 +86,7 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
protected void doOnDraw() {
super.doOnDraw();
// commenting out this call, because it caused UI to freeze
-// scheduleUnacknowledgedAlertsPollingJob(getListGrid());
+ // scheduleUnacknowledgedAlertsPollingJob(getListGrid());
}
@Override
@@ -204,6 +205,80 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
private void showCommonActions() {
addInvokeOperationsAction();
+ addDeployAction();
+ addUndeployAction();
+ }
+
+ private void addUndeployAction() {
+ final ParametrizedMessage question = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Are you sure, you want to run the undeploy operation on selected nodes: " + param[0]
+ + " ? It may take a while to complete.";
+ }
+ };
+ final ParametrizedMessage success = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Starting the undeploy operation on storage nodes " + param[0];
+ }
+ };
+ final ParametrizedMessage failure = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Invoking the undeploy operation failed for storage nodes " + param[0] + " ids: " + param[1];
+ }
+ };
+
+ addTableAction("Undeploy Selected", null, new AuthorizedTableAction(this, TableActionEnablement.SINGLE,
+ Permission.MANAGE_SETTINGS) {
+
+ @Override
+ public boolean isEnabled(ListGridRecord[] selection) {
+ return StorageNodeTableView.this.isUndeployable(super.isEnabled(selection), selection);
+ }
+
+ @Override
+ public void executeAction(final ListGridRecord[] selections, Object actionValue) {
+ executeBulkAction(selections, actionValue, question, success, failure, StorageNodeOperation.UNDEPLOY);
+ }
+ });
+ }
+
+ private void addDeployAction() {
+ final ParametrizedMessage question = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Are you sure, you want to run the deploy operation on selected nodes: " + param[0]
+ + " ? It may take a while to complete.";
+ }
+ };
+ final ParametrizedMessage success = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Starting the deploy operation on storage nodes " + param[0];
+ }
+ };
+ final ParametrizedMessage failure = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Invoking the deploy operation failed for storage nodes " + param[0] + " ids: " + param[1];
+ }
+ };
+
+ addTableAction("Deploy Selected", null, new AuthorizedTableAction(this, TableActionEnablement.SINGLE,
+ Permission.MANAGE_SETTINGS) {
+
+ @Override
+ public boolean isEnabled(ListGridRecord[] selection) {
+ return StorageNodeTableView.this.isDeployable(super.isEnabled(selection), selection);
+ }
+
+ @Override
+ public void executeAction(final ListGridRecord[] selections, Object actionValue) {
+ executeBulkAction(selections, actionValue, question, success, failure, StorageNodeOperation.DEPLOY);
+ }
+ });
}
private void addInvokeOperationsAction() {
@@ -213,7 +288,6 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
operationsMap.put("Restart", "restart");
operationsMap.put("Disable Debug Mode", "stopRPCServer");
operationsMap.put("Enable Debug Mode", "startRPCServer");
- // operationsMap.put("Decommission", "decommission");
addTableAction(MSG.common_title_operation(), null, operationsMap, new AuthorizedTableAction(this,
TableActionEnablement.ANY, Permission.MANAGE_SETTINGS) {
@@ -221,77 +295,129 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
@Override
public boolean isEnabled(ListGridRecord[] selection) {
return StorageNodeTableView.this.isEnabled(super.isEnabled(selection), selection);
- };
+ }
@Override
public void executeAction(final ListGridRecord[] selections, Object actionValue) {
- final String operationName = (String) actionValue;
- final List<String> selectedAddresses = getSelectedAddresses(selections);
- // String message = MSG.view_adminTopology_message_setModeConfirm(selectedAddresses.toString(), mode.name());
- SC.ask("Are you sure, you want to run operation " + operationName + "?", new BooleanCallback() {
- public void execute(Boolean confirmed) {
- if (confirmed) {
- final CountDownLatch latch = CountDownLatch.create(selections.length, new Command() {
- @Override
- public void execute() {
- // Message msg = new Message(MSG.view_adminTopology_message_setMode(
- // String.valueOf(selections.length), mode.name()), Message.Severity.Info);
- Message msg = new Message("Operation" + operationName
- + " was successfully scheduled for resources with ids"
- + Arrays.asList(getSelectedIds(selections)), Message.Severity.Info);
- CoreGUI.getMessageCenter().notify(msg);
- refreshTableInfo();
- }
- });
- boolean isStopStartOrRestart = Arrays.asList("start", "shutdown", "restart").contains(
- operationName);
- for (ListGridRecord storageNodeRecord : selections) {
- // NFE should never happen, because of the condition for table action enablement
- int resourceId = storageNodeRecord.getAttributeAsInt(FIELD_RESOURCE_ID.propertyName());
- if (isStopStartOrRestart) {
- // start, stop or restart the storage node
- GWTServiceLookup.getOperationService().scheduleResourceOperation(resourceId,
- operationName, null, "Run by Storage Node Administrations UI", 0,
- new AsyncCallback<Void>() {
- public void onSuccess(Void result) {
- latch.countDown();
- }
-
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- "Scheduling operation " + operationName
- + " failed for resources with ids"
- + Arrays.asList(getSelectedIds(selections)) + " "
- + caught.getMessage(), caught);
- latch.countDown();
- refreshTableInfo();
- }
- });
+ ParametrizedMessage question = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Are you sure, you want to run operation " + param[0] + "?";
+ }
+ };
+ ParametrizedMessage success = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Operation" + param[0] + " was successfully scheduled for storage nodes " + param[1];
+ }
+ };
+ ParametrizedMessage failure = new ParametrizedMessage() {
+ @Override
+ public String getMessage(String... param) {
+ return "Scheduling operation " + param[0] + " failed for storage nodes " + param[1];
+ }
+ };
+ executeBulkAction(selections, actionValue, question, success, failure, StorageNodeOperation.OTHER);
+ }
+ });
+ }
+
+ private enum StorageNodeOperation {
+ DEPLOY, UNDEPLOY, OTHER
+ }
+
+ private interface ParametrizedMessage {
+ String getMessage(String... param);
+ }
+
+ private void executeBulkAction(final ListGridRecord[] selections, Object actionValue, ParametrizedMessage question,
+ final ParametrizedMessage success, final ParametrizedMessage failure, final StorageNodeOperation operationType) {
+ final String operationName = (String) actionValue;
+ final List<String> selectedAddresses = getSelectedAddresses(selections);
+ SC.ask(question.getMessage(selectedAddresses.toString()), new BooleanCallback() {
+ public void execute(Boolean confirmed) {
+ if (confirmed) {
+ final CountDownLatch latch = CountDownLatch.create(selections.length, new Command() {
+ @Override
+ public void execute() {
+ String msgString = null;
+ if (operationType == StorageNodeOperation.OTHER) {
+ msgString = success.getMessage(operationName, selectedAddresses.toString());
+ } else {
+ msgString = success.getMessage(selectedAddresses.toString());
+ }
+ Message msg = new Message(msgString, Message.Severity.Info);
+ CoreGUI.getMessageCenter().notify(msg);
+ refreshTableInfo();
+ }
+ });
+ boolean isStopStartOrRestart = Arrays.asList("start", "shutdown", "restart")
+ .contains(operationName);
+ for (ListGridRecord storageNodeRecord : selections) {
+ // NFE should never happen, because of the condition for table action enablement
+ int resourceId = storageNodeRecord.getAttributeAsInt(FIELD_RESOURCE_ID.propertyName());
+ if (isStopStartOrRestart) {
+ // start, stop or restart the storage node
+ GWTServiceLookup.getOperationService().scheduleResourceOperation(resourceId, operationName,
+ null, "Run by Storage Node Administrations UI", 0, new AsyncCallback<Void>() {
+ public void onSuccess(Void result) {
+ latch.countDown();
+ }
+
+ public void onFailure(Throwable caught) {
+ String msg = failure.getMessage(operationName,
+ selectedAddresses + " " + caught.getMessage());
+ CoreGUI.getErrorHandler().handleError(msg, caught);
+ latch.countDown();
+ refreshTableInfo();
+ }
+ });
+ } else {
+ if (operationType != StorageNodeOperation.OTHER) { // (un)deploy
+ AsyncCallback<Void> callback = new AsyncCallback<Void>() {
+ public void onSuccess(Void result) {
+ latch.countDown();
+ }
+
+ public void onFailure(Throwable caught) {
+ String msg = failure.getMessage(
+ selectedAddresses.toString(),
+ Arrays.asList(getSelectedIds(selections)).toString() + " "
+ + caught.getMessage());
+ CoreGUI.getErrorHandler().handleError(msg, caught);
+ latch.countDown();
+ refreshTableInfo();
+ }
+ };
+ int storageNodeId = storageNodeRecord.getAttributeAsInt("id");
+ StorageNode node = new StorageNode(storageNodeId);
+ if (operationType == StorageNodeOperation.DEPLOY) {
+ GWTServiceLookup.getStorageService().deployStorageNode(node, callback);
} else {
- // invoke the operation on the storage service resource
- GWTServiceLookup.getStorageService().invokeOperationOnStorageService(resourceId,
- operationName, new AsyncCallback<Void>() {
- public void onSuccess(Void result) {
- latch.countDown();
- }
-
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- "Scheduling operation " + operationName
- + " failed for resources with ids"
- + Arrays.asList(getSelectedIds(selections)) + " "
- + caught.getMessage(), caught);
- latch.countDown();
- refreshTableInfo();
- }
- });
+ GWTServiceLookup.getStorageService().undeployStorageNode(node, callback);
}
+ } else {
+ // invoke the operation on the storage service resource
+ GWTServiceLookup.getStorageService().invokeOperationOnStorageService(resourceId,
+ operationName, new AsyncCallback<Void>() {
+ public void onSuccess(Void result) {
+ latch.countDown();
+ }
+
+ public void onFailure(Throwable caught) {
+ String msg = failure.getMessage(operationName, selectedAddresses + " "
+ + caught.getMessage());
+ CoreGUI.getErrorHandler().handleError(msg, caught);
+ latch.countDown();
+ refreshTableInfo();
+ }
+ });
}
- } else {
- refreshTableInfo();
}
}
- });
+ } else {
+ refreshTableInfo();
+ }
}
});
}
@@ -331,6 +457,33 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
return true;
}
+ private boolean isDeployable(boolean parentsOpinion, ListGridRecord[] selection) {
+ if (!parentsOpinion || !isEnabled(parentsOpinion, selection)) {
+ return false;
+ }
+ for (ListGridRecord storageNodeRecord : selection) {
+ if ("NORMAL".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
+ || "JOINING".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
+ || "LEAVING".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean isUndeployable(boolean parentsOpinion, ListGridRecord[] selection) {
+ if (!parentsOpinion || !isEnabled(parentsOpinion, selection)) {
+ return false;
+ }
+ for (ListGridRecord storageNodeRecord : selection) {
+ if ("JOINING".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
+ || "LEAVING".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
@Override
protected String getBasePath() {
return VIEW_PATH;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/StorageGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/StorageGWTService.java
index 72f17b18..9470302 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/StorageGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/StorageGWTService.java
@@ -27,6 +27,7 @@ import java.util.Map;
import com.google.gwt.user.client.rpc.RemoteService;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.cloud.StorageClusterSettings;
import org.rhq.core.domain.cloud.StorageNode;
import org.rhq.core.domain.cloud.StorageNodeConfigurationComposite;
@@ -92,4 +93,8 @@ public interface StorageGWTService extends RemoteService {
StorageClusterSettings retrieveClusterSettings() throws RuntimeException;
void updateClusterSettings(StorageClusterSettings clusterSettings) throws RuntimeException;
+
+ void undeployStorageNode(StorageNode storageNode) throws RuntimeException;
+
+ void deployStorageNode(StorageNode storageNode) throws RuntimeException;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java
index ae18075..5548285 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.cloud.StorageClusterSettings;
import org.rhq.core.domain.cloud.StorageNode;
import org.rhq.core.domain.cloud.StorageNodeConfigurationComposite;
@@ -201,5 +202,23 @@ public class StorageGWTServiceImpl extends AbstractGWTServiceImpl implements Sto
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
}
- }
+ }
+
+ @Override
+ public void undeployStorageNode(StorageNode storageNode) throws RuntimeException {
+ try {
+ storageNodeManager.undeployStorageNode(getSessionSubject(), storageNode);
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
+
+ @Override
+ public void deployStorageNode(StorageNode storageNode) throws RuntimeException {
+ try {
+ storageNodeManager.deployStorageNode(getSessionSubject(), storageNode);
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
}