Files
monasca-agent/tests/test_remove_config.py
Martin Chacon Piza d3cc8c1e7d Use unittest.mock instead of mock
The mock third party library was needed for mock support in py2
runtimes. Since we now only support py36 and later, we can use the
standard lib unittest.mock module instead.

Change-Id: Ia3f2c8abc87cf5551d3469d616790e8e9d567bce
2020-08-10 13:41:08 +02:00

370 lines
16 KiB
Python

# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import collections
from unittest import mock
from unittest import TestCase
import monasca_setup
import monasca_setup.agent_config
DEFAULT_HTTP_CHECK_CONFIG = {
'init_config': None,
'instances': [{'built_by': 'HttpCheck',
'match_pattern': '.*VERSION.*',
'url': 'http://127.0.0.1:9200',
'name': 'logging',
'timeout': '10',
'collect_response_time': True,
'use_keystone': False,
'dimensions': {'service': 'logging'}}]
}
DEFAULT_HTTP_CHECK_2_CONFIG = {
'init_config': None,
'instances': [{'built_by': 'HttpCheck',
'match_pattern': '.*VERSION.*',
'url': 'http://127.0.0.1:9200',
'name': 'logging',
'timeout': '10',
'collect_response_time': True,
'use_keystone': False,
'dimensions': {'service': 'logging'}},
{'built_by': 'HttpCheck',
'match_pattern': '.*VERSION.*',
'url': 'http://127.0.0.2:9200',
'name': 'logging',
'timeout': '10',
'collect_response_time': True,
'use_keystone': False,
'dimensions': {'service': 'logging'}}
]
}
DEFAULT_PROCESS_CHECK_CONFIG = {
'init_config': None,
'instances': [{'built_by': 'MonNotification',
'detailed': True,
'dimensions': {'component': 'monasca-notification'},
'exact_match': False,
'name': 'monasca-notification',
'search_string': ['monasca-notification']
}]
}
DEFAULT_PROCESS_CHECK_CONFIG_2 = {
'init_config': None,
'instances': [{'built_by': 'MonNotification',
'detailed': True,
'dimensions': {'component': 'monasca-notification'},
'exact_match': False,
'name': 'monasca-notification',
'search_string': ['monasca-notification']
},
{'built_by': 'MonAPI',
'detailed': True,
'dimensions': {'component': 'monasca-api'},
'exact_match': False,
'name': 'monasca-api',
'search_string': ['monasca-api']
}
]
}
DEFAULT_PING_CHECK_CONFIG_2COMP = {
'init_config': None,
'instances': [{'built_by': 'HostAlive',
'alive_test': 'ping',
'dimensions': {'service': 'compute'},
'host_name': 'test-test-1-host',
'name': 'test-test-1-host ping',
'target_hostname': 'test-test-1-mgmt'
},
{'built_by': 'HostAlive',
'alive_test': 'ping',
'dimensions': {'service': 'compute'},
'host_name': 'test-test-2-host',
'name': 'test-test-2-host ping',
'target_hostname': 'test-test-2-mgmt'
},
{'built_by': 'HostAlive',
'alive_test': 'ping',
'host_name': 'test-control-1-host',
'name': 'test-control-1-host ping',
'target_hostname': 'test-control-1-mgmt'
}
]
}
DEFAULT_PING_CHECK_CONFIG_ALLCOMP = {
'init_config': None,
'instances': [{'built_by': 'HostAlive',
'alive_test': 'ping',
'dimensions': {'service': 'compute'},
'host_name': 'test-test-1-host',
'name': 'test-test-1-host ping',
'target_hostname': 'test-test-1-mgmt'
},
{'built_by': 'HostAlive',
'alive_test': 'ping',
'dimensions': {'service': 'compute'},
'host_name': 'test-test-2-host',
'name': 'test-test-2-host ping',
'target_hostname': 'test-test-2-mgmt'
},
{'built_by': 'HostAlive',
'alive_test': 'ping',
'dimensions': {'service': 'compute'},
'host_name': 'test-test-3-host',
'name': 'test-test-3-host ping',
'target_hostname': 'test-test-3-mgmt'
},
{'built_by': 'HostAlive',
'alive_test': 'ping',
'host_name': 'test-control-1-host',
'name': 'test-control-1-host ping',
'target_hostname': 'test-control-1-mgmt'
}
]
}
DEFAULT_PING_CHECK_CONFIG_CONTONLY = {
'init_config': None,
'instances': [{'built_by': 'HostAlive',
'alive_test': 'ping',
'host_name': 'test-control-1-host',
'name': 'test-control-1-host ping',
'target_hostname': 'test-control-1-mgmt'
}
]
}
INPUT_ARGS = collections.namedtuple(
"InputArgs", ["overwrite", "user", "config_dir", "detection_args",
"detection_plugins", "dry_run", "detection_args_json",
"template_dir"])
INPUT_ARGS_WITH_DIMENSIONS = collections.namedtuple(
"InputArgs", ["overwrite", "user", "config_dir", "detection_args",
"detection_plugins", "dry_run", "detection_args_json",
"template_dir", "dimensions"])
class TestRemoveConfig(TestCase):
""" Unit tests for removing_config function in monasca_setup/main.py
More details are documented in:
monasca-agent/docs/DeveloperDocs/agent_internals.md
"""
def setUp(self):
self._config_data = {}
def save_config(self, config_dir, plugin_name, user, data):
self._config_data = data
# to replace save_plugin_config(args.config_dir, plugin_name, args.user, config)
# in delete_config(args, config, file_path, plugin_name)
def delete_config(self, args, config, file_path, plugin_name):
self._config_data = config
@mock.patch('monasca_setup.main.plugin_detection')
@mock.patch('monasca_setup.main.agent_config.delete_from_config')
@mock.patch('monasca_setup.main.agent_config.read_plugin_config_from_disk')
def test_no_remove_process_check_config(self, mock_read_config,
mock_delete_config,
mock_plugin_detection):
mock_read_config.return_value = DEFAULT_PROCESS_CHECK_CONFIG
mock_delete_config.side_effect = self.save_config
# Add a new process check instance
same_built_by = DEFAULT_PROCESS_CHECK_CONFIG['instances'][0][
'built_by']
same_name = DEFAULT_PROCESS_CHECK_CONFIG['instances'][0][
'name']
args, detected_config = self._get_mon_api_check_args_and_config(
same_built_by, same_name)
mock_plugin_detection.return_value = detected_config
self._check_no_change_remove(args, ["HttpCheck"])
@mock.patch('monasca_setup.main._get_config_yaml_files')
@mock.patch('monasca_setup.main.plugin_detection')
@mock.patch('monasca_setup.main.agent_config.delete_from_config')
@mock.patch('monasca_setup.main.agent_config.read_plugin_config_from_disk')
def test_remove_process_check_config(self, mock_read_config,
mock_delete_config,
mock_plugin_detection,
mock_glob):
mock_read_config.return_value = DEFAULT_PROCESS_CHECK_CONFIG_2
mock_delete_config.side_effect = self.delete_config
mock_glob.return_value = ['conf.d--test/process_check-TESTONLY.yaml']
# Trying to remove mon-api part
built_by = 'MonAPI'
name = 'monasca-api'
args, detected_config = self._get_mon_api_check_args_and_config(
built_by, name)
mock_plugin_detection.return_value = detected_config
print("det_conf {0}".format(detected_config))
self._check_changes_remove(args, [built_by], DEFAULT_PROCESS_CHECK_CONFIG)
@mock.patch('monasca_setup.main.agent_config.save_plugin_config')
@mock.patch('monasca_setup.main.agent_config.read_plugin_config_from_disk')
def test_no_modify_http_check_config(self, mock_read_config,
mock_save_config):
mock_read_config.return_value = DEFAULT_HTTP_CHECK_CONFIG
mock_save_config.side_effect = self.save_config
# keep url and match_pattern the same
same_url = DEFAULT_HTTP_CHECK_CONFIG['instances'][0]['url']
same_match_pattern = DEFAULT_HTTP_CHECK_CONFIG['instances'][0][
'match_pattern']
same_name = DEFAULT_HTTP_CHECK_CONFIG['instances'][0]['name']
args, detected_config = self. _get_http_check_args_and_config(
same_url, same_match_pattern, same_name)
self._check_no_change_remove(args, detected_config)
@mock.patch('monasca_setup.main._get_config_yaml_files')
@mock.patch('monasca_setup.main.plugin_detection')
@mock.patch('monasca_setup.main.agent_config.save_plugin_config')
@mock.patch('monasca_setup.main.agent_config.read_plugin_config_from_disk')
def test_remove_http_check_config(self, mock_read_config,
mock_save_config,
mock_plugin_detection,
mock_glob):
mock_read_config.return_value = DEFAULT_HTTP_CHECK_2_CONFIG
mock_save_config.side_effect = self.save_config
mock_glob.return_value = ['conf.d--test/http_check.yaml']
# don't change protocol or match_pattern
url = 'http://127.0.0.2:9200'
match_pattern = '.*VERSION.*'
args, detected_config = self. _get_http_check_args_and_config(
url, match_pattern, 'logging')
mock_plugin_detection.return_value = detected_config
expected_value = DEFAULT_HTTP_CHECK_CONFIG
self._check_changes_remove(args, ['http_check'], expected_value)
# TODO: test_remove_matching for http or process,
# TODO: test if no match and test if multiple entries match
# TODO: start from DEFAULT_PING_CHECK_CONFIG_ALLCOMP and remove the computes by dimension server:compute
# TODO: do a ping check using JSON format detection arguments, (after that is implemented)
# start from DEFAULT_PING_CHECK_CONFIG_ALLCOMP and remove just test3 compute
@mock.patch('monasca_setup.main._get_config_yaml_files')
@mock.patch('monasca_setup.main.plugin_detection')
@mock.patch('monasca_setup.main.agent_config.delete_from_config')
@mock.patch('monasca_setup.main.agent_config.read_plugin_config_from_disk')
def test_remove_matching_ping_check_config(self, mock_read_config,
mock_delete_config,
mock_plugin_detection,
mock_glob):
mock_read_config.return_value = DEFAULT_PING_CHECK_CONFIG_ALLCOMP
mock_delete_config.side_effect = self.delete_config
mock_glob.return_value = ['conf.d--test/ping_check.yaml']
same_built_by = DEFAULT_PING_CHECK_CONFIG_ALLCOMP['instances'][0][
'built_by']
# note: NOT testing the json args path
test_args = INPUT_ARGS(False, 'mon-agent', '/etc/monasca/agent',
'hostname=deletehost-localcloud-mgmt '
'type=ping '
'dimensions=service:compute',
[same_built_by], False,
{},
'/etc/monasca/agent/conf.d--test')
mock_plugin_detection.return_value = {'ping': {
'instances': [{'built_by': same_built_by,
'alive_test': 'ping',
'dimensions': {'service': 'compute'},
'host_name': 'test-test-3-host',
'name': 'test-test-3-host ping',
'target_hostname': 'test-test-3-mgmt'}],
'init_config': None}
}
changes = monasca_setup.main.remove_config_for_matching_args(test_args, [same_built_by])
self.assertEqual(changes, True, "Should have removed config item but did not!")
self.assertEqual(DEFAULT_PING_CHECK_CONFIG_2COMP, self._config_data,
"Expected value {0} did not match result of {1}"
.format(DEFAULT_PING_CHECK_CONFIG_2COMP, self._config_data))
####
# helper functions
def _check_no_change_remove(self, args, plugins):
changes = monasca_setup.main.remove_config(args, plugins)
self.assertEqual(changes, False)
self.assertEqual(self._config_data, {})
def _check_changes_remove(self, args, plugins, expected_value):
changes = monasca_setup.main.remove_config(args, plugins)
self.assertEqual(changes, True)
self.assertEqual(expected_value, self._config_data,
"Expected value {0} did not match resulting config data {1}"
.format(expected_value, self._config_data))
def _check_changes_remove_matching(self, args, plugins, expected_value):
changes = monasca_setup.main.remove_config_for_matching_args(args, plugins)
self.assertEqual(changes, True)
self.assertEqual(expected_value, self._config_data,
"Expected value {0} did not match resulting config data {1}"
.format(expected_value, self._config_data))
# Reminder of args: ["overwrite", "user", "config_dir", "detection_args",
# "detection_plugins", "dry_run",
# "detection_args_json", "template_dir"]
def _get_mon_api_check_args_and_config(self, built_by, name):
args = INPUT_ARGS(False, 'mon-agent', '/etc/monasca/agent', None,
['MonAPI'], False,
'{}', '/etc/monasca/agent/conf.d--test')
detected_config = {
'process':
{'instances': [{'built_by': built_by,
'detailed': True,
'dimensions': {
'component': name},
'exact_match': False,
'name': name,
'search_string': [name]
}],
'init_config': None
}
}
return args, detected_config
def _get_http_check_args_and_config(self, url, match_pattern, name):
args = INPUT_ARGS(False, 'mon-agent', '/etc/monasca/agent',
'url={0} match_pattern={1} name={2} timeout=10 '
'use_keystone=False'.format(
url, match_pattern, name),
['HttpCheck'], False,
'{}', '/etc/monasca/agent/conf.d--test')
detected_config = {
'http_check':
{'instances': [{'built_by': 'HttpCheck',
'match_pattern': match_pattern,
'url': url,
'name': name,
'timeout': '10',
'collect_response_time': True,
'use_keystone': False,
'dimensions': {'service': 'logging'}
}],
'init_config': None
}
}
return args, detected_config