370 lines
16 KiB
Python
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
|