Ejemplo n.º 1
0
def cli(arghandling=ArgHandling(),
        argparser=ArgumentParser(
            prog=__app_name__,
            description="BDD Test Framework for Hashicorp terraform")):
    args = arghandling
    parser = argparser
    parser.add_argument("--features",
                        "-f",
                        dest="features",
                        metavar='feature_directory',
                        action=ReadableDir,
                        help="Directory consists of BDD features",
                        required=True)
    parser.add_argument(
        "--tfdir",
        "-t",
        dest="tf_dir",
        metavar='terraform_directory',
        action=ReadableDir,
        help=
        "Directory (or git repository with 'git:' prefix) consists of Terraform Files",
        required=True)
    parser.add_argument(
        "--identity",
        "-i",
        dest="ssh_key",
        metavar='ssh_private_key',
        type=str,
        nargs='?',
        help="SSH Private key that will be use on git authentication.",
        required=False)
    parser.add_argument("--version",
                        "-v",
                        action="version",
                        version=__version__)

    _, radish_arguments = parser.parse_known_args(namespace=args)

    print('{} v{} initiated'.format(__app_name__, __version__))

    steps_directory = os.path.join(
        os.path.split(os.path.abspath(__file__))[0], 'steps')
    print('Steps    : {}'.format(steps_directory))

    # SSH Key is given for git authentication
    ssh_cmd = {}
    if args.ssh_key:
        ssh_cmd = {
            "GIT_SSH_COMMAND": "ssh -l {} -i {}".format('git', args.ssh_key)
        }

    # A remote repository used here
    if args.features.startswith(('http', 'https', 'ssh')):
        features_git_repo = args.features
        args.features = mkdtemp()

        Repo.clone_from(url=features_git_repo,
                        to_path=args.features,
                        env=ssh_cmd)
    features_directory = os.path.join(os.path.abspath(args.features))
    print('Features : {}{}'.format(features_directory,
                                   (' ({})'.format(features_git_repo) if
                                    'features_git_repo' in locals() else '')))

    tf_tmp_dir = mkdtemp()

    # A remote repository is used here.
    if args.tf_dir.startswith(('http', 'https', 'ssh')):
        tf_git_repo = args.tf_dir
        Repo.clone_from(url=tf_git_repo, to_path=tf_tmp_dir, env=ssh_cmd)

    # A local directory is used here
    else:
        # Copy the given local directory to another place, since we may change some tf files for compatibility.
        copy_tree(args.tf_dir, tf_tmp_dir)

    tf_directory = os.path.join(os.path.abspath(tf_tmp_dir))
    print('TF Files : {} ({})'.format(tf_directory, args.tf_dir))

    commands = [
        'radish', '--write-steps-once', features_directory, '--basedir',
        steps_directory, '--user-data=tf_dir={}'.format(tf_directory)
    ]
    commands.extend(radish_arguments)

    try:
        load_tf_files(tf_directory)
    except TerraformComplianceInvalidConfig:
        print exc_info()[1]
        exit(1)

    print('Running tests.')
    result = call_radish(args=commands[1:])

    # Delete temporary directory we created
    print('Cleaning up.')
    rmtree(tf_directory)

    return result
Ejemplo n.º 2
0
 def test_load_tf_files_success(self, *args):
     self.assertTrue(load_tf_files('passed'))
     self.assertTrue(environ.get('MockedValidator.state', None) is None)
Ejemplo n.º 3
0
 def test_load_tf_files_terraformsyntaxexception(self, *args):
     self.assertTrue(load_tf_files('syntaxexception'))
     self.assertEqual(environ['MockedValidator.state'], '1')
     del environ['MockedValidator.state']
Ejemplo n.º 4
0
 def test_load_tf_files_valueerror(self, *args):
     with self.assertRaises(SystemExit):
         load_tf_files('valueerror')
Ejemplo n.º 5
0
 def test_load_tf_files_exit_for_dot_terraform(self, *args):
     with self.assertRaises(SystemExit):
         load_tf_files('a_directory')
Ejemplo n.º 6
0
def cli():
    args = ArgHandling()
    parser = ArgumentParser(
        prog=__app_name__,
        description="BDD Test Framework for Hashicorp terraform")
    parser.add_argument("--features",
                        "-f",
                        dest="features",
                        metavar='feature_directory',
                        action=ReadableDir,
                        help="Directory consists of BDD features",
                        required=True)
    parser.add_argument(
        "--tfdir",
        "-t",
        dest="tf_dir",
        metavar='terraform_directory',
        action=ReadableDir,
        help=
        "Directory (or git repository with 'git:' prefix) consists of Terraform Files",
        required=True)
    parser.add_argument("--version",
                        "-v",
                        action="version",
                        version=__version__)

    _, radish_arguments = parser.parse_known_args(namespace=args)

    print('{} v{} initiated'.format(__app_name__, __version__))

    steps_directory = os.path.join(
        os.path.split(os.path.abspath(__file__))[0], 'steps')
    print('Steps    : {}'.format(steps_directory))

    # A remote repository used here
    if args.features.startswith('http'):
        features_git_repo = args.features
        args.features = mkdtemp()
        Repo.clone_from(features_git_repo, args.features)
    features_directory = os.path.join(os.path.abspath(args.features))
    print('Features : {}{}'.format(features_directory,
                                   (' ({})'.format(features_git_repo) if
                                    'features_git_repo' in locals() else '')))

    tf_tmp_dir = mkdtemp()

    # A remote repository is used here.
    if args.tf_dir.startswith('http'):
        tf_git_repo = args.tf_dir
        Repo.clone_from(tf_git_repo, tf_tmp_dir)

    # A local directory is used here
    else:
        # Copy the given local directory to another place, since we may change some tf files for compatibility.
        copy_tree(args.tf_dir, tf_tmp_dir)

    tf_directory = os.path.join(os.path.abspath(tf_tmp_dir))
    print('TF Files : {} ({})'.format(tf_directory, args.tf_dir))

    commands = [
        'radish', '--write-steps-once', features_directory, '--basedir',
        steps_directory, '--user-data=tf_dir={}'.format(tf_directory)
    ]
    commands.extend(radish_arguments)

    load_tf_files(tf_directory)
    print('Running tests.')
    result = call_radish(args=commands[1:])

    # Delete temporary directory we created
    print('Cleaning up.')
    rmtree(tf_directory)