def configure_output(options): """Configure a new output for this service Args: options (argparser): Basically a namedtuple with the service setting """ account_config = CONFIG['global']['account'] region = account_config['region'] prefix = account_config['prefix'] kms_key_alias = account_config['kms_key_alias'] # Verify that the word alias is not in the config. # It is interpolated when the API call is made. if 'alias/' in kms_key_alias: kms_key_alias = kms_key_alias.split('/')[1] # Retrieve the proper service class to handle dispatching the alerts of this services output = get_output_dispatcher(options.service, region, prefix, config_outputs.load_outputs_config()) # If an output for this service has not been defined, the error is logged # prior to this if not output: return # get dictionary of OutputProperty items to be used for user prompting props = output.get_user_defined_properties() for name, prop in props.iteritems(): # pylint: disable=protected-access props[name] = prop._replace(value=user_input( prop.description, prop.mask_input, prop.input_restrictions)) service = output.__service__ config = config_outputs.load_config(props, service) # An empty config here means this configuration already exists, # so we can ask for user input again for a unique configuration if config is False: return configure_output(options) secrets_bucket = '{}.streamalert.secrets'.format(prefix) secrets_key = output.output_cred_name(props['descriptor'].value) # Encrypt the creds and push them to S3 # then update the local output configuration with properties if config_outputs.encrypt_and_push_creds_to_s3(region, secrets_bucket, secrets_key, props, kms_key_alias): updated_config = output.format_output_config(config, props) config_outputs.update_outputs_config(config, updated_config, service) LOGGER_CLI.info( 'Successfully saved \'%s\' output configuration for service \'%s\'', props['descriptor'].value, options.service) else: LOGGER_CLI.error( 'An error occurred while saving \'%s\' ' 'output configuration for service \'%s\'', props['descriptor'].value, options.service)
def test_update_outputs_config(json_mock): """CLI - Outputs - Update outputs config""" with patch('__builtin__.open', new_callable=mock_open()) as mocker: service = 'mock_service' original_config = {service: ['value01', 'value02']} new_config_values = ['value01', 'value02', 'value03'] update_outputs_config(original_config, new_config_values, service) expected_value = {'mock_service': ['value01', 'value02', 'value03']} json_mock.assert_called_with(expected_value, mocker.return_value.__enter__.return_value, indent=2, separators=(',', ': '), sort_keys=True)
def test_update_outputs_config(): """Update outputs config""" mock = mock_open() with patch('__builtin__.open', mock): service = 'mock_service' config = {service: ['value01', 'value02']} updated_config = ['value01', 'value02', 'value03'] update_outputs_config(config, updated_config, service) mock.return_value.write.assert_called_with("""{ "mock_service": [ "value01", "value02", "value03" ] }""")