Skip to content

Commit

Permalink
[WFLY-5883] - Fixing reload and restart of services when writing to a…
Browse files Browse the repository at this point in the history
…ttributes.
  • Loading branch information
Pedro Igor committed Dec 18, 2015
1 parent 3754ff8 commit fcf9ed8
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 100 deletions.
Expand Up @@ -31,6 +31,7 @@
import org.jboss.as.controller.registry.Resource;
import org.jboss.as.security.service.SecurityDomainService;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.msc.service.ServiceBuilder;
import org.jboss.msc.service.ServiceController;
import org.picketlink.identity.federation.bindings.wildfly.idp.UndertowAttributeManager;
Expand Down Expand Up @@ -76,10 +77,18 @@ public void execute(OperationContext context, ModelNode operation) throws Operat
protected void performRuntime(final OperationContext context, final ModelNode operation, final ModelNode model, final ServiceVerificationHandler verificationHandler, final List<ServiceController<?>> newControllers) throws OperationFailedException {
PathAddress pathAddress = PathAddress.pathAddress(operation.get(ModelDescriptionConstants.ADDRESS));
ModelNode identityProviderNode = Resource.Tools.readModel(context.readResource(EMPTY_ADDRESS));
launchServices(context, identityProviderNode, verificationHandler, newControllers, pathAddress);
launchServices(context, identityProviderNode, verificationHandler, newControllers, pathAddress, false);
}

