package org.guvnor.ala.wildfly.executor; import java.io.File; import java.util.Optional; import javax.inject.Inject; import org.guvnor.ala.config.Config; import org.guvnor.ala.config.RuntimeConfig; import org.guvnor.ala.exceptions.ProvisioningException; import org.guvnor.ala.pipeline.FunctionConfigExecutor; import org.guvnor.ala.registry.RuntimeRegistry; import org.guvnor.ala.runtime.RuntimeBuilder; import org.guvnor.ala.runtime.RuntimeDestroyer; import org.guvnor.ala.runtime.RuntimeId; import org.guvnor.ala.wildfly.access.WildflyAccessInterface; import org.guvnor.ala.wildfly.access.WildflyAppState; import org.guvnor.ala.wildfly.config.WildflyRuntimeConfiguration; import org.guvnor.ala.wildfly.config.WildflyRuntimeExecConfig; import org.guvnor.ala.wildfly.model.WildflyProvider; import org.guvnor.ala.wildfly.model.WildflyRuntime; import org.guvnor.ala.wildfly.model.WildflyRuntimeEndpoint; import org.guvnor.ala.wildfly.model.WildflyRuntimeInfo; import org.guvnor.ala.wildfly.model.WildflyRuntimeState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static com.google.common.base.Strings.isNullOrEmpty; public class WildflyRuntimeExecExecutor<T extends WildflyRuntimeConfiguration> implements RuntimeBuilder<T, WildflyRuntime>, RuntimeDestroyer, FunctionConfigExecutor<T, WildflyRuntime> { private final RuntimeRegistry runtimeRegistry; private final WildflyAccessInterface wildfly; protected static final Logger LOG = LoggerFactory.getLogger( WildflyRuntimeExecExecutor.class ); @Inject public WildflyRuntimeExecExecutor( final RuntimeRegistry runtimeRegistry, final WildflyAccessInterface wildfly ) { this.runtimeRegistry = runtimeRegistry; this.wildfly = wildfly; } @Override public Optional<WildflyRuntime> apply( final WildflyRuntimeConfiguration config ) { final Optional<WildflyRuntime> runtime = create( config ); if ( runtime.isPresent() ) { runtimeRegistry.registerRuntime( runtime.get() ); } return runtime; } private Optional<WildflyRuntime> create( final WildflyRuntimeConfiguration runtimeConfig ) throws ProvisioningException { String warPath = runtimeConfig.getWarPath(); final Optional<WildflyProvider> _wildflyProvider = runtimeRegistry.getProvider( runtimeConfig.getProviderId(), WildflyProvider.class ); WildflyProvider wildflyProvider = _wildflyProvider.get(); File file = new File( warPath ); final String id = file.getName(); WildflyAppState appState = wildfly.getWildflyClient( wildflyProvider ).getAppState( id ); if ("NA".equals(appState.getState())) { int result = wildfly.getWildflyClient( wildflyProvider ).deploy( file ); if ( result != 200 ) { throw new ProvisioningException( "Deployment to Wildfly Failed with error code: " + result ); } } else if ("Running".equals(appState.getState()) && (isNullOrEmpty(runtimeConfig.getRedeployStrategy()) || "auto".equals(runtimeConfig.getRedeployStrategy()))) { wildfly.getWildflyClient( wildflyProvider ).undeploy( id ); int result = wildfly.getWildflyClient( wildflyProvider ).deploy( file ); if ( result != 200 ) { throw new ProvisioningException( "Deployment to Wildfly Failed with error code: " + result ); } } String appContext = id.substring( 0, id.lastIndexOf( ".war" ) ); WildflyRuntimeEndpoint endpoint = new WildflyRuntimeEndpoint(); endpoint.setHost( wildfly.getWildflyClient( wildflyProvider ).getHost() ); endpoint.setPort( wildfly.getWildflyClient( wildflyProvider ).getPort() ); endpoint.setContext( appContext ); return Optional.of( new WildflyRuntime( id, runtimeConfig, wildflyProvider, endpoint, new WildflyRuntimeInfo(), new WildflyRuntimeState() ) ); } @Override public Class<? extends Config> executeFor() { return WildflyRuntimeExecConfig.class; } @Override public String outputId() { return "wildfly-runtime"; } @Override public boolean supports( final RuntimeConfig config ) { return config instanceof WildflyRuntimeConfiguration; } @Override public boolean supports( final RuntimeId runtimeId ) { return runtimeId instanceof WildflyRuntime || runtimeRegistry.getRuntimeById( runtimeId.getId() ) instanceof WildflyRuntime; } @Override public void destroy( final RuntimeId runtimeId ) { final Optional<WildflyProvider> _wildflyProvider = runtimeRegistry.getProvider( runtimeId.getProviderId(), WildflyProvider.class ); WildflyProvider wildflyProvider = _wildflyProvider.get(); int result = wildfly.getWildflyClient( wildflyProvider ).undeploy( runtimeId.getId() ); if ( result != 200 ) { throw new ProvisioningException( "UnDeployment to Wildfly Failed with error code: " + result ); } runtimeRegistry.unregisterRuntime( runtimeId ); } }