Rating service for OpenStack
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

190 lines
6.5 KiB

# -*- coding: utf-8 -*-
# Copyright 2014 Objectif Libre
#
# 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 copy
from voluptuous import error as verror
from cloudkitty import collector
from cloudkitty import tests
class MetricConfigValidationTest(tests.TestCase):
base_data = {
'metrics': {
'metric_one': {
'groupby': ['one'],
'metadata': ['two'],
'unit': 'u',
}
}
}
base_output = {
'metric_one': {
'groupby': ['one'],
'metadata': ['two'],
'unit': 'u',
'factor': 1,
'offset': 0,
'mutate': 'NONE',
}
}
def test_base_minimal_config(self):
data = copy.deepcopy(self.base_data)
expected_output = copy.deepcopy(self.base_output)
expected_output['metric_one']['groupby'].append('project_id')
self.assertEqual(
collector.BaseCollector.check_configuration(data),
expected_output,
)
def test_gnocchi_minimal_config_no_extra_args(self):
data = copy.deepcopy(self.base_data)
self.assertRaises(
verror.MultipleInvalid,
collector.gnocchi.GnocchiCollector.check_configuration,
data,
)
def test_gnocchi_minimal_config_minimal_extra_args(self):
data = copy.deepcopy(self.base_data)
data['metrics']['metric_one']['extra_args'] = {'resource_type': 'res'}
expected_output = copy.deepcopy(self.base_output)
expected_output['metric_one']['groupby'] += ['project_id', 'id']
expected_output['metric_one']['extra_args'] = {
'aggregation_method': 'max',
're_aggregation_method': 'max',
'force_granularity': 3600,
'resource_type': 'res',
'resource_key': 'id',
'use_all_resource_revisions': True,
'custom_query': ''}
self.assertEqual(
collector.gnocchi.GnocchiCollector.check_configuration(data),
expected_output,
)
def test_gnocchi_minimal_config_negative_forced_aggregation(self):
data = copy.deepcopy(self.base_data)
data['metrics']['metric_one']['extra_args'] = {
'resource_type': 'res',
'force_aggregation': -42,
}
self.assertRaises(
verror.MultipleInvalid,
collector.gnocchi.GnocchiCollector.check_configuration,
data,
)
def test_monasca_minimal_config_no_extra_args(self):
data = copy.deepcopy(self.base_data)
expected_output = copy.deepcopy(self.base_output)
expected_output['metric_one']['groupby'].extend(
['project_id', 'resource_id'])
expected_output['metric_one']['extra_args'] = {
'resource_key': 'resource_id',
'aggregation_method': 'max',
'forced_project_id': ''
}
self.assertEqual(
collector.monasca.MonascaCollector.check_configuration(data),
expected_output,
)
def test_monasca_minimal_config_minimal_extra_args(self):
data = copy.deepcopy(self.base_data)
data['metrics']['metric_one']['extra_args'] = {}
expected_output = copy.deepcopy(self.base_output)
expected_output['metric_one']['groupby'].extend(
['project_id', 'resource_id'])
expected_output['metric_one']['extra_args'] = {
'aggregation_method': 'max',
'resource_key': 'resource_id',
'forced_project_id': '',
}
self.assertEqual(
collector.monasca.MonascaCollector.check_configuration(data),
expected_output,
)
def test_prometheus_minimal_config_empty_extra_args(self):
data = copy.deepcopy(self.base_data)
data['metrics']['metric_one']['extra_args'] = {}
expected_output = copy.deepcopy(self.base_output)
expected_output['metric_one']['groupby'].append('project_id')
expected_output['metric_one']['extra_args'] = {
'aggregation_method': 'max',
'query_prefix': '',
'query_suffix': '',
}
self.assertEqual(
collector.prometheus.PrometheusCollector.check_configuration(data),
expected_output,
)
def test_prometheus_minimal_config_no_extra_args(self):
data = copy.deepcopy(self.base_data)
expected_output = copy.deepcopy(self.base_output)
expected_output['metric_one']['groupby'].append('project_id')
expected_output['metric_one']['extra_args'] = {
'aggregation_method': 'max',
'query_prefix': '',
'query_suffix': '',
}
self.assertEqual(
collector.prometheus.PrometheusCollector.check_configuration(data),
expected_output,
)
def test_prometheus_minimal_config_minimal_extra_args(self):
data = copy.deepcopy(self.base_data)
data['metrics']['metric_one']['extra_args'] = {
'aggregation_method': 'max',
'query_function': 'abs',
'query_prefix': 'custom_prefix',
'query_suffix': 'custom_suffix',
'range_function': 'delta',
}
expected_output = copy.deepcopy(self.base_output)
expected_output['metric_one']['groupby'].append('project_id')
expected_output['metric_one']['extra_args'] = {
'aggregation_method': 'max',
'query_function': 'abs',
'query_prefix': 'custom_prefix',
'query_suffix': 'custom_suffix',
'range_function': 'delta',
}
self.assertEqual(
collector.prometheus.PrometheusCollector.check_configuration(data),
expected_output,
)
def test_check_duplicates(self):
data = copy.deepcopy(self.base_data)
for metric_name, metric in data['metrics'].items():
metric['metadata'].append('one')
self.assertRaises(
collector.InvalidConfiguration,
collector.check_duplicates, metric_name, metric)