modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java | 29
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 1
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 1
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 1
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties | 86 ++
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 1
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties | 87 ++
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 1
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java | 401 ++++++++++
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/TestMeasurementOOB.java | 97 ++
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 6
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/Overlord.java | 44 +
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/OverlordProducer.java | 57 +
modules/enterprise/server/itests-2/src/test/resources/arquillian.xml | 7
17 files changed, 835 insertions(+), 9 deletions(-)
New commits:
commit 74797b282db28706ed43971829fa8b5ee0197e25
Merge: 1ea6da5 875acb2
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 24 09:25:41 2013 -0500
Merge remote-tracking branch 'origin/master' into bug/902406
commit 875acb2dde6de2de0e5dee792ed437ace1252271
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Thu Jan 24 14:47:15 2013 +0100
Adding "Last Availability Ping" to the agent detail page in topology section and to the agent detail page in Inventory->Agent tab
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java
index f8de3a6..0b13a1b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java
@@ -23,6 +23,7 @@ import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasour
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_AFFINITY_GROUP_ID;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_AGENTTOKEN;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_ID;
+import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_LAST_AVAILABILITY_PING;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_LAST_AVAILABILITY_REPORT;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_NAME;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_PORT;
@@ -101,9 +102,12 @@ public class AgentDatasource extends RPCDataSource<Agent, AgentCriteria> {
fields.add(serverIdField);
fields.add(FIELD_PORT.getListGridField("90"));
- ListGridField lastAvailabilityReportField = FIELD_LAST_AVAILABILITY_REPORT.getListGridField("120");
+ ListGridField lastAvailabilityReportField = FIELD_LAST_AVAILABILITY_REPORT.getListGridField("125");
TimestampCellFormatter.prepareDateField(lastAvailabilityReportField);
fields.add(lastAvailabilityReportField);
+ ListGridField lastAvailabilityPingField = FIELD_LAST_AVAILABILITY_PING.getListGridField("125");
+ TimestampCellFormatter.prepareDateField(lastAvailabilityPingField);
+ fields.add(lastAvailabilityPingField);
if (!isAffinityGroupId) {
fields.add(FIELD_AFFINITY_GROUP.getListGridField("100"));
@@ -155,6 +159,7 @@ public class AgentDatasource extends RPCDataSource<Agent, AgentCriteria> {
record.setAttribute(FIELD_SERVER.propertyName(), from.getServer() == null ? "" : from.getServer().getName());
record.setAttribute(FIELD_SERVER_ID.propertyName(), from.getServer() == null ? "" : from.getServer().getId());
record.setAttribute(FIELD_LAST_AVAILABILITY_REPORT.propertyName(), from.getLastAvailabilityReport());
+ record.setAttribute(FIELD_LAST_AVAILABILITY_PING.propertyName(), from.getLastAvailabilityPing());
record.setAttribute(FIELD_AFFINITY_GROUP.propertyName(), from.getAffinityGroup() == null ? "" : from
.getAffinityGroup().getName());
record.setAttribute(FIELD_AFFINITY_GROUP_ID.propertyName(), from.getAffinityGroup() == null ? "" : from
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java
index cd736aa..132ee74 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java
@@ -46,6 +46,9 @@ public enum AgentDatasourceField {
FIELD_LAST_AVAILABILITY_REPORT("lastAvailabilityReport", CoreGUI.getMessages()
.view_adminTopology_agent_lastAvailabilityReport()),
+
+ FIELD_LAST_AVAILABILITY_PING("lastAvailabilityPing", CoreGUI.getMessages()
+ .view_adminTopology_agent_lastAvailabilityPing()),
FIELD_AGENT_TOKEN("agentToken", CoreGUI.getMessages().view_adminTopology_agentDetail_token()),
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java
index b05a751..50210b5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java
@@ -22,6 +22,7 @@ package org.rhq.enterprise.gui.coregui.client.admin.topology;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_ADDRESS;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_AFFINITY_GROUP;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_AGENT_TOKEN;
+import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_LAST_AVAILABILITY_PING;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_LAST_AVAILABILITY_REPORT;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_NAME;
import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_PORT;
@@ -177,11 +178,17 @@ public class AgentDetailView extends LocatableVLayout {
final StaticTextItem tokenItem = new StaticTextItem(FIELD_AGENT_TOKEN.propertyName(), FIELD_AGENT_TOKEN.title());
tokenItem.setValue(agent.getAgentToken());
- StaticTextItem lastAvailabilityItem = new StaticTextItem(FIELD_LAST_AVAILABILITY_REPORT.propertyName(),
+ StaticTextItem lastAvailabilityReportItem = new StaticTextItem(FIELD_LAST_AVAILABILITY_REPORT.propertyName(),
FIELD_LAST_AVAILABILITY_REPORT.title());
String lastReport = agent.getLastAvailabilityReport() == null ? "unknown" : TimestampCellFormatter.format(
Long.valueOf(agent.getLastAvailabilityReport()), TimestampCellFormatter.DATE_TIME_FORMAT_LONG);
- lastAvailabilityItem.setValue(lastReport);
+ lastAvailabilityReportItem.setValue(lastReport);
+
+ StaticTextItem lastAvailabilityPingItem = new StaticTextItem(FIELD_LAST_AVAILABILITY_PING.propertyName(),
+ FIELD_LAST_AVAILABILITY_PING.title());
+ String lastPing = agent.getLastAvailabilityPing() == null ? "unknown" : TimestampCellFormatter.format(
+ Long.valueOf(agent.getLastAvailabilityPing()), TimestampCellFormatter.DATE_TIME_FORMAT_LONG);
+ lastAvailabilityPingItem.setValue(lastPing);
// make clickable link for affinity group
StaticTextItem affinityGroupItem = new StaticTextItem(FIELD_AFFINITY_GROUP.propertyName(),
@@ -206,8 +213,8 @@ public class AgentDetailView extends LocatableVLayout {
}
currentServerItem.setValue(serverValue);
- form.setItems(nameItem, addressItem, remoteEndpointItem, portItem, tokenItem, lastAvailabilityItem,
- affinityGroupItem, currentServerItem);
+ form.setItems(nameItem, addressItem, remoteEndpointItem, portItem, tokenItem, lastAvailabilityReportItem,
+ lastAvailabilityPingItem, affinityGroupItem, currentServerItem);
SectionStackSection section = new SectionStackSection(MSG.common_title_details());
section.setExpanded(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java
index ff1addc..478207e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java
@@ -34,9 +34,12 @@ import org.rhq.core.domain.resource.Agent;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.RefreshableView;
+import org.rhq.enterprise.gui.coregui.client.admin.topology.AgentTableView;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.StringUtility;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* The content pane for the Resource Inventory>Agent subtab.
@@ -52,7 +55,9 @@ public class ResourceResourceAgentView extends LocatableVLayout implements Refre
private StaticTextItem portValue;
private FormItemIcon agentStatusIcon;
private StaticTextItem lastAvailReportValue;
+ private StaticTextItem lastAvailPingValue;
private StaticTextItem endpointValue;
+ private StaticTextItem topologyViewItem;
private boolean loading = false; // will be true if loadData is currently waiting for responses
@@ -116,11 +121,21 @@ public class ResourceResourceAgentView extends LocatableVLayout implements Refre
lastAvailReportValue = new StaticTextItem(lastAvailReport, MSG.view_inventory_summary_agent_last_title());
lastAvailReportValue.setWrapTitle(false);
formItems.add(lastAvailReportValue);
+
+ // Last Received Avail ping
+ lastAvailPingValue = new StaticTextItem("last-avail-ping", MSG.view_adminTopology_agent_lastAvailabilityPing());
+ lastAvailPingValue.setWrapTitle(false);
+ formItems.add(lastAvailPingValue);
// Full Endpoint
String fullEndpoint = "full-endpoint";
endpointValue = new StaticTextItem(fullEndpoint, MSG.view_inventory_summary_agent_fullEnpoint());
formItems.add(endpointValue);
+
+ // link to agent topology view
+ String topologyView = "topology-view";
+ topologyViewItem = new StaticTextItem("topology-view", MSG.view_admin_topology());
+ formItems.add(topologyViewItem);
return formItems;
}
@@ -170,20 +185,28 @@ public class ResourceResourceAgentView extends LocatableVLayout implements Refre
form.markForRedraw();
}
});
-
nameValue.setValue(agent.getName());
addressValue.setValue(agent.getAddress());
portValue.setValue(agent.getPort());
- Long lastAvail = agent.getLastAvailabilityReport();
- lastAvailReportValue.setValue((null != lastAvail) ? new Date(lastAvail) : MSG.common_val_none());
+ Long lastAvailReport = agent.getLastAvailabilityReport();
+ lastAvailReportValue.setValue((null != lastAvailReport) ? new Date(lastAvailReport) : MSG.common_val_none());
+ Long lastAvailPing = agent.getLastAvailabilityPing();
+ lastAvailPingValue.setValue((null != lastAvailPing) ? new Date(lastAvailPing) : MSG.common_val_none());
String remoteEndpoint = agent.getRemoteEndpoint();
if (remoteEndpoint != null) {
// some browsers (firefox in particular) won't wrap unless you put breaks in the string
+ // (EDIT: in FF 16 the wrapping works even without a space, so this could be possibly ommited)
remoteEndpoint = remoteEndpoint.replaceAll("&", " &");
} else {
remoteEndpoint = MSG.view_inventory_summary_agent_fullEnpoint_err1();
}
endpointValue.setValue(remoteEndpoint);
+
+ // make clickable link for agent topology view
+ String detailsUrl = "#" + AgentTableView.VIEW_PATH + "/" + agent.getId();
+ String formattedValue = StringUtility.escapeHtml(MSG.common_label_link());
+ String topologyViewItemText = SeleniumUtility.getLocatableHref(detailsUrl, formattedValue, null);
+ topologyViewItem.setValue(topologyViewItemText);
form.markForRedraw();
}
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 2068272..4c29ae3 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -551,6 +551,7 @@ view_adminTopology_agent_agentBindAddress = Agent Bind Address
view_adminTopology_agent_agentBindPort = Agent Bind Port
view_adminTopology_agent_agentName = Agent Name
view_adminTopology_agent_connectedServer = Connected Server
+view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping
view_adminTopology_agent_lastAvailabilityReport = Last Availability Report
view_adminTopology_agents = Agents
view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number does not correspond to the number of currently connected agents.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 004a414..9fa7b83 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -517,6 +517,7 @@ view_adminTopology_affinityGroups = Affinitätsgruppen
##view_adminTopology_agent_agentBindPort = Agent Bind Port
##view_adminTopology_agent_agentName = Agent Name
##view_adminTopology_agent_connectedServer = Connected Server
+##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping
##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report
view_adminTopology_agents = Agenten
##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 411fb71..404736b 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -549,6 +549,7 @@ view_adminTopology_affinityGroups = アフィニティグループ
##view_adminTopology_agent_agentBindPort = Agent Bind Port
##view_adminTopology_agent_agentName = Agent Name
##view_adminTopology_agent_connectedServer = Connected Server
+##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping
##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report
view_adminTopology_agents = エージェント
##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties
index 29b0ba7..f358bc7 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties
@@ -455,9 +455,95 @@ view_adminTemplates_prompt_disabledMetricTemplates = 이 자원 유형에 대해
view_adminTemplates_prompt_enabledMetricTemplates = 이 자원 유형에 대해 기본적으로 활성화된 통계 일정 수
view_adminTemplates_servers = 서버
view_adminTopology_affinityGroups = 선호도 그룹
+##view_adminTopology_affinityGroups_agentCount = Agent Count
+##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group
+##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group
+##view_adminTopology_affinityGroups_agetnMembers = Agent Members
+##view_adminTopology_affinityGroups_createNew = Create New
+##view_adminTopology_affinityGroups_details = Affinity Group Details
+##view_adminTopology_affinityGroups_removeSelected = Remove Selected
+##view_adminTopology_affinityGroups_serverCount = Server Count
+##view_adminTopology_affinityGroups_serverMembers = Server Members
+##view_adminTopology_agentDetail_address = Address
+##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List
+##view_adminTopology_agentDetail_currentServer = Current Server
+##view_adminTopology_agentDetail_token = Token
+##view_adminTopology_agent_agentBindAddress = Agent Bind Address
+##view_adminTopology_agent_agentBindPort = Agent Bind Port
+##view_adminTopology_agent_agentName = Agent Name
+##view_adminTopology_agent_connectedServer = Connected Server
+##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping
+##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report
view_adminTopology_agents = 에이전트
+##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents.
+##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}.
+##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}.
+##view_adminTopology_message_agroupRemovingAgentsFail = Unable to remove agents from the affinity group with id {0}.
+##view_adminTopology_message_agroupRemovingServersFail = Unable to remove servers from the affinity group with id {0}.
+##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}.
+##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}.
+##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}.
+##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents.
+##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}.
+##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}.
+##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s).
+##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details.
+##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}.
+##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events.
+##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}.
+##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers.
+##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}.
+##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server.
+##view_adminTopology_message_forceRepartitionFail = Unable to run repartition.
+##view_adminTopology_message_order = Order
+##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}?
+##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}.
+##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events?
+##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}?
+##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s).
+##view_adminTopology_message_removeServerConfirm = Do you really want to remove servers {0}?
+##view_adminTopology_message_removeServerFail = Unable to remove {0} server(s).
+##view_adminTopology_message_removedAGroups = Removed {0} affinity group(s).
+##view_adminTopology_message_removedAllPEvent = All partition events have been purged.
+##view_adminTopology_message_removedAllPEventFail = Unable to purge all partition events.
+##view_adminTopology_message_removedPEvent = Removed {0} partition events(s).
+##view_adminTopology_message_removedServer = Removed {0} server(s).
+##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked.
+##view_adminTopology_message_serverUpdateFail = Unable to update server {0}.
+##view_adminTopology_message_serverUpdated = The server {0} was successfully updated.
+##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode.
+##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode?
+##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode.
view_adminTopology_partitionEvents = 이벤트 범주
+##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments
+##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event
+##view_adminTopology_partitionEventsDetail_eventDetails = Event Details
+##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time
+##view_adminTopology_partitionEventsDetail_eventType = Event Type
+##view_adminTopology_partitionEvents_details = Details
+##view_adminTopology_partitionEvents_detailsFilter = Details Filter
+##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter
+##view_adminTopology_partitionEvents_execTime = Execution Time
+##view_adminTopology_partitionEvents_executionStatus = Execution Status
+##view_adminTopology_partitionEvents_forceRepartition = Force Repartition
+##view_adminTopology_partitionEvents_initiatedBy = Initiated By
+##view_adminTopology_partitionEvents_purgeAll = Purge All
+##view_adminTopology_partitionEvents_type = Type
+##view_adminTopology_partitionEvents_typeFilter = Type Filter
view_adminTopology_remoteAgentInstall = 원격 에이전트 설치
+##view_adminTopology_serverDetail_connectedAgents = Connected Agents
+##view_adminTopology_serverDetail_installationDate = Installation Date
+##view_adminTopology_serverDetail_operationMode = Operation Mode
+##view_adminTopology_server_affinityGroup = Affinity Group
+##view_adminTopology_server_agentCount = Agent Count
+##view_adminTopology_server_endpointAddress = Endpoint Address
+##view_adminTopology_server_lastUpdateTime = Last Update Time
+##view_adminTopology_server_mode = Mode
+##view_adminTopology_server_nonSecurePort = Nonsecure Port
+##view_adminTopology_server_removeSelected = Remove Selected
+##view_adminTopology_server_securePort = Secure Port
+##view_adminTopology_server_setMaintenance = Set Maintenance
+##view_adminTopology_server_setNormal = Set Normal
view_adminTopology_servers = 서버
view_adminUsersDetails_dataTypeName = 사용자
view_adminUsers_failCreateUserWithExistingName = 기존 이름 [{0}]과 사용자를 만들지 못했습니다. 다른 이름을 사용하십시오.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 9699756..f5121ae 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -554,6 +554,7 @@ view_adminTopology_affinityGroups = Grupos de Afinidade
##view_adminTopology_agent_agentBindPort = Agent Bind Port
##view_adminTopology_agent_agentName = Agent Name
##view_adminTopology_agent_connectedServer = Connected Server
+##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping
##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report
view_adminTopology_agents = Agentes
##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties
index 0d56ebc..d4ec501 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties
@@ -516,10 +516,97 @@
#view_adminTemplates_servers = Servers
#view_adminTemplates_userTemplates = User Templates
#view_adminTopology_affinityGroups = Affinity Groups
+##view_adminTopology_affinityGroups_agentCount = Agent Count
+##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group
+##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group
+##view_adminTopology_affinityGroups_agetnMembers = Agent Members
+##view_adminTopology_affinityGroups_createNew = Create New
+##view_adminTopology_affinityGroups_details = Affinity Group Details
+##view_adminTopology_affinityGroups_removeSelected = Remove Selected
+##view_adminTopology_affinityGroups_serverCount = Server Count
+##view_adminTopology_affinityGroups_serverMembers = Server Members
+##view_adminTopology_agentDetail_address = Address
+##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List
+##view_adminTopology_agentDetail_currentServer = Current Server
+##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint
+##view_adminTopology_agentDetail_token = Token
+##view_adminTopology_agent_agentBindAddress = Agent Bind Address
+##view_adminTopology_agent_agentBindPort = Agent Bind Port
+##view_adminTopology_agent_agentName = Agent Name
+##view_adminTopology_agent_connectedServer = Connected Server
+##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping
+##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report
#view_adminTopology_agents = Agents
+##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents.
+##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}.
+##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}.
+##view_adminTopology_message_agroupRemovingAgentsFail = Unable to remove agents from the affinity group with id {0}.
+##view_adminTopology_message_agroupRemovingServersFail = Unable to remove servers from the affinity group with id {0}.
+##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}.
+##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}.
+##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}.
+##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents.
+##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}.
+##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}.
+##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s).
+##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details.
+##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}.
+##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events.
+##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}.
+##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers.
+##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}.
+##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server.
+##view_adminTopology_message_forceRepartitionFail = Unable to run repartition.
+##view_adminTopology_message_order = Order
+##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}?
+##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}.
+##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events?
+##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}?
+##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s).
+##view_adminTopology_message_removeServerConfirm = Do you really want to remove servers {0}?
+##view_adminTopology_message_removeServerFail = Unable to remove {0} server(s).
+##view_adminTopology_message_removedAGroups = Removed {0} affinity group(s).
+##view_adminTopology_message_removedAllPEvent = All partition events have been purged.
+##view_adminTopology_message_removedAllPEventFail = Unable to purge all partition events.
+##view_adminTopology_message_removedPEvent = Removed {0} partition events(s).
+##view_adminTopology_message_removedServer = Removed {0} server(s).
+##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked.
+##view_adminTopology_message_serverUpdateFail = Unable to update server {0}.
+##view_adminTopology_message_serverUpdated = The server {0} was successfully updated.
+##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode.
+##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode?
+##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode.
#view_adminTopology_partitionEvents = Partition Events
+##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments
+##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event
+##view_adminTopology_partitionEventsDetail_eventDetails = Event Details
+##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time
+##view_adminTopology_partitionEventsDetail_eventType = Event Type
+##view_adminTopology_partitionEvents_details = Details
+##view_adminTopology_partitionEvents_detailsFilter = Details Filter
+##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter
+##view_adminTopology_partitionEvents_execTime = Execution Time
+##view_adminTopology_partitionEvents_executionStatus = Execution Status
+##view_adminTopology_partitionEvents_forceRepartition = Force Repartition
+##view_adminTopology_partitionEvents_initiatedBy = Initiated By
+##view_adminTopology_partitionEvents_purgeAll = Purge All
+##view_adminTopology_partitionEvents_type = Type
+##view_adminTopology_partitionEvents_typeFilter = Type Filter
#view_adminTopology_remoteAgentInstall = Remote Agent Install
#view_adminTopology_servers = Servers
+##view_adminTopology_serverDetail_connectedAgents = Connected Agents
+##view_adminTopology_serverDetail_installationDate = Installation Date
+##view_adminTopology_serverDetail_operationMode = Operation Mode
+##view_adminTopology_server_affinityGroup = Affinity Group
+##view_adminTopology_server_agentCount = Agent Count
+##view_adminTopology_server_endpointAddress = Endpoint Address
+##view_adminTopology_server_lastUpdateTime = Last Update Time
+##view_adminTopology_server_mode = Mode
+##view_adminTopology_server_nonSecurePort = Nonsecure Port
+##view_adminTopology_server_removeSelected = Remove Selected
+##view_adminTopology_server_securePort = Secure Port
+##view_adminTopology_server_setMaintenance = Set Maintenance
+##view_adminTopology_server_setNormal = Set Normal
#view_adminUsersDetails_dataTypeName = user
#view_admin_administration = Administration
#view_admin_configuration = Configuration
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index f6abf6b..40a8517 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -541,6 +541,7 @@ view_adminTopology_affinityGroups = \u76f8\u5173\u7ec4
##view_adminTopology_agent_agentBindPort = Agent Bind Port
##view_adminTopology_agent_agentName = Agent Name
##view_adminTopology_agent_connectedServer = Connected Server
+##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping
##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report
view_adminTopology_agents = \u4ee3\u7406
##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents.
commit 459d29e981d402cc89c6ea5692e611720db9181f
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jan 23 22:16:39 2013 -0500
adding support for making overlord available via CDI injection
Lots of tests have boiler plate code to obtain the overlord. With this commit,
you can now do,
public class MyTest {
@Inject @Overlord
private Subject overlord;
}
That will inject a cached copy of the overlord eliminating extra calls to the
database.
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java
index d646b29..067614e 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java
@@ -40,6 +40,7 @@ import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
+import javax.inject.Inject;
import javax.persistence.EntityManager;
import org.joda.time.DateTime;
@@ -55,13 +56,13 @@ import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.util.jdbc.JDBCUtil;
-import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.drift.DriftServerPluginService;
import org.rhq.enterprise.server.measurement.util.MeasurementDataManagerUtility;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.test.TransactionCallback;
import org.rhq.enterprise.server.test.TransactionCallbackReturnable;
+import org.rhq.enterprise.server.util.Overlord;
import org.rhq.enterprise.server.util.ResourceTreeHelper;
/**
@@ -93,12 +94,10 @@ public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test {
private List<MeasurementSchedule> schedules;
+ @Inject @Overlord
private Subject overlord;
@EJB
- private SubjectManagerLocal subjectManager;
-
- @EJB
private ResourceManagerLocal resourceManager;
@EJB
@@ -115,7 +114,6 @@ public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test {
prepareCustomServerPluginService(driftServerPluginService);
driftServerPluginService.masterConfig.getPluginDirectory().mkdirs();
- overlord = subjectManager.getOverlord();
measurementDefs = new ArrayList<MeasurementDefinition>();
schedules = new ArrayList<MeasurementSchedule>();
createInventory();
@@ -237,9 +235,6 @@ public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test {
.setParameter("defs", measurementDefs)
.executeUpdate();
}
-//
-// em.createQuery("delete from MeasurementDefinition " + "where dataType = :dataType and " + "name = :name")
-// .setParameter("dataType", MEASUREMENT).setParameter("name", DYNAMIC_DEF_NAME).executeUpdate();
}
private void deleteAgent() {
@@ -367,17 +362,6 @@ public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test {
});
}
- private DateTime hour0() {
- DateTime rightNow = now();
- return rightNow.hourOfDay().roundFloorCopy().minusHours(
- rightNow.hourOfDay().roundFloorCopy().hourOfDay().get());
- }
-
- private MeasurementBaseline getBaseline() {
- List<MeasurementBaseline> baselines = baselineManager.findBaselinesForResource(overlord, resource.getId());
- return baselines.get(0);
- }
-
private MeasurementBaseline baseline(MeasurementSchedule schedule, double mean, double max, double min) {
MeasurementBaseline baseline = new MeasurementBaseline();
baseline.setSchedule(schedule);
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index b1b3aaf..e4dbc4b 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -40,6 +40,7 @@ import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.Filters;
import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
import org.jboss.shrinkwrap.api.asset.ClassAsset;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.exporter.ZipExporter;
@@ -121,7 +122,8 @@ public abstract class AbstractEJB3Test extends Arquillian {
testClassesJar.addAsResource("test-ldap.properties");
testClassesJar.addAsResource("test-scheduler.properties");
testClassesJar
- .addAsResource("org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml");
+ .addAsResource(
+ "org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml");
testClassesJar
.addAsResource("org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml");
testClassesJar.addAsResource("org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml");
@@ -319,6 +321,8 @@ public abstract class AbstractEJB3Test extends Arquillian {
testEar.add(new ClassAsset(StrippedDownStartupBeanPreparation.class), ArchivePaths
.create("/rhq-enterprise-server-ejb3.jar/org/rhq/enterprise/server/test/"
+ "StrippedDownStartupBeanPreparation.class"));
+ testEar.addAsManifestResource(new ByteArrayAsset("<beans/>".getBytes()),
+ ArchivePaths.create("beans.xml"));
// add the test classes to the deployment
testEar.addAsLibrary(testClassesJar);
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/Overlord.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/Overlord.java
new file mode 100644
index 0000000..b915b10
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/Overlord.java
@@ -0,0 +1,44 @@
+/*
+ *
+ * * RHQ Management Platform
+ * * Copyright (C) 2005-2012 Red Hat, Inc.
+ * * All rights reserved.
+ * *
+ * * This program is free software; you can redistribute it and/or modify
+ * * it under the terms of the GNU General Public License, version 2, as
+ * * published by the Free Software Foundation, and/or the GNU Lesser
+ * * General Public License, version 2.1, also as published by the Free
+ * * Software Foundation.
+ * *
+ * * This program 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 and the GNU Lesser General Public License
+ * * for more details.
+ * *
+ * * You should have received a copy of the GNU General Public License
+ * * and the GNU Lesser General Public License along with this program;
+ * * if not, write to the Free Software Foundation, Inc.,
+ * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+package org.rhq.enterprise.server.util;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+/**
+ * @author John Sanda
+ */
+@Qualifier
+@Retention(RUNTIME)
+@Target({FIELD, METHOD})
+public @interface Overlord {
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/OverlordProducer.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/OverlordProducer.java
new file mode 100644
index 0000000..1c25ec8
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/OverlordProducer.java
@@ -0,0 +1,57 @@
+/*
+ *
+ * * RHQ Management Platform
+ * * Copyright (C) 2005-2012 Red Hat, Inc.
+ * * All rights reserved.
+ * *
+ * * This program is free software; you can redistribute it and/or modify
+ * * it under the terms of the GNU General Public License, version 2, as
+ * * published by the Free Software Foundation, and/or the GNU Lesser
+ * * General Public License, version 2.1, also as published by the Free
+ * * Software Foundation.
+ * *
+ * * This program 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 and the GNU Lesser General Public License
+ * * for more details.
+ * *
+ * * You should have received a copy of the GNU General Public License
+ * * and the GNU Lesser General Public License along with this program;
+ * * if not, write to the Free Software Foundation, Inc.,
+ * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+package org.rhq.enterprise.server.util;
+
+import javax.annotation.PostConstruct;
+import javax.ejb.EJB;
+import javax.ejb.Singleton;
+import javax.enterprise.inject.Produces;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+
+/**
+ * @author John Sanda
+ */
+@Singleton
+public class OverlordProducer {
+
+ @EJB
+ private SubjectManagerLocal subjectManager;
+
+ private Subject overlord;
+
+ @PostConstruct
+ public void initOverlord() {
+ overlord = subjectManager.getOverlord();
+ }
+
+ @Produces @Overlord
+ public Subject getOverlord() {
+ return overlord;
+ }
+
+}
diff --git a/modules/enterprise/server/itests-2/src/test/resources/arquillian.xml b/modules/enterprise/server/itests-2/src/test/resources/arquillian.xml
index b32c647..72f8bdc 100644
--- a/modules/enterprise/server/itests-2/src/test/resources/arquillian.xml
+++ b/modules/enterprise/server/itests-2/src/test/resources/arquillian.xml
@@ -19,6 +19,13 @@
<property name="includes">org.rhq.*</property>
</extension>
+ <!--
+ Uncomment this if you want to inspect the deployed archive. Useful for debugging.
+ -->
+ <!--<engine>-->
+ <!--<property name="deploymentExportPath">target/</property>-->
+ <!--</engine>-->
+
<container
qualifier="RHQAS7"
default="true">
commit 7f8e3717c15fca3d121387d0969a4ca454eea44a
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jan 23 21:23:41 2013 -0500
initial commit for MeasurementOOBManagerBeanTest
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java
new file mode 100644
index 0000000..d646b29
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java
@@ -0,0 +1,417 @@
+/*
+ *
+ * * RHQ Management Platform
+ * * Copyright (C) 2005-2012 Red Hat, Inc.
+ * * All rights reserved.
+ * *
+ * * This program is free software; you can redistribute it and/or modify
+ * * it under the terms of the GNU General Public License, version 2, as
+ * * published by the Free Software Foundation, and/or the GNU Lesser
+ * * General Public License, version 2.1, also as published by the Free
+ * * Software Foundation.
+ * *
+ * * This program 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 and the GNU Lesser General Public License
+ * * for more details.
+ * *
+ * * You should have received a copy of the GNU General Public License
+ * * and the GNU Lesser General Public License along with this program;
+ * * if not, write to the Free Software Foundation, Inc.,
+ * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+package org.rhq.enterprise.server.measurement;
+
+import static java.util.Arrays.asList;
+import static org.joda.time.DateTime.now;
+import static org.rhq.core.domain.measurement.DataType.MEASUREMENT;
+import static org.rhq.core.domain.measurement.NumericType.DYNAMIC;
+import static org.rhq.core.domain.resource.ResourceCategory.SERVER;
+import static org.rhq.test.AssertUtils.assertCollectionEqualsNoOrder;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.EJB;
+import javax.persistence.EntityManager;
+
+import org.joda.time.DateTime;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.measurement.MeasurementBaseline;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementOOB;
+import org.rhq.core.domain.measurement.MeasurementSchedule;
+import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.util.jdbc.JDBCUtil;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.drift.DriftServerPluginService;
+import org.rhq.enterprise.server.measurement.util.MeasurementDataManagerUtility;
+import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.test.TransactionCallback;
+import org.rhq.enterprise.server.test.TransactionCallbackReturnable;
+import org.rhq.enterprise.server.util.ResourceTreeHelper;
+
+/**
+ * @author John Sanda
+ */
+public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test {
+
+ private final String RESOURCE_TYPE = getClass().getName() + "_TYPE";
+
+ private final String PLUGIN = getClass().getName() + "_PLUGIN";
+
+ private final String AGENT_NAME = getClass().getName() + "_AGENT";
+
+ private final String DYNAMIC_DEF_NAME = getClass().getName() + "_DYNAMIC";
+
+ private final String RESOURCE_KEY = getClass().getName() + "_RESOURCE_KEY";
+
+ private final String RESOURCE_NAME = getClass().getName() + "_NAME";
+
+ private final String RESOURCE_UUID = getClass().getSimpleName() + "_UUID";
+
+ private ResourceType resourceType;
+
+ private Agent agent;
+
+ private Resource resource;
+
+ private List<MeasurementDefinition> measurementDefs;
+
+ private List<MeasurementSchedule> schedules;
+
+ private Subject overlord;
+
+ @EJB
+ private SubjectManagerLocal subjectManager;
+
+ @EJB
+ private ResourceManagerLocal resourceManager;
+
+ @EJB
+ private MeasurementOOBManagerLocal oobManager;
+
+ @EJB
+ private MeasurementBaselineManagerLocal baselineManager;
+
+ @Override
+ protected void beforeMethod() throws Exception {
+ // MeasurementDataManagerUtility looks up config settings from SystemManagerBean.
+ // SystemManagerBean.getDriftServerPluginManager method requires drift server plugin.
+ DriftServerPluginService driftServerPluginService = new DriftServerPluginService();
+ prepareCustomServerPluginService(driftServerPluginService);
+ driftServerPluginService.masterConfig.getPluginDirectory().mkdirs();
+
+ overlord = subjectManager.getOverlord();
+ measurementDefs = new ArrayList<MeasurementDefinition>();
+ schedules = new ArrayList<MeasurementSchedule>();
+ createInventory();
+ }
+
+ @Override
+ protected void afterMethod() throws Exception {
+ purgeDB();
+ }
+
+ /**
+ * Verifies that OOBs are calculated when there are both upper and lower bound
+ * violations. It also verifies that no OOB is generated a schedule whose values stay
+ * in bounds.
+ */
+ @Test
+ public void calculateOOBs() {
+ final MeasurementSchedule schedule1 = createSchedule();
+ final MeasurementSchedule schedule2 = createSchedule();
+ MeasurementSchedule schedule3 = createSchedule();
+
+ DateTime currentHour = now().hourOfDay().roundFloorCopy();
+ final DateTime lastHour = currentHour.minusHours(1);
+
+ insertBaselines(asList(
+ baseline(schedule1, 4.34, 5.2, 3.9),
+ baseline(schedule2, 7.43, 7.49, 7.38),
+ baseline(schedule3, 3.2, 3.6, 2.95)
+ ));
+
+ insert1HourData(asList(
+ // schedule1 should be out of bounds on the lower bound
+ new AggregateTestData(lastHour.getMillis(), schedule1.getId(), 3.8, 4.6, 2.11),
+ // schedule2 should be out of bounds on the upper bound
+ new AggregateTestData(lastHour.getMillis(), schedule2.getId(), 9.492, 9.53, 9.481),
+ // schedule3 should be in bounds
+ new AggregateTestData(lastHour.getMillis(), schedule3.getId(), 3.15, 3.59, 2.96)
+ ));
+
+ oobManager.computeOOBsFromLastHour(overlord);
+
+ executeInTransaction(new TransactionCallback() {
+ @Override
+ @SuppressWarnings("unchecked")
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ List<MeasurementOOB> oobs = em.createQuery("select oob from MeasurementOOB oob").getResultList();
+ List<TestMeasurementOOB> actual = new ArrayList<TestMeasurementOOB>();
+ for (MeasurementOOB oob : oobs) {
+ actual.add(new TestMeasurementOOB(oob));
+ }
+
+ List<TestMeasurementOOB> expected = asList(
+ new TestMeasurementOOB(schedule1.getId(), lastHour.getMillis(), 138),
+ new TestMeasurementOOB(schedule2.getId(), lastHour.getMillis(), 1855)
+ );
+
+ assertCollectionEqualsNoOrder(expected, actual, "The OOBs do not match");
+ }
+ });
+ }
+
+ private void createInventory() throws Exception {
+ purgeDB();
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+
+ resourceType = new ResourceType(RESOURCE_TYPE, PLUGIN, SERVER, null);
+ em.persist(resourceType);
+
+ agent = new Agent(AGENT_NAME, "localhost", 9999, "", "randomToken");
+ em.persist(agent);
+
+ resource = new Resource(RESOURCE_KEY, RESOURCE_NAME, resourceType);
+ resource.setUuid(RESOURCE_UUID);
+ resource.setAgent(agent);
+
+ em.persist(resource);
+ }
+ });
+ }
+
+ private void purgeDB() {
+ purgeRawData();
+ purge1HourData();
+ purge6HourData();
+ purge24HourData();
+ purgeBaselines();
+ purgeOOBs();
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ ResourceCriteria c = new ResourceCriteria();
+ c.addFilterInventoryStatus(null);
+ c.addFilterResourceKey(RESOURCE_KEY);
+ c.fetchSchedules(true);
+ List<Resource> r = resourceManager.findResourcesByCriteria(overlord, c);
+
+ // Note that the order of deletes is important due to FK
+ // constraints.
+ if (!r.isEmpty()) {
+ assertTrue("Should be only 1 resource", r.size() == 1);
+ Resource doomedResource = r.get(0);
+ deleteMeasurementSchedules();
+ deleteResource(doomedResource);
+ }
+ deleteAgent();
+ deleteDynamicMeasurementDef();
+ deleteResourceType();
+ }
+ });
+ }
+
+ private void deleteDynamicMeasurementDef() {
+ if (!measurementDefs.isEmpty()) {
+ em.createQuery("delete from MeasurementDefinition d where d in :defs")
+ .setParameter("defs", measurementDefs)
+ .executeUpdate();
+ }
+//
+// em.createQuery("delete from MeasurementDefinition " + "where dataType = :dataType and " + "name = :name")
+// .setParameter("dataType", MEASUREMENT).setParameter("name", DYNAMIC_DEF_NAME).executeUpdate();
+ }
+
+ private void deleteAgent() {
+ em.createQuery("delete from Agent where name = :name").setParameter("name", AGENT_NAME).executeUpdate();
+ }
+
+ private void deleteResourceType() {
+ em.createQuery("delete from ResourceType where name = :name and plugin = :plugin")
+ .setParameter("name", RESOURCE_TYPE).setParameter("plugin", PLUGIN).executeUpdate();
+ }
+
+ private void deleteResource(Resource doomedResource) {
+ ResourceTreeHelper.deleteResource(em, doomedResource);
+ em.flush();
+ }
+
+ private void deleteMeasurementSchedules() {
+ for (MeasurementSchedule schedule : schedules) {
+ em.createQuery("delete from MeasurementSchedule where id = :id").setParameter("id", schedule.getId())
+ .executeUpdate();
+ }
+ em.flush();
+ }
+
+ public void purgeRawData() {
+ purgeTables(MeasurementDataManagerUtility.getAllRawTables());
+ }
+
+ public void purge1HourData() {
+ purgeTables("rhq_measurement_data_num_1h");
+ }
+
+ public void purge6HourData() {
+ purgeTables("rhq_measurement_data_num_6h");
+ }
+
+ public void purge24HourData() {
+ purgeTables("rhq_measurement_data_num_1d");
+ }
+
+ public void purgeBaselines() {
+ purgeTables("rhq_measurement_bline");
+ }
+
+ public void purgeOOBs() {
+ purgeTables("rhq_measurement_oob");
+ }
+
+ private void purgeTables(String... tables) {
+ // This method was previous implemented using EntityManager.createNativeQuery
+ // and called from within a TransactionCallback. It was causing a
+ // TransactionRequiredException, and I am not clear why. I suspect it is a
+ // configuration issue in our testing environment, but I haven't figured it out
+ // yet. For now, raw tables are purges in their own separate JDBC transaction.
+ //
+ // jsanda
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ connection.setAutoCommit(false);
+ for (String table : tables) {
+ Statement statement = connection.createStatement();
+ try {
+ statement.execute("delete from " + table);
+ } finally {
+ JDBCUtil.safeClose(statement);
+ }
+ }
+ connection.commit();
+ } catch (SQLException e) {
+ try {
+ connection.rollback();
+ } catch (SQLException e1) {
+ throw new RuntimeException("Failed to rollback transaction", e1);
+ }
+ throw new RuntimeException("Failed to purge data from " + tables, e);
+ } finally {
+ JDBCUtil.safeClose(connection);
+ }
+ }
+
+ private void insert1HourData(List<AggregateTestData> data) {
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ connection.setAutoCommit(false);
+ String sql = "insert into rhq_measurement_data_num_1h(time_stamp, schedule_id, value, minvalue, maxvalue) values(?, ?, ?, ?, ?)";
+ PreparedStatement statement = connection.prepareStatement(sql);
+
+ for (AggregateTestData datum : data) {
+ statement.setLong(1, datum.getTimestamp());
+ statement.setInt(2, datum.getScheduleId());
+ statement.setDouble(3, datum.getAvg());
+ statement.setDouble(4, datum.getMin());
+ statement.setDouble(5, datum.getMax());
+
+ statement.addBatch();
+ }
+
+ statement.executeBatch();
+ connection.commit();
+ } catch (SQLException e) {
+ try {
+ connection.rollback();
+ } catch (SQLException e1) {
+ throw new RuntimeException("Failed to rollback transaction", e1);
+ }
+ throw new RuntimeException("Failed to insert 1 hour data", e);
+ } finally {
+ JDBCUtil.safeClose(connection);
+ }
+ }
+
+ private void insertBaselines(final List<MeasurementBaseline> baselines) {
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ for (MeasurementBaseline baseline : baselines) {
+ em.persist(baseline);
+ }
+ }
+ });
+ }
+
+ private DateTime hour0() {
+ DateTime rightNow = now();
+ return rightNow.hourOfDay().roundFloorCopy().minusHours(
+ rightNow.hourOfDay().roundFloorCopy().hourOfDay().get());
+ }
+
+ private MeasurementBaseline getBaseline() {
+ List<MeasurementBaseline> baselines = baselineManager.findBaselinesForResource(overlord, resource.getId());
+ return baselines.get(0);
+ }
+
+ private MeasurementBaseline baseline(MeasurementSchedule schedule, double mean, double max, double min) {
+ MeasurementBaseline baseline = new MeasurementBaseline();
+ baseline.setSchedule(schedule);
+ baseline.setMean(mean);
+ baseline.setMax(max);
+ baseline.setMin(min);
+
+ return baseline;
+ }
+
+ private MeasurementSchedule createSchedule() {
+ return executeInTransaction(false, new TransactionCallbackReturnable<MeasurementSchedule>() {
+ @Override
+ public MeasurementSchedule execute() throws Exception {
+ EntityManager em = getEntityManager();
+
+ MeasurementDefinition definition = new MeasurementDefinition(resourceType, DYNAMIC_DEF_NAME +
+ measurementDefs.size());
+ definition.setDefaultOn(true);
+ definition.setDataType(MEASUREMENT);
+ definition.setMeasurementType(DYNAMIC);
+ em.persist(definition);
+
+ MeasurementSchedule schedule = new MeasurementSchedule(definition, resource);
+ schedule.setEnabled(true);
+ resource.addSchedule(schedule);
+ em.persist(schedule);
+
+ schedules.add(schedule);
+ measurementDefs.add(definition);
+
+ return schedule;
+ }
+ });
+ }
+
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/TestMeasurementOOB.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/TestMeasurementOOB.java
new file mode 100644
index 0000000..c31c2e1
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/TestMeasurementOOB.java
@@ -0,0 +1,97 @@
+/*
+ *
+ * * RHQ Management Platform
+ * * Copyright (C) 2005-2012 Red Hat, Inc.
+ * * All rights reserved.
+ * *
+ * * This program is free software; you can redistribute it and/or modify
+ * * it under the terms of the GNU General Public License, version 2, as
+ * * published by the Free Software Foundation, and/or the GNU Lesser
+ * * General Public License, version 2.1, also as published by the Free
+ * * Software Foundation.
+ * *
+ * * This program 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 and the GNU Lesser General Public License
+ * * for more details.
+ * *
+ * * You should have received a copy of the GNU General Public License
+ * * and the GNU Lesser General Public License along with this program;
+ * * if not, write to the Free Software Foundation, Inc.,
+ * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+package org.rhq.enterprise.server.measurement;
+
+import org.rhq.core.domain.measurement.MeasurementOOB;
+
+/**
+ * This is used for verifying results since the properties in {@link MeasurementOOB} are
+ * read only making harder to set up expected values.
+ *
+* @author John Sanda
+*/
+class TestMeasurementOOB {
+ // TestMeasurementOOB is used to verify results since MeasurementOOB does not expose
+ // setters for its properties.
+ private int scheduleId;
+ private long timestamp;
+ private int oobFactor;
+
+ public TestMeasurementOOB(int scheduleId, long timestamp, int oobFactor) {
+ this.scheduleId = scheduleId;
+ this.timestamp = timestamp;
+ this.oobFactor = oobFactor;
+ }
+
+ public TestMeasurementOOB(MeasurementOOB oob) {
+ scheduleId = oob.getScheduleId();
+ timestamp = oob.getTimestamp();
+ oobFactor = oob.getOobFactor();
+ }
+
+ public int getScheduleId() {
+ return scheduleId;
+ }
+
+ public long getTimestamp() {
+ return timestamp;
+ }
+
+ public int getOobFactor() {
+ return oobFactor;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ TestMeasurementOOB that = (TestMeasurementOOB) o;
+
+ if (oobFactor != that.oobFactor) return false;
+ if (scheduleId != that.scheduleId) return false;
+ if (timestamp != that.timestamp) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = scheduleId;
+ result = 31 * result + (int) (timestamp ^ (timestamp >>> 32));
+ result = 31 * result + oobFactor;
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "TestMeasurementOOB[" +
+ "scheduleId=" + scheduleId +
+ ", timestamp=" + timestamp +
+ ", oobFactor=" + oobFactor +
+ "]";
+ }
+}