Skip to content

Commit

Permalink
Migrate discovery subsystem to SubsystemResourceXMLSchema.
Browse files Browse the repository at this point in the history
  • Loading branch information
pferraro committed Feb 26, 2025
1 parent 5220897 commit 665c65a
Show file tree
Hide file tree
Showing 10 changed files with 105 additions and 96 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<module name="org.jboss.staxmapper"/>
<module name="org.jboss.as.controller"/>
<module name="org.jboss.logging"/>
<module name="org.wildfly.common"/>
<module name="org.wildfly.discovery"/>
<module name="org.wildfly.service"/>
<module name="org.wildfly.subsystem"/>
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright The WildFly Authors
* SPDX-License-Identifier: Apache-2.0
*/
package org.wildfly.extension.discovery;

import java.util.List;
import java.util.function.Function;

import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.ResourceRegistration;
import org.jboss.dmr.ModelNode;
import org.wildfly.discovery.impl.AggregateDiscoveryProvider;
import org.wildfly.discovery.spi.DiscoveryProvider;
import org.wildfly.subsystem.resource.capability.CapabilityReference;
import org.wildfly.subsystem.resource.capability.CapabilityReferenceListAttributeDefinition;
import org.wildfly.subsystem.service.ServiceDependency;

/**
* Registers the aggregate discovery provider resource definition.
* @author Paul Ferraro
*/
public class AggregateDiscoveryProviderResourceDefinitionRegistrar extends DiscoveryProviderResourceDefinitionRegistrar {

static final ResourceRegistration REGISTRATION = ResourceRegistration.of(PathElement.pathElement("aggregate-provider"));
static final CapabilityReferenceListAttributeDefinition<DiscoveryProvider> PROVIDER_NAMES = new CapabilityReferenceListAttributeDefinition.Builder<>("providers", CapabilityReference.builder(DiscoveryProviderResourceDefinitionRegistrar.DISCOVERY_PROVIDER_CAPABILITY, DiscoveryProviderResourceDefinitionRegistrar.DISCOVERY_PROVIDER_DESCRIPTOR).build()).build();

AggregateDiscoveryProviderResourceDefinitionRegistrar() {
super(REGISTRATION, List.of(PROVIDER_NAMES));
}

@Override
public ServiceDependency<DiscoveryProvider> resolve(OperationContext context, ModelNode model) throws OperationFailedException {
return PROVIDER_NAMES.resolve(context, model).map(new Function<>() {
@Override
public DiscoveryProvider apply(List<DiscoveryProvider> providers) {
return new AggregateDiscoveryProvider(providers.toArray(DiscoveryProvider[]::new));
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@
public class DiscoveryExtension extends SubsystemExtension<DiscoverySubsystemSchema> {

public DiscoveryExtension() {
super(SubsystemConfiguration.of(DiscoverySubsystemRegistrar.NAME, DiscoverySubsystemModel.CURRENT, DiscoverySubsystemRegistrar::new), SubsystemPersistence.of(DiscoverySubsystemSchema.CURRENT));
super(SubsystemConfiguration.of(DiscoverySubsystemResourceDefinitionRegistrar.REGISTRATION, DiscoverySubsystemModel.CURRENT, DiscoverySubsystemResourceDefinitionRegistrar::new), SubsystemPersistence.of(DiscoverySubsystemSchema.CURRENT));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@
public class DiscoveryExtensionTransformerRegistration extends SubsystemExtensionTransformerRegistration {

public DiscoveryExtensionTransformerRegistration() {
super(DiscoverySubsystemRegistrar.NAME, DiscoverySubsystemModel.CURRENT, DiscoverySubsystemTransformationDescriptionFactory.INSTANCE);
super(DiscoverySubsystemResourceDefinitionRegistrar.REGISTRATION, DiscoverySubsystemModel.CURRENT, DiscoverySubsystemTransformationDescriptionFactory.INSTANCE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,64 @@
*/
package org.wildfly.extension.discovery;

import org.jboss.as.controller.PathElement;
import java.util.Collection;

import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.ResourceDefinition;
import org.jboss.as.controller.ResourceRegistration;
import org.jboss.as.controller.capability.RuntimeCapability;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.dmr.ModelNode;
import org.wildfly.discovery.spi.DiscoveryProvider;
import org.wildfly.service.descriptor.UnaryServiceDescriptor;
import org.wildfly.subsystem.resource.ChildResourceDefinitionRegistrar;
import org.wildfly.subsystem.resource.ManagementResourceRegistrar;
import org.wildfly.subsystem.resource.ManagementResourceRegistrationContext;
import org.wildfly.subsystem.resource.ResourceDescriptor;
import org.wildfly.subsystem.resource.ResourceModelResolver;
import org.wildfly.subsystem.resource.operation.ResourceOperationRuntimeHandler;
import org.wildfly.subsystem.service.ResourceServiceConfigurator;
import org.wildfly.subsystem.service.ResourceServiceInstaller;
import org.wildfly.subsystem.service.ServiceDependency;
import org.wildfly.subsystem.service.capability.CapabilityServiceInstaller;

/**
* Abstract registrar for a discovery provider resource definition.
* @author Paul Ferraro
*/
public abstract class DiscoveryProviderRegistrar implements ChildResourceDefinitionRegistrar, ResourceServiceConfigurator {
public abstract class DiscoveryProviderResourceDefinitionRegistrar implements ChildResourceDefinitionRegistrar, ResourceServiceConfigurator, ResourceModelResolver<ServiceDependency<DiscoveryProvider>> {

// TODO Move this to an SPI module, when this capability acquires any consumers
static final UnaryServiceDescriptor<DiscoveryProvider> DISCOVERY_PROVIDER_DESCRIPTOR = UnaryServiceDescriptor.of("org.wildfly.discovery.provider", DiscoveryProvider.class);
static final RuntimeCapability<Void> DISCOVERY_PROVIDER_CAPABILITY = RuntimeCapability.Builder.of(DISCOVERY_PROVIDER_DESCRIPTOR).setAllowMultipleRegistrations(true).build();

private final ResourceRegistration registration;
private final ResourceDescriptor descriptor;
private final Collection<AttributeDefinition> attributes;

DiscoveryProviderRegistrar(PathElement path, ResourceDescriptor.Builder builder) {
this.registration = ResourceRegistration.of(path);
this.descriptor = builder.addCapability(DISCOVERY_PROVIDER_CAPABILITY)
.withRuntimeHandler(ResourceOperationRuntimeHandler.configureService(this))
.build();
DiscoveryProviderResourceDefinitionRegistrar(ResourceRegistration registration, Collection<AttributeDefinition> attributes) {
this.registration = registration;
this.attributes = attributes;
}

@Override
public ManagementResourceRegistration register(ManagementResourceRegistration parent, ManagementResourceRegistrationContext context) {
ResourceDefinition definition = ResourceDefinition.builder(this.registration, this.descriptor.getResourceDescriptionResolver()).build();
ResourceDescriptor descriptor = ResourceDescriptor.builder(DiscoverySubsystemResourceDefinitionRegistrar.RESOLVER.createChildResolver(this.registration.getPathElement()))
.addAttributes(this.attributes)
.addCapability(DISCOVERY_PROVIDER_CAPABILITY)
.withRuntimeHandler(ResourceOperationRuntimeHandler.configureService(this))
.build();
ResourceDefinition definition = ResourceDefinition.builder(this.registration, descriptor.getResourceDescriptionResolver()).build();
ManagementResourceRegistration registration = parent.registerSubModel(definition);

ManagementResourceRegistrar.of(this.descriptor).register(registration);
ManagementResourceRegistrar.of(descriptor).register(registration);

return registration;
}

@Override
public ResourceServiceInstaller configure(OperationContext context, ModelNode model) throws OperationFailedException {
return CapabilityServiceInstaller.builder(DiscoveryProviderResourceDefinitionRegistrar.DISCOVERY_PROVIDER_CAPABILITY, this.resolve(context, model)).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@

package org.wildfly.extension.discovery;

import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.ResourceDefinition;
import org.jboss.as.controller.ResourceRegistration;
import org.jboss.as.controller.SubsystemRegistration;
import org.jboss.as.controller.SubsystemResourceRegistration;
import org.jboss.as.controller.descriptions.ParentResourceDescriptionResolver;
import org.jboss.as.controller.descriptions.SubsystemResourceDescriptionResolver;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
Expand All @@ -21,23 +20,22 @@
* Registrar for the discovery subsystem.
* @author Paul Ferraro
*/
class DiscoverySubsystemRegistrar implements SubsystemResourceDefinitionRegistrar {
class DiscoverySubsystemResourceDefinitionRegistrar implements SubsystemResourceDefinitionRegistrar {

static final String NAME = "discovery";
static final PathElement PATH = SubsystemResourceDefinitionRegistrar.pathElement(NAME);
static final ParentResourceDescriptionResolver RESOLVER = new SubsystemResourceDescriptionResolver(NAME, DiscoverySubsystemRegistrar.class);
static final SubsystemResourceRegistration REGISTRATION = SubsystemResourceRegistration.of("discovery");
static final ParentResourceDescriptionResolver RESOLVER = new SubsystemResourceDescriptionResolver(REGISTRATION.getName(), DiscoverySubsystemResourceDefinitionRegistrar.class);

@Override
public ManagementResourceRegistration register(SubsystemRegistration parent, ManagementResourceRegistrationContext context) {
parent.setHostCapable();

ManagementResourceRegistration registration = parent.registerSubsystemModel(ResourceDefinition.builder(ResourceRegistration.of(PATH), RESOLVER).build());
ManagementResourceRegistration registration = parent.registerSubsystemModel(ResourceDefinition.builder(REGISTRATION, RESOLVER).build());
ResourceDescriptor descriptor = ResourceDescriptor.builder(RESOLVER).build();

ManagementResourceRegistrar.of(descriptor).register(registration);

new AggregateDiscoveryProviderRegistrar().register(registration, context);
new StaticDiscoveryProviderRegistrar().register(registration, context);
new AggregateDiscoveryProviderResourceDefinitionRegistrar().register(registration, context);
new StaticDiscoveryProviderResourceDefinitionRegistrar().register(registration, context);

return registration;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,29 @@

package org.wildfly.extension.discovery;

import org.jboss.as.controller.PersistentResourceXMLDescription;
import org.jboss.as.controller.PersistentSubsystemSchema;
import org.jboss.as.controller.SubsystemSchema;
import org.jboss.as.controller.persistence.xml.ResourceXMLChoice;
import org.jboss.as.controller.persistence.xml.ResourceXMLParticleFactory;
import org.jboss.as.controller.persistence.xml.SubsystemResourceRegistrationXMLElement;
import org.jboss.as.controller.persistence.xml.SubsystemResourceXMLSchema;
import org.jboss.as.controller.xml.VersionedNamespace;
import org.jboss.as.controller.xml.XMLCardinality;
import org.jboss.staxmapper.IntVersion;

/**
* Enumeration of discovery subsystem schema versions.
* @author Paul Ferraro
*/
enum DiscoverySubsystemSchema implements PersistentSubsystemSchema<DiscoverySubsystemSchema> {
enum DiscoverySubsystemSchema implements SubsystemResourceXMLSchema<DiscoverySubsystemSchema> {
VERSION_1_0(1, 0),
;
static final DiscoverySubsystemSchema CURRENT = VERSION_1_0;

private final ResourceXMLParticleFactory factory = ResourceXMLParticleFactory.newInstance(this);
private final VersionedNamespace<IntVersion, DiscoverySubsystemSchema> namespace;

DiscoverySubsystemSchema(int major, int minor) {
this.namespace = SubsystemSchema.createLegacySubsystemURN(DiscoverySubsystemRegistrar.NAME, new IntVersion(major, minor));
this.namespace = SubsystemSchema.createLegacySubsystemURN(DiscoverySubsystemResourceDefinitionRegistrar.REGISTRATION.getName(), new IntVersion(major, minor));
}

@Override
Expand All @@ -32,11 +36,11 @@ public VersionedNamespace<IntVersion, DiscoverySubsystemSchema> getNamespace() {
}

@Override
public PersistentResourceXMLDescription getXMLDescription() {
PersistentResourceXMLDescription.Factory factory = PersistentResourceXMLDescription.factory(this);
return factory.builder(DiscoverySubsystemRegistrar.PATH)
.addChild(factory.builder(StaticDiscoveryProviderRegistrar.PATH).addAttributes(StaticDiscoveryProviderRegistrar.ATTRIBUTES.stream()).build())
.addChild(factory.builder(AggregateDiscoveryProviderRegistrar.PATH).addAttributes(AggregateDiscoveryProviderRegistrar.ATTRIBUTES.stream()).build())
public SubsystemResourceRegistrationXMLElement getSubsystemXMLElement() {
ResourceXMLChoice providers = this.factory.choice().withCardinality(XMLCardinality.Unbounded.OPTIONAL)
.addElement(this.factory.namedElement(StaticDiscoveryProviderResourceDefinitionRegistrar.REGISTRATION).withContent(this.factory.sequence().addElement(StaticDiscoveryProviderResourceDefinitionRegistrar.SERVICES).build()).build())
.addElement(this.factory.namedElement(AggregateDiscoveryProviderResourceDefinitionRegistrar.REGISTRATION).addAttribute(AggregateDiscoveryProviderResourceDefinitionRegistrar.PROVIDER_NAMES).build())
.build();
return this.factory.subsystemElement(DiscoverySubsystemResourceDefinitionRegistrar.REGISTRATION).withContent(providers).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,16 @@
package org.wildfly.extension.discovery;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.AttributeMarshaller;
import org.jboss.as.controller.AttributeParser;
import org.jboss.as.controller.ObjectListAttributeDefinition;
import org.jboss.as.controller.ObjectTypeAttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.ResourceRegistration;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
Expand All @@ -26,16 +25,16 @@
import org.wildfly.discovery.AttributeValue;
import org.wildfly.discovery.ServiceURL;
import org.wildfly.discovery.impl.StaticDiscoveryProvider;
import org.wildfly.subsystem.resource.ResourceDescriptor;
import org.wildfly.subsystem.service.ResourceServiceInstaller;
import org.wildfly.subsystem.service.capability.CapabilityServiceInstaller;
import org.wildfly.discovery.spi.DiscoveryProvider;
import org.wildfly.subsystem.service.ServiceDependency;

/**
* Registers the static discovery provider resource definition.
* @author Paul Ferraro
*/
public class StaticDiscoveryProviderRegistrar extends DiscoveryProviderRegistrar {
static final PathElement PATH = PathElement.pathElement("static-provider");
public class StaticDiscoveryProviderResourceDefinitionRegistrar extends DiscoveryProviderResourceDefinitionRegistrar {

static final ResourceRegistration REGISTRATION = ResourceRegistration.of(PathElement.pathElement("static-provider"));

private static final SimpleAttributeDefinition ABSTRACT_TYPE = new SimpleAttributeDefinitionBuilder("abstract-type", ModelType.STRING, true).setAllowExpression(true).build();
private static final SimpleAttributeDefinition ABSTRACT_TYPE_AUTHORITY = new SimpleAttributeDefinitionBuilder("abstract-type-authority", ModelType.STRING, true).setAllowExpression(true).build();
Expand All @@ -61,20 +60,18 @@ public class StaticDiscoveryProviderRegistrar extends DiscoveryProviderRegistrar
SERVICE_ATTRIBUTES
).build();

private static final ObjectListAttributeDefinition SERVICES = new ObjectListAttributeDefinition.Builder("services", SERVICE)
static final ObjectListAttributeDefinition SERVICES = new ObjectListAttributeDefinition.Builder("services", SERVICE)
.setAttributeMarshaller(AttributeMarshaller.UNWRAPPED_OBJECT_LIST_MARSHALLER)
.setAttributeParser(AttributeParser.UNWRAPPED_OBJECT_LIST_PARSER)
.setFlags(Flag.RESTART_RESOURCE_SERVICES)
.build();

static final Collection<AttributeDefinition> ATTRIBUTES = List.of(SERVICES);

StaticDiscoveryProviderRegistrar() {
super(PATH, ResourceDescriptor.builder(DiscoverySubsystemRegistrar.RESOLVER.createChildResolver(PATH)).addAttributes(ATTRIBUTES));
StaticDiscoveryProviderResourceDefinitionRegistrar() {
super(REGISTRATION, List.of(SERVICES));
}

@Override
public ResourceServiceInstaller configure(OperationContext context, ModelNode model) throws OperationFailedException {
public ServiceDependency<DiscoveryProvider> resolve(OperationContext context, ModelNode model) throws OperationFailedException {
List<ModelNode> services = SERVICES.resolveModelAttribute(context, model).asListOrEmpty();
List<ServiceURL> serviceURLs = new ArrayList<>(services.size());
for (ModelNode service : services) {
Expand Down Expand Up @@ -105,6 +102,6 @@ public ResourceServiceInstaller configure(OperationContext context, ModelNode mo
Messages.log.tracef("Adding service URL %s", serviceURL);
serviceURLs.add(serviceURL);
}
return CapabilityServiceInstaller.builder(DiscoveryProviderRegistrar.DISCOVERY_PROVIDER_CAPABILITY, new StaticDiscoveryProvider(serviceURLs)).build();
return ServiceDependency.of(new StaticDiscoveryProvider(serviceURLs));
}
}
Loading

0 comments on commit 665c65a

Please sign in to comment.