@@ -34,14 +34,16 @@
import org.jboss.as.controller.access.management.SensitiveTargetAccessConstraintDefinition;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.registry.AttributeAccess;
import org.jboss.as.controller.transform.description.DiscardAttributeChecker;
import org.jboss.as.controller.transform.description.RejectAttributeChecker;
import org.jboss.as.controller.transform.description.ResourceTransformationDescriptionBuilder;
import org.jboss.dmr.ModelType;

/**
* Resource definition override for protocols that have an optional socket-binding.
* @author Paul Ferraro
*/
public class OptionalSocketBindingProtocolResourceDefinition extends ProtocolResourceDefinition {
public class SocketProtocolResourceDefinition extends ProtocolResourceDefinition {

enum Attribute implements org.jboss.as.clustering.controller.Attribute, UnaryOperator<SimpleAttributeDefinitionBuilder> {
SOCKET_BINDING(ModelDescriptionConstants.SOCKET_BINDING, ModelType.STRING) {
@@ -52,6 +54,14 @@ public SimpleAttributeDefinitionBuilder apply(SimpleAttributeDefinitionBuilder b
;
}
},
CLIENT_SOCKET_BINDING("client-socket-binding", ModelType.STRING) {
@Override
public SimpleAttributeDefinitionBuilder apply(SimpleAttributeDefinitionBuilder builder) {
return builder.setAccessConstraints(SensitiveTargetAccessConstraintDefinition.SOCKET_BINDING_REF)
.setCapabilityReference(new CapabilityReference(Capability.PROTOCOL, CommonUnaryRequirement.SOCKET_BINDING))
;
}
},
;
private final AttributeDefinition definition;

@@ -69,6 +79,11 @@ public AttributeDefinition getDefinition() {
}

static void addTransformations(ModelVersion version, ResourceTransformationDescriptionBuilder builder) {
if (JGroupsModel.VERSION_7_0_0.requiresTransformation(version)) {
builder.getAttributeBuilder()
.setDiscard(DiscardAttributeChecker.UNDEFINED, Attribute.CLIENT_SOCKET_BINDING.getDefinition())
.addRejectCheck(RejectAttributeChecker.DEFINED, Attribute.CLIENT_SOCKET_BINDING.getDefinition());
}

ProtocolResourceDefinition.addTransformations(version, builder);
}
@@ -86,7 +101,7 @@ public ResourceDescriptor apply(ResourceDescriptor descriptor) {
}
}

OptionalSocketBindingProtocolResourceDefinition(String name, UnaryOperator<ResourceDescriptor> configurator, ResourceServiceConfiguratorFactory serviceConfiguratorFactory, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
super(pathElement(name), new ResourceDescriptorConfigurator(configurator), serviceConfiguratorFactory, parentServiceConfiguratorFactory);
SocketProtocolResourceDefinition(String name, UnaryOperator<ResourceDescriptor> configurator, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
super(pathElement(name), new ResourceDescriptorConfigurator(configurator), SocketProtocolConfigurationServiceConfigurator::new, parentServiceConfiguratorFactory);
}
}
@@ -0,0 +1,87 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2019, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.jboss.as.clustering.jgroups.subsystem;

import static org.jboss.as.clustering.jgroups.subsystem.SocketTransportResourceDefinition.Attribute.*;

import java.net.InetSocketAddress;
import java.util.Arrays;
import java.util.Map;

import org.jboss.as.clustering.controller.CommonUnaryRequirement;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.network.SocketBinding;
import org.jboss.dmr.ModelNode;
import org.jboss.msc.service.ServiceBuilder;
import org.jgroups.protocols.BasicTCP;
import org.wildfly.clustering.service.ServiceConfigurator;
import org.wildfly.clustering.service.ServiceSupplierDependency;
import org.wildfly.clustering.service.SimpleSupplierDependency;
import org.wildfly.clustering.service.SupplierDependency;

/**
* @author Paul Ferraro
*/
public class SocketTransportConfigurationServiceConfigurator<TP extends BasicTCP> extends TransportConfigurationServiceConfigurator<TP> {

private volatile SupplierDependency<SocketBinding> clientBinding;

public SocketTransportConfigurationServiceConfigurator(PathAddress address) {
super(address);
}

@Override
public <B> ServiceBuilder<B> register(ServiceBuilder<B> builder) {
return super.register(this.clientBinding.register(builder));
}

@Override
public ServiceConfigurator configure(OperationContext context, ModelNode model) throws OperationFailedException {
String bindingName = CLIENT_SOCKET_BINDING.resolveModelAttribute(context, model).asStringOrNull();
this.clientBinding = (bindingName != null) ? new ServiceSupplierDependency<>(CommonUnaryRequirement.SOCKET_BINDING.getServiceName(context, bindingName)) : new SimpleSupplierDependency<>(null);
return super.configure(context, model);
}

@Override
public Map<String, SocketBinding> getSocketBindings() {
Map<String, SocketBinding> bindings = super.getSocketBindings();
SocketBinding clientBinding = this.clientBinding.get();
for (String serviceName : Arrays.asList("jgroups.tcp.sock", "jgroups.nio.client")) {
bindings.put(serviceName, clientBinding);
}
return bindings;
}

@Override
public void accept(TP protocol) {
SocketBinding clientBinding = this.clientBinding.get();
if (clientBinding != null) {
InetSocketAddress socketAddress = clientBinding.getSocketAddress();
this.setValue(protocol, "client_bind_addr", socketAddress.getAddress());
this.setValue(protocol, "client_bind_port", socketAddress.getPort());
}
super.accept(protocol);
}
}
@@ -0,0 +1,90 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2019, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.jboss.as.clustering.jgroups.subsystem;

import java.util.function.UnaryOperator;

import org.jboss.as.clustering.controller.CapabilityReference;
import org.jboss.as.clustering.controller.CommonUnaryRequirement;
import org.jboss.as.clustering.controller.ResourceServiceConfiguratorFactory;
import org.jboss.as.clustering.controller.SimpleResourceDescriptorConfigurator;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.ModelVersion;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.access.management.SensitiveTargetAccessConstraintDefinition;
import org.jboss.as.controller.registry.AttributeAccess;
import org.jboss.as.controller.transform.description.DiscardAttributeChecker;
import org.jboss.as.controller.transform.description.RejectAttributeChecker;
import org.jboss.as.controller.transform.description.ResourceTransformationDescriptionBuilder;
import org.jboss.dmr.ModelType;

/**
* @author Paul Ferraro
*/
public class SocketTransportResourceDefinition extends TransportResourceDefinition {

enum Attribute implements org.jboss.as.clustering.controller.Attribute, UnaryOperator<SimpleAttributeDefinitionBuilder> {
CLIENT_SOCKET_BINDING("client-socket-binding", ModelType.STRING) {
@Override
public SimpleAttributeDefinitionBuilder apply(SimpleAttributeDefinitionBuilder builder) {
return builder
.setAccessConstraints(SensitiveTargetAccessConstraintDefinition.SOCKET_BINDING_REF)
.setCapabilityReference(new CapabilityReference(Capability.TRANSPORT, CommonUnaryRequirement.SOCKET_BINDING));
}
},
;
private final AttributeDefinition definition;

Attribute(String name, ModelType type) {
this.definition = this.apply(new SimpleAttributeDefinitionBuilder(name, type)
.setAllowExpression(false)
.setRequired(false)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
).build();
}

@Override
public AttributeDefinition getDefinition() {
return this.definition;
}

@Override
public SimpleAttributeDefinitionBuilder apply(SimpleAttributeDefinitionBuilder builder) {
return builder;
}
}

static void addTransformations(ModelVersion version, ResourceTransformationDescriptionBuilder builder) {
if (JGroupsModel.VERSION_7_0_0.requiresTransformation(version)) {
builder.getAttributeBuilder()
.setDiscard(DiscardAttributeChecker.UNDEFINED, Attribute.CLIENT_SOCKET_BINDING.getDefinition())
.addRejectCheck(RejectAttributeChecker.DEFINED, Attribute.CLIENT_SOCKET_BINDING.getDefinition());
}

TransportResourceDefinition.addTransformations(version, builder);
}

SocketTransportResourceDefinition(String name, ResourceServiceConfiguratorFactory serviceConfiguratorFactory, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
super(pathElement(name), new SimpleResourceDescriptorConfigurator<>(Attribute.class), serviceConfiguratorFactory, parentServiceConfiguratorFactory);
}
}
@@ -22,6 +22,7 @@

package org.jboss.as.clustering.jgroups.subsystem;

import java.util.EnumSet;
import java.util.function.UnaryOperator;

import org.jboss.as.clustering.controller.CapabilityProvider;
@@ -158,6 +159,10 @@ public void transformResource(ResourceTransformationContext context, PathAddress
}
};
builder.setCustomResourceTransformer(transformer);
} else {
for (ThreadPoolResourceDefinition pool : EnumSet.allOf(ThreadPoolResourceDefinition.class)) {
pool.buildTransformation(version, builder);
}
}

