modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemAdd.java | 15 ++ modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemDefinition.java | 3 modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/AgentSubsystemExtension.java | 41 ++++++ modules/enterprise/server/embeddedagent/src/main/java/org/rhq/embeddedagent/extension/CustomConfigAttributeDefinition.java | 61 ++++++++++ modules/enterprise/server/embeddedagent/src/main/resources/org/rhq/embeddedagent/extension/LocalDescriptions.properties | 1 modules/enterprise/server/embeddedagent/src/main/resources/schema/embeddedagent.xsd | 11 + modules/enterprise/server/embeddedagent/src/test/java/org/rhq/embeddedagent/extension/SubsystemParsingTestCase.java | 1 modules/enterprise/server/embeddedagent/src/test/resources/org/rhq/embeddedagent/extension/subsystem.xml | 5 8 files changed, 138 insertions(+)
New commits: commit e4aedd0e706f38c069fad3570ead986576723d33 Author: John Mazzitelli mazz@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" />
rhq-commits@lists.fedorahosted.org