Универсальные фильтры

case

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_case_filter.py

check_attr

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_check_attr.py

delete_attrs

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_delete_attrs_filter.py

divide

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_divide_filter.py

format

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_format_filter.py

map

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_map_filter.py

match

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_match_filter.py

multiply

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_multiply_filter.py

reduce

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_reduce_filter.py

set_tag

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_set_tag_filter.py

set_value

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_set_value.py

split

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_split_filter.py

Специальные фильтры

encode_dhcp_options (только after)

Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_encode_dhcp_options.py

render_reply (только after)

reject_on_error (!)

Спецификации фильтров

В конфигурации любого настроенного фильтра, в секции specs, могут быть описаны его спецификации — примеры входных данных и результатов их обработки фильтром. Агент HARD при запуске тестирует все активные, то есть участвующие хотя бы в одном стэке обработки запросов, фильтры, для которых задана спецификация. На вход фильтра подаются данные, указанные в секции input спецификации, а результат обработки сравнивается с заданным в секции expected. Если обнаруживается несоответствие, генерируется ошибка с указанием наименования проблемной спецификации (ключ name) и отличий вывода фильтра от ожидаемого значения. Запуск агента при возникновении ошибки прекращается.

plugins:
  filters:
    set_value_before:
      fix_duplicated_acct-session-id_attribute:
        condition: '   $context.has_tag?("accounting")
                   and $request.RAD_REQUEST.try("Acct-Session-Id", "").to_s() != $request.RAD_REQUEST.try("Acct-Session-Id", "")'
        destination: $request.RAD_REQUEST.Acct-Session-Id
        value_expression: $request.RAD_REQUEST.Acct-Session-Id[0]
        specs:
          - name: fix_duplicated_acct-session-id_attribute
            input:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id:
                    - '5746ECB0-00000027'
                    - '5746ECB0-00000027'
            expected:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027'
          - name: pass_through_correct_acct-session-id_attribute
            input:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027'
            expected:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027' 

Если в таком фильтре, в ключе condition, заменить оператор != на, к примеру, ==, то фильтр не изменит входных данные и возникнет ошибка:

25.11.2016 18:01:17.291 13384/Worker#1   MainThread ERROR    Failed filter spec "fix_duplicate_acct-session-id_attribute" with diff
--- a
+++ b
{
 'RAD_REQUEST': {
 -'Acct-Session-Id': ['5746ECB0-00000027', '5746ECB0-00000027'],
 +'Acct-Session-Id': '5746ECB0-00000027',
 },
}