[rhq] 2 commits - etc/scripts modules/plugins
by Libor Zoubek
etc/scripts/rhqctl-completion.sh | 4 -
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/NetworkInterfaceComponent.java | 28 +++++++++-
modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml | 6 +-
3 files changed, 32 insertions(+), 6 deletions(-)
New commits:
commit f3bab1397fa23e4c2e36f79839dcbe7f57e7538d
Author: Libor Zoubek <lzoubek(a)redhat.com>
Date: Thu Feb 6 21:53:09 2014 +0100
[BZ 1042797] It is not possible to change "Inet Address" for management
network interface from JBoss ON UI
Properties any-addr-* were turned required=false. Also added 2 checks (wich
result to configuration failure without hitting AS7) in 2 cases: 1. User
unsets inet-addr but does not set any of any-addr-* to true 2. User sets one
of any-addr-* to true but leaves inet-addr set.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/NetworkInterfaceComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/NetworkInterfaceComponent.java
index 5440605..f58bfc0 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/NetworkInterfaceComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/NetworkInterfaceComponent.java
@@ -20,6 +20,7 @@
package org.rhq.modules.plugins.jbossas7;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
@@ -58,7 +59,32 @@ public class NetworkInterfaceComponent extends BaseComponent<NetworkInterfaceCom
@Override
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
- Configuration configuration = report.getConfiguration();
+ Configuration config = report.getConfiguration();
+
+ boolean isWildcard = false;
+ // detect if any of wildcard properties was turned on
+ for (String wildcard : wildCards) {
+ isWildcard |= Boolean.valueOf(config.getSimpleValue(wildcard));
+ }
+ if (config.getSimpleValue("inet-address") != null) {
+ if (isWildcard) {
+ // we couldn't know what user wants ... if setting inet-addr or one of wildcard props
+ report
+ .setErrorMessage("When setting any-address or any-ipv4-address or any-ipv6-address to true inet-address must be unset");
+ report.setStatus(ConfigurationUpdateStatus.FAILURE);
+ return;
+ }
+ // auto-set all wildcards to undefined
+ for (String wildcard : wildCards) {
+ config.getSimple(wildcard).setValue(null);
+ }
+
+ } else if (!isWildcard) {
+ report
+ .setErrorMessage("You need to enable either any-address or any-ipv4-address or any-ipv6-address when inet-address is disabled");
+ report.setStatus(ConfigurationUpdateStatus.FAILURE);
+ return;
+ }
super.updateResourceConfiguration(report);
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index b7dcaaa..f56e205 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -8755,11 +8755,11 @@
description="Attribute indicating that part of the selection criteria for choosing an IP address for this interface should be whether or not the address matches the given value. Value is either a IP address in IPv6 or IPv4 dotted decimal notation, or a hostname that can be resolved to an IP address. An 'undefined' value means this attribute is not relevant to the IP address selection."/>
<c:group name="address" displayName="Wildcard selection (exactly one property must be set to true)">
- <c:simple-property name="any-address" required="true" type="boolean" readOnly="false" default="true" defaultValue="false"
+ <c:simple-property name="any-address" required="false" type="boolean" readOnly="false" default="true" defaultValue="false"
description="Attribute indicating that sockets using this interface should be bound to a wildcard address. The IPv6 wildcard address (::) will be used unless the java.net.preferIpV4Stack system property is set to true, in which case the IPv4 wildcard address (0.0.0.0) will be used. If a socket is bound to an IPv6 anylocal address on a dual-stack machine, it can accept both IPv6 and IPv4 traffic; if it is bound to an IPv4 (IPv4-mapped) anylocal address, it can only accept IPv4 traffic."/>
- <c:simple-property name="any-ipv4-address" required="true" type="boolean" readOnly="false" default="false" defaultValue="false"
+ <c:simple-property name="any-ipv4-address" required="false" type="boolean" readOnly="false" default="false" defaultValue="false"
description="Attribute indicating that sockets using this interface should be bound to the IPv4 wildcard address (0.0.0.0)."/>
- <c:simple-property name="any-ipv6-address" required="true" type="boolean" readOnly="false" default="false" defaultValue="false"
+ <c:simple-property name="any-ipv6-address" required="false" type="boolean" readOnly="false" default="false" defaultValue="false"
description="Attribute indicating that sockets using this interface should be bound to the IPv6 wildcard address (::)."/>
</c:group>
<!-- TODO revisit later BZ 825169
commit 4b1a0e25c056406ade0293fb34671aa906ba3405
Author: Libor Zoubek <lzoubek(a)redhat.com>
Date: Thu Feb 6 13:17:28 2014 +0100
add restart cmd to rhqctl-completion
diff --git a/etc/scripts/rhqctl-completion.sh b/etc/scripts/rhqctl-completion.sh
index 68adf2b..08d7e10 100755
--- a/etc/scripts/rhqctl-completion.sh
+++ b/etc/scripts/rhqctl-completion.sh
@@ -9,7 +9,7 @@ _rhqctl() {
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
- opts="console install start status stop upgrade"
+ opts="console install start status stop restart upgrade"
agentServerStorage="--agent --server --storage"
serverStorage="--server --storage"
dataMigratorSubopts="none estimate print-command do-it"
@@ -29,7 +29,7 @@ _rhqctl() {
first="${COMP_WORDS[1]}"
- if [[ "x${first}" == "xstart" ]] || [[ "x${first}" == "xstop" ]] || [[ "x${first}" == "xstatus" ]] ; then
+ if [[ "x${first}" == "xstart" ]] || [[ "x${first}" == "xstop" ]] || [[ "x${first}" == "xstatus" ]] || [[ "x${first}" == "xrestart" ]]; then
COMPREPLY=( $(compgen -W "${agentServerStorage}" -- ${cur}) )
return 0
elif [[ "x${first}" == "xconsole" ]] ; then
10 years, 4 months
[rhq] modules/enterprise
by mazz
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java | 24 ++++++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java | 10 ++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExecutePromptCommand.java | 37 ++++++++++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java | 1
modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties | 2
modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java | 13 ++-
6 files changed, 83 insertions(+), 4 deletions(-)
New commits:
commit c920a677ae75068dba70cdc1bf8c02e4900f3fe5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 6 13:01:43 2014 -0500
add the ability for embedded agent to execute a prompt command from the AS CLI
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index a9d5000..5db0f1f 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -1,9 +1,11 @@
package org.rhq.embeddedagent.extension;
+import java.io.CharArrayWriter;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicReference;
import org.jboss.as.network.SocketBinding;
@@ -20,6 +22,7 @@ import org.jboss.msc.value.InjectedValue;
import org.rhq.enterprise.agent.AgentConfigurationConstants;
import org.rhq.enterprise.agent.AgentMain;
+import org.rhq.enterprise.agent.AgentPrintWriter;
import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
public class AgentService implements Service<AgentService> {
@@ -218,6 +221,27 @@ public class AgentService implements Service<AgentService> {
theAgent.set(null);
}
+ protected String executePromptCommand(String command) throws Exception {
+ AgentMain agent = theAgent.get();
+ if (agent == null) {
+ throw new IllegalStateException("Embedded agent is not available");
+ }
+
+ CharArrayWriter listener = new CharArrayWriter();
+ AgentPrintWriter apw = agent.getOut();
+ try {
+ apw.addListener(listener);
+ agent.executePromptCommand(command);
+ } catch (Exception e) {
+ throw new ExecutionException(listener.toString(), e); // the message is the output, cause is the thrown exception
+ } finally {
+ apw.removeListener(listener);
+ }
+
+ String output = listener.toString();
+ return output;
+ }
+
/**
* Gets information about a file that is inside our module. Use this to
* obtain files locationed in the embedded agent, for example, pass in
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index 1224d84..faa66db 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -90,6 +90,10 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
.setDefaultValue(new ModelNode(ServiceContainerConfigurationConstants.DEFAULT_CONNECTOR_TRANSPORT_PARAMS))
.setAllowNull(true).build();
+ // operation parameters
+ protected static final SimpleAttributeDefinition EXECUTE_PROMPT_COMMAND_PARAM_COMMAND = new SimpleAttributeDefinitionBuilder(
+ "command", ModelType.STRING).setAllowExpression(true).build();
+
private AgentSubsystemDefinition() {
super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
AgentSubsystemAdd.INSTANCE, AgentSubsystemRemove.INSTANCE);
@@ -142,6 +146,12 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
new DefaultOperationDescriptionProvider(AgentSubsystemExtension.AGENT_STATUS_OP, AgentSubsystemExtension
.getResourceDescriptionResolver(null), ModelType.STRING), false, OperationEntry.EntryType.PUBLIC);
+ rr.registerOperationHandler(AgentSubsystemExtension.AGENT_EXECUTE_PROMPT_CMD_OP,
+ AgentSubsystemExecutePromptCommand.INSTANCE,
+ new DefaultOperationDescriptionProvider(AgentSubsystemExtension.AGENT_EXECUTE_PROMPT_CMD_OP,
+ AgentSubsystemExtension.getResourceDescriptionResolver(null), ModelType.STRING,
+ EXECUTE_PROMPT_COMMAND_PARAM_COMMAND), false, OperationEntry.EntryType.PUBLIC);
+
return;
}
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExecutePromptCommand.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExecutePromptCommand.java
new file mode 100644
index 0000000..65a7cb2
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExecutePromptCommand.java
@@ -0,0 +1,37 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.OperationStepHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.ServiceNotFoundException;
+
+class AgentSubsystemExecutePromptCommand implements OperationStepHandler {
+
+ static final AgentSubsystemExecutePromptCommand INSTANCE = new AgentSubsystemExecutePromptCommand();
+
+ private AgentSubsystemExecutePromptCommand() {
+ }
+
+ @Override
+ public void execute(OperationContext opContext, ModelNode model) throws OperationFailedException {
+ try {
+ ServiceName name = AgentService.SERVICE_NAME;
+ AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
+ .getValue();
+
+ String command = model.get(AgentSubsystemDefinition.EXECUTE_PROMPT_COMMAND_PARAM_COMMAND.getName())
+ .asString();
+
+ String results = service.executePromptCommand(command);
+ opContext.getResult().set(results);
+ } catch (ServiceNotFoundException snfe) {
+ throw new OperationFailedException(
+ "Cannot execute prompt command because the embedded agent is not enabled");
+ } catch (Exception e) {
+ throw new OperationFailedException("Failed to execute prompt command [" + model + "]", e);
+ }
+ opContext.completeStep();
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 4463ad9..f989519 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -67,6 +67,7 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_RESTART_OP = "restart";
protected static final String AGENT_STOP_OP = "stop";
protected static final String AGENT_STATUS_OP = "status";
+ protected static final String AGENT_EXECUTE_PROMPT_CMD_OP = "execute-prompt-command";
protected static final String ATTRIB_AGENT_NAME = AgentConfigurationConstants.NAME;
protected static final String ATTRIB_DISABLE_NATIVE = AgentConfigurationConstants.DISABLE_NATIVE_SYSTEM;
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index f4b08d1..f5cf107 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -4,6 +4,8 @@ embeddedagent.remove=Removes the RHQ Agent subsystem
embeddedagent.restart=Starts the RHQ Agent. If it is already started, it will be stopped, then started again.
embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
+embeddedagent.execute-prompt-command=Executes a prompt command in the embedded agent and returns the results.
+embeddedagent.execute-prompt-command.command=The actual command the agent is to execute
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
embeddedagent.extra-configuration=Additional preference values used to configure the agent
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index 5c2f3d4..3e62e8b 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -218,16 +218,21 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
Assert.assertTrue(expectedAttributes.contains(attrib), "missing attrib: " + attrib);
}
- // check the operations
+ // check the operations (there are many other operations that AS adds to our resource, but we only want to check for ours)
+ List<String> expectedOperations = Arrays.asList( //
+ AgentSubsystemExtension.AGENT_EXECUTE_PROMPT_CMD_OP, //
+ AgentSubsystemExtension.AGENT_RESTART_OP, //
+ AgentSubsystemExtension.AGENT_STOP_OP, //
+ AgentSubsystemExtension.AGENT_STATUS_OP);
Assert.assertTrue(content.get("operations").isDefined());
List<Property> operations = content.get("operations").asPropertyList();
List<String> operationNames = new ArrayList<String>();
for (Property op : operations) {
operationNames.add(op.getName());
}
- Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_RESTART_OP));
- Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_STOP_OP));
- Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_STATUS_OP));
+ for (String expectedOperation : expectedOperations) {
+ Assert.assertTrue(operationNames.contains(expectedOperation), "Missing: " + expectedOperation);
+ }
}
public void testExecuteOperations() throws Exception {
10 years, 4 months
[rhq] modules/plugins
by Thomas Segismont
modules/plugins/jboss-as-7/pom.xml | 40 +++++-
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractServerComponentTest.java | 1
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ResourcesDomainServerTest.java | 10 -
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/SecurityModuleOptionsTest.java | 66 +++++-----
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/ResourcesStandaloneServerTest.java | 12 +
5 files changed, 81 insertions(+), 48 deletions(-)
New commits:
commit 05b94627a6fdecb0f6d6378643632643a12cbd39
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Thu Feb 6 14:22:16 2014 +0100
AS7 itests on EAP 6.1.0.Alpha by default
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
index d764f6c..bc82d6a 100644
--- a/modules/plugins/jboss-as-7/pom.xml
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -23,8 +23,8 @@
<jboss.sasl.version>1.0.0.Final</jboss.sasl.version>
<!-- If you change httpclient4.version make sure to update httpcore version below accordingly -->
<httpclient4.version>${apache.httpcomponents.version}</httpclient4.version>
- <as7.version>7.1.2.Final-SNAPSHOT</as7.version>
- <as7.url>https://hudson.jboss.org/hudson/view/JBoss%20AS/job/JBoss-AS-7.0.x/lastSu...</as7.url>
+ <as7.version>6.1.0.Alpha</as7.version>
+ <as7.url>http://download.jboss.org/jbosseap/6/jboss-eap-6.1.0.Alpha/jboss-eap-6.1....</as7.url>
<jboss-as-arquillian-container-managed.version>7.1.1.Final</jboss-as-arquillian-container-managed.version>
<java.tieredCompilation>-Dxxx</java.tieredCompilation>
<java.useCompressedOOPS>-Dxxx</java.useCompressedOOPS>
@@ -647,10 +647,10 @@
<executions>
<!-- Some of these test classes seem to do better when run by themseleves. So, use different executions... -->
<execution>
- <id>DeploymentRuntimeResourcesTest</id>
+ <id>DeploymentRuntimeResourcesTest</id>
<configuration>
<includes>
- <include>org/rhq/modules/plugins/jbossas7/itest/standalone/DeploymentRuntimeResourcesTest.java</include>
+ <include>org/rhq/modules/plugins/jbossas7/itest/standalone/DeploymentRuntimeResourcesTest.java</include>
</includes>
</configuration>
<goals>
@@ -659,10 +659,34 @@
</goals>
</execution>
<execution>
- <id>DeploymentTest</id>
+ <id>DeploymentTest</id>
<configuration>
<includes>
- <include>org/rhq/modules/plugins/jbossas7/itest/standalone/DeploymentTest.java</include>
+ <include>org/rhq/modules/plugins/jbossas7/itest/standalone/DeploymentTest.java</include>
+ </includes>
+ </configuration>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>SocketBindingTest</id>
+ <configuration>
+ <includes>
+ <include>org/rhq/modules/plugins/jbossas7/itest/standalone/SocketBindingTest.java</include>
+ </includes>
+ </configuration>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>SecurityModuleOptionsTest</id>
+ <configuration>
+ <includes>
+ <include>org/rhq/modules/plugins/jbossas7/itest/domain/SecurityModuleOptionsTest.java</include>
</includes>
</configuration>
<goals>
@@ -673,11 +697,13 @@
<execution>
<id>everything-else</id>
<configuration>
- <includes>
+ <includes>
<include>org/rhq/modules/plugins/jbossas7/itest/**/*Test.java</include>
</includes>
<excludes>
<exclude>org/rhq/modules/plugins/jbossas7/itest/standalone/Deployment*Test.java</exclude>
+ <exclude>org/rhq/modules/plugins/jbossas7/itest/standalone/SocketBindingTest.java</exclude>
+ <exclude>org/rhq/modules/plugins/jbossas7/itest/domain/SecurityModuleOptionsTest.java</exclude>
</excludes>
</configuration>
<goals>
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractServerComponentTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractServerComponentTest.java
index 1fd155c..a6e45ee 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractServerComponentTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractServerComponentTest.java
@@ -64,6 +64,7 @@ public abstract class AbstractServerComponentTest extends AbstractJBossAS7Plugin
static {
EAP6_VERSION_TO_AS7_VERSION_MAP.put("6.0.0", "7.1.2.Final-redhat-1");
EAP6_VERSION_TO_AS7_VERSION_MAP.put("6.0.1", "7.1.3.Final-redhat-4");
+ EAP6_VERSION_TO_AS7_VERSION_MAP.put("6.1.0.Alpha", "7.2.0.Alpha1-redhat-4");
EAP6_VERSION_TO_AS7_VERSION_MAP.put("6.1.0", "7.2.0.Final-redhat-8");
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ResourcesDomainServerTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ResourcesDomainServerTest.java
index 450c975..16c72ac 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ResourcesDomainServerTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ResourcesDomainServerTest.java
@@ -1,8 +1,7 @@
/*
* RHQ Management Platform
- * Copyright 2011, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
+ * Copyright (C) 2005-2014 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 as published by
@@ -14,8 +13,8 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * 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.modules.plugins.jbossas7.itest.domain;
@@ -113,6 +112,7 @@ public class ResourcesDomainServerTest extends AbstractJBossAS7PluginTest {
// Cannot apply configuration blindly
ignoredResources.add("Cluster Connection (Profile)");
+ ignoredResources.add("HornetQ (Profile)");
Resource platform = this.pluginContainer.getInventoryManager().getPlatform();
Resource server = getResourceByTypeAndKey(platform, DomainServerComponentTest.RESOURCE_TYPE,
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/SecurityModuleOptionsTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/SecurityModuleOptionsTest.java
index bd3ad3a..a8c7853 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/SecurityModuleOptionsTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/SecurityModuleOptionsTest.java
@@ -19,6 +19,11 @@
package org.rhq.modules.plugins.jbossas7.itest.domain;
+import static org.rhq.modules.plugins.jbossas7.ModuleOptionsComponent.ModuleOptionType;
+import static org.rhq.modules.plugins.jbossas7.ModuleOptionsComponent.Value;
+import static org.rhq.modules.plugins.jbossas7.ModuleOptionsComponent.createAddModuleOptionTypeOperation;
+import static org.rhq.modules.plugins.jbossas7.ModuleOptionsComponent.loadModuleOptionType;
+import static org.rhq.modules.plugins.jbossas7.ModuleOptionsComponent.populateSecurityDomainModuleOptions;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
@@ -35,6 +40,9 @@ import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
+import org.rhq.modules.plugins.jbossas7.ModuleOptionsComponent;
+import org.testng.SkipException;
+import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.agent.inventory.CreateResourceRequest;
@@ -57,8 +65,6 @@ import org.rhq.core.pc.inventory.InventoryManager;
import org.rhq.modules.plugins.jbossas7.ASConnection;
import org.rhq.modules.plugins.jbossas7.ASConnectionParams;
import org.rhq.modules.plugins.jbossas7.ASConnectionParamsBuilder;
-import org.rhq.modules.plugins.jbossas7.ModuleOptionsComponent;
-import org.rhq.modules.plugins.jbossas7.ModuleOptionsComponent.Value;
import org.rhq.modules.plugins.jbossas7.itest.AbstractJBossAS7PluginTest;
import org.rhq.modules.plugins.jbossas7.itest.standalone.StandaloneServerComponentTest;
import org.rhq.modules.plugins.jbossas7.json.Address;
@@ -112,7 +118,6 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
private static final String RESOURCE_KEY = SECURITY_RESOURCE_KEY;
private static Resource testSecurityDomain = null;
private String testSecurityDomainKey = null;
- private ConfigurationManager testConfigurationManager = null;
//Define some shared and reusable content
static HashMap<String, String> jsonMap = new HashMap<String, String>();
@@ -139,6 +144,14 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
"[{\"flag\":\"optional\", \"code\":\"TRUST\", \"module-options\":{\"trust\":\"module\", \"trust1\":\"module1\"}}]");
}
+ @BeforeTest
+ public void checkServerVersion() {
+ if (System.getProperty("as7.version").equals("6.1.0.Alpha")) {
+ // This version has issues with Security Modules
+ throw new SkipException("This test does not run on 6.1.0.Alpha");
+ }
+ }
+
/* This first discovery is only so that we can leverage existing code to install the management user needed
* in next test.
*/
@@ -212,7 +225,6 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
//build the operation to add the component
////Load json map into ModuleOptionType
- List<Value> moduleTypeValue = new ArrayList<Value>();
try {
// loading jsonMap contents for Ex. 'login-module'
JsonNode node = mapper.readTree(jsonMap.get(attribute));
@@ -226,10 +238,8 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
}
//populate the Value component complete with module Options.
- moduleTypeValue = ModuleOptionsComponent.populateSecurityDomainModuleOptions(result,
- ModuleOptionsComponent.loadModuleOptionType(attribute));
- op = ModuleOptionsComponent.createAddModuleOptionTypeOperation(new Address(address), attribute,
- moduleTypeValue);
+ List<Value> moduleTypeValue = populateSecurityDomainModuleOptions(result, loadModuleOptionType(attribute));
+ op = createAddModuleOptionTypeOperation(new Address(address), attribute, moduleTypeValue);
//submit the command
result = connection.execute(op);
assert result.getOutcome().equals("success") : "Add ModuleOptionType has failed: "
@@ -263,12 +273,7 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
*/
@Test(priority = 1043)
public void testDiscoveredSecurityNodes() throws Exception {
- //lazy-load configurationManager
- if (testConfigurationManager == null) {
- testConfigurationManager = this.pluginContainer.getConfigurationManager();
- testConfigurationManager = pluginContainer.getConfigurationManager();
- Thread.sleep(20 * 1000L);
- }
+ ConfigurationManager testConfigurationManager = pluginContainer.getConfigurationManager();
//iterate through list of nodes and make sure they've all been discovered
////Ex. profile=full-ha,subsystem=security,security-domain=testDomain2,acl=classic
String attribute = null;
@@ -276,7 +281,7 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
//Ex. policy-modules
attribute = jsonKey;
//spinder 6/26/12: Temporarily disable until figure out why NPE happens only for this type?
- if (attribute.equals(ModuleOptionsComponent.ModuleOptionType.Authentication.getAttribute())) {
+ if (attribute.equals(ModuleOptionType.Authentication.getAttribute())) {
break;//
}
//Ex. name=acl-modules
@@ -321,17 +326,16 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
}
//populate the Value component complete with module Options.
- List<Value> moduleTypeValue = ModuleOptionsComponent.populateSecurityDomainModuleOptions(result,
- ModuleOptionsComponent.loadModuleOptionType(attribute));
+ List<Value> moduleTypeValue = populateSecurityDomainModuleOptions(result, loadModuleOptionType(attribute));
Value moduleOptionType = moduleTypeValue.get(0);
//Ex. retrieve the acl-modules component and assert values.
//always test 'code'
assert moduleOptionType.getCode().equals(code) : "Module Option 'code' value is not correct. Expected '"
+ code + "' but was '" + moduleOptionType.getCode() + "'";
- if (attribute.equals(ModuleOptionsComponent.ModuleOptionType.Mapping.getAttribute())) {
+ if (attribute.equals(ModuleOptionType.Mapping.getAttribute())) {
assert moduleOptionType.getType().equals(type) : "Mapping Module 'type' value is not correct. Expected '"
+ type + "' but was '" + moduleOptionType.getType() + "'";
- } else if (!attribute.equals(ModuleOptionsComponent.ModuleOptionType.Audit.getAttribute())) {//Audit has no second parameter
+ } else if (!attribute.equals(ModuleOptionType.Audit.getAttribute())) {//Audit has no second parameter
assert moduleOptionType.getFlag().equals(flag) : "Provider Module 'flag' value is not correct. Expected '"
+ flag + "' but was '" + moduleOptionType.getFlag() + "'";
}
@@ -532,22 +536,22 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
String descriptorName = "";
String moduleAttribute = "";
//acl
- if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Acl.getAttribute())) {
+ if (optionAttributeType.equals(ModuleOptionType.Acl.getAttribute())) {
descriptorName = "ACL (Profile)";
moduleAttribute = "acl=classic";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Audit.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.Audit.getAttribute())) {
descriptorName = "Audit (Profile)";
moduleAttribute = "audit=classic";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Authentication.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.Authentication.getAttribute())) {
descriptorName = "Authentication (Classic - Profile)";
moduleAttribute = "authentication=classic";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Authorization.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.Authorization.getAttribute())) {
descriptorName = "Authorization (Profile)";
moduleAttribute = "authorization=classic";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.IdentityTrust.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.IdentityTrust.getAttribute())) {
descriptorName = "Identity Trust (Profile)";
moduleAttribute = "identity-trust=classic";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Mapping.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.Mapping.getAttribute())) {
descriptorName = "Mapping (Profile)";
moduleAttribute = "mapping=classic";
}
@@ -582,28 +586,28 @@ public class SecurityModuleOptionsTest extends AbstractJBossAS7PluginTest {
String descriptorName = "";
String moduleAttribute = "";
String moduleOptionsDescriptor = "";
- if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Acl.getAttribute())) {
+ if (optionAttributeType.equals(ModuleOptionType.Acl.getAttribute())) {
// descriptorName = "ACL Modules (Profile)";
descriptorName = "Acl Modules (Profile)";
moduleAttribute = "acl=classic";
moduleOptionsDescriptor = "Module Options (Acl - Profile)";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Audit.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.Audit.getAttribute())) {
descriptorName = "Provider Modules (Profile)";
moduleAttribute = "audit=classic";
moduleOptionsDescriptor = "Module Options (Provider Modules - Profile)";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Authentication.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.Authentication.getAttribute())) {
descriptorName = "Login Modules (Classic - Profile)";
moduleAttribute = "authentication=classic";
moduleOptionsDescriptor = "Module Options (Classic - Profile)";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Authorization.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.Authorization.getAttribute())) {
descriptorName = "Authorization Modules (Profile)";
moduleAttribute = "authorization=classic";
moduleOptionsDescriptor = "Module Options (Authorization - Profile)";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.IdentityTrust.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.IdentityTrust.getAttribute())) {
descriptorName = "Identity Trust Modules (Profile)";
moduleAttribute = "identity-trust=classic";
moduleOptionsDescriptor = "Module Options (Identity Trust - Profile)";
- } else if (optionAttributeType.equals(ModuleOptionsComponent.ModuleOptionType.Mapping.getAttribute())) {
+ } else if (optionAttributeType.equals(ModuleOptionType.Mapping.getAttribute())) {
descriptorName = "Mapping Modules (Profile)";
moduleAttribute = "mapping=classic";
moduleOptionsDescriptor = "Module Options (Mapping - Profile)";
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/ResourcesStandaloneServerTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/ResourcesStandaloneServerTest.java
index e918d50..5d18a97 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/ResourcesStandaloneServerTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/ResourcesStandaloneServerTest.java
@@ -1,8 +1,7 @@
/*
* RHQ Management Platform
- * Copyright 2011, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
+ * Copyright (C) 2005-2014 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 as published by
@@ -14,8 +13,8 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * 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.modules.plugins.jbossas7.itest.standalone;
@@ -115,6 +114,9 @@ public class ResourcesStandaloneServerTest extends AbstractJBossAS7PluginTest {
// attribute static-connectors (nullable list issue?)
ignoredResources.add("Cluster Connection");
+ ignoredResources.add("HornetQ");
+ ignoredResources.add("HornetQ (Profile)");
+
Resource platform = this.pluginContainer.getInventoryManager().getPlatform();
Resource server = getResourceByTypeAndKey(platform, StandaloneServerComponentTest.RESOURCE_TYPE,
StandaloneServerComponentTest.RESOURCE_KEY);
10 years, 4 months
[rhq] modules/enterprise
by Libor Zoubek
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java | 43 ++++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java | 66 +++++++---
2 files changed, 80 insertions(+), 29 deletions(-)
New commits:
commit 07c6074ce424f91931224677dd15190a5fb44176
Author: Libor Zoubek <lzoubek(a)redhat.com>
Date: Thu Feb 6 10:54:10 2014 +0100
[BZ 1058187] Alert definitions recovery mechanism is unreliable
Based on jshaughn's patch. We optionally (via sys property) suspend event
processing in case event triggered alert, so alert subsystem has time to
fire alerts and reload it's cache. Then, when next event is processed, alert
cache more likely contains "consequences" of previous alert. Default
behaviour of processing events (without enabling via sys property) is not
affected.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
index e9fe0ed..7b50716 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
@@ -23,6 +23,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -107,9 +108,9 @@ class AgentConditionCache extends AbstractConditionCache {
/**
* This method is used to do the initial loading from the database for a particular agent. In the high availability
- * infrastructure each server instance in the cloud will only be responsible for monitoring a select number of
+ * infrastructure each server instance in the cloud will only be responsible for monitoring a select number of
* agents at any given point in time. When an agent makes a connection to this server instance, the caches for that
- * agent will be loaded at that time.
+ * agent will be loaded at that time.
*
* @return the number of conditions that re/loaded
*/
@@ -219,8 +220,8 @@ class AgentConditionCache extends AbstractConditionCache {
Double threshold = alertCondition.getThreshold();
String optionStatus = alertCondition.getOption();
- /*
- * yes, calculatedValue may be null, but that's OK because the match
+ /*
+ * yes, calculatedValue may be null, but that's OK because the match
* method for MeasurementBaselineCacheElement handles nulls just fine
*/
Double calculatedValue = getCalculatedBaselineValue(alertConditionId, baselineComposite, optionStatus,
@@ -270,7 +271,7 @@ class AgentConditionCache extends AbstractConditionCache {
}
try {
- /*
+ /*
* don't forget special defensive handling to allow for null trait calculation;
* this might happen if a newly committed resource has some alert template applied to
* it for some trait that it has not yet gotten from the agent
@@ -500,24 +501,42 @@ class AgentConditionCache extends AbstractConditionCache {
};
}
- public AlertConditionCacheStats checkConditions(EventSource source, Event... events) {
- if ((events == null) || (events.length == 0)) {
- return new AlertConditionCacheStats();
+ /**
+ * This operates differently from the other {{checkConditions()}} methods. Because it's possible that one
+ * batch of events may contain both an event triggering a problem event and also an event triggering its
+ * recovery alert, we return after a matched condition to allow for the caller to check remaining
+ * events only after a cache refresh has been performed.
+ *
+ * @param stats not null. the stats object to update
+ * @param source
+ * @param events
+ * @return the number of eventsProcessed until a match was found or all events were processed.
+ */
+ public AlertConditionCacheStats checkConditions(EventSource source, List<Event> events) {
+ AlertConditionCacheStats stats = new AlertConditionCacheStats();
+ if ((events == null) || events.isEmpty()) {
+ return stats;
}
- AlertConditionCacheStats stats = new AlertConditionCacheStats();
+ int initialSize = events.size();
try {
Resource resource = source.getResource();
List<EventCacheElement> cacheElements = lookupEventCacheElements(resource.getId());
- for (Event event : events) {
+ for (Iterator<Event> i = events.iterator(); i.hasNext();) {
+ Event event = i.next();
+ i.remove();
+ int matched = stats.matched;
processCacheElements(cacheElements, event.getSeverity(), event.getTimestamp(), stats, event.getDetail());
+ if (matched < stats.matched) {
+ break;
+ }
}
AlertConditionCacheMonitor.getMBean().incrementEventCacheElementMatches(stats.matched);
AlertConditionCacheMonitor.getMBean().incrementEventProcessingTime(stats.getAge());
if (log.isDebugEnabled()) {
- log.debug("Check Events[size=" + events.length + "] - " + stats);
+ log.debug("Check Events[size=" + (initialSize - events.size()) + "] - " + stats);
}
} catch (Throwable t) {
// don't let any exceptions bubble up to the calling SLSB layer
@@ -576,7 +595,7 @@ class AgentConditionCache extends AbstractConditionCache {
+ "]: threshold was null");
}
- // auto-unboxing of threshold is safe here
+ // auto-unboxing of threshold is safe here
Double baselineValue = 0.0;
if (optionStatus == null) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java
index 59c0fb6..de5dd84 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.server.alert.engine.internal;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -50,9 +51,9 @@ import org.rhq.enterprise.server.util.LookupUtil;
* reported by an agent, and thus can be perfectly segmented on an agent-by-agent basis. On the other hand,
* the {@link GlobalConditionCache} will maintain {@link AbstractCacheElement}s for data that can either be
* agent-side or server-side initiated.
- *
+ *
* This manager forms a centralized interface through which to interact with the children caches.
- *
+ *
* @author Joseph Marques
*/
public final class AlertConditionCacheCoordinator {
@@ -61,6 +62,25 @@ public final class AlertConditionCacheCoordinator {
private static final AlertConditionCacheCoordinator instance = new AlertConditionCacheCoordinator();
+ /**
+ * When processing EventReport, we may hit an event that triggers problem alert and event that triggers recovery alert within the same report. Firing alert
+ * is asynchronous task, so if processing events too fast, problem alert is fired after we process recovery event, so we miss recovery alert at all.
+ * To workaround that, we slow down event processing in case we hit any event that triggers alert. When such event exists, we sleep given amount of milis
+ * to wait for alert to get fired. There is no performance impact on processing events without alert fired, and this delay is set to 0 by default.
+ * Recommended value is from 500 to 1500milis, 500 was tested as reliable enough for low server load cases.
+ */
+ private static final long ALERTED_EVENT_PROCESSING_DELAY;
+
+ static {
+ long alertedEventProcessingDelay = 0L;
+ try {
+ alertedEventProcessingDelay = Long.parseLong(System.getProperty("rhq.server.alerted.event.process.delay", "0"));
+ } catch (Throwable t) {
+ //
+ }
+ ALERTED_EVENT_PROCESSING_DELAY = alertedEventProcessingDelay;
+ }
+
public enum Cache {
MeasurementDataCache(Type.Agent), //
MeasurementTraitCache(Type.Agent), //
@@ -70,7 +90,7 @@ public final class AlertConditionCacheCoordinator {
EventsCache(Type.Agent), //
ResourceConfigurationCache(Type.Global), //
DriftCache(Type.Agent), //
- AvailabilityDurationCache(Type.Global); //
+ AvailabilityDurationCache(Type.Global); //
public enum Type {
Global, //
@@ -284,20 +304,32 @@ public final class AlertConditionCacheCoordinator {
return new AlertConditionCacheStats();
}
- AlertConditionCacheStats stats = null;
- AgentConditionCache agentCache = null;
- agentReadWriteLock.readLock().lock();
- try {
- agentCache = agentCaches.get(agentId);
- } catch (Throwable t) {
- log.error("Error during checkConditions", t); // don't let any exceptions bubble up to the calling SLSB layer
- } finally {
- agentReadWriteLock.readLock().unlock();
- }
- if (agentCache != null) {
- stats = agentCache.checkConditions(source, events);
- } else {
- stats = new AlertConditionCacheStats();
+ AlertConditionCacheStats stats = new AlertConditionCacheStats();
+ List<Event> unprocessedEvents = new ArrayList(Arrays.asList(events)); // need a List that supports iterator remove
+ while (!unprocessedEvents.isEmpty()) {
+ AgentConditionCache agentCache = null;
+ agentReadWriteLock.readLock().lock();
+ try {
+ agentCache = agentCaches.get(agentId);
+ } catch (Throwable t) {
+ log.error("Error during checkConditions", t); // don't let any exceptions bubble up to the calling SLSB layer
+ } finally {
+ agentReadWriteLock.readLock().unlock();
+ }
+ if (agentCache != null) {
+ stats.add(agentCache.checkConditions(source, unprocessedEvents));
+ if (!unprocessedEvents.isEmpty()) {
+ // delay for a brief time to allow for the matched conditions to potentially fire an alert and
+ // activate recovery alerts, in case the remaining events match the pending recovery conditions
+ try {
+ Thread.sleep(ALERTED_EVENT_PROCESSING_DELAY);
+ } catch (InterruptedException e) {
+ // just continue as a best effort
+ }
+ }
+ } else {
+ break;
+ }
}
return stats;
}
10 years, 4 months
[rhq] modules/enterprise
by mazz
modules/enterprise/server/embeddedagent/pom.xml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
New commits:
commit 35b1e74dcacab6dc14c9eb518353b2e0906b8e85
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Feb 5 17:00:19 2014 -0500
repeated builds (without mvn clean) no longer produce bogus xml file. the replaceregexp is now idempotent.
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
index 0196223..7d4681c 100644
--- a/modules/enterprise/server/embeddedagent/pom.xml
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -106,11 +106,11 @@
<!-- because we don't want log4j writing files in places we don't want, don't use file appenders. -->
<!-- our WildFly/EAP subsystem extension will turn this back on at runtime after log4j is properly configured. -->
<replaceregexp file="${agent.config.dir}/log4j.xml" flags="g"
- match='<appender-ref ref="FILE".*/>'
- replace='<!-- <appender-ref ref="FILE"/> -->' />
+ match='<appender-ref ref="FILE".*/>\n'
+ replace='<!-- <appender-ref ref="FILE"/> --> ' />
<replaceregexp file="${agent.config.dir}/log4j.xml" flags="g"
- match='<appender-ref ref="COMMANDTRACE".*/>'
- replace='<!-- <appender-ref ref="COMMANDTRACE"/> -->' />
+ match='<appender-ref ref="COMMANDTRACE".*/>\n'
+ replace='<!-- <appender-ref ref="COMMANDTRACE"/> --> ' />
<jar destfile="${agent.lib}/rhq-enterprise-agent-${project.version}.jar"
basedir="${agent.config.dir}"
includes="log4j.xml"
10 years, 4 months
[rhq] modules/enterprise
by mazz
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java | 2 +-
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java | 2 +-
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
New commits:
commit 34f2e428a86035a2ff6103840cba021083536cc9
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Feb 5 16:09:35 2014 -0500
set some log levels to debug so embedded agent isn't too noisy
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
index 59419c1..90bca5d 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
@@ -20,7 +20,7 @@ class AgentEnabledAttributeHandler extends AbstractWriteAttributeHandler<Void> {
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder)
throws OperationFailedException {
- log.info("Embedded agent enabled attribute changed: " + attributeName + "=" + resolvedValue);
+ log.debug("Embedded agent enabled attribute changed: " + attributeName + "=" + resolvedValue);
// there is nothing for us to do - this only affects us when we are restarted, return true to say we must reload
return true;
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 154d5d8..7adfbd9 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -44,7 +44,7 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SOCKET_BINDING_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.CUSTOM_CONFIG_ATTRIBDEF.validateAndSet(operation, model);
- log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
+ log.debug("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@Override
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
index 078bf17..16029e3 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
@@ -26,7 +26,7 @@ class PluginsAttributeHandler extends AbstractWriteAttributeHandler<Void> {
ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder)
throws OperationFailedException {
- log.info("Embedded agent plugins attribute changed: " + attributeName + "=" + resolvedValue);
+ log.debug("Embedded agent plugins attribute changed: " + attributeName + "=" + resolvedValue);
setPluginsWithEnabledFlag(context, resolvedValue);
return true; // the service must be restarted to really pick up the change at runtime
}
@@ -35,7 +35,7 @@ class PluginsAttributeHandler extends AbstractWriteAttributeHandler<Void> {
protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
- log.info("Reverting embedded agent plugins attribute: " + attributeName + "=" + valueToRestore);
+ log.debug("Reverting embedded agent plugins attribute: " + attributeName + "=" + valueToRestore);
setPluginsWithEnabledFlag(context, valueToRestore);
}
10 years, 4 months
[rhq] 37 commits - .classpath modules/core modules/enterprise modules/plugins
by mazz
.classpath | 12
modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainerConfiguration.java | 36 +
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfiguration.java | 9
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfigurationConstants.java | 8
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java | 36 +
modules/enterprise/agent/src/main/resources/agent-configuration.xml | 35 +
modules/enterprise/pom.xml | 2
modules/enterprise/server/embeddedagent/pom.xml | 226 ++++++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java | 323 +++++++++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java | 33
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java | 234 +++++++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java | 132 +++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java | 147 ++++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java | 334 ++++++++++
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRemove.java | 23
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java | 39 +
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStatus.java | 32
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStop.java | 34 +
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/CustomConfigAttributeDefinition.java | 61 +
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeDefinition.java | 56 +
modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java | 62 +
modules/enterprise/server/embeddedagent/src/main/resources/META-INF/services/org.jboss.as.controller.Extension | 1
modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml | 55 +
modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties | 26
modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd | 55 +
modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml | 51 +
modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemBaseParsingTestCase.java | 17
modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java | 316 +++++++++
modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml | 18
modules/enterprise/server/pom.xml | 1
modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml | 1
31 files changed, 2409 insertions(+), 6 deletions(-)
New commits:
commit 5f0158a3b7e01d5432c57a46a27c664ca0742b53
Merge: d972365 f42dfd1
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Feb 5 14:13:22 2014 -0500
Merge remote-tracking branch 'origin/master' into feature/embeddedagent
commit d972365f13f9af973f769d4491348d92ef87c79b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Feb 4 15:07:38 2014 -0500
put the embedded agent in the mvn reactor so it builds with everything else
diff --git a/modules/enterprise/pom.xml b/modules/enterprise/pom.xml
index 0105ca8..2dbde1f 100644
--- a/modules/enterprise/pom.xml
+++ b/modules/enterprise/pom.xml
@@ -40,6 +40,7 @@
<module>server/startup-subsystem</module>
<module>server/installer</module>
<module>server/server-control</module>
+ <module>server/embeddedagent</module>
<module>binding</module>
<module>scripting</module>
<module>server/client-api</module>
@@ -72,6 +73,7 @@
<module>server/startup-subsystem</module>
<module>server/installer</module>
<module>server/server-control</module>
+ <module>server/embeddedagent</module>
<module>server/appserver</module>
<module>server/client-api</module>
<module>server/itests-2</module>
diff --git a/modules/enterprise/server/pom.xml b/modules/enterprise/server/pom.xml
index c820eb4..d31861a 100644
--- a/modules/enterprise/server/pom.xml
+++ b/modules/enterprise/server/pom.xml
@@ -35,6 +35,7 @@
<module>server-control</module>
<module>safe-invoker</module>
<module>client-api</module>
+ <module>embeddedagent</module>
<module>itests-2</module>
</modules>
</profile>
commit 9cdd3f8c2b9bd091105ba55a3a7d2c3001031900
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Feb 4 15:05:51 2014 -0500
have embedded agent now use the new "enabled plugins" preference in the agent.
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 651f557..a9d5000 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -18,6 +18,7 @@ import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
import org.rhq.enterprise.agent.AgentMain;
import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
@@ -145,6 +146,26 @@ public class AgentService implements Service<AgentService> {
configOverrides.put(ServiceContainerConfigurationConstants.CONNECTOR_BIND_ADDRESS, agentBindAddress);
configOverrides.put(ServiceContainerConfigurationConstants.CONNECTOR_BIND_PORT, agentBindPort);
+ // if the agent was told to explicitly enable some plugins, add them to the "enabledPlugins" preference.
+ // if the agent was told to explicitly disnable some plugins, add them to the "disabledPlugins" preference.
+ StringBuilder enabledPlugins = new StringBuilder();
+ StringBuilder disabledPlugins = new StringBuilder();
+ for (Map.Entry<String, Boolean> entry : plugins.entrySet()) {
+ String pluginName = entry.getKey();
+ Boolean enabled = entry.getValue();
+ if (enabled) {
+ enabledPlugins.append((enabledPlugins.length() > 0) ? "," : "").append(pluginName);
+ } else {
+ disabledPlugins.append((disabledPlugins.length() > 0) ? "," : "").append(pluginName);
+ }
+ }
+ if (enabledPlugins.length() > 0) {
+ configOverrides.put(AgentConfigurationConstants.PLUGINS_ENABLED, enabledPlugins.toString());
+ }
+ if (disabledPlugins.length() > 0) {
+ configOverrides.put(AgentConfigurationConstants.PLUGINS_DISABLED, disabledPlugins.toString());
+ }
+
ServerEnvironment env = envServiceValue.getValue();
boolean resetConfigurationAtStartup = true;
AgentConfigurationSetup configSetup = new AgentConfigurationSetup(
commit 0ee69bc811c165449d73448542bd6db75b279f4e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Feb 4 12:16:21 2014 -0500
add new feature to the agent that lets you tell the agent explicitly what plugins you want enabled. All others will be disabled.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainerConfiguration.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainerConfiguration.java
index 36ba906..469a0db 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainerConfiguration.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainerConfiguration.java
@@ -46,6 +46,7 @@ public class PluginContainerConfiguration {
private static final String CONTAINER_NAME_PROP = PROP_PREFIX + "container-name";
private static final String DATA_DIRECTORY_PROP = PROP_PREFIX + "data-directory";
private static final String TEMP_DIRECTORY_PROP = PROP_PREFIX + "temp-directory";
+ private static final String ENABLED_PLUGINS = PROP_PREFIX + "enabled-plugins";
private static final String DISABLED_PLUGINS = PROP_PREFIX + "disabled-plugins";
private static final String DISABLED_RESOURCE_TYPES = PROP_PREFIX + "disabled-resource-types";
private static final String ROOT_PLUGIN_CLASSLOADER_REGEX_PROP = PROP_PREFIX + "root-plugin-classloader-regex";
@@ -231,6 +232,7 @@ public class PluginContainerConfiguration {
* is the name found in the plugin .xml descriptor in the plugin root element.
*
* @param disabledPlugins
+ * @see #setEnabledPlugins(List)
*/
public void setDisabledPlugins(List<String> disabledPlugins) {
if (disabledPlugins != null) {
@@ -241,6 +243,40 @@ public class PluginContainerConfiguration {
}
/**
+ * See {@link #setEnabledPlugins(List)} for a description of this.
+ *
+ * @return list of plugin names identifying plugins to be enabled
+ */
+ @SuppressWarnings("unchecked")
+ public List<String> getEnabledPlugins() {
+ List<String> list = (List<String>) configuration.get(ENABLED_PLUGINS);
+ if (list == null) {
+ return new ArrayList<String>(0);
+ } else {
+ return new ArrayList<String>(list);
+ }
+ }
+
+ /**
+ * If only a specific set of plugins are to be loaded by the plugin container, the given
+ * list should be the names of the plugins to be enabled. All other plugins will be
+ * disabled by default. If a plugin name is listed in both this enabled list and the
+ * {@link #setDisabledPlugins(List)} list, the plugin will be disabled (in other words,
+ * the disabled list takes precedence). Note that the plugin name is the name found in
+ * the plugin .xml descriptor in the plugin root element.
+ *
+ * @param enabledPlugins
+ * @see #setDisabledPlugins(List)
+ */
+ public void setEnabledPlugins(List<String> enabledPlugins) {
+ if (enabledPlugins != null) {
+ configuration.put(ENABLED_PLUGINS, enabledPlugins);
+ } else {
+ configuration.remove(ENABLED_PLUGINS);
+ }
+ }
+
+ /**
* If any resource types are to be disabled, the resource types names will be returned
* in a list.
* Each type is listed as "plugin name>parent type>child type".
diff --git a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfiguration.java b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfiguration.java
index 34f669b..f46a02c 100644
--- a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfiguration.java
+++ b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfiguration.java
@@ -1214,6 +1214,14 @@ public class AgentConfiguration {
tmp_directory.mkdir();
}
+ // determine what, if any, plugins are to be enabled
+ String enabled_pref = m_preferences.get(AgentConfigurationConstants.PLUGINS_ENABLED, null);
+ List<String> enabled_plugins = null;
+ if (enabled_pref != null) {
+ String[] array = enabled_pref.split(",");
+ enabled_plugins = new ArrayList<String>(Arrays.asList(array));
+ }
+
// determine what, if any, plugins are to be disabled
String disabled_pref = m_preferences.get(AgentConfigurationConstants.PLUGINS_DISABLED, null);
List<String> disabled_plugins = null;
@@ -1246,6 +1254,7 @@ public class AgentConfiguration {
config.setDataDirectory(data_directory);
config.setTemporaryDirectory(tmp_directory);
config.setDisabledPlugins(disabled_plugins);
+ config.setEnabledPlugins(enabled_plugins);
config.setDisabledResourceTypes(disabled_types);
config.setRootPluginClassLoaderRegex(clRegex);
config.setServerDiscoveryInitialDelay(server_discovery_initial_delay);
diff --git a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfigurationConstants.java b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfigurationConstants.java
index 96a71a9..379d7b7 100644
--- a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfigurationConstants.java
+++ b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentConfigurationConstants.java
@@ -546,6 +546,14 @@ public interface AgentConfigurationConstants {
String PLUGINS_ROOT_PLUGIN_CLASSLOADER_REGEX = PROPERTY_NAME_PREFIX + "plugins.root-plugin-classloader-regex";
/**
+ * The comma separated list of names of plugins that are to be explicitly enabled at startup.
+ * Only those plugins in this preference will be enabled, all others will be disabled.
+ * The disabled plugins setting takes precendence, however. If a plugin is specified in both
+ * the plugins.enabled and plugins.disabled preferences, the plugin will be disabled.
+ */
+ String PLUGINS_ENABLED = PROPERTY_NAME_PREFIX + "plugins.enabled";
+
+ /**
* The comma separated list of names of plugins that are to be disabled at startup
*/
String PLUGINS_DISABLED = PROPERTY_NAME_PREFIX + "plugins.disabled";
diff --git a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java
index 8b7f622..1f5f987 100644
--- a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java
+++ b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java
@@ -114,8 +114,6 @@ public class PluginUpdate {
}
try {
- List<String> disabled_plugin_names = this.config.getDisabledPlugins();
-
// find out what plugins we already have locally
Map<String, Plugin> current_plugins = getCurrentPlugins();
@@ -133,6 +131,40 @@ public class PluginUpdate {
Map<String, Plugin> latest_plugins_map = new HashMap<String, Plugin>(latest_plugins.size());
+ // Get the list of plugins this agent was told to explicitly disable or enable.
+ // If there was a non-empty list of enabled plugins, those are the only plugins to be enabled, any other
+ // plugins not listed in the enabled plugins list will be disabled.
+ // If there was a non-empty list of disabled plugins, those plugins to be explicitly disabled, but any
+ // other plugins available from the server will be enabled by default.
+ // If there were both disabled and enabled plugins explicitly set, we have to choose what takes precendence.
+ // If a plugin was listed as both "enabled" and "disabled", the plugin will be disabled (that is, the
+ // disabled list takes precendence).
+ // For example, suppose our latest plugins on the server are named A, B, C, and D.
+ // If the following (E)nabled and (D)isabled plugins are the following,
+ // then you can see what plugins are to be (U)sed:
+ // (E)=<empty>, (D)=<empty>, (U)=A,B,C,D
+ // (E)=<empty>, (D)=B,C (U)=A,D
+ // (E)=A,B (D)=<empty>, (U)=A,B
+ // (E)=A,B (D)=B,C (U)=A [notice B was listed in both (E) and (D) - it is therefore disabled]
+ //
+ // What we do is we make sure we set disabled_plugin_names with all the names of the plugins to be disabled.
+ // This is just the disabled plugins list unless enabled plugins was also defined, in which case
+ // we have to make sure we figure out the real list of disabled plugins.
+
+ List<String> disabled_plugin_names = this.config.getDisabledPlugins();
+ List<String> enabled_plugin_names = this.config.getEnabledPlugins();
+ if (!enabled_plugin_names.isEmpty()) {
+ // start with all of the names of the plugins that the server has
+ List<String> plugin_names = new ArrayList<String>(latest_plugins.size());
+ for (Plugin latest_plugin : latest_plugins) {
+ plugin_names.add(latest_plugin.getName());
+ }
+ // remove the explicitly enabled plugins from that list
+ plugin_names.removeAll(enabled_plugin_names);
+ // what is left are all the plugins to be disabled, so add those to the disabled plugins list
+ disabled_plugin_names.addAll(plugin_names);
+ }
+
// determine if we need to upgrade any of our current plugins to the latest versions
for (Plugin latest_plugin : latest_plugins) {
String plugin_filename = latest_plugin.getPath();
diff --git a/modules/enterprise/agent/src/main/resources/agent-configuration.xml b/modules/enterprise/agent/src/main/resources/agent-configuration.xml
index ce27dde..8d67b3d 100644
--- a/modules/enterprise/agent/src/main/resources/agent-configuration.xml
+++ b/modules/enterprise/agent/src/main/resources/agent-configuration.xml
@@ -842,6 +842,10 @@ commands named "config", "setconfig" and "setup" and the command line options
its local plugins directory, but that plugin is disabled
via this preference, that local plugin jar file will be
deleted and the plugin will not be loaded.
+
+ Note that if a plugin is listed in both this preference and
+ the rhq.agent.plugins.enabled preference, the plugin will
+ be disabled (that is, this disabled setting takes precedence).
-->
<!--
<entry key="rhq.agent.plugins.disabled" value=""/>
@@ -849,6 +853,37 @@ commands named "config", "setconfig" and "setup" and the command line options
<!--
_______________________________________________________________
+ rhq.agent.plugins.enabled
+
+ Defines the names of the plugins that are to be enabled.
+ This is a comma-separated list of plugin names, where a
+ plugin name is found in the name attribute in the root XML
+ element in the plugin descriptor. If this setting is set,
+ any plugin not in this enabled list will be disabled and thus
+ simply not loaded in the plugin container.
+
+ By default, all plugins are enabled. If a plugin was marked
+ as disabled by the server, the agent will not download it and
+ will not load it, regardless of the value of this preference.
+ If a plugin is enabled on the server, this
+ preference will override that enable setting (in other words,
+ if the agent did not have a plugin in this enabled setting,
+ the plugin will not be enabled, effectively overriding
+ the server setting). If the agent already has a plugin jar in
+ its local plugins directory, but that plugin is not enabled
+ via this preference, that local plugin jar file will be
+ deleted and the plugin will not be loaded.
+
+ Note that if a plugin is listed in both this preference and
+ the rhq.agent.plugins.disabled preference, the plugin will
+ be disabled (that is, the disabled setting takes precedence).
+ -->
+ <!--
+ <entry key="rhq.agent.plugins.enabled" value=""/>
+ -->
+
+ <!--
+ _______________________________________________________________
rhq.agent.plugins.disabled-resource-types
Defines the names of the resource types to be disabled.
diff --git a/modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml
index 641fbee..c9820cf 100644
--- a/modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml
@@ -331,6 +331,7 @@
<c:simple-property name="rhq.agent.plugins.event-sender.period-secs" type="integer" units="seconds" activationPolicy="restart" required="false" default="30" displayName="Event Sender Period" description="Defines how often event reports get sent to the server (in seconds)" />
<c:simple-property name="rhq.agent.plugins.event-report.max-per-source" type="integer" activationPolicy="restart" required="false" default="200" displayName="Event Report Max Per Source" description="Defines the maximum number of events for any given event source that can be placed in a single event report that is sent up to the server. If this number is larger than the max-total setting, then this setting is ignored" />
<c:simple-property name="rhq.agent.plugins.event-report.max-total" type="integer" activationPolicy="restart" required="false" default="400" displayName="Event Report Max Total" description="Defines the total maximum number of events that can be placed in a single event report that is sent up to the server" />
+ <c:simple-property name="rhq.agent.plugins.enabled" type="string" activationPolicy="restart" required="false" default="" displayName="Enabled Plugins" description="Defines the plugins that should be enabled by the plugin container. Those plugins not listed will not be loaded. This is a comma-separated list of plugin names." />
<c:simple-property name="rhq.agent.plugins.disabled" type="string" activationPolicy="restart" required="false" default="" displayName="Disabled Plugins" description="Defines the plugins that should be disabled and not loaded by the plugin container. This is a comma-separated list of plugin names." />
<c:simple-property name="rhq.agent.plugins.disabled-resource-types" type="string" activationPolicy="restart" required="false" default="" displayName="Disabled Resource Types" description="Defines the resource types that should be disabled and not used by the plugin container. This is a |-separated list of type names in the form of 'plugin name>parent type>child type'." />
</c:group>
commit 1a94219de01fb3ab5e24e1119307dfc7d8abdeb7
Merge: 37c6e18 e4aedd0
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Feb 4 09:54:26 2014 -0500
Merge branch 'feature/embeddedagent' of ssh://git.fedorahosted.org/git/rhq/rhq into feature/embeddedagent
commit 37c6e18453d4d3781c8e4e3b2ce7c09b9a8c62ff
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Feb 3 17:19:54 2014 -0500
add ability to set generic config preferences
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 115f74b..154d5d8 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -43,6 +43,7 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SOCKET_BINDING_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.CUSTOM_CONFIG_ATTRIBDEF.validateAndSet(operation, model);
log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@@ -85,6 +86,20 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_TRANSPORT_ATTRIBDEF);
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_TRANSPORT_PARAMS_ATTRIBDEF);
+ // allow the user to provide their own overrides
+ ModelNode customConfigNode = AgentSubsystemDefinition.CUSTOM_CONFIG_ATTRIBDEF.resolveModelAttribute(context,
+ model);
+ if (customConfigNode != null && customConfigNode.isDefined()) {
+ HashMap<String, String> customConfig = new HashMap<String, String>();
+ List<Property> prefList = customConfigNode.asPropertyList();
+ for (Property pref : prefList) {
+ String name = pref.getName();
+ String val = pref.getValue().asString();
+ customConfig.put(name, val);
+ }
+ overrides.putAll(customConfig);
+ }
+
// create our service
AgentService service = new AgentService();
service.setPlugins(pluginsWithEnableFlag);
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index 78d274b..1224d84 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -30,6 +30,8 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
+ protected static final CustomConfigAttributeDefinition CUSTOM_CONFIG_ATTRIBDEF = new CustomConfigAttributeDefinition();
+
protected static final SimpleAttributeDefinition AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_AGENT_NAME, ModelType.STRING).setAllowExpression(true)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
@@ -97,6 +99,7 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
public void registerAttributes(ManagementResourceRegistration rr) {
rr.registerReadWriteAttribute(AGENT_ENABLED_ATTRIBDEF, null, AgentEnabledAttributeHandler.INSTANCE);
rr.registerReadWriteAttribute(PLUGINS_ATTRIBDEF, null, PluginsAttributeHandler.INSTANCE);
+ registerReloadRequiredWriteAttributeHandler(rr, CUSTOM_CONFIG_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, AGENT_NAME_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, DISABLE_NATIVE_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_ATTRIBDEF);
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 637b7a8..4463ad9 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -17,6 +17,7 @@ import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.SubsystemRegistration;
import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver;
+import org.jboss.as.controller.parsing.Attribute;
import org.jboss.as.controller.parsing.ExtensionParsingContext;
import org.jboss.as.controller.parsing.ParseUtils;
import org.jboss.as.controller.persistence.SubsystemMarshallingContext;
@@ -51,6 +52,8 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_ENABLED = "enabled";
protected static final boolean AGENT_ENABLED_DEFAULT = false;
protected static final boolean PLUGIN_ENABLED_DEFAULT = true;
+ protected static final String AGENT_CONFIG_ELEMENT = "extra-configuration";
+ protected static final String PREFERENCE_ELEMENT = "preference";
protected static final String SERVER_ENDPOINT_ELEMENT = "server-endpoint";
protected static final String SERVER_ENDPOINT_ADDRESS_XML = "address";
protected static final String SERVER_ENDPOINT_PORT_XML = "port";
@@ -131,6 +134,13 @@ public class AgentSubsystemExtension implements Extension {
readPlugin(reader, pluginsAttributeNode);
}
}
+ } else if (elementName.equals(AGENT_CONFIG_ELEMENT)) {
+ ModelNode configAttributeNode = opAdd.get(AGENT_CONFIG_ELEMENT);
+ while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
+ if (reader.isStartElement()) {
+ readPreference(reader, configAttributeNode);
+ }
+ }
} else if (elementName.equals(SERVER_ENDPOINT_ELEMENT)) {
String val = reader.getAttributeValue(null, SERVER_ENDPOINT_ADDRESS_XML);
if (val != null) {
@@ -206,6 +216,21 @@ public class AgentSubsystemExtension implements Extension {
pluginsAttributeNode.add(pluginName, pluginEnabled);
}
+ private void readPreference(XMLExtendedStreamReader reader, ModelNode configAttributeNode)
+ throws XMLStreamException {
+
+ if (!reader.getLocalName().equals(PREFERENCE_ELEMENT)) {
+ throw ParseUtils.unexpectedElement(reader);
+ }
+
+ ParseUtils.requireAttributes(reader, Attribute.NAME.getLocalName(), Attribute.VALUE.getLocalName());
+ String attr = reader.getAttributeValue(null, Attribute.NAME.getLocalName());
+ String val = reader.getAttributeValue(null, Attribute.VALUE.getLocalName());
+ ParseUtils.requireNoContent(reader);
+
+ configAttributeNode.add(attr, val);
+ }
+
@Override
public void writeContent(final XMLExtendedStreamWriter writer, final SubsystemMarshallingContext context)
throws XMLStreamException {
@@ -261,6 +286,22 @@ public class AgentSubsystemExtension implements Extension {
// </agent-endpoint>
writer.writeEndElement();
+ // <extra-configuration>
+ writer.writeStartElement(AGENT_CONFIG_ELEMENT);
+ ModelNode configNode = node.get(AGENT_CONFIG_ELEMENT);
+ if (configNode != null && configNode.isDefined()) {
+ for (Property property : configNode.asPropertyList()) {
+ // <preference>
+ writer.writeStartElement(PREFERENCE_ELEMENT);
+ writer.writeAttribute(Attribute.NAME.getLocalName(), property.getName());
+ writer.writeAttribute(Attribute.VALUE.getLocalName(), property.getValue().asString());
+ // </preference>
+ writer.writeEndElement();
+ }
+ }
+ // </extra-configuration>
+ writer.writeEndElement();
+
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
ModelNode plugins = node.get(PLUGINS_ELEMENT);
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/CustomConfigAttributeDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/CustomConfigAttributeDefinition.java
new file mode 100644
index 0000000..5129f3d
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/CustomConfigAttributeDefinition.java
@@ -0,0 +1,61 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.jboss.as.controller.MapAttributeDefinition;
+import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
+import org.jboss.as.controller.descriptions.ResourceDescriptionResolver;
+import org.jboss.as.controller.operations.validation.ModelTypeValidator;
+import org.jboss.as.controller.parsing.Attribute;
+import org.jboss.as.controller.registry.AttributeAccess.Flag;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.ModelType;
+
+/**
+ * A generic catch-all to allow the agent to have any config preference set.
+ *
+ * @author John Mazzitelli
+ */
+public class CustomConfigAttributeDefinition extends MapAttributeDefinition {
+
+ public CustomConfigAttributeDefinition() {
+ super(AgentSubsystemExtension.AGENT_CONFIG_ELEMENT, AgentSubsystemExtension.AGENT_CONFIG_ELEMENT, true,
+ 0, Integer.MAX_VALUE, new ModelTypeValidator(ModelType.STRING), null, null, Flag.RESTART_RESOURCE_SERVICES);
+ }
+
+ @Override
+ protected void addValueTypeDescription(ModelNode node, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ protected void addAttributeValueTypeDescription(ModelNode node, ResourceDescriptionResolver resolver,
+ Locale locale, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ protected void addOperationParameterValueTypeDescription(ModelNode node, String operationName,
+ ResourceDescriptionResolver resolver, Locale locale, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ public void marshallAsElement(ModelNode resourceModel, XMLStreamWriter writer) throws XMLStreamException {
+ if (!isMarshallable(resourceModel))
+ return;
+
+ resourceModel = resourceModel.get(getName());
+ writer.writeStartElement(getName());
+ for (ModelNode property : resourceModel.asList()) {
+ writer.writeEmptyElement(getXmlName());
+ writer.writeAttribute(Attribute.NAME.getLocalName(), property.asProperty().getName());
+ writer.writeAttribute(Attribute.VALUE.getLocalName(), property.asProperty().getValue().asString());
+ }
+ writer.writeEndElement();
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index 680f9f2..f4b08d1 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -6,6 +6,7 @@ embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
+embeddedagent.extra-configuration=Additional preference values used to configure the agent
embeddedagent.socket-binding=Determines the binding address and port the agent listens to for incoming server messages.
embeddedagent.rhq.communications.connector.transport=The transport server must use to communicate with the agent.
embeddedagent.rhq.communications.connector.transport-params=The transport parameters the server must use to communicate with the agent.
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index a116308..3439cf2 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -15,6 +15,7 @@
<xs:element name="rhq.agent.server.alias" type="xs:string"/>
<xs:element name="server-endpoint" type="serverEndpointType"/>
<xs:element name="agent-endpoint" type="agentEndpointType"/>
+ <xs:element name="extra-configuration" type="extraConfigurationType"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
@@ -41,4 +42,14 @@
<xs:attribute name="name" use="required"/>
<xs:attribute name="enabled" type="xs:boolean" use="required" default="true"/>
</xs:complexType>
+
+ <xs:complexType name="extraConfigurationType">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="preference" type="preferenceType"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="preferenceType">
+ <xs:attribute name="name" use="required"/>
+ <xs:attribute name="value" use="required"/>
+ </xs:complexType>
</xs:schema>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index b6126a0..5c2f3d4 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -198,6 +198,7 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
List<Property> attributes = content.get("attributes").asPropertyList();
List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.AGENT_CONFIG_ELEMENT, //
AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT_PARAMS, //
AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT, //
AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, //
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index d4ea3c8..c847ee6 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -6,6 +6,11 @@
<server-endpoint port="7080" transport="test-transport" transport-params="test-transport-params" />
<agent-endpoint socket-binding="embeddedagent" transport="socket"/>
+ <extra-configuration>
+ <preference name="custom-prop" value="custom-prop-val"/>
+ <preference name="custom-prop2" value="custom-prop-val2"/>
+ </extra-configuration>
+
<plugins>
<plugin name="platform" enabled="true" />
<plugin name="blah" enabled="false" />
commit ec9d3e7c94581958aa99ba48831fecea2607a08b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Feb 3 15:46:27 2014 -0500
add transport agent-endpoint configurability
make server endpoing configured via one element with some attribs
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 937af70..115f74b 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -82,6 +82,8 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_BIND_ADDRESS_ATTRIBDEF);
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_TRANSPORT_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_TRANSPORT_PARAMS_ATTRIBDEF);
// create our service
AgentService service = new AgentService();
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index ad50c4e..78d274b 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -17,6 +17,7 @@ import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.rhq.enterprise.agent.AgentConfigurationConstants;
+import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
public class AgentSubsystemDefinition extends SimpleResourceDefinition {
@@ -31,50 +32,61 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
protected static final SimpleAttributeDefinition AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_AGENT_NAME, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_AGENT_NAME).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setAllowNull(true).build();
protected static final SimpleAttributeDefinition DISABLE_NATIVE_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE, ModelType.BOOLEAN).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
- protected static final SimpleAttributeDefinition SERVER_TRANSPORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
- AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT)
- .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
- .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT)).setAllowNull(false)
- .build();
+ protected static final SimpleAttributeDefinition SERVER_BIND_ADDRESS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.SERVER_ENDPOINT_ADDRESS_XML)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
protected static final SimpleAttributeDefinition SERVER_BIND_PORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT)
+ .setXmlName(AgentSubsystemExtension.SERVER_ENDPOINT_PORT_XML)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_BIND_PORT)).setAllowNull(false)
.build();
- protected static final SimpleAttributeDefinition SERVER_BIND_ADDRESS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
- AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS)
- .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
+ protected static final SimpleAttributeDefinition SERVER_TRANSPORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.SERVER_ENDPOINT_TRANSPORT_XML)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT)).setAllowNull(false)
+ .build();
protected static final SimpleAttributeDefinition SERVER_TRANSPORT_PARAMS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS)
+ .setXmlName(AgentSubsystemExtension.SERVER_ENDPOINT_TRANSPORT_XML)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT_PARAMS))
.setAllowNull(false).build();
protected static final SimpleAttributeDefinition SERVER_ALIAS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_SERVER_ALIAS, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_ALIAS)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
protected static final SimpleAttributeDefinition SOCKET_BINDING_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, ModelType.STRING)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setDefaultValue(new ModelNode("embeddedagent"))
+ .setValidator(new StringLengthValidator(1)).setAllowNull(false).build();
+
+ protected static final SimpleAttributeDefinition AGENT_TRANSPORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.AGENT_ENDPOINT_TRANSPORT_XML)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
- .setDefaultValue(new ModelNode("embeddedagent")).setValidator(new StringLengthValidator(1)).setAllowNull(false)
- .build();
+ .setDefaultValue(new ModelNode(ServiceContainerConfigurationConstants.DEFAULT_CONNECTOR_TRANSPORT))
+ .setAllowNull(true).build();
+
+ protected static final SimpleAttributeDefinition AGENT_TRANSPORT_PARAMS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT_PARAMS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.AGENT_ENDPOINT_TRANSPORT_PARAMS_XML)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(ServiceContainerConfigurationConstants.DEFAULT_CONNECTOR_TRANSPORT_PARAMS))
+ .setAllowNull(true).build();
private AgentSubsystemDefinition() {
super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
@@ -93,6 +105,8 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SERVER_ALIAS_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SOCKET_BINDING_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, AGENT_TRANSPORT_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, AGENT_TRANSPORT_PARAMS_ATTRIBDEF);
}
private void registerReloadRequiredWriteAttributeHandler(ManagementResourceRegistration rr, AttributeDefinition def) {
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 4374c7e..637b7a8 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -30,6 +30,7 @@ import org.jboss.staxmapper.XMLExtendedStreamReader;
import org.jboss.staxmapper.XMLExtendedStreamWriter;
import org.rhq.enterprise.agent.AgentConfigurationConstants;
+import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
public class AgentSubsystemExtension implements Extension {
@@ -50,6 +51,15 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_ENABLED = "enabled";
protected static final boolean AGENT_ENABLED_DEFAULT = false;
protected static final boolean PLUGIN_ENABLED_DEFAULT = true;
+ protected static final String SERVER_ENDPOINT_ELEMENT = "server-endpoint";
+ protected static final String SERVER_ENDPOINT_ADDRESS_XML = "address";
+ protected static final String SERVER_ENDPOINT_PORT_XML = "port";
+ protected static final String SERVER_ENDPOINT_TRANSPORT_XML = "transport";
+ protected static final String SERVER_ENDPOINT_TRANSPORT_PARAMS_XML = "transport-params";
+ protected static final String AGENT_ENDPOINT_ELEMENT = "agent-endpoint";
+ protected static final String AGENT_ENDPOINT_SOCKET_BINDING_XML = "socket-binding";
+ protected static final String AGENT_ENDPOINT_TRANSPORT_XML = "transport";
+ protected static final String AGENT_ENDPOINT_TRANSPORT_PARAMS_XML = "transport-params";
protected static final String AGENT_RESTART_OP = "restart";
protected static final String AGENT_STOP_OP = "stop";
@@ -62,10 +72,13 @@ public class AgentSubsystemExtension implements Extension {
protected static final String ATTRIB_SERVER_BIND_ADDRESS = AgentConfigurationConstants.SERVER_BIND_ADDRESS;
protected static final String ATTRIB_SERVER_TRANSPORT_PARAMS = AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS;
protected static final String ATTRIB_SERVER_ALIAS = AgentConfigurationConstants.SERVER_ALIAS;
- protected static final String ATTRIB_SOCKET_BINDING = "socket-binding";
+ protected static final String ATTRIB_SOCKET_BINDING = AGENT_ENDPOINT_SOCKET_BINDING_XML;
+ protected static final String ATTRIB_AGENT_TRANSPORT = ServiceContainerConfigurationConstants.CONNECTOR_TRANSPORT;
+ protected static final String ATTRIB_AGENT_TRANSPORT_PARAMS = ServiceContainerConfigurationConstants.CONNECTOR_TRANSPORT_PARAMS;
protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
+
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
String prefix = SUBSYSTEM_NAME + (keyPrefix == null ? "" : "." + keyPrefix);
return new StandardResourceDescriptionResolver(prefix, RESOURCE_NAME,
@@ -118,22 +131,44 @@ public class AgentSubsystemExtension implements Extension {
readPlugin(reader, pluginsAttributeNode);
}
}
+ } else if (elementName.equals(SERVER_ENDPOINT_ELEMENT)) {
+ String val = reader.getAttributeValue(null, SERVER_ENDPOINT_ADDRESS_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SERVER_BIND_ADDRESS).set(val);
+ }
+ val = reader.getAttributeValue(null, SERVER_ENDPOINT_PORT_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SERVER_BIND_PORT).set(val);
+ }
+ val = reader.getAttributeValue(null, SERVER_ENDPOINT_TRANSPORT_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SERVER_TRANSPORT).set(val);
+ }
+ val = reader.getAttributeValue(null, SERVER_ENDPOINT_TRANSPORT_PARAMS_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SERVER_TRANSPORT_PARAMS).set(val);
+ }
+ ParseUtils.requireNoContent(reader);
+ } else if (elementName.equals(AGENT_ENDPOINT_ELEMENT)) {
+ String val = reader.getAttributeValue(null, AGENT_ENDPOINT_SOCKET_BINDING_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SOCKET_BINDING).set(val);
+ }
+ val = reader.getAttributeValue(null, AGENT_ENDPOINT_TRANSPORT_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_AGENT_TRANSPORT).set(val);
+ }
+ val = reader.getAttributeValue(null, AGENT_ENDPOINT_TRANSPORT_PARAMS_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_AGENT_TRANSPORT_PARAMS).set(val);
+ }
+ ParseUtils.requireNoContent(reader);
} else if (elementName.equals(ATTRIB_AGENT_NAME)) {
opAdd.get(ATTRIB_AGENT_NAME).set(reader.getElementText());
} else if (elementName.equals(ATTRIB_DISABLE_NATIVE)) {
opAdd.get(ATTRIB_DISABLE_NATIVE).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SERVER_TRANSPORT)) {
- opAdd.get(ATTRIB_SERVER_TRANSPORT).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SERVER_BIND_PORT)) {
- opAdd.get(ATTRIB_SERVER_BIND_PORT).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SERVER_BIND_ADDRESS)) {
- opAdd.get(ATTRIB_SERVER_BIND_ADDRESS).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SERVER_TRANSPORT_PARAMS)) {
- opAdd.get(ATTRIB_SERVER_TRANSPORT_PARAMS).set(reader.getElementText());
} else if (elementName.equals(ATTRIB_SERVER_ALIAS)) {
opAdd.get(ATTRIB_SERVER_ALIAS).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SOCKET_BINDING)) {
- opAdd.get(ATTRIB_SOCKET_BINDING).set(reader.getElementText());
} else {
throw ParseUtils.unexpectedElement(reader);
}
@@ -184,12 +219,47 @@ public class AgentSubsystemExtension implements Extension {
// our config elements
writeElement(writer, node, ATTRIB_AGENT_NAME);
writeElement(writer, node, ATTRIB_DISABLE_NATIVE);
- writeElement(writer, node, ATTRIB_SERVER_TRANSPORT);
- writeElement(writer, node, ATTRIB_SERVER_BIND_PORT);
- writeElement(writer, node, ATTRIB_SERVER_BIND_ADDRESS);
- writeElement(writer, node, ATTRIB_SERVER_TRANSPORT_PARAMS);
writeElement(writer, node, ATTRIB_SERVER_ALIAS);
- writeElement(writer, node, ATTRIB_SOCKET_BINDING);
+
+ // <server-endpoint>
+ writer.writeStartElement(SERVER_ENDPOINT_ELEMENT);
+ ModelNode serverAddressNode = node.get(ATTRIB_SERVER_BIND_ADDRESS);
+ ModelNode serverPortNode = node.get(ATTRIB_SERVER_BIND_PORT);
+ ModelNode serverTransportNode = node.get(ATTRIB_SERVER_TRANSPORT);
+ ModelNode serverTransportParamsNode = node.get(ATTRIB_SERVER_TRANSPORT_PARAMS);
+
+ if (serverPortNode.isDefined()) {
+ writer.writeAttribute(SERVER_ENDPOINT_PORT_XML, serverPortNode.asString());
+ }
+ if (serverAddressNode.isDefined()) {
+ writer.writeAttribute(SERVER_ENDPOINT_ADDRESS_XML, serverAddressNode.asString());
+ }
+ if (serverTransportNode.isDefined()) {
+ writer.writeAttribute(SERVER_ENDPOINT_TRANSPORT_XML, serverTransportNode.asString());
+ }
+ if (serverTransportParamsNode.isDefined()) {
+ writer.writeAttribute(SERVER_ENDPOINT_TRANSPORT_PARAMS_XML, serverTransportParamsNode.asString());
+ }
+ // </server-endpoint>
+ writer.writeEndElement();
+
+ // <agent-endpoint>
+ writer.writeStartElement(AGENT_ENDPOINT_ELEMENT);
+ ModelNode agentSocketBindingNode = node.get(ATTRIB_SOCKET_BINDING);
+ ModelNode agentTransportNode = node.get(ATTRIB_AGENT_TRANSPORT);
+ ModelNode agentTransportParamsNode = node.get(ATTRIB_AGENT_TRANSPORT_PARAMS);
+
+ if (agentSocketBindingNode.isDefined()) {
+ writer.writeAttribute(AGENT_ENDPOINT_SOCKET_BINDING_XML, agentSocketBindingNode.asString());
+ }
+ if (agentTransportNode.isDefined()) {
+ writer.writeAttribute(AGENT_ENDPOINT_TRANSPORT_XML, agentTransportNode.asString());
+ }
+ if (agentTransportParamsNode.isDefined()) {
+ writer.writeAttribute(AGENT_ENDPOINT_TRANSPORT_PARAMS_XML, agentTransportParamsNode.asString());
+ }
+ // </agent-endpoint>
+ writer.writeEndElement();
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index e2badfc..680f9f2 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -7,6 +7,8 @@ embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
embeddedagent.socket-binding=Determines the binding address and port the agent listens to for incoming server messages.
+embeddedagent.rhq.communications.connector.transport=The transport server must use to communicate with the agent.
+embeddedagent.rhq.communications.connector.transport-params=The transport parameters the server must use to communicate with the agent.
embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
embeddedagent.rhq.agent.disable-native-system=The RHQ Agent has a native system on certain supported platforms to help the \n\
plugin container perform discovery of native components on those platforms. \n\
@@ -20,4 +22,4 @@ alias (see rhq.agent.server.alias), and if that is not defined \n\
the RHQ Agent will default to localhost or 127.0.0.1.
embeddedagent.rhq.agent.server.transport-params=Communications transport parameters used when sending messages to the RHQ Server.
embeddedagent.rhq.agent.server.alias=If the server address is not defined, this is the DNS alias name the \n\
-RHQ Agent will resolve and use for the server address.
+RHQ Agent will resolve and use for the server address.
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index d587e23..a116308 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -11,17 +11,27 @@
<xs:attribute name="enabled" type="xs:boolean" use="required" default="false"/>
<xs:all>
<xs:element name="rhq.agent.name" type="xs:string"/>
- <xs:element name="rhq.agent.disable-native-system" type="xs:boolean" use="optional"/>
- <xs:element name="rhq.agent.server.transport" type="xs:string"/>
- <xs:element name="rhq.agent.server.bind-port" type="xs:integer"/>
- <xs:element name="rhq.agent.server.bind-address" type="xs:string" use="optional"/>
- <xs:element name="rhq.agent.server.transport-params" type="xs:string" />
- <xs:element name="rhq.agent.server.alias" type="xs:string" use="optional"/>
- <xs:element name="socket-binding" type="xs:string"/>
+ <xs:element name="rhq.agent.disable-native-system" type="xs:boolean"/>
+ <xs:element name="rhq.agent.server.alias" type="xs:string"/>
+ <xs:element name="server-endpoint" type="serverEndpointType"/>
+ <xs:element name="agent-endpoint" type="agentEndpointType"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
+ <xs:complexType name="serverEndpointType">
+ <xs:attribute name="address"/>
+ <xs:attribute name="port" type="xs:integer"/>
+ <xs:attribute name="transport"/>
+ <xs:attribute name="transport-params"/>
+ </xs:complexType>
+
+ <xs:complexType name="agentEndpointType">
+ <xs:attribute name="socket-binding"/>
+ <xs:attribute name="transport"/>
+ <xs:attribute name="transport-params"/>
+ </xs:complexType>
+
<xs:complexType name="pluginsType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="plugin" type="pluginType"/>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index 0f3a8fa..b6126a0 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -198,6 +198,8 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
List<Property> attributes = content.get("attributes").asPropertyList();
List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT_PARAMS, //
+ AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT, //
AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, //
AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, //
AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, //
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index 09da3f6..d4ea3c8 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -1,13 +1,10 @@
<subsystem xmlns="urn:org.rhq:embeddedagent:1.0" enabled="true">
<rhq.agent.name>embeddedagent-test</rhq.agent.name>
<!-- <rhq.agent.disable-native-system>true</rhq.agent.disable-native-system> -->
- <rhq.agent.server.transport>test-transport</rhq.agent.server.transport>
- <rhq.agent.server.bind-port>12345</rhq.agent.server.bind-port>
- <!-- <rhq.agent.server.bind-address>test-bind-address</rhq.agent.server.bind-address> -->
- <rhq.agent.server.transport-params>test-transport-params</rhq.agent.server.transport-params>
<!-- <rhq.agent.server.alias>test-alias</rhq.agent.server.alias> -->
- <socket-binding>embeddedagent</socket-binding>
+ <server-endpoint port="7080" transport="test-transport" transport-params="test-transport-params" />
+ <agent-endpoint socket-binding="embeddedagent" transport="socket"/>
<plugins>
<plugin name="platform" enabled="true" />
commit 5e171db86ceaa8ff1bc461c2f7b77bc3c12fc833
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Feb 3 13:43:15 2014 -0500
add ability to define agent binding addr/port in EAP config xml
diff --git a/.classpath b/.classpath
index 455f739..4916f67 100644
--- a/.classpath
+++ b/.classpath
@@ -334,9 +334,11 @@
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-ejb3/7.2.0.Alpha1-redhat-4/jboss-as-ejb3-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-ejb3/7.2.0.Alpha1-redhat-4/jboss-as-ejb3-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/staxmapper/1.1.0.Final/staxmapper-1.1.0.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/modules/jboss-modules/1.1.1.GA/jboss-modules-1.1.1.GA.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-subsystem-test/7.1.1.Final/jboss-as-subsystem-test-7.1.1.Final.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller/7.1.1.Final/jboss-as-controller-7.1.1.Final.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-controller/7.2.0.Alpha1-redhat-4/jboss-as-controller-7.2.0.Alpha1-redhat-4-sources.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller-client/7.1.1.Final/jboss-as-controller-client-7.1.1.Final.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-subsystem-test/7.2.0.Alpha1-redhat-4/jboss-as-subsystem-test-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-subsystem-test/7.2.0.Alpha1-redhat-4/jboss-as-subsystem-test-7.2.0.Alpha1-redhat-4-sources.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller/7.2.0.Alpha1-redhat-4/jboss-as-controller-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-controller/7.2.0.Alpha1-redhat-4/jboss-as-controller-7.2.0.Alpha1-redhat-4-sources.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller-client/7.2.0.Alpha1-redhat-4/jboss-as-controller-client-7.2.0.Alpha1-redhat-4.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-model-test/7.2.0.Alpha1-redhat-4/jboss-as-model-test-7.2.0.Alpha1-redhat-4.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-network/7.2.0.Alpha1-redhat-4/jboss-as-network-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-network/7.2.0.Alpha1-redhat-4/jboss-as-network-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-links/2.3.5.Final/resteasy-links-2.3.5.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-jaxrs/2.3.5.Final/resteasy-jaxrs-2.3.5.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-jackson-provider/2.3.5.Final/resteasy-jackson-provider-2.3.5.Final.jar"/>
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 018519d..651f557 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -6,6 +6,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
+import org.jboss.as.network.SocketBinding;
import org.jboss.as.server.ServerEnvironment;
import org.jboss.logging.Logger;
import org.jboss.modules.Module;
@@ -18,6 +19,7 @@ import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
import org.rhq.enterprise.agent.AgentMain;
+import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
public class AgentService implements Service<AgentService> {
@@ -31,7 +33,13 @@ public class AgentService implements Service<AgentService> {
* This service gives us information about the server, like the install directory, data directory, etc.
* Package-scoped so the add-step handler can access this.
*/
- InjectedValue<ServerEnvironment> envServiceValue = new InjectedValue<ServerEnvironment>();
+ final InjectedValue<ServerEnvironment> envServiceValue = new InjectedValue<ServerEnvironment>();
+
+ /**
+ * Our subsystem add-step handler will inject this as a dependency for us.
+ * This object will provide the binding address and port for the agent listener.
+ */
+ final InjectedValue<SocketBinding> agentListenerBinding = new InjectedValue<SocketBinding>();
/**
* This service can be configured to be told explicitly about certain plugins to be
@@ -131,10 +139,17 @@ public class AgentService implements Service<AgentService> {
log.info("Starting the embedded agent now");
try {
// make sure we pre-configure the agent with some settings taken from our runtime environment
+ SocketBinding agentListenerBindingValue = agentListenerBinding.getValue();
+ String agentBindAddress = agentListenerBindingValue.getAddress().getHostAddress();
+ String agentBindPort = String.valueOf(agentListenerBindingValue.getAbsolutePort());
+ configOverrides.put(ServiceContainerConfigurationConstants.CONNECTOR_BIND_ADDRESS, agentBindAddress);
+ configOverrides.put(ServiceContainerConfigurationConstants.CONNECTOR_BIND_PORT, agentBindPort);
+
ServerEnvironment env = envServiceValue.getValue();
boolean resetConfigurationAtStartup = true;
AgentConfigurationSetup configSetup = new AgentConfigurationSetup(
getExportedResource("conf/agent-configuration.xml"), resetConfigurationAtStartup, configOverrides, env);
+
// prepare the agent logging first thing so the agent logs messages using this config
configSetup.prepareLogConfigFile(getExportedResource("conf/log4j.xml"));
configSetup.preConfigureAgent();
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index c2cc801..937af70 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -9,6 +9,7 @@ import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.ServiceVerificationHandler;
+import org.jboss.as.network.SocketBinding;
import org.jboss.as.server.ServerEnvironment;
import org.jboss.as.server.ServerEnvironmentService;
import org.jboss.dmr.ModelNode;
@@ -41,6 +42,7 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
AgentSubsystemDefinition.SERVER_BIND_ADDRESS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SOCKET_BINDING_ATTRIBDEF.validateAndSet(operation, model);
log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@@ -87,10 +89,14 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
service.setConfigurationOverrides(overrides);
// install the service
+ String binding = AgentSubsystemDefinition.SOCKET_BINDING_ATTRIBDEF.resolveModelAttribute(context, model)
+ .asString();
ServiceName name = AgentService.SERVICE_NAME;
ServiceController<AgentService> controller = context.getServiceTarget() //
.addService(name, service) //
.addDependency(ServerEnvironmentService.SERVICE_NAME, ServerEnvironment.class, service.envServiceValue) //
+ .addDependency(SocketBinding.JBOSS_BINDING_NAME.append(binding), SocketBinding.class,
+ service.agentListenerBinding) //
.addListener(verificationHandler) //
.setInitialMode(Mode.ACTIVE) //
.install();
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index dec1a26..ad50c4e 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -9,6 +9,7 @@ import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.SimpleResourceDefinition;
import org.jboss.as.controller.descriptions.DefaultOperationDescriptionProvider;
import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
+import org.jboss.as.controller.operations.validation.StringLengthValidator;
import org.jboss.as.controller.registry.AttributeAccess;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.registry.OperationEntry;
@@ -69,6 +70,12 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
.setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_ALIAS)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
+ protected static final SimpleAttributeDefinition SOCKET_BINDING_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, ModelType.STRING)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode("embeddedagent")).setValidator(new StringLengthValidator(1)).setAllowNull(false)
+ .build();
+
private AgentSubsystemDefinition() {
super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
AgentSubsystemAdd.INSTANCE, AgentSubsystemRemove.INSTANCE);
@@ -85,6 +92,7 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
registerReloadRequiredWriteAttributeHandler(rr, SERVER_BIND_ADDRESS_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SERVER_ALIAS_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SOCKET_BINDING_ATTRIBDEF);
}
private void registerReloadRequiredWriteAttributeHandler(ManagementResourceRegistration rr, AttributeDefinition def) {
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index a74bafb..4374c7e 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -62,11 +62,10 @@ public class AgentSubsystemExtension implements Extension {
protected static final String ATTRIB_SERVER_BIND_ADDRESS = AgentConfigurationConstants.SERVER_BIND_ADDRESS;
protected static final String ATTRIB_SERVER_TRANSPORT_PARAMS = AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS;
protected static final String ATTRIB_SERVER_ALIAS = AgentConfigurationConstants.SERVER_ALIAS;
+ protected static final String ATTRIB_SOCKET_BINDING = "socket-binding";
protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
-
-
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
String prefix = SUBSYSTEM_NAME + (keyPrefix == null ? "" : "." + keyPrefix);
return new StandardResourceDescriptionResolver(prefix, RESOURCE_NAME,
@@ -133,6 +132,8 @@ public class AgentSubsystemExtension implements Extension {
opAdd.get(ATTRIB_SERVER_TRANSPORT_PARAMS).set(reader.getElementText());
} else if (elementName.equals(ATTRIB_SERVER_ALIAS)) {
opAdd.get(ATTRIB_SERVER_ALIAS).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SOCKET_BINDING)) {
+ opAdd.get(ATTRIB_SOCKET_BINDING).set(reader.getElementText());
} else {
throw ParseUtils.unexpectedElement(reader);
}
@@ -188,6 +189,7 @@ public class AgentSubsystemExtension implements Extension {
writeElement(writer, node, ATTRIB_SERVER_BIND_ADDRESS);
writeElement(writer, node, ATTRIB_SERVER_TRANSPORT_PARAMS);
writeElement(writer, node, ATTRIB_SERVER_ALIAS);
+ writeElement(writer, node, ATTRIB_SOCKET_BINDING);
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index 56419c3..faa971f 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -48,5 +48,8 @@
<!-- the standalone agent had this in its endorsed dir, but the embedded agent adds it as a dependency -->
<module name="javax.xml.bind.api"/>
+
+ <!-- other dependencies we need -->
+ <module name="org.jboss.as.network"/>
</dependencies>
</module>
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index 80ea9e5..e2badfc 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -6,6 +6,7 @@ embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
+embeddedagent.socket-binding=Determines the binding address and port the agent listens to for incoming server messages.
embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
embeddedagent.rhq.agent.disable-native-system=The RHQ Agent has a native system on certain supported platforms to help the \n\
plugin container perform discovery of native components on those platforms. \n\
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index b9a3689..d587e23 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -17,6 +17,7 @@
<xs:element name="rhq.agent.server.bind-address" type="xs:string" use="optional"/>
<xs:element name="rhq.agent.server.transport-params" type="xs:string" />
<xs:element name="rhq.agent.server.alias" type="xs:string" use="optional"/>
+ <xs:element name="socket-binding" type="xs:string"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index 0a8758f..0f3a8fa 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -198,6 +198,7 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
List<Property> attributes = content.get("attributes").asPropertyList();
List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, //
AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, //
AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, //
AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, //
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index e8641f1..09da3f6 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -7,6 +7,8 @@
<rhq.agent.server.transport-params>test-transport-params</rhq.agent.server.transport-params>
<!-- <rhq.agent.server.alias>test-alias</rhq.agent.server.alias> -->
+ <socket-binding>embeddedagent</socket-binding>
+
<plugins>
<plugin name="platform" enabled="true" />
<plugin name="blah" enabled="false" />
commit b32406efb7d8a77de7eca42eb506b1e25347825f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 31 11:58:00 2014 -0500
add more embedded agent config settings - server endpoint details and the ability to disable native system (sigar)
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 4867ef7..c2cc801 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -5,6 +5,7 @@ import java.util.List;
import java.util.Map;
import org.jboss.as.controller.AbstractAddStepHandler;
+import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.ServiceVerificationHandler;
@@ -17,8 +18,6 @@ import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceController.Mode;
import org.jboss.msc.service.ServiceName;
-import org.rhq.enterprise.agent.AgentConfigurationConstants;
-
/**
* Handler responsible for adding the subsystem resource to the model
*/
@@ -35,7 +34,13 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.validateAndSet(operation, model);
- AgentSubsystemDefinition.PREF_AGENT_NAME_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.AGENT_NAME_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.DISABLE_NATIVE_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_TRANSPORT_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_BIND_PORT_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_BIND_ADDRESS_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF.validateAndSet(operation, model);
log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@@ -68,11 +73,13 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
// set up our runtime configuration overrides that should be used instead of the out-of-box config
Map<String, String> overrides = new HashMap<String, String>();
- ModelNode agentNameNode = AgentSubsystemDefinition.PREF_AGENT_NAME_ATTRIBDEF.resolveModelAttribute(context,
- model);
- if (agentNameNode.isDefined()) {
- overrides.put(AgentConfigurationConstants.NAME, agentNameNode.asString());
- }
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_NAME_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.DISABLE_NATIVE_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_TRANSPORT_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_BIND_PORT_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_BIND_ADDRESS_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF);
// create our service
AgentService service = new AgentService();
@@ -90,4 +97,13 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
newControllers.add(controller);
return;
}
+
+ private void addOverrideProperty(OperationContext context, ModelNode model, Map<String, String> overrides,
+ AttributeDefinition attribDef)
+ throws OperationFailedException {
+ ModelNode node = attribDef.resolveModelAttribute(context, model);
+ if (node.isDefined()) {
+ overrides.put(attribDef.getName(), node.asString());
+ }
+ }
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index 0dffb92..dec1a26 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -2,6 +2,7 @@ package org.rhq.embeddedagent.extension;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIBE;
+import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
@@ -14,6 +15,8 @@ import org.jboss.as.controller.registry.OperationEntry;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
+
public class AgentSubsystemDefinition extends SimpleResourceDefinition {
public static final AgentSubsystemDefinition INSTANCE = new AgentSubsystemDefinition();
@@ -23,12 +26,48 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
.setXmlName(AgentSubsystemExtension.AGENT_ENABLED).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setDefaultValue(new ModelNode(AgentSubsystemExtension.AGENT_ENABLED_DEFAULT)).setAllowNull(false).build();
- protected static final SimpleAttributeDefinition PREF_AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
+
+ protected static final SimpleAttributeDefinition AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_AGENT_NAME, ModelType.STRING).setAllowExpression(true)
.setXmlName(AgentSubsystemExtension.ATTRIB_AGENT_NAME).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setAllowNull(true).build();
- protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
+ protected static final SimpleAttributeDefinition DISABLE_NATIVE_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE, ModelType.BOOLEAN).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
+
+ protected static final SimpleAttributeDefinition SERVER_TRANSPORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT)).setAllowNull(false)
+ .build();
+
+ protected static final SimpleAttributeDefinition SERVER_BIND_PORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_BIND_PORT)).setAllowNull(false)
+ .build();
+
+ protected static final SimpleAttributeDefinition SERVER_BIND_ADDRESS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
+
+ protected static final SimpleAttributeDefinition SERVER_TRANSPORT_PARAMS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT_PARAMS))
+ .setAllowNull(false).build();
+
+ protected static final SimpleAttributeDefinition SERVER_ALIAS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_ALIAS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_ALIAS)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
private AgentSubsystemDefinition() {
super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
@@ -39,8 +78,17 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
public void registerAttributes(ManagementResourceRegistration rr) {
rr.registerReadWriteAttribute(AGENT_ENABLED_ATTRIBDEF, null, AgentEnabledAttributeHandler.INSTANCE);
rr.registerReadWriteAttribute(PLUGINS_ATTRIBDEF, null, PluginsAttributeHandler.INSTANCE);
- rr.registerReadWriteAttribute(PREF_AGENT_NAME_ATTRIBDEF, null, new ReloadRequiredWriteAttributeHandler(
- PREF_AGENT_NAME_ATTRIBDEF));
+ registerReloadRequiredWriteAttributeHandler(rr, AGENT_NAME_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, DISABLE_NATIVE_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_BIND_PORT_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_BIND_ADDRESS_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_ALIAS_ATTRIBDEF);
+ }
+
+ private void registerReloadRequiredWriteAttributeHandler(ManagementResourceRegistration rr, AttributeDefinition def) {
+ rr.registerReadWriteAttribute(def, null, new ReloadRequiredWriteAttributeHandler(def));
}
@Override
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 37ec585..a74bafb 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -56,9 +56,17 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_STATUS_OP = "status";
protected static final String ATTRIB_AGENT_NAME = AgentConfigurationConstants.NAME;
+ protected static final String ATTRIB_DISABLE_NATIVE = AgentConfigurationConstants.DISABLE_NATIVE_SYSTEM;
+ protected static final String ATTRIB_SERVER_TRANSPORT = AgentConfigurationConstants.SERVER_TRANSPORT;
+ protected static final String ATTRIB_SERVER_BIND_PORT = AgentConfigurationConstants.SERVER_BIND_PORT;
+ protected static final String ATTRIB_SERVER_BIND_ADDRESS = AgentConfigurationConstants.SERVER_BIND_ADDRESS;
+ protected static final String ATTRIB_SERVER_TRANSPORT_PARAMS = AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS;
+ protected static final String ATTRIB_SERVER_ALIAS = AgentConfigurationConstants.SERVER_ALIAS;
protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
+
+
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
String prefix = SUBSYSTEM_NAME + (keyPrefix == null ? "" : "." + keyPrefix);
return new StandardResourceDescriptionResolver(prefix, RESOURCE_NAME,
@@ -113,6 +121,18 @@ public class AgentSubsystemExtension implements Extension {
}
} else if (elementName.equals(ATTRIB_AGENT_NAME)) {
opAdd.get(ATTRIB_AGENT_NAME).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_DISABLE_NATIVE)) {
+ opAdd.get(ATTRIB_DISABLE_NATIVE).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_TRANSPORT)) {
+ opAdd.get(ATTRIB_SERVER_TRANSPORT).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_BIND_PORT)) {
+ opAdd.get(ATTRIB_SERVER_BIND_PORT).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_BIND_ADDRESS)) {
+ opAdd.get(ATTRIB_SERVER_BIND_ADDRESS).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_TRANSPORT_PARAMS)) {
+ opAdd.get(ATTRIB_SERVER_TRANSPORT_PARAMS).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_ALIAS)) {
+ opAdd.get(ATTRIB_SERVER_ALIAS).set(reader.getElementText());
} else {
throw ParseUtils.unexpectedElement(reader);
}
@@ -160,9 +180,14 @@ public class AgentSubsystemExtension implements Extension {
writer.writeAttribute(AGENT_ENABLED,
String.valueOf(node.get(AGENT_ENABLED).asBoolean(AGENT_ENABLED_DEFAULT)));
- writer.writeStartElement(ATTRIB_AGENT_NAME);
- writer.writeCharacters(node.get(ATTRIB_AGENT_NAME).asString());
- writer.writeEndElement();
+ // our config elements
+ writeElement(writer, node, ATTRIB_AGENT_NAME);
+ writeElement(writer, node, ATTRIB_DISABLE_NATIVE);
+ writeElement(writer, node, ATTRIB_SERVER_TRANSPORT);
+ writeElement(writer, node, ATTRIB_SERVER_BIND_PORT);
+ writeElement(writer, node, ATTRIB_SERVER_BIND_ADDRESS);
+ writeElement(writer, node, ATTRIB_SERVER_TRANSPORT_PARAMS);
+ writeElement(writer, node, ATTRIB_SERVER_ALIAS);
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
@@ -182,5 +207,15 @@ public class AgentSubsystemExtension implements Extension {
// </subsystem>
writer.writeEndElement();
}
+
+ private void writeElement(final XMLExtendedStreamWriter writer, ModelNode node, String attribName)
+ throws XMLStreamException {
+ ModelNode attribNode = node.get(attribName);
+ if (attribNode.isDefined()) {
+ writer.writeStartElement(attribName);
+ writer.writeCharacters(attribNode.asString());
+ writer.writeEndElement();
+ }
+ }
}
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index 05bcfce..80ea9e5 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -6,4 +6,17 @@ embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
-embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
\ No newline at end of file
+embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
+embeddedagent.rhq.agent.disable-native-system=The RHQ Agent has a native system on certain supported platforms to help the \n\
+plugin container perform discovery of native components on those platforms. \n\
+If the native libraries are causing errors within the agent, \n\
+you can disable this native system by setting this to true.
+embeddedagent.rhq.agent.server.transport=The communication transport used to send messages to the RHQ Server
+embeddedagent.rhq.agent.server.bind-port=The port the RHQ Server is listening to for messages
+embeddedagent.rhq.agent.server.bind-address=The address the RHQ Server is listening to for messages. \n\
+If not defined, the RHQ Agent will default to the DNS \n\
+alias (see rhq.agent.server.alias), and if that is not defined \n\
+the RHQ Agent will default to localhost or 127.0.0.1.
+embeddedagent.rhq.agent.server.transport-params=Communications transport parameters used when sending messages to the RHQ Server.
+embeddedagent.rhq.agent.server.alias=If the server address is not defined, this is the DNS alias name the \n\
+RHQ Agent will resolve and use for the server address.
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index 3e0c546..b9a3689 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -11,6 +11,12 @@
<xs:attribute name="enabled" type="xs:boolean" use="required" default="false"/>
<xs:all>
<xs:element name="rhq.agent.name" type="xs:string"/>
+ <xs:element name="rhq.agent.disable-native-system" type="xs:boolean" use="optional"/>
+ <xs:element name="rhq.agent.server.transport" type="xs:string"/>
+ <xs:element name="rhq.agent.server.bind-port" type="xs:integer"/>
+ <xs:element name="rhq.agent.server.bind-address" type="xs:string" use="optional"/>
+ <xs:element name="rhq.agent.server.transport-params" type="xs:string" />
+ <xs:element name="rhq.agent.server.alias" type="xs:string" use="optional"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index e857af4..0a8758f 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -196,12 +196,18 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
// check the attributes
Assert.assertTrue(content.get("attributes").isDefined());
List<Property> attributes = content.get("attributes").asPropertyList();
- Assert.assertEquals(attributes.size(), 3);
List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, //
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, //
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, //
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS, //
+ AgentSubsystemExtension.ATTRIB_SERVER_ALIAS, //
+ AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE, //
+ AgentSubsystemExtension.ATTRIB_AGENT_NAME, //
AgentSubsystemExtension.AGENT_ENABLED, //
- AgentSubsystemExtension.PLUGINS_ELEMENT, //
- AgentSubsystemExtension.ATTRIB_AGENT_NAME);
+ AgentSubsystemExtension.PLUGINS_ELEMENT);
+ Assert.assertEquals(attributes.size(), expectedAttributes.size());
for (int i = 0 ; i < attributes.size(); i++) {
String attrib = attributes.get(i).getName();
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index 8d60c99..e8641f1 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -1,5 +1,12 @@
<subsystem xmlns="urn:org.rhq:embeddedagent:1.0" enabled="true">
<rhq.agent.name>embeddedagent-test</rhq.agent.name>
+ <!-- <rhq.agent.disable-native-system>true</rhq.agent.disable-native-system> -->
+ <rhq.agent.server.transport>test-transport</rhq.agent.server.transport>
+ <rhq.agent.server.bind-port>12345</rhq.agent.server.bind-port>
+ <!-- <rhq.agent.server.bind-address>test-bind-address</rhq.agent.server.bind-address> -->
+ <rhq.agent.server.transport-params>test-transport-params</rhq.agent.server.transport-params>
+ <!-- <rhq.agent.server.alias>test-alias</rhq.agent.server.alias> -->
+
<plugins>
<plugin name="platform" enabled="true" />
<plugin name="blah" enabled="false" />
commit 8620d3dcb4e81c37dba84d97be0a779686b8d2d1
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 31 01:08:04 2014 -0500
starting to add config overrides to the extension subsystem - first one is the agent name (we can now set the agent name in the config)
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
index 24c3d2d..7b654fc 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
@@ -38,7 +38,7 @@ public class AgentConfigurationSetup {
* Properties that will be used to override preferences found in the preferences node and the configuration
* preferences file.
*/
- private final Properties configurationOverrides;
+ private final Map<String, String> configurationOverrides;
/**
* If <code>true</code>, will revert the agent's configuration back to the original configuration file.
@@ -57,14 +57,14 @@ public class AgentConfigurationSetup {
private final ServerEnvironment serverEnvironment;
public AgentConfigurationSetup(Resource configFile, boolean resetConfigurationAtStartup,
- Properties configurationOverrides, ServerEnvironment serverEnv) {
+ Map<String, String> overrides, ServerEnvironment serverEnv) {
this.configFile = configFile;
this.resetConfigurationAtStartup = resetConfigurationAtStartup;
this.serverEnvironment = serverEnv;
- this.configurationOverrides = prepareConfigurationOverrides(configurationOverrides);
+ this.configurationOverrides = prepareConfigurationOverrides(overrides);
- String agentName = configurationOverrides.getProperty(AgentConfigurationConstants.NAME, "embeddedagent");
+ String agentName = this.configurationOverrides.get(AgentConfigurationConstants.NAME);
preferencesNodeName = agentName;
System.setProperty("rhq.agent.preferences-node", preferencesNodeName);
}
@@ -73,13 +73,12 @@ public class AgentConfigurationSetup {
return this.preferencesNodeName;
}
- private Properties prepareConfigurationOverrides(Properties overrides) {
+ private Map<String, String> prepareConfigurationOverrides(Map<String, String> overrides) {
// perform some checking to setup defaults if need be
- String agentName = overrides.getProperty(AgentConfigurationConstants.NAME, "");
- if (agentName.trim().length() == 0 || "-".equals(agentName)) {
+ String agentName = overrides.get(AgentConfigurationConstants.NAME);
+ if (agentName == null || agentName.trim().length() == 0 || "-".equals(agentName)) {
agentName = "embeddedagent-" + serverEnvironment.getNodeName();
}
-
agentName = StringPropertyReplacer.replaceProperties(agentName);
overrides.put(AgentConfigurationConstants.NAME, agentName);
@@ -201,11 +200,11 @@ public class AgentConfigurationSetup {
}
// now that the configuration preferences are loaded, we need to override them with any bootstrap override properties
- Properties overrides = configurationOverrides;
+ Map<String, String> overrides = configurationOverrides;
if (overrides != null) {
- for (Map.Entry<Object, Object> entry : overrides.entrySet()) {
- String key = entry.getKey().toString();
- String value = entry.getValue().toString();
+ for (Map.Entry<String, String> entry : overrides.entrySet()) {
+ String key = entry.getKey();
+ String value = entry.getValue();
// allow ${var} notation in the values so we can provide variable replacements in the values
value = StringPropertyReplacer.replaceProperties(value);
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 64d11fd..018519d 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -4,7 +4,6 @@ import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import java.util.Properties;
import java.util.concurrent.atomic.AtomicReference;
import org.jboss.as.server.ServerEnvironment;
@@ -44,6 +43,12 @@ public class AgentService implements Service<AgentService> {
private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
/**
+ * Configuration settings that override the out-of-box configuration file. These are settings
+ * that the user set in the subsystem (e.g. standalone.xml or via AS CLI).
+ */
+ private Map<String, String> configOverrides = Collections.synchronizedMap(new HashMap<String, String>());
+
+ /**
* This is the actual embedded agent. This is what handles the plugin container lifecycle
* and communication to/from the server.
*/
@@ -103,6 +108,15 @@ public class AgentService implements Service<AgentService> {
log.info("New plugin definitions: " + pluginsWithEnableFlag);
}
+ protected void setConfigurationOverrides(Map<String, String> overrides) {
+ synchronized (configOverrides) {
+ configOverrides.clear();
+ if (overrides != null) {
+ configOverrides.putAll(overrides);
+ }
+ }
+ }
+
protected boolean isAgentStarted() {
AgentMain agent = theAgent.get();
return (agent != null && agent.isStarted());
@@ -118,10 +132,9 @@ public class AgentService implements Service<AgentService> {
try {
// make sure we pre-configure the agent with some settings taken from our runtime environment
ServerEnvironment env = envServiceValue.getValue();
- Properties overrides = new Properties();
boolean resetConfigurationAtStartup = true;
AgentConfigurationSetup configSetup = new AgentConfigurationSetup(
- getExportedResource("conf/agent-configuration.xml"), resetConfigurationAtStartup, overrides, env);
+ getExportedResource("conf/agent-configuration.xml"), resetConfigurationAtStartup, configOverrides, env);
// prepare the agent logging first thing so the agent logs messages using this config
configSetup.prepareLogConfigFile(getExportedResource("conf/log4j.xml"));
configSetup.preConfigureAgent();
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index f9d3291..4867ef7 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -2,6 +2,7 @@ package org.rhq.embeddedagent.extension;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.jboss.as.controller.AbstractAddStepHandler;
import org.jboss.as.controller.OperationContext;
@@ -16,6 +17,8 @@ import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceController.Mode;
import org.jboss.msc.service.ServiceName;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
+
/**
* Handler responsible for adding the subsystem resource to the model
*/
@@ -32,6 +35,7 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.PREF_AGENT_NAME_ATTRIBDEF.validateAndSet(operation, model);
log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@@ -49,6 +53,8 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
}
log.info("Embedded agent is enabled and will be deployed");
+
+ // figure out what plugins we are to support
HashMap<String, Boolean> pluginsWithEnableFlag = new HashMap<String, Boolean>();
ModelNode pluginsNode = AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.resolveModelAttribute(context, model);
if (pluginsNode != null && pluginsNode.isDefined()) {
@@ -60,9 +66,20 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
}
}
+ // set up our runtime configuration overrides that should be used instead of the out-of-box config
+ Map<String, String> overrides = new HashMap<String, String>();
+ ModelNode agentNameNode = AgentSubsystemDefinition.PREF_AGENT_NAME_ATTRIBDEF.resolveModelAttribute(context,
+ model);
+ if (agentNameNode.isDefined()) {
+ overrides.put(AgentConfigurationConstants.NAME, agentNameNode.asString());
+ }
+
+ // create our service
AgentService service = new AgentService();
service.setPlugins(pluginsWithEnableFlag);
+ service.setConfigurationOverrides(overrides);
+ // install the service
ServiceName name = AgentService.SERVICE_NAME;
ServiceController<AgentService> controller = context.getServiceTarget() //
.addService(name, service) //
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index e43c6c5..0dffb92 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -2,6 +2,7 @@ package org.rhq.embeddedagent.extension;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIBE;
+import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.SimpleResourceDefinition;
@@ -22,6 +23,11 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
.setXmlName(AgentSubsystemExtension.AGENT_ENABLED).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setDefaultValue(new ModelNode(AgentSubsystemExtension.AGENT_ENABLED_DEFAULT)).setAllowNull(false).build();
+ protected static final SimpleAttributeDefinition PREF_AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_AGENT_NAME, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_AGENT_NAME).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setAllowNull(true).build();
+
protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
private AgentSubsystemDefinition() {
@@ -33,6 +39,8 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
public void registerAttributes(ManagementResourceRegistration rr) {
rr.registerReadWriteAttribute(AGENT_ENABLED_ATTRIBDEF, null, AgentEnabledAttributeHandler.INSTANCE);
rr.registerReadWriteAttribute(PLUGINS_ATTRIBDEF, null, PluginsAttributeHandler.INSTANCE);
+ rr.registerReadWriteAttribute(PREF_AGENT_NAME_ATTRIBDEF, null, new ReloadRequiredWriteAttributeHandler(
+ PREF_AGENT_NAME_ATTRIBDEF));
}
@Override
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 1ab7a7e..37ec585 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -29,6 +29,8 @@ import org.jboss.staxmapper.XMLElementWriter;
import org.jboss.staxmapper.XMLExtendedStreamReader;
import org.jboss.staxmapper.XMLExtendedStreamWriter;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
+
public class AgentSubsystemExtension implements Extension {
private final Logger log = Logger.getLogger(AgentSubsystemExtension.class);
@@ -53,6 +55,8 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_STOP_OP = "stop";
protected static final String AGENT_STATUS_OP = "status";
+ protected static final String ATTRIB_AGENT_NAME = AgentConfigurationConstants.NAME;
+
protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
@@ -97,17 +101,20 @@ public class AgentSubsystemExtension implements Extension {
opAdd.get(AGENT_ENABLED).set(agentEnabledValue);
}
- ModelNode pluginsAttributeNode = opAdd.get(PLUGINS_ELEMENT);
-
// Read the children elements
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
- if (!reader.getLocalName().equals(PLUGINS_ELEMENT)) {
- throw ParseUtils.unexpectedElement(reader);
- }
- while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
- if (reader.isStartElement()) {
- readPlugin(reader, pluginsAttributeNode);
+ String elementName = reader.getLocalName();
+ if (elementName.equals(PLUGINS_ELEMENT)) {
+ ModelNode pluginsAttributeNode = opAdd.get(PLUGINS_ELEMENT);
+ while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
+ if (reader.isStartElement()) {
+ readPlugin(reader, pluginsAttributeNode);
+ }
}
+ } else if (elementName.equals(ATTRIB_AGENT_NAME)) {
+ opAdd.get(ATTRIB_AGENT_NAME).set(reader.getElementText());
+ } else {
+ throw ParseUtils.unexpectedElement(reader);
}
}
@@ -153,6 +160,10 @@ public class AgentSubsystemExtension implements Extension {
writer.writeAttribute(AGENT_ENABLED,
String.valueOf(node.get(AGENT_ENABLED).asBoolean(AGENT_ENABLED_DEFAULT)));
+ writer.writeStartElement(ATTRIB_AGENT_NAME);
+ writer.writeCharacters(node.get(ATTRIB_AGENT_NAME).asString());
+ writer.writeEndElement();
+
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
ModelNode plugins = node.get(PLUGINS_ELEMENT);
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index 790232a..05bcfce 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -5,4 +5,5 @@ embeddedagent.restart=Starts the RHQ Agent. If it is already started, it will be
embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
-embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
\ No newline at end of file
+embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
+embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index 2882729..3e0c546 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -10,6 +10,7 @@
<xs:complexType name="subsystemType">
<xs:attribute name="enabled" type="xs:boolean" use="required" default="false"/>
<xs:all>
+ <xs:element name="rhq.agent.name" type="xs:string"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index b33fb4f..e857af4 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -14,6 +14,7 @@ import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VAL
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import org.testng.Assert;
@@ -132,31 +133,24 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
* operations from its describe action results in the same model
*/
public void testDescribeHandler() throws Exception {
- // test two subsystem xmls - one that is empty of plugins, and the second is our normal test xml
- String subsystemXml1 = "<subsystem xmlns=\"" + AgentSubsystemExtension.NAMESPACE + "\" "
- + AgentSubsystemExtension.AGENT_ENABLED + "=\"true\"" + "></subsystem>";
- String subsystemXml2 = getSubsystemXml();
-
- String[] subsystemXmlAll = new String[] { subsystemXml1, subsystemXml2 };
- for (String subsystemXml : subsystemXmlAll) {
- KernelServices servicesA = super.installInController(subsystemXml);
- // Get the model and the describe operations from the first controller
- ModelNode modelA = servicesA.readWholeModel();
- ModelNode describeOp = new ModelNode();
- describeOp.get(OP).set(DESCRIBE);
- describeOp.get(OP_ADDR).set(
- PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME))
- .toModelNode());
- ModelNode executeOperation = servicesA.executeOperation(describeOp);
- List<ModelNode> operations = super.checkResultAndGetContents(executeOperation).asList();
-
- // Install the describe options from the first controller into a second controller
- KernelServices servicesB = super.installInController(operations);
- ModelNode modelB = servicesB.readWholeModel();
-
- // Make sure the models from the two controllers are identical
- super.compare(modelA, modelB);
- }
+ String subsystemXml = getSubsystemXml();
+ KernelServices servicesA = super.installInController(subsystemXml);
+ // Get the model and the describe operations from the first controller
+ ModelNode modelA = servicesA.readWholeModel();
+ ModelNode describeOp = new ModelNode();
+ describeOp.get(OP).set(DESCRIBE);
+ describeOp.get(OP_ADDR).set(
+ PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME))
+ .toModelNode());
+ ModelNode executeOperation = servicesA.executeOperation(describeOp);
+ List<ModelNode> operations = super.checkResultAndGetContents(executeOperation).asList();
+
+ // Install the describe options from the first controller into a second controller
+ KernelServices servicesB = super.installInController(operations);
+ ModelNode modelB = servicesB.readWholeModel();
+
+ // Make sure the models from the two controllers are identical
+ super.compare(modelA, modelB);
}
/**
@@ -202,9 +196,17 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
// check the attributes
Assert.assertTrue(content.get("attributes").isDefined());
List<Property> attributes = content.get("attributes").asPropertyList();
- Assert.assertEquals(attributes.size(), 2);
- Assert.assertEquals(attributes.get(0).getName(), AgentSubsystemExtension.AGENT_ENABLED);
- Assert.assertEquals(attributes.get(1).getName(), AgentSubsystemExtension.PLUGINS_ELEMENT);
+ Assert.assertEquals(attributes.size(), 3);
+
+ List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.AGENT_ENABLED, //
+ AgentSubsystemExtension.PLUGINS_ELEMENT, //
+ AgentSubsystemExtension.ATTRIB_AGENT_NAME);
+
+ for (int i = 0 ; i < attributes.size(); i++) {
+ String attrib = attributes.get(i).getName();
+ Assert.assertTrue(expectedAttributes.contains(attrib), "missing attrib: " + attrib);
+ }
// check the operations
Assert.assertTrue(content.get("operations").isDefined());
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index 4e4a85d..8d60c99 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -1,4 +1,5 @@
<subsystem xmlns="urn:org.rhq:embeddedagent:1.0" enabled="true">
+ <rhq.agent.name>embeddedagent-test</rhq.agent.name>
<plugins>
<plugin name="platform" enabled="true" />
<plugin name="blah" enabled="false" />
commit 6bedbd7ba9e001deb5c57e9484995893a63b01e2
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 31 01:06:00 2014 -0500
add source to eclipse classpath
diff --git a/.classpath b/.classpath
index cb9f5bc..455f739 100644
--- a/.classpath
+++ b/.classpath
@@ -329,13 +329,13 @@
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/msc/jboss-msc/1.0.2.GA/jboss-msc-1.0.2.GA.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/jboss-dmr/1.1.1.Final/jboss-dmr-1.1.1.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-naming/7.2.0.Alpha1-redhat-4/jboss-as-naming-7.2.0.Alpha1-redhat-4.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-server/7.2.0.Alpha1-redhat-4/jboss-as-server-7.2.0.Alpha1-redhat-4.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-server/7.2.0.Alpha1-redhat-4/jboss-as-server-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-server/7.2.0.Alpha1-redhat-4/jboss-as-server-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-ee/7.2.0.Alpha1-redhat-4/jboss-as-ee-7.2.0.Alpha1-redhat-4.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-ejb3/7.2.0.Alpha1-redhat-4/jboss-as-ejb3-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-ejb3/7.2.0.Alpha1-redhat-4/jboss-as-ejb3-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/staxmapper/1.1.0.Final/staxmapper-1.1.0.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/modules/jboss-modules/1.1.1.GA/jboss-modules-1.1.1.GA.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-subsystem-test/7.1.1.Final/jboss-as-subsystem-test-7.1.1.Final.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller/7.1.1.Final/jboss-as-controller-7.1.1.Final.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller/7.1.1.Final/jboss-as-controller-7.1.1.Final.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-controller/7.2.0.Alpha1-redhat-4/jboss-as-controller-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller-client/7.1.1.Final/jboss-as-controller-client-7.1.1.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-links/2.3.5.Final/resteasy-links-2.3.5.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-jaxrs/2.3.5.Final/resteasy-jaxrs-2.3.5.Final.jar"/>
commit cbe0f94aa7679fea8e8acf22afb23f05074a0c97
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 23:13:16 2014 -0500
trivial - reformat
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
index a815600..59419c1 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
@@ -8,28 +8,26 @@ import org.jboss.logging.Logger;
class AgentEnabledAttributeHandler extends AbstractWriteAttributeHandler<Void> {
- public static final AgentEnabledAttributeHandler INSTANCE = new AgentEnabledAttributeHandler();
+ public static final AgentEnabledAttributeHandler INSTANCE = new AgentEnabledAttributeHandler();
private final Logger log = Logger.getLogger(AgentEnabledAttributeHandler.class);
- private AgentEnabledAttributeHandler() {
- super(AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF);
+ private AgentEnabledAttributeHandler() {
+ super(AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF);
}
- @Override
- protected boolean applyUpdateToRuntime(OperationContext context,
- ModelNode operation, String attributeName, ModelNode resolvedValue,
- ModelNode currentValue, HandbackHolder<Void> handbackHolder)
- throws OperationFailedException {
+ @Override
+ protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
+ ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder)
+ throws OperationFailedException {
log.info("Embedded agent enabled attribute changed: " + attributeName + "=" + resolvedValue);
// there is nothing for us to do - this only affects us when we are restarted, return true to say we must reload
return true;
}
- @Override
- protected void revertUpdateToRuntime(OperationContext context,
- ModelNode operation, String attributeName,
- ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
+ @Override
+ protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
+ ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
// no-op
}
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
index 1d51294..078bf17 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
@@ -13,15 +13,15 @@ import org.jboss.msc.service.ServiceNotFoundException;
class PluginsAttributeHandler extends AbstractWriteAttributeHandler<Void> {
- public static final PluginsAttributeHandler INSTANCE = new PluginsAttributeHandler();
+ public static final PluginsAttributeHandler INSTANCE = new PluginsAttributeHandler();
private final Logger log = Logger.getLogger(PluginsAttributeHandler.class);
- private PluginsAttributeHandler() {
+ private PluginsAttributeHandler() {
super(AgentSubsystemDefinition.PLUGINS_ATTRIBDEF);
}
- @Override
+ @Override
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder)
throws OperationFailedException {
commit 1a34858e39f0d069d364e7a48f53d8294635be0c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 23:12:44 2014 -0500
dont lose security token on embedded agent restart
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
index 187527b..24c3d2d 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
@@ -234,8 +234,11 @@ public class AgentConfigurationSetup {
// store is the default value.
// But first we need to backup these original preferences in case the config file fails to load -
// we'll restore the original values in that case.
+ // Note that we squirrel away any security token we already have - we need to preserve this when we can
+ // because otherwise the agent will not be able to re-register with any previous name is was registered with.
Preferences prefNode = getPreferencesNode();
+ String securityToken = prefNode.get(AgentConfigurationConstants.AGENT_SECURITY_TOKEN, null);
ByteArrayOutputStream backup = new ByteArrayOutputStream();
prefNode.exportSubtree(backup);
prefNode.clear();
@@ -249,9 +252,25 @@ public class AgentConfigurationSetup {
ByteArrayInputStream newConfigInputStream = new ByteArrayInputStream(newConfig.getBytes());
Preferences.importPreferences(newConfigInputStream);
- if (new AgentConfiguration(prefNode).getAgentConfigurationVersion() == 0) {
+ AgentConfiguration newAgentConfig = new AgentConfiguration(prefNode);
+ if (newAgentConfig.getAgentConfigurationVersion() == 0) {
throw new IllegalArgumentException("Bad preferences node");
}
+
+ // If we had a security token, restore it so we can maintain our known registration with the server.
+ // Note that if the configuration file already had a security token defined, it will be used and the old
+ // token we had will be thrown away.
+ if (securityToken != null) {
+ if (newAgentConfig.getAgentSecurityToken() == null) {
+ log.debug("Restoring embedded agent security token");
+ newAgentConfig.setAgentSecurityToken(securityToken);
+ } else {
+ log.debug("Not restoring embedded agent security token, the config file was preconfigured with one");
+ }
+ }
+
+ prefNode.flush();
+
} catch (Exception e) {
// a problem occurred importing the config file; let's restore our original values
try {
commit c4a4b0b9ef3ba69a5102e3f8429ecb5cb545382e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 18:38:55 2014 -0500
embedded agent needs to add a dep on JAXB module as a substitute to the standalone agent's endorsed libs
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index c818032..56419c3 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -34,7 +34,7 @@
<resource-root path="rhq-agent/lib/sigar-${sigar.version}.jar" />
<resource-root path="rhq-agent/lib/trove4j-3.0.3.jar" />
</resources>
-
+
<dependencies>
<!-- modules required by any subsystem -->
<module name="javax.api"/>
@@ -45,5 +45,8 @@
<module name="org.jboss.msc"/>
<module name="org.jboss.logging"/>
<module name="org.jboss.vfs"/>
+
+ <!-- the standalone agent had this in its endorsed dir, but the embedded agent adds it as a dependency -->
+ <module name="javax.xml.bind.api"/>
</dependencies>
</module>
commit 39064eb75ca0a34a516bee75fde85260663ca429
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 17:37:16 2014 -0500
start the embedded agent in a separate thread so as not to hang the subsystem startup
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index f4644e1..64d11fd 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -5,7 +5,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
import org.jboss.as.server.ServerEnvironment;
import org.jboss.logging.Logger;
@@ -30,6 +30,7 @@ public class AgentService implements Service<AgentService> {
/**
* Our subsystem add-step handler will inject this as a dependency for us.
* This service gives us information about the server, like the install directory, data directory, etc.
+ * Package-scoped so the add-step handler can access this.
*/
InjectedValue<ServerEnvironment> envServiceValue = new InjectedValue<ServerEnvironment>();
@@ -43,20 +44,15 @@ public class AgentService implements Service<AgentService> {
private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
/**
- * Provides a mechanism to pre-configure the agent.
- */
- private AgentConfigurationSetup configSetup;
-
- /**
* This is the actual embedded agent. This is what handles the plugin container lifecycle
* and communication to/from the server.
*/
- private AgentMain theAgent;
+ private AtomicReference<AgentMain> theAgent = new AtomicReference<AgentMain>();
/**
- * Provides the status flag of the embedded agent itself (not of this service).
+ * This is the daemon thread running the agent.
*/
- private AtomicBoolean agentStarted = new AtomicBoolean(false);
+ private Thread agentThread;
public AgentService() {
}
@@ -108,7 +104,8 @@ public class AgentService implements Service<AgentService> {
}
protected boolean isAgentStarted() {
- return agentStarted.get();
+ AgentMain agent = theAgent.get();
+ return (agent != null && agent.isStarted());
}
protected void startAgent() throws StartException {
@@ -135,23 +132,41 @@ public class AgentService implements Service<AgentService> {
args[1] = "--pref=" + configSetup.getPreferencesNodeName();
args[2] = "--output=" + new File(env.getServerLogDir(), "embedded-agent.out").getAbsolutePath();
- theAgent = new AgentMain(args);
- theAgent.start();
-
- agentStarted.set(true);
+ theAgent.set(new AgentMain(args));
+
+ agentThread = new Thread("Embedded Agent Start Thread") {
+ public void run() {
+ try {
+ theAgent.get().start();
+ } catch (InterruptedException e) {
+ // agent just exited due to being shutdown, die quietly
+ log.debug("Embedded agent has exited.");
+ } catch (Throwable t) {
+ log.error("Embedded agent aborted with exception.", t);
+ }
+ };
+ };
+ agentThread.setDaemon(true);
+ agentThread.start();
} catch (Exception e) {
throw new StartException(e);
}
}
protected void stopAgent() {
- if (!isAgentStarted()) {
- log.info("Embedded agent is already stopped.");
- return;
+ try {
+ if (!isAgentStarted()) {
+ log.info("Embedded agent is already stopped.");
+ } else {
+ log.info("Stopping the embedded agent now");
+ theAgent.get().shutdown();
+ }
+ } finally {
+ if (agentThread != null) {
+ agentThread.interrupt();
+ }
}
-
- log.info("Stopping the embedded agent now");
- agentStarted.set(false);
+ theAgent.set(null);
}
/**
commit 2c74b334468dc74151117b5677db99db2bc43786
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 14:05:38 2014 -0500
1) preconfigure the agent prior to starting it
2) get log4j.xml to work but yet not put log files under bin/
3) don't need to put module.xml in the extension jar, just needs to be in module
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
index c6118a6..0196223 100644
--- a/modules/enterprise/server/embeddedagent/pom.xml
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -26,6 +26,10 @@
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
+ <excludes>
+ <!-- this doesn't need to be in the jar, just in our module .zip -->
+ <exclude>module/main/module.xml</exclude>
+ </excludes>
</resource>
</resources>
@@ -89,16 +93,28 @@
<copy tofile="${module.lib}/macosx-x86_64/libsigar.dylib" file="${agent.lib}/libsigar-universal64-macosx.dylib" preservelastmodified="true"/>
<echo>Adjust default configuration</echo>
- <property name="config.xml" location="${project.build.directory}/rhq-agent/conf/agent-configuration.xml"/>
+ <property name="agent.config.dir" location="${project.build.directory}/rhq-agent/conf"/>
+ <property name="agent.config.xml" location="${agent.config.dir}/agent-configuration.xml"/>
<!-- because we are embedded, as can't have a prompt and ask user, so we will ensure the agent is always fully setup -->
- <replaceregexp file="${config.xml}" flags="s"
+ <replaceregexp file="${agent.config.xml}" flags="s"
match='<!--(\s*)<entry key="rhq.agent.configuration-setup-flag" value="false" />(\s*)-->'
- replace='<entry key="rhq.agent.configuration-setup-flag" value="true" /> BOOO' />
+ replace='<entry key="rhq.agent.configuration-setup-flag" value="true" />' />
<!-- we don't support agent auto-update while the agent is embedded -->
- <replaceregexp file="${config.xml}"
+ <replaceregexp file="${agent.config.xml}"
match='<entry key="rhq.agent.agent-update.enabled" value="true" />'
- replace='<entry key="rhq.agent.agent-update.enabled" value="false" /> BOOO' />
-
+ replace='<entry key="rhq.agent.agent-update.enabled" value="false" />' />
+ <!-- because we don't want log4j writing files in places we don't want, don't use file appenders. -->
+ <!-- our WildFly/EAP subsystem extension will turn this back on at runtime after log4j is properly configured. -->
+ <replaceregexp file="${agent.config.dir}/log4j.xml" flags="g"
+ match='<appender-ref ref="FILE".*/>'
+ replace='<!-- <appender-ref ref="FILE"/> -->' />
+ <replaceregexp file="${agent.config.dir}/log4j.xml" flags="g"
+ match='<appender-ref ref="COMMANDTRACE".*/>'
+ replace='<!-- <appender-ref ref="COMMANDTRACE"/> -->' />
+ <jar destfile="${agent.lib}/rhq-enterprise-agent-${project.version}.jar"
+ basedir="${agent.config.dir}"
+ includes="log4j.xml"
+ update="true" />
</target>
</configuration>
<goals>
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
new file mode 100644
index 0000000..187527b
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
@@ -0,0 +1,305 @@
+package org.rhq.embeddedagent.extension;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+import java.util.prefs.Preferences;
+
+import org.apache.log4j.LogManager;
+import org.apache.log4j.xml.DOMConfigurator;
+
+import org.jboss.as.server.ServerEnvironment;
+import org.jboss.logging.Logger;
+import org.jboss.modules.Resource;
+import org.jboss.util.StringPropertyReplacer;
+
+import org.rhq.core.util.stream.StreamUtil;
+import org.rhq.enterprise.agent.AgentConfiguration;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
+import org.rhq.enterprise.agent.AgentConfigurationUpgrade;
+import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
+
+public class AgentConfigurationSetup {
+
+ private final Logger log = Logger.getLogger(AgentConfigurationSetup.class);
+
+ private static final String DATA_DIRECTORY_NAME = "embeddedagent";
+
+ /**
+ * The location of the configuration file - can be a file path or path within classloader.
+ */
+ private final Resource configFile;
+
+ /**
+ * Properties that will be used to override preferences found in the preferences node and the configuration
+ * preferences file.
+ */
+ private final Properties configurationOverrides;
+
+ /**
+ * If <code>true</code>, will revert the agent's configuration back to the original configuration file.
+ * Otherwise, the configuration will be that which is currently persisted in the preferences store.
+ */
+ private final boolean resetConfigurationAtStartup;
+
+ /**
+ * The preferences node name that identifies the configuration set used to configure the services.
+ */
+ private final String preferencesNodeName;
+
+ /**
+ * Provides environment information about the server in which we are embedded.
+ */
+ private final ServerEnvironment serverEnvironment;
+
+ public AgentConfigurationSetup(Resource configFile, boolean resetConfigurationAtStartup,
+ Properties configurationOverrides, ServerEnvironment serverEnv) {
+
+ this.configFile = configFile;
+ this.resetConfigurationAtStartup = resetConfigurationAtStartup;
+ this.serverEnvironment = serverEnv;
+ this.configurationOverrides = prepareConfigurationOverrides(configurationOverrides);
+
+ String agentName = configurationOverrides.getProperty(AgentConfigurationConstants.NAME, "embeddedagent");
+ preferencesNodeName = agentName;
+ System.setProperty("rhq.agent.preferences-node", preferencesNodeName);
+ }
+
+ public String getPreferencesNodeName() {
+ return this.preferencesNodeName;
+ }
+
+ private Properties prepareConfigurationOverrides(Properties overrides) {
+ // perform some checking to setup defaults if need be
+ String agentName = overrides.getProperty(AgentConfigurationConstants.NAME, "");
+ if (agentName.trim().length() == 0 || "-".equals(agentName)) {
+ agentName = "embeddedagent-" + serverEnvironment.getNodeName();
+ }
+
+ agentName = StringPropertyReplacer.replaceProperties(agentName);
+ overrides.put(AgentConfigurationConstants.NAME, agentName);
+
+ File dataDir = getAgentDataDirectory();
+ File pluginsDir = new File(serverEnvironment.getServerDataDir(), "embeddedagent-plugins");
+ overrides.put(AgentConfigurationConstants.DATA_DIRECTORY, dataDir.getAbsolutePath());
+ overrides.put(AgentConfigurationConstants.PLUGINS_DIRECTORY, pluginsDir.getAbsolutePath());
+ overrides.put(ServiceContainerConfigurationConstants.DATA_DIRECTORY, dataDir.getAbsolutePath());
+
+ return overrides;
+ }
+
+ private File getAgentDataDirectory() {
+ File dir = new File(serverEnvironment.getServerDataDir(), DATA_DIRECTORY_NAME);
+ dir.mkdirs();
+ return dir;
+ }
+
+ public void preConfigureAgent() throws Exception {
+
+ // we need to store the preferences prior to starting the agent
+ if (resetConfigurationAtStartup) {
+ log.debug("Resetting the embedded agent's configuration back to its original settings");
+ reloadAgentConfiguration();
+ cleanDataDirectory();
+ } else {
+ log.debug("Loading the embedded agent's pre-existing configuration from preferences");
+ prepareConfigurationPreferences();
+ }
+
+ return;
+ }
+
+ /**
+ * Prepares the log config file so it writes the logs to the server's log directory.
+ * This is needed if we call or use any agent class because it wants to use log4j.
+ * This MUST be called prior to using any class that logs via log4j.
+ *
+ * @param logConfigFile the agent's out-of-box log config file
+ * @return the new log config file that the agent should use
+ * @throws Exception
+ */
+ public void prepareLogConfigFile(Resource logConfigFile) throws Exception {
+ try {
+ File logDir = this.serverEnvironment.getServerLogDir();
+ String agentLogFile = new File(logDir, "embedded-agent.log").getAbsolutePath();
+ String cmdTraceLogFile = new File(logDir, "embedded-agent-command-trace.log").getAbsolutePath();
+
+ String logConfig = new String(StreamUtil.slurp(logConfigFile.openStream()));
+ logConfig = logConfig.replace("\"logs/agent.log\"", "\"" + agentLogFile + "\"");
+ logConfig = logConfig.replace("\"logs/command-trace.log\"", "\"" + cmdTraceLogFile + "\"");
+ for (String app : new String[] { "ref=\"FILE\"", "ref=\"COMMANDTRACE\"" }) {
+ logConfig = logConfig.replace("<!-- <appender-ref " + app + "/> -->", "<appender-ref " + app + "/>");
+ }
+
+ File runtimeLogConfigFile = new File(getAgentDataDirectory(), "/log4j.xml");
+ ByteArrayInputStream in = new ByteArrayInputStream(logConfig.getBytes());
+ StreamUtil.copy(in, new FileOutputStream(runtimeLogConfigFile));
+
+ // this hot deploys the log4j.xml into log4j which is what the agent wants to use
+ LogManager.resetConfiguration();
+ DOMConfigurator.configure(runtimeLogConfigFile.toURI().toURL());
+ } catch (Exception e) {
+ log.error("Cannot tell the agent to put its logs in the logs directory - look elsewhere for the log files");
+ }
+ }
+
+ private Properties getAgentConfigurationProperties() {
+ try {
+ Properties properties = new Properties();
+ Preferences prefs = getPreferencesNode();
+
+ for (String key : prefs.keys()) {
+ properties.setProperty(key, prefs.get(key, "?"));
+ }
+
+ return properties;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void reloadAgentConfiguration() throws Exception {
+ getPreferencesNode().clear();
+ prepareConfigurationPreferences();
+ }
+
+ private void cleanDataDirectory() {
+ AgentConfiguration config = new AgentConfiguration(getPreferencesNode());
+ File dataDir = config.getDataDirectory();
+
+ cleanDataFile(dataDir);
+
+ // it is conceivable the comm services data directory was configured in a different
+ // place than where the agent's data directory is - make sure we clean out that other data dir
+ File commDataDir = config.getServiceContainerPreferences().getDataDirectory();
+ if (!commDataDir.getAbsolutePath().equals(dataDir.getAbsolutePath())) {
+ cleanDataFile(commDataDir);
+ }
+
+ return;
+ }
+
+ /**
+ * This will ensure the agent's configuration preferences are populated. If need be, the configuration file is
+ * loaded and all overrides are overlaid on top of the preferences. The preferences are also upgraded to ensure they
+ * conform to the latest configuration schema version.
+ *
+ * @return the agent configuration
+ *
+ * @throws Exception
+ */
+ private AgentConfiguration prepareConfigurationPreferences() throws Exception {
+ Preferences prefNode = getPreferencesNode();
+ AgentConfiguration config = new AgentConfiguration(prefNode);
+
+ if (config.getAgentConfigurationVersion() == 0) {
+ config = loadConfigurationFile();
+ }
+
+ // now that the configuration preferences are loaded, we need to override them with any bootstrap override properties
+ Properties overrides = configurationOverrides;
+ if (overrides != null) {
+ for (Map.Entry<Object, Object> entry : overrides.entrySet()) {
+ String key = entry.getKey().toString();
+ String value = entry.getValue().toString();
+
+ // allow ${var} notation in the values so we can provide variable replacements in the values
+ value = StringPropertyReplacer.replaceProperties(value);
+
+ prefNode.put(key, value);
+ }
+ }
+
+ // let's make sure our configuration is upgraded to the latest schema
+ AgentConfigurationUpgrade.upgradeToLatest(config.getPreferences());
+
+ return config;
+ }
+
+ /**
+ * Loads the configuration file.
+ *
+ * @return the configuration that was loaded
+ *
+ * @throws Exception on failure
+ */
+ private AgentConfiguration loadConfigurationFile() throws Exception {
+ // We need to clear out any previous configuration in case the current config file doesn't specify a preference
+ // that already exists in the preferences node. In this case, the configuration file wants to fall back on the
+ // default value and if we don't clear the preferences, we aren't guaranteed the value stored in the backing
+ // store is the default value.
+ // But first we need to backup these original preferences in case the config file fails to load -
+ // we'll restore the original values in that case.
+
+ Preferences prefNode = getPreferencesNode();
+ ByteArrayOutputStream backup = new ByteArrayOutputStream();
+ prefNode.exportSubtree(backup);
+ prefNode.clear();
+
+ // now load in the preferences
+ try {
+ ByteArrayOutputStream rawConfigFile = new ByteArrayOutputStream();
+ InputStream rawConfigInputStream = configFile.openStream();
+ StreamUtil.copy(rawConfigInputStream, rawConfigFile, true);
+ String newConfig = StringPropertyReplacer.replaceProperties(rawConfigFile.toString());
+ ByteArrayInputStream newConfigInputStream = new ByteArrayInputStream(newConfig.getBytes());
+ Preferences.importPreferences(newConfigInputStream);
+
+ if (new AgentConfiguration(prefNode).getAgentConfigurationVersion() == 0) {
+ throw new IllegalArgumentException("Bad preferences node");
+ }
+ } catch (Exception e) {
+ // a problem occurred importing the config file; let's restore our original values
+ try {
+ Preferences.importPreferences(new ByteArrayInputStream(backup.toByteArray()));
+ } catch (Exception e1) {
+ // its conceivable the same problem occurred here as with the original exception (backing store problem?)
+ // let's throw the original exception, not this one
+ }
+ throw e;
+ }
+
+ AgentConfiguration agentConfig = new AgentConfiguration(prefNode);
+ return agentConfig;
+ }
+
+ /**
+ * Returns the preferences for this agent. The node returned is where all preferences are to be stored.
+ *
+ * @return the agent preferences
+ */
+ private Preferences getPreferencesNode() {
+ Preferences topNode = Preferences.userRoot().node(AgentConfigurationConstants.PREFERENCE_NODE_PARENT);
+ Preferences prefNode = topNode.node(preferencesNodeName);
+ return prefNode;
+ }
+
+ /**
+ * This will delete the given file and if its a directory, will recursively delete its contents and its
+ * subdirectories.
+ *
+ * @param file the file/directory to delete
+ */
+ private void cleanDataFile(File file) {
+ boolean deleted;
+
+ File[] doomedFiles = file.listFiles();
+ if (doomedFiles != null) {
+ for (File doomedFile : doomedFiles) {
+ cleanDataFile(doomedFile); // call this method recursively
+ }
+ }
+
+ deleted = file.delete();
+
+ if (!deleted) {
+ log.warn("Cannot clean data file [" + file + "]");
+ }
+
+ return;
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 7860479..f4644e1 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -1,8 +1,10 @@
package org.rhq.embeddedagent.extension;
+import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import org.jboss.as.server.ServerEnvironment;
@@ -16,6 +18,8 @@ import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
+import org.rhq.enterprise.agent.AgentMain;
+
public class AgentService implements Service<AgentService> {
public static final ServiceName SERVICE_NAME = ServiceName.of("org.rhq").append(
@@ -39,6 +43,17 @@ public class AgentService implements Service<AgentService> {
private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
/**
+ * Provides a mechanism to pre-configure the agent.
+ */
+ private AgentConfigurationSetup configSetup;
+
+ /**
+ * This is the actual embedded agent. This is what handles the plugin container lifecycle
+ * and communication to/from the server.
+ */
+ private AgentMain theAgent;
+
+ /**
* Provides the status flag of the embedded agent itself (not of this service).
*/
private AtomicBoolean agentStarted = new AtomicBoolean(false);
@@ -96,12 +111,45 @@ public class AgentService implements Service<AgentService> {
return agentStarted.get();
}
- protected void startAgent() {
+ protected void startAgent() throws StartException {
+ if (isAgentStarted()) {
+ log.info("Embedded agent is already started.");
+ return;
+ }
+
log.info("Starting the embedded agent now");
- agentStarted.set(true);
+ try {
+ // make sure we pre-configure the agent with some settings taken from our runtime environment
+ ServerEnvironment env = envServiceValue.getValue();
+ Properties overrides = new Properties();
+ boolean resetConfigurationAtStartup = true;
+ AgentConfigurationSetup configSetup = new AgentConfigurationSetup(
+ getExportedResource("conf/agent-configuration.xml"), resetConfigurationAtStartup, overrides, env);
+ // prepare the agent logging first thing so the agent logs messages using this config
+ configSetup.prepareLogConfigFile(getExportedResource("conf/log4j.xml"));
+ configSetup.preConfigureAgent();
+
+ // build the startup command line arguments to pass to the agent
+ String[] args = new String[3];
+ args[0] = "--daemon";
+ args[1] = "--pref=" + configSetup.getPreferencesNodeName();
+ args[2] = "--output=" + new File(env.getServerLogDir(), "embedded-agent.out").getAbsolutePath();
+
+ theAgent = new AgentMain(args);
+ theAgent.start();
+
+ agentStarted.set(true);
+ } catch (Exception e) {
+ throw new StartException(e);
+ }
}
protected void stopAgent() {
+ if (!isAgentStarted()) {
+ log.info("Embedded agent is already stopped.");
+ return;
+ }
+
log.info("Stopping the embedded agent now");
agentStarted.set(false);
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
index cdb14fd..e4080df 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
@@ -7,14 +7,15 @@ import org.jboss.dmr.ModelNode;
import org.jboss.logging.Logger;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.ServiceNotFoundException;
+import org.jboss.msc.service.StartException;
class AgentSubsystemRestart implements OperationStepHandler {
- static final AgentSubsystemRestart INSTANCE = new AgentSubsystemRestart();
+ static final AgentSubsystemRestart INSTANCE = new AgentSubsystemRestart();
- private final Logger log = Logger.getLogger(AgentSubsystemRestart.class);
+ private final Logger log = Logger.getLogger(AgentSubsystemRestart.class);
- private AgentSubsystemRestart() {
+ private AgentSubsystemRestart() {
}
@Override
@@ -22,15 +23,17 @@ class AgentSubsystemRestart implements OperationStepHandler {
try {
ServiceName name = AgentService.SERVICE_NAME;
AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
- .getValue();
+ .getValue();
log.info("Asked to restart the embedded agent");
service.stopAgent();
service.startAgent();
} catch (ServiceNotFoundException snfe) {
throw new OperationFailedException("Cannot restart embedded agent - the agent is disabled", snfe);
- }
+ } catch (StartException se) {
+ throw new OperationFailedException("Cannot restart embedded agent", se);
+ }
opContext.completeStep();
return;
- }
+ }
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index 2cc72ef..c818032 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -5,6 +5,7 @@
<resources>
<resource-root path="${project.build.finalName}.jar"/>
<resource-root path="rhq-agent"/>
+ <resource-root path="rhq-agent/conf"/> <!-- so we pick up the agent's log4j.xml from here -->
<resource-root path="rhq-agent/lib/commons-httpclient-2.0.2.jar" /> <!-- agent seems to want this specific version -->
<resource-root path="rhq-agent/lib/commons-io-${commons-io.version}.jar" />
<resource-root path="rhq-agent/lib/commons-logging-${commons-logging.version}.jar" />
diff --git a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
index b9310c4..70d6642 100644
--- a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
@@ -8,15 +8,18 @@
<includeBaseDirectory>false</includeBaseDirectory>
<baseDirectory>${project.build.finalName}-module</baseDirectory>
<fileSets>
+ <!-- the module.xml which only does in the zip, it is not in the jar -->
<fileSet>
- <directory>${project.build.outputDirectory}/module</directory>
+ <directory>${basedir}/src/main/resources/module</directory>
<outputDirectory>/org/rhq/${artifactId}</outputDirectory>
<includes>
<include>main/module.xml</include>
</includes>
+ <filtered>true</filtered>
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
+ <!-- the extension subsystem jar - this is just the extension classes, not the agent itself -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/org/rhq/${artifactId}/main</outputDirectory>
@@ -26,6 +29,7 @@
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
+ <!-- the agent distro itself, inside the module's rhq-agent subdirectory -->
<fileSet>
<directory>${project.build.directory}/rhq-agent</directory>
<outputDirectory>/org/rhq/${artifactId}/main/rhq-agent</outputDirectory>
@@ -35,6 +39,7 @@
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
+ <!-- the agent's native libraries which has to be specially organized for JBoss Modules to find them -->
<fileSet>
<directory>${project.build.directory}/module-lib</directory>
<outputDirectory>/org/rhq/${artifactId}/main/lib</outputDirectory>
commit 59f399485e35c0a163034a61b34b1fd2523b93c2
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jan 28 17:13:02 2014 -0500
inject the server env service into our service so we can get things like data dir, hostname, etc
add the rhq-agent distro to the exported resource roots so we can get the config xml
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 383f012..7860479 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -5,12 +5,16 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.jboss.as.server.ServerEnvironment;
import org.jboss.logging.Logger;
+import org.jboss.modules.Module;
+import org.jboss.modules.Resource;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
+import org.jboss.msc.value.InjectedValue;
public class AgentService implements Service<AgentService> {
@@ -20,11 +24,17 @@ public class AgentService implements Service<AgentService> {
private final Logger log = Logger.getLogger(AgentService.class);
/**
+ * Our subsystem add-step handler will inject this as a dependency for us.
+ * This service gives us information about the server, like the install directory, data directory, etc.
+ */
+ InjectedValue<ServerEnvironment> envServiceValue = new InjectedValue<ServerEnvironment>();
+
+ /**
* This service can be configured to be told explicitly about certain plugins to be
* enabled or disabled. This map holds that configuration. These aren't necessarily
* all the plugins that will be loaded, but they are those plugins this service was
* explicitly told about and indicates if they should be enabled or disabled.
- * TODO: For any plugin not specified will, by default, be WHAT? Disabled???
+ * TODO: For any plugin not specified will, by default, be WHAT? Disabled???
*/
private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
@@ -95,4 +105,18 @@ public class AgentService implements Service<AgentService> {
log.info("Stopping the embedded agent now");
agentStarted.set(false);
}
+
+ /**
+ * Gets information about a file that is inside our module. Use this to
+ * obtain files locationed in the embedded agent, for example, pass in
+ * "conf/agent-configuration.xml" to get the config file.
+ *
+ * @param name name of the agent file
+ * @return object referencing the file from our module
+ */
+ private Resource getExportedResource(String name) {
+ Module module = Module.forClass(getClass());
+ Resource r = module.getExportedResource("rhq-agent", name);
+ return r;
+ }
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 7541da1..f9d3291 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -7,6 +7,8 @@ import org.jboss.as.controller.AbstractAddStepHandler;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.ServiceVerificationHandler;
+import org.jboss.as.server.ServerEnvironment;
+import org.jboss.as.server.ServerEnvironmentService;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.logging.Logger;
@@ -62,8 +64,12 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
service.setPlugins(pluginsWithEnableFlag);
ServiceName name = AgentService.SERVICE_NAME;
- ServiceController<AgentService> controller = context.getServiceTarget().addService(name, service)
- .addListener(verificationHandler).setInitialMode(Mode.ACTIVE).install();
+ ServiceController<AgentService> controller = context.getServiceTarget() //
+ .addService(name, service) //
+ .addDependency(ServerEnvironmentService.SERVICE_NAME, ServerEnvironment.class, service.envServiceValue) //
+ .addListener(verificationHandler) //
+ .setInitialMode(Mode.ACTIVE) //
+ .install();
newControllers.add(controller);
return;
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index c041115..2cc72ef 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -4,6 +4,7 @@
<resources>
<resource-root path="${project.build.finalName}.jar"/>
+ <resource-root path="rhq-agent"/>
<resource-root path="rhq-agent/lib/commons-httpclient-2.0.2.jar" /> <!-- agent seems to want this specific version -->
<resource-root path="rhq-agent/lib/commons-io-${commons-io.version}.jar" />
<resource-root path="rhq-agent/lib/commons-logging-${commons-logging.version}.jar" />
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index 40054b9..b33fb4f 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -16,16 +16,17 @@ import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRI
import java.util.ArrayList;
import java.util.List;
+import org.testng.Assert;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.subsystem.test.KernelServices;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.msc.service.ServiceNotFoundException;
-import org.testng.Assert;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
@Test
public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
@@ -291,11 +292,13 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
Assert.assertEquals(plugins.get(2).getName(), "foo"); // foo plugin we added above
Assert.assertEquals(plugins.get(2).getValue().asBoolean(), true);
+ /* TODO: I think we need to mock the ServerEnvironmentService dependency before we can do this
// execute status
ModelNode statusOp = new ModelNode();
statusOp.get(OP).set(AgentSubsystemExtension.AGENT_STATUS_OP);
statusOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
result = services.executeOperation(statusOp);
- Assert.assertEquals(checkResultAndGetContents(result).asString(), "STARTED");
+ Assert.assertTrue(checkResultAndGetContents(result).asBoolean());
+ */
}
}
commit ec1b31543c37e31813e2dc8397a8c38ad11754db
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jan 28 15:29:31 2014 -0500
putting native libs in their proper place for EAP to find them
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
index d20815b..c6118a6 100644
--- a/modules/enterprise/server/embeddedagent/pom.xml
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -54,6 +54,61 @@
</plugin>
<plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>rename-native-libs-and-reconfigure</id>
+ <phase>process-resources</phase>
+ <configuration>
+ <target>
+ <echo>Must move native libraries so JBoss Modules can find them</echo>
+ <property name="agent.lib" location="${project.build.directory}/rhq-agent/lib"/>
+ <property name="module.lib" location="${project.build.directory}/module-lib"/>
+ <!-- Notice that the agent's "augeas" native libs are not copied.
+ I think its only used for some plugins we won't be using in embedded mode anyway. -->
+ <!-- TODO these should probably be "move", I don't think we need dup copies in agent lib anymore -->
+ <copy tofile="${module.lib}/linux-i686/libsigar.so" file="${agent.lib}/libsigar-x86-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-x86_64/libsigar.so" file="${agent.lib}/libsigar-amd64-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-ia64/libsigar.so" file="${agent.lib}/libsigar-ia64-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-ppc64/libsigar.so" file="${agent.lib}/libsigar-ppc64-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-ppc/libsigar.so" file="${agent.lib}/libsigar-ppc-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-s390x/libsigar.so" file="${agent.lib}/libsigar-s390x-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/win-i686/sigar.dll" file="${agent.lib}/sigar-x86-winnt.dll" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/win-x86_64/sigar.dll" file="${agent.lib}/sigar-amd64-winnt.dll" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/hpux-ia64w/libsigar.sl" file="${agent.lib}/libsigar-ia64-hpux-11.sl" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/hpux-parisc/libsigar.sl" file="${agent.lib}/libsigar-pa-hpux-11.sl" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/aix-ppc/libsigar.so" file="${agent.lib}/libsigar-ppc-aix-5.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/aix-ppc64/libsigar.so" file="${agent.lib}/libsigar-ppc64-aix-5.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/solaris-i686/libsigar.so" file="${agent.lib}/libsigar-x86-solaris.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/solaris-x86_64/libsigar.so" file="${agent.lib}/libsigar-amd64-solaris.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/solaris-sparc/libsigar.so" file="${agent.lib}/libsigar-sparc-solaris.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/solaris-sparcv9/libsigar.so" file="${agent.lib}/libsigar-sparc64-solaris.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/freebsd-i686/libsigar.so" file="${agent.lib}/libsigar-x86-freebsd-6.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/freebsd-x86_64/libsigar.so" file="${agent.lib}/libsigar-amd64-freebsd-6.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/macosx-i686/libsigar.dylib" file="${agent.lib}/libsigar-universal-macosx.dylib" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/macosx-x86_64/libsigar.dylib" file="${agent.lib}/libsigar-universal64-macosx.dylib" preservelastmodified="true"/>
+
+ <echo>Adjust default configuration</echo>
+ <property name="config.xml" location="${project.build.directory}/rhq-agent/conf/agent-configuration.xml"/>
+ <!-- because we are embedded, as can't have a prompt and ask user, so we will ensure the agent is always fully setup -->
+ <replaceregexp file="${config.xml}" flags="s"
+ match='<!--(\s*)<entry key="rhq.agent.configuration-setup-flag" value="false" />(\s*)-->'
+ replace='<entry key="rhq.agent.configuration-setup-flag" value="true" /> BOOO' />
+ <!-- we don't support agent auto-update while the agent is embedded -->
+ <replaceregexp file="${config.xml}"
+ match='<entry key="rhq.agent.agent-update.enabled" value="true" />'
+ replace='<entry key="rhq.agent.agent-update.enabled" value="false" /> BOOO' />
+
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
diff --git a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
index c526e5c..b9310c4 100644
--- a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
@@ -35,6 +35,12 @@
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
+ <fileSet>
+ <directory>${project.build.directory}/module-lib</directory>
+ <outputDirectory>/org/rhq/${artifactId}/main/lib</outputDirectory>
+ <fileMode>0755</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
</fileSets>
</assembly>
commit e5fdaf12dc7d0622bd2dc6e1031e656b2c0e9b88
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jan 27 17:28:30 2014 -0500
there is no easy way to build a generated module.xml from the agent distro dependency list, so just put these in directly in the module.xml.
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index 662dd31..c041115 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -4,7 +4,33 @@
<resources>
<resource-root path="${project.build.finalName}.jar"/>
- <resource-root path="rhq-agent" />
+ <resource-root path="rhq-agent/lib/commons-httpclient-2.0.2.jar" /> <!-- agent seems to want this specific version -->
+ <resource-root path="rhq-agent/lib/commons-io-${commons-io.version}.jar" />
+ <resource-root path="rhq-agent/lib/commons-logging-${commons-logging.version}.jar" />
+ <resource-root path="rhq-agent/lib/concurrent-${concurrent.version}.jar" />
+ <resource-root path="rhq-agent/lib/dom4j-1.6.jar" /> <!-- agent seems to want this specific version -->
+ <resource-root path="rhq-agent/lib/getopt-${getopt.version}.jar" />
+ <resource-root path="rhq-agent/lib/i18nlog-${i18nlog.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-common-core-${jboss-common-core.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-jmx-${jboss-jmx.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-logging-${jboss-logging.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-remoting-${jboss-remoting.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-serialization-${jboss-serialization.version}.jar" />
+ <resource-root path="rhq-agent/lib/jline-${jline.version}.jar" />
+ <resource-root path="rhq-agent/lib/log4j-${log4j.version}.jar" />
+ <resource-root path="rhq-agent/lib/persistence-api-1.0.jar" />
+ <resource-root path="rhq-agent/lib/rhq-common-drift-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-client-api-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-comm-api-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-domain-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-native-system-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-plugin-api-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-plugin-container-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-util-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-enterprise-agent-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-enterprise-comm-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/sigar-${sigar.version}.jar" />
+ <resource-root path="rhq-agent/lib/trove4j-3.0.3.jar" />
</resources>
<dependencies>
commit bc8295387834979dbc87cf448abed87c811a69d7
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jan 27 10:37:05 2014 -0500
unpack the entire agent zip inside the module.
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
index 70ecea6..d20815b 100644
--- a/modules/enterprise/server/embeddedagent/pom.xml
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -30,13 +30,28 @@
</resources>
<plugins>
- <!-- COPY AGENT BINARIES <plugin> <artifactId>maven-dependency-plugin</artifactId>
- <executions> <execution> <id>copy-agent</id> <phase>process-resources</phase>
- <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem>
- <groupId>org.rhq</groupId> <artifactId>rhq-enterprise-server-ear</artifactId>
- <type>ear</type> <outputDirectory>${project.build.directory}/agent/</outputDirectory>
- </artifactItem> </artifactItems> </configuration> </execution> </executions>
- </plugin> -->
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-agent</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-agent</artifactId>
+ <type>zip</type>
+ <outputDirectory>${project.build.directory}</outputDirectory>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
@@ -69,6 +84,12 @@
<artifactId>jboss-as-server</artifactId>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-agent</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
<!-- test deps -->
<dependency>
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index 295c78d..662dd31 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -4,7 +4,7 @@
<resources>
<resource-root path="${project.build.finalName}.jar"/>
- <!-- <resource-root path="agent" /> -->
+ <resource-root path="rhq-agent" />
</resources>
<dependencies>
diff --git a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
index a4cab0a..c526e5c 100644
--- a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
@@ -27,8 +27,11 @@
<directoryMode>0755</directoryMode>
</fileSet>
<fileSet>
- <directory>${project.build.directory}/agent</directory>
- <outputDirectory>/org/rhq/${artifactId}/main/agent</outputDirectory>
+ <directory>${project.build.directory}/rhq-agent</directory>
+ <outputDirectory>/org/rhq/${artifactId}/main/rhq-agent</outputDirectory>
+ <excludes>
+ <exclude>plugins</exclude>
+ </excludes>
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
commit 6171c6f8d5c6e03d084cf22533d7184296370152
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 24 20:25:13 2014 -0500
initial start of the embedded agent as a WildFly extension subsystem.
right now, this is just the shell service. the agent isn't in here yet. but the service
is fully wired into the AS infrastructure and shows in the AS CLI. has a normal model just like all other subsystems.
Now just have to build the module with the agent inside and have the shell call the AgentMain
diff --git a/.classpath b/.classpath
index 7bd64fe..cb9f5bc 100644
--- a/.classpath
+++ b/.classpath
@@ -77,6 +77,8 @@
<classpathentry kind="src" path="modules/enterprise/server/safe-invoker/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/server/startup-subsystem/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/startup-subsystem/src/test/java"/>
+ <classpathentry kind="src" path="modules/enterprise/server/embeddedagent/src/main/java"/>
+ <classpathentry kind="src" path="modules/enterprise/server/embeddedagent/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/ant-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/filetemplate-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/alert-subject/src/main/java"/>
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
new file mode 100644
index 0000000..70ecea6
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-parent</artifactId>
+ <version>4.10.0-SNAPSHOT</version>
+ <relativePath>../../../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>embeddedagent</artifactId>
+
+ <name>RHQ Embedded Agent Subsystem</name>
+
+ <properties>
+ <!-- this is used to replace the variable in module.xml -->
+ <moduleName>${project.groupId}.${project.artifactId}</moduleName>
+ <moduleDir>org/rhq/${project.artifactId}</moduleDir>
+ </properties>
+
+ <build>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+
+ <plugins>
+ <!-- COPY AGENT BINARIES <plugin> <artifactId>maven-dependency-plugin</artifactId>
+ <executions> <execution> <id>copy-agent</id> <phase>process-resources</phase>
+ <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem>
+ <groupId>org.rhq</groupId> <artifactId>rhq-enterprise-server-ear</artifactId>
+ <type>ear</type> <outputDirectory>${project.build.directory}/agent/</outputDirectory>
+ </artifactItem> </artifactItems> </configuration> </execution> </executions>
+ </plugin> -->
+
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <configuration>
+ <descriptors>
+ <descriptor>src/main/scripts/module-assembly.xml</descriptor>
+ </descriptors>
+ </configuration>
+ <executions>
+ <execution>
+ <id>module-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.as</groupId>
+ <artifactId>jboss-as-controller</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.as</groupId>
+ <artifactId>jboss-as-server</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- test deps -->
+ <dependency>
+ <groupId>org.jboss.as</groupId>
+ <artifactId>jboss-as-subsystem-test</artifactId>
+ <version>${jboss.version}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.devContainerServerPath}</rhq.containerDir>
+ <rhq.deploymentName>${project.build.finalName}.zip</rhq.deploymentName>
+ <rhq.deploymentDir>${rhq.containerDir}/modules/</rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>package</phase>
+ <configuration>
+ <target>
+ <echo>*** Deploying Embedded Agent module to ${rhq.deploymentDir}</echo>
+ <unzip src="target/${rhq.deploymentName}"
+ dest="${rhq.deploymentDir}" />
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <target>
+ <echo>*** Deleting Embedded Agent module ... ${rhq.deploymentDir}/${moduleDir}</echo>
+ <delete dir="${rhq.deploymentDir}/${moduleDir}" />
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+</project>
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
new file mode 100644
index 0000000..a815600
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
@@ -0,0 +1,35 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.AbstractWriteAttributeHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.dmr.ModelNode;
+import org.jboss.logging.Logger;
+
+class AgentEnabledAttributeHandler extends AbstractWriteAttributeHandler<Void> {
+
+ public static final AgentEnabledAttributeHandler INSTANCE = new AgentEnabledAttributeHandler();
+
+ private final Logger log = Logger.getLogger(AgentEnabledAttributeHandler.class);
+
+ private AgentEnabledAttributeHandler() {
+ super(AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF);
+ }
+
+ @Override
+ protected boolean applyUpdateToRuntime(OperationContext context,
+ ModelNode operation, String attributeName, ModelNode resolvedValue,
+ ModelNode currentValue, HandbackHolder<Void> handbackHolder)
+ throws OperationFailedException {
+ log.info("Embedded agent enabled attribute changed: " + attributeName + "=" + resolvedValue);
+ // there is nothing for us to do - this only affects us when we are restarted, return true to say we must reload
+ return true;
+ }
+
+ @Override
+ protected void revertUpdateToRuntime(OperationContext context,
+ ModelNode operation, String attributeName,
+ ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
+ // no-op
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
new file mode 100644
index 0000000..383f012
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -0,0 +1,98 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.Service;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.StartContext;
+import org.jboss.msc.service.StartException;
+import org.jboss.msc.service.StopContext;
+
+public class AgentService implements Service<AgentService> {
+
+ public static final ServiceName SERVICE_NAME = ServiceName.of("org.rhq").append(
+ AgentSubsystemExtension.SUBSYSTEM_NAME);
+
+ private final Logger log = Logger.getLogger(AgentService.class);
+
+ /**
+ * This service can be configured to be told explicitly about certain plugins to be
+ * enabled or disabled. This map holds that configuration. These aren't necessarily
+ * all the plugins that will be loaded, but they are those plugins this service was
+ * explicitly told about and indicates if they should be enabled or disabled.
+ * TODO: For any plugin not specified will, by default, be WHAT? Disabled???
+ */
+ private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
+
+ /**
+ * Provides the status flag of the embedded agent itself (not of this service).
+ */
+ private AtomicBoolean agentStarted = new AtomicBoolean(false);
+
+ public AgentService() {
+ }
+
+ @Override
+ public AgentService getValue() throws IllegalStateException, IllegalArgumentException {
+ return this;
+ }
+
+ @Override
+ public void start(StartContext context) throws StartException {
+ log.info("Embedded agent service starting");
+ startAgent();
+ }
+
+ @Override
+ public void stop(StopContext context) {
+ log.info("Embedded agent service stopping");
+ stopAgent();
+ }
+
+ /**
+ * Returns the set of plugins the service knows about and whether
+ * or not those plugins are to be enabled or disabled.
+ * You get back a copy, not the actual map.
+ *
+ * @return plugins and their enable-flag
+ */
+ protected Map<String, Boolean> getPlugins() {
+ synchronized (plugins) {
+ return new HashMap<String, Boolean>(plugins);
+ }
+ }
+
+ /**
+ * Sets the enable flags for plugins.
+ *
+ * @return plugins and their enable-flag (if <code>null</code>, assumes an empty map)
+ */
+ protected void setPlugins(Map<String, Boolean> pluginsWithEnableFlag) {
+ synchronized (plugins) {
+ plugins.clear();
+ if (pluginsWithEnableFlag != null) {
+ plugins.putAll(pluginsWithEnableFlag);
+ }
+ }
+
+ log.info("New plugin definitions: " + pluginsWithEnableFlag);
+ }
+
+ protected boolean isAgentStarted() {
+ return agentStarted.get();
+ }
+
+ protected void startAgent() {
+ log.info("Starting the embedded agent now");
+ agentStarted.set(true);
+ }
+
+ protected void stopAgent() {
+ log.info("Stopping the embedded agent now");
+ agentStarted.set(false);
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
new file mode 100644
index 0000000..7541da1
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -0,0 +1,70 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.jboss.as.controller.AbstractAddStepHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.ServiceVerificationHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.Property;
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.ServiceController;
+import org.jboss.msc.service.ServiceController.Mode;
+import org.jboss.msc.service.ServiceName;
+
+/**
+ * Handler responsible for adding the subsystem resource to the model
+ */
+class AgentSubsystemAdd extends AbstractAddStepHandler {
+
+ static final AgentSubsystemAdd INSTANCE = new AgentSubsystemAdd();
+
+ private final Logger log = Logger.getLogger(AgentSubsystemAdd.class);
+
+ private AgentSubsystemAdd() {
+ }
+
+ @Override
+ protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
+ AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.validateAndSet(operation, model);
+ log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
+ }
+
+ @Override
+ protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model,
+ ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers)
+ throws OperationFailedException {
+
+ boolean enabled = AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF.resolveModelAttribute(context, model)
+ .asBoolean(AgentSubsystemExtension.AGENT_ENABLED_DEFAULT);
+
+ if (!enabled) {
+ log.info("Embedded agent is not enabled and will not be deployed");
+ return;
+ }
+
+ log.info("Embedded agent is enabled and will be deployed");
+ HashMap<String, Boolean> pluginsWithEnableFlag = new HashMap<String, Boolean>();
+ ModelNode pluginsNode = AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.resolveModelAttribute(context, model);
+ if (pluginsNode != null && pluginsNode.isDefined()) {
+ List<Property> pluginsList = pluginsNode.asPropertyList();
+ for (Property pluginsItem : pluginsList) {
+ String pluginName = pluginsItem.getName();
+ boolean pluginEnabled = pluginsItem.getValue().asBoolean();
+ pluginsWithEnableFlag.put(pluginName, pluginEnabled);
+ }
+ }
+
+ AgentService service = new AgentService();
+ service.setPlugins(pluginsWithEnableFlag);
+
+ ServiceName name = AgentService.SERVICE_NAME;
+ ServiceController<AgentService> controller = context.getServiceTarget().addService(name, service)
+ .addListener(verificationHandler).setInitialMode(Mode.ACTIVE).install();
+ newControllers.add(controller);
+ return;
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
new file mode 100644
index 0000000..e43c6c5
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -0,0 +1,66 @@
+package org.rhq.embeddedagent.extension;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIBE;
+
+import org.jboss.as.controller.SimpleAttributeDefinition;
+import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
+import org.jboss.as.controller.SimpleResourceDefinition;
+import org.jboss.as.controller.descriptions.DefaultOperationDescriptionProvider;
+import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
+import org.jboss.as.controller.registry.AttributeAccess;
+import org.jboss.as.controller.registry.ManagementResourceRegistration;
+import org.jboss.as.controller.registry.OperationEntry;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.ModelType;
+
+public class AgentSubsystemDefinition extends SimpleResourceDefinition {
+
+ public static final AgentSubsystemDefinition INSTANCE = new AgentSubsystemDefinition();
+
+ protected static final SimpleAttributeDefinition AGENT_ENABLED_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.AGENT_ENABLED, ModelType.BOOLEAN).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.AGENT_ENABLED).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentSubsystemExtension.AGENT_ENABLED_DEFAULT)).setAllowNull(false).build();
+
+ protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
+
+ private AgentSubsystemDefinition() {
+ super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
+ AgentSubsystemAdd.INSTANCE, AgentSubsystemRemove.INSTANCE);
+ }
+
+ @Override
+ public void registerAttributes(ManagementResourceRegistration rr) {
+ rr.registerReadWriteAttribute(AGENT_ENABLED_ATTRIBDEF, null, AgentEnabledAttributeHandler.INSTANCE);
+ rr.registerReadWriteAttribute(PLUGINS_ATTRIBDEF, null, PluginsAttributeHandler.INSTANCE);
+ }
+
+ @Override
+ public void registerOperations(ManagementResourceRegistration rr) {
+ super.registerOperations(rr);
+
+ // We always need to add a 'describe' operation
+ rr.registerOperationHandler(DESCRIBE, GenericSubsystemDescribeHandler.INSTANCE,
+ GenericSubsystemDescribeHandler.INSTANCE, false, OperationEntry.EntryType.PRIVATE);
+
+ rr.registerOperationHandler(
+ AgentSubsystemExtension.AGENT_RESTART_OP,
+ AgentSubsystemRestart.INSTANCE,
+ new DefaultOperationDescriptionProvider(AgentSubsystemExtension.AGENT_RESTART_OP, AgentSubsystemExtension
+ .getResourceDescriptionResolver(null)), false, OperationEntry.EntryType.PUBLIC);
+
+ rr.registerOperationHandler(
+ AgentSubsystemExtension.AGENT_STOP_OP,
+ AgentSubsystemStop.INSTANCE,
+ new DefaultOperationDescriptionProvider(AgentSubsystemExtension.AGENT_STOP_OP, AgentSubsystemExtension
+ .getResourceDescriptionResolver(null)), false, OperationEntry.EntryType.PUBLIC);
+
+ rr.registerOperationHandler(
+ AgentSubsystemExtension.AGENT_STATUS_OP,
+ AgentSubsystemStatus.INSTANCE,
+ new DefaultOperationDescriptionProvider(AgentSubsystemExtension.AGENT_STATUS_OP, AgentSubsystemExtension
+ .getResourceDescriptionResolver(null), ModelType.STRING), false, OperationEntry.EntryType.PUBLIC);
+
+ return;
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
new file mode 100644
index 0000000..1ab7a7e
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -0,0 +1,175 @@
+package org.rhq.embeddedagent.extension;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+
+import org.jboss.as.controller.Extension;
+import org.jboss.as.controller.ExtensionContext;
+import org.jboss.as.controller.PathAddress;
+import org.jboss.as.controller.PathElement;
+import org.jboss.as.controller.SubsystemRegistration;
+import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver;
+import org.jboss.as.controller.parsing.ExtensionParsingContext;
+import org.jboss.as.controller.parsing.ParseUtils;
+import org.jboss.as.controller.persistence.SubsystemMarshallingContext;
+import org.jboss.as.controller.registry.ManagementResourceRegistration;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.Property;
+import org.jboss.logging.Logger;
+import org.jboss.staxmapper.XMLElementReader;
+import org.jboss.staxmapper.XMLElementWriter;
+import org.jboss.staxmapper.XMLExtendedStreamReader;
+import org.jboss.staxmapper.XMLExtendedStreamWriter;
+
+public class AgentSubsystemExtension implements Extension {
+
+ private final Logger log = Logger.getLogger(AgentSubsystemExtension.class);
+
+ public static final String NAMESPACE = "urn:org.rhq:embeddedagent:1.0";
+ public static final String SUBSYSTEM_NAME = "embeddedagent";
+
+ private final SubsystemParser parser = new SubsystemParser();
+
+ private static final String RESOURCE_NAME = AgentSubsystemExtension.class.getPackage().getName()
+ + ".LocalDescriptions";
+
+ protected static final String PLUGINS_ELEMENT = "plugins";
+ protected static final String PLUGIN_ELEMENT = "plugin";
+ protected static final String PLUGIN_NAME = "name";
+ protected static final String PLUGIN_ENABLED = "enabled";
+ protected static final String AGENT_ENABLED = "enabled";
+ protected static final boolean AGENT_ENABLED_DEFAULT = false;
+ protected static final boolean PLUGIN_ENABLED_DEFAULT = true;
+
+ protected static final String AGENT_RESTART_OP = "restart";
+ protected static final String AGENT_STOP_OP = "stop";
+ protected static final String AGENT_STATUS_OP = "status";
+
+ protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
+
+ static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
+ String prefix = SUBSYSTEM_NAME + (keyPrefix == null ? "" : "." + keyPrefix);
+ return new StandardResourceDescriptionResolver(prefix, RESOURCE_NAME,
+ AgentSubsystemExtension.class.getClassLoader(), true, false);
+ }
+
+ @Override
+ public void initializeParsers(ExtensionParsingContext context) {
+ context.setSubsystemXmlMapping(SUBSYSTEM_NAME, NAMESPACE, parser);
+ }
+
+ @Override
+ public void initialize(ExtensionContext context) {
+ log.info("Initializing embedded agent subsystem");
+
+ final SubsystemRegistration subsystem = context.registerSubsystem(SUBSYSTEM_NAME, 1, 0);
+ final ManagementResourceRegistration registration = subsystem
+ .registerSubsystemModel(AgentSubsystemDefinition.INSTANCE);
+
+ subsystem.registerXMLElementWriter(parser);
+ }
+
+ /**
+ * The subsystem parser, which uses stax to read and write to and from xml
+ */
+ private static class SubsystemParser implements XMLStreamConstants, XMLElementReader<List<ModelNode>>,
+ XMLElementWriter<SubsystemMarshallingContext> {
+
+ @Override
+ public void readElement(XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException {
+ // The agent "enabled" attribute is required
+ ParseUtils.requireSingleAttribute(reader, AGENT_ENABLED);
+
+ // Add the main subsystem 'add' operation
+ final ModelNode opAdd = new ModelNode();
+ opAdd.get(OP).set(ADD);
+ opAdd.get(OP_ADDR).set(PathAddress.pathAddress(SUBSYSTEM_PATH).toModelNode());
+ String agentEnabledValue = reader.getAttributeValue(null, AGENT_ENABLED);
+ if (agentEnabledValue != null) {
+ opAdd.get(AGENT_ENABLED).set(agentEnabledValue);
+ }
+
+ ModelNode pluginsAttributeNode = opAdd.get(PLUGINS_ELEMENT);
+
+ // Read the children elements
+ while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
+ if (!reader.getLocalName().equals(PLUGINS_ELEMENT)) {
+ throw ParseUtils.unexpectedElement(reader);
+ }
+ while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
+ if (reader.isStartElement()) {
+ readPlugin(reader, pluginsAttributeNode);
+ }
+ }
+ }
+
+ list.add(opAdd);
+ }
+
+ private void readPlugin(XMLExtendedStreamReader reader, ModelNode pluginsAttributeNode)
+ throws XMLStreamException {
+
+ if (!reader.getLocalName().equals(PLUGIN_ELEMENT)) {
+ throw ParseUtils.unexpectedElement(reader);
+ }
+
+ String pluginName = null;
+ boolean pluginEnabled = PLUGIN_ENABLED_DEFAULT;
+ for (int i = 0; i < reader.getAttributeCount(); i++) {
+ String attr = reader.getAttributeLocalName(i);
+ String value = reader.getAttributeValue(i);
+ if (attr.equals(PLUGIN_ENABLED)) {
+ pluginEnabled = Boolean.parseBoolean(value);
+ } else if (attr.equals(PLUGIN_NAME)) {
+ pluginName = value;
+ } else {
+ throw ParseUtils.unexpectedAttribute(reader, i);
+ }
+ }
+ ParseUtils.requireNoContent(reader);
+ if (pluginName == null) {
+ throw ParseUtils.missingRequiredElement(reader, Collections.singleton(PLUGIN_NAME));
+ }
+
+ // Add the plugin to the plugins attribute node
+ pluginsAttributeNode.add(pluginName, pluginEnabled);
+ }
+
+ @Override
+ public void writeContent(final XMLExtendedStreamWriter writer, final SubsystemMarshallingContext context)
+ throws XMLStreamException {
+ ModelNode node = context.getModelNode();
+
+ // <subsystem>
+ context.startSubsystemElement(AgentSubsystemExtension.NAMESPACE, false);
+ writer.writeAttribute(AGENT_ENABLED,
+ String.valueOf(node.get(AGENT_ENABLED).asBoolean(AGENT_ENABLED_DEFAULT)));
+
+ // <plugins>
+ writer.writeStartElement(PLUGINS_ELEMENT);
+ ModelNode plugins = node.get(PLUGINS_ELEMENT);
+ if (plugins != null && plugins.isDefined()) {
+ for (Property property : plugins.asPropertyList()) {
+ // <plugin>
+ writer.writeStartElement(PLUGIN_ELEMENT);
+ writer.writeAttribute(PLUGIN_NAME, property.getName());
+ writer.writeAttribute(PLUGIN_ENABLED, property.getValue().asString());
+ // </plugin>
+ writer.writeEndElement();
+ }
+ }
+ // </plugins>
+ writer.writeEndElement();
+ // </subsystem>
+ writer.writeEndElement();
+ }
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRemove.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRemove.java
new file mode 100644
index 0000000..4f19745
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRemove.java
@@ -0,0 +1,23 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.AbstractRemoveStepHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.dmr.ModelNode;
+import org.jboss.msc.service.ServiceName;
+
+class AgentSubsystemRemove extends AbstractRemoveStepHandler {
+
+ static final AgentSubsystemRemove INSTANCE = new AgentSubsystemRemove();
+
+ private AgentSubsystemRemove() {
+ }
+
+ @Override
+ protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model)
+ throws OperationFailedException {
+
+ ServiceName name = AgentService.SERVICE_NAME;
+ context.removeService(name);
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
new file mode 100644
index 0000000..cdb14fd
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
@@ -0,0 +1,36 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.OperationStepHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.ServiceNotFoundException;
+
+class AgentSubsystemRestart implements OperationStepHandler {
+
+ static final AgentSubsystemRestart INSTANCE = new AgentSubsystemRestart();
+
+ private final Logger log = Logger.getLogger(AgentSubsystemRestart.class);
+
+ private AgentSubsystemRestart() {
+ }
+
+ @Override
+ public void execute(OperationContext opContext, ModelNode model) throws OperationFailedException {
+ try {
+ ServiceName name = AgentService.SERVICE_NAME;
+ AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
+ .getValue();
+ log.info("Asked to restart the embedded agent");
+ service.stopAgent();
+ service.startAgent();
+ } catch (ServiceNotFoundException snfe) {
+ throw new OperationFailedException("Cannot restart embedded agent - the agent is disabled", snfe);
+ }
+
+ opContext.completeStep();
+ return;
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStatus.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStatus.java
new file mode 100644
index 0000000..8b09a21
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStatus.java
@@ -0,0 +1,32 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.OperationStepHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.ServiceNotFoundException;
+
+class AgentSubsystemStatus implements OperationStepHandler {
+
+ static final AgentSubsystemStatus INSTANCE = new AgentSubsystemStatus();
+
+ private AgentSubsystemStatus() {
+ }
+
+ @Override
+ public void execute(OperationContext opContext, ModelNode model) throws OperationFailedException {
+ boolean isStarted = false;
+ try {
+ ServiceName name = AgentService.SERVICE_NAME;
+ AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
+ .getValue();
+ isStarted = service.isAgentStarted();
+ } catch (ServiceNotFoundException snfe) {
+ // the agent just isn't deployed, so obviously, is isn't started
+ isStarted = false;
+ }
+ opContext.getResult().set(isStarted ? "STARTED" : "STOPPED");
+ opContext.completeStep();
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStop.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStop.java
new file mode 100644
index 0000000..62e7307
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStop.java
@@ -0,0 +1,34 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.OperationStepHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.ServiceName;
+
+class AgentSubsystemStop implements OperationStepHandler {
+
+ static final AgentSubsystemStop INSTANCE = new AgentSubsystemStop();
+
+ private final Logger log = Logger.getLogger(AgentSubsystemStop.class);
+
+ private AgentSubsystemStop() {
+ }
+
+ @Override
+ public void execute(OperationContext opContext, ModelNode model) throws OperationFailedException {
+ try {
+ ServiceName name = AgentService.SERVICE_NAME;
+ AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
+ .getValue();
+ log.info("Asked to stop the embedded agent");
+ service.stopAgent();
+ } catch (Exception e) {
+ // the agent service isn't deployed, so obviously, the agent is already stopped. just keep going
+ }
+
+ opContext.completeStep();
+ return;
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeDefinition.java
new file mode 100644
index 0000000..b925c79
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeDefinition.java
@@ -0,0 +1,56 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.jboss.as.controller.MapAttributeDefinition;
+import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
+import org.jboss.as.controller.descriptions.ResourceDescriptionResolver;
+import org.jboss.as.controller.operations.validation.ModelTypeValidator;
+import org.jboss.as.controller.parsing.Attribute;
+import org.jboss.as.controller.registry.AttributeAccess.Flag;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.ModelType;
+
+public class PluginsAttributeDefinition extends MapAttributeDefinition {
+
+ public PluginsAttributeDefinition() {
+ super(AgentSubsystemExtension.PLUGINS_ELEMENT, AgentSubsystemExtension.PLUGINS_ELEMENT, true,
+ 0, Integer.MAX_VALUE, new ModelTypeValidator(ModelType.STRING), null, null, Flag.RESTART_RESOURCE_SERVICES);
+ }
+
+ @Override
+ protected void addValueTypeDescription(ModelNode node, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ protected void addAttributeValueTypeDescription(ModelNode node, ResourceDescriptionResolver resolver,
+ Locale locale, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ protected void addOperationParameterValueTypeDescription(ModelNode node, String operationName,
+ ResourceDescriptionResolver resolver, Locale locale, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ public void marshallAsElement(ModelNode resourceModel, XMLStreamWriter writer) throws XMLStreamException {
+ if (!isMarshallable(resourceModel))
+ return;
+
+ resourceModel = resourceModel.get(getName());
+ writer.writeStartElement(getName());
+ for (ModelNode property : resourceModel.asList()) {
+ writer.writeEmptyElement(getXmlName());
+ writer.writeAttribute(Attribute.NAME.getLocalName(), property.asProperty().getName());
+ writer.writeAttribute(Attribute.VALUE.getLocalName(), property.asProperty().getValue().asString());
+ }
+ writer.writeEndElement();
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
new file mode 100644
index 0000000..1d51294
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
@@ -0,0 +1,62 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.jboss.as.controller.AbstractWriteAttributeHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.Property;
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.ServiceNotFoundException;
+
+class PluginsAttributeHandler extends AbstractWriteAttributeHandler<Void> {
+
+ public static final PluginsAttributeHandler INSTANCE = new PluginsAttributeHandler();
+
+ private final Logger log = Logger.getLogger(PluginsAttributeHandler.class);
+
+ private PluginsAttributeHandler() {
+ super(AgentSubsystemDefinition.PLUGINS_ATTRIBDEF);
+ }
+
+ @Override
+ protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
+ ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder)
+ throws OperationFailedException {
+
+ log.info("Embedded agent plugins attribute changed: " + attributeName + "=" + resolvedValue);
+ setPluginsWithEnabledFlag(context, resolvedValue);
+ return true; // the service must be restarted to really pick up the change at runtime
+ }
+
+ @Override
+ protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
+ ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
+
+ log.info("Reverting embedded agent plugins attribute: " + attributeName + "=" + valueToRestore);
+ setPluginsWithEnabledFlag(context, valueToRestore);
+ }
+
+ private void setPluginsWithEnabledFlag(OperationContext context, ModelNode newValue) {
+
+ try {
+ AgentService service = (AgentService) context.getServiceRegistry(true)
+ .getRequiredService(AgentService.SERVICE_NAME).getValue();
+
+ HashMap<String, Boolean> pluginsWithEnableFlag = new HashMap<String, Boolean>();
+ if (newValue != null && newValue.isDefined()) {
+ List<Property> pluginsList = newValue.asPropertyList();
+ for (Property pluginsItem : pluginsList) {
+ String pluginName = pluginsItem.getName();
+ boolean pluginEnabled = pluginsItem.getValue().asBoolean();
+ pluginsWithEnableFlag.put(pluginName, pluginEnabled);
+ }
+ }
+ service.setPlugins(pluginsWithEnableFlag);
+ } catch (ServiceNotFoundException snfe) {
+ // the agent is probably disabled or undeployed, don't bother doing anything
+ }
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/META-INF/services/org.jboss.as.controller.Extension b/modules/enterprise/server/embeddedagent/src/main/resources/META-INF/services/org.jboss.as.controller.Extension
new file mode 100644
index 0000000..d8addaa
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/META-INF/services/org.jboss.as.controller.Extension
@@ -0,0 +1 @@
+org.rhq.embeddedagent.extension.AgentSubsystemExtension
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
new file mode 100644
index 0000000..295c78d
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<module xmlns="urn:jboss:module:1.0" name="${moduleName}">
+
+ <resources>
+ <resource-root path="${project.build.finalName}.jar"/>
+ <!-- <resource-root path="agent" /> -->
+ </resources>
+
+ <dependencies>
+ <!-- modules required by any subsystem -->
+ <module name="javax.api"/>
+ <module name="org.jboss.staxmapper"/>
+ <module name="org.jboss.as.controller"/>
+ <module name="org.jboss.as.server"/>
+ <module name="org.jboss.modules"/>
+ <module name="org.jboss.msc"/>
+ <module name="org.jboss.logging"/>
+ <module name="org.jboss.vfs"/>
+ </dependencies>
+</module>
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
new file mode 100644
index 0000000..790232a
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -0,0 +1,8 @@
+embeddedagent=RHQ Agent
+embeddedagent.add=Adds the RHQ Agent subsystem
+embeddedagent.remove=Removes the RHQ Agent subsystem
+embeddedagent.restart=Starts the RHQ Agent. If it is already started, it will be stopped, then started again.
+embeddedagent.stop=Stops the RHQ Agent if it is running.
+embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
+embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
+embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
new file mode 100644
index 0000000..2882729
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -0,0 +1,26 @@
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="urn:org.rhq:embeddedagent:1.0"
+ xmlns="urn:org.rhq.embeddedagent:1.0"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ version="1.0">
+
+ <xs:element name="subsystem" type="subsystemType"/>
+
+ <xs:complexType name="subsystemType">
+ <xs:attribute name="enabled" type="xs:boolean" use="required" default="false"/>
+ <xs:all>
+ <xs:element name="plugins" type="pluginsType"/>
+ </xs:all>
+ </xs:complexType>
+
+ <xs:complexType name="pluginsType">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="plugin" type="pluginType"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="pluginType">
+ <xs:attribute name="name" use="required"/>
+ <xs:attribute name="enabled" type="xs:boolean" use="required" default="true"/>
+ </xs:complexType>
+</xs:schema>
diff --git a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
new file mode 100644
index 0000000..a4cab0a
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<assembly>
+ <id>module-assembly</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+ <includeBaseDirectory>false</includeBaseDirectory>
+ <baseDirectory>${project.build.finalName}-module</baseDirectory>
+ <fileSets>
+ <fileSet>
+ <directory>${project.build.outputDirectory}/module</directory>
+ <outputDirectory>/org/rhq/${artifactId}</outputDirectory>
+ <includes>
+ <include>main/module.xml</include>
+ </includes>
+ <fileMode>0644</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ <fileSet>
+ <directory>${project.build.directory}</directory>
+ <outputDirectory>/org/rhq/${artifactId}/main</outputDirectory>
+ <includes>
+ <include>${project.build.finalName}.jar</include>
+ </includes>
+ <fileMode>0644</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ <fileSet>
+ <directory>${project.build.directory}/agent</directory>
+ <outputDirectory>/org/rhq/${artifactId}/main/agent</outputDirectory>
+ <fileMode>0644</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ </fileSets>
+</assembly>
+
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemBaseParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemBaseParsingTestCase.java
new file mode 100644
index 0000000..2d5b3a5
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemBaseParsingTestCase.java
@@ -0,0 +1,17 @@
+package org.rhq.embeddedagent.extension;
+
+import java.io.IOException;
+
+import org.jboss.as.subsystem.test.AbstractSubsystemBaseTest;
+
+public class SubsystemBaseParsingTestCase extends AbstractSubsystemBaseTest {
+
+ public SubsystemBaseParsingTestCase() {
+ super(AgentSubsystemExtension.SUBSYSTEM_NAME, new AgentSubsystemExtension());
+ }
+
+ @Override
+ protected String getSubsystemXml() throws IOException {
+ return readResource("subsystem.xml");
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
new file mode 100644
index 0000000..40054b9
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -0,0 +1,301 @@
+package org.rhq.embeddedagent.extension;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIBE;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_OPERATION;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_DESCRIPTION_OPERATION;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jboss.as.controller.PathAddress;
+import org.jboss.as.controller.PathElement;
+import org.jboss.as.subsystem.test.KernelServices;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.Property;
+import org.jboss.msc.service.ServiceNotFoundException;
+import org.testng.Assert;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+@Test
+public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
+
+ @Override
+ @BeforeTest
+ public void initializeParser() throws Exception {
+ super.initializeParser();
+ }
+
+ @Override
+ @AfterTest
+ public void cleanup() throws Exception {
+ super.cleanup();
+ }
+
+ /**
+ * Tests that the xml is parsed into the correct operations
+ */
+ public void testParseSubsystem() throws Exception {
+ // Parse the subsystem xml into operations
+ String subsystemXml = getSubsystemXml();
+ List<ModelNode> operations = super.parse(subsystemXml);
+
+ // /Check that we have the expected number of operations
+ Assert.assertEquals(operations.size(), 1);
+
+ // Check that each operation has the correct content
+ // The add subsystem operation will happen first
+ ModelNode addSubsystem = operations.get(0);
+ Assert.assertEquals(addSubsystem.get(OP).asString(), ADD);
+ PathAddress addr = PathAddress.pathAddress(addSubsystem.get(OP_ADDR));
+ Assert.assertEquals(addr.size(), 1);
+ PathElement element = addr.getElement(0);
+ Assert.assertEquals(element.getKey(), SUBSYSTEM);
+ Assert.assertEquals(element.getValue(), AgentSubsystemExtension.SUBSYSTEM_NAME);
+ Assert.assertEquals(addSubsystem.get(AgentSubsystemExtension.AGENT_ENABLED).asBoolean(), true);
+ List<Property> plugins = addSubsystem.get(AgentSubsystemExtension.PLUGINS_ELEMENT).asPropertyList();
+ Assert.assertEquals(plugins.size(), 2);
+ Assert.assertEquals(plugins.get(0).getName(), "platform"); // platform plugin is first in the xml
+ Assert.assertEquals(plugins.get(0).getValue().asBoolean(), true);
+ Assert.assertEquals(plugins.get(1).getName(), "blah"); // blah plugin is first in the xml
+ Assert.assertEquals(plugins.get(1).getValue().asBoolean(), false);
+ }
+
+ /**
+ * Test that the model created from the xml looks as expected
+ */
+ public void testInstallIntoController() throws Exception {
+ // Parse the subsystem xml and install into the controller
+ String subsystemXml = getSubsystemXml();
+ KernelServices services = super.installInController(subsystemXml);
+
+ // Read the whole model and make sure it looks as expected
+ ModelNode model = services.readWholeModel();
+ // System.out.println(model);
+ Assert.assertTrue(model.get(SUBSYSTEM).hasDefined(AgentSubsystemExtension.SUBSYSTEM_NAME));
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).hasDefined(
+ AgentSubsystemExtension.AGENT_ENABLED));
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME,
+ AgentSubsystemExtension.AGENT_ENABLED).asBoolean());
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).hasDefined(
+ AgentSubsystemExtension.PLUGINS_ELEMENT));
+
+ List<Property> plugins = model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME)
+ .get(AgentSubsystemExtension.PLUGINS_ELEMENT).asPropertyList();
+ Assert.assertEquals(plugins.size(), 2);
+ Assert.assertEquals(plugins.get(0).getName(), "platform"); // platform plugin is first in the xml
+ Assert.assertEquals(plugins.get(0).getValue().asBoolean(), true);
+ Assert.assertEquals(plugins.get(1).getName(), "blah"); // blah plugin is first in the xml
+ Assert.assertEquals(plugins.get(1).getValue().asBoolean(), false);
+
+ // Sanity check to test the service was there
+ AgentService agent = (AgentService) services.getContainer().getRequiredService(AgentService.SERVICE_NAME)
+ .getValue();
+ assert 2 == agent.getPlugins().size();
+ Assert.assertTrue(agent.getPlugins().get("platform"));
+ Assert.assertFalse(agent.getPlugins().get("blah"));
+ }
+
+ /**
+ * Starts a controller with a given subsystem xml and then checks that a second controller started with the xml
+ * marshalled from the first one results in the same model
+ */
+ public void testParseAndMarshalModel() throws Exception {
+ // Parse the subsystem xml and install into the first controller
+ String subsystemXml = getSubsystemXml();
+ KernelServices servicesA = super.installInController(subsystemXml);
+ // Get the model and the persisted xml from the first controller
+ ModelNode modelA = servicesA.readWholeModel();
+ String marshalled = servicesA.getPersistedSubsystemXml();
+
+ // Install the persisted xml from the first controller into a second controller
+ KernelServices servicesB = super.installInController(marshalled);
+ ModelNode modelB = servicesB.readWholeModel();
+
+ // Make sure the models from the two controllers are identical
+ super.compare(modelA, modelB);
+ }
+
+ /**
+ * Starts a controller with the given subsystem xml and then checks that a second controller started with the
+ * operations from its describe action results in the same model
+ */
+ public void testDescribeHandler() throws Exception {
+ // test two subsystem xmls - one that is empty of plugins, and the second is our normal test xml
+ String subsystemXml1 = "<subsystem xmlns=\"" + AgentSubsystemExtension.NAMESPACE + "\" "
+ + AgentSubsystemExtension.AGENT_ENABLED + "=\"true\"" + "></subsystem>";
+ String subsystemXml2 = getSubsystemXml();
+
+ String[] subsystemXmlAll = new String[] { subsystemXml1, subsystemXml2 };
+ for (String subsystemXml : subsystemXmlAll) {
+ KernelServices servicesA = super.installInController(subsystemXml);
+ // Get the model and the describe operations from the first controller
+ ModelNode modelA = servicesA.readWholeModel();
+ ModelNode describeOp = new ModelNode();
+ describeOp.get(OP).set(DESCRIBE);
+ describeOp.get(OP_ADDR).set(
+ PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME))
+ .toModelNode());
+ ModelNode executeOperation = servicesA.executeOperation(describeOp);
+ List<ModelNode> operations = super.checkResultAndGetContents(executeOperation).asList();
+
+ // Install the describe options from the first controller into a second controller
+ KernelServices servicesB = super.installInController(operations);
+ ModelNode modelB = servicesB.readWholeModel();
+
+ // Make sure the models from the two controllers are identical
+ super.compare(modelA, modelB);
+ }
+ }
+
+ /**
+ * Tests that the subsystem can be removed
+ */
+ public void testSubsystemRemoval() throws Exception {
+ // Parse the subsystem xml and install into the first controller
+ String subsystemXml = getSubsystemXml();
+ KernelServices services = super.installInController(subsystemXml);
+
+ // Sanity check to test the service was there
+ AgentService agent = (AgentService) services.getContainer().getRequiredService(AgentService.SERVICE_NAME)
+ .getValue();
+ Assert.assertEquals(agent.getPlugins().size(), 2);
+
+ // Checks that the subsystem was removed from the model
+ super.assertRemoveSubsystemResources(services);
+
+ // Check that the services that was installed was removed
+ try {
+ services.getContainer().getRequiredService(AgentService.SERVICE_NAME);
+ assert false : "The service should have been removed along with the subsystem";
+ } catch (ServiceNotFoundException expected) {
+ // test passed!
+ }
+ }
+
+ public void testResourceDescription() throws Exception {
+ String subsystemXml = getSubsystemXml();
+ KernelServices services = super.installInController(subsystemXml);
+
+ PathAddress agentSubsystemPath = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM,
+ AgentSubsystemExtension.SUBSYSTEM_NAME));
+
+ // ask for resource description: /subsystem=embeddedagent:read-resource-description
+ ModelNode resourceDescriptionOp = new ModelNode();
+ resourceDescriptionOp.get(OP).set(READ_RESOURCE_DESCRIPTION_OPERATION);
+ resourceDescriptionOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
+ resourceDescriptionOp.get("operations").set(true); // we want to see the operations also
+ ModelNode result = services.executeOperation(resourceDescriptionOp);
+ ModelNode content = checkResultAndGetContents(result);
+
+ // check the attributes
+ Assert.assertTrue(content.get("attributes").isDefined());
+ List<Property> attributes = content.get("attributes").asPropertyList();
+ Assert.assertEquals(attributes.size(), 2);
+ Assert.assertEquals(attributes.get(0).getName(), AgentSubsystemExtension.AGENT_ENABLED);
+ Assert.assertEquals(attributes.get(1).getName(), AgentSubsystemExtension.PLUGINS_ELEMENT);
+
+ // check the operations
+ Assert.assertTrue(content.get("operations").isDefined());
+ List<Property> operations = content.get("operations").asPropertyList();
+ List<String> operationNames = new ArrayList<String>();
+ for (Property op : operations) {
+ operationNames.add(op.getName());
+ }
+ Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_RESTART_OP));
+ Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_STOP_OP));
+ Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_STATUS_OP));
+ }
+
+ public void testExecuteOperations() throws Exception {
+ String subsystemXml = getSubsystemXml();
+ KernelServices services = super.installInController(subsystemXml);
+
+ // status check - our service should be available and have 2 plugin definitions
+ AgentService service = (AgentService) services.getContainer().getService(AgentService.SERVICE_NAME).getValue();
+ Assert.assertEquals(service.getPlugins().size(), 2);
+
+ PathAddress agentSubsystemPath = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM,
+ AgentSubsystemExtension.SUBSYSTEM_NAME));
+
+ // get the startup model from subsystem xml
+ ModelNode model = services.readWholeModel();
+
+ // current list of plugins from the attribute
+ ModelNode pluginsNode = model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).get(
+ AgentSubsystemExtension.PLUGINS_ELEMENT);
+
+ // Add another plugin
+ pluginsNode.add("foo", true);
+ ModelNode addOp = new ModelNode();
+ addOp.get(OP).set(WRITE_ATTRIBUTE_OPERATION);
+ addOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
+ addOp.get(NAME).set(AgentSubsystemExtension.PLUGINS_ELEMENT);
+ addOp.get(VALUE).set(pluginsNode);
+ ModelNode result = services.executeOperation(addOp);
+ Assert.assertEquals(result.get(OUTCOME).asString(), SUCCESS);
+
+ // now test that things are as they should be
+ model = services.readWholeModel();
+ Assert.assertTrue(model.get(SUBSYSTEM).hasDefined(AgentSubsystemExtension.SUBSYSTEM_NAME));
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).hasDefined(
+ AgentSubsystemExtension.AGENT_ENABLED));
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME,
+ AgentSubsystemExtension.AGENT_ENABLED).asBoolean());
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).hasDefined(
+ AgentSubsystemExtension.PLUGINS_ELEMENT));
+
+ List<Property> plugins = model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME)
+ .get(AgentSubsystemExtension.PLUGINS_ELEMENT).asPropertyList();
+ Assert.assertEquals(plugins.size(), 3); // there were 2, but we added "foo" above
+ Assert.assertEquals(plugins.get(0).getName(), "platform"); // platform plugin is first in the xml
+ Assert.assertEquals(plugins.get(0).getValue().asBoolean(), true);
+ Assert.assertEquals(plugins.get(1).getName(), "blah"); // blah plugin is first in the xml
+ Assert.assertEquals(plugins.get(1).getValue().asBoolean(), false);
+ Assert.assertEquals(plugins.get(2).getName(), "foo"); // foo plugin we added above
+ Assert.assertEquals(plugins.get(2).getValue().asBoolean(), true);
+
+ // we enabled a new plugin - now should have 3 now
+ Assert.assertEquals(service.getPlugins().size(), 3);
+ Assert.assertTrue(service.getPlugins().get("platform"));
+ Assert.assertFalse(service.getPlugins().get("blah"));
+ Assert.assertTrue(service.getPlugins().get("foo"));
+
+ // Use read-attribute instead of reading the whole model to get an attribute value
+ ModelNode readOp = new ModelNode();
+ readOp.get(OP).set(READ_ATTRIBUTE_OPERATION);
+ readOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
+ readOp.get(NAME).set(AgentSubsystemExtension.AGENT_ENABLED);
+ result = services.executeOperation(readOp);
+ Assert.assertTrue(checkResultAndGetContents(result).asBoolean());
+
+ readOp.get(NAME).set(AgentSubsystemExtension.PLUGINS_ELEMENT);
+ result = services.executeOperation(readOp);
+ ModelNode content = checkResultAndGetContents(result);
+ plugins = content.asPropertyList();
+ Assert.assertEquals(plugins.size(), 3); // there were 2, but we added "foo" above
+ Assert.assertEquals(plugins.get(0).getName(), "platform"); // platform plugin is first in the xml
+ Assert.assertEquals(plugins.get(0).getValue().asBoolean(), true);
+ Assert.assertEquals(plugins.get(1).getName(), "blah"); // blah plugin is first in the xml
+ Assert.assertEquals(plugins.get(1).getValue().asBoolean(), false);
+ Assert.assertEquals(plugins.get(2).getName(), "foo"); // foo plugin we added above
+ Assert.assertEquals(plugins.get(2).getValue().asBoolean(), true);
+
+ // execute status
+ ModelNode statusOp = new ModelNode();
+ statusOp.get(OP).set(AgentSubsystemExtension.AGENT_STATUS_OP);
+ statusOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
+ result = services.executeOperation(statusOp);
+ Assert.assertEquals(checkResultAndGetContents(result).asString(), "STARTED");
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
new file mode 100644
index 0000000..4e4a85d
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -0,0 +1,6 @@
+<subsystem xmlns="urn:org.rhq:embeddedagent:1.0" enabled="true">
+ <plugins>
+ <plugin name="platform" enabled="true" />
+ <plugin name="blah" enabled="false" />
+ </plugins>
+</subsystem>
\ No newline at end of file
commit e4aedd0e706f38c069fad3570ead986576723d33
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Feb 3 17:19:54 2014 -0500
add ability to set generic config preferences
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 115f74b..154d5d8 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -43,6 +43,7 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SOCKET_BINDING_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.CUSTOM_CONFIG_ATTRIBDEF.validateAndSet(operation, model);
log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@@ -85,6 +86,20 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_TRANSPORT_ATTRIBDEF);
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_TRANSPORT_PARAMS_ATTRIBDEF);
+ // allow the user to provide their own overrides
+ ModelNode customConfigNode = AgentSubsystemDefinition.CUSTOM_CONFIG_ATTRIBDEF.resolveModelAttribute(context,
+ model);
+ if (customConfigNode != null && customConfigNode.isDefined()) {
+ HashMap<String, String> customConfig = new HashMap<String, String>();
+ List<Property> prefList = customConfigNode.asPropertyList();
+ for (Property pref : prefList) {
+ String name = pref.getName();
+ String val = pref.getValue().asString();
+ customConfig.put(name, val);
+ }
+ overrides.putAll(customConfig);
+ }
+
// create our service
AgentService service = new AgentService();
service.setPlugins(pluginsWithEnableFlag);
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index 78d274b..1224d84 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -30,6 +30,8 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
+ protected static final CustomConfigAttributeDefinition CUSTOM_CONFIG_ATTRIBDEF = new CustomConfigAttributeDefinition();
+
protected static final SimpleAttributeDefinition AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_AGENT_NAME, ModelType.STRING).setAllowExpression(true)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
@@ -97,6 +99,7 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
public void registerAttributes(ManagementResourceRegistration rr) {
rr.registerReadWriteAttribute(AGENT_ENABLED_ATTRIBDEF, null, AgentEnabledAttributeHandler.INSTANCE);
rr.registerReadWriteAttribute(PLUGINS_ATTRIBDEF, null, PluginsAttributeHandler.INSTANCE);
+ registerReloadRequiredWriteAttributeHandler(rr, CUSTOM_CONFIG_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, AGENT_NAME_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, DISABLE_NATIVE_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_ATTRIBDEF);
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 637b7a8..4463ad9 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -17,6 +17,7 @@ import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.SubsystemRegistration;
import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver;
+import org.jboss.as.controller.parsing.Attribute;
import org.jboss.as.controller.parsing.ExtensionParsingContext;
import org.jboss.as.controller.parsing.ParseUtils;
import org.jboss.as.controller.persistence.SubsystemMarshallingContext;
@@ -51,6 +52,8 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_ENABLED = "enabled";
protected static final boolean AGENT_ENABLED_DEFAULT = false;
protected static final boolean PLUGIN_ENABLED_DEFAULT = true;
+ protected static final String AGENT_CONFIG_ELEMENT = "extra-configuration";
+ protected static final String PREFERENCE_ELEMENT = "preference";
protected static final String SERVER_ENDPOINT_ELEMENT = "server-endpoint";
protected static final String SERVER_ENDPOINT_ADDRESS_XML = "address";
protected static final String SERVER_ENDPOINT_PORT_XML = "port";
@@ -131,6 +134,13 @@ public class AgentSubsystemExtension implements Extension {
readPlugin(reader, pluginsAttributeNode);
}
}
+ } else if (elementName.equals(AGENT_CONFIG_ELEMENT)) {
+ ModelNode configAttributeNode = opAdd.get(AGENT_CONFIG_ELEMENT);
+ while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
+ if (reader.isStartElement()) {
+ readPreference(reader, configAttributeNode);
+ }
+ }
} else if (elementName.equals(SERVER_ENDPOINT_ELEMENT)) {
String val = reader.getAttributeValue(null, SERVER_ENDPOINT_ADDRESS_XML);
if (val != null) {
@@ -206,6 +216,21 @@ public class AgentSubsystemExtension implements Extension {
pluginsAttributeNode.add(pluginName, pluginEnabled);
}
+ private void readPreference(XMLExtendedStreamReader reader, ModelNode configAttributeNode)
+ throws XMLStreamException {
+
+ if (!reader.getLocalName().equals(PREFERENCE_ELEMENT)) {
+ throw ParseUtils.unexpectedElement(reader);
+ }
+
+ ParseUtils.requireAttributes(reader, Attribute.NAME.getLocalName(), Attribute.VALUE.getLocalName());
+ String attr = reader.getAttributeValue(null, Attribute.NAME.getLocalName());
+ String val = reader.getAttributeValue(null, Attribute.VALUE.getLocalName());
+ ParseUtils.requireNoContent(reader);
+
+ configAttributeNode.add(attr, val);
+ }
+
@Override
public void writeContent(final XMLExtendedStreamWriter writer, final SubsystemMarshallingContext context)
throws XMLStreamException {
@@ -261,6 +286,22 @@ public class AgentSubsystemExtension implements Extension {
// </agent-endpoint>
writer.writeEndElement();
+ // <extra-configuration>
+ writer.writeStartElement(AGENT_CONFIG_ELEMENT);
+ ModelNode configNode = node.get(AGENT_CONFIG_ELEMENT);
+ if (configNode != null && configNode.isDefined()) {
+ for (Property property : configNode.asPropertyList()) {
+ // <preference>
+ writer.writeStartElement(PREFERENCE_ELEMENT);
+ writer.writeAttribute(Attribute.NAME.getLocalName(), property.getName());
+ writer.writeAttribute(Attribute.VALUE.getLocalName(), property.getValue().asString());
+ // </preference>
+ writer.writeEndElement();
+ }
+ }
+ // </extra-configuration>
+ writer.writeEndElement();
+
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
ModelNode plugins = node.get(PLUGINS_ELEMENT);
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/CustomConfigAttributeDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/CustomConfigAttributeDefinition.java
new file mode 100644
index 0000000..5129f3d
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/CustomConfigAttributeDefinition.java
@@ -0,0 +1,61 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.jboss.as.controller.MapAttributeDefinition;
+import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
+import org.jboss.as.controller.descriptions.ResourceDescriptionResolver;
+import org.jboss.as.controller.operations.validation.ModelTypeValidator;
+import org.jboss.as.controller.parsing.Attribute;
+import org.jboss.as.controller.registry.AttributeAccess.Flag;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.ModelType;
+
+/**
+ * A generic catch-all to allow the agent to have any config preference set.
+ *
+ * @author John Mazzitelli
+ */
+public class CustomConfigAttributeDefinition extends MapAttributeDefinition {
+
+ public CustomConfigAttributeDefinition() {
+ super(AgentSubsystemExtension.AGENT_CONFIG_ELEMENT, AgentSubsystemExtension.AGENT_CONFIG_ELEMENT, true,
+ 0, Integer.MAX_VALUE, new ModelTypeValidator(ModelType.STRING), null, null, Flag.RESTART_RESOURCE_SERVICES);
+ }
+
+ @Override
+ protected void addValueTypeDescription(ModelNode node, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ protected void addAttributeValueTypeDescription(ModelNode node, ResourceDescriptionResolver resolver,
+ Locale locale, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ protected void addOperationParameterValueTypeDescription(ModelNode node, String operationName,
+ ResourceDescriptionResolver resolver, Locale locale, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ public void marshallAsElement(ModelNode resourceModel, XMLStreamWriter writer) throws XMLStreamException {
+ if (!isMarshallable(resourceModel))
+ return;
+
+ resourceModel = resourceModel.get(getName());
+ writer.writeStartElement(getName());
+ for (ModelNode property : resourceModel.asList()) {
+ writer.writeEmptyElement(getXmlName());
+ writer.writeAttribute(Attribute.NAME.getLocalName(), property.asProperty().getName());
+ writer.writeAttribute(Attribute.VALUE.getLocalName(), property.asProperty().getValue().asString());
+ }
+ writer.writeEndElement();
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index 680f9f2..f4b08d1 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -6,6 +6,7 @@ embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
+embeddedagent.extra-configuration=Additional preference values used to configure the agent
embeddedagent.socket-binding=Determines the binding address and port the agent listens to for incoming server messages.
embeddedagent.rhq.communications.connector.transport=The transport server must use to communicate with the agent.
embeddedagent.rhq.communications.connector.transport-params=The transport parameters the server must use to communicate with the agent.
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index a116308..3439cf2 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -15,6 +15,7 @@
<xs:element name="rhq.agent.server.alias" type="xs:string"/>
<xs:element name="server-endpoint" type="serverEndpointType"/>
<xs:element name="agent-endpoint" type="agentEndpointType"/>
+ <xs:element name="extra-configuration" type="extraConfigurationType"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
@@ -41,4 +42,14 @@
<xs:attribute name="name" use="required"/>
<xs:attribute name="enabled" type="xs:boolean" use="required" default="true"/>
</xs:complexType>
+
+ <xs:complexType name="extraConfigurationType">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="preference" type="preferenceType"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="preferenceType">
+ <xs:attribute name="name" use="required"/>
+ <xs:attribute name="value" use="required"/>
+ </xs:complexType>
</xs:schema>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index b6126a0..5c2f3d4 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -198,6 +198,7 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
List<Property> attributes = content.get("attributes").asPropertyList();
List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.AGENT_CONFIG_ELEMENT, //
AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT_PARAMS, //
AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT, //
AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, //
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index d4ea3c8..c847ee6 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -6,6 +6,11 @@
<server-endpoint port="7080" transport="test-transport" transport-params="test-transport-params" />
<agent-endpoint socket-binding="embeddedagent" transport="socket"/>
+ <extra-configuration>
+ <preference name="custom-prop" value="custom-prop-val"/>
+ <preference name="custom-prop2" value="custom-prop-val2"/>
+ </extra-configuration>
+
<plugins>
<plugin name="platform" enabled="true" />
<plugin name="blah" enabled="false" />
commit 4a04637133039124295b673274e0853fbdf35050
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Feb 3 15:46:27 2014 -0500
add transport agent-endpoint configurability
make server endpoing configured via one element with some attribs
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 937af70..115f74b 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -82,6 +82,8 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_BIND_ADDRESS_ATTRIBDEF);
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_TRANSPORT_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_TRANSPORT_PARAMS_ATTRIBDEF);
// create our service
AgentService service = new AgentService();
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index ad50c4e..78d274b 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -17,6 +17,7 @@ import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.rhq.enterprise.agent.AgentConfigurationConstants;
+import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
public class AgentSubsystemDefinition extends SimpleResourceDefinition {
@@ -31,50 +32,61 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
protected static final SimpleAttributeDefinition AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_AGENT_NAME, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_AGENT_NAME).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setAllowNull(true).build();
protected static final SimpleAttributeDefinition DISABLE_NATIVE_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE, ModelType.BOOLEAN).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
- protected static final SimpleAttributeDefinition SERVER_TRANSPORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
- AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT)
- .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
- .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT)).setAllowNull(false)
- .build();
+ protected static final SimpleAttributeDefinition SERVER_BIND_ADDRESS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.SERVER_ENDPOINT_ADDRESS_XML)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
protected static final SimpleAttributeDefinition SERVER_BIND_PORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT)
+ .setXmlName(AgentSubsystemExtension.SERVER_ENDPOINT_PORT_XML)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_BIND_PORT)).setAllowNull(false)
.build();
- protected static final SimpleAttributeDefinition SERVER_BIND_ADDRESS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
- AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS)
- .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
+ protected static final SimpleAttributeDefinition SERVER_TRANSPORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.SERVER_ENDPOINT_TRANSPORT_XML)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT)).setAllowNull(false)
+ .build();
protected static final SimpleAttributeDefinition SERVER_TRANSPORT_PARAMS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS)
+ .setXmlName(AgentSubsystemExtension.SERVER_ENDPOINT_TRANSPORT_XML)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT_PARAMS))
.setAllowNull(false).build();
protected static final SimpleAttributeDefinition SERVER_ALIAS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_SERVER_ALIAS, ModelType.STRING).setAllowExpression(true)
- .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_ALIAS)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
protected static final SimpleAttributeDefinition SOCKET_BINDING_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, ModelType.STRING)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setDefaultValue(new ModelNode("embeddedagent"))
+ .setValidator(new StringLengthValidator(1)).setAllowNull(false).build();
+
+ protected static final SimpleAttributeDefinition AGENT_TRANSPORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.AGENT_ENDPOINT_TRANSPORT_XML)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
- .setDefaultValue(new ModelNode("embeddedagent")).setValidator(new StringLengthValidator(1)).setAllowNull(false)
- .build();
+ .setDefaultValue(new ModelNode(ServiceContainerConfigurationConstants.DEFAULT_CONNECTOR_TRANSPORT))
+ .setAllowNull(true).build();
+
+ protected static final SimpleAttributeDefinition AGENT_TRANSPORT_PARAMS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT_PARAMS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.AGENT_ENDPOINT_TRANSPORT_PARAMS_XML)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(ServiceContainerConfigurationConstants.DEFAULT_CONNECTOR_TRANSPORT_PARAMS))
+ .setAllowNull(true).build();
private AgentSubsystemDefinition() {
super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
@@ -93,6 +105,8 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SERVER_ALIAS_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SOCKET_BINDING_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, AGENT_TRANSPORT_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, AGENT_TRANSPORT_PARAMS_ATTRIBDEF);
}
private void registerReloadRequiredWriteAttributeHandler(ManagementResourceRegistration rr, AttributeDefinition def) {
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 4374c7e..637b7a8 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -30,6 +30,7 @@ import org.jboss.staxmapper.XMLExtendedStreamReader;
import org.jboss.staxmapper.XMLExtendedStreamWriter;
import org.rhq.enterprise.agent.AgentConfigurationConstants;
+import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
public class AgentSubsystemExtension implements Extension {
@@ -50,6 +51,15 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_ENABLED = "enabled";
protected static final boolean AGENT_ENABLED_DEFAULT = false;
protected static final boolean PLUGIN_ENABLED_DEFAULT = true;
+ protected static final String SERVER_ENDPOINT_ELEMENT = "server-endpoint";
+ protected static final String SERVER_ENDPOINT_ADDRESS_XML = "address";
+ protected static final String SERVER_ENDPOINT_PORT_XML = "port";
+ protected static final String SERVER_ENDPOINT_TRANSPORT_XML = "transport";
+ protected static final String SERVER_ENDPOINT_TRANSPORT_PARAMS_XML = "transport-params";
+ protected static final String AGENT_ENDPOINT_ELEMENT = "agent-endpoint";
+ protected static final String AGENT_ENDPOINT_SOCKET_BINDING_XML = "socket-binding";
+ protected static final String AGENT_ENDPOINT_TRANSPORT_XML = "transport";
+ protected static final String AGENT_ENDPOINT_TRANSPORT_PARAMS_XML = "transport-params";
protected static final String AGENT_RESTART_OP = "restart";
protected static final String AGENT_STOP_OP = "stop";
@@ -62,10 +72,13 @@ public class AgentSubsystemExtension implements Extension {
protected static final String ATTRIB_SERVER_BIND_ADDRESS = AgentConfigurationConstants.SERVER_BIND_ADDRESS;
protected static final String ATTRIB_SERVER_TRANSPORT_PARAMS = AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS;
protected static final String ATTRIB_SERVER_ALIAS = AgentConfigurationConstants.SERVER_ALIAS;
- protected static final String ATTRIB_SOCKET_BINDING = "socket-binding";
+ protected static final String ATTRIB_SOCKET_BINDING = AGENT_ENDPOINT_SOCKET_BINDING_XML;
+ protected static final String ATTRIB_AGENT_TRANSPORT = ServiceContainerConfigurationConstants.CONNECTOR_TRANSPORT;
+ protected static final String ATTRIB_AGENT_TRANSPORT_PARAMS = ServiceContainerConfigurationConstants.CONNECTOR_TRANSPORT_PARAMS;
protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
+
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
String prefix = SUBSYSTEM_NAME + (keyPrefix == null ? "" : "." + keyPrefix);
return new StandardResourceDescriptionResolver(prefix, RESOURCE_NAME,
@@ -118,22 +131,44 @@ public class AgentSubsystemExtension implements Extension {
readPlugin(reader, pluginsAttributeNode);
}
}
+ } else if (elementName.equals(SERVER_ENDPOINT_ELEMENT)) {
+ String val = reader.getAttributeValue(null, SERVER_ENDPOINT_ADDRESS_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SERVER_BIND_ADDRESS).set(val);
+ }
+ val = reader.getAttributeValue(null, SERVER_ENDPOINT_PORT_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SERVER_BIND_PORT).set(val);
+ }
+ val = reader.getAttributeValue(null, SERVER_ENDPOINT_TRANSPORT_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SERVER_TRANSPORT).set(val);
+ }
+ val = reader.getAttributeValue(null, SERVER_ENDPOINT_TRANSPORT_PARAMS_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SERVER_TRANSPORT_PARAMS).set(val);
+ }
+ ParseUtils.requireNoContent(reader);
+ } else if (elementName.equals(AGENT_ENDPOINT_ELEMENT)) {
+ String val = reader.getAttributeValue(null, AGENT_ENDPOINT_SOCKET_BINDING_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_SOCKET_BINDING).set(val);
+ }
+ val = reader.getAttributeValue(null, AGENT_ENDPOINT_TRANSPORT_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_AGENT_TRANSPORT).set(val);
+ }
+ val = reader.getAttributeValue(null, AGENT_ENDPOINT_TRANSPORT_PARAMS_XML);
+ if (val != null) {
+ opAdd.get(ATTRIB_AGENT_TRANSPORT_PARAMS).set(val);
+ }
+ ParseUtils.requireNoContent(reader);
} else if (elementName.equals(ATTRIB_AGENT_NAME)) {
opAdd.get(ATTRIB_AGENT_NAME).set(reader.getElementText());
} else if (elementName.equals(ATTRIB_DISABLE_NATIVE)) {
opAdd.get(ATTRIB_DISABLE_NATIVE).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SERVER_TRANSPORT)) {
- opAdd.get(ATTRIB_SERVER_TRANSPORT).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SERVER_BIND_PORT)) {
- opAdd.get(ATTRIB_SERVER_BIND_PORT).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SERVER_BIND_ADDRESS)) {
- opAdd.get(ATTRIB_SERVER_BIND_ADDRESS).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SERVER_TRANSPORT_PARAMS)) {
- opAdd.get(ATTRIB_SERVER_TRANSPORT_PARAMS).set(reader.getElementText());
} else if (elementName.equals(ATTRIB_SERVER_ALIAS)) {
opAdd.get(ATTRIB_SERVER_ALIAS).set(reader.getElementText());
- } else if (elementName.equals(ATTRIB_SOCKET_BINDING)) {
- opAdd.get(ATTRIB_SOCKET_BINDING).set(reader.getElementText());
} else {
throw ParseUtils.unexpectedElement(reader);
}
@@ -184,12 +219,47 @@ public class AgentSubsystemExtension implements Extension {
// our config elements
writeElement(writer, node, ATTRIB_AGENT_NAME);
writeElement(writer, node, ATTRIB_DISABLE_NATIVE);
- writeElement(writer, node, ATTRIB_SERVER_TRANSPORT);
- writeElement(writer, node, ATTRIB_SERVER_BIND_PORT);
- writeElement(writer, node, ATTRIB_SERVER_BIND_ADDRESS);
- writeElement(writer, node, ATTRIB_SERVER_TRANSPORT_PARAMS);
writeElement(writer, node, ATTRIB_SERVER_ALIAS);
- writeElement(writer, node, ATTRIB_SOCKET_BINDING);
+
+ // <server-endpoint>
+ writer.writeStartElement(SERVER_ENDPOINT_ELEMENT);
+ ModelNode serverAddressNode = node.get(ATTRIB_SERVER_BIND_ADDRESS);
+ ModelNode serverPortNode = node.get(ATTRIB_SERVER_BIND_PORT);
+ ModelNode serverTransportNode = node.get(ATTRIB_SERVER_TRANSPORT);
+ ModelNode serverTransportParamsNode = node.get(ATTRIB_SERVER_TRANSPORT_PARAMS);
+
+ if (serverPortNode.isDefined()) {
+ writer.writeAttribute(SERVER_ENDPOINT_PORT_XML, serverPortNode.asString());
+ }
+ if (serverAddressNode.isDefined()) {
+ writer.writeAttribute(SERVER_ENDPOINT_ADDRESS_XML, serverAddressNode.asString());
+ }
+ if (serverTransportNode.isDefined()) {
+ writer.writeAttribute(SERVER_ENDPOINT_TRANSPORT_XML, serverTransportNode.asString());
+ }
+ if (serverTransportParamsNode.isDefined()) {
+ writer.writeAttribute(SERVER_ENDPOINT_TRANSPORT_PARAMS_XML, serverTransportParamsNode.asString());
+ }
+ // </server-endpoint>
+ writer.writeEndElement();
+
+ // <agent-endpoint>
+ writer.writeStartElement(AGENT_ENDPOINT_ELEMENT);
+ ModelNode agentSocketBindingNode = node.get(ATTRIB_SOCKET_BINDING);
+ ModelNode agentTransportNode = node.get(ATTRIB_AGENT_TRANSPORT);
+ ModelNode agentTransportParamsNode = node.get(ATTRIB_AGENT_TRANSPORT_PARAMS);
+
+ if (agentSocketBindingNode.isDefined()) {
+ writer.writeAttribute(AGENT_ENDPOINT_SOCKET_BINDING_XML, agentSocketBindingNode.asString());
+ }
+ if (agentTransportNode.isDefined()) {
+ writer.writeAttribute(AGENT_ENDPOINT_TRANSPORT_XML, agentTransportNode.asString());
+ }
+ if (agentTransportParamsNode.isDefined()) {
+ writer.writeAttribute(AGENT_ENDPOINT_TRANSPORT_PARAMS_XML, agentTransportParamsNode.asString());
+ }
+ // </agent-endpoint>
+ writer.writeEndElement();
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index e2badfc..680f9f2 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -7,6 +7,8 @@ embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
embeddedagent.socket-binding=Determines the binding address and port the agent listens to for incoming server messages.
+embeddedagent.rhq.communications.connector.transport=The transport server must use to communicate with the agent.
+embeddedagent.rhq.communications.connector.transport-params=The transport parameters the server must use to communicate with the agent.
embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
embeddedagent.rhq.agent.disable-native-system=The RHQ Agent has a native system on certain supported platforms to help the \n\
plugin container perform discovery of native components on those platforms. \n\
@@ -20,4 +22,4 @@ alias (see rhq.agent.server.alias), and if that is not defined \n\
the RHQ Agent will default to localhost or 127.0.0.1.
embeddedagent.rhq.agent.server.transport-params=Communications transport parameters used when sending messages to the RHQ Server.
embeddedagent.rhq.agent.server.alias=If the server address is not defined, this is the DNS alias name the \n\
-RHQ Agent will resolve and use for the server address.
+RHQ Agent will resolve and use for the server address.
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index d587e23..a116308 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -11,17 +11,27 @@
<xs:attribute name="enabled" type="xs:boolean" use="required" default="false"/>
<xs:all>
<xs:element name="rhq.agent.name" type="xs:string"/>
- <xs:element name="rhq.agent.disable-native-system" type="xs:boolean" use="optional"/>
- <xs:element name="rhq.agent.server.transport" type="xs:string"/>
- <xs:element name="rhq.agent.server.bind-port" type="xs:integer"/>
- <xs:element name="rhq.agent.server.bind-address" type="xs:string" use="optional"/>
- <xs:element name="rhq.agent.server.transport-params" type="xs:string" />
- <xs:element name="rhq.agent.server.alias" type="xs:string" use="optional"/>
- <xs:element name="socket-binding" type="xs:string"/>
+ <xs:element name="rhq.agent.disable-native-system" type="xs:boolean"/>
+ <xs:element name="rhq.agent.server.alias" type="xs:string"/>
+ <xs:element name="server-endpoint" type="serverEndpointType"/>
+ <xs:element name="agent-endpoint" type="agentEndpointType"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
+ <xs:complexType name="serverEndpointType">
+ <xs:attribute name="address"/>
+ <xs:attribute name="port" type="xs:integer"/>
+ <xs:attribute name="transport"/>
+ <xs:attribute name="transport-params"/>
+ </xs:complexType>
+
+ <xs:complexType name="agentEndpointType">
+ <xs:attribute name="socket-binding"/>
+ <xs:attribute name="transport"/>
+ <xs:attribute name="transport-params"/>
+ </xs:complexType>
+
<xs:complexType name="pluginsType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="plugin" type="pluginType"/>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index 0f3a8fa..b6126a0 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -198,6 +198,8 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
List<Property> attributes = content.get("attributes").asPropertyList();
List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT_PARAMS, //
+ AgentSubsystemExtension.ATTRIB_AGENT_TRANSPORT, //
AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, //
AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, //
AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, //
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index 09da3f6..d4ea3c8 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -1,13 +1,10 @@
<subsystem xmlns="urn:org.rhq:embeddedagent:1.0" enabled="true">
<rhq.agent.name>embeddedagent-test</rhq.agent.name>
<!-- <rhq.agent.disable-native-system>true</rhq.agent.disable-native-system> -->
- <rhq.agent.server.transport>test-transport</rhq.agent.server.transport>
- <rhq.agent.server.bind-port>12345</rhq.agent.server.bind-port>
- <!-- <rhq.agent.server.bind-address>test-bind-address</rhq.agent.server.bind-address> -->
- <rhq.agent.server.transport-params>test-transport-params</rhq.agent.server.transport-params>
<!-- <rhq.agent.server.alias>test-alias</rhq.agent.server.alias> -->
- <socket-binding>embeddedagent</socket-binding>
+ <server-endpoint port="7080" transport="test-transport" transport-params="test-transport-params" />
+ <agent-endpoint socket-binding="embeddedagent" transport="socket"/>
<plugins>
<plugin name="platform" enabled="true" />
commit de47fe216953166ed41e6efefaca243703c8282f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Feb 3 13:43:15 2014 -0500
add ability to define agent binding addr/port in EAP config xml
diff --git a/.classpath b/.classpath
index 455f739..4916f67 100644
--- a/.classpath
+++ b/.classpath
@@ -334,9 +334,11 @@
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-ejb3/7.2.0.Alpha1-redhat-4/jboss-as-ejb3-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-ejb3/7.2.0.Alpha1-redhat-4/jboss-as-ejb3-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/staxmapper/1.1.0.Final/staxmapper-1.1.0.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/modules/jboss-modules/1.1.1.GA/jboss-modules-1.1.1.GA.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-subsystem-test/7.1.1.Final/jboss-as-subsystem-test-7.1.1.Final.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller/7.1.1.Final/jboss-as-controller-7.1.1.Final.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-controller/7.2.0.Alpha1-redhat-4/jboss-as-controller-7.2.0.Alpha1-redhat-4-sources.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller-client/7.1.1.Final/jboss-as-controller-client-7.1.1.Final.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-subsystem-test/7.2.0.Alpha1-redhat-4/jboss-as-subsystem-test-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-subsystem-test/7.2.0.Alpha1-redhat-4/jboss-as-subsystem-test-7.2.0.Alpha1-redhat-4-sources.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller/7.2.0.Alpha1-redhat-4/jboss-as-controller-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-controller/7.2.0.Alpha1-redhat-4/jboss-as-controller-7.2.0.Alpha1-redhat-4-sources.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller-client/7.2.0.Alpha1-redhat-4/jboss-as-controller-client-7.2.0.Alpha1-redhat-4.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-model-test/7.2.0.Alpha1-redhat-4/jboss-as-model-test-7.2.0.Alpha1-redhat-4.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-network/7.2.0.Alpha1-redhat-4/jboss-as-network-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-network/7.2.0.Alpha1-redhat-4/jboss-as-network-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-links/2.3.5.Final/resteasy-links-2.3.5.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-jaxrs/2.3.5.Final/resteasy-jaxrs-2.3.5.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-jackson-provider/2.3.5.Final/resteasy-jackson-provider-2.3.5.Final.jar"/>
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 018519d..651f557 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -6,6 +6,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
+import org.jboss.as.network.SocketBinding;
import org.jboss.as.server.ServerEnvironment;
import org.jboss.logging.Logger;
import org.jboss.modules.Module;
@@ -18,6 +19,7 @@ import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
import org.rhq.enterprise.agent.AgentMain;
+import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
public class AgentService implements Service<AgentService> {
@@ -31,7 +33,13 @@ public class AgentService implements Service<AgentService> {
* This service gives us information about the server, like the install directory, data directory, etc.
* Package-scoped so the add-step handler can access this.
*/
- InjectedValue<ServerEnvironment> envServiceValue = new InjectedValue<ServerEnvironment>();
+ final InjectedValue<ServerEnvironment> envServiceValue = new InjectedValue<ServerEnvironment>();
+
+ /**
+ * Our subsystem add-step handler will inject this as a dependency for us.
+ * This object will provide the binding address and port for the agent listener.
+ */
+ final InjectedValue<SocketBinding> agentListenerBinding = new InjectedValue<SocketBinding>();
/**
* This service can be configured to be told explicitly about certain plugins to be
@@ -131,10 +139,17 @@ public class AgentService implements Service<AgentService> {
log.info("Starting the embedded agent now");
try {
// make sure we pre-configure the agent with some settings taken from our runtime environment
+ SocketBinding agentListenerBindingValue = agentListenerBinding.getValue();
+ String agentBindAddress = agentListenerBindingValue.getAddress().getHostAddress();
+ String agentBindPort = String.valueOf(agentListenerBindingValue.getAbsolutePort());
+ configOverrides.put(ServiceContainerConfigurationConstants.CONNECTOR_BIND_ADDRESS, agentBindAddress);
+ configOverrides.put(ServiceContainerConfigurationConstants.CONNECTOR_BIND_PORT, agentBindPort);
+
ServerEnvironment env = envServiceValue.getValue();
boolean resetConfigurationAtStartup = true;
AgentConfigurationSetup configSetup = new AgentConfigurationSetup(
getExportedResource("conf/agent-configuration.xml"), resetConfigurationAtStartup, configOverrides, env);
+
// prepare the agent logging first thing so the agent logs messages using this config
configSetup.prepareLogConfigFile(getExportedResource("conf/log4j.xml"));
configSetup.preConfigureAgent();
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index c2cc801..937af70 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -9,6 +9,7 @@ import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.ServiceVerificationHandler;
+import org.jboss.as.network.SocketBinding;
import org.jboss.as.server.ServerEnvironment;
import org.jboss.as.server.ServerEnvironmentService;
import org.jboss.dmr.ModelNode;
@@ -41,6 +42,7 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
AgentSubsystemDefinition.SERVER_BIND_ADDRESS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SOCKET_BINDING_ATTRIBDEF.validateAndSet(operation, model);
log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@@ -87,10 +89,14 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
service.setConfigurationOverrides(overrides);
// install the service
+ String binding = AgentSubsystemDefinition.SOCKET_BINDING_ATTRIBDEF.resolveModelAttribute(context, model)
+ .asString();
ServiceName name = AgentService.SERVICE_NAME;
ServiceController<AgentService> controller = context.getServiceTarget() //
.addService(name, service) //
.addDependency(ServerEnvironmentService.SERVICE_NAME, ServerEnvironment.class, service.envServiceValue) //
+ .addDependency(SocketBinding.JBOSS_BINDING_NAME.append(binding), SocketBinding.class,
+ service.agentListenerBinding) //
.addListener(verificationHandler) //
.setInitialMode(Mode.ACTIVE) //
.install();
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index dec1a26..ad50c4e 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -9,6 +9,7 @@ import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.SimpleResourceDefinition;
import org.jboss.as.controller.descriptions.DefaultOperationDescriptionProvider;
import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
+import org.jboss.as.controller.operations.validation.StringLengthValidator;
import org.jboss.as.controller.registry.AttributeAccess;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.registry.OperationEntry;
@@ -69,6 +70,12 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
.setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_ALIAS)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
+ protected static final SimpleAttributeDefinition SOCKET_BINDING_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, ModelType.STRING)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode("embeddedagent")).setValidator(new StringLengthValidator(1)).setAllowNull(false)
+ .build();
+
private AgentSubsystemDefinition() {
super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
AgentSubsystemAdd.INSTANCE, AgentSubsystemRemove.INSTANCE);
@@ -85,6 +92,7 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
registerReloadRequiredWriteAttributeHandler(rr, SERVER_BIND_ADDRESS_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
registerReloadRequiredWriteAttributeHandler(rr, SERVER_ALIAS_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SOCKET_BINDING_ATTRIBDEF);
}
private void registerReloadRequiredWriteAttributeHandler(ManagementResourceRegistration rr, AttributeDefinition def) {
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index a74bafb..4374c7e 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -62,11 +62,10 @@ public class AgentSubsystemExtension implements Extension {
protected static final String ATTRIB_SERVER_BIND_ADDRESS = AgentConfigurationConstants.SERVER_BIND_ADDRESS;
protected static final String ATTRIB_SERVER_TRANSPORT_PARAMS = AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS;
protected static final String ATTRIB_SERVER_ALIAS = AgentConfigurationConstants.SERVER_ALIAS;
+ protected static final String ATTRIB_SOCKET_BINDING = "socket-binding";
protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
-
-
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
String prefix = SUBSYSTEM_NAME + (keyPrefix == null ? "" : "." + keyPrefix);
return new StandardResourceDescriptionResolver(prefix, RESOURCE_NAME,
@@ -133,6 +132,8 @@ public class AgentSubsystemExtension implements Extension {
opAdd.get(ATTRIB_SERVER_TRANSPORT_PARAMS).set(reader.getElementText());
} else if (elementName.equals(ATTRIB_SERVER_ALIAS)) {
opAdd.get(ATTRIB_SERVER_ALIAS).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SOCKET_BINDING)) {
+ opAdd.get(ATTRIB_SOCKET_BINDING).set(reader.getElementText());
} else {
throw ParseUtils.unexpectedElement(reader);
}
@@ -188,6 +189,7 @@ public class AgentSubsystemExtension implements Extension {
writeElement(writer, node, ATTRIB_SERVER_BIND_ADDRESS);
writeElement(writer, node, ATTRIB_SERVER_TRANSPORT_PARAMS);
writeElement(writer, node, ATTRIB_SERVER_ALIAS);
+ writeElement(writer, node, ATTRIB_SOCKET_BINDING);
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index 56419c3..faa971f 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -48,5 +48,8 @@
<!-- the standalone agent had this in its endorsed dir, but the embedded agent adds it as a dependency -->
<module name="javax.xml.bind.api"/>
+
+ <!-- other dependencies we need -->
+ <module name="org.jboss.as.network"/>
</dependencies>
</module>
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index 80ea9e5..e2badfc 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -6,6 +6,7 @@ embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
+embeddedagent.socket-binding=Determines the binding address and port the agent listens to for incoming server messages.
embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
embeddedagent.rhq.agent.disable-native-system=The RHQ Agent has a native system on certain supported platforms to help the \n\
plugin container perform discovery of native components on those platforms. \n\
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index b9a3689..d587e23 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -17,6 +17,7 @@
<xs:element name="rhq.agent.server.bind-address" type="xs:string" use="optional"/>
<xs:element name="rhq.agent.server.transport-params" type="xs:string" />
<xs:element name="rhq.agent.server.alias" type="xs:string" use="optional"/>
+ <xs:element name="socket-binding" type="xs:string"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index 0a8758f..0f3a8fa 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -198,6 +198,7 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
List<Property> attributes = content.get("attributes").asPropertyList();
List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.ATTRIB_SOCKET_BINDING, //
AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, //
AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, //
AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, //
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index e8641f1..09da3f6 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -7,6 +7,8 @@
<rhq.agent.server.transport-params>test-transport-params</rhq.agent.server.transport-params>
<!-- <rhq.agent.server.alias>test-alias</rhq.agent.server.alias> -->
+ <socket-binding>embeddedagent</socket-binding>
+
<plugins>
<plugin name="platform" enabled="true" />
<plugin name="blah" enabled="false" />
commit 2f0746ff35efc2c5748073cd4ed0c333d56c17d0
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 31 11:58:00 2014 -0500
add more embedded agent config settings - server endpoint details and the ability to disable native system (sigar)
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 4867ef7..c2cc801 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -5,6 +5,7 @@ import java.util.List;
import java.util.Map;
import org.jboss.as.controller.AbstractAddStepHandler;
+import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.ServiceVerificationHandler;
@@ -17,8 +18,6 @@ import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceController.Mode;
import org.jboss.msc.service.ServiceName;
-import org.rhq.enterprise.agent.AgentConfigurationConstants;
-
/**
* Handler responsible for adding the subsystem resource to the model
*/
@@ -35,7 +34,13 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.validateAndSet(operation, model);
- AgentSubsystemDefinition.PREF_AGENT_NAME_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.AGENT_NAME_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.DISABLE_NATIVE_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_TRANSPORT_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_BIND_PORT_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_BIND_ADDRESS_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF.validateAndSet(operation, model);
log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@@ -68,11 +73,13 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
// set up our runtime configuration overrides that should be used instead of the out-of-box config
Map<String, String> overrides = new HashMap<String, String>();
- ModelNode agentNameNode = AgentSubsystemDefinition.PREF_AGENT_NAME_ATTRIBDEF.resolveModelAttribute(context,
- model);
- if (agentNameNode.isDefined()) {
- overrides.put(AgentConfigurationConstants.NAME, agentNameNode.asString());
- }
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.AGENT_NAME_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.DISABLE_NATIVE_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_TRANSPORT_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_BIND_PORT_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_BIND_ADDRESS_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
+ addOverrideProperty(context, model, overrides, AgentSubsystemDefinition.SERVER_ALIAS_ATTRIBDEF);
// create our service
AgentService service = new AgentService();
@@ -90,4 +97,13 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
newControllers.add(controller);
return;
}
+
+ private void addOverrideProperty(OperationContext context, ModelNode model, Map<String, String> overrides,
+ AttributeDefinition attribDef)
+ throws OperationFailedException {
+ ModelNode node = attribDef.resolveModelAttribute(context, model);
+ if (node.isDefined()) {
+ overrides.put(attribDef.getName(), node.asString());
+ }
+ }
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index 0dffb92..dec1a26 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -2,6 +2,7 @@ package org.rhq.embeddedagent.extension;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIBE;
+import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
@@ -14,6 +15,8 @@ import org.jboss.as.controller.registry.OperationEntry;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
+
public class AgentSubsystemDefinition extends SimpleResourceDefinition {
public static final AgentSubsystemDefinition INSTANCE = new AgentSubsystemDefinition();
@@ -23,12 +26,48 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
.setXmlName(AgentSubsystemExtension.AGENT_ENABLED).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setDefaultValue(new ModelNode(AgentSubsystemExtension.AGENT_ENABLED_DEFAULT)).setAllowNull(false).build();
- protected static final SimpleAttributeDefinition PREF_AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
+
+ protected static final SimpleAttributeDefinition AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
AgentSubsystemExtension.ATTRIB_AGENT_NAME, ModelType.STRING).setAllowExpression(true)
.setXmlName(AgentSubsystemExtension.ATTRIB_AGENT_NAME).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setAllowNull(true).build();
- protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
+ protected static final SimpleAttributeDefinition DISABLE_NATIVE_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE, ModelType.BOOLEAN).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
+
+ protected static final SimpleAttributeDefinition SERVER_TRANSPORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT)).setAllowNull(false)
+ .build();
+
+ protected static final SimpleAttributeDefinition SERVER_BIND_PORT_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_BIND_PORT)).setAllowNull(false)
+ .build();
+
+ protected static final SimpleAttributeDefinition SERVER_BIND_ADDRESS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
+
+ protected static final SimpleAttributeDefinition SERVER_TRANSPORT_PARAMS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT_PARAMS))
+ .setAllowNull(false).build();
+
+ protected static final SimpleAttributeDefinition SERVER_ALIAS_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_SERVER_ALIAS, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_SERVER_ALIAS)
+ .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES).setAllowNull(true).build();
private AgentSubsystemDefinition() {
super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
@@ -39,8 +78,17 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
public void registerAttributes(ManagementResourceRegistration rr) {
rr.registerReadWriteAttribute(AGENT_ENABLED_ATTRIBDEF, null, AgentEnabledAttributeHandler.INSTANCE);
rr.registerReadWriteAttribute(PLUGINS_ATTRIBDEF, null, PluginsAttributeHandler.INSTANCE);
- rr.registerReadWriteAttribute(PREF_AGENT_NAME_ATTRIBDEF, null, new ReloadRequiredWriteAttributeHandler(
- PREF_AGENT_NAME_ATTRIBDEF));
+ registerReloadRequiredWriteAttributeHandler(rr, AGENT_NAME_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, DISABLE_NATIVE_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_BIND_PORT_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_BIND_ADDRESS_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_TRANSPORT_PARAMS_ATTRIBDEF);
+ registerReloadRequiredWriteAttributeHandler(rr, SERVER_ALIAS_ATTRIBDEF);
+ }
+
+ private void registerReloadRequiredWriteAttributeHandler(ManagementResourceRegistration rr, AttributeDefinition def) {
+ rr.registerReadWriteAttribute(def, null, new ReloadRequiredWriteAttributeHandler(def));
}
@Override
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 37ec585..a74bafb 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -56,9 +56,17 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_STATUS_OP = "status";
protected static final String ATTRIB_AGENT_NAME = AgentConfigurationConstants.NAME;
+ protected static final String ATTRIB_DISABLE_NATIVE = AgentConfigurationConstants.DISABLE_NATIVE_SYSTEM;
+ protected static final String ATTRIB_SERVER_TRANSPORT = AgentConfigurationConstants.SERVER_TRANSPORT;
+ protected static final String ATTRIB_SERVER_BIND_PORT = AgentConfigurationConstants.SERVER_BIND_PORT;
+ protected static final String ATTRIB_SERVER_BIND_ADDRESS = AgentConfigurationConstants.SERVER_BIND_ADDRESS;
+ protected static final String ATTRIB_SERVER_TRANSPORT_PARAMS = AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS;
+ protected static final String ATTRIB_SERVER_ALIAS = AgentConfigurationConstants.SERVER_ALIAS;
protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
+
+
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
String prefix = SUBSYSTEM_NAME + (keyPrefix == null ? "" : "." + keyPrefix);
return new StandardResourceDescriptionResolver(prefix, RESOURCE_NAME,
@@ -113,6 +121,18 @@ public class AgentSubsystemExtension implements Extension {
}
} else if (elementName.equals(ATTRIB_AGENT_NAME)) {
opAdd.get(ATTRIB_AGENT_NAME).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_DISABLE_NATIVE)) {
+ opAdd.get(ATTRIB_DISABLE_NATIVE).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_TRANSPORT)) {
+ opAdd.get(ATTRIB_SERVER_TRANSPORT).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_BIND_PORT)) {
+ opAdd.get(ATTRIB_SERVER_BIND_PORT).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_BIND_ADDRESS)) {
+ opAdd.get(ATTRIB_SERVER_BIND_ADDRESS).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_TRANSPORT_PARAMS)) {
+ opAdd.get(ATTRIB_SERVER_TRANSPORT_PARAMS).set(reader.getElementText());
+ } else if (elementName.equals(ATTRIB_SERVER_ALIAS)) {
+ opAdd.get(ATTRIB_SERVER_ALIAS).set(reader.getElementText());
} else {
throw ParseUtils.unexpectedElement(reader);
}
@@ -160,9 +180,14 @@ public class AgentSubsystemExtension implements Extension {
writer.writeAttribute(AGENT_ENABLED,
String.valueOf(node.get(AGENT_ENABLED).asBoolean(AGENT_ENABLED_DEFAULT)));
- writer.writeStartElement(ATTRIB_AGENT_NAME);
- writer.writeCharacters(node.get(ATTRIB_AGENT_NAME).asString());
- writer.writeEndElement();
+ // our config elements
+ writeElement(writer, node, ATTRIB_AGENT_NAME);
+ writeElement(writer, node, ATTRIB_DISABLE_NATIVE);
+ writeElement(writer, node, ATTRIB_SERVER_TRANSPORT);
+ writeElement(writer, node, ATTRIB_SERVER_BIND_PORT);
+ writeElement(writer, node, ATTRIB_SERVER_BIND_ADDRESS);
+ writeElement(writer, node, ATTRIB_SERVER_TRANSPORT_PARAMS);
+ writeElement(writer, node, ATTRIB_SERVER_ALIAS);
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
@@ -182,5 +207,15 @@ public class AgentSubsystemExtension implements Extension {
// </subsystem>
writer.writeEndElement();
}
+
+ private void writeElement(final XMLExtendedStreamWriter writer, ModelNode node, String attribName)
+ throws XMLStreamException {
+ ModelNode attribNode = node.get(attribName);
+ if (attribNode.isDefined()) {
+ writer.writeStartElement(attribName);
+ writer.writeCharacters(attribNode.asString());
+ writer.writeEndElement();
+ }
+ }
}
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index 05bcfce..80ea9e5 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -6,4 +6,17 @@ embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
-embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
\ No newline at end of file
+embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
+embeddedagent.rhq.agent.disable-native-system=The RHQ Agent has a native system on certain supported platforms to help the \n\
+plugin container perform discovery of native components on those platforms. \n\
+If the native libraries are causing errors within the agent, \n\
+you can disable this native system by setting this to true.
+embeddedagent.rhq.agent.server.transport=The communication transport used to send messages to the RHQ Server
+embeddedagent.rhq.agent.server.bind-port=The port the RHQ Server is listening to for messages
+embeddedagent.rhq.agent.server.bind-address=The address the RHQ Server is listening to for messages. \n\
+If not defined, the RHQ Agent will default to the DNS \n\
+alias (see rhq.agent.server.alias), and if that is not defined \n\
+the RHQ Agent will default to localhost or 127.0.0.1.
+embeddedagent.rhq.agent.server.transport-params=Communications transport parameters used when sending messages to the RHQ Server.
+embeddedagent.rhq.agent.server.alias=If the server address is not defined, this is the DNS alias name the \n\
+RHQ Agent will resolve and use for the server address.
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index 3e0c546..b9a3689 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -11,6 +11,12 @@
<xs:attribute name="enabled" type="xs:boolean" use="required" default="false"/>
<xs:all>
<xs:element name="rhq.agent.name" type="xs:string"/>
+ <xs:element name="rhq.agent.disable-native-system" type="xs:boolean" use="optional"/>
+ <xs:element name="rhq.agent.server.transport" type="xs:string"/>
+ <xs:element name="rhq.agent.server.bind-port" type="xs:integer"/>
+ <xs:element name="rhq.agent.server.bind-address" type="xs:string" use="optional"/>
+ <xs:element name="rhq.agent.server.transport-params" type="xs:string" />
+ <xs:element name="rhq.agent.server.alias" type="xs:string" use="optional"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index e857af4..0a8758f 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -196,12 +196,18 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
// check the attributes
Assert.assertTrue(content.get("attributes").isDefined());
List<Property> attributes = content.get("attributes").asPropertyList();
- Assert.assertEquals(attributes.size(), 3);
List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT, //
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_PORT, //
+ AgentSubsystemExtension.ATTRIB_SERVER_BIND_ADDRESS, //
+ AgentSubsystemExtension.ATTRIB_SERVER_TRANSPORT_PARAMS, //
+ AgentSubsystemExtension.ATTRIB_SERVER_ALIAS, //
+ AgentSubsystemExtension.ATTRIB_DISABLE_NATIVE, //
+ AgentSubsystemExtension.ATTRIB_AGENT_NAME, //
AgentSubsystemExtension.AGENT_ENABLED, //
- AgentSubsystemExtension.PLUGINS_ELEMENT, //
- AgentSubsystemExtension.ATTRIB_AGENT_NAME);
+ AgentSubsystemExtension.PLUGINS_ELEMENT);
+ Assert.assertEquals(attributes.size(), expectedAttributes.size());
for (int i = 0 ; i < attributes.size(); i++) {
String attrib = attributes.get(i).getName();
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index 8d60c99..e8641f1 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -1,5 +1,12 @@
<subsystem xmlns="urn:org.rhq:embeddedagent:1.0" enabled="true">
<rhq.agent.name>embeddedagent-test</rhq.agent.name>
+ <!-- <rhq.agent.disable-native-system>true</rhq.agent.disable-native-system> -->
+ <rhq.agent.server.transport>test-transport</rhq.agent.server.transport>
+ <rhq.agent.server.bind-port>12345</rhq.agent.server.bind-port>
+ <!-- <rhq.agent.server.bind-address>test-bind-address</rhq.agent.server.bind-address> -->
+ <rhq.agent.server.transport-params>test-transport-params</rhq.agent.server.transport-params>
+ <!-- <rhq.agent.server.alias>test-alias</rhq.agent.server.alias> -->
+
<plugins>
<plugin name="platform" enabled="true" />
<plugin name="blah" enabled="false" />
commit e70d32f70a1ee39eb82b5919844ef15ef4803977
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 31 01:08:04 2014 -0500
starting to add config overrides to the extension subsystem - first one is the agent name (we can now set the agent name in the config)
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
index 24c3d2d..7b654fc 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
@@ -38,7 +38,7 @@ public class AgentConfigurationSetup {
* Properties that will be used to override preferences found in the preferences node and the configuration
* preferences file.
*/
- private final Properties configurationOverrides;
+ private final Map<String, String> configurationOverrides;
/**
* If <code>true</code>, will revert the agent's configuration back to the original configuration file.
@@ -57,14 +57,14 @@ public class AgentConfigurationSetup {
private final ServerEnvironment serverEnvironment;
public AgentConfigurationSetup(Resource configFile, boolean resetConfigurationAtStartup,
- Properties configurationOverrides, ServerEnvironment serverEnv) {
+ Map<String, String> overrides, ServerEnvironment serverEnv) {
this.configFile = configFile;
this.resetConfigurationAtStartup = resetConfigurationAtStartup;
this.serverEnvironment = serverEnv;
- this.configurationOverrides = prepareConfigurationOverrides(configurationOverrides);
+ this.configurationOverrides = prepareConfigurationOverrides(overrides);
- String agentName = configurationOverrides.getProperty(AgentConfigurationConstants.NAME, "embeddedagent");
+ String agentName = this.configurationOverrides.get(AgentConfigurationConstants.NAME);
preferencesNodeName = agentName;
System.setProperty("rhq.agent.preferences-node", preferencesNodeName);
}
@@ -73,13 +73,12 @@ public class AgentConfigurationSetup {
return this.preferencesNodeName;
}
- private Properties prepareConfigurationOverrides(Properties overrides) {
+ private Map<String, String> prepareConfigurationOverrides(Map<String, String> overrides) {
// perform some checking to setup defaults if need be
- String agentName = overrides.getProperty(AgentConfigurationConstants.NAME, "");
- if (agentName.trim().length() == 0 || "-".equals(agentName)) {
+ String agentName = overrides.get(AgentConfigurationConstants.NAME);
+ if (agentName == null || agentName.trim().length() == 0 || "-".equals(agentName)) {
agentName = "embeddedagent-" + serverEnvironment.getNodeName();
}
-
agentName = StringPropertyReplacer.replaceProperties(agentName);
overrides.put(AgentConfigurationConstants.NAME, agentName);
@@ -201,11 +200,11 @@ public class AgentConfigurationSetup {
}
// now that the configuration preferences are loaded, we need to override them with any bootstrap override properties
- Properties overrides = configurationOverrides;
+ Map<String, String> overrides = configurationOverrides;
if (overrides != null) {
- for (Map.Entry<Object, Object> entry : overrides.entrySet()) {
- String key = entry.getKey().toString();
- String value = entry.getValue().toString();
+ for (Map.Entry<String, String> entry : overrides.entrySet()) {
+ String key = entry.getKey();
+ String value = entry.getValue();
// allow ${var} notation in the values so we can provide variable replacements in the values
value = StringPropertyReplacer.replaceProperties(value);
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 64d11fd..018519d 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -4,7 +4,6 @@ import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import java.util.Properties;
import java.util.concurrent.atomic.AtomicReference;
import org.jboss.as.server.ServerEnvironment;
@@ -44,6 +43,12 @@ public class AgentService implements Service<AgentService> {
private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
/**
+ * Configuration settings that override the out-of-box configuration file. These are settings
+ * that the user set in the subsystem (e.g. standalone.xml or via AS CLI).
+ */
+ private Map<String, String> configOverrides = Collections.synchronizedMap(new HashMap<String, String>());
+
+ /**
* This is the actual embedded agent. This is what handles the plugin container lifecycle
* and communication to/from the server.
*/
@@ -103,6 +108,15 @@ public class AgentService implements Service<AgentService> {
log.info("New plugin definitions: " + pluginsWithEnableFlag);
}
+ protected void setConfigurationOverrides(Map<String, String> overrides) {
+ synchronized (configOverrides) {
+ configOverrides.clear();
+ if (overrides != null) {
+ configOverrides.putAll(overrides);
+ }
+ }
+ }
+
protected boolean isAgentStarted() {
AgentMain agent = theAgent.get();
return (agent != null && agent.isStarted());
@@ -118,10 +132,9 @@ public class AgentService implements Service<AgentService> {
try {
// make sure we pre-configure the agent with some settings taken from our runtime environment
ServerEnvironment env = envServiceValue.getValue();
- Properties overrides = new Properties();
boolean resetConfigurationAtStartup = true;
AgentConfigurationSetup configSetup = new AgentConfigurationSetup(
- getExportedResource("conf/agent-configuration.xml"), resetConfigurationAtStartup, overrides, env);
+ getExportedResource("conf/agent-configuration.xml"), resetConfigurationAtStartup, configOverrides, env);
// prepare the agent logging first thing so the agent logs messages using this config
configSetup.prepareLogConfigFile(getExportedResource("conf/log4j.xml"));
configSetup.preConfigureAgent();
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index f9d3291..4867ef7 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -2,6 +2,7 @@ package org.rhq.embeddedagent.extension;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.jboss.as.controller.AbstractAddStepHandler;
import org.jboss.as.controller.OperationContext;
@@ -16,6 +17,8 @@ import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceController.Mode;
import org.jboss.msc.service.ServiceName;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
+
/**
* Handler responsible for adding the subsystem resource to the model
*/
@@ -32,6 +35,7 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF.validateAndSet(operation, model);
AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.PREF_AGENT_NAME_ATTRIBDEF.validateAndSet(operation, model);
log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
}
@@ -49,6 +53,8 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
}
log.info("Embedded agent is enabled and will be deployed");
+
+ // figure out what plugins we are to support
HashMap<String, Boolean> pluginsWithEnableFlag = new HashMap<String, Boolean>();
ModelNode pluginsNode = AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.resolveModelAttribute(context, model);
if (pluginsNode != null && pluginsNode.isDefined()) {
@@ -60,9 +66,20 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
}
}
+ // set up our runtime configuration overrides that should be used instead of the out-of-box config
+ Map<String, String> overrides = new HashMap<String, String>();
+ ModelNode agentNameNode = AgentSubsystemDefinition.PREF_AGENT_NAME_ATTRIBDEF.resolveModelAttribute(context,
+ model);
+ if (agentNameNode.isDefined()) {
+ overrides.put(AgentConfigurationConstants.NAME, agentNameNode.asString());
+ }
+
+ // create our service
AgentService service = new AgentService();
service.setPlugins(pluginsWithEnableFlag);
+ service.setConfigurationOverrides(overrides);
+ // install the service
ServiceName name = AgentService.SERVICE_NAME;
ServiceController<AgentService> controller = context.getServiceTarget() //
.addService(name, service) //
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
index e43c6c5..0dffb92 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -2,6 +2,7 @@ package org.rhq.embeddedagent.extension;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIBE;
+import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.SimpleResourceDefinition;
@@ -22,6 +23,11 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
.setXmlName(AgentSubsystemExtension.AGENT_ENABLED).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.setDefaultValue(new ModelNode(AgentSubsystemExtension.AGENT_ENABLED_DEFAULT)).setAllowNull(false).build();
+ protected static final SimpleAttributeDefinition PREF_AGENT_NAME_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.ATTRIB_AGENT_NAME, ModelType.STRING).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.ATTRIB_AGENT_NAME).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setAllowNull(true).build();
+
protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
private AgentSubsystemDefinition() {
@@ -33,6 +39,8 @@ public class AgentSubsystemDefinition extends SimpleResourceDefinition {
public void registerAttributes(ManagementResourceRegistration rr) {
rr.registerReadWriteAttribute(AGENT_ENABLED_ATTRIBDEF, null, AgentEnabledAttributeHandler.INSTANCE);
rr.registerReadWriteAttribute(PLUGINS_ATTRIBDEF, null, PluginsAttributeHandler.INSTANCE);
+ rr.registerReadWriteAttribute(PREF_AGENT_NAME_ATTRIBDEF, null, new ReloadRequiredWriteAttributeHandler(
+ PREF_AGENT_NAME_ATTRIBDEF));
}
@Override
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
index 1ab7a7e..37ec585 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -29,6 +29,8 @@ import org.jboss.staxmapper.XMLElementWriter;
import org.jboss.staxmapper.XMLExtendedStreamReader;
import org.jboss.staxmapper.XMLExtendedStreamWriter;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
+
public class AgentSubsystemExtension implements Extension {
private final Logger log = Logger.getLogger(AgentSubsystemExtension.class);
@@ -53,6 +55,8 @@ public class AgentSubsystemExtension implements Extension {
protected static final String AGENT_STOP_OP = "stop";
protected static final String AGENT_STATUS_OP = "status";
+ protected static final String ATTRIB_AGENT_NAME = AgentConfigurationConstants.NAME;
+
protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
@@ -97,17 +101,20 @@ public class AgentSubsystemExtension implements Extension {
opAdd.get(AGENT_ENABLED).set(agentEnabledValue);
}
- ModelNode pluginsAttributeNode = opAdd.get(PLUGINS_ELEMENT);
-
// Read the children elements
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
- if (!reader.getLocalName().equals(PLUGINS_ELEMENT)) {
- throw ParseUtils.unexpectedElement(reader);
- }
- while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
- if (reader.isStartElement()) {
- readPlugin(reader, pluginsAttributeNode);
+ String elementName = reader.getLocalName();
+ if (elementName.equals(PLUGINS_ELEMENT)) {
+ ModelNode pluginsAttributeNode = opAdd.get(PLUGINS_ELEMENT);
+ while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
+ if (reader.isStartElement()) {
+ readPlugin(reader, pluginsAttributeNode);
+ }
}
+ } else if (elementName.equals(ATTRIB_AGENT_NAME)) {
+ opAdd.get(ATTRIB_AGENT_NAME).set(reader.getElementText());
+ } else {
+ throw ParseUtils.unexpectedElement(reader);
}
}
@@ -153,6 +160,10 @@ public class AgentSubsystemExtension implements Extension {
writer.writeAttribute(AGENT_ENABLED,
String.valueOf(node.get(AGENT_ENABLED).asBoolean(AGENT_ENABLED_DEFAULT)));
+ writer.writeStartElement(ATTRIB_AGENT_NAME);
+ writer.writeCharacters(node.get(ATTRIB_AGENT_NAME).asString());
+ writer.writeEndElement();
+
// <plugins>
writer.writeStartElement(PLUGINS_ELEMENT);
ModelNode plugins = node.get(PLUGINS_ELEMENT);
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
index 790232a..05bcfce 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -5,4 +5,5 @@ embeddedagent.restart=Starts the RHQ Agent. If it is already started, it will be
embeddedagent.stop=Stops the RHQ Agent if it is running.
embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
-embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
\ No newline at end of file
+embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
+embeddedagent.rhq.agent.name=Name to uniquely identify this agent among all other agents in the environment
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
index 2882729..3e0c546 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -10,6 +10,7 @@
<xs:complexType name="subsystemType">
<xs:attribute name="enabled" type="xs:boolean" use="required" default="false"/>
<xs:all>
+ <xs:element name="rhq.agent.name" type="xs:string"/>
<xs:element name="plugins" type="pluginsType"/>
</xs:all>
</xs:complexType>
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index b33fb4f..e857af4 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -14,6 +14,7 @@ import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VAL
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import org.testng.Assert;
@@ -132,31 +133,24 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
* operations from its describe action results in the same model
*/
public void testDescribeHandler() throws Exception {
- // test two subsystem xmls - one that is empty of plugins, and the second is our normal test xml
- String subsystemXml1 = "<subsystem xmlns=\"" + AgentSubsystemExtension.NAMESPACE + "\" "
- + AgentSubsystemExtension.AGENT_ENABLED + "=\"true\"" + "></subsystem>";
- String subsystemXml2 = getSubsystemXml();
-
- String[] subsystemXmlAll = new String[] { subsystemXml1, subsystemXml2 };
- for (String subsystemXml : subsystemXmlAll) {
- KernelServices servicesA = super.installInController(subsystemXml);
- // Get the model and the describe operations from the first controller
- ModelNode modelA = servicesA.readWholeModel();
- ModelNode describeOp = new ModelNode();
- describeOp.get(OP).set(DESCRIBE);
- describeOp.get(OP_ADDR).set(
- PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME))
- .toModelNode());
- ModelNode executeOperation = servicesA.executeOperation(describeOp);
- List<ModelNode> operations = super.checkResultAndGetContents(executeOperation).asList();
-
- // Install the describe options from the first controller into a second controller
- KernelServices servicesB = super.installInController(operations);
- ModelNode modelB = servicesB.readWholeModel();
-
- // Make sure the models from the two controllers are identical
- super.compare(modelA, modelB);
- }
+ String subsystemXml = getSubsystemXml();
+ KernelServices servicesA = super.installInController(subsystemXml);
+ // Get the model and the describe operations from the first controller
+ ModelNode modelA = servicesA.readWholeModel();
+ ModelNode describeOp = new ModelNode();
+ describeOp.get(OP).set(DESCRIBE);
+ describeOp.get(OP_ADDR).set(
+ PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME))
+ .toModelNode());
+ ModelNode executeOperation = servicesA.executeOperation(describeOp);
+ List<ModelNode> operations = super.checkResultAndGetContents(executeOperation).asList();
+
+ // Install the describe options from the first controller into a second controller
+ KernelServices servicesB = super.installInController(operations);
+ ModelNode modelB = servicesB.readWholeModel();
+
+ // Make sure the models from the two controllers are identical
+ super.compare(modelA, modelB);
}
/**
@@ -202,9 +196,17 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
// check the attributes
Assert.assertTrue(content.get("attributes").isDefined());
List<Property> attributes = content.get("attributes").asPropertyList();
- Assert.assertEquals(attributes.size(), 2);
- Assert.assertEquals(attributes.get(0).getName(), AgentSubsystemExtension.AGENT_ENABLED);
- Assert.assertEquals(attributes.get(1).getName(), AgentSubsystemExtension.PLUGINS_ELEMENT);
+ Assert.assertEquals(attributes.size(), 3);
+
+ List<String> expectedAttributes = Arrays.asList( //
+ AgentSubsystemExtension.AGENT_ENABLED, //
+ AgentSubsystemExtension.PLUGINS_ELEMENT, //
+ AgentSubsystemExtension.ATTRIB_AGENT_NAME);
+
+ for (int i = 0 ; i < attributes.size(); i++) {
+ String attrib = attributes.get(i).getName();
+ Assert.assertTrue(expectedAttributes.contains(attrib), "missing attrib: " + attrib);
+ }
// check the operations
Assert.assertTrue(content.get("operations").isDefined());
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
index 4e4a85d..8d60c99 100644
--- a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -1,4 +1,5 @@
<subsystem xmlns="urn:org.rhq:embeddedagent:1.0" enabled="true">
+ <rhq.agent.name>embeddedagent-test</rhq.agent.name>
<plugins>
<plugin name="platform" enabled="true" />
<plugin name="blah" enabled="false" />
commit ec473d3ad469ffbc63f6b0ac0504ff992c744d14
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 31 01:06:00 2014 -0500
add source to eclipse classpath
diff --git a/.classpath b/.classpath
index cb9f5bc..455f739 100644
--- a/.classpath
+++ b/.classpath
@@ -329,13 +329,13 @@
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/msc/jboss-msc/1.0.2.GA/jboss-msc-1.0.2.GA.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/jboss-dmr/1.1.1.Final/jboss-dmr-1.1.1.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-naming/7.2.0.Alpha1-redhat-4/jboss-as-naming-7.2.0.Alpha1-redhat-4.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-server/7.2.0.Alpha1-redhat-4/jboss-as-server-7.2.0.Alpha1-redhat-4.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-server/7.2.0.Alpha1-redhat-4/jboss-as-server-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-server/7.2.0.Alpha1-redhat-4/jboss-as-server-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-ee/7.2.0.Alpha1-redhat-4/jboss-as-ee-7.2.0.Alpha1-redhat-4.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-ejb3/7.2.0.Alpha1-redhat-4/jboss-as-ejb3-7.2.0.Alpha1-redhat-4.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-ejb3/7.2.0.Alpha1-redhat-4/jboss-as-ejb3-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/staxmapper/1.1.0.Final/staxmapper-1.1.0.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/modules/jboss-modules/1.1.1.GA/jboss-modules-1.1.1.GA.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-subsystem-test/7.1.1.Final/jboss-as-subsystem-test-7.1.1.Final.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller/7.1.1.Final/jboss-as-controller-7.1.1.Final.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller/7.1.1.Final/jboss-as-controller-7.1.1.Final.jar" sourcepath="/M2_REPO/org/jboss/as/jboss-as-controller/7.2.0.Alpha1-redhat-4/jboss-as-controller-7.2.0.Alpha1-redhat-4-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/as/jboss-as-controller-client/7.1.1.Final/jboss-as-controller-client-7.1.1.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-links/2.3.5.Final/resteasy-links-2.3.5.Final.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/resteasy/resteasy-jaxrs/2.3.5.Final/resteasy-jaxrs-2.3.5.Final.jar"/>
commit 5b9e02a9cd8249844507fff12395edfdd842797a
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 23:13:16 2014 -0500
trivial - reformat
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
index a815600..59419c1 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
@@ -8,28 +8,26 @@ import org.jboss.logging.Logger;
class AgentEnabledAttributeHandler extends AbstractWriteAttributeHandler<Void> {
- public static final AgentEnabledAttributeHandler INSTANCE = new AgentEnabledAttributeHandler();
+ public static final AgentEnabledAttributeHandler INSTANCE = new AgentEnabledAttributeHandler();
private final Logger log = Logger.getLogger(AgentEnabledAttributeHandler.class);
- private AgentEnabledAttributeHandler() {
- super(AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF);
+ private AgentEnabledAttributeHandler() {
+ super(AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF);
}
- @Override
- protected boolean applyUpdateToRuntime(OperationContext context,
- ModelNode operation, String attributeName, ModelNode resolvedValue,
- ModelNode currentValue, HandbackHolder<Void> handbackHolder)
- throws OperationFailedException {
+ @Override
+ protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
+ ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder)
+ throws OperationFailedException {
log.info("Embedded agent enabled attribute changed: " + attributeName + "=" + resolvedValue);
// there is nothing for us to do - this only affects us when we are restarted, return true to say we must reload
return true;
}
- @Override
- protected void revertUpdateToRuntime(OperationContext context,
- ModelNode operation, String attributeName,
- ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
+ @Override
+ protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
+ ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
// no-op
}
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
index 1d51294..078bf17 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
@@ -13,15 +13,15 @@ import org.jboss.msc.service.ServiceNotFoundException;
class PluginsAttributeHandler extends AbstractWriteAttributeHandler<Void> {
- public static final PluginsAttributeHandler INSTANCE = new PluginsAttributeHandler();
+ public static final PluginsAttributeHandler INSTANCE = new PluginsAttributeHandler();
private final Logger log = Logger.getLogger(PluginsAttributeHandler.class);
- private PluginsAttributeHandler() {
+ private PluginsAttributeHandler() {
super(AgentSubsystemDefinition.PLUGINS_ATTRIBDEF);
}
- @Override
+ @Override
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder)
throws OperationFailedException {
commit 3ca6149ace5c4bdfbdcfcc020c49c94b7dd3a19c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 23:12:44 2014 -0500
dont lose security token on embedded agent restart
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
index 187527b..24c3d2d 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
@@ -234,8 +234,11 @@ public class AgentConfigurationSetup {
// store is the default value.
// But first we need to backup these original preferences in case the config file fails to load -
// we'll restore the original values in that case.
+ // Note that we squirrel away any security token we already have - we need to preserve this when we can
+ // because otherwise the agent will not be able to re-register with any previous name is was registered with.
Preferences prefNode = getPreferencesNode();
+ String securityToken = prefNode.get(AgentConfigurationConstants.AGENT_SECURITY_TOKEN, null);
ByteArrayOutputStream backup = new ByteArrayOutputStream();
prefNode.exportSubtree(backup);
prefNode.clear();
@@ -249,9 +252,25 @@ public class AgentConfigurationSetup {
ByteArrayInputStream newConfigInputStream = new ByteArrayInputStream(newConfig.getBytes());
Preferences.importPreferences(newConfigInputStream);
- if (new AgentConfiguration(prefNode).getAgentConfigurationVersion() == 0) {
+ AgentConfiguration newAgentConfig = new AgentConfiguration(prefNode);
+ if (newAgentConfig.getAgentConfigurationVersion() == 0) {
throw new IllegalArgumentException("Bad preferences node");
}
+
+ // If we had a security token, restore it so we can maintain our known registration with the server.
+ // Note that if the configuration file already had a security token defined, it will be used and the old
+ // token we had will be thrown away.
+ if (securityToken != null) {
+ if (newAgentConfig.getAgentSecurityToken() == null) {
+ log.debug("Restoring embedded agent security token");
+ newAgentConfig.setAgentSecurityToken(securityToken);
+ } else {
+ log.debug("Not restoring embedded agent security token, the config file was preconfigured with one");
+ }
+ }
+
+ prefNode.flush();
+
} catch (Exception e) {
// a problem occurred importing the config file; let's restore our original values
try {
commit fef4ec6c3ce4c2733b5427f69bb2478b3cdf352e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 18:38:55 2014 -0500
embedded agent needs to add a dep on JAXB module as a substitute to the standalone agent's endorsed libs
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index c818032..56419c3 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -34,7 +34,7 @@
<resource-root path="rhq-agent/lib/sigar-${sigar.version}.jar" />
<resource-root path="rhq-agent/lib/trove4j-3.0.3.jar" />
</resources>
-
+
<dependencies>
<!-- modules required by any subsystem -->
<module name="javax.api"/>
@@ -45,5 +45,8 @@
<module name="org.jboss.msc"/>
<module name="org.jboss.logging"/>
<module name="org.jboss.vfs"/>
+
+ <!-- the standalone agent had this in its endorsed dir, but the embedded agent adds it as a dependency -->
+ <module name="javax.xml.bind.api"/>
</dependencies>
</module>
commit d737ad943bc13ed1de76294ae6baa5ac9a58ba76
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 17:37:16 2014 -0500
start the embedded agent in a separate thread so as not to hang the subsystem startup
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index f4644e1..64d11fd 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -5,7 +5,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
import org.jboss.as.server.ServerEnvironment;
import org.jboss.logging.Logger;
@@ -30,6 +30,7 @@ public class AgentService implements Service<AgentService> {
/**
* Our subsystem add-step handler will inject this as a dependency for us.
* This service gives us information about the server, like the install directory, data directory, etc.
+ * Package-scoped so the add-step handler can access this.
*/
InjectedValue<ServerEnvironment> envServiceValue = new InjectedValue<ServerEnvironment>();
@@ -43,20 +44,15 @@ public class AgentService implements Service<AgentService> {
private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
/**
- * Provides a mechanism to pre-configure the agent.
- */
- private AgentConfigurationSetup configSetup;
-
- /**
* This is the actual embedded agent. This is what handles the plugin container lifecycle
* and communication to/from the server.
*/
- private AgentMain theAgent;
+ private AtomicReference<AgentMain> theAgent = new AtomicReference<AgentMain>();
/**
- * Provides the status flag of the embedded agent itself (not of this service).
+ * This is the daemon thread running the agent.
*/
- private AtomicBoolean agentStarted = new AtomicBoolean(false);
+ private Thread agentThread;
public AgentService() {
}
@@ -108,7 +104,8 @@ public class AgentService implements Service<AgentService> {
}
protected boolean isAgentStarted() {
- return agentStarted.get();
+ AgentMain agent = theAgent.get();
+ return (agent != null && agent.isStarted());
}
protected void startAgent() throws StartException {
@@ -135,23 +132,41 @@ public class AgentService implements Service<AgentService> {
args[1] = "--pref=" + configSetup.getPreferencesNodeName();
args[2] = "--output=" + new File(env.getServerLogDir(), "embedded-agent.out").getAbsolutePath();
- theAgent = new AgentMain(args);
- theAgent.start();
-
- agentStarted.set(true);
+ theAgent.set(new AgentMain(args));
+
+ agentThread = new Thread("Embedded Agent Start Thread") {
+ public void run() {
+ try {
+ theAgent.get().start();
+ } catch (InterruptedException e) {
+ // agent just exited due to being shutdown, die quietly
+ log.debug("Embedded agent has exited.");
+ } catch (Throwable t) {
+ log.error("Embedded agent aborted with exception.", t);
+ }
+ };
+ };
+ agentThread.setDaemon(true);
+ agentThread.start();
} catch (Exception e) {
throw new StartException(e);
}
}
protected void stopAgent() {
- if (!isAgentStarted()) {
- log.info("Embedded agent is already stopped.");
- return;
+ try {
+ if (!isAgentStarted()) {
+ log.info("Embedded agent is already stopped.");
+ } else {
+ log.info("Stopping the embedded agent now");
+ theAgent.get().shutdown();
+ }
+ } finally {
+ if (agentThread != null) {
+ agentThread.interrupt();
+ }
}
-
- log.info("Stopping the embedded agent now");
- agentStarted.set(false);
+ theAgent.set(null);
}
/**
commit ef729cd9b8c989ef0f37c35bb5734e8c698482da
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jan 30 14:05:38 2014 -0500
1) preconfigure the agent prior to starting it
2) get log4j.xml to work but yet not put log files under bin/
3) don't need to put module.xml in the extension jar, just needs to be in module
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
index c6118a6..0196223 100644
--- a/modules/enterprise/server/embeddedagent/pom.xml
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -26,6 +26,10 @@
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
+ <excludes>
+ <!-- this doesn't need to be in the jar, just in our module .zip -->
+ <exclude>module/main/module.xml</exclude>
+ </excludes>
</resource>
</resources>
@@ -89,16 +93,28 @@
<copy tofile="${module.lib}/macosx-x86_64/libsigar.dylib" file="${agent.lib}/libsigar-universal64-macosx.dylib" preservelastmodified="true"/>
<echo>Adjust default configuration</echo>
- <property name="config.xml" location="${project.build.directory}/rhq-agent/conf/agent-configuration.xml"/>
+ <property name="agent.config.dir" location="${project.build.directory}/rhq-agent/conf"/>
+ <property name="agent.config.xml" location="${agent.config.dir}/agent-configuration.xml"/>
<!-- because we are embedded, as can't have a prompt and ask user, so we will ensure the agent is always fully setup -->
- <replaceregexp file="${config.xml}" flags="s"
+ <replaceregexp file="${agent.config.xml}" flags="s"
match='<!--(\s*)<entry key="rhq.agent.configuration-setup-flag" value="false" />(\s*)-->'
- replace='<entry key="rhq.agent.configuration-setup-flag" value="true" /> BOOO' />
+ replace='<entry key="rhq.agent.configuration-setup-flag" value="true" />' />
<!-- we don't support agent auto-update while the agent is embedded -->
- <replaceregexp file="${config.xml}"
+ <replaceregexp file="${agent.config.xml}"
match='<entry key="rhq.agent.agent-update.enabled" value="true" />'
- replace='<entry key="rhq.agent.agent-update.enabled" value="false" /> BOOO' />
-
+ replace='<entry key="rhq.agent.agent-update.enabled" value="false" />' />
+ <!-- because we don't want log4j writing files in places we don't want, don't use file appenders. -->
+ <!-- our WildFly/EAP subsystem extension will turn this back on at runtime after log4j is properly configured. -->
+ <replaceregexp file="${agent.config.dir}/log4j.xml" flags="g"
+ match='<appender-ref ref="FILE".*/>'
+ replace='<!-- <appender-ref ref="FILE"/> -->' />
+ <replaceregexp file="${agent.config.dir}/log4j.xml" flags="g"
+ match='<appender-ref ref="COMMANDTRACE".*/>'
+ replace='<!-- <appender-ref ref="COMMANDTRACE"/> -->' />
+ <jar destfile="${agent.lib}/rhq-enterprise-agent-${project.version}.jar"
+ basedir="${agent.config.dir}"
+ includes="log4j.xml"
+ update="true" />
</target>
</configuration>
<goals>
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
new file mode 100644
index 0000000..187527b
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentConfigurationSetup.java
@@ -0,0 +1,305 @@
+package org.rhq.embeddedagent.extension;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+import java.util.prefs.Preferences;
+
+import org.apache.log4j.LogManager;
+import org.apache.log4j.xml.DOMConfigurator;
+
+import org.jboss.as.server.ServerEnvironment;
+import org.jboss.logging.Logger;
+import org.jboss.modules.Resource;
+import org.jboss.util.StringPropertyReplacer;
+
+import org.rhq.core.util.stream.StreamUtil;
+import org.rhq.enterprise.agent.AgentConfiguration;
+import org.rhq.enterprise.agent.AgentConfigurationConstants;
+import org.rhq.enterprise.agent.AgentConfigurationUpgrade;
+import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants;
+
+public class AgentConfigurationSetup {
+
+ private final Logger log = Logger.getLogger(AgentConfigurationSetup.class);
+
+ private static final String DATA_DIRECTORY_NAME = "embeddedagent";
+
+ /**
+ * The location of the configuration file - can be a file path or path within classloader.
+ */
+ private final Resource configFile;
+
+ /**
+ * Properties that will be used to override preferences found in the preferences node and the configuration
+ * preferences file.
+ */
+ private final Properties configurationOverrides;
+
+ /**
+ * If <code>true</code>, will revert the agent's configuration back to the original configuration file.
+ * Otherwise, the configuration will be that which is currently persisted in the preferences store.
+ */
+ private final boolean resetConfigurationAtStartup;
+
+ /**
+ * The preferences node name that identifies the configuration set used to configure the services.
+ */
+ private final String preferencesNodeName;
+
+ /**
+ * Provides environment information about the server in which we are embedded.
+ */
+ private final ServerEnvironment serverEnvironment;
+
+ public AgentConfigurationSetup(Resource configFile, boolean resetConfigurationAtStartup,
+ Properties configurationOverrides, ServerEnvironment serverEnv) {
+
+ this.configFile = configFile;
+ this.resetConfigurationAtStartup = resetConfigurationAtStartup;
+ this.serverEnvironment = serverEnv;
+ this.configurationOverrides = prepareConfigurationOverrides(configurationOverrides);
+
+ String agentName = configurationOverrides.getProperty(AgentConfigurationConstants.NAME, "embeddedagent");
+ preferencesNodeName = agentName;
+ System.setProperty("rhq.agent.preferences-node", preferencesNodeName);
+ }
+
+ public String getPreferencesNodeName() {
+ return this.preferencesNodeName;
+ }
+
+ private Properties prepareConfigurationOverrides(Properties overrides) {
+ // perform some checking to setup defaults if need be
+ String agentName = overrides.getProperty(AgentConfigurationConstants.NAME, "");
+ if (agentName.trim().length() == 0 || "-".equals(agentName)) {
+ agentName = "embeddedagent-" + serverEnvironment.getNodeName();
+ }
+
+ agentName = StringPropertyReplacer.replaceProperties(agentName);
+ overrides.put(AgentConfigurationConstants.NAME, agentName);
+
+ File dataDir = getAgentDataDirectory();
+ File pluginsDir = new File(serverEnvironment.getServerDataDir(), "embeddedagent-plugins");
+ overrides.put(AgentConfigurationConstants.DATA_DIRECTORY, dataDir.getAbsolutePath());
+ overrides.put(AgentConfigurationConstants.PLUGINS_DIRECTORY, pluginsDir.getAbsolutePath());
+ overrides.put(ServiceContainerConfigurationConstants.DATA_DIRECTORY, dataDir.getAbsolutePath());
+
+ return overrides;
+ }
+
+ private File getAgentDataDirectory() {
+ File dir = new File(serverEnvironment.getServerDataDir(), DATA_DIRECTORY_NAME);
+ dir.mkdirs();
+ return dir;
+ }
+
+ public void preConfigureAgent() throws Exception {
+
+ // we need to store the preferences prior to starting the agent
+ if (resetConfigurationAtStartup) {
+ log.debug("Resetting the embedded agent's configuration back to its original settings");
+ reloadAgentConfiguration();
+ cleanDataDirectory();
+ } else {
+ log.debug("Loading the embedded agent's pre-existing configuration from preferences");
+ prepareConfigurationPreferences();
+ }
+
+ return;
+ }
+
+ /**
+ * Prepares the log config file so it writes the logs to the server's log directory.
+ * This is needed if we call or use any agent class because it wants to use log4j.
+ * This MUST be called prior to using any class that logs via log4j.
+ *
+ * @param logConfigFile the agent's out-of-box log config file
+ * @return the new log config file that the agent should use
+ * @throws Exception
+ */
+ public void prepareLogConfigFile(Resource logConfigFile) throws Exception {
+ try {
+ File logDir = this.serverEnvironment.getServerLogDir();
+ String agentLogFile = new File(logDir, "embedded-agent.log").getAbsolutePath();
+ String cmdTraceLogFile = new File(logDir, "embedded-agent-command-trace.log").getAbsolutePath();
+
+ String logConfig = new String(StreamUtil.slurp(logConfigFile.openStream()));
+ logConfig = logConfig.replace("\"logs/agent.log\"", "\"" + agentLogFile + "\"");
+ logConfig = logConfig.replace("\"logs/command-trace.log\"", "\"" + cmdTraceLogFile + "\"");
+ for (String app : new String[] { "ref=\"FILE\"", "ref=\"COMMANDTRACE\"" }) {
+ logConfig = logConfig.replace("<!-- <appender-ref " + app + "/> -->", "<appender-ref " + app + "/>");
+ }
+
+ File runtimeLogConfigFile = new File(getAgentDataDirectory(), "/log4j.xml");
+ ByteArrayInputStream in = new ByteArrayInputStream(logConfig.getBytes());
+ StreamUtil.copy(in, new FileOutputStream(runtimeLogConfigFile));
+
+ // this hot deploys the log4j.xml into log4j which is what the agent wants to use
+ LogManager.resetConfiguration();
+ DOMConfigurator.configure(runtimeLogConfigFile.toURI().toURL());
+ } catch (Exception e) {
+ log.error("Cannot tell the agent to put its logs in the logs directory - look elsewhere for the log files");
+ }
+ }
+
+ private Properties getAgentConfigurationProperties() {
+ try {
+ Properties properties = new Properties();
+ Preferences prefs = getPreferencesNode();
+
+ for (String key : prefs.keys()) {
+ properties.setProperty(key, prefs.get(key, "?"));
+ }
+
+ return properties;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void reloadAgentConfiguration() throws Exception {
+ getPreferencesNode().clear();
+ prepareConfigurationPreferences();
+ }
+
+ private void cleanDataDirectory() {
+ AgentConfiguration config = new AgentConfiguration(getPreferencesNode());
+ File dataDir = config.getDataDirectory();
+
+ cleanDataFile(dataDir);
+
+ // it is conceivable the comm services data directory was configured in a different
+ // place than where the agent's data directory is - make sure we clean out that other data dir
+ File commDataDir = config.getServiceContainerPreferences().getDataDirectory();
+ if (!commDataDir.getAbsolutePath().equals(dataDir.getAbsolutePath())) {
+ cleanDataFile(commDataDir);
+ }
+
+ return;
+ }
+
+ /**
+ * This will ensure the agent's configuration preferences are populated. If need be, the configuration file is
+ * loaded and all overrides are overlaid on top of the preferences. The preferences are also upgraded to ensure they
+ * conform to the latest configuration schema version.
+ *
+ * @return the agent configuration
+ *
+ * @throws Exception
+ */
+ private AgentConfiguration prepareConfigurationPreferences() throws Exception {
+ Preferences prefNode = getPreferencesNode();
+ AgentConfiguration config = new AgentConfiguration(prefNode);
+
+ if (config.getAgentConfigurationVersion() == 0) {
+ config = loadConfigurationFile();
+ }
+
+ // now that the configuration preferences are loaded, we need to override them with any bootstrap override properties
+ Properties overrides = configurationOverrides;
+ if (overrides != null) {
+ for (Map.Entry<Object, Object> entry : overrides.entrySet()) {
+ String key = entry.getKey().toString();
+ String value = entry.getValue().toString();
+
+ // allow ${var} notation in the values so we can provide variable replacements in the values
+ value = StringPropertyReplacer.replaceProperties(value);
+
+ prefNode.put(key, value);
+ }
+ }
+
+ // let's make sure our configuration is upgraded to the latest schema
+ AgentConfigurationUpgrade.upgradeToLatest(config.getPreferences());
+
+ return config;
+ }
+
+ /**
+ * Loads the configuration file.
+ *
+ * @return the configuration that was loaded
+ *
+ * @throws Exception on failure
+ */
+ private AgentConfiguration loadConfigurationFile() throws Exception {
+ // We need to clear out any previous configuration in case the current config file doesn't specify a preference
+ // that already exists in the preferences node. In this case, the configuration file wants to fall back on the
+ // default value and if we don't clear the preferences, we aren't guaranteed the value stored in the backing
+ // store is the default value.
+ // But first we need to backup these original preferences in case the config file fails to load -
+ // we'll restore the original values in that case.
+
+ Preferences prefNode = getPreferencesNode();
+ ByteArrayOutputStream backup = new ByteArrayOutputStream();
+ prefNode.exportSubtree(backup);
+ prefNode.clear();
+
+ // now load in the preferences
+ try {
+ ByteArrayOutputStream rawConfigFile = new ByteArrayOutputStream();
+ InputStream rawConfigInputStream = configFile.openStream();
+ StreamUtil.copy(rawConfigInputStream, rawConfigFile, true);
+ String newConfig = StringPropertyReplacer.replaceProperties(rawConfigFile.toString());
+ ByteArrayInputStream newConfigInputStream = new ByteArrayInputStream(newConfig.getBytes());
+ Preferences.importPreferences(newConfigInputStream);
+
+ if (new AgentConfiguration(prefNode).getAgentConfigurationVersion() == 0) {
+ throw new IllegalArgumentException("Bad preferences node");
+ }
+ } catch (Exception e) {
+ // a problem occurred importing the config file; let's restore our original values
+ try {
+ Preferences.importPreferences(new ByteArrayInputStream(backup.toByteArray()));
+ } catch (Exception e1) {
+ // its conceivable the same problem occurred here as with the original exception (backing store problem?)
+ // let's throw the original exception, not this one
+ }
+ throw e;
+ }
+
+ AgentConfiguration agentConfig = new AgentConfiguration(prefNode);
+ return agentConfig;
+ }
+
+ /**
+ * Returns the preferences for this agent. The node returned is where all preferences are to be stored.
+ *
+ * @return the agent preferences
+ */
+ private Preferences getPreferencesNode() {
+ Preferences topNode = Preferences.userRoot().node(AgentConfigurationConstants.PREFERENCE_NODE_PARENT);
+ Preferences prefNode = topNode.node(preferencesNodeName);
+ return prefNode;
+ }
+
+ /**
+ * This will delete the given file and if its a directory, will recursively delete its contents and its
+ * subdirectories.
+ *
+ * @param file the file/directory to delete
+ */
+ private void cleanDataFile(File file) {
+ boolean deleted;
+
+ File[] doomedFiles = file.listFiles();
+ if (doomedFiles != null) {
+ for (File doomedFile : doomedFiles) {
+ cleanDataFile(doomedFile); // call this method recursively
+ }
+ }
+
+ deleted = file.delete();
+
+ if (!deleted) {
+ log.warn("Cannot clean data file [" + file + "]");
+ }
+
+ return;
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 7860479..f4644e1 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -1,8 +1,10 @@
package org.rhq.embeddedagent.extension;
+import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import org.jboss.as.server.ServerEnvironment;
@@ -16,6 +18,8 @@ import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
+import org.rhq.enterprise.agent.AgentMain;
+
public class AgentService implements Service<AgentService> {
public static final ServiceName SERVICE_NAME = ServiceName.of("org.rhq").append(
@@ -39,6 +43,17 @@ public class AgentService implements Service<AgentService> {
private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
/**
+ * Provides a mechanism to pre-configure the agent.
+ */
+ private AgentConfigurationSetup configSetup;
+
+ /**
+ * This is the actual embedded agent. This is what handles the plugin container lifecycle
+ * and communication to/from the server.
+ */
+ private AgentMain theAgent;
+
+ /**
* Provides the status flag of the embedded agent itself (not of this service).
*/
private AtomicBoolean agentStarted = new AtomicBoolean(false);
@@ -96,12 +111,45 @@ public class AgentService implements Service<AgentService> {
return agentStarted.get();
}
- protected void startAgent() {
+ protected void startAgent() throws StartException {
+ if (isAgentStarted()) {
+ log.info("Embedded agent is already started.");
+ return;
+ }
+
log.info("Starting the embedded agent now");
- agentStarted.set(true);
+ try {
+ // make sure we pre-configure the agent with some settings taken from our runtime environment
+ ServerEnvironment env = envServiceValue.getValue();
+ Properties overrides = new Properties();
+ boolean resetConfigurationAtStartup = true;
+ AgentConfigurationSetup configSetup = new AgentConfigurationSetup(
+ getExportedResource("conf/agent-configuration.xml"), resetConfigurationAtStartup, overrides, env);
+ // prepare the agent logging first thing so the agent logs messages using this config
+ configSetup.prepareLogConfigFile(getExportedResource("conf/log4j.xml"));
+ configSetup.preConfigureAgent();
+
+ // build the startup command line arguments to pass to the agent
+ String[] args = new String[3];
+ args[0] = "--daemon";
+ args[1] = "--pref=" + configSetup.getPreferencesNodeName();
+ args[2] = "--output=" + new File(env.getServerLogDir(), "embedded-agent.out").getAbsolutePath();
+
+ theAgent = new AgentMain(args);
+ theAgent.start();
+
+ agentStarted.set(true);
+ } catch (Exception e) {
+ throw new StartException(e);
+ }
}
protected void stopAgent() {
+ if (!isAgentStarted()) {
+ log.info("Embedded agent is already stopped.");
+ return;
+ }
+
log.info("Stopping the embedded agent now");
agentStarted.set(false);
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
index cdb14fd..e4080df 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
@@ -7,14 +7,15 @@ import org.jboss.dmr.ModelNode;
import org.jboss.logging.Logger;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.ServiceNotFoundException;
+import org.jboss.msc.service.StartException;
class AgentSubsystemRestart implements OperationStepHandler {
- static final AgentSubsystemRestart INSTANCE = new AgentSubsystemRestart();
+ static final AgentSubsystemRestart INSTANCE = new AgentSubsystemRestart();
- private final Logger log = Logger.getLogger(AgentSubsystemRestart.class);
+ private final Logger log = Logger.getLogger(AgentSubsystemRestart.class);
- private AgentSubsystemRestart() {
+ private AgentSubsystemRestart() {
}
@Override
@@ -22,15 +23,17 @@ class AgentSubsystemRestart implements OperationStepHandler {
try {
ServiceName name = AgentService.SERVICE_NAME;
AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
- .getValue();
+ .getValue();
log.info("Asked to restart the embedded agent");
service.stopAgent();
service.startAgent();
} catch (ServiceNotFoundException snfe) {
throw new OperationFailedException("Cannot restart embedded agent - the agent is disabled", snfe);
- }
+ } catch (StartException se) {
+ throw new OperationFailedException("Cannot restart embedded agent", se);
+ }
opContext.completeStep();
return;
- }
+ }
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index 2cc72ef..c818032 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -5,6 +5,7 @@
<resources>
<resource-root path="${project.build.finalName}.jar"/>
<resource-root path="rhq-agent"/>
+ <resource-root path="rhq-agent/conf"/> <!-- so we pick up the agent's log4j.xml from here -->
<resource-root path="rhq-agent/lib/commons-httpclient-2.0.2.jar" /> <!-- agent seems to want this specific version -->
<resource-root path="rhq-agent/lib/commons-io-${commons-io.version}.jar" />
<resource-root path="rhq-agent/lib/commons-logging-${commons-logging.version}.jar" />
diff --git a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
index b9310c4..70d6642 100644
--- a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
@@ -8,15 +8,18 @@
<includeBaseDirectory>false</includeBaseDirectory>
<baseDirectory>${project.build.finalName}-module</baseDirectory>
<fileSets>
+ <!-- the module.xml which only does in the zip, it is not in the jar -->
<fileSet>
- <directory>${project.build.outputDirectory}/module</directory>
+ <directory>${basedir}/src/main/resources/module</directory>
<outputDirectory>/org/rhq/${artifactId}</outputDirectory>
<includes>
<include>main/module.xml</include>
</includes>
+ <filtered>true</filtered>
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
+ <!-- the extension subsystem jar - this is just the extension classes, not the agent itself -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/org/rhq/${artifactId}/main</outputDirectory>
@@ -26,6 +29,7 @@
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
+ <!-- the agent distro itself, inside the module's rhq-agent subdirectory -->
<fileSet>
<directory>${project.build.directory}/rhq-agent</directory>
<outputDirectory>/org/rhq/${artifactId}/main/rhq-agent</outputDirectory>
@@ -35,6 +39,7 @@
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
+ <!-- the agent's native libraries which has to be specially organized for JBoss Modules to find them -->
<fileSet>
<directory>${project.build.directory}/module-lib</directory>
<outputDirectory>/org/rhq/${artifactId}/main/lib</outputDirectory>
commit 9a36d10aea8237c8058e75090100f914d747227c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jan 28 17:13:02 2014 -0500
inject the server env service into our service so we can get things like data dir, hostname, etc
add the rhq-agent distro to the exported resource roots so we can get the config xml
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
index 383f012..7860479 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -5,12 +5,16 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.jboss.as.server.ServerEnvironment;
import org.jboss.logging.Logger;
+import org.jboss.modules.Module;
+import org.jboss.modules.Resource;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
+import org.jboss.msc.value.InjectedValue;
public class AgentService implements Service<AgentService> {
@@ -20,11 +24,17 @@ public class AgentService implements Service<AgentService> {
private final Logger log = Logger.getLogger(AgentService.class);
/**
+ * Our subsystem add-step handler will inject this as a dependency for us.
+ * This service gives us information about the server, like the install directory, data directory, etc.
+ */
+ InjectedValue<ServerEnvironment> envServiceValue = new InjectedValue<ServerEnvironment>();
+
+ /**
* This service can be configured to be told explicitly about certain plugins to be
* enabled or disabled. This map holds that configuration. These aren't necessarily
* all the plugins that will be loaded, but they are those plugins this service was
* explicitly told about and indicates if they should be enabled or disabled.
- * TODO: For any plugin not specified will, by default, be WHAT? Disabled???
+ * TODO: For any plugin not specified will, by default, be WHAT? Disabled???
*/
private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
@@ -95,4 +105,18 @@ public class AgentService implements Service<AgentService> {
log.info("Stopping the embedded agent now");
agentStarted.set(false);
}
+
+ /**
+ * Gets information about a file that is inside our module. Use this to
+ * obtain files locationed in the embedded agent, for example, pass in
+ * "conf/agent-configuration.xml" to get the config file.
+ *
+ * @param name name of the agent file
+ * @return object referencing the file from our module
+ */
+ private Resource getExportedResource(String name) {
+ Module module = Module.forClass(getClass());
+ Resource r = module.getExportedResource("rhq-agent", name);
+ return r;
+ }
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
index 7541da1..f9d3291 100644
--- a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -7,6 +7,8 @@ import org.jboss.as.controller.AbstractAddStepHandler;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.ServiceVerificationHandler;
+import org.jboss.as.server.ServerEnvironment;
+import org.jboss.as.server.ServerEnvironmentService;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.logging.Logger;
@@ -62,8 +64,12 @@ class AgentSubsystemAdd extends AbstractAddStepHandler {
service.setPlugins(pluginsWithEnableFlag);
ServiceName name = AgentService.SERVICE_NAME;
- ServiceController<AgentService> controller = context.getServiceTarget().addService(name, service)
- .addListener(verificationHandler).setInitialMode(Mode.ACTIVE).install();
+ ServiceController<AgentService> controller = context.getServiceTarget() //
+ .addService(name, service) //
+ .addDependency(ServerEnvironmentService.SERVICE_NAME, ServerEnvironment.class, service.envServiceValue) //
+ .addListener(verificationHandler) //
+ .setInitialMode(Mode.ACTIVE) //
+ .install();
newControllers.add(controller);
return;
}
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index c041115..2cc72ef 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -4,6 +4,7 @@
<resources>
<resource-root path="${project.build.finalName}.jar"/>
+ <resource-root path="rhq-agent"/>
<resource-root path="rhq-agent/lib/commons-httpclient-2.0.2.jar" /> <!-- agent seems to want this specific version -->
<resource-root path="rhq-agent/lib/commons-io-${commons-io.version}.jar" />
<resource-root path="rhq-agent/lib/commons-logging-${commons-logging.version}.jar" />
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
index 40054b9..b33fb4f 100644
--- a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -16,16 +16,17 @@ import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRI
import java.util.ArrayList;
import java.util.List;
+import org.testng.Assert;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.subsystem.test.KernelServices;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.msc.service.ServiceNotFoundException;
-import org.testng.Assert;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
@Test
public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
@@ -291,11 +292,13 @@ public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
Assert.assertEquals(plugins.get(2).getName(), "foo"); // foo plugin we added above
Assert.assertEquals(plugins.get(2).getValue().asBoolean(), true);
+ /* TODO: I think we need to mock the ServerEnvironmentService dependency before we can do this
// execute status
ModelNode statusOp = new ModelNode();
statusOp.get(OP).set(AgentSubsystemExtension.AGENT_STATUS_OP);
statusOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
result = services.executeOperation(statusOp);
- Assert.assertEquals(checkResultAndGetContents(result).asString(), "STARTED");
+ Assert.assertTrue(checkResultAndGetContents(result).asBoolean());
+ */
}
}
commit 0f68e44f99567c21a4643814d514f3ccd28b8502
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Jan 28 15:29:31 2014 -0500
putting native libs in their proper place for EAP to find them
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
index d20815b..c6118a6 100644
--- a/modules/enterprise/server/embeddedagent/pom.xml
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -54,6 +54,61 @@
</plugin>
<plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>rename-native-libs-and-reconfigure</id>
+ <phase>process-resources</phase>
+ <configuration>
+ <target>
+ <echo>Must move native libraries so JBoss Modules can find them</echo>
+ <property name="agent.lib" location="${project.build.directory}/rhq-agent/lib"/>
+ <property name="module.lib" location="${project.build.directory}/module-lib"/>
+ <!-- Notice that the agent's "augeas" native libs are not copied.
+ I think its only used for some plugins we won't be using in embedded mode anyway. -->
+ <!-- TODO these should probably be "move", I don't think we need dup copies in agent lib anymore -->
+ <copy tofile="${module.lib}/linux-i686/libsigar.so" file="${agent.lib}/libsigar-x86-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-x86_64/libsigar.so" file="${agent.lib}/libsigar-amd64-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-ia64/libsigar.so" file="${agent.lib}/libsigar-ia64-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-ppc64/libsigar.so" file="${agent.lib}/libsigar-ppc64-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-ppc/libsigar.so" file="${agent.lib}/libsigar-ppc-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/linux-s390x/libsigar.so" file="${agent.lib}/libsigar-s390x-linux.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/win-i686/sigar.dll" file="${agent.lib}/sigar-x86-winnt.dll" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/win-x86_64/sigar.dll" file="${agent.lib}/sigar-amd64-winnt.dll" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/hpux-ia64w/libsigar.sl" file="${agent.lib}/libsigar-ia64-hpux-11.sl" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/hpux-parisc/libsigar.sl" file="${agent.lib}/libsigar-pa-hpux-11.sl" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/aix-ppc/libsigar.so" file="${agent.lib}/libsigar-ppc-aix-5.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/aix-ppc64/libsigar.so" file="${agent.lib}/libsigar-ppc64-aix-5.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/solaris-i686/libsigar.so" file="${agent.lib}/libsigar-x86-solaris.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/solaris-x86_64/libsigar.so" file="${agent.lib}/libsigar-amd64-solaris.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/solaris-sparc/libsigar.so" file="${agent.lib}/libsigar-sparc-solaris.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/solaris-sparcv9/libsigar.so" file="${agent.lib}/libsigar-sparc64-solaris.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/freebsd-i686/libsigar.so" file="${agent.lib}/libsigar-x86-freebsd-6.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/freebsd-x86_64/libsigar.so" file="${agent.lib}/libsigar-amd64-freebsd-6.so" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/macosx-i686/libsigar.dylib" file="${agent.lib}/libsigar-universal-macosx.dylib" preservelastmodified="true"/>
+ <copy tofile="${module.lib}/macosx-x86_64/libsigar.dylib" file="${agent.lib}/libsigar-universal64-macosx.dylib" preservelastmodified="true"/>
+
+ <echo>Adjust default configuration</echo>
+ <property name="config.xml" location="${project.build.directory}/rhq-agent/conf/agent-configuration.xml"/>
+ <!-- because we are embedded, as can't have a prompt and ask user, so we will ensure the agent is always fully setup -->
+ <replaceregexp file="${config.xml}" flags="s"
+ match='<!--(\s*)<entry key="rhq.agent.configuration-setup-flag" value="false" />(\s*)-->'
+ replace='<entry key="rhq.agent.configuration-setup-flag" value="true" /> BOOO' />
+ <!-- we don't support agent auto-update while the agent is embedded -->
+ <replaceregexp file="${config.xml}"
+ match='<entry key="rhq.agent.agent-update.enabled" value="true" />'
+ replace='<entry key="rhq.agent.agent-update.enabled" value="false" /> BOOO' />
+
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
diff --git a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
index c526e5c..b9310c4 100644
--- a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
@@ -35,6 +35,12 @@
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
+ <fileSet>
+ <directory>${project.build.directory}/module-lib</directory>
+ <outputDirectory>/org/rhq/${artifactId}/main/lib</outputDirectory>
+ <fileMode>0755</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
</fileSets>
</assembly>
commit ee2189168a15346b80d1e238ec83a21841fcf4bf
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jan 27 17:28:30 2014 -0500
there is no easy way to build a generated module.xml from the agent distro dependency list, so just put these in directly in the module.xml.
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index 662dd31..c041115 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -4,7 +4,33 @@
<resources>
<resource-root path="${project.build.finalName}.jar"/>
- <resource-root path="rhq-agent" />
+ <resource-root path="rhq-agent/lib/commons-httpclient-2.0.2.jar" /> <!-- agent seems to want this specific version -->
+ <resource-root path="rhq-agent/lib/commons-io-${commons-io.version}.jar" />
+ <resource-root path="rhq-agent/lib/commons-logging-${commons-logging.version}.jar" />
+ <resource-root path="rhq-agent/lib/concurrent-${concurrent.version}.jar" />
+ <resource-root path="rhq-agent/lib/dom4j-1.6.jar" /> <!-- agent seems to want this specific version -->
+ <resource-root path="rhq-agent/lib/getopt-${getopt.version}.jar" />
+ <resource-root path="rhq-agent/lib/i18nlog-${i18nlog.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-common-core-${jboss-common-core.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-jmx-${jboss-jmx.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-logging-${jboss-logging.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-remoting-${jboss-remoting.version}.jar" />
+ <resource-root path="rhq-agent/lib/jboss-serialization-${jboss-serialization.version}.jar" />
+ <resource-root path="rhq-agent/lib/jline-${jline.version}.jar" />
+ <resource-root path="rhq-agent/lib/log4j-${log4j.version}.jar" />
+ <resource-root path="rhq-agent/lib/persistence-api-1.0.jar" />
+ <resource-root path="rhq-agent/lib/rhq-common-drift-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-client-api-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-comm-api-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-domain-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-native-system-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-plugin-api-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-plugin-container-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-core-util-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-enterprise-agent-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/rhq-enterprise-comm-${project.version}.jar" />
+ <resource-root path="rhq-agent/lib/sigar-${sigar.version}.jar" />
+ <resource-root path="rhq-agent/lib/trove4j-3.0.3.jar" />
</resources>
<dependencies>
commit 6ea0f4a402437545178f14687f0c735878cd979c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jan 27 10:37:05 2014 -0500
unpack the entire agent zip inside the module.
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
index 70ecea6..d20815b 100644
--- a/modules/enterprise/server/embeddedagent/pom.xml
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -30,13 +30,28 @@
</resources>
<plugins>
- <!-- COPY AGENT BINARIES <plugin> <artifactId>maven-dependency-plugin</artifactId>
- <executions> <execution> <id>copy-agent</id> <phase>process-resources</phase>
- <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem>
- <groupId>org.rhq</groupId> <artifactId>rhq-enterprise-server-ear</artifactId>
- <type>ear</type> <outputDirectory>${project.build.directory}/agent/</outputDirectory>
- </artifactItem> </artifactItems> </configuration> </execution> </executions>
- </plugin> -->
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-agent</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-agent</artifactId>
+ <type>zip</type>
+ <outputDirectory>${project.build.directory}</outputDirectory>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
@@ -69,6 +84,12 @@
<artifactId>jboss-as-server</artifactId>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-agent</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
<!-- test deps -->
<dependency>
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
index 295c78d..662dd31 100644
--- a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -4,7 +4,7 @@
<resources>
<resource-root path="${project.build.finalName}.jar"/>
- <!-- <resource-root path="agent" /> -->
+ <resource-root path="rhq-agent" />
</resources>
<dependencies>
diff --git a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
index a4cab0a..c526e5c 100644
--- a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
+++ b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
@@ -27,8 +27,11 @@
<directoryMode>0755</directoryMode>
</fileSet>
<fileSet>
- <directory>${project.build.directory}/agent</directory>
- <outputDirectory>/org/rhq/${artifactId}/main/agent</outputDirectory>
+ <directory>${project.build.directory}/rhq-agent</directory>
+ <outputDirectory>/org/rhq/${artifactId}/main/rhq-agent</outputDirectory>
+ <excludes>
+ <exclude>plugins</exclude>
+ </excludes>
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
</fileSet>
commit 1f45e29da1e9153169a89741067e1559a5c69f77
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 24 20:25:13 2014 -0500
initial start of the embedded agent as a WildFly extension subsystem.
right now, this is just the shell service. the agent isn't in here yet. but the service
is fully wired into the AS infrastructure and shows in the AS CLI. has a normal model just like all other subsystems.
Now just have to build the module with the agent inside and have the shell call the AgentMain
diff --git a/.classpath b/.classpath
index 7bd64fe..cb9f5bc 100644
--- a/.classpath
+++ b/.classpath
@@ -77,6 +77,8 @@
<classpathentry kind="src" path="modules/enterprise/server/safe-invoker/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/server/startup-subsystem/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/startup-subsystem/src/test/java"/>
+ <classpathentry kind="src" path="modules/enterprise/server/embeddedagent/src/main/java"/>
+ <classpathentry kind="src" path="modules/enterprise/server/embeddedagent/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/ant-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/filetemplate-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/alert-subject/src/main/java"/>
diff --git a/modules/enterprise/server/embeddedagent/pom.xml b/modules/enterprise/server/embeddedagent/pom.xml
new file mode 100644
index 0000000..70ecea6
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/pom.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-parent</artifactId>
+ <version>4.10.0-SNAPSHOT</version>
+ <relativePath>../../../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>embeddedagent</artifactId>
+
+ <name>RHQ Embedded Agent Subsystem</name>
+
+ <properties>
+ <!-- this is used to replace the variable in module.xml -->
+ <moduleName>${project.groupId}.${project.artifactId}</moduleName>
+ <moduleDir>org/rhq/${project.artifactId}</moduleDir>
+ </properties>
+
+ <build>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+
+ <plugins>
+ <!-- COPY AGENT BINARIES <plugin> <artifactId>maven-dependency-plugin</artifactId>
+ <executions> <execution> <id>copy-agent</id> <phase>process-resources</phase>
+ <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem>
+ <groupId>org.rhq</groupId> <artifactId>rhq-enterprise-server-ear</artifactId>
+ <type>ear</type> <outputDirectory>${project.build.directory}/agent/</outputDirectory>
+ </artifactItem> </artifactItems> </configuration> </execution> </executions>
+ </plugin> -->
+
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <configuration>
+ <descriptors>
+ <descriptor>src/main/scripts/module-assembly.xml</descriptor>
+ </descriptors>
+ </configuration>
+ <executions>
+ <execution>
+ <id>module-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.as</groupId>
+ <artifactId>jboss-as-controller</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.as</groupId>
+ <artifactId>jboss-as-server</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- test deps -->
+ <dependency>
+ <groupId>org.jboss.as</groupId>
+ <artifactId>jboss-as-subsystem-test</artifactId>
+ <version>${jboss.version}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.devContainerServerPath}</rhq.containerDir>
+ <rhq.deploymentName>${project.build.finalName}.zip</rhq.deploymentName>
+ <rhq.deploymentDir>${rhq.containerDir}/modules/</rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>package</phase>
+ <configuration>
+ <target>
+ <echo>*** Deploying Embedded Agent module to ${rhq.deploymentDir}</echo>
+ <unzip src="target/${rhq.deploymentName}"
+ dest="${rhq.deploymentDir}" />
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <target>
+ <echo>*** Deleting Embedded Agent module ... ${rhq.deploymentDir}/${moduleDir}</echo>
+ <delete dir="${rhq.deploymentDir}/${moduleDir}" />
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+</project>
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
new file mode 100644
index 0000000..a815600
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentEnabledAttributeHandler.java
@@ -0,0 +1,35 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.AbstractWriteAttributeHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.dmr.ModelNode;
+import org.jboss.logging.Logger;
+
+class AgentEnabledAttributeHandler extends AbstractWriteAttributeHandler<Void> {
+
+ public static final AgentEnabledAttributeHandler INSTANCE = new AgentEnabledAttributeHandler();
+
+ private final Logger log = Logger.getLogger(AgentEnabledAttributeHandler.class);
+
+ private AgentEnabledAttributeHandler() {
+ super(AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF);
+ }
+
+ @Override
+ protected boolean applyUpdateToRuntime(OperationContext context,
+ ModelNode operation, String attributeName, ModelNode resolvedValue,
+ ModelNode currentValue, HandbackHolder<Void> handbackHolder)
+ throws OperationFailedException {
+ log.info("Embedded agent enabled attribute changed: " + attributeName + "=" + resolvedValue);
+ // there is nothing for us to do - this only affects us when we are restarted, return true to say we must reload
+ return true;
+ }
+
+ @Override
+ protected void revertUpdateToRuntime(OperationContext context,
+ ModelNode operation, String attributeName,
+ ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
+ // no-op
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
new file mode 100644
index 0000000..383f012
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentService.java
@@ -0,0 +1,98 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.Service;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.StartContext;
+import org.jboss.msc.service.StartException;
+import org.jboss.msc.service.StopContext;
+
+public class AgentService implements Service<AgentService> {
+
+ public static final ServiceName SERVICE_NAME = ServiceName.of("org.rhq").append(
+ AgentSubsystemExtension.SUBSYSTEM_NAME);
+
+ private final Logger log = Logger.getLogger(AgentService.class);
+
+ /**
+ * This service can be configured to be told explicitly about certain plugins to be
+ * enabled or disabled. This map holds that configuration. These aren't necessarily
+ * all the plugins that will be loaded, but they are those plugins this service was
+ * explicitly told about and indicates if they should be enabled or disabled.
+ * TODO: For any plugin not specified will, by default, be WHAT? Disabled???
+ */
+ private Map<String, Boolean> plugins = Collections.synchronizedMap(new HashMap<String, Boolean>());
+
+ /**
+ * Provides the status flag of the embedded agent itself (not of this service).
+ */
+ private AtomicBoolean agentStarted = new AtomicBoolean(false);
+
+ public AgentService() {
+ }
+
+ @Override
+ public AgentService getValue() throws IllegalStateException, IllegalArgumentException {
+ return this;
+ }
+
+ @Override
+ public void start(StartContext context) throws StartException {
+ log.info("Embedded agent service starting");
+ startAgent();
+ }
+
+ @Override
+ public void stop(StopContext context) {
+ log.info("Embedded agent service stopping");
+ stopAgent();
+ }
+
+ /**
+ * Returns the set of plugins the service knows about and whether
+ * or not those plugins are to be enabled or disabled.
+ * You get back a copy, not the actual map.
+ *
+ * @return plugins and their enable-flag
+ */
+ protected Map<String, Boolean> getPlugins() {
+ synchronized (plugins) {
+ return new HashMap<String, Boolean>(plugins);
+ }
+ }
+
+ /**
+ * Sets the enable flags for plugins.
+ *
+ * @return plugins and their enable-flag (if <code>null</code>, assumes an empty map)
+ */
+ protected void setPlugins(Map<String, Boolean> pluginsWithEnableFlag) {
+ synchronized (plugins) {
+ plugins.clear();
+ if (pluginsWithEnableFlag != null) {
+ plugins.putAll(pluginsWithEnableFlag);
+ }
+ }
+
+ log.info("New plugin definitions: " + pluginsWithEnableFlag);
+ }
+
+ protected boolean isAgentStarted() {
+ return agentStarted.get();
+ }
+
+ protected void startAgent() {
+ log.info("Starting the embedded agent now");
+ agentStarted.set(true);
+ }
+
+ protected void stopAgent() {
+ log.info("Stopping the embedded agent now");
+ agentStarted.set(false);
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
new file mode 100644
index 0000000..7541da1
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java
@@ -0,0 +1,70 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.jboss.as.controller.AbstractAddStepHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.ServiceVerificationHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.Property;
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.ServiceController;
+import org.jboss.msc.service.ServiceController.Mode;
+import org.jboss.msc.service.ServiceName;
+
+/**
+ * Handler responsible for adding the subsystem resource to the model
+ */
+class AgentSubsystemAdd extends AbstractAddStepHandler {
+
+ static final AgentSubsystemAdd INSTANCE = new AgentSubsystemAdd();
+
+ private final Logger log = Logger.getLogger(AgentSubsystemAdd.class);
+
+ private AgentSubsystemAdd() {
+ }
+
+ @Override
+ protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
+ AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF.validateAndSet(operation, model);
+ AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.validateAndSet(operation, model);
+ log.info("Populating the embedded agent subsystem model: " + operation + "=" + model);
+ }
+
+ @Override
+ protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model,
+ ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers)
+ throws OperationFailedException {
+
+ boolean enabled = AgentSubsystemDefinition.AGENT_ENABLED_ATTRIBDEF.resolveModelAttribute(context, model)
+ .asBoolean(AgentSubsystemExtension.AGENT_ENABLED_DEFAULT);
+
+ if (!enabled) {
+ log.info("Embedded agent is not enabled and will not be deployed");
+ return;
+ }
+
+ log.info("Embedded agent is enabled and will be deployed");
+ HashMap<String, Boolean> pluginsWithEnableFlag = new HashMap<String, Boolean>();
+ ModelNode pluginsNode = AgentSubsystemDefinition.PLUGINS_ATTRIBDEF.resolveModelAttribute(context, model);
+ if (pluginsNode != null && pluginsNode.isDefined()) {
+ List<Property> pluginsList = pluginsNode.asPropertyList();
+ for (Property pluginsItem : pluginsList) {
+ String pluginName = pluginsItem.getName();
+ boolean pluginEnabled = pluginsItem.getValue().asBoolean();
+ pluginsWithEnableFlag.put(pluginName, pluginEnabled);
+ }
+ }
+
+ AgentService service = new AgentService();
+ service.setPlugins(pluginsWithEnableFlag);
+
+ ServiceName name = AgentService.SERVICE_NAME;
+ ServiceController<AgentService> controller = context.getServiceTarget().addService(name, service)
+ .addListener(verificationHandler).setInitialMode(Mode.ACTIVE).install();
+ newControllers.add(controller);
+ return;
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
new file mode 100644
index 0000000..e43c6c5
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java
@@ -0,0 +1,66 @@
+package org.rhq.embeddedagent.extension;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIBE;
+
+import org.jboss.as.controller.SimpleAttributeDefinition;
+import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
+import org.jboss.as.controller.SimpleResourceDefinition;
+import org.jboss.as.controller.descriptions.DefaultOperationDescriptionProvider;
+import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
+import org.jboss.as.controller.registry.AttributeAccess;
+import org.jboss.as.controller.registry.ManagementResourceRegistration;
+import org.jboss.as.controller.registry.OperationEntry;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.ModelType;
+
+public class AgentSubsystemDefinition extends SimpleResourceDefinition {
+
+ public static final AgentSubsystemDefinition INSTANCE = new AgentSubsystemDefinition();
+
+ protected static final SimpleAttributeDefinition AGENT_ENABLED_ATTRIBDEF = new SimpleAttributeDefinitionBuilder(
+ AgentSubsystemExtension.AGENT_ENABLED, ModelType.BOOLEAN).setAllowExpression(true)
+ .setXmlName(AgentSubsystemExtension.AGENT_ENABLED).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
+ .setDefaultValue(new ModelNode(AgentSubsystemExtension.AGENT_ENABLED_DEFAULT)).setAllowNull(false).build();
+
+ protected static final PluginsAttributeDefinition PLUGINS_ATTRIBDEF = new PluginsAttributeDefinition();
+
+ private AgentSubsystemDefinition() {
+ super(AgentSubsystemExtension.SUBSYSTEM_PATH, AgentSubsystemExtension.getResourceDescriptionResolver(null),
+ AgentSubsystemAdd.INSTANCE, AgentSubsystemRemove.INSTANCE);
+ }
+
+ @Override
+ public void registerAttributes(ManagementResourceRegistration rr) {
+ rr.registerReadWriteAttribute(AGENT_ENABLED_ATTRIBDEF, null, AgentEnabledAttributeHandler.INSTANCE);
+ rr.registerReadWriteAttribute(PLUGINS_ATTRIBDEF, null, PluginsAttributeHandler.INSTANCE);
+ }
+
+ @Override
+ public void registerOperations(ManagementResourceRegistration rr) {
+ super.registerOperations(rr);
+
+ // We always need to add a 'describe' operation
+ rr.registerOperationHandler(DESCRIBE, GenericSubsystemDescribeHandler.INSTANCE,
+ GenericSubsystemDescribeHandler.INSTANCE, false, OperationEntry.EntryType.PRIVATE);
+
+ rr.registerOperationHandler(
+ AgentSubsystemExtension.AGENT_RESTART_OP,
+ AgentSubsystemRestart.INSTANCE,
+ new DefaultOperationDescriptionProvider(AgentSubsystemExtension.AGENT_RESTART_OP, AgentSubsystemExtension
+ .getResourceDescriptionResolver(null)), false, OperationEntry.EntryType.PUBLIC);
+
+ rr.registerOperationHandler(
+ AgentSubsystemExtension.AGENT_STOP_OP,
+ AgentSubsystemStop.INSTANCE,
+ new DefaultOperationDescriptionProvider(AgentSubsystemExtension.AGENT_STOP_OP, AgentSubsystemExtension
+ .getResourceDescriptionResolver(null)), false, OperationEntry.EntryType.PUBLIC);
+
+ rr.registerOperationHandler(
+ AgentSubsystemExtension.AGENT_STATUS_OP,
+ AgentSubsystemStatus.INSTANCE,
+ new DefaultOperationDescriptionProvider(AgentSubsystemExtension.AGENT_STATUS_OP, AgentSubsystemExtension
+ .getResourceDescriptionResolver(null), ModelType.STRING), false, OperationEntry.EntryType.PUBLIC);
+
+ return;
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
new file mode 100644
index 0000000..1ab7a7e
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java
@@ -0,0 +1,175 @@
+package org.rhq.embeddedagent.extension;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+
+import org.jboss.as.controller.Extension;
+import org.jboss.as.controller.ExtensionContext;
+import org.jboss.as.controller.PathAddress;
+import org.jboss.as.controller.PathElement;
+import org.jboss.as.controller.SubsystemRegistration;
+import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver;
+import org.jboss.as.controller.parsing.ExtensionParsingContext;
+import org.jboss.as.controller.parsing.ParseUtils;
+import org.jboss.as.controller.persistence.SubsystemMarshallingContext;
+import org.jboss.as.controller.registry.ManagementResourceRegistration;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.Property;
+import org.jboss.logging.Logger;
+import org.jboss.staxmapper.XMLElementReader;
+import org.jboss.staxmapper.XMLElementWriter;
+import org.jboss.staxmapper.XMLExtendedStreamReader;
+import org.jboss.staxmapper.XMLExtendedStreamWriter;
+
+public class AgentSubsystemExtension implements Extension {
+
+ private final Logger log = Logger.getLogger(AgentSubsystemExtension.class);
+
+ public static final String NAMESPACE = "urn:org.rhq:embeddedagent:1.0";
+ public static final String SUBSYSTEM_NAME = "embeddedagent";
+
+ private final SubsystemParser parser = new SubsystemParser();
+
+ private static final String RESOURCE_NAME = AgentSubsystemExtension.class.getPackage().getName()
+ + ".LocalDescriptions";
+
+ protected static final String PLUGINS_ELEMENT = "plugins";
+ protected static final String PLUGIN_ELEMENT = "plugin";
+ protected static final String PLUGIN_NAME = "name";
+ protected static final String PLUGIN_ENABLED = "enabled";
+ protected static final String AGENT_ENABLED = "enabled";
+ protected static final boolean AGENT_ENABLED_DEFAULT = false;
+ protected static final boolean PLUGIN_ENABLED_DEFAULT = true;
+
+ protected static final String AGENT_RESTART_OP = "restart";
+ protected static final String AGENT_STOP_OP = "stop";
+ protected static final String AGENT_STATUS_OP = "status";
+
+ protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
+
+ static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String keyPrefix) {
+ String prefix = SUBSYSTEM_NAME + (keyPrefix == null ? "" : "." + keyPrefix);
+ return new StandardResourceDescriptionResolver(prefix, RESOURCE_NAME,
+ AgentSubsystemExtension.class.getClassLoader(), true, false);
+ }
+
+ @Override
+ public void initializeParsers(ExtensionParsingContext context) {
+ context.setSubsystemXmlMapping(SUBSYSTEM_NAME, NAMESPACE, parser);
+ }
+
+ @Override
+ public void initialize(ExtensionContext context) {
+ log.info("Initializing embedded agent subsystem");
+
+ final SubsystemRegistration subsystem = context.registerSubsystem(SUBSYSTEM_NAME, 1, 0);
+ final ManagementResourceRegistration registration = subsystem
+ .registerSubsystemModel(AgentSubsystemDefinition.INSTANCE);
+
+ subsystem.registerXMLElementWriter(parser);
+ }
+
+ /**
+ * The subsystem parser, which uses stax to read and write to and from xml
+ */
+ private static class SubsystemParser implements XMLStreamConstants, XMLElementReader<List<ModelNode>>,
+ XMLElementWriter<SubsystemMarshallingContext> {
+
+ @Override
+ public void readElement(XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException {
+ // The agent "enabled" attribute is required
+ ParseUtils.requireSingleAttribute(reader, AGENT_ENABLED);
+
+ // Add the main subsystem 'add' operation
+ final ModelNode opAdd = new ModelNode();
+ opAdd.get(OP).set(ADD);
+ opAdd.get(OP_ADDR).set(PathAddress.pathAddress(SUBSYSTEM_PATH).toModelNode());
+ String agentEnabledValue = reader.getAttributeValue(null, AGENT_ENABLED);
+ if (agentEnabledValue != null) {
+ opAdd.get(AGENT_ENABLED).set(agentEnabledValue);
+ }
+
+ ModelNode pluginsAttributeNode = opAdd.get(PLUGINS_ELEMENT);
+
+ // Read the children elements
+ while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
+ if (!reader.getLocalName().equals(PLUGINS_ELEMENT)) {
+ throw ParseUtils.unexpectedElement(reader);
+ }
+ while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
+ if (reader.isStartElement()) {
+ readPlugin(reader, pluginsAttributeNode);
+ }
+ }
+ }
+
+ list.add(opAdd);
+ }
+
+ private void readPlugin(XMLExtendedStreamReader reader, ModelNode pluginsAttributeNode)
+ throws XMLStreamException {
+
+ if (!reader.getLocalName().equals(PLUGIN_ELEMENT)) {
+ throw ParseUtils.unexpectedElement(reader);
+ }
+
+ String pluginName = null;
+ boolean pluginEnabled = PLUGIN_ENABLED_DEFAULT;
+ for (int i = 0; i < reader.getAttributeCount(); i++) {
+ String attr = reader.getAttributeLocalName(i);
+ String value = reader.getAttributeValue(i);
+ if (attr.equals(PLUGIN_ENABLED)) {
+ pluginEnabled = Boolean.parseBoolean(value);
+ } else if (attr.equals(PLUGIN_NAME)) {
+ pluginName = value;
+ } else {
+ throw ParseUtils.unexpectedAttribute(reader, i);
+ }
+ }
+ ParseUtils.requireNoContent(reader);
+ if (pluginName == null) {
+ throw ParseUtils.missingRequiredElement(reader, Collections.singleton(PLUGIN_NAME));
+ }
+
+ // Add the plugin to the plugins attribute node
+ pluginsAttributeNode.add(pluginName, pluginEnabled);
+ }
+
+ @Override
+ public void writeContent(final XMLExtendedStreamWriter writer, final SubsystemMarshallingContext context)
+ throws XMLStreamException {
+ ModelNode node = context.getModelNode();
+
+ // <subsystem>
+ context.startSubsystemElement(AgentSubsystemExtension.NAMESPACE, false);
+ writer.writeAttribute(AGENT_ENABLED,
+ String.valueOf(node.get(AGENT_ENABLED).asBoolean(AGENT_ENABLED_DEFAULT)));
+
+ // <plugins>
+ writer.writeStartElement(PLUGINS_ELEMENT);
+ ModelNode plugins = node.get(PLUGINS_ELEMENT);
+ if (plugins != null && plugins.isDefined()) {
+ for (Property property : plugins.asPropertyList()) {
+ // <plugin>
+ writer.writeStartElement(PLUGIN_ELEMENT);
+ writer.writeAttribute(PLUGIN_NAME, property.getName());
+ writer.writeAttribute(PLUGIN_ENABLED, property.getValue().asString());
+ // </plugin>
+ writer.writeEndElement();
+ }
+ }
+ // </plugins>
+ writer.writeEndElement();
+ // </subsystem>
+ writer.writeEndElement();
+ }
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRemove.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRemove.java
new file mode 100644
index 0000000..4f19745
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRemove.java
@@ -0,0 +1,23 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.AbstractRemoveStepHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.dmr.ModelNode;
+import org.jboss.msc.service.ServiceName;
+
+class AgentSubsystemRemove extends AbstractRemoveStepHandler {
+
+ static final AgentSubsystemRemove INSTANCE = new AgentSubsystemRemove();
+
+ private AgentSubsystemRemove() {
+ }
+
+ @Override
+ protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model)
+ throws OperationFailedException {
+
+ ServiceName name = AgentService.SERVICE_NAME;
+ context.removeService(name);
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
new file mode 100644
index 0000000..cdb14fd
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemRestart.java
@@ -0,0 +1,36 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.OperationStepHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.ServiceNotFoundException;
+
+class AgentSubsystemRestart implements OperationStepHandler {
+
+ static final AgentSubsystemRestart INSTANCE = new AgentSubsystemRestart();
+
+ private final Logger log = Logger.getLogger(AgentSubsystemRestart.class);
+
+ private AgentSubsystemRestart() {
+ }
+
+ @Override
+ public void execute(OperationContext opContext, ModelNode model) throws OperationFailedException {
+ try {
+ ServiceName name = AgentService.SERVICE_NAME;
+ AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
+ .getValue();
+ log.info("Asked to restart the embedded agent");
+ service.stopAgent();
+ service.startAgent();
+ } catch (ServiceNotFoundException snfe) {
+ throw new OperationFailedException("Cannot restart embedded agent - the agent is disabled", snfe);
+ }
+
+ opContext.completeStep();
+ return;
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStatus.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStatus.java
new file mode 100644
index 0000000..8b09a21
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStatus.java
@@ -0,0 +1,32 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.OperationStepHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.ServiceNotFoundException;
+
+class AgentSubsystemStatus implements OperationStepHandler {
+
+ static final AgentSubsystemStatus INSTANCE = new AgentSubsystemStatus();
+
+ private AgentSubsystemStatus() {
+ }
+
+ @Override
+ public void execute(OperationContext opContext, ModelNode model) throws OperationFailedException {
+ boolean isStarted = false;
+ try {
+ ServiceName name = AgentService.SERVICE_NAME;
+ AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
+ .getValue();
+ isStarted = service.isAgentStarted();
+ } catch (ServiceNotFoundException snfe) {
+ // the agent just isn't deployed, so obviously, is isn't started
+ isStarted = false;
+ }
+ opContext.getResult().set(isStarted ? "STARTED" : "STOPPED");
+ opContext.completeStep();
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStop.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStop.java
new file mode 100644
index 0000000..62e7307
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemStop.java
@@ -0,0 +1,34 @@
+package org.rhq.embeddedagent.extension;
+
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.OperationStepHandler;
+import org.jboss.dmr.ModelNode;
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.ServiceName;
+
+class AgentSubsystemStop implements OperationStepHandler {
+
+ static final AgentSubsystemStop INSTANCE = new AgentSubsystemStop();
+
+ private final Logger log = Logger.getLogger(AgentSubsystemStop.class);
+
+ private AgentSubsystemStop() {
+ }
+
+ @Override
+ public void execute(OperationContext opContext, ModelNode model) throws OperationFailedException {
+ try {
+ ServiceName name = AgentService.SERVICE_NAME;
+ AgentService service = (AgentService) opContext.getServiceRegistry(true).getRequiredService(name)
+ .getValue();
+ log.info("Asked to stop the embedded agent");
+ service.stopAgent();
+ } catch (Exception e) {
+ // the agent service isn't deployed, so obviously, the agent is already stopped. just keep going
+ }
+
+ opContext.completeStep();
+ return;
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeDefinition.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeDefinition.java
new file mode 100644
index 0000000..b925c79
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeDefinition.java
@@ -0,0 +1,56 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.jboss.as.controller.MapAttributeDefinition;
+import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
+import org.jboss.as.controller.descriptions.ResourceDescriptionResolver;
+import org.jboss.as.controller.operations.validation.ModelTypeValidator;
+import org.jboss.as.controller.parsing.Attribute;
+import org.jboss.as.controller.registry.AttributeAccess.Flag;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.ModelType;
+
+public class PluginsAttributeDefinition extends MapAttributeDefinition {
+
+ public PluginsAttributeDefinition() {
+ super(AgentSubsystemExtension.PLUGINS_ELEMENT, AgentSubsystemExtension.PLUGINS_ELEMENT, true,
+ 0, Integer.MAX_VALUE, new ModelTypeValidator(ModelType.STRING), null, null, Flag.RESTART_RESOURCE_SERVICES);
+ }
+
+ @Override
+ protected void addValueTypeDescription(ModelNode node, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ protected void addAttributeValueTypeDescription(ModelNode node, ResourceDescriptionResolver resolver,
+ Locale locale, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ protected void addOperationParameterValueTypeDescription(ModelNode node, String operationName,
+ ResourceDescriptionResolver resolver, Locale locale, ResourceBundle bundle) {
+ node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
+ }
+
+ @Override
+ public void marshallAsElement(ModelNode resourceModel, XMLStreamWriter writer) throws XMLStreamException {
+ if (!isMarshallable(resourceModel))
+ return;
+
+ resourceModel = resourceModel.get(getName());
+ writer.writeStartElement(getName());
+ for (ModelNode property : resourceModel.asList()) {
+ writer.writeEmptyElement(getXmlName());
+ writer.writeAttribute(Attribute.NAME.getLocalName(), property.asProperty().getName());
+ writer.writeAttribute(Attribute.VALUE.getLocalName(), property.asProperty().getValue().asString());
+ }
+ writer.writeEndElement();
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
new file mode 100644
index 0000000..1d51294
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/PluginsAttributeHandler.java
@@ -0,0 +1,62 @@
+package org.rhq.embeddedagent.extension;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.jboss.as.controller.AbstractWriteAttributeHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.Property;
+import org.jboss.logging.Logger;
+import org.jboss.msc.service.ServiceNotFoundException;
+
+class PluginsAttributeHandler extends AbstractWriteAttributeHandler<Void> {
+
+ public static final PluginsAttributeHandler INSTANCE = new PluginsAttributeHandler();
+
+ private final Logger log = Logger.getLogger(PluginsAttributeHandler.class);
+
+ private PluginsAttributeHandler() {
+ super(AgentSubsystemDefinition.PLUGINS_ATTRIBDEF);
+ }
+
+ @Override
+ protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
+ ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder)
+ throws OperationFailedException {
+
+ log.info("Embedded agent plugins attribute changed: " + attributeName + "=" + resolvedValue);
+ setPluginsWithEnabledFlag(context, resolvedValue);
+ return true; // the service must be restarted to really pick up the change at runtime
+ }
+
+ @Override
+ protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
+ ModelNode valueToRestore, ModelNode valueToRevert, Void handback) {
+
+ log.info("Reverting embedded agent plugins attribute: " + attributeName + "=" + valueToRestore);
+ setPluginsWithEnabledFlag(context, valueToRestore);
+ }
+
+ private void setPluginsWithEnabledFlag(OperationContext context, ModelNode newValue) {
+
+ try {
+ AgentService service = (AgentService) context.getServiceRegistry(true)
+ .getRequiredService(AgentService.SERVICE_NAME).getValue();
+
+ HashMap<String, Boolean> pluginsWithEnableFlag = new HashMap<String, Boolean>();
+ if (newValue != null && newValue.isDefined()) {
+ List<Property> pluginsList = newValue.asPropertyList();
+ for (Property pluginsItem : pluginsList) {
+ String pluginName = pluginsItem.getName();
+ boolean pluginEnabled = pluginsItem.getValue().asBoolean();
+ pluginsWithEnableFlag.put(pluginName, pluginEnabled);
+ }
+ }
+ service.setPlugins(pluginsWithEnableFlag);
+ } catch (ServiceNotFoundException snfe) {
+ // the agent is probably disabled or undeployed, don't bother doing anything
+ }
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/META-INF/services/org.jboss.as.controller.Extension b/modules/enterprise/server/embeddedagent/src/main/resources/META-INF/services/org.jboss.as.controller.Extension
new file mode 100644
index 0000000..d8addaa
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/META-INF/services/org.jboss.as.controller.Extension
@@ -0,0 +1 @@
+org.rhq.embeddedagent.extension.AgentSubsystemExtension
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
new file mode 100644
index 0000000..295c78d
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/module/main/module.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<module xmlns="urn:jboss:module:1.0" name="${moduleName}">
+
+ <resources>
+ <resource-root path="${project.build.finalName}.jar"/>
+ <!-- <resource-root path="agent" /> -->
+ </resources>
+
+ <dependencies>
+ <!-- modules required by any subsystem -->
+ <module name="javax.api"/>
+ <module name="org.jboss.staxmapper"/>
+ <module name="org.jboss.as.controller"/>
+ <module name="org.jboss.as.server"/>
+ <module name="org.jboss.modules"/>
+ <module name="org.jboss.msc"/>
+ <module name="org.jboss.logging"/>
+ <module name="org.jboss.vfs"/>
+ </dependencies>
+</module>
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
new file mode 100644
index 0000000..790232a
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties
@@ -0,0 +1,8 @@
+embeddedagent=RHQ Agent
+embeddedagent.add=Adds the RHQ Agent subsystem
+embeddedagent.remove=Removes the RHQ Agent subsystem
+embeddedagent.restart=Starts the RHQ Agent. If it is already started, it will be stopped, then started again.
+embeddedagent.stop=Stops the RHQ Agent if it is running.
+embeddedagent.status=Tells you if the RHQ Agent is currently started or stopped.
+embeddedagent.enabled=When true, the RHQ Agent will be deployed and started. Otherwise, it will be disabled.
+embeddedagent.plugins=Indicates what plugins should be enabled or disabled.
\ No newline at end of file
diff --git a/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
new file mode 100644
index 0000000..2882729
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd
@@ -0,0 +1,26 @@
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="urn:org.rhq:embeddedagent:1.0"
+ xmlns="urn:org.rhq.embeddedagent:1.0"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ version="1.0">
+
+ <xs:element name="subsystem" type="subsystemType"/>
+
+ <xs:complexType name="subsystemType">
+ <xs:attribute name="enabled" type="xs:boolean" use="required" default="false"/>
+ <xs:all>
+ <xs:element name="plugins" type="pluginsType"/>
+ </xs:all>
+ </xs:complexType>
+
+ <xs:complexType name="pluginsType">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="plugin" type="pluginType"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="pluginType">
+ <xs:attribute name="name" use="required"/>
+ <xs:attribute name="enabled" type="xs:boolean" use="required" default="true"/>
+ </xs:complexType>
+</xs:schema>
diff --git a/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
new file mode 100644
index 0000000..a4cab0a
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/main/scripts/module-assembly.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<assembly>
+ <id>module-assembly</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+ <includeBaseDirectory>false</includeBaseDirectory>
+ <baseDirectory>${project.build.finalName}-module</baseDirectory>
+ <fileSets>
+ <fileSet>
+ <directory>${project.build.outputDirectory}/module</directory>
+ <outputDirectory>/org/rhq/${artifactId}</outputDirectory>
+ <includes>
+ <include>main/module.xml</include>
+ </includes>
+ <fileMode>0644</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ <fileSet>
+ <directory>${project.build.directory}</directory>
+ <outputDirectory>/org/rhq/${artifactId}/main</outputDirectory>
+ <includes>
+ <include>${project.build.finalName}.jar</include>
+ </includes>
+ <fileMode>0644</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ <fileSet>
+ <directory>${project.build.directory}/agent</directory>
+ <outputDirectory>/org/rhq/${artifactId}/main/agent</outputDirectory>
+ <fileMode>0644</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ </fileSets>
+</assembly>
+
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemBaseParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemBaseParsingTestCase.java
new file mode 100644
index 0000000..2d5b3a5
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemBaseParsingTestCase.java
@@ -0,0 +1,17 @@
+package org.rhq.embeddedagent.extension;
+
+import java.io.IOException;
+
+import org.jboss.as.subsystem.test.AbstractSubsystemBaseTest;
+
+public class SubsystemBaseParsingTestCase extends AbstractSubsystemBaseTest {
+
+ public SubsystemBaseParsingTestCase() {
+ super(AgentSubsystemExtension.SUBSYSTEM_NAME, new AgentSubsystemExtension());
+ }
+
+ @Override
+ protected String getSubsystemXml() throws IOException {
+ return readResource("subsystem.xml");
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
new file mode 100644
index 0000000..40054b9
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java
@@ -0,0 +1,301 @@
+package org.rhq.embeddedagent.extension;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIBE;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_OPERATION;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_DESCRIPTION_OPERATION;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jboss.as.controller.PathAddress;
+import org.jboss.as.controller.PathElement;
+import org.jboss.as.subsystem.test.KernelServices;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.Property;
+import org.jboss.msc.service.ServiceNotFoundException;
+import org.testng.Assert;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+@Test
+public class SubsystemParsingTestCase extends SubsystemBaseParsingTestCase {
+
+ @Override
+ @BeforeTest
+ public void initializeParser() throws Exception {
+ super.initializeParser();
+ }
+
+ @Override
+ @AfterTest
+ public void cleanup() throws Exception {
+ super.cleanup();
+ }
+
+ /**
+ * Tests that the xml is parsed into the correct operations
+ */
+ public void testParseSubsystem() throws Exception {
+ // Parse the subsystem xml into operations
+ String subsystemXml = getSubsystemXml();
+ List<ModelNode> operations = super.parse(subsystemXml);
+
+ // /Check that we have the expected number of operations
+ Assert.assertEquals(operations.size(), 1);
+
+ // Check that each operation has the correct content
+ // The add subsystem operation will happen first
+ ModelNode addSubsystem = operations.get(0);
+ Assert.assertEquals(addSubsystem.get(OP).asString(), ADD);
+ PathAddress addr = PathAddress.pathAddress(addSubsystem.get(OP_ADDR));
+ Assert.assertEquals(addr.size(), 1);
+ PathElement element = addr.getElement(0);
+ Assert.assertEquals(element.getKey(), SUBSYSTEM);
+ Assert.assertEquals(element.getValue(), AgentSubsystemExtension.SUBSYSTEM_NAME);
+ Assert.assertEquals(addSubsystem.get(AgentSubsystemExtension.AGENT_ENABLED).asBoolean(), true);
+ List<Property> plugins = addSubsystem.get(AgentSubsystemExtension.PLUGINS_ELEMENT).asPropertyList();
+ Assert.assertEquals(plugins.size(), 2);
+ Assert.assertEquals(plugins.get(0).getName(), "platform"); // platform plugin is first in the xml
+ Assert.assertEquals(plugins.get(0).getValue().asBoolean(), true);
+ Assert.assertEquals(plugins.get(1).getName(), "blah"); // blah plugin is first in the xml
+ Assert.assertEquals(plugins.get(1).getValue().asBoolean(), false);
+ }
+
+ /**
+ * Test that the model created from the xml looks as expected
+ */
+ public void testInstallIntoController() throws Exception {
+ // Parse the subsystem xml and install into the controller
+ String subsystemXml = getSubsystemXml();
+ KernelServices services = super.installInController(subsystemXml);
+
+ // Read the whole model and make sure it looks as expected
+ ModelNode model = services.readWholeModel();
+ // System.out.println(model);
+ Assert.assertTrue(model.get(SUBSYSTEM).hasDefined(AgentSubsystemExtension.SUBSYSTEM_NAME));
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).hasDefined(
+ AgentSubsystemExtension.AGENT_ENABLED));
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME,
+ AgentSubsystemExtension.AGENT_ENABLED).asBoolean());
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).hasDefined(
+ AgentSubsystemExtension.PLUGINS_ELEMENT));
+
+ List<Property> plugins = model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME)
+ .get(AgentSubsystemExtension.PLUGINS_ELEMENT).asPropertyList();
+ Assert.assertEquals(plugins.size(), 2);
+ Assert.assertEquals(plugins.get(0).getName(), "platform"); // platform plugin is first in the xml
+ Assert.assertEquals(plugins.get(0).getValue().asBoolean(), true);
+ Assert.assertEquals(plugins.get(1).getName(), "blah"); // blah plugin is first in the xml
+ Assert.assertEquals(plugins.get(1).getValue().asBoolean(), false);
+
+ // Sanity check to test the service was there
+ AgentService agent = (AgentService) services.getContainer().getRequiredService(AgentService.SERVICE_NAME)
+ .getValue();
+ assert 2 == agent.getPlugins().size();
+ Assert.assertTrue(agent.getPlugins().get("platform"));
+ Assert.assertFalse(agent.getPlugins().get("blah"));
+ }
+
+ /**
+ * Starts a controller with a given subsystem xml and then checks that a second controller started with the xml
+ * marshalled from the first one results in the same model
+ */
+ public void testParseAndMarshalModel() throws Exception {
+ // Parse the subsystem xml and install into the first controller
+ String subsystemXml = getSubsystemXml();
+ KernelServices servicesA = super.installInController(subsystemXml);
+ // Get the model and the persisted xml from the first controller
+ ModelNode modelA = servicesA.readWholeModel();
+ String marshalled = servicesA.getPersistedSubsystemXml();
+
+ // Install the persisted xml from the first controller into a second controller
+ KernelServices servicesB = super.installInController(marshalled);
+ ModelNode modelB = servicesB.readWholeModel();
+
+ // Make sure the models from the two controllers are identical
+ super.compare(modelA, modelB);
+ }
+
+ /**
+ * Starts a controller with the given subsystem xml and then checks that a second controller started with the
+ * operations from its describe action results in the same model
+ */
+ public void testDescribeHandler() throws Exception {
+ // test two subsystem xmls - one that is empty of plugins, and the second is our normal test xml
+ String subsystemXml1 = "<subsystem xmlns=\"" + AgentSubsystemExtension.NAMESPACE + "\" "
+ + AgentSubsystemExtension.AGENT_ENABLED + "=\"true\"" + "></subsystem>";
+ String subsystemXml2 = getSubsystemXml();
+
+ String[] subsystemXmlAll = new String[] { subsystemXml1, subsystemXml2 };
+ for (String subsystemXml : subsystemXmlAll) {
+ KernelServices servicesA = super.installInController(subsystemXml);
+ // Get the model and the describe operations from the first controller
+ ModelNode modelA = servicesA.readWholeModel();
+ ModelNode describeOp = new ModelNode();
+ describeOp.get(OP).set(DESCRIBE);
+ describeOp.get(OP_ADDR).set(
+ PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME))
+ .toModelNode());
+ ModelNode executeOperation = servicesA.executeOperation(describeOp);
+ List<ModelNode> operations = super.checkResultAndGetContents(executeOperation).asList();
+
+ // Install the describe options from the first controller into a second controller
+ KernelServices servicesB = super.installInController(operations);
+ ModelNode modelB = servicesB.readWholeModel();
+
+ // Make sure the models from the two controllers are identical
+ super.compare(modelA, modelB);
+ }
+ }
+
+ /**
+ * Tests that the subsystem can be removed
+ */
+ public void testSubsystemRemoval() throws Exception {
+ // Parse the subsystem xml and install into the first controller
+ String subsystemXml = getSubsystemXml();
+ KernelServices services = super.installInController(subsystemXml);
+
+ // Sanity check to test the service was there
+ AgentService agent = (AgentService) services.getContainer().getRequiredService(AgentService.SERVICE_NAME)
+ .getValue();
+ Assert.assertEquals(agent.getPlugins().size(), 2);
+
+ // Checks that the subsystem was removed from the model
+ super.assertRemoveSubsystemResources(services);
+
+ // Check that the services that was installed was removed
+ try {
+ services.getContainer().getRequiredService(AgentService.SERVICE_NAME);
+ assert false : "The service should have been removed along with the subsystem";
+ } catch (ServiceNotFoundException expected) {
+ // test passed!
+ }
+ }
+
+ public void testResourceDescription() throws Exception {
+ String subsystemXml = getSubsystemXml();
+ KernelServices services = super.installInController(subsystemXml);
+
+ PathAddress agentSubsystemPath = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM,
+ AgentSubsystemExtension.SUBSYSTEM_NAME));
+
+ // ask for resource description: /subsystem=embeddedagent:read-resource-description
+ ModelNode resourceDescriptionOp = new ModelNode();
+ resourceDescriptionOp.get(OP).set(READ_RESOURCE_DESCRIPTION_OPERATION);
+ resourceDescriptionOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
+ resourceDescriptionOp.get("operations").set(true); // we want to see the operations also
+ ModelNode result = services.executeOperation(resourceDescriptionOp);
+ ModelNode content = checkResultAndGetContents(result);
+
+ // check the attributes
+ Assert.assertTrue(content.get("attributes").isDefined());
+ List<Property> attributes = content.get("attributes").asPropertyList();
+ Assert.assertEquals(attributes.size(), 2);
+ Assert.assertEquals(attributes.get(0).getName(), AgentSubsystemExtension.AGENT_ENABLED);
+ Assert.assertEquals(attributes.get(1).getName(), AgentSubsystemExtension.PLUGINS_ELEMENT);
+
+ // check the operations
+ Assert.assertTrue(content.get("operations").isDefined());
+ List<Property> operations = content.get("operations").asPropertyList();
+ List<String> operationNames = new ArrayList<String>();
+ for (Property op : operations) {
+ operationNames.add(op.getName());
+ }
+ Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_RESTART_OP));
+ Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_STOP_OP));
+ Assert.assertTrue(operationNames.contains(AgentSubsystemExtension.AGENT_STATUS_OP));
+ }
+
+ public void testExecuteOperations() throws Exception {
+ String subsystemXml = getSubsystemXml();
+ KernelServices services = super.installInController(subsystemXml);
+
+ // status check - our service should be available and have 2 plugin definitions
+ AgentService service = (AgentService) services.getContainer().getService(AgentService.SERVICE_NAME).getValue();
+ Assert.assertEquals(service.getPlugins().size(), 2);
+
+ PathAddress agentSubsystemPath = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM,
+ AgentSubsystemExtension.SUBSYSTEM_NAME));
+
+ // get the startup model from subsystem xml
+ ModelNode model = services.readWholeModel();
+
+ // current list of plugins from the attribute
+ ModelNode pluginsNode = model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).get(
+ AgentSubsystemExtension.PLUGINS_ELEMENT);
+
+ // Add another plugin
+ pluginsNode.add("foo", true);
+ ModelNode addOp = new ModelNode();
+ addOp.get(OP).set(WRITE_ATTRIBUTE_OPERATION);
+ addOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
+ addOp.get(NAME).set(AgentSubsystemExtension.PLUGINS_ELEMENT);
+ addOp.get(VALUE).set(pluginsNode);
+ ModelNode result = services.executeOperation(addOp);
+ Assert.assertEquals(result.get(OUTCOME).asString(), SUCCESS);
+
+ // now test that things are as they should be
+ model = services.readWholeModel();
+ Assert.assertTrue(model.get(SUBSYSTEM).hasDefined(AgentSubsystemExtension.SUBSYSTEM_NAME));
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).hasDefined(
+ AgentSubsystemExtension.AGENT_ENABLED));
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME,
+ AgentSubsystemExtension.AGENT_ENABLED).asBoolean());
+ Assert.assertTrue(model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME).hasDefined(
+ AgentSubsystemExtension.PLUGINS_ELEMENT));
+
+ List<Property> plugins = model.get(SUBSYSTEM, AgentSubsystemExtension.SUBSYSTEM_NAME)
+ .get(AgentSubsystemExtension.PLUGINS_ELEMENT).asPropertyList();
+ Assert.assertEquals(plugins.size(), 3); // there were 2, but we added "foo" above
+ Assert.assertEquals(plugins.get(0).getName(), "platform"); // platform plugin is first in the xml
+ Assert.assertEquals(plugins.get(0).getValue().asBoolean(), true);
+ Assert.assertEquals(plugins.get(1).getName(), "blah"); // blah plugin is first in the xml
+ Assert.assertEquals(plugins.get(1).getValue().asBoolean(), false);
+ Assert.assertEquals(plugins.get(2).getName(), "foo"); // foo plugin we added above
+ Assert.assertEquals(plugins.get(2).getValue().asBoolean(), true);
+
+ // we enabled a new plugin - now should have 3 now
+ Assert.assertEquals(service.getPlugins().size(), 3);
+ Assert.assertTrue(service.getPlugins().get("platform"));
+ Assert.assertFalse(service.getPlugins().get("blah"));
+ Assert.assertTrue(service.getPlugins().get("foo"));
+
+ // Use read-attribute instead of reading the whole model to get an attribute value
+ ModelNode readOp = new ModelNode();
+ readOp.get(OP).set(READ_ATTRIBUTE_OPERATION);
+ readOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
+ readOp.get(NAME).set(AgentSubsystemExtension.AGENT_ENABLED);
+ result = services.executeOperation(readOp);
+ Assert.assertTrue(checkResultAndGetContents(result).asBoolean());
+
+ readOp.get(NAME).set(AgentSubsystemExtension.PLUGINS_ELEMENT);
+ result = services.executeOperation(readOp);
+ ModelNode content = checkResultAndGetContents(result);
+ plugins = content.asPropertyList();
+ Assert.assertEquals(plugins.size(), 3); // there were 2, but we added "foo" above
+ Assert.assertEquals(plugins.get(0).getName(), "platform"); // platform plugin is first in the xml
+ Assert.assertEquals(plugins.get(0).getValue().asBoolean(), true);
+ Assert.assertEquals(plugins.get(1).getName(), "blah"); // blah plugin is first in the xml
+ Assert.assertEquals(plugins.get(1).getValue().asBoolean(), false);
+ Assert.assertEquals(plugins.get(2).getName(), "foo"); // foo plugin we added above
+ Assert.assertEquals(plugins.get(2).getValue().asBoolean(), true);
+
+ // execute status
+ ModelNode statusOp = new ModelNode();
+ statusOp.get(OP).set(AgentSubsystemExtension.AGENT_STATUS_OP);
+ statusOp.get(OP_ADDR).set(agentSubsystemPath.toModelNode());
+ result = services.executeOperation(statusOp);
+ Assert.assertEquals(checkResultAndGetContents(result).asString(), "STARTED");
+ }
+}
diff --git a/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
new file mode 100644
index 0000000..4e4a85d
--- /dev/null
+++ b/modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml
@@ -0,0 +1,6 @@
+<subsystem xmlns="urn:org.rhq:embeddedagent:1.0" enabled="true">
+ <plugins>
+ <plugin name="platform" enabled="true" />
+ <plugin name="blah" enabled="false" />
+ </plugins>
+</subsystem>
\ No newline at end of file
10 years, 4 months
[rhq] modules/enterprise
by mike thompson
modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
New commits:
commit f42dfd1f53f5be55f706cf0327a8a2663e6ceb00
Author: Mike Thompson <mithomps(a)redhat.com>
Date: Wed Feb 5 10:20:13 2014 -0800
Revert "[BZ 1014571] UX on selecting graph subselection via dragging.
Based on UXD feedback, make the x-axis selection extend above the
x-axis and fill the whole chart (like the regular chart selection).
Found some errors with approach reverting."
This reverts commit 27fb9acb9418fd08373d63b39c09db0ec71387a2.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
index c67a098..806a1b8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
@@ -646,8 +646,8 @@ public class StackedBarMetricGraphImpl extends AbstractMetricGraph {
.attr("class", "x brush")
.call(brush)
.selectAll("rect")
- .attr("y", -140)
- .attr("height", 160);
+ .attr("y", -6)
+ .attr("height", 30);
}
// create y-axis
10 years, 4 months
[rhq] modules/enterprise
by mike thompson
modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
New commits:
commit 27fb9acb9418fd08373d63b39c09db0ec71387a2
Author: Mike Thompson <mithomps(a)redhat.com>
Date: Wed Feb 5 10:08:13 2014 -0800
[BZ 1014571] UX on selecting graph subselection via dragging. Based on UXD feedback, make the x-axis selection extend above the x-axis and fill the whole chart (like the regular chart selection).
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
index 806a1b8..c67a098 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
@@ -646,8 +646,8 @@ public class StackedBarMetricGraphImpl extends AbstractMetricGraph {
.attr("class", "x brush")
.call(brush)
.selectAll("rect")
- .attr("y", -6)
- .attr("height", 30);
+ .attr("y", -140)
+ .attr("height", 160);
}
// create y-axis
10 years, 4 months
[rhq] Branch 'release/jon3.2.x' - modules/core modules/plugins
by snegrea
modules/core/native-system/src/main/java/org/rhq/core/system/FileSystemInfo.java | 52 ++++------
modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemComponent.java | 7 -
2 files changed, 27 insertions(+), 32 deletions(-)
New commits:
commit 91f4b730214fad369ddd4c63e0de71f072b6a8b6
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Wed Feb 5 09:34:55 2014 -0600
Bug 1026513 - File systems that are offline or not available are still being reported as UP
Return AvailabilityType.UP only if the directory name of the FileSystem is the same as the resource key.
(cherry picked from commit c9ea7f80a610d0ce22376f76723f8445c6d9cfd7)
diff --git a/modules/core/native-system/src/main/java/org/rhq/core/system/FileSystemInfo.java b/modules/core/native-system/src/main/java/org/rhq/core/system/FileSystemInfo.java
index 6d5ada6..372b434 100644
--- a/modules/core/native-system/src/main/java/org/rhq/core/system/FileSystemInfo.java
+++ b/modules/core/native-system/src/main/java/org/rhq/core/system/FileSystemInfo.java
@@ -1,25 +1,21 @@
/*
-* 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.
-*/
+ * RHQ Management Platform
+ * Copyright (C) 2005-2014 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * 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 for more details.
+ *
+ * You should have received a copy of the GNU 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.core.system;
import org.apache.commons.logging.Log;
@@ -36,7 +32,7 @@ import org.hyperic.sigar.SigarProxy;
* @author John Mazzitelli
*/
public class FileSystemInfo {
- private final Log log = LogFactory.getLog(this.getClass());
+ private static final Log LOG = LogFactory.getLog(FileSystemInfo.class);
private final String mountPoint;
private FileSystem fs;
@@ -66,14 +62,14 @@ public class FileSystemInfo {
// this happens when the file system is not available (e.g. if it's a CD-ROM without a CD loaded in it) or
// if we don't have permission to access the filesystem. we can ignore it and set the usage data to null.
this.fsUsage = null;
- if (log.isTraceEnabled()) {
- log.trace("Cannot refresh the usage data for file system mounted at [" + this.mountPoint + "].", e);
- } else {
- log.debug("Cannot refresh the usage data for file system mounted at [" + this.mountPoint + "]: " + e);
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Cannot refresh the usage data for file system mounted at [" + this.mountPoint + "].", e);
+ } else if (LOG.isDebugEnabled()) {
+ LOG.debug("Cannot refresh the usage data for file system mounted at [" + this.mountPoint + "]: " + e);
}
} catch (RuntimeException e) {
this.fsUsage = null;
- log.error("An error occurred while refreshing the usage data for file system mounted at [" + this.mountPoint
+ LOG.error("An error occurred while refreshing the usage data for file system mounted at [" + this.mountPoint
+ "].", e);
}
}
@@ -110,4 +106,4 @@ public class FileSystemInfo {
", fsUsage=" + fsUsage +
']';
}
-}
\ No newline at end of file
+}
diff --git a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemComponent.java b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemComponent.java
index 5eae991..02d0b68 100644
--- a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemComponent.java
+++ b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemComponent.java
@@ -59,8 +59,8 @@ public class FileSystemComponent implements ResourceComponent<PlatformComponent>
public AvailabilityType getAvailability() {
FileSystemInfo fileSystemInfo = getFileSystemInfo();
- // fileSystemInfo can be != null even if the fs is unmounted.
- if (fileSystemInfo != null && fileSystemInfo.getFileSystem() != null) {
+ if (fileSystemInfo != null && fileSystemInfo.getFileSystem() != null
+ && this.resourceContext.getResourceKey().equals(fileSystemInfo.getFileSystem().getDirName())) {
return AvailabilityType.UP;
} else {
return AvailabilityType.DOWN;
@@ -94,5 +94,4 @@ public class FileSystemComponent implements ResourceComponent<PlatformComponent>
SystemInfo systemInfo = resourceContext.getSystemInformation();
return systemInfo.getFileSystem(resourceContext.getResourceKey());
}
-
-}
\ No newline at end of file
+}
10 years, 4 months