modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java | 31 -- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAlertHistoryView.java | 131 ++++++---- 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 | 14 - modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java | 42 +-- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java | 4 7 files changed, 147 insertions(+), 84 deletions(-)
New commits: commit ac8a69feb34a5b1b9b3af5035a9170c512811c4e Author: Jirka Kremser jkremser@redhat.com Date: Fri Aug 30 15:19:20 2013 +0200
C* UI: Adding a link to the storage node whose child caused the alert to the alert table.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java index dd7aaa3..db5da39 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java @@ -276,6 +276,10 @@ public class LinkManager {
return link; } + + public static String getStorageNodeLink(int storageNodeId) { + return "#Administration/Topology/StorageNodes/" + storageNodeId; + }
public static String getAutodiscoveryQueueLink() { if (GWT) { 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 5526c34..cb3ab83 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 @@ -19,6 +19,7 @@ package org.rhq.enterprise.gui.coregui.client.admin.storage;
import java.util.EnumSet; +import java.util.Map;
import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -27,7 +28,6 @@ import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; import com.smartgwt.client.widgets.tab.events.TabSelectedHandler;
import org.rhq.core.domain.resource.ResourceType; -import org.rhq.core.domain.util.collection.ArrayUtils; import org.rhq.enterprise.gui.coregui.client.BookmarkableView; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.IconEnum; @@ -66,7 +66,7 @@ public class StorageNodeAdminView extends EnhancedVLayout implements Bookmarkabl private TabInfo backupTabInfo = new TabInfo(3, new ViewName("Backup")); private StorageNodeTableView table;
- private int[] resIds; + private Map<Integer, Integer> resIdsToStorageNodeIdsMap;
public StorageNodeAdminView() { super(); @@ -115,11 +115,11 @@ public class StorageNodeAdminView extends EnhancedVLayout implements Bookmarkabl } else if (tabInfo.equals(backupTabInfo)) { tabset.getTabByName(tabInfo.name.getName()).setPane(new Label("in progress..")); } else if (tabInfo.equals(alertsTabInfo)) { - if (resIds != null) { + if (resIdsToStorageNodeIdsMap != null) { tabset.getTabByName(tabInfo.name.getName()).setPane( - new StorageNodeAlertHistoryView("storageNodesAlerts", resIds)); + new StorageNodeAlertHistoryView("storageNodesAlerts", resIdsToStorageNodeIdsMap)); } else { - GWTServiceLookup.getStorageService().findResourcesWithAlertDefinitions(new AsyncCallback<Integer[]>() { + GWTServiceLookup.getStorageService().findResourcesWithAlertDefinitions(new AsyncCallback<Map<Integer, Integer>>() { @Override public void onFailure(Throwable caught) { Message message = new Message("Unable to render storage node alert view: " @@ -128,15 +128,15 @@ public class StorageNodeAdminView extends EnhancedVLayout implements Bookmarkabl }
@Override - public void onSuccess(Integer[] result) { - if (result == null || result.length == 0) { + public void onSuccess(Map<Integer, Integer> result) { + if (result == null || result.size() == 0) { onFailure(new Exception( "Unfortunately, there are no associated resources for the available storage nodes. " + "Check if the agents are running on the machines where the storage nodes are deployed.")); } else { - resIds = ArrayUtils.unwrapArray(result); + resIdsToStorageNodeIdsMap = result; tabset.getTabByName(tabInfo.name.getName()).setPane( - new StorageNodeAlertHistoryView("storageNodesAlerts", resIds)); + new StorageNodeAlertHistoryView("storageNodesAlerts", resIdsToStorageNodeIdsMap)); tabset.selectTab(tabInfo.index); } } @@ -176,19 +176,6 @@ public class StorageNodeAdminView extends EnhancedVLayout implements Bookmarkabl } }
- private void loadResourceType(int resourceTypeId) { - ResourceTypeRepository.Cache.getInstance().getResourceTypes( - resourceTypeId, - EnumSet.of(ResourceTypeRepository.MetadataType.content, ResourceTypeRepository.MetadataType.operations, - ResourceTypeRepository.MetadataType.measurements, ResourceTypeRepository.MetadataType.events, - ResourceTypeRepository.MetadataType.resourceConfigurationDefinition), - new ResourceTypeRepository.TypeLoadedCallback() { - public void onTypesLoaded(ResourceType type) { - - } - }); - } - private void scheduleUnacknowledgedAlertsPollingJob(final NamedTab alerts) { new Timer() { public void run() { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAlertHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAlertHistoryView.java index 9fa55a6..6005cf6 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAlertHistoryView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAlertHistoryView.java @@ -19,6 +19,9 @@ package org.rhq.enterprise.gui.coregui.client.admin.storage;
import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.Record; @@ -36,6 +39,7 @@ import org.rhq.core.domain.cloud.StorageNode; import org.rhq.core.domain.criteria.AlertCriteria; import org.rhq.core.domain.criteria.StorageNodeCriteria; import org.rhq.core.domain.util.PageList; +import org.rhq.core.domain.util.collection.ArrayUtils; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.ImageManager; import org.rhq.enterprise.gui.coregui.client.LinkManager; @@ -48,50 +52,35 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.AncestryUtil; import org.rhq.enterprise.gui.coregui.client.util.StringUtility;
/** + * The view for accessing alerts on storage node resource and its children. + * * @author Jirka Kremser - * */ public class StorageNodeAlertHistoryView extends AlertHistoryView { private boolean isGouped = true; private final HTMLFlow header; private final int storageNodeId; + private final boolean allStorageNodes; + private Map<Integer, Integer> resourceIdToStorageNodeIdMap; + private Map<Integer, String> storageNodeIdToAddressMap;
- public StorageNodeAlertHistoryView(String tableTitle, int[] resourceIds) { - this(tableTitle, resourceIds, null, -1); + public StorageNodeAlertHistoryView(String tableTitle, Map<Integer, Integer> resourceIdToStorageNodeIdMap) { + this(tableTitle, ArrayUtils.unwrapArray(resourceIdToStorageNodeIdMap.keySet().toArray(new Integer[]{})), null, -1); + this.resourceIdToStorageNodeIdMap = resourceIdToStorageNodeIdMap; }
public StorageNodeAlertHistoryView(String tableTitle, int[] resourceIds, HTMLFlow header, int storageNodeId) { super(tableTitle, resourceIds); this.header = header; - this.storageNodeId = storageNodeId; + this.storageNodeId = -1; + this.allStorageNodes = storageNodeId == -1; + storageNodeIdToAddressMap = new HashMap<Integer, String>(); }
@Override protected void onInit() { super.onInit(); - if (header != null && storageNodeId != -1) { - StorageNodeCriteria criteria = new StorageNodeCriteria(); - criteria.addFilterId(storageNodeId); - GWTServiceLookup.getStorageService().findStorageNodesByCriteria(criteria, - 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))); - } - final StorageNode node = storageNodes.get(0); - header - .setContents("<div style='text-align: center; font-weight: bold; font-size: medium;'> Storage Node (" - + node.getAddress() + ")</div>"); - } - - public void onFailure(Throwable caught) { - CoreGUI.getErrorHandler().handleError( - MSG.view_adminTopology_message_fetchServerFail(String.valueOf(storageNodeId)) + " " - + caught.getMessage(), caught); - } - }); - } + fetchAddresses(); }
@Override @@ -107,19 +96,20 @@ public class StorageNodeAlertHistoryView extends AlertHistoryView { || AncestryUtil.RESOURCE_ANCESTRY.equals(field.getName())) { continue; } if (AlertCriteria.SORT_FIELD_CTIME.equals(field.getName())) { - field.setWidth(240); - field.setShowGridSummary(true); - field.setShowGroupSummary(true); - field.setSummaryFunction(new SummaryFunction() { - public Object getSummaryValue(Record[] records, ListGridField field) { - if (records != null && records.length > 0 && records[0] != null) { - Integer resourceId = records[0].getAttributeAsInt(AncestryUtil.RESOURCE_ID); - Integer defId = records[0].getAttributeAsInt("definitionId"); - String url = LinkManager.getSubsystemAlertDefinitionLink(resourceId, defId); - return LinkManager.getHref(url, "Link to Definition"); - } else return ""; - } - }); +// field.setShowGridSummary(true); +// field.setShowGroupSummary(true); +// field.setSummaryFunction(new SummaryFunction() { +// public Object getSummaryValue(Record[] records, ListGridField field) { +// if (records != null && records.length > 0 && records[0] != null) { +// http://localhost:7080/coregui/#Administration/Configuration/AlertDefTemplate... +// +// Integer resourceId = records[0].getAttributeAsInt(AncestryUtil.RESOURCE_ID); +// Integer defId = records[0].getAttributeAsInt("definitionId"); +// String url = LinkManager.getSubsystemAlertDefinitionLink(resourceId, defId); +// return LinkManager.getHref(url, "Link to Definition"); +// } else return ""; +// } +// }); field.setCellFormatter(new CellFormatter() { public String format(Object o, ListGridRecord listGridRecord, int i, int i1) { if (listGridRecord.getAttribute("groupValue") != null) { @@ -180,6 +170,24 @@ public class StorageNodeAlertHistoryView extends AlertHistoryView { ListGridField descriptionField = new ListGridField("description", MSG.common_title_description()); descriptionField.setCanSortClientOnly(true); newFields.add(descriptionField); + + if (allStorageNodes) { // all storage nodes + ListGridField storageNodeLinkField = new ListGridField("storageNodeLink", "Storage Node"); + storageNodeLinkField.setCellFormatter(new CellFormatter() { + public String format(Object o, ListGridRecord listGridRecord, int i, int i1) { + if (listGridRecord.getAttribute("groupValue") != null) { + return (String) o; + } + Integer resourceId = listGridRecord.getAttributeAsInt(AncestryUtil.RESOURCE_ID); + int storageNodeId = resourceIdToStorageNodeIdMap.get(resourceId); + String url = LinkManager.getStorageNodeLink(storageNodeId); + return LinkManager.getHref(url, storageNodeIdToAddressMap.get(storageNodeId)); + + } + }); + storageNodeLinkField.setWidth(90); + newFields.add(2, storageNodeLinkField); + } return newFields; } }; @@ -217,6 +225,49 @@ public class StorageNodeAlertHistoryView extends AlertHistoryView { CoreGUI.goToView(getDetailUrlFromRecord(record)); }
+ private void fetchAddresses() { + if (header != null && !allStorageNodes) { + StorageNodeCriteria criteria = new StorageNodeCriteria(); + criteria.addFilterId(storageNodeId); + GWTServiceLookup.getStorageService().findStorageNodesByCriteria(criteria, + 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))); + } + final StorageNode node = storageNodes.get(0); + header + .setContents("<div style='text-align: center; font-weight: bold; font-size: medium;'> Storage Node (" + + node.getAddress() + ")</div>"); + } + + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError( + MSG.view_adminTopology_message_fetchServerFail(String.valueOf(storageNodeId)) + " " + + caught.getMessage(), caught); + } + }); + } else { // fetch the addresses of all storage nodes + GWTServiceLookup.getStorageService().getStorageNodes(new AsyncCallback<List<StorageNode>>() { + public void onSuccess(final List<StorageNode> storageNodes) { + if (storageNodes != null && !storageNodes.isEmpty()) { + for (StorageNode node : storageNodes) { + storageNodeIdToAddressMap.put(node.getId(), node.getAddress()); + } + } + } + + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError( + MSG.view_adminTopology_message_fetchServerFail(String.valueOf(storageNodeId)) + " " + + caught.getMessage(), caught); + } + }); + + } + } + private String getDetailUrlFromRecord(ListGridRecord record) { if (record == null) { throw new IllegalArgumentException("'record' parameter is null."); 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 9470302..f24e4b0 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,7 +27,6 @@ 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; @@ -76,7 +75,9 @@ public interface StorageGWTService extends RemoteService {
PageList<StorageNodeLoadComposite> getStorageNodeComposites() throws RuntimeException;
- Integer[] findResourcesWithAlertDefinitions() throws RuntimeException; + List<StorageNode> getStorageNodes() throws RuntimeException; + + Map<Integer, Integer> findResourcesWithAlertDefinitions() throws RuntimeException;
Integer[] findResourcesWithAlertDefinitions(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 9ce328e..9d6c7ba 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 @@ -111,9 +111,19 @@ public class StorageGWTServiceImpl extends AbstractGWTServiceImpl implements Sto }
@Override - public Integer[] findResourcesWithAlertDefinitions() throws RuntimeException { + public List<StorageNode> getStorageNodes() throws RuntimeException { try { - return storageNodeManager.findResourcesWithAlertDefinitions(); + return SerialUtility.prepare(storageNodeManager.getStorageNodes(), + "StorageGWTServiceImpl.getStorageNodes"); + } catch (Throwable t) { + throw getExceptionToThrowToClient(t); + } } + + @Override + public Map<Integer, Integer> findResourcesWithAlertDefinitions() throws RuntimeException { + try { + return SerialUtility.prepare(storageNodeManager.findResourcesWithAlertDefinitions(), + "StorageGWTServiceImpl.findResourcesWithAlertDefinitions"); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java index b30e50a..eda6ae1 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java @@ -670,12 +670,21 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN }
@Override - public Integer[] findResourcesWithAlertDefinitions() { - return this.findResourcesWithAlertDefinitions(null); + public Map<Integer, Integer> findResourcesWithAlertDefinitions() { + return this.findResourcesWithAlertsToStorageNodeMap(null); }
@Override public Integer[] findResourcesWithAlertDefinitions(StorageNode storageNode) { + Map<Integer, Integer> result = findResourcesWithAlertsToStorageNodeMap(storageNode); + if (result != null) { + Set<Integer> resourceIds = result.keySet(); + return resourceIds.toArray(new Integer[resourceIds.size()]); + } + return new Integer[0]; + } + + private Map<Integer, Integer> findResourcesWithAlertsToStorageNodeMap(StorageNode storageNode) { List<StorageNode> initialStorageNodes = getStorageNodes(); if (storageNode == null) { initialStorageNodes = getStorageNodes(); @@ -684,29 +693,30 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN StorageNode.class, storageNode.getId()) : storageNode); }
+ Map<Integer, Integer> resourceIdsToStorageNodeMap = new HashMap<Integer, Integer>(); Queue<Resource> unvisitedResources = new LinkedList<Resource>(); + + // we are assuming here that the set of resources is disjunktive across different storage nodes for (StorageNode initialStorageNode : initialStorageNodes) { if (initialStorageNode.getResource() != null) { unvisitedResources.add(initialStorageNode.getResource()); - } - } - - List<Integer> resourceIdsWithAlertDefinitions = new ArrayList<Integer>(); - while (!unvisitedResources.isEmpty()) { - Resource resource = unvisitedResources.poll(); - if (resource.getAlertDefinitions() != null) { - resourceIdsWithAlertDefinitions.add(resource.getId()); - } + while (!unvisitedResources.isEmpty()) { + Resource resource = unvisitedResources.poll(); + if (resource.getAlertDefinitions() != null) { + resourceIdsToStorageNodeMap.put(resource.getId(), initialStorageNode.getId()); + }
- Set<Resource> childResources = resource.getChildResources(); - if (childResources != null) { - for (Resource child : childResources) { - unvisitedResources.add(child); + Set<Resource> childResources = resource.getChildResources(); + if (childResources != null) { + for (Resource child : childResources) { + unvisitedResources.add(child); + } + } } } }
- return resourceIdsWithAlertDefinitions.toArray(new Integer[resourceIdsWithAlertDefinitions.size()]); + return resourceIdsToStorageNodeMap; }
@Override diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java index b689b8b..f740a27 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java @@ -128,9 +128,9 @@ public interface StorageNodeManagerLocal { * have alert definitions. This can be used by the resource criteria queries to find * all alerts triggered for storage nodes resources. * - * @return resource ids + * @return map with resource (with defined alert) id as a key and storage node id as a value */ - Integer[] findResourcesWithAlertDefinitions(); + Map<Integer, Integer> findResourcesWithAlertDefinitions();
/** * Find ids for all resources and sub-resources, of the specified storage node, that
rhq-commits@lists.fedorahosted.org