continuum-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From car...@apache.org
Subject svn commit: r649749 - in /continuum/trunk/continuum-core/src: main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
Date Sat, 19 Apr 2008 03:17:09 GMT
Author: carlos
Date: Fri Apr 18 20:17:07 2008
New Revision: 649749

URL: http://svn.apache.org/viewvc?rev=649749&view=rev
Log:
[CONTINUUM-1731] Add some commands to use a chroot jail in the build executor, keeping previous
functionality unmodified

Added:
    continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
  (with props)
Modified:
    continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java?rev=649749&r1=649748&r2=649749&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
(original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
Fri Apr 18 20:17:07 2008
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.maven.continuum.configuration.ConfigurationService;
 import org.apache.maven.continuum.installation.InstallationService;
 import org.apache.maven.continuum.model.project.BuildDefinition;
 import org.apache.maven.continuum.model.project.Project;
@@ -51,6 +52,9 @@
     extends AbstractLogEnabled
     implements ContinuumBuildExecutor, Initializable
 {
+    private static final String SUDO_EXECUTABLE = "sudo";
+    private static final String CHROOT_EXECUTABLE = "chroot";
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------
@@ -78,6 +82,11 @@
     /**
      * @plexus.configuration
      */
+    private File chrootJailDirectory;
+
+    /**
+     * @plexus.configuration
+     */
     private String defaultExecutable;
 
     // ----------------------------------------------------------------------
@@ -232,6 +241,26 @@
 
         try
         {
+            File chrootJailDirectory = getChrootJailDirectory();
+            if ( chrootJailDirectory != null )
+            {
+                StringBuilder sb = new StringBuilder();
+                sb.append( CHROOT_EXECUTABLE );
+                sb.append( " " );
+                sb.append( new File( chrootJailDirectory, project.getGroupId() ) );
+                sb.append( " " );
+                sb.append( " cd " );
+                sb.append( getRelativePath( chrootJailDirectory, workingDirectory, project.getGroupId()
) );
+                sb.append( " && " );
+                sb.append( actualExecutable );
+                sb.append( " " );
+                sb.append( arguments );
+
+                arguments = sb.toString();
+                actualExecutable = SUDO_EXECUTABLE;
+                workingDirectory = chrootJailDirectory; // not really used but must exist
+            }
+
             ExecutionResult result =
                 getShellCommandHelper().executeShellCommand( workingDirectory, actualExecutable,
arguments, output,
                                                              project.getId(), environments
);
@@ -260,6 +289,21 @@
         }
     }
 
+    private String getRelativePath( File chrootDir, File workingDirectory, String groupId
)
+    {
+        String path = workingDirectory.getPath();
+        String chrootBase = new File( chrootDir, groupId ).getPath();
+        if ( path.startsWith( chrootBase ) )
+        {
+            return path.substring( chrootBase.length(), path.length() );
+        }
+        else
+        {
+            throw new IllegalArgumentException( "Working directory is not inside the chroot
jail " + chrootBase +
+                " , " + path );
+        }
+    }
+
     protected abstract Map<String, String> getEnvironments( BuildDefinition buildDefinition
);
 
     protected String getJavaHomeValue( BuildDefinition buildDefinition )
@@ -374,5 +418,15 @@
     public void setExecutableResolver( ExecutableResolver executableResolver )
     {
         this.executableResolver = executableResolver;
+    }
+
+    public void setChrootJailDirectory( File chrootJailDirectory )
+    {
+        this.chrootJailDirectory = chrootJailDirectory;
+    }
+
+    public File getChrootJailDirectory()
+    {
+        return chrootJailDirectory;
     }
 }

Added: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java?rev=649749&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
(added)
+++ continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
Fri Apr 18 20:17:07 2008
@@ -0,0 +1,141 @@
+package org.apache.maven.continuum.execution;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.maven.continuum.configuration.ConfigurationService;
+import org.apache.maven.continuum.configuration.DefaultConfigurationService;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.utils.ChrootJailWorkingDirectoryService;
+import org.apache.maven.continuum.utils.shell.ExecutionResult;
+import org.apache.maven.continuum.utils.shell.ShellCommandHelper;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.logging.console.ConsoleLogger;
+import org.jmock.Expectations;
+import org.jmock.Mock;
+import org.jmock.Mockery;
+import org.jmock.core.Constraint;
+
+public class AbstractContinuumBuildExecutorTest
+    extends TestCase
+{
+    protected AbstractBuildExecutor executor = new BuildExecutorStub();
+
+    private Mockery context = new Mockery();
+
+    private String toSystemPath( String path )
+    {
+        if ( File.separator.equals( "\\" ) )
+        {
+            return path.replaceAll( "/", "\\" + File.separator );
+        }
+        return path;
+    }
+
+    public void testExecuteShellCommand()
+        throws Exception
+    {
+        final File chrootJailFile = new File( toSystemPath( "/home" ) );
+        final File workingDirectory = new File( toSystemPath( "/dir1/dir2/workingdir" ) );
+
+        final ShellCommandHelper helper = context.mock( ShellCommandHelper.class );
+
+        ConfigurationService configurationService = new DefaultConfigurationService()
+        {
+            @Override
+            public File getWorkingDirectory()
+            {
+                return workingDirectory;
+            }
+        };
+
+        ChrootJailWorkingDirectoryService directoryService = new ChrootJailWorkingDirectoryService();
+        directoryService.setConfigurationService( configurationService );
+        directoryService.setChrootJailDirectory( chrootJailFile );
+
+        executor.setChrootJailDirectory( chrootJailFile );
+        executor.setShellCommandHelper( helper );
+        executor.setWorkingDirectoryService( directoryService );
+        executor.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG, "" ) );
+
+        final Project project = new Project();
+        project.setId( 7 );
+        project.setGroupId( "xx" );
+        ProjectGroup projectGroup = new ProjectGroup();
+        projectGroup.setGroupId( project.getGroupId() );
+        project.setProjectGroup( projectGroup );
+
+        assertEquals( toSystemPath( chrootJailFile.getPath() + "/" + project.getGroupId()
+ workingDirectory.getPath() +
+            "/" + project.getId() ), directoryService.getWorkingDirectory( project ).getPath()
);
+
+        String executable = "mvn";
+        final String arguments = "-o clean install";
+        final File output = new File( "target/tmp" );
+        final Map<String, String> environments = new HashMap<String, String>();
+
+        final String cmd =
+            "chroot /home/xx " + " cd /dir1/dir2/workingdir/" + project.getId() + " &&
" + executable + " " + arguments;
+        // Constraint[] args =
+        // new Constraint[] { eq( chrootJailFile ), eq( "sudo" ), eq( toSystemPath( cmd )
), eq( output ),
+        // eq( project.getId() ), eq( environments ) };
+        final ExecutionResult result = new ExecutionResult( 0 );
+
+        context.checking( new Expectations()
+        {
+            {
+                one( helper ).executeShellCommand( chrootJailFile, "sudo", toSystemPath(
cmd ), output,
+                                                   project.getId(), environments );
+                will( returnValue( result ) );
+            }
+        } );
+
+        // helperMock.expects( once() ).method( "executeShellCommand" ).with( args ).will(
returnValue( result ) );
+
+        executor.executeShellCommand( project, executable, arguments, output, environments
);
+
+        context.assertIsSatisfied();
+        // super.verify();
+    }
+
+    class BuildExecutorStub
+        extends AbstractBuildExecutor
+    {
+
+        protected BuildExecutorStub()
+        {
+            super( "stub", true );
+        }
+
+        protected String findExecutable( Project project, String executable, String defaultExecutable,
+                                         boolean resolveExecutable, File workingDirectory
)
+        {
+            return executable;
+        }
+
+        @Override
+        protected Map<String, String> getEnvironments( BuildDefinition buildDefinition
)
+        {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public ContinuumBuildExecutionResult build( Project project, BuildDefinition buildDefinition,
File buildOutput )
+            throws ContinuumBuildExecutorException
+        {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public void updateProjectFromCheckOut( File workingDirectory, Project project, BuildDefinition
buildDefinition )
+            throws ContinuumBuildExecutorException
+        {
+            // TODO Auto-generated method stub
+
+        }
+    }
+}

Propchange: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"



Mime
View raw message