def test_sub_step_with_environment_config(self): config = Config({ Config.CONFIG_KEY: { 'step-foo': [{ 'implementer': 'foo1', 'config': { 'test1': 'foo' }, 'environment-config': { 'env1': { 'test2': 'bar' } } }] } }) step_config = config.get_step_config('step-foo') self.assertEqual(len(step_config.sub_steps), 1) self.assertEqual( ConfigValue.convert_leaves_to_values( step_config.get_sub_step('foo1').sub_step_config), {'test1': 'foo'}) self.assertEqual( ConfigValue.convert_leaves_to_values( step_config.get_sub_step('foo1').get_sub_step_env_config( 'env1')), {'test2': 'bar'})
def test_multiple_sub_steps(self): config = Config({ Config.CONFIG_KEY: { 'step-foo': [{ 'implementer': 'foo1', 'config': { 'test1': 'foo' } }, { 'implementer': 'foo2', 'config': { 'test2': 'foo' } }] } }) step_config = config.get_step_config('step-foo') self.assertEqual(len(step_config.sub_steps), 2) self.assertEqual( ConfigValue.convert_leaves_to_values( step_config.get_sub_step('foo1').sub_step_config, ), {'test1': 'foo'}) self.assertEqual( ConfigValue.convert_leaves_to_values( step_config.get_sub_step('foo2').sub_step_config), {'test2': 'foo'})
def test_list_of_config_value(self, container_registry_login_mock): registries = [ ConfigValue({ 'uri': 'registry.redhat.io', 'username': '******', 'password': '******' }), ConfigValue({ 'uri': 'registry.internal.example.xyz', 'username': '******', 'password': '******' }) ] container_registries_login(registries) calls = [ call(container_registry_uri='registry.redhat.io', container_registry_username='******', container_registry_password='******', container_registry_tls_verify=True, containers_config_auth_file=None, container_command_short_name=None), call(container_registry_uri='registry.internal.example.xyz', container_registry_username='******', container_registry_password='******', container_registry_tls_verify=True, containers_config_auth_file=None, container_command_short_name=None) ] container_registry_login_mock.assert_has_calls(calls)
def test_sub_step_with_continue_sub_steps_on_failure_str(self): config = Config({ Config.CONFIG_KEY: { 'step-foo': [{ 'implementer': 'foo1', 'continue-sub-steps-on-failure': 'true', 'config': { 'test1': 'foo' } }, { 'implementer': 'foo2', 'config': { 'test2': 'foo' } }] } }) step_config = config.get_step_config('step-foo') self.assertEqual(len(step_config.sub_steps), 2) self.assertEqual( ConfigValue.convert_leaves_to_values( step_config.get_sub_step('foo1').sub_step_config, ), {'test1': 'foo'}) self.assertEqual( ConfigValue.convert_leaves_to_values( step_config.get_sub_step('foo2').sub_step_config), {'test2': 'foo'}) self.assertTrue( step_config.get_sub_step( 'foo1').sub_step_contine_sub_steps_on_failure) self.assertFalse( step_config.get_sub_step( 'foo2').sub_step_contine_sub_steps_on_failure)
def test_global_defaults(self): config = Config({ Config.CONFIG_KEY: { 'global-defaults': { 'test1': 'global-default-1', 'test2': 'global-default-2' }, 'step-foo': [{ 'implementer': 'foo1', 'config': { 'test1': 'foo' } }] } }) step_config = config.get_step_config('step-foo') sub_step = step_config.get_sub_step('foo1') self.assertEqual( sub_step.global_defaults, { 'test1': ConfigValue( 'global-default-1', None, ["step-runner-config", "global-defaults", "test1"]), 'test2': ConfigValue('global-default-2', None, ["step-runner-config", "global-defaults", "test2"]) })
def test_convert_leaves_to_values_mixed_leaves(self): source_values = { Config.CONFIG_KEY: { 'step-foo': [ { 'implementer': ConfigValue('foo1', None, None), 'config': { 'test1': ConfigValue('foo', None, None), 'test': 'not a config value object' } } ] } } converted = ConfigValue.convert_leaves_to_values(source_values) self.assertEqual( converted, { Config.CONFIG_KEY: { 'step-foo': [ { 'implementer': 'foo1', 'config': { 'test1': 'foo', 'test': 'not a config value object' } } ] } } )
def test_convert_leaves_to_config_values_0(self): source = { Config.CONFIG_KEY: { 'step-foo': [ { 'implementer': 'foo1', 'config': { 'test1': 'foo' } } ] } } ConfigValue.convert_leaves_to_config_values( values=source[Config.CONFIG_KEY], parent_source=source, path_parts=[Config.CONFIG_KEY] ) expected = { Config.CONFIG_KEY: { 'step-foo': [ { 'implementer': ConfigValue('foo1', None, None), 'config': { 'test1': ConfigValue('foo', None, None) } } ] } } self.assertEqual(source, expected)
def test_global_environment_defaults(self): config = Config({ Config.CONFIG_KEY: { 'global-environment-defaults' : { 'env1': { 'test1': 'env1', 'test2': 'test2' }, 'env2': { 'test1': 'env2', 'test3': 'test3' } } } }) self.assertEqual(config.global_defaults, {}) self.assertEqual( ConfigValue.convert_leaves_to_values(config.global_environment_defaults), { 'env1': { 'environment-name' : 'env1', 'test1' : 'env1', 'test2' : 'test2' }, 'env2': { 'environment-name' : 'env2', 'test1' : 'env2', 'test3' : 'test3' } } ) self.assertEqual( ConfigValue.convert_leaves_to_values( config.get_global_environment_defaults_for_environment('env1') ), { 'environment-name' : 'env1', 'test1' : 'env1', 'test2' : 'test2' } ) self.assertEqual( ConfigValue.convert_leaves_to_values( config.get_global_environment_defaults_for_environment('env2') ), { 'environment-name' : 'env2', 'test1' : 'env2', 'test3' : 'test3' } ) self.assertEqual(config.get_global_environment_defaults_for_environment('does-not-exist'), {}) self.assertEqual(config.get_global_environment_defaults_for_environment(None), {})
def test_value_decyrpt(self, sops_mock): encrypted_config_file_path = os.path.join( os.path.dirname(__file__), 'decryptors', 'files', 'step-runner-config-secret-stuff.yml' ) config_value = ConfigValue( value='ENC[AES256_GCM,data:UGKfnzsSrciR7GXZJhOCMmFrz3Y6V3pZsd3P,iv:yuReqA+n+rRXVHMc+2US5t7yPx54sooZSXWV4KLjDIs=,tag:jueP7/ZWLfYrEuhh+4eS8g==,type:str]', parent_source=encrypted_config_file_path, path_parts=['step-runner-config', 'global-environment-defaults', 'DEV', 'kube-api-token'] ) DecryptionUtils.register_config_value_decryptor(SOPS()) sops_mock.side_effect=create_sops_side_effect('mock decrypted value') decrypted_value = config_value.value sops_mock.assert_called_once_with( '--decrypt', '--extract=["step-runner-config"]["global-environment-defaults"]["DEV"]["kube-api-token"]', None, encrypted_config_file_path, _in=None, _out=Any(StringIO), _err=Any(StringIO) ) self.assertEqual( decrypted_value, 'mock decrypted value' )
def test_sub_step_with_name(self): config = Config({ Config.CONFIG_KEY: { 'step-foo': [ { 'name': 'sub-step-name-test', 'implementer': 'foo1', 'config': { 'test1': 'foo' } } ] } }) step_config = config.get_step_config('step-foo') self.assertEqual(len(step_config.sub_steps), 1) self.assertEqual( ConfigValue.convert_leaves_to_values( step_config.get_sub_step('sub-step-name-test').sub_step_config ), { 'test1': 'foo' } )
def test_add_or_update_sub_step_config_exising_sub_step(self): config = Config([ { Config.CONFIG_KEY: { 'step-foo': [{ 'implementer': 'foo1', 'config': { 'test1': 'foo' } }] } }, { Config.CONFIG_KEY: { 'step-foo': [{ 'implementer': 'foo1', 'config': { 'test2': 'foo' } }] } }, ]) step_config = config.get_step_config('step-foo') self.assertEqual(len(step_config.sub_steps), 1) self.assertEqual( ConfigValue.convert_leaves_to_values( step_config.get_sub_step('foo1').sub_step_config), { 'test1': 'foo', 'test2': 'foo' })
def test_value_path_given_no_inital_value_path_parts(self): source = { Config.CONFIG_KEY: { 'step-foo': [{ 'implementer': 'foo1', 'config': { 'test1': 'foo' } }] } } ConfigValue.convert_leaves_to_config_values(values=source, parent_source=source) self.assertEqual( source[Config.CONFIG_KEY]['step-foo'][0]['config'] ['test1'].path_parts, ['step-runner-config', 'step-foo', 0, 'config', 'test1'])
def test__repr__(self): source = { Config.CONFIG_KEY: { 'step-foo': [{ 'implementer': 'foo1', 'config': { 'test1': 'foo' } }] } } ConfigValue.convert_leaves_to_config_values( values=source[Config.CONFIG_KEY], parent_source=source, path_parts=[Config.CONFIG_KEY]) self.assertEqual( str(source[Config.CONFIG_KEY]['step-foo'][0]['config']['test1']), "ConfigValue(value=foo, value_path='['step-runner-config', 'step-foo', 0, 'config', 'test1']')" )
def test_global_defaults(self): config = Config( {Config.CONFIG_KEY: { 'global-defaults': { 'test1': 'foo1' } }}) self.assertEqual( ConfigValue.convert_leaves_to_values(config.global_defaults), {'test1': 'foo1'}) self.assertEqual(config.global_environment_defaults, {})
def test_global_environment_defaults(self): config = Config({ Config.CONFIG_KEY: { 'global-environment-defaults': { 'env1': { 'test1': 'global-env1-default-1', 'test2': 'global-env1-default-2' }, 'env2': { 'test1': 'global-env2-default-1', 'test2': 'global-env2-default-2' } }, 'step-foo': [{ 'implementer': 'foo1', 'config': { 'test1': 'foo' } }] } }) step_config = config.get_step_config('step-foo') sub_step = step_config.get_sub_step('foo1') self.assertEqual( ConfigValue.convert_leaves_to_values( sub_step.get_global_environment_defaults('env1')), { 'environment-name': 'env1', 'test1': 'global-env1-default-1', 'test2': 'global-env1-default-2' }) self.assertEqual( ConfigValue.convert_leaves_to_values( sub_step.get_global_environment_defaults('env2')), { 'environment-name': 'env2', 'test1': 'global-env2-default-1', 'test2': 'global-env2-default-2' })
def test_merge_valid_global_environment_defaults_same_env_diff_keys(self): with TempDirectory() as temp_dir: config_dir = "test" config_files = [ { 'name': os.path.join(config_dir,'foo.yml'), 'contents' : { Config.CONFIG_KEY: { 'global-environment-defaults' : { 'env1' : { 'foo-key': 'foo' } } } } }, { 'name': os.path.join(config_dir,'bar.yml'), 'contents' : { Config.CONFIG_KEY: { 'global-environment-defaults' : { 'env1' : { 'bar-key': 'bar' } } } } }, ] for config_file in config_files: config_file_name = config_file['name'] config_file_contents = config_file['contents'] temp_dir.write( config_file_name, bytes(f"{config_file_contents}", 'utf-8') ) config = Config() config.add_config(os.path.join(temp_dir.path, config_dir)) self.assertEqual( ConfigValue.convert_leaves_to_values( config.get_global_environment_defaults_for_environment('env1') ), { 'environment-name': 'env1', 'foo-key': 'foo', 'bar-key': 'bar' } )
def test_configvalue_params(self, which_mock, container_command_mock): which_mock.side_effect = create_which_side_effect( cmd='buildah', cmd_path='/mock/buildah') container_registry_login( container_registry_uri=ConfigValue('registry.example.xyz'), container_registry_username=ConfigValue('example'), container_registry_password=ConfigValue('nope'), container_registry_tls_verify=ConfigValue(True), containers_config_auth_file=ConfigValue('/tmp/test/auth.json')) container_command_mock.bake.assert_called_once() container_command_mock.bake().login.bake.assert_called_once_with( password_stdin=True, username='******', tls_verify='true', authfile='/tmp/test/auth.json') container_command_mock.bake().login.bake().assert_called_once_with( 'registry.example.xyz', _in='nope', _out=Any(IOBase), _err=Any(IOBase), _tee='err')
def test__eq__is_not_equal_both_config_value_objects(self): test1 = ConfigValue('foo1', None, None) test2 = ConfigValue('foo2', None, None) self.assertNotEqual(test1, test2)
def test__eq__is_equal_basic(self): test1 = ConfigValue('foo1', None, None) test2 = ConfigValue('foo1', None, None) self.assertEqual(test1, test2)
def test__eq__is_equal_diff_source(self): test1 = ConfigValue('foo1', "does not matter for equality", None) test2 = ConfigValue('foo1', "really does not matter for equality", None) self.assertEqual(test1, test2)
def test__eq__is_equal_diff_path_parts(self): test1 = ConfigValue('foo1', None, ['a','b']) test2 = ConfigValue('foo1', None, ['1', '2']) self.assertEqual(test1, test2)
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' })
def test__eq__is_equal_diff_source_and_path_parts(self): test1 = ConfigValue('foo1', "does not matter for equality", ['a','b']) test2 = ConfigValue('foo1', "really does not matter for equality", ['1', '2']) self.assertEqual(test1, test2)
def test__eq__is_not_equal_different_objects(self): test1 = ConfigValue('foo1', None, None) test2 = "foo1" self.assertNotEqual(test1, test2)