summaryrefslogtreecommitdiffstats
path: root/baro_tests/tests.py
diff options
context:
space:
mode:
authorCalin Gherghe <calin.gherghe@intel.com>2017-02-16 08:07:20 -0500
committerCalin Gherghe <calin.gherghe@intel.com>2017-02-17 18:33:18 +0000
commitb24f1488aa8969df6fdf3c96d76b75c6714d2957 (patch)
tree9ef6f5a21a1a0a7ba60b946f586c39b8ba15eeff /baro_tests/tests.py
parent47ccd41d789085a2186fc1fb86364d93a20783ef (diff)
Initial Barometer Functest Scripts
This patch adds scripts to be used with Functest for the barometer project. This will be expanded with future patchsets. Change-Id: I627f5e9c2b0d693f34bdc4f205989b0913f338db Signed-off-by: Calin Gherghe <calin.gherghe@intel.com>
Diffstat (limited to 'baro_tests/tests.py')
-rw-r--r--baro_tests/tests.py194
1 files changed, 194 insertions, 0 deletions
diff --git a/baro_tests/tests.py b/baro_tests/tests.py
new file mode 100644
index 00000000..80335ad9
--- /dev/null
+++ b/baro_tests/tests.py
@@ -0,0 +1,194 @@
+"""Function for testing collectd plug-ins with different oup plug-ins"""
+# -*- coding: utf-8 -*-
+
+#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 time
+
+
+def test_ceilometer_node_sends_data(
+ node_id, interval, logger, client, criteria_list=[],
+ resource_id_substrings=['']):
+ """ Test that data reported by Ceilometer are updated in the given interval.
+
+ Keyword arguments:
+ node_id -- node ID
+ interval -- interval to check
+ logger -- logger instance
+ client -- CeilometerClient instance
+ criteria_list -- list of criteria used in ceilometer calls
+ resource_id_substrings -- list of substrings to search for in resource ID
+
+ Return boolean value indicating success or failure.
+ """
+
+ def _search_meterlist_latest_entry(meterlist, node_str, substr=''):
+ """Search for latest entry in meter list
+
+ Keyword arguments:
+ meterlist -- list of metrics
+ node_str -- name of node, which will be found in meter list
+ substr -- substring which will be found in meter list
+
+ Return latest entry from meter list which contains given node string
+ and (if defined) subsrting.
+ """
+ res = [entry for entry in meterlist if node_str in entry['resource_id']
+ and substr in entry['resource_id']]
+ if res:
+ return res[0]
+ else:
+ return []
+
+ client.auth_token()
+ timestamps = {}
+ node_str = 'node-{}'.format(node_id) if node_id else ''
+
+ logger.info('Searching for timestamps of latest entries{0}{1}{2}...'.format(
+ '' if node_str == '' else ' for {}'.format(node_str),
+ '' if len(criteria_list) == 0 else (' for criteria ' + ', '.join(criteria_list)),
+ '' if resource_id_substrings == [''] else ' and resource ID substrings "{}"'.format(
+ '", "'.join(resource_id_substrings))))
+ for criterion in criteria_list if len(criteria_list) > 0 else [None]:
+ meter_list = client.get_ceil_metrics(criterion)
+ for resource_id_substring in resource_id_substrings:
+ last_entry = _search_meterlist_latest_entry(meter_list, node_str, resource_id_substring)
+ if len(last_entry) == 0:
+ logger.error('Entry{0}{1}{2} not found'.format(
+ '' if node_str == '' else ' for {}'.format(node_str),
+ '' if criterion is None else 'for criterion {}'.format(criterion),
+ '' if resource_id_substring == ''
+ else 'and resource ID substring "{}"'.format(resource_id_substring)))
+ return False
+ timestamp = last_entry['timestamp']
+ logger.debug('Last entry found: {0} {1}'.format(timestamp, last_entry['resource_id']))
+ timestamps[(criterion, resource_id_substring)] = timestamp
+
+ attempt = 1
+ is_passed = False
+ while (attempt <= 10) and not is_passed:
+ is_passed = True
+ # wait Interval time + 2 sec for db update
+ sleep_time = interval + 2
+ if attempt > 1:
+ logger.info('Starting attempt {}'.format(attempt))
+ logger.info(
+ 'Sleeping for {} seconds to get updated entries '.format(sleep_time)
+ + '(interval is {} sec)...'.format(interval))
+ time.sleep(sleep_time)
+
+ logger.info('Searching for timestamps of latest entries{}{}{}...'.format(
+ '' if node_str == '' else ' for {}'.format(node_str),
+ '' if len(criteria_list) == 0 else (' for criteria ' + ', '.join(criteria_list)),
+ '' if resource_id_substrings == ['']
+ else ' and resource ID substrings "{}"'.format('", "'.join(resource_id_substrings))))
+ for criterion in criteria_list if len(criteria_list) > 0 else [None]:
+ meter_list = client.get_ceil_metrics(criterion)
+ for resource_id_substring in resource_id_substrings:
+ last_entry = _search_meterlist_latest_entry(
+ meter_list, node_str, resource_id_substring)
+ if len(last_entry) == 0:
+ logger.error('Entry{0}{1}{2} not found'.format(
+ '' if node_str == '' else ' for {}'.format(node_str),
+ '' if criterion is None else 'for criterion {}'.format(criterion),
+ '' if resource_id_substring == ''
+ else ' and resource ID substring "{}"'.format(resource_id_substring)))
+ return False
+ timestamp = last_entry['timestamp']
+ logger.debug('Last entry found: {} {}'.format(timestamp, last_entry['resource_id']))
+ if timestamp == timestamps[(criterion, resource_id_substring)]:
+ logger.warning(
+ 'Last entry{0}{1}{2} has the same timestamp as before the sleep'.format(
+ '' if node_str == '' else ' for {}'.format(node_str),
+ '' if resource_id_substring == ''
+ else ', substring "{}"'.format(resource_id_substring),
+ '' if criterion is None else ' for criterion {}'.format(criterion)))
+ is_passed = False
+ attempt += 1
+ if not is_passed:
+ logger.warning('After sleep new entries were not found.')
+ if not is_passed:
+ logger.error('This was the last attempt.')
+ return False
+ logger.info('All latest entries found.')
+ return True
+
+
+def test_csv_handles_plugin_data(
+ compute, interval, plugin, plugin_subdirs, meter_categories,
+ logger, client):
+ """Check that CSV data are updated by the plugin.
+
+ Keyword arguments:
+ compute -- object compute node
+ interval -- interval to check
+ plugin -- plugin which will be tested
+ plugin_subdirs -- list subdirectories in csv folder
+ meter_categories -- list of meter categories which will be tested
+ logger -- logger instance
+ client -- CSVClient instance
+
+ Return boolean value indicating success or failure.
+ """
+ logger.info('Getting CSV metrics of plugin {} on compute node {}...'.format(
+ plugin, compute.get_id()))
+ logger.debug('Interval: {}'.format(interval))
+ logger.debug('Plugin subdirs: {}'.format(plugin_subdirs))
+ logger.debug('Plugin meter categories: {}'.format(meter_categories))
+ plugin_metrics = client.get_csv_metrics(compute, plugin_subdirs, meter_categories)
+ if len(plugin_metrics) < len(plugin_subdirs) * len(meter_categories):
+ logger.error('Some plugin metrics not found')
+ return False
+
+ logger.info('Checking that last two entries in metrics are corresponding to interval...')
+ for metric in plugin_metrics:
+ logger.debug('{0} {1} {2} ... '.format(metric[0], metric[1], metric[2]))
+ if metric[3] - metric[2] != interval:
+ logger.error('Time of last two entries differ by {}, but interval is {}'.format(
+ metric[3] - metric[2], interval))
+ return False
+ else:
+ logger.debug('OK')
+ logger.info('OK')
+
+ # wait Interval time + 2 sec
+ sleep_time = interval + 2
+ logger.info(
+ 'Sleeping for {} seconds to get updated entries '.format(sleep_time)
+ + '(interval is {} sec)...'.format(interval))
+ time.sleep(sleep_time)
+
+ logger.info('Getting new metrics of compute node {}...'.format(compute.get_id()))
+ plugin_metrics2 = client.get_csv_metrics(compute, plugin_subdirs, meter_categories)
+ if len(plugin_metrics2) < len(plugin_subdirs) * len(meter_categories):
+ logger.error('Some plugin metrics not found')
+ return False
+
+ logger.info('Comparing old and new metrics...')
+ logger.debug(plugin_metrics)
+ logger.debug(plugin_metrics2)
+ if len(plugin_metrics) != len(plugin_metrics2):
+ logger.error('Plugin metrics length before and after sleep differ')
+ return False
+ for i in range(len(plugin_metrics2)):
+ logger.debug('{0} {1} {2} - {3} {4} {5} ... '.format(
+ plugin_metrics[i][0], plugin_metrics[i][1], plugin_metrics[i][2], plugin_metrics2[i][0],
+ plugin_metrics2[i][1], plugin_metrics2[i][2]))
+ if plugin_metrics[i] == plugin_metrics2[i]:
+ logger.error('FAIL')
+ return False
+ else:
+ logger.debug('OK')
+ logger.info('OK')
+
+ return True