def test_set_step_config_override_overrides_existing_step(self):
        config = Config({
            Config.CONFIG_KEY: {
                'step-foo': {
                    'implementer': 'foo',
                }
            }
        })
        sub_step_configs = config.get_sub_step_configs('step-foo')
        self.assertEqual(len(sub_step_configs), 1)
        sub_step_config = sub_step_configs[0]
        self.assertEqual(sub_step_config.step_config_overrides, {})

        config.set_step_config_overrides('step-foo', {
            'test1': 'test2'
        })
        self.assertEqual(sub_step_config.step_config_overrides, {
            'test1': 'test2'
        })

        config.set_step_config_overrides('step-foo', {
            'test2': 'test3'
        })
        self.assertEqual(sub_step_config.step_config_overrides, {
            'test2': 'test3'
        })
Ejemplo n.º 2
0
    def test_set_step_config_overrides_not_existing_step(self):
        config = Config({Config.CONFIG_KEY: {}})
        self.assertIsNone(config.get_step_config('step-bar'))

        config.set_step_config_overrides('step-bar', {'test1': 'test2'})

        step_config = config.get_step_config('step-bar')
        self.assertIsNotNone(step_config)
        self.assertEqual(step_config.step_config_overrides, {'test1': 'test2'})
Ejemplo n.º 3
0
def main(argv=None):
    """Main entry point for Ploigos step runner.
    """
    parser = argparse.ArgumentParser(description='Ploigos Step Runner (psr)')
    parser.add_argument(
        '-s',
        '--step',
        required=True,
        help='Workflow step to run'
    )
    parser.add_argument(
        '-e',
        '--environment',
        required=False,
        help='The environment to run this step against.'
    )
    parser.add_argument(
        '-c',
        '--config',
        required=True,
        nargs='+',
        help='Workflow configuration files, or directories containing files, in yml or json'
    )
    parser.add_argument(
        '--step-config',
        metavar='STEP_CONFIG_KEY=STEP_CONFIG_VALUE',
        nargs='+',
        help='Override step config provided by the given config-file with these arguments.',
        action=ParseKeyValueArge
    )
    args = parser.parse_args(argv)

    obfuscated_stdout = TextIOSelectiveObfuscator(sys.stdout)
    obfuscated_stderr = TextIOSelectiveObfuscator(sys.stderr)
    DecryptionUtils.register_obfuscation_stream(obfuscated_stdout)
    DecryptionUtils.register_obfuscation_stream(obfuscated_stderr)

    with redirect_stdout(obfuscated_stdout), redirect_stderr(obfuscated_stderr):
        # validate args
        for config_file in args.config:
            if not os.path.exists(config_file) or os.stat(config_file).st_size == 0:
                print_error('specified -c/--config must exist and not be empty')
                sys.exit(101)

        try:
            config = Config(args.config)
        except (ValueError, AssertionError) as error:
            print_error(f"specified -c/--config is invalid configuration: {error}")
            sys.exit(102)

        config.set_step_config_overrides(args.step, args.step_config)
        # it is VERY important that the working dir be an absolute path because some
        # commands (looking at you maven) will change the context of relative paths on you
        step_runner = StepRunner(
            config=config,
            work_dir_path=os.path.abspath('step-runner-working')
        )

        try:
            if not step_runner.run_step(args.step, args.environment):
                print_error(f"Step {args.step} not successful")
                sys.exit(200)

        except Exception as error:  # pylint: disable=broad-except
            print_error(f"Fatal error calling step ({args.step}): {str(error)}")
            track = traceback.format_exc()
            print(track)
            sys.exit(300)
    def test_get_config_value(self):
        config = Config({
            Config.CONFIG_KEY: {
                'global-defaults': {
                    'global-default-unique-0':
                    'global-default',
                    'global-default-override-by-global-env-default-0':
                    'global-default-override-me',
                    'global-default-override-by-step-config-0':
                    'global-default-override-me',
                    'global-default-override-by-step-env-config-0':
                    'global-default-override-me',
                    'global-default-override-by-step-config-override-0':
                    'global-default-override-me'
                },
                'global-environment-defaults': {
                    'env1': {
                        'global-default-override-by-global-env-default-0':
                        'global-environment-defaults-1',
                        'global-env-default-env1-unique-0':
                        'global-environment-defaults-1',
                        'global-env-default-override-by-step-config':
                        'global-environment-defaults-1'
                    },
                    'env2': {
                        'global-default-override-by-global-env-default-0':
                        'global-environment-defaults-2',
                        'global-env-default-env2-unique-0':
                        'global-environment-defaults-2',
                        'global-env-default-override-by-step-config':
                        'global-environment-defaults-1'
                    }
                },
                'step-foo': [{
                    'implementer': 'foo1',
                    'config': {
                        'step-foo-foo1-unique-0':
                        'step-foo-foo1',
                        'step-foo-foo1-override-by-step-env-config':
                        'step-foo-foo-override-me',
                        'step-foo-foo1-override-by-step-override':
                        'step-foo-foo-override-me',
                        'global-default-override-by-step-config-0':
                        'step-foo-foo1',
                        'global-env-default-override-by-step-config':
                        'step-foo-foo1'
                    },
                    'environment-config': {
                        'env1': {
                            'step-foo-foo1-override-by-step-env-config':
                            'step-foo-foo-env1',
                            'global-default-override-by-step-env-config-0':
                            'step-foo-foo-env1',
                            'step-foo-foo1-env1-unique-0': 'step-foo-foo-env1',
                            'step-foo-foo1-env-specific': 'step-foo-foo-env1'
                        },
                        'env2': {
                            'step-foo-foo1-override-by-step-env-config':
                            'step-foo-foo-env2',
                            'global-default-override-by-step-env-config-0':
                            'step-foo-foo-env2',
                            'step-foo-foo1-env2-unique-0': 'step-foo-foo-env2',
                            'step-foo-foo1-env-specific': 'step-foo-foo-env2'
                        }
                    }
                }]
            }
        })

        config.set_step_config_overrides(
            'step-foo', {
                'global-default-override-by-step-config-override-0':
                'step-foo-step-config-override',
                'step-foo-foo1-override-by-step-override':
                'step-foo-step-config-override',
                'step-config-override-unique-0': 'step-config-override-unique'
            })

        step_config = config.get_step_config('step-foo')
        sub_step = step_config.get_sub_step('foo1')

        self.assertEqual(sub_step.get_config_value('global-default-unique-0'),
                         "global-default")

        self.assertEqual(
            sub_step.get_config_value(
                'global-default-override-by-global-env-default-0'),
            "global-default-override-me")

        self.assertEqual(
            sub_step.get_config_value(
                'global-default-override-by-global-env-default-0', 'env1'),
            "global-environment-defaults-1")
        self.assertEqual(
            sub_step.get_config_value(
                'global-default-override-by-global-env-default-0', 'env2'),
            "global-environment-defaults-2")

        self.assertEqual(
            sub_step.get_config_value(
                'global-default-override-by-step-config-0'), "step-foo-foo1")
        self.assertEqual(
            sub_step.get_config_value(
                'global-default-override-by-step-config-0', 'env1'),
            "step-foo-foo1")

        self.assertEqual(sub_step.get_config_value('step-foo-foo1-unique-0', ),
                         "step-foo-foo1")
        self.assertEqual(
            sub_step.get_config_value('step-foo-foo1-unique-0', 'env1'),
            "step-foo-foo1")

        self.assertEqual(
            sub_step.get_config_value(
                'step-foo-foo1-override-by-step-env-config', ),
            "step-foo-foo-override-me")
        self.assertEqual(
            sub_step.get_config_value(
                'step-foo-foo1-override-by-step-env-config', 'env1'),
            "step-foo-foo-env1")
        self.assertEqual(
            sub_step.get_config_value(
                'step-foo-foo1-override-by-step-env-config', 'env2'),
            "step-foo-foo-env2")

        self.assertIsNone(sub_step.get_config_value('does-not-exist'))
    def test_get_copy_of_runtime_step_config_default_global_defaults_global_env_defaults_sub_step_config_sub_step_env_config_step_config_overrides(
            self):
        config = Config({
            Config.CONFIG_KEY: {
                'global-defaults': {
                    'global-default-unique-0': 'global-default',
                    'global-default-override-by-global-env-default-0':
                    'global-default-override-me',
                    'global-default-override-by-step-config-0':
                    'global-default-override-me',
                    'global-default-override-by-step-env-config-0':
                    'global-default-override-me',
                    'global-default-override-by-step-config-override-0':
                    'global-default-override-me',
                    'default-overriden-by-global-default': 'global-default',
                },
                'global-environment-defaults': {
                    'env1': {
                        'global-default-override-by-global-env-default-0':
                        'global-environment-defaults-1',
                        'global-env-default-env1-unique-0':
                        'global-environment-defaults-1',
                        'global-env-default-override-by-step-config':
                        'global-environment-defaults-1',
                        'default-overriden-by-global-env-default':
                        'global-environment-defaults-1'
                    },
                    'env2': {
                        'global-default-override-by-global-env-default-0':
                        'global-environment-defaults-2',
                        'global-env-default-env2-unique-0':
                        'global-environment-defaults-2',
                        'global-env-default-override-by-step-config':
                        'global-environment-defaults-2',
                        'default-overriden-by-global-env-default':
                        'global-environment-defaults-2'
                    }
                },
                'step-foo': [{
                    'implementer': 'foo1',
                    'config': {
                        'step-foo-foo1-unique-0': 'step-foo-foo1',
                        'step-foo-foo1-override-by-step-env-config':
                        'step-foo-foo-override-me',
                        'step-foo-foo1-override-by-step-override':
                        'step-foo-foo-override-me',
                        'global-default-override-by-step-config-0':
                        'step-foo-foo1',
                        'global-env-default-override-by-step-config':
                        'step-foo-foo1',
                        'default-overriden-by-step-config': 'step-foo-foo1'
                    },
                    'environment-config': {
                        'env1': {
                            'step-foo-foo1-override-by-step-env-config':
                            'step-foo-foo-env1',
                            'global-default-override-by-step-env-config-0':
                            'step-foo-foo-env1',
                            'step-foo-foo1-env1-unique-0':
                            'step-foo-foo-env1',
                            'step-foo-foo1-env-specific':
                            'step-foo-foo-env1',
                            'default-overriden-by-step-env-config':
                            'step-foo-foo-env1',
                        },
                        'env2': {
                            'step-foo-foo1-override-by-step-env-config':
                            'step-foo-foo-env2',
                            'global-default-override-by-step-env-config-0':
                            'step-foo-foo-env2',
                            'step-foo-foo1-env2-unique-0':
                            'step-foo-foo-env2',
                            'step-foo-foo1-env-specific':
                            'step-foo-foo-env2',
                            'default-overriden-by-step-env-config':
                            'step-foo-foo-env2',
                        }
                    }
                }]
            }
        })

        config.set_step_config_overrides(
            'step-foo', {
                'global-default-override-by-step-config-override-0':
                'step-foo-step-config-override',
                'step-foo-foo1-override-by-step-override':
                'step-foo-step-config-override',
                'step-config-override-unique-0':
                'step-config-override-unique',
                'default-overriden-by-step-config-overrides':
                'step-foo-step-config-override'
            })

        step_config = config.get_step_config('step-foo')
        sub_step = step_config.get_sub_step('foo1')

        defaults = {
            'default-unique': 'not-overriden-default',
            'default-overriden-by-global-default': 'override-me',
            'default-overriden-by-global-env-default': 'override-me',
            'default-overriden-by-step-config': 'override-me',
            'default-overriden-by-step-env-config': 'override-me',
            'default-overriden-by-step-config-overrides': 'override-me'
        }

        runtime_step_config_no_given_env = sub_step.get_copy_of_runtime_step_config(
            None, defaults)
        self.assertEqual(
            ConfigValue.convert_leaves_to_values(
                runtime_step_config_no_given_env), {
                    'global-default-unique-0':
                    'global-default',
                    'global-default-override-by-global-env-default-0':
                    'global-default-override-me',
                    'global-default-override-by-step-config-0':
                    'step-foo-foo1',
                    'global-default-override-by-step-env-config-0':
                    'global-default-override-me',
                    'step-foo-foo1-unique-0':
                    'step-foo-foo1',
                    'step-foo-foo1-override-by-step-env-config':
                    'step-foo-foo-override-me',
                    'global-default-override-by-step-config-override-0':
                    'step-foo-step-config-override',
                    'step-foo-foo1-override-by-step-override':
                    'step-foo-step-config-override',
                    'step-config-override-unique-0':
                    'step-config-override-unique',
                    'global-env-default-override-by-step-config':
                    'step-foo-foo1',
                    'default-unique':
                    'not-overriden-default',
                    'default-overriden-by-global-default':
                    'global-default',
                    'default-overriden-by-global-env-default':
                    'override-me',
                    'default-overriden-by-step-config':
                    'step-foo-foo1',
                    'default-overriden-by-step-env-config':
                    'override-me',
                    'default-overriden-by-step-config-overrides':
                    'step-foo-step-config-override'
                })

        runtime_step_config_env1 = sub_step.get_copy_of_runtime_step_config(
            'env1', defaults)
        self.assertEqual(
            ConfigValue.convert_leaves_to_values(runtime_step_config_env1), {
                'environment-name':
                'env1',
                'global-default-unique-0':
                'global-default',
                'global-default-override-by-global-env-default-0':
                'global-environment-defaults-1',
                'global-default-override-by-step-config-0':
                'step-foo-foo1',
                'global-default-override-by-step-env-config-0':
                'step-foo-foo-env1',
                'step-foo-foo1-unique-0':
                'step-foo-foo1',
                'step-foo-foo1-override-by-step-env-config':
                'step-foo-foo-env1',
                'global-default-override-by-step-config-override-0':
                'step-foo-step-config-override',
                'step-foo-foo1-override-by-step-override':
                'step-foo-step-config-override',
                'step-config-override-unique-0':
                'step-config-override-unique',
                'global-env-default-override-by-step-config':
                'step-foo-foo1',
                'global-env-default-env1-unique-0':
                'global-environment-defaults-1',
                'step-foo-foo1-env1-unique-0':
                'step-foo-foo-env1',
                'step-foo-foo1-env-specific':
                'step-foo-foo-env1',
                'default-unique':
                'not-overriden-default',
                'default-overriden-by-global-default':
                'global-default',
                'default-overriden-by-global-env-default':
                'global-environment-defaults-1',
                'default-overriden-by-step-config':
                'step-foo-foo1',
                'default-overriden-by-step-env-config':
                'step-foo-foo-env1',
                'default-overriden-by-step-config-overrides':
                'step-foo-step-config-override'
            })

        runtime_step_config_env2 = sub_step.get_copy_of_runtime_step_config(
            'env2', defaults)
        self.assertEqual(
            ConfigValue.convert_leaves_to_values(runtime_step_config_env2), {
                'environment-name':
                'env2',
                'global-default-unique-0':
                'global-default',
                'global-default-override-by-global-env-default-0':
                'global-environment-defaults-2',
                'global-default-override-by-step-config-0':
                'step-foo-foo1',
                'global-default-override-by-step-env-config-0':
                'step-foo-foo-env2',
                'step-foo-foo1-unique-0':
                'step-foo-foo1',
                'step-foo-foo1-override-by-step-env-config':
                'step-foo-foo-env2',
                'global-default-override-by-step-config-override-0':
                'step-foo-step-config-override',
                'step-foo-foo1-override-by-step-override':
                'step-foo-step-config-override',
                'step-config-override-unique-0':
                'step-config-override-unique',
                'global-env-default-override-by-step-config':
                'step-foo-foo1',
                'global-env-default-env2-unique-0':
                'global-environment-defaults-2',
                'step-foo-foo1-env2-unique-0':
                'step-foo-foo-env2',
                'step-foo-foo1-env-specific':
                'step-foo-foo-env2',
                'default-unique':
                'not-overriden-default',
                'default-overriden-by-global-default':
                'global-default',
                'default-overriden-by-global-env-default':
                'global-environment-defaults-2',
                'default-overriden-by-step-config':
                'step-foo-foo1',
                'default-overriden-by-step-env-config':
                'step-foo-foo-env2',
                'default-overriden-by-step-config-overrides':
                'step-foo-step-config-override'
            })