Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: include alias path when generating template #877

Merged
merged 12 commits into from
Oct 16, 2020
1 change: 1 addition & 0 deletions CHANGELOG.next.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ Thanks, you're awesome :-) -->
#### Added

* Added ability to supply free-form usage documentation per fieldset. #988
* Added the `path` key when type is `alias`, to support the [alias field type](https://www.elastic.co/guide/en/elasticsearch/reference/current/alias.html). #877

#### Improvements

Expand Down
12 changes: 12 additions & 0 deletions schemas/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,18 @@ Supported keys to describe expected values for a field
Optionally, entries in this list can specify 'expected\_event\_types'.
- expected\_event\_types: list of expected "event.type" values to use in association
with that category.

Supported keys when using the [alias field type](https://www.elastic.co/guide/en/elasticsearch/reference/current/alias.html)

```YAML
- name: a_field
level: extended
type: alias
path: another_field
description: >
An alias of another field.
```
- path (optional): The full path to the [aliases' target field](https://www.elastic.co/guide/en/elasticsearch/reference/current/alias.html#alias-targets).

#### Multi\_fields

Expand Down
2 changes: 1 addition & 1 deletion scripts/generators/beats.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def fieldset_field_array(source_fields, df_whitelist, fieldset_prefix):
allowed_keys = ['name', 'level', 'required', 'type', 'object_type',
'ignore_above', 'multi_fields', 'format', 'input_format',
'output_format', 'output_precision', 'description',
'example', 'enabled', 'index']
'example', 'enabled', 'index', 'path']
multi_fields_allowed_keys = ['name', 'type', 'norms', 'default_field', 'normalizer', 'ignore_above']

fields = []
Expand Down
2 changes: 2 additions & 0 deletions scripts/generators/es_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ def entry_for(field):
ecs_helpers.dict_copy_existing_keys(field, field_entry, ['ignore_above'])
elif field['type'] == 'text':
ecs_helpers.dict_copy_existing_keys(field, field_entry, ['norms'])
elif field['type'] == 'alias':
rgmz marked this conversation as resolved.
Show resolved Hide resolved
ecs_helpers.dict_copy_existing_keys(field, field_entry, ['path'])

if 'multi_fields' in field:
field_entry['fields'] = {}
Expand Down
6 changes: 6 additions & 0 deletions scripts/schema/cleaner.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,12 @@ def field_mandatory_attributes(field):
return
current_field_attributes = sorted(field['field_details'].keys())
missing_attributes = ecs_helpers.list_subtract(FIELD_MANDATORY_ATTRIBUTES, current_field_attributes)

# The `alias` type requires a target path.
# https://github.com/elastic/ecs/issues/876
if field['field_details'].get('type') == 'alias' and 'path' not in current_field_attributes:
missing_attributes.append('path')

if len(missing_attributes) > 0:
msg = "Field is missing the following mandatory attributes: {}.\nFound these: {}.\nField details: {}"
raise ValueError(msg.format(', '.join(missing_attributes),
Expand Down
13 changes: 13 additions & 0 deletions scripts/tests/test_es_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,19 @@ def test_entry_for_index(self):
}
self.assertEqual(es_template.entry_for(test_map), exp)

def test_entry_for_alias(self):
test_map = {
'name': 'test.alias',
'type': 'alias',
'path': 'alias.target'
}

exp = {
'type': 'alias',
'path': 'alias.target'
}
self.assertEqual(es_template.entry_for(test_map), exp)


if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions scripts/tests/unit/test_schema_cleaner.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,13 @@ def test_field_raises_on_missing_required_attributes(self):
"mandatory attributes: {}".format(missing_attribute)):
cleaner.field_mandatory_attributes(field)

def test_field_raises_on_alias_missing_path_attribute(self):
field = self.schema_process()['process']['fields']['pid']
field['field_details']['type'] = "alias"
with self.assertRaisesRegex(ValueError,
"mandatory attributes: {}".format("path")):
cleaner.field_mandatory_attributes(field)

def test_field_simple_cleanup(self):
my_field = {
'field_details': {
Expand Down