| import pytest |
| import json |
| |
| |
| @pytest.mark.xfail(reason='PROD-31892') |
| def test_sysctl_variables(local_salt_client, nodes_in_group): |
| """ |
| # Request kernel setting from linux:system:kernel:sysctl |
| # Request the same setting from sysctl utility on the node |
| # Compare that value in sysctl equals to the same value in pillars |
| |
| """ |
| def normalize_value(value_in_string): |
| """ |
| Changes to INT if value_in_string is parcible to int |
| Replaces \t with spaces if value_in_string is a string |
| |
| :param value_in_string: |
| :return: |
| """ |
| if '\t' in value_in_string: |
| return value_in_string.replace('\t', ' ') |
| |
| try: |
| return int(value_in_string) |
| except ValueError: |
| pass |
| |
| return value_in_string |
| |
| issues = dict() |
| expected_kernel_params_by_nodes = local_salt_client.cmd( |
| tgt="L@"+','.join(nodes_in_group), |
| fun='pillar.get', |
| param="linux:system:kernel:sysctl", |
| expr_form='compound' |
| ) |
| |
| # Gather all params names from pillars and request their availability |
| # To get only specified values from system need to request them in the nex format |
| # 'sysctl param1 param2 param3 param4' |
| |
| for node in expected_kernel_params_by_nodes.keys(): |
| actual_kernel_params_for_node = local_salt_client.cmd( |
| tgt=node, |
| fun='cmd.run', |
| param="sysctl {}".format(" ".join(expected_kernel_params_by_nodes[node].keys())), |
| expr_form='compound' |
| ) |
| # make transfer string to dict format |
| # it does a magic from |
| # "vm.watermark_scale_factor = 10\nvm.zone_reclaim_mode = 0" |
| # to |
| # { |
| # "vm.zone_reclaim_mode": "0", |
| # "vm.watermark_scale_factor": "10" |
| # } |
| |
| values = {param.split(' = ')[0]: normalize_value(param.split(' = ')[-1]) |
| for param in actual_kernel_params_for_node[node].split('\n')} |
| |
| differences = [ "Parameter '{}' is not set === Expected '{}' === Got in sysctl '{}'".format(key, expected_kernel_params_by_nodes[node].get(key), actual) |
| for key, actual in values.items() |
| if expected_kernel_params_by_nodes[node].get(key) != actual ] |
| if differences.__len__() > 0: |
| issues[node] = differences |
| |
| assert issues.__len__() == 0, json.dumps(issues, indent=4) |
| |
| |