package org.guvnor.ala.docker.executor;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.guvnor.ala.build.maven.config.impl.MavenBuildConfigImpl;
import org.guvnor.ala.build.maven.config.impl.MavenBuildExecConfigImpl;
import org.guvnor.ala.build.maven.config.impl.MavenProjectConfigImpl;
import org.guvnor.ala.build.maven.executor.MavenBuildConfigExecutor;
import org.guvnor.ala.build.maven.executor.MavenBuildExecConfigExecutor;
import org.guvnor.ala.build.maven.executor.MavenProjectConfigExecutor;
import org.guvnor.ala.config.BinaryConfig;
import org.guvnor.ala.config.BuildConfig;
import org.guvnor.ala.config.ProjectConfig;
import org.guvnor.ala.config.ProviderConfig;
import org.guvnor.ala.config.ProvisioningConfig;
import org.guvnor.ala.config.RuntimeConfig;
import org.guvnor.ala.config.SourceConfig;
import org.guvnor.ala.docker.access.DockerAccessInterface;
import org.guvnor.ala.docker.access.impl.DockerAccessInterfaceImpl;
import org.guvnor.ala.docker.config.impl.ContextAwareDockerProvisioningConfig;
import org.guvnor.ala.docker.config.impl.ContextAwareDockerRuntimeExecConfig;
import org.guvnor.ala.docker.config.DockerProviderConfig;
import org.guvnor.ala.docker.config.impl.DockerBuildConfigImpl;
import org.guvnor.ala.docker.config.impl.DockerProviderConfigImpl;
import org.guvnor.ala.docker.model.DockerRuntime;
import org.guvnor.ala.docker.service.DockerRuntimeManager;
import org.guvnor.ala.pipeline.Input;
import org.guvnor.ala.pipeline.Pipeline;
import org.guvnor.ala.pipeline.PipelineFactory;
import org.guvnor.ala.pipeline.Stage;
import org.guvnor.ala.pipeline.execution.PipelineExecutor;
import org.guvnor.ala.registry.BuildRegistry;
import org.guvnor.ala.registry.SourceRegistry;
import org.guvnor.ala.registry.local.InMemoryBuildRegistry;
import org.guvnor.ala.registry.local.InMemoryRuntimeRegistry;
import org.guvnor.ala.registry.local.InMemorySourceRegistry;
import org.guvnor.ala.runtime.Runtime;
import org.guvnor.ala.source.git.config.impl.GitConfigImpl;
import org.guvnor.ala.source.git.executor.GitConfigExecutor;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static java.util.Arrays.*;
import static org.guvnor.ala.pipeline.StageUtil.*;
import static org.junit.Assert.*;
/**
* Simple test using the Pipeline API and the docker Provider & Executors
*/
public class DockerExecutorTest {
private File tempPath;
@Before
public void setUp() throws IOException {
tempPath = Files.createTempDirectory( "xxx" ).toFile();
}
@After
public void tearDown() {
FileUtils.deleteQuietly( tempPath );
}
@Test
public void testAPI() throws InterruptedException {
final SourceRegistry sourceRegistry = new InMemorySourceRegistry();
final BuildRegistry buildRegistry = new InMemoryBuildRegistry();
final InMemoryRuntimeRegistry runtimeRegistry = new InMemoryRuntimeRegistry();
final DockerAccessInterface dockerAccessInterface = new DockerAccessInterfaceImpl();
final Stage<Input, SourceConfig> sourceConfig = config( "Git Source", (s) -> new GitConfigImpl() );
final Stage<SourceConfig, ProjectConfig> projectConfig = config( "Maven Project", (s) -> new MavenProjectConfigImpl() );
final Stage<ProjectConfig, BuildConfig> buildConfig = config( "Maven Build Config", (s) -> new MavenBuildConfigImpl() );
final Stage<BuildConfig, BuildConfig> dockerBuildConfig = config( "Docker Build Config", (s) -> new DockerBuildConfigImpl() );
final Stage<BuildConfig, BinaryConfig> buildExec = config( "Maven Build", (s) -> new MavenBuildExecConfigImpl() );
final Stage<BinaryConfig, ProviderConfig> providerConfig = config( "Docker Provider Config", (s) -> new DockerProviderConfigImpl() );
final Stage<ProviderConfig, ProvisioningConfig> runtimeConfig = config( "Docker Runtime Config", (s) -> new ContextAwareDockerProvisioningConfig() );
final Stage<ProvisioningConfig, RuntimeConfig> runtimeExec = config( "Docker Runtime Exec", (s) -> new ContextAwareDockerRuntimeExecConfig() );
final Pipeline pipe = PipelineFactory
.startFrom( sourceConfig )
.andThen( projectConfig )
.andThen( buildConfig )
.andThen( dockerBuildConfig )
.andThen( buildExec )
.andThen( providerConfig )
.andThen( runtimeConfig )
.andThen( runtimeExec ).buildAs( "my pipe" );
DockerRuntimeExecExecutor dockerRuntimeExecExecutor = new DockerRuntimeExecExecutor( runtimeRegistry, dockerAccessInterface );
final PipelineExecutor executor = new PipelineExecutor( asList( new GitConfigExecutor( sourceRegistry ),
new MavenProjectConfigExecutor( sourceRegistry ),
new MavenBuildConfigExecutor(),
new MavenBuildExecConfigExecutor( buildRegistry ),
new DockerBuildConfigExecutor(),
new DockerProviderConfigExecutor( runtimeRegistry ),
new DockerProvisioningConfigExecutor(), dockerRuntimeExecExecutor ) );
executor.execute( new Input() {
{
put( "repo-name", "drools-workshop" );
put( "create-repo", "true" );
put( "branch", "master" );
put( "out-dir", tempPath.getAbsolutePath() );
put( "origin", "https://github.com/kiegroup/drools-workshop" );
put( "project-dir", "drools-webapp-example" );
}
}, pipe, (Runtime b) -> System.out.println( b ) );
List<Runtime> allRuntimes = runtimeRegistry.getRuntimes(0, 10, "", true);
assertEquals( 1, allRuntimes.size() );
Runtime runtime = allRuntimes.get( 0 );
assertTrue( runtime instanceof DockerRuntime );
DockerRuntime dockerRuntime = ( DockerRuntime ) runtime;
DockerRuntimeManager runtimeManager = new DockerRuntimeManager( runtimeRegistry, dockerAccessInterface );
allRuntimes = runtimeRegistry.getRuntimes(0, 10, "", true);
assertEquals( 1, allRuntimes.size() );
runtime = allRuntimes.get( 0 );
dockerRuntime = ( DockerRuntime ) runtime;
assertEquals( "Running", dockerRuntime.getState().getState() );
runtimeManager.stop( dockerRuntime );
allRuntimes = runtimeRegistry.getRuntimes(0, 10, "", true);
assertEquals( 1, allRuntimes.size() );
runtime = allRuntimes.get( 0 );
dockerRuntime = ( DockerRuntime ) runtime;
assertEquals( "Stopped", dockerRuntime.getState().getState() );
dockerRuntimeExecExecutor.destroy( runtime );
dockerAccessInterface.dispose();
}
@Test
public void testFlexAPI() throws InterruptedException {
final InMemoryRuntimeRegistry runtimeRegistry = new InMemoryRuntimeRegistry();
final DockerAccessInterface dockerAccessInterface = new DockerAccessInterfaceImpl();
final Stage<Input, ProviderConfig> providerConfig = config( "Docker Provider Config", (s) -> new DockerProviderConfig() {
} );
final Stage<ProviderConfig, ProvisioningConfig> runtimeConfig = config( "Docker Runtime Config", (s) -> new ContextAwareDockerProvisioningConfig() {
} );
final Stage<ProvisioningConfig, RuntimeConfig> runtimeExec = config( "Docker Runtime Exec", (s) -> new ContextAwareDockerRuntimeExecConfig() );
final Pipeline pipe = PipelineFactory
.startFrom( providerConfig )
.andThen( runtimeConfig )
.andThen( runtimeExec ).buildAs( "my pipe" );
DockerRuntimeExecExecutor dockerRuntimeExecExecutor = new DockerRuntimeExecExecutor( runtimeRegistry, dockerAccessInterface );
final PipelineExecutor executor = new PipelineExecutor( asList( new DockerProviderConfigExecutor( runtimeRegistry ),
new DockerProvisioningConfigExecutor(),
dockerRuntimeExecExecutor ) );
executor.execute( new Input() {
{
put( "image-name", "kitematic/hello-world-nginx" );
put( "port-number", "8080" );
put( "docker-pull", "true" );
}
}, pipe, (Runtime b) -> System.out.println( b ) );
List<Runtime> allRuntimes = runtimeRegistry.getRuntimes(0, 10, "", true);
assertEquals( 1, allRuntimes.size() );
Runtime runtime = allRuntimes.get( 0 );
assertTrue( runtime instanceof DockerRuntime );
DockerRuntime dockerRuntime = ( DockerRuntime ) runtime;
DockerRuntimeManager runtimeManager = new DockerRuntimeManager( runtimeRegistry, dockerAccessInterface );
allRuntimes = runtimeRegistry.getRuntimes(0, 10, "", true);
assertEquals( 1, allRuntimes.size() );
runtime = allRuntimes.get( 0 );
dockerRuntime = ( DockerRuntime ) runtime;
assertEquals( "Running", dockerRuntime.getState().getState() );
runtimeManager.stop( dockerRuntime );
allRuntimes = runtimeRegistry.getRuntimes(0, 10, "", true);
assertEquals( 1, allRuntimes.size() );
runtime = allRuntimes.get( 0 );
dockerRuntime = ( DockerRuntime ) runtime;
assertEquals( "Stopped", dockerRuntime.getState().getState() );
dockerRuntimeExecExecutor.destroy( runtime );
dockerAccessInterface.dispose();
}
}