if (JGroupsModel.VERSION_2_0_0.requiresTransformation(version)) {
@@ -166,7 +171,7 @@ public void transformResource(ResourceTransformationContext context, PathAddress
RelayResourceDefinition.buildTransformation(version, builder);
}

TransportResourceDefinition.buildTransformation(version, builder);
TransportRegistration.buildTransformation(version, builder);
ProtocolRegistration.buildTransformation(version, builder);
}

@@ -238,7 +243,7 @@ public ManagementResourceRegistration register(ManagementResourceRegistration pa
new SimpleResourceRegistration(descriptor, handler).register(registration);

OperationDefinition legacyAddProtocolOperation = new SimpleOperationDefinitionBuilder("add-protocol", this.getResourceDescriptionResolver())
.setParameters(SocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING.getDefinition())
.setParameters(MulticastProtocolResourceDefinition.Attribute.SOCKET_BINDING.getDefinition())
.addParameter(AbstractProtocolResourceDefinition.DeprecatedAttribute.TYPE.getDefinition())
.addParameter(AbstractProtocolResourceDefinition.Attribute.PROPERTIES.getDefinition())
.setDeprecated(JGroupsModel.VERSION_3_0_0.getVersion())
@@ -54,6 +54,7 @@
import org.wildfly.clustering.service.ServiceConfigurator;
import org.wildfly.clustering.service.ServiceNameProvider;
import org.wildfly.clustering.service.ServiceSupplierDependency;
import org.wildfly.clustering.service.SimpleSupplierDependency;
import org.wildfly.clustering.service.SupplierDependency;

/**
@@ -93,7 +94,7 @@ public ServiceName getServiceName() {
public ServiceConfigurator configure(OperationContext context, ModelNode model) throws OperationFailedException {
this.socketBinding = new ServiceSupplierDependency<>(CommonUnaryRequirement.SOCKET_BINDING.getServiceName(context, SOCKET_BINDING.resolveModelAttribute(context, model).asString()));
String diagnosticsSocketBinding = DIAGNOSTICS_SOCKET_BINDING.resolveModelAttribute(context, model).asStringOrNull();
this.diagnosticsSocketBinding = (diagnosticsSocketBinding != null) ? new ServiceSupplierDependency<>(CommonUnaryRequirement.SOCKET_BINDING.getServiceName(context, diagnosticsSocketBinding)) : null;
this.diagnosticsSocketBinding = (diagnosticsSocketBinding != null) ? new ServiceSupplierDependency<>(CommonUnaryRequirement.SOCKET_BINDING.getServiceName(context, diagnosticsSocketBinding)) : new SimpleSupplierDependency<>(null);

ModelNode machine = MACHINE.resolveModelAttribute(context, model);
ModelNode rack = RACK.resolveModelAttribute(context, model);
@@ -127,9 +128,7 @@ public String getSite() {
for (String serviceName : Arrays.asList("jgroups.udp.mcast_sock", "jgroups.udp.sock", "jgroups.tcp.server", "jgroups.nio.server", "jgroups.tunnel.ucast_sock")) {
bindings.put(serviceName, binding);
}
if (this.diagnosticsSocketBinding != null) {
bindings.put("jgroups.tp.diag.mcast_sock", this.diagnosticsSocketBinding.get());
}
bindings.put("jgroups.tp.diag.mcast_sock", this.diagnosticsSocketBinding.get());
return bindings;
}

@@ -164,9 +163,10 @@ public void accept(T protocol) {
;
protocol.setInternalThreadPool(factory.apply(protocol.getInternalThreadPoolThreadFactory()));

this.setValue(protocol, "enable_diagnostics", this.diagnosticsSocketBinding != null);
if (this.diagnosticsSocketBinding != null) {
InetSocketAddress address = this.diagnosticsSocketBinding.get().getSocketAddress();
SocketBinding diagnosticsBinging = this.diagnosticsSocketBinding.get();
this.setValue(protocol, "enable_diagnostics", diagnosticsBinging != null);
if (diagnosticsBinging != null) {
InetSocketAddress address = diagnosticsBinging.getSocketAddress();
this.setValue(protocol, "diagnostics_addr", address.getAddress());
this.setValue(protocol, "diagnostics_port", address.getPort());
}
@@ -25,10 +25,10 @@
import java.util.EnumSet;

import org.jboss.as.clustering.controller.Registration;
import org.jboss.as.clustering.controller.ResourceServiceConfigurator;
import org.jboss.as.clustering.controller.ResourceServiceConfiguratorFactory;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.ModelVersion;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.transform.description.ResourceTransformationDescriptionBuilder;

/**
* Registers transport definitions, including any definition overrides.
@@ -38,21 +38,17 @@

enum MulticastTransport {
UDP;
}

static boolean contains(String name) {
for (MulticastTransport protocol : EnumSet.allOf(MulticastTransport.class)) {
if (name.equals(protocol.name())) {
return true;
}
}
return false;
}
enum SocketTransport {
TCP, TCP_NIO2;
}

static class TransportResourceServiceConfiguratorFactory implements ResourceServiceConfiguratorFactory {
@Override
public ResourceServiceConfigurator createServiceConfigurator(PathAddress address) {
return MulticastTransport.contains(address.getLastElement().getValue()) ? new MulticastTransportConfigurationServiceConfigurator(address) : new TransportConfigurationServiceConfigurator<>(address);
static void buildTransformation(ModelVersion version, ResourceTransformationDescriptionBuilder parent) {
TransportResourceDefinition.addTransformations(version, parent.addChildResource(TransportResourceDefinition.WILDCARD_PATH));

for (SocketTransport transport : EnumSet.allOf(SocketTransport.class)) {
SocketTransportResourceDefinition.addTransformations(version, parent.addChildResource(TransportResourceDefinition.pathElement(transport.name())));
}
}

@@ -64,6 +60,14 @@ public TransportRegistration(ResourceServiceConfiguratorFactory parentServiceCon

@Override
public void register(ManagementResourceRegistration registration) {
new TransportResourceDefinition(new TransportResourceServiceConfiguratorFactory(), this.parentServiceConfiguratorFactory).register(registration);
new TransportResourceDefinition(this.parentServiceConfiguratorFactory).register(registration);

for (MulticastTransport transport : EnumSet.allOf(MulticastTransport.class)) {
new TransportResourceDefinition(transport.name(), MulticastTransportConfigurationServiceConfigurator::new, this.parentServiceConfiguratorFactory).register(registration);
}

for (SocketTransport transport : EnumSet.allOf(SocketTransport.class)) {
new SocketTransportResourceDefinition(transport.name(), SocketTransportConfigurationServiceConfigurator::new, this.parentServiceConfiguratorFactory).register(registration);
}
}
}
@@ -180,9 +180,7 @@ public AttributeDefinition getDefinition() {
}
}

static void buildTransformation(ModelVersion version, ResourceTransformationDescriptionBuilder parent) {
ResourceTransformationDescriptionBuilder builder = parent.addChildResource(WILDCARD_PATH);

static void addTransformations(ModelVersion version, ResourceTransformationDescriptionBuilder builder) {
AbstractProtocolResourceDefinition.addTransformations(version, builder);

if (JGroupsModel.VERSION_3_0_0.requiresTransformation(version)) {
@@ -223,10 +221,6 @@ public ModelNode transformOperation(final ModelNode operation) {

// Reject thread pool configuration, discard if undefined, support EAP 6.x slaves using deprecated attributes
builder.addChildResource(ThreadPoolResourceDefinition.WILDCARD_PATH, RequiredChildResourceDiscardPolicy.REJECT_AND_WARN);
} else {
for (ThreadPoolResourceDefinition pool : EnumSet.allOf(ThreadPoolResourceDefinition.class)) {
pool.buildTransformation(version, parent);
}
}
}

@@ -252,26 +246,37 @@ public PathAddress transform(PathAddress address) {
}

static class ResourceDescriptorConfigurator implements UnaryOperator<ResourceDescriptor> {
private final UnaryOperator<ResourceDescriptor> configurator;

ResourceDescriptorConfigurator(UnaryOperator<ResourceDescriptor> configurator) {
this.configurator = configurator;
}

@Override
public ResourceDescriptor apply(ResourceDescriptor descriptor) {
return descriptor.addAttributes(Attribute.class)
return this.configurator.apply(descriptor)
.addAttributes(Attribute.class)
.addCapabilities(Capability.class)
.addExtraParameters(ThreadingAttribute.class)
.addRequiredChildren(ThreadPoolResourceDefinition.class)
;
}
}

TransportResourceDefinition(ResourceServiceConfiguratorFactory serviceConfiguratorFactory, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
this(new Parameters(WILDCARD_PATH, JGroupsExtension.SUBSYSTEM_RESOLVER.createChildResolver(WILDCARD_PATH, ProtocolResourceDefinition.WILDCARD_PATH)), serviceConfiguratorFactory, parentServiceConfiguratorFactory);
TransportResourceDefinition(ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
this(new Parameters(WILDCARD_PATH, JGroupsExtension.SUBSYSTEM_RESOLVER.createChildResolver(WILDCARD_PATH, ProtocolResourceDefinition.WILDCARD_PATH)), UnaryOperator.identity(), TransportConfigurationServiceConfigurator::new, parentServiceConfiguratorFactory);
}

TransportResourceDefinition(String name, ResourceServiceConfiguratorFactory serviceConfiguratorFactory, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
this(pathElement(name), UnaryOperator.identity(), serviceConfiguratorFactory, parentServiceConfiguratorFactory);
}

TransportResourceDefinition(PathElement path, ResourceServiceConfiguratorFactory serviceConfiguratorFactory, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
this(new Parameters(path, JGroupsExtension.SUBSYSTEM_RESOLVER.createChildResolver(path, WILDCARD_PATH, ProtocolResourceDefinition.WILDCARD_PATH)), serviceConfiguratorFactory, parentServiceConfiguratorFactory);
TransportResourceDefinition(PathElement path, UnaryOperator<ResourceDescriptor> configurator, ResourceServiceConfiguratorFactory serviceConfiguratorFactory, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
this(new Parameters(path, JGroupsExtension.SUBSYSTEM_RESOLVER.createChildResolver(path, WILDCARD_PATH, ProtocolResourceDefinition.WILDCARD_PATH)), configurator, serviceConfiguratorFactory, parentServiceConfiguratorFactory);
}

private TransportResourceDefinition(Parameters parameters, ResourceServiceConfiguratorFactory serviceConfiguratorFactory, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
super(parameters, new ResourceDescriptorConfigurator(), serviceConfiguratorFactory, parentServiceConfiguratorFactory);
private TransportResourceDefinition(Parameters parameters, UnaryOperator<ResourceDescriptor> configurator, ResourceServiceConfiguratorFactory serviceConfiguratorFactory, ResourceServiceConfiguratorFactory parentServiceConfiguratorFactory) {
super(parameters, new ResourceDescriptorConfigurator(configurator), serviceConfiguratorFactory, parentServiceConfiguratorFactory);
}

@Override
@@ -306,9 +311,7 @@ public void execute(OperationContext context, ModelNode operation) throws Operat
for (ThreadPoolResourceDefinition pool : EnumSet.allOf(ThreadPoolResourceDefinition.class)) {
pool.register(registration);
}
}

if (registration.getPathAddress().getLastElement().isWildcard()) {
parent.registerAlias(LEGACY_PATH, new AliasEntry(registration) {
@Override
public PathAddress convertToTargetAddress(PathAddress aliasAddress, AliasContext aliasContext) {
@@ -33,6 +33,7 @@

ALGORITHM(DigestAuthTokenResourceDefinition.Attribute.ALGORITHM),
CHANNEL(RemoteSiteResourceDefinition.Attribute.CHANNEL),
CLIENT_SOCKET_BINDING(SocketProtocolResourceDefinition.Attribute.CLIENT_SOCKET_BINDING),
CLUSTER(ChannelResourceDefinition.Attribute.CLUSTER),
DATA_SOURCE(JDBCProtocolResourceDefinition.Attribute.DATA_SOURCE),
@Deprecated DEFAULT_EXECUTOR(TransportResourceDefinition.ThreadingAttribute.DEFAULT_EXECUTOR),
@@ -53,7 +54,7 @@
RACK(TransportResourceDefinition.Attribute.RACK),
@Deprecated SHARED(TransportResourceDefinition.Attribute.SHARED),
SITE(TransportResourceDefinition.Attribute.SITE),
SOCKET_BINDING(SocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING),
SOCKET_BINDING(MulticastProtocolResourceDefinition.Attribute.SOCKET_BINDING),
STACK(RemoteSiteResourceDefinition.DeprecatedAttribute.STACK),
STATISTICS_ENABLED(ChannelResourceDefinition.Attribute.STATISTICS_ENABLED),
@Deprecated THREAD_FACTORY(TransportResourceDefinition.ThreadingAttribute.THREAD_FACTORY),
@@ -129,7 +129,7 @@ public XMLElement apply(ModelNode ignored) {
@Override
public XMLElement apply(ModelNode model) {
// Use socket-protocol element only if optional socket-binding was defined
return model.hasDefined(OptionalSocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING.getName()) ? XMLElement.SOCKET_PROTOCOL : XMLElement.PROTOCOL;
return model.hasDefined(SocketProtocolResourceDefinition.Attribute.SOCKET_BINDING.getName()) ? XMLElement.SOCKET_PROTOCOL : XMLElement.PROTOCOL;
}
};
for (ProtocolRegistration.SocketProtocol protocol : EnumSet.allOf(ProtocolRegistration.SocketProtocol.class)) {
@@ -94,7 +94,8 @@ jgroups.protocol.data-source=Data source reference for JDBC_PING protocol to be
jgroups.protocol.type=The implementation class for a protocol, which determines protocol functionality.
jgroups.protocol.type.deprecated=Deprecated. Will be removed in a future version.
jgroups.protocol.module=The module with which to resolve the protocol type.
jgroups.protocol.socket-binding=The socket binding specification for this protocol layer, used to specify IP interfaces and ports for communication.
jgroups.protocol.socket-binding=Defines the bind address/port used of the server socket used to receive messages from other cluster members.
jgroups.protocol.client-socket-binding=Defines an optional bind address/port of the socket used to send messages to other cluster members.
jgroups.protocol.socket-binding.deprecated=Deprecated. Supports EAP 7.0 slaves.
jgroups.protocol.socket-bindings=The outbound socket bindings for this protocol.
jgroups.protocol.properties=The properties of this protocol.

Large diffs are not rendered by default.

@@ -2,7 +2,7 @@
<!-- See src/resources/configuration/ReadMe.txt for how the configuration assembly works -->
<config default-supplement="default">
<extension-module>org.jboss.as.clustering.jgroups</extension-module>
<subsystem xmlns="urn:jboss:domain:jgroups:6.0">
<subsystem xmlns="urn:jboss:domain:jgroups:7.0">
<channels default="ee">
<channel name="ee" stack="udp" cluster="ejb"/>
</channels>
@@ -86,7 +86,8 @@ private KernelServicesBuilder createKernelServicesBuilder(String xml) throws XML
@Override
protected org.jboss.as.subsystem.test.AdditionalInitialization createAdditionalInitialization() {
return new AdditionalInitialization()
.require(CommonUnaryRequirement.SOCKET_BINDING, "jgroups-tcp", "jgroups-udp", "some-binding", "jgroups-diagnostics", "jgroups-mping", "jgroups-tcp-fd")
.require(CommonUnaryRequirement.SOCKET_BINDING, "jgroups-tcp", "jgroups-udp", "some-binding", "jgroups-diagnostics", "jgroups-mping", "jgroups-tcp-fd", "jgroups-client-fd")
.require(CommonUnaryRequirement.OUTBOUND_SOCKET_BINDING, "node1", "node2")
.require(CommonUnaryRequirement.KEY_STORE, "my-key-store")
.require(CommonUnaryRequirement.CREDENTIAL_STORE, "my-credential-store")
.require(CommonUnaryRequirement.DATA_SOURCE, "ExampleDS")
@@ -111,7 +111,7 @@ private static JGroupsModel getModelVersion(ModelTestControllerVersion controlle

private static org.jboss.as.subsystem.test.AdditionalInitialization createAdditionalInitialization() {
return new AdditionalInitialization()
.require(CommonUnaryRequirement.SOCKET_BINDING, "jgroups-tcp", "jgroups-udp", "jgroups-udp-fd", "some-binding", "jgroups-diagnostics", "jgroups-mping", "jgroups-tcp-fd", "jgroups-state-xfr")
.require(CommonUnaryRequirement.SOCKET_BINDING, "jgroups-tcp", "jgroups-udp", "jgroups-udp-fd", "some-binding", "client-binding", "jgroups-diagnostics", "jgroups-mping", "jgroups-tcp-fd", "jgroups-client-fd", "jgroups-state-xfr")
;
}

@@ -301,7 +301,7 @@ private void testNonMapTransformersWork(KernelServices services, ModelVersion ve

final PathAddress transportAddr = stackAddr.append("transport", "tcp");
ModelNode addTransport = Util.createAddOperation(transportAddr);
addTransport.get(SocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING.getName()).set("some-binding");
addTransport.get(MulticastProtocolResourceDefinition.Attribute.SOCKET_BINDING.getName()).set("some-binding");
addTransport.get(MODULE).set("do.reject");
TransformedOperation op = services.executeInMainAndGetTheTransformedOperation(addTransport, version);
Assert.assertTrue(op.rejectOperation(success()));
@@ -369,11 +369,16 @@ private static FailedOperationTransformationConfig createFailedOperationTransfor

PathAddress subsystemAddress = PathAddress.pathAddress(JGroupsSubsystemResourceDefinition.PATH);

if (JGroupsModel.VERSION_7_0_0.requiresTransformation(version)) {
config.addFailedAttribute(subsystemAddress.append(StackResourceDefinition.WILDCARD_PATH).append(TransportResourceDefinition.pathElement("TCP_NIO2")), FailedOperationTransformationConfig.REJECTED_RESOURCE);
config.addFailedAttribute(subsystemAddress.append(StackResourceDefinition.WILDCARD_PATH).append(ProtocolResourceDefinition.pathElement("FD_SOCK")), FailedOperationTransformationConfig.REJECTED_RESOURCE);
}

if (JGroupsModel.VERSION_3_0_0.requiresTransformation(version)) {
// Channel resource in a typical configuration would be not rejected, but since we don't have infinispan subsystem setup (because
// that would create a cyclical dependency) it has to be rejected in this subsystem test
config.addFailedAttribute(subsystemAddress.append(ChannelResourceDefinition.WILDCARD_PATH), FailedOperationTransformationConfig.REJECTED_RESOURCE);
config.addFailedAttribute(subsystemAddress.append(StackResourceDefinition.WILDCARD_PATH).append(TransportResourceDefinition.WILDCARD_PATH).append(ThreadPoolResourceDefinition.WILDCARD_PATH), FailedOperationTransformationConfig.REJECTED_RESOURCE);
config.addFailedAttribute(subsystemAddress.append(StackResourceDefinition.WILDCARD_PATH).append(TransportResourceDefinition.pathElement("TCP")).append(ThreadPoolResourceDefinition.WILDCARD_PATH), FailedOperationTransformationConfig.REJECTED_RESOURCE);
}

if (JGroupsModel.VERSION_2_0_0.requiresTransformation(version)) {
@@ -84,15 +84,15 @@ protected static ModelNode getProtocolStackRemoveOperation(String stackName) {

protected static ModelNode getTransportAddOperation(String stackName, String protocol) {
ModelNode operation = Util.createAddOperation(getTransportAddress(stackName, protocol));
operation.get(SocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING.getName()).set("some-binding");
operation.get(MulticastProtocolResourceDefinition.Attribute.SOCKET_BINDING.getName()).set("some-binding");
return operation;
}

@SuppressWarnings("deprecation")
protected static ModelNode getLegacyTransportAddOperation(String stackName, String protocol) {
ModelNode op = Util.createAddOperation(getLegacyTransportAddress(stackName));
op.get(AbstractProtocolResourceDefinition.DeprecatedAttribute.TYPE.getName()).set(protocol);
op.get(SocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING.getName()).set("some-binding");
op.get(MulticastProtocolResourceDefinition.Attribute.SOCKET_BINDING.getName()).set("some-binding");
return op;
}

@@ -172,16 +172,16 @@ public void testProtocolReadWriteOperation() throws Exception {
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());

// read the socket binding attribute
result = services.executeOperation(getProtocolReadOperation("maximal", "MPING", SocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING));
result = services.executeOperation(getProtocolReadOperation("maximal", "MPING", MulticastProtocolResourceDefinition.Attribute.SOCKET_BINDING));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals("jgroups-mping", result.get(RESULT).asString());

// write the attribute
result = services.executeOperation(getProtocolWriteOperation("maximal", "MPING", SocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING, "new-socket-binding"));
result = services.executeOperation(getProtocolWriteOperation("maximal", "MPING", MulticastProtocolResourceDefinition.Attribute.SOCKET_BINDING, "new-socket-binding"));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());

// re-read the attribute
result = services.executeOperation(getProtocolReadOperation("maximal", "MPING", SocketBindingProtocolResourceDefinition.Attribute.SOCKET_BINDING));
result = services.executeOperation(getProtocolReadOperation("maximal", "MPING", MulticastProtocolResourceDefinition.Attribute.SOCKET_BINDING));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals("new-socket-binding", result.get(RESULT).asString());
}
@@ -0,0 +1,84 @@
<!--
~ JBoss, Home of Professional Open Source.
~ Copyright 2019, Red Hat, Inc., and individual contributors
~ as indicated by the @author tags. See the copyright.txt file in the
~ distribution for a full listing of individual contributors.
~
~ This is free software; you can redistribute it and/or modify it
~ under the terms of the GNU Lesser General Public License as
~ published by the Free Software Foundation; either version 2.1 of
~ the License, or (at your option) any later version.
~
~ This software 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
~ Lesser General Public License for more details.
~
~ You should have received a copy of the GNU Lesser General Public
~ License along with this software; if not, write to the Free
~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<subsystem xmlns="urn:jboss:domain:jgroups:7.0">
<channels default="ee">
<channel name="ee" stack="maximal" cluster="${test.expr:mycluster}">
<fork name="web">
<protocol type="CENTRAL_LOCK" statistics-enabled="true">
<property name="num_backups">1</property>
</protocol>
</fork>
</channel>
<channel name="bridge" stack="minimal"/>
</channels>
<stacks>
<stack name="minimal" statistics-enabled="true">
<transport type="UDP" socket-binding="some-binding" statistics-enabled="false"/>
</stack>
<stack name="maximal">
<transport type="TCP"
module="org.jgroups"
socket-binding="some-binding"
diagnostics-socket-binding="jgroups-diagnostics"
shared="${test.expr:false}"
machine="${test.expr:machine1}"
rack="${test.expr:rack1}"
site="${test.expr:site1}">
<property name="enable_bundling">${test.expr:true}</property>
<default-thread-pool min-threads="11"
max-threads="12"
keepalive-time="13"/>
</transport>
<socket-protocol type="MPING" module="org.jgroups" socket-binding="jgroups-mping">
<property name="name">${test.expr:value}</property>
</socket-protocol>
<jdbc-protocol type="JDBC_PING" data-source="ExampleDS"/>
<socket-discovery-protocol type="TCPPING" socket-bindings="node1 node2"/>
<protocol type="MERGE3"/>
<socket-protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd" client-socket-binding="jgroups-client-fd"/>
<protocol type="FD"/>
<protocol type="VERIFY_SUSPECT"/>
<encrypt-protocol type="SYM_ENCRYPT" key-store="my-key-store" key-alias="alias">
<key-credential-reference store="my-credential-store" alias="credential-alias" type="PASSWORD"/>
</encrypt-protocol>
<protocol type="pbcast.NAKACK2"/>
<protocol type="UNICAST3"/>
<protocol type="pbcast.STABLE"/>
<protocol type="pbcast.GMS"/>
<auth-protocol type="AUTH">
<cipher-token algorithm="RSA" key-store="my-key-store" key-alias="alias">
<shared-secret-reference clear-text="changeme"/>
<key-credential-reference store="my-credential-store" alias="credential-alias" type="PASSWORD"/>
</cipher-token>
</auth-protocol>
<protocol type="UFC"/>
<protocol type="MFC"/>
<protocol type="FRAG2"/>
<protocol type="RSVP"/>
<relay site="LON">
<remote-site name="SFO" channel="bridge"/>
<remote-site name="NYC" channel="bridge"/>
</relay>
</stack>
</stacks>
</subsystem>
@@ -20,7 +20,7 @@
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<subsystem xmlns="urn:jboss:domain:jgroups:6.0">
<subsystem xmlns="urn:jboss:domain:jgroups:7.0">
<stacks default="maximal">
<stack name="maximal" statistics-enabled="true">
<transport type="TCP"
@@ -20,7 +20,7 @@
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<subsystem xmlns="urn:jboss:domain:jgroups:6.0">
<subsystem xmlns="urn:jboss:domain:jgroups:7.0">
<stacks default="maximal">
<stack name="maximal" statistics-enabled="true">
<transport type="TCP"
@@ -20,7 +20,7 @@
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<subsystem xmlns="urn:jboss:domain:jgroups:6.0">
<subsystem xmlns="urn:jboss:domain:jgroups:7.0">
<stacks default="maximal">
<stack name="maximal" statistics-enabled="true">
<transport type="TCP"
@@ -20,7 +20,7 @@
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<subsystem xmlns="urn:jboss:domain:jgroups:6.0">
<subsystem xmlns="urn:jboss:domain:jgroups:7.0">
<channels default="ee">
<channel name="ee" stack="maximal" cluster="${test.expr:mycluster}">
<fork name="web">
@@ -20,7 +20,7 @@
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<subsystem xmlns="urn:jboss:domain:jgroups:6.0">
<subsystem xmlns="urn:jboss:domain:jgroups:7.0">
<channels default="default">
<channel name="default" stack="minimal"/>
<channel name="bridge" stack="default"/>
@@ -46,7 +46,7 @@
</transport>
<socket-protocol type="MPING" module="org.jgroups" socket-binding="jgroups-mping"/>
<protocol type="MERGE3"/>
<protocol type="FD_SOCK"/>
<socket-protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd" client-socket-binding="jgroups-client-fd"/>
<protocol type="FD"/>
<protocol type="VERIFY_SUSPECT"/>
<protocol type="pbcast.NAKACK2"/>
@@ -63,7 +63,9 @@
</relay>
</stack>
<stack name="minimal">
<transport type="UDP" socket-binding="jgroups-udp"/>
<transport type="TCP_NIO2"
socket-binding="jgroups-tcp"
client-socket-binding="client-binding"/>
</stack>
</stacks>
</subsystem>