static void launchServices(OperationContext context, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers, PathAddress pathAddress) throws OperationFailedException {
@Override
protected void rollbackRuntime(OperationContext context, ModelNode operation, Resource resource) {
try {
IdentityProviderRemoveHandler.INSTANCE.performRuntime(context, operation, resource.getModel());
} catch (OperationFailedException ignore) {
}
}

static void launchServices(OperationContext context, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers, PathAddress pathAddress, boolean isRestart) throws OperationFailedException {
String alias = pathAddress.getLastElement().getValue();
IdentityProviderService service = new IdentityProviderService(toIDPConfig(context, model, alias));
ServiceBuilder<IdentityProviderService> serviceBuilder = context.getServiceTarget().addService(IdentityProviderService.createServiceName(alias), service);
Expand All @@ -105,6 +114,10 @@ static void launchServices(OperationContext context, ModelNode model, ServiceVer
if (newControllers != null) {
newControllers.add(controller);
}

if (isRestart) {
restartTrustDomains(alias, model, context);
}
}

static IDPConfiguration toIDPConfig(OperationContext context, ModelNode fromModel, String alias) throws OperationFailedException {
Expand Down Expand Up @@ -151,7 +164,6 @@ static IDPConfiguration toIDPConfig(OperationContext context, ModelNode fromMode
String roleGeneratorType;

if (roleGenerator.isDefined()) {
//TODO: resolve PLINK-
ModelNode roleGeneratorValue = roleGenerator.asProperty().getValue();
ModelNode classNameNode = RoleGeneratorResourceDefinition.CLASS_NAME.resolveModelAttribute(context, roleGeneratorValue);
ModelNode codeNode = RoleGeneratorResourceDefinition.CODE.resolveModelAttribute(context, roleGeneratorValue);
Expand Down Expand Up @@ -194,10 +206,13 @@ static IDPConfiguration toIDPConfig(OperationContext context, ModelNode fromMode
return idpType;
}

@Override protected void rollbackRuntime(OperationContext context, ModelNode operation, Resource resource) {
try {
IdentityProviderRemoveHandler.INSTANCE.performRuntime(context, operation, resource.getModel());
} catch (OperationFailedException ignore) {
private static void restartTrustDomains(String identityProviderName, ModelNode modelNode, OperationContext context) {
if (modelNode.hasDefined(ModelElement.IDENTITY_PROVIDER_TRUST_DOMAIN.getName())) {
for (Property handlerProperty : modelNode.get(ModelElement.IDENTITY_PROVIDER_TRUST_DOMAIN.getName()).asPropertyList()) {
String domainName = handlerProperty.getName();

TrustDomainAddHandler.restartServices(context, identityProviderName , domainName);
}
}
}
}
Expand Up @@ -75,7 +75,12 @@ public void execute(OperationContext context, ModelNode operation) throws Operat

@Override
protected void recreateParentService(OperationContext context, PathAddress parentAddress, ModelNode parentModel, ServiceVerificationHandler verificationHandler) throws OperationFailedException {
IdentityProviderAddHandler.launchServices(context, parentModel, verificationHandler, null, parentAddress);
IdentityProviderAddHandler.launchServices(context, parentModel, verificationHandler, null, parentAddress, true);
}

@Override
protected void recreateParentService(OperationContext context, PathAddress parentAddress, ModelNode parentModel) throws OperationFailedException {
IdentityProviderAddHandler.launchServices(context, parentModel, null, null, parentAddress, true);
}

@Override
Expand Down
Expand Up @@ -33,9 +33,6 @@
import org.wildfly.extension.picketlink.federation.service.IdentityProviderService;

/**
* <p>This remove handler is used during the removal of all partition-manager child resources. Its purpose is restart the
* identity store services prior to the child removal, so we can stop all store services properly before restarting the parent.</p>
*
* @author Pedro Silva
*/
public class IdentityProviderConfigRemoveStepHandler extends RestartParentResourceRemoveHandler {
Expand All @@ -48,7 +45,12 @@ private IdentityProviderConfigRemoveStepHandler() {

@Override
protected void recreateParentService(OperationContext context, PathAddress parentAddress, ModelNode parentModel, ServiceVerificationHandler verificationHandler) throws OperationFailedException {
IdentityProviderAddHandler.launchServices(context, parentModel, verificationHandler, null, parentAddress);
IdentityProviderAddHandler.launchServices(context, parentModel, verificationHandler, null, parentAddress, true);
}

@Override
protected void recreateParentService(OperationContext context, PathAddress parentAddress, ModelNode parentModel) throws OperationFailedException {
IdentityProviderAddHandler.launchServices(context, parentModel, null, null, parentAddress, true);
}

@Override
Expand Down
Expand Up @@ -53,6 +53,6 @@ protected void performRuntime(OperationContext context, ModelNode operation, Mod

@Override
protected void recoverServices(OperationContext context, ModelNode operation, ModelNode model) throws OperationFailedException {
IdentityProviderAddHandler.launchServices(context, model, null, null, PathAddress.pathAddress(operation.get(ADDRESS)));
IdentityProviderAddHandler.launchServices(context, model, null, null, PathAddress.pathAddress(operation.get(ADDRESS)), false);
}
}
Expand Up @@ -22,32 +22,28 @@

package org.wildfly.extension.picketlink.federation.model.idp;

import org.jboss.as.controller.AbstractWriteAttributeHandler;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.ExtensionContext;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.OperationStepHandler;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.RestartParentWriteAttributeHandler;
import org.jboss.as.controller.ServiceVerificationHandler;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.access.management.SensitiveTargetAccessConstraintDefinition;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.registry.Resource;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceRegistry;
import org.jboss.msc.service.ServiceName;
import org.wildfly.extension.picketlink.common.model.ModelElement;
import org.wildfly.extension.picketlink.federation.model.AbstractFederationResourceDefinition;
import org.wildfly.extension.picketlink.federation.model.handlers.HandlerResourceDefinition;
import org.wildfly.extension.picketlink.federation.service.IdentityProviderService;

import java.util.List;

import static org.jboss.as.controller.PathAddress.EMPTY_ADDRESS;

/**
* @author <a href="mailto:psilva@redhat.com">Pedro Silva</a>
* @since Mar 16, 2012
Expand Down Expand Up @@ -122,47 +118,26 @@ public void registerAttributes(ManagementResourceRegistration resourceRegistrati
@Override
protected OperationStepHandler createAttributeWriterHandler() {
List<SimpleAttributeDefinition> attributes = getAttributes();
return new AbstractWriteAttributeHandler(attributes.toArray(new AttributeDefinition[attributes.size()])) {
return new RestartParentWriteAttributeHandler(ModelElement.IDENTITY_PROVIDER.getName(), attributes.toArray(new AttributeDefinition[attributes.size()])) {
@Override
protected ServiceName getParentServiceName(PathAddress parentAddress) {
return IdentityProviderService.createServiceName(parentAddress.getLastElement().getValue());
}

@Override
public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {
context.addStep(new IdentityProviderValidationStepHandler(), OperationContext.Stage.MODEL);
super.execute(context, operation);
}

@Override
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName, ModelNode resolvedValue, ModelNode currentValue, HandbackHolder handbackHolder) throws OperationFailedException {
PathAddress pathAddress = PathAddress.pathAddress(operation.get(ModelDescriptionConstants.OP_ADDR));

updateConfiguration(context, pathAddress, false);

return false;
protected void recreateParentService(OperationContext context, PathAddress parentAddress, ModelNode parentModel) throws OperationFailedException {
IdentityProviderAddHandler.launchServices(context, parentModel, null, null, parentAddress, true);
}

@Override
protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName, ModelNode valueToRestore, ModelNode valueToRevert, Object handback) throws OperationFailedException {
PathAddress pathAddress = PathAddress.pathAddress(operation.get(ModelDescriptionConstants.OP_ADDR));
updateConfiguration(context, pathAddress, true);
}

private void updateConfiguration(OperationContext context, PathAddress pathAddress, boolean rollback) throws OperationFailedException {
String alias = pathAddress.getLastElement().getValue();
ServiceRegistry serviceRegistry = context.getServiceRegistry(false);
ServiceController<IdentityProviderService> serviceController =
(ServiceController<IdentityProviderService>) serviceRegistry.getService(IdentityProviderService.createServiceName(alias));

if (serviceController != null) {
IdentityProviderService service = serviceController.getValue();
ModelNode identityProviderNode;

if (!rollback) {
identityProviderNode = context.readResource(EMPTY_ADDRESS, false).getModel();
} else {
Resource rc = context.getOriginalRootResource().navigate(pathAddress);
identityProviderNode = rc.getModel();
}

service.setConfiguration(IdentityProviderAddHandler.toIDPConfig(context, identityProviderNode, alias));
}
protected void recreateParentService(OperationContext context, PathAddress parentAddress, ModelNode parentModel, ServiceVerificationHandler verificationHandler) throws OperationFailedException {
IdentityProviderAddHandler.launchServices(context, parentModel, null, null, parentAddress, true);
}
};
}
Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.jboss.dmr.ModelNode;
import org.jboss.msc.service.ServiceBuilder;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;
import org.wildfly.extension.picketlink.federation.service.IdentityProviderService;
import org.wildfly.extension.picketlink.federation.service.TrustDomainService;

Expand All @@ -48,12 +49,17 @@ public class TrustDomainAddHandler extends AbstractAddStepHandler {
static final TrustDomainAddHandler INSTANCE = new TrustDomainAddHandler();

static void launchServices(OperationContext context, PathAddress pathAddress, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) throws OperationFailedException {
String identityProviderAlias = pathAddress.subAddress(0, pathAddress.size() - 1).getLastElement().getValue();
String identityProviderName = pathAddress.subAddress(0, pathAddress.size() - 1).getLastElement().getValue();
String domainName = pathAddress.getLastElement().getValue();
launchServices(context, identityProviderName, domainName, verificationHandler, newControllers);
}

static void launchServices(OperationContext context, String identityProviderName, String domainName, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) {
TrustDomainService service = new TrustDomainService(domainName);
ServiceBuilder<TrustDomainService> serviceBuilder = context.getServiceTarget().addService(TrustDomainService.createServiceName(identityProviderAlias, domainName), service);
ServiceName serviceName = TrustDomainService.createServiceName(identityProviderName, domainName);
ServiceBuilder<TrustDomainService> serviceBuilder = context.getServiceTarget().addService(serviceName, service);

serviceBuilder.addDependency(IdentityProviderService.createServiceName(identityProviderAlias), IdentityProviderService.class, service.getIdentityProviderService());
serviceBuilder.addDependency(IdentityProviderService.createServiceName(identityProviderName), IdentityProviderService.class, service.getIdentityProviderService());

if (verificationHandler != null) {
serviceBuilder.addListener(verificationHandler);
Expand All @@ -66,6 +72,14 @@ static void launchServices(OperationContext context, PathAddress pathAddress, Mo
}
}

static void restartServices(OperationContext context, String identityProviderName, String domainName) {
ServiceName serviceName = TrustDomainService.createServiceName(identityProviderName, domainName);

context.removeService(serviceName);

launchServices(context, identityProviderName, domainName, null, null);
}

@Override
protected void populateModel(OperationContext context, ModelNode operation, Resource resource) throws OperationFailedException {
ModelNode model = resource.getModel();
Expand All @@ -82,11 +96,4 @@ protected void performRuntime(OperationContext context, ModelNode operation, Mod
ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) throws OperationFailedException {
launchServices(context, PathAddress.pathAddress(operation.get(ADDRESS)), model, verificationHandler, newControllers);
}

@Override protected void rollbackRuntime(OperationContext context, ModelNode operation, Resource resource) {
try {
TrustDomainRemoveHandler.INSTANCE.performRuntime(context, operation, resource.getModel());
} catch (OperationFailedException ignore) {
}
}
}

0 comments on commit fcf9ed8

Please sign in to comment.