package org.jboss.as.subsystem.test;
import org.jboss.as.controller.ModelVersion;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.transform.OperationTransformer.TransformedOperation;
import org.jboss.as.controller.transform.TransformerOperationAttachment;
import org.jboss.as.model.test.ModelTestKernelServices;
import org.jboss.dmr.ModelNode;
/**
* Allows access to the service container and the model controller
*
* @author <a href="kabir.khan@jboss.com">Kabir Khan</a>
*/
public interface KernelServices extends ModelTestKernelServices<KernelServices> {
Class<?> getTestClass();
/**
* Transforms an operation in the main controller to the format expected by the model controller containing
* the legacy subsystem
*
* @param modelVersion the subsystem model version of the legacy subsystem model controller
* @param operation the operation to transform
* @param attachment attachments propagated from the operation context to the created transformer context.
* This may be {@code null}. In a non-test scenario, this will be added by operation handlers
* triggering the transformation, but for tests this needs to be hard-coded. Tests will need to
* ensure themselves that the relevant attachments get set. * @return the transformed operation
* @throws IllegalStateException if this is not the test's main model controller
* @deprecated use {@link #executeInMainAndGetTheTransformedOperation(ModelNode, ModelVersion)} instead.
*/
@Deprecated
TransformedOperation transformOperation(ModelVersion modelVersion, ModelNode operation,
TransformerOperationAttachment attachment) throws OperationFailedException;
/**
* Transforms the model to the legacy subsystem model version
* @param modelVersion the target legacy subsystem model version
* @return the transformed model
* @throws IllegalStateException if this is not the test's main model controller
*/
ModelNode readTransformedModel(ModelVersion modelVersion);
/**
* Transforms the model to the legacy subsystem model version
* @param modelVersion the target legacy subsystem model version
* @param includeDefaults {@code true} if default values for undefined attributes should be included
* @return the transformed model
* @throws IllegalStateException if this is not the test's main model controller
*/
ModelNode readTransformedModel(ModelVersion modelVersion, boolean includeDefaults);
/**
* Execute an operation in the controller containg the passed in version of the subsystem.
* The operation and results will be translated from the format for the main controller to the
* legacy controller's format.
*
* @param modelVersion the subsystem model version of the legacy subsystem model controller
* @param op the operation for the main controller
* @throws IllegalStateException if this is not the test's main model controller or if there is no legacy controller containing the version of the subsystem
*/
ModelNode executeOperation(final ModelVersion modelVersion, final TransformedOperation op);
/**
* Execute an operation in controller, and get hold of the {@link TransformerOperationAttachment}.
*
* @param op the operation to execute
* @return the attachment or {@code null} if there is none.
* @deprecated This never worked properly, use {@link #executeInMainAndGetTheTransformedOperation(ModelNode, ModelVersion)} instead
*/
@Deprecated
TransformerOperationAttachment executeAndGrabTransformerAttachment(ModelNode op);
/**
* Execute an operation in the main controller, and get hold of the transformed operation. This
* is useful for testing cases when the transformer needs to check the current state of the model.
* Note that if the transformation ends up rejecting the operation, the main controller will not be rolled back
* to its previous state.
*
* @param op the operation to transform
* @param modelVersion
* @return the transformed operation
*/
TransformedOperation executeInMainAndGetTheTransformedOperation(ModelNode op, ModelVersion modelVersion);
}