Esempio n. 1
0
 def test_verbose(self):
     payload_script = 'echo hello123'
     archive = archive_builder_docker.build_archive(
         payload_script=payload_script,
         verbose=True,
         docker_image='python:3')
     output, errors = archive_builder_docker.run_archive(archive, timeout=5)
     output = output.strip()
     self.assertEqual(output, 'hello123')
Esempio n. 2
0
def run_sweep_doodad(
        target,
        params,
        run_mode,
        mounts,
        test_one=False,
        docker_image='python:3',
        is_docker_interactive=False,
        return_output=False,
        verbose=False,
        postprocess_config_and_run_mode=lambda config, run_mode, idx:
    (config, run_mode),
        default_params=None):
    # build archive
    target_dir = os.path.dirname(target)
    target_mount_dir = os.path.join('target', os.path.basename(target_dir))
    target_mount = mount.MountLocal(local_dir=target_dir,
                                    mount_point=target_mount_dir)
    mounts = list(mounts) + [target_mount]
    target_full_path = os.path.join(target_mount.mount_point,
                                    os.path.basename(target))
    command = launch_api.make_python_command(target_full_path)

    print('Launching jobs with mode %s' % run_mode)
    results = []
    njobs = 0
    with archive_builder.temp_archive_file() as archive_file:
        archive = archive_builder.build_archive(
            archive_filename=archive_file,
            payload_script=command,
            verbose=verbose,
            docker_image=docker_image,
            is_docker_interactive=is_docker_interactive,
            use_nvidia_docker=run_mode.use_gpu,
            mounts=mounts)

        sweeper = Sweeper(params, default_params)
        for config in sweeper:
            config, run_mode = postprocess_config_and_run_mode(
                config, run_mode, njobs)
            if config is None:
                continue
            njobs += 1
            cli_args = ' '.join(
                ['--%s %s' % (key, config[key]) for key in config])
            cmd = archive + ' -- ' + cli_args
            result = run_mode.run_script(cmd,
                                         return_output=return_output,
                                         verbose=False)
            if return_output:
                result = archive_builder._strip_stdout(result)
                results.append(result)
            if test_one:
                break
    print('Launching completed for %d jobs' % njobs)
    run_mode.print_launch_message()
    return tuple(results)
Esempio n. 3
0
def run_sweep_doodad_chunked(target,
                             params,
                             run_mode,
                             mounts,
                             num_chunks=10,
                             docker_image='python:3',
                             return_output=False,
                             test_one=False,
                             confirm=True,
                             verbose=False):
    # build archive
    target_dir = os.path.dirname(target)
    target_mount_dir = os.path.join('target', os.path.basename(target_dir))
    target_mount = mount.MountLocal(local_dir=target_dir,
                                    mount_point=target_mount_dir)
    mounts = list(mounts) + [target_mount]
    target_full_path = os.path.join(target_mount.mount_point,
                                    os.path.basename(target))
    command = launch_api.make_python_command(target_full_path)

    print('Launching jobs with mode %s' % run_mode)
    results = []
    njobs = 0
    with archive_builder.temp_archive_file() as archive_file:
        archive = archive_builder.build_archive(
            archive_filename=archive_file,
            payload_script=command,
            verbose=verbose,
            docker_image=docker_image,
            use_nvidia_docker=run_mode.use_gpu,
            mounts=mounts)

        sweeper = Sweeper(params)
        chunks = chunker(sweeper, num_chunks, confirm=confirm)
        for chunk in chunks:
            command = ''
            for config in chunk:
                njobs += 1
                cli_args = ' '.join(
                    ['--%s %s' % (key, config[key]) for key in config])
                single_command = archive + ' -- ' + cli_args
                command += '%s;' % single_command

            result = run_mode.run_script(command,
                                         return_output=return_output,
                                         verbose=False)
            if return_output:
                result = archive_builder._strip_stdout(result)
                results.append(result)
            if test_one:
                break
    print('Launching completed for %d jobs on %d machines' %
          (njobs, num_chunks))
    run_mode.print_launch_message()
    return tuple(results)
Esempio n. 4
0
 def test_cli_args(self):
     payload_script = 'echo hi'
     archive = archive_builder_docker.build_archive(
         payload_script=payload_script,
         verbose=True,
         docker_image='python:3')
     output, errors = archive_builder_docker.run_archive(archive,
                                                         cli_args='--help',
                                                         timeout=5)
     output = output.strip()
     self.assertEqual(output, 'hi --help')
Esempio n. 5
0
def run_command(
        command,
        cli_args=None,
        mode=launch_mode.LocalMode(),
        mounts=tuple(),
        return_output=False,
        verbose=False,
        docker_image='ubuntu:18.04',
        singularity_image=None,
        container_type='docker',
        extra_container_flags='',
    ):
    """
    Runs a shell command using doodad via a specified launch mode.

    Args:
        command (str): A shell command
        cli_args (str): Command line args to pass
        mode (LaunchMode): A LaunchMode object
        mounts (tuple): A list/tuple of Mount objects
        return_output (bool): If True, returns stdout as a string.
            Do not use if the output will be large.
        container_type (string): either 'docker' or 'singularity
        extra_container_flags (string): flags other than GPU flags to pass to
            docker run or singularity exec.

    Returns:
        A string output if return_output is True,
        else None
    """
    with archive_builder.temp_archive_file() as archive_file:
        archive = archive_builder.build_archive(archive_filename=archive_file,
                                                payload_script=command,
                                                verbose=False,
                                                docker_image=docker_image,
                                                singularity_image=singularity_image,
                                                container_type=container_type,
                                                extra_container_flags=extra_container_flags,
                                                use_gpu_image=mode.use_gpu,
                                                mounts=mounts)
        cmd = archive
        if cli_args:
            cmd = archive + ' -- ' + cli_args
        result = mode.run_script(cmd, return_output=return_output, verbose=verbose)
    if return_output:
        result = archive_builder._strip_stdout(result)

    return result
Esempio n. 6
0
 def test_s3(self):
     """ Dry-run test for MountS3
     This test doesn't actually run things it just makes sure nothing errors.
     (we don't actually want to launch a test on EC2 and spend money) 
     """
     mnts = []
     mnts.append(mount.MountS3(
         s3_path='logs/mylogs',
         dry=True,
     ))
     payload_script = 'echo hello123'
     archive = archive_builder_docker.build_archive(
         payload_script=payload_script,
         verbose=False,
         docker_image='python:3',
         mounts=mnts)
Esempio n. 7
0
    def test_local_repo(self):
        mnts = []
        mnts.append(
            mount.MountLocal(local_dir=TESTING_DIR,
                             mount_point='./mymount',
                             output=False))
        payload_script = 'cat ./mymount/secret.txt'

        archive = archive_builder_docker.build_archive(
            payload_script=payload_script,
            verbose=False,
            docker_image='python:3',
            mounts=mnts)
        output, errors = archive_builder_docker.run_archive(archive, timeout=5)
        output = output.strip()
        self.assertEqual(output, 'apple')
Esempio n. 8
0
    def test_git_repo(self):
        mnts = []
        mnts.append(
            mount.MountGit(git_url='https://github.com/justinjfu/doodad.git',
                           branch='archive_builder_test',
                           mount_point='./code/doodad'))

        payload_script = 'python3 ./code/doodad/test/hello_world.py'
        archive = archive_builder_docker.build_archive(
            payload_script=payload_script,
            verbose=False,
            docker_image='python:3',
            mounts=mnts)
        output, errors = archive_builder_docker.run_archive(archive, timeout=5)
        output = output.strip()
        self.assertEqual(output, 'hello world!')
Esempio n. 9
0
    def test_git_repo_pythonpath(self):
        mnts = []
        mnts.append(
            mount.MountGit(git_url='https://github.com/justinjfu/doodad.git',
                           branch='archive_builder_test',
                           ssh_identity='~/.ssh/github',
                           mount_point='./code/doodad',
                           pythonpath=True))

        payload_script = 'python3 ./code/doodad/test/test_import.py'
        archive = archive_builder_docker.build_archive(
            payload_script=payload_script,
            verbose=False,
            docker_image='python:3',
            mounts=mnts)
        output, errors = archive_builder_docker.run_archive(archive, timeout=5)
        output = output.strip()
        self.assertEqual(output, 'apple')
Esempio n. 10
0
def run_command(command,
                cli_args=None,
                mode=launch_mode.LocalMode(),
                mounts=tuple(),
                return_output=False,
                verbose=False,
                docker_image='ubuntu:18.04'):
    """
    Runs a shell command using doodad via a specified launch mode.

    Args:
        command (str): A shell command
        cli_args (str): Command line args to pass
        mode (LaunchMode): A LaunchMode object
        mounts (tuple): A list/tuple of Mount objects
        return_output (bool): If True, returns stdout as a string.
            Do not use if the output will be large.
    
    Returns:
        A string output if return_output is True,
        else None
    """
    with archive_builder.temp_archive_file() as archive_file:
        archive = archive_builder.build_archive(archive_filename=archive_file,
                                                payload_script=command,
                                                verbose=False,
                                                docker_image=docker_image,
                                                use_nvidia_docker=mode.use_gpu,
                                                mounts=mounts)
        cmd = archive
        if cli_args:
            cmd = archive + ' -- ' + cli_args
        result = mode.run_script(cmd,
                                 return_output=return_output,
                                 verbose=verbose)
    if return_output:
        result = archive_builder._strip_stdout(result)

    return result
Esempio n. 11
0
 def test_local_output(self):
     mnts = []
     try:
         shutil.rmtree(TESTING_OUTPUT_DIR)
     except OSError:
         pass
     temp_dir = TESTING_OUTPUT_DIR
     os.makedirs(TESTING_OUTPUT_DIR)
     mnts.append(
         mount.MountLocal(local_dir=temp_dir,
                          mount_point='/mymount',
                          output=True))
     payload_script = 'echo hello123 > /mymount/secret.txt'
     archive = archive_builder_docker.build_archive(
         payload_script=payload_script,
         verbose=False,
         docker_image='python:3',
         mounts=mnts)
     archive_builder_docker.run_archive(archive,
                                        timeout=5,
                                        get_output=False)
     with open(path.join(temp_dir, 'secret.txt'), 'r') as f:
         output = f.read()
     self.assertEqual(output, 'hello123\n')