Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WFCORE-6668 Ensure read-feature-description results contain stability as reported by associated description for use by WildFly Glow #5842

Merged
merged 8 commits into from
Feb 13, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ public void start(final StartContext context) throws StartException {
final ModelControllerImpl controller = new ModelControllerImpl(container, target,
rootResourceRegistration,
new ContainerStateMonitor(container),
configurationPersister, processType, runningModeControl, prepareStep,
configurationPersister, processType, stability, runningModeControl, prepareStep,
processState, executorService, expressionResolver, authorizer, securityIdentitySupplier, auditLogger, notificationSupport,
bootErrorCollector, createExtraValidationStepHandler(), capabilityRegistry, getPartialModelIndicator(),
instabilityListener != null ? instabilityListener.get() : null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
import org.jboss.as.controller.registry.Resource;
import org.jboss.as.core.security.AccessMechanism;
import org.jboss.as.protocol.StreamUtils;
import org.jboss.as.version.Stability;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.msc.service.ServiceController;
Expand Down Expand Up @@ -115,6 +116,7 @@ abstract class AbstractOperationContext implements OperationContext, AutoCloseab
final OperationHeaders operationHeaders;
private final boolean booting;
private final ProcessType processType;
private final Stability stability;
private final RunningMode runningMode;
private final Environment callEnvironment;
private final ConfigurationChangesCollector configurationChangesCollector = ConfigurationChangesCollector.INSTANCE;
Expand Down Expand Up @@ -179,6 +181,7 @@ enum ContextFlag {
}

AbstractOperationContext(final ProcessType processType,
final Stability stability,
final RunningMode runningMode,
final ModelController.OperationTransactionControl transactionControl,
final ControlledProcessState processState,
Expand All @@ -191,6 +194,7 @@ enum ContextFlag {
final OperationHeaders operationHeaders,
final Supplier<SecurityIdentity> securityIdentitySupplier) {
this.processType = processType;
this.stability = stability;
this.runningMode = runningMode;
this.transactionControl = transactionControl;
this.processState = processState;
Expand Down Expand Up @@ -218,6 +222,11 @@ enum ContextFlag {
this.securityIdentitySupplier = securityIdentitySupplier;
}

@Override
public Stability getStability() {
return this.stability;
}

/**
* Internal access to the management model implementation.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,7 @@ public ModelNode getNoTextDescription(boolean forOperation) {
assert !result.hasDefined(key); //You can't override an arbitrary descriptor set through other properties.
result.get(key).set(value);
});
result.get(ModelDescriptionConstants.STABILITY).set(this.stability.toString());
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,102 +5,52 @@

package org.jboss.as.controller;

import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

import org.jboss.as.controller.access.management.AccessConstraintDefinition;
import org.jboss.as.controller.descriptions.DescriptionProvider;
import org.jboss.as.controller.registry.ImmutableManagementResourceRegistration;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.version.Stability;

/**
* @author Tomaz Cerar (c) 2015 Red Hat Inc.
*/
public class DelegatingResourceDefinition implements ResourceDefinition {
protected volatile ResourceDefinition delegate;
public class DelegatingResourceDefinition extends ProvidedResourceDefinition {
private final AtomicReference<ResourceDefinition> reference;

protected void setDelegate(ResourceDefinition delegate) {
this.delegate = delegate;
}

@Override
public void registerOperations(ManagementResourceRegistration resourceRegistration) {
delegate.registerOperations(resourceRegistration);
}

@Override
public void registerChildren(ManagementResourceRegistration resourceRegistration) {
delegate.registerChildren(resourceRegistration);
}

@Override
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
delegate.registerAttributes(resourceRegistration);
}

@Override
public void registerNotifications(ManagementResourceRegistration resourceRegistration) {
delegate.registerNotifications(resourceRegistration);
}

@Override
public void registerCapabilities(ManagementResourceRegistration resourceRegistration) {
delegate.registerCapabilities(resourceRegistration);
}

@Override
public void registerAdditionalRuntimePackages(ManagementResourceRegistration resourceRegistration) {
delegate.registerAdditionalRuntimePackages(resourceRegistration);
}

@Override
public boolean isFeature() {
return delegate.isFeature();
}

@Override
public int getMinOccurs() {
return delegate.getMinOccurs();
}

@Override
public int getMaxOccurs() {
return delegate.getMaxOccurs();
public DelegatingResourceDefinition() {
this(new AtomicReference<>());
}

@Override
public PathElement getPathElement() {
return delegate.getPathElement();
private DelegatingResourceDefinition(AtomicReference<ResourceDefinition> reference) {
super(reference::get);
this.reference = reference;
}

@Override
public DescriptionProvider getDescriptionProvider(ImmutableManagementResourceRegistration resourceRegistration) {
return delegate.getDescriptionProvider(resourceRegistration);
protected void setDelegate(ResourceDefinition delegate) {
this.reference.set(delegate);
}

@Override
public List<AccessConstraintDefinition> getAccessConstraints() {
if (delegate == null) {
return Collections.emptyList();
}
return delegate.getAccessConstraints();
ResourceDefinition delegate = this.reference.get();
return (delegate != null) ? delegate.getAccessConstraints() : List.of();
}

@Override
public boolean isRuntime() {
if (delegate!=null) {
return delegate.isRuntime();
}
return false;
ResourceDefinition delegate = this.reference.get();
return (delegate != null) ? delegate.isRuntime() : false;
}

@Override
public boolean isOrderedChild() {
if (delegate != null) {
return delegate.isOrderedChild();
}
return false;
ResourceDefinition delegate = this.reference.get();
return (delegate != null) ? delegate.isOrderedChild() : false;
}
}


@Override
public Stability getStability() {
ResourceDefinition delegate = this.reference.get();
return (delegate != null) ? delegate.getStability() : Stability.DEFAULT;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
import org.jboss.as.controller.registry.Resource;
import org.jboss.as.controller.registry.Resource.ResourceEntry;
import org.jboss.as.core.security.AccessMechanism;
import org.jboss.as.version.Stability;
import org.jboss.dmr.ModelNode;
import org.jboss.msc.service.ServiceRegistry;
import org.jboss.msc.service.ServiceTarget;
Expand Down Expand Up @@ -108,6 +109,7 @@ class ModelControllerImpl implements ModelController {
private final AtomicReference<ManagementModelImpl> managementModel = new AtomicReference<>();
private final ConfigurationPersister persister;
private final ProcessType processType;
private final Stability stability;
private final RunningModeControl runningModeControl;
private final AtomicBoolean bootingFlag = new AtomicBoolean(true);
private final AtomicBoolean bootingReadOnlyFlag = new AtomicBoolean(false);
Expand Down Expand Up @@ -140,7 +142,7 @@ class ModelControllerImpl implements ModelController {
ModelControllerImpl(final ServiceRegistry serviceRegistry, final ServiceTarget serviceTarget,
final ManagementResourceRegistration rootRegistration,
final ContainerStateMonitor stateMonitor, final ConfigurationPersister persister,
final ProcessType processType, final RunningModeControl runningModeControl,
final ProcessType processType, Stability stability, final RunningModeControl runningModeControl,
final OperationStepHandler prepareStep, final ControlledProcessState processState, final ExecutorService executorService,
final ExpressionResolver expressionResolver, final Authorizer authorizer, final Supplier<SecurityIdentity> securityIdentitySupplier,
final ManagedAuditLogger auditLogger, NotificationSupport notificationSupport,
Expand All @@ -166,6 +168,8 @@ class ModelControllerImpl implements ModelController {
this.persister = persister;
assert processType != null;
this.processType = processType;
assert stability != null;
this.stability = stability;
assert runningModeControl != null;
this.runningModeControl = runningModeControl;
assert notificationSupport != null;
Expand Down Expand Up @@ -305,7 +309,7 @@ public void operationPrepared(OperationTransaction transaction, ModelNode result
};

// Use a read-only context
try (ReadOnlyContext context = new ReadOnlyContext(processType, runningModeControl.getRunningMode(), txControl, processState, false, model, delegateContext, this, operationId, securityIdentitySupplier)) {
try (ReadOnlyContext context = new ReadOnlyContext(processType, this.stability, runningModeControl.getRunningMode(), txControl, processState, false, model, delegateContext, this, operationId, securityIdentitySupplier)) {
context.addStep(response, operation, prepareStep, OperationContext.Stage.MODEL);
context.executeOperation();
}
Expand Down Expand Up @@ -408,7 +412,7 @@ public void operationPrepared(OperationTransaction transaction, ModelNode result
// Create a random operation-id
final Integer operationID = random.nextInt();
final OperationContextImpl context = new OperationContextImpl(operationID, operation.get(OP).asString(),
operation.get(OP_ADDR), this, processType, runningModeControl.getRunningMode(),
operation.get(OP_ADDR), this, processType, this.stability, runningModeControl.getRunningMode(),
headers, handler, attachments, managementModel.get(), originalResultTxControl, processState, auditLogger,
bootingFlag.get(), forBoot, hostServerGroupTracker, accessContext, notificationSupport,
false, extraValidationStepHandler, partialModel, securityIdentitySupplier);
Expand Down Expand Up @@ -488,7 +492,7 @@ boolean boot(final List<ModelNode> bootList, final OperationMessageHandler handl

//For the initial operations the model will not be complete, so defer the validation
final AbstractOperationContext context = new OperationContextImpl(operationID, INITIAL_BOOT_OPERATION, EMPTY_ADDRESS,
this, processType, runningModeControl.getRunningMode(),
this, processType, this.stability, runningModeControl.getRunningMode(),
headers, handler, null, managementModel.get(), control, processState, auditLogger, bootingFlag.get(), true,
hostServerGroupTracker, null, notificationSupport, true, extraValidationStepHandler, true, securityIdentitySupplier);

Expand All @@ -510,7 +514,7 @@ boolean boot(final List<ModelNode> bootList, final OperationMessageHandler handl
if (resultAction == OperationContext.ResultAction.KEEP && bootOperations.postExtensionOps != null) {
// Success. Now any extension handlers are registered. Continue with remaining ops
final AbstractOperationContext postExtContext = new OperationContextImpl(operationID, POST_EXTENSION_BOOT_OPERATION,
EMPTY_ADDRESS, this, processType, runningModeControl.getRunningMode(),
EMPTY_ADDRESS, this, processType, this.stability, runningModeControl.getRunningMode(),
headers, handler, null, managementModel.get(), control, processState, auditLogger,
bootingFlag.get(), true, hostServerGroupTracker, null, notificationSupport, true,
extraValidationStepHandler, partialModel, securityIdentitySupplier);
Expand Down Expand Up @@ -552,7 +556,7 @@ boolean boot(final List<ModelNode> bootList, final OperationMessageHandler handl
addAllAddresses(managementModel.get().getRootResourceRegistration(), PathAddress.EMPTY_ADDRESS, root, validateAddresses);

try (AbstractOperationContext validateContext = new OperationContextImpl(operationID, POST_EXTENSION_BOOT_OPERATION,
EMPTY_ADDRESS, this, processType, runningModeControl.getRunningMode(),
EMPTY_ADDRESS, this, processType, this.stability, runningModeControl.getRunningMode(),
headers, handler, null, managementModel.get(), control, processState, auditLogger,
bootingFlag.get(), true, hostServerGroupTracker, null, notificationSupport, false,
extraValidationStepHandler, partialModel, securityIdentitySupplier)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public String getType() {
}

public DescriptionProvider getDescriptionProvider() {
return new DefaultNotificationDescriptionProvider(type, resolver, dataValueDescriptor);
return new DefaultNotificationDescriptionProvider(this, resolver, dataValueDescriptor);
}

public static class Builder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1066,7 +1066,7 @@ default ServiceTarget getServiceTarget() throws UnsupportedOperationException {

@Override
default Stability getStability() {
return this.getResourceRegistration().getStability();
return Stability.DEFAULT;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
import org.jboss.as.controller.registry.Resource;
import org.jboss.as.controller.transform.ContextAttachments;
import org.jboss.as.core.security.AccessMechanism;
import org.jboss.as.version.Stability;
import org.jboss.dmr.ModelNode;
import org.jboss.msc.service.LifecycleEvent;
import org.jboss.msc.service.LifecycleListener;
Expand Down Expand Up @@ -189,7 +190,7 @@ final class OperationContextImpl extends AbstractOperationContext {
OperationContextImpl(final Integer operationId,
final String operationName, final ModelNode operationAddress,
final ModelControllerImpl modelController, final ProcessType processType,
final RunningMode runningMode,
final Stability stability, final RunningMode runningMode,
final OperationHeaders operationHeaders,
final OperationMessageHandler messageHandler, final OperationAttachments attachments,
final ModelControllerImpl.ManagementModelImpl managementModel, final ModelController.OperationTransactionControl transactionControl,
Expand All @@ -204,7 +205,7 @@ final class OperationContextImpl extends AbstractOperationContext {
final OperationStepHandler extraValidationStepHandler,
final boolean partialModel,
final Supplier<SecurityIdentity> securityIdentitySupplier) {
super(processType, runningMode, transactionControl, processState, booting, auditLogger, notificationSupport,
super(processType, stability, runningMode, transactionControl, processState, booting, auditLogger, notificationSupport,
modelController, skipModelValidation, extraValidationStepHandler, operationHeaders, securityIdentitySupplier);
this.operationId = operationId;
this.operationName = operationName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
*
* @author Brian Stansberry (c) 2011 Red Hat Inc.
*/
@SuppressWarnings("deprecation")
class ParallelBootOperationContext extends AbstractOperationContext {

private final OperationContextImpl primaryContext;
Expand All @@ -49,7 +48,7 @@ class ParallelBootOperationContext extends AbstractOperationContext {
final List<ParsedBootOp> runtimeOps,
final ModelControllerImpl controller, final int operationId, final AuditLogger auditLogger,
final OperationStepHandler extraValidationStepHandler, final Supplier<SecurityIdentity> securityIdentitySupplier) {
super(primaryContext.getProcessType(), primaryContext.getRunningMode(), transactionControl, processState, true, auditLogger,
super(primaryContext.getProcessType(), primaryContext.getStability(), primaryContext.getRunningMode(), transactionControl, processState, true, auditLogger,
controller.getNotificationSupport(), controller, true, extraValidationStepHandler, null, securityIdentitySupplier);
this.primaryContext = primaryContext;
this.runtimeOps = runtimeOps;
Expand Down
Loading