# # Copyright 2012 Red Hat, Inc. # Copyright 2013 IBM Corp. # # 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. """Test listing meters. """ import base64 import datetime from oslo_serialization import jsonutils import six import webtest.app from ceilometer.publisher import utils from ceilometer import sample from ceilometer.tests.functional.api import v2 class TestListEmptyMeters(v2.FunctionalTest): def test_empty(self): data = self.get_json('/meters') self.assertEqual([], data) class TestValidateUserInput(v2.FunctionalTest): def test_list_meters_query_float_metadata(self): self.assertRaises(webtest.app.AppError, self.get_json, '/meters/meter.test', q=[{'field': 'metadata.util', 'op': 'eq', 'value': '0.7.5', 'type': 'float'}]) self.assertRaises(webtest.app.AppError, self.get_json, '/meters/meter.test', q=[{'field': 'metadata.util', 'op': 'eq', 'value': 'abacaba', 'type': 'boolean'}]) self.assertRaises(webtest.app.AppError, self.get_json, '/meters/meter.test', q=[{'field': 'metadata.util', 'op': 'eq', 'value': '45.765', 'type': 'integer'}]) class TestListMetersRestriction(v2.FunctionalTest): def setUp(self): super(TestListMetersRestriction, self).setUp() self.CONF.set_override('default_api_return_limit', 3, group='api') for x in range(5): for i in range(5): s = sample.Sample( 'volume.size%s' % x, 'gauge', 'GiB', 5 + i, 'user-id', 'project1', 'resource-id', timestamp=(datetime.datetime(2012, 9, 25, 10, 30) + datetime.timedelta(seconds=i)), resource_metadata={'display_name': 'test-volume', 'tag': 'self.sample', }, source='source1', ) msg = utils.meter_message_from_counter( s, self.CONF.publisher.telemetry_secret, ) self.conn.record_metering_data(msg) def test_meter_limit(self): data = self.get_json('/meters?limit=1') self.assertEqual(1, len(data)) def test_meter_limit_negative(self): self.assertRaises(webtest.app.AppError, self.get_json, '/meters?limit=-2') def test_meter_limit_bigger(self): data = self.get_json('/meters?limit=42') self.assertEqual(5, len(data)) def test_meter_default_limit(self): data = self.get_json('/meters') self.assertEqual(3, len(data)) def test_old_sample_limit(self): data = self.get_json('/meters/volume.size0?limit=1') self.assertEqual(1, len(data)) def test_old_sample_limit_negative(self): self.assertRaises(webtest.app.AppError, self.get_json, '/meters/volume.size0?limit=-2') def test_old_sample_limit_bigger(self): data = self.get_json('/meters/volume.size0?limit=42') self.assertEqual(5, len(data)) def test_old_sample_default_limit(self): data = self.get_json('/meters/volume.size0') self.assertEqual(3, len(data)) def test_sample_limit(self): data = self.get_json('/samples?limit=1') self.assertEqual(1, len(data)) def test_sample_limit_negative(self): self.assertRaises(webtest.app.AppError, self.get_json, '/samples?limit=-2') def test_sample_limit_bigger(self): data = self.get_json('/samples?limit=42') self.assertEqual(25, len(data)) def test_sample_default_limit(self): data = self.get_json('/samples') self.assertEqual(3, len(data)) class TestListMeters(v2.FunctionalTest): def setUp(self): super(TestListMeters, self).setUp() self.messages = [] for cnt in [ sample.Sample( 'meter.test', 'cumulative', '', 1, 'user-id', 'project-id', 'resource-id', timestamp=datetime.datetime(2012, 7, 2, 10, 40), resource_metadata={'display_name': 'test-server', 'tag': 'self.sample', 'size': 123, 'util': 0.75, 'is_public': True}, source='test_source'), sample.Sample( 'meter.test', 'cumulative', '', 3, 'user-id', 'project-id', 'resource-id', timestamp=datetime.datetime(2012, 7, 2, 11, 40), resource_metadata={'display_name': 'test-server', 'tag': 'self.sample1', 'size': 0, 'util': 0.47, 'is_public': False}, source='test_source'), sample.Sample( 'meter.mine', 'gauge', '', 1, 'user-id', 'project-id', 'resource-id2', timestamp=datetime.datetime(2012, 7, 2, 10, 41), resource_metadata={'display_name': 'test-server', 'tag': 'self.sample2', 'size': 456, 'util': 0.64, 'is_public': False}, source='test_source'), sample.Sample( 'meter.test', 'cumulative', '', 1, 'user-id2', 'project-id2', 'resource-id3', timestamp=datetime.datetime(2012, 7, 2, 10, 42), resource_metadata={'display_name': 'test-server', 'tag': 'self.sample3', 'size': 0, 'util': 0.75, 'is_public': False}, source='test_source'), sample.Sample( 'meter.test.new', 'cumulative', '', 1, 'user-id', 'project-id', 'resource-id', timestamp=datetime.datetime(2012, 7, 2, 10, 40), resource_metadata={'display_name': 'test-server', 'tag': 'self.sample3', 'size': 0, 'util': 0.75, 'is_public': False}, source='test_source'), sample.Sample( 'meter.mine', 'gauge', '', 1, 'user-id4', 'project-id2', 'resource-id4', timestamp=datetime.datetime(2012, 7, 2, 10, 43), resource_metadata={'display_name': 'test-server', 'tag': 'self.sample4', 'properties': { 'prop_1': 'prop_value', 'prop_2': {'sub_prop_1': 'sub_prop_value'}, 'prop.3': {'$sub_prop.2': 'sub_prop_value2'} }, 'size': 0, 'util': 0.58, 'is_public': True}, source='test_source1'), sample.Sample( u'meter.accent\xe9\u0437', 'gauge', '', 1, 'user-id4', 'project-id2', 'resource-id4', timestamp=datetime.datetime(2014, 7, 2, 10, 43), resource_metadata={}, source='test_source1')]: msg = utils.meter_message_from_counter( cnt, self.CONF.publisher.telemetry_secret) self.messages.append(msg) self.conn.record_metering_data(msg) def test_list_meters(self): data = self.get_json('/meters') self.assertEqual(6, len(data)) self.assertEqual(set(['resource-id', 'resource-id2', 'resource-id3', 'resource-id4']), set(r['resource_id'] for r in data)) self.assertEqual(set(['meter.test', 'meter.mine', 'meter.test.new', u'meter.accent\xe9\u0437']), set(r['name'] for r in data)) self.assertEqual(set(['test_source', 'test_source1']), set(r['source'] for r in data)) def test_meters_query_with_timestamp(self): date_time = datetime.datetime(2012, 7, 2, 10, 41) isotime = date_time.isoformat() resp = self.get_json('/meters', q=[{'field': 'timestamp', 'op': 'gt', 'value': isotime}], expect_errors=True) self.assertEqual(400, resp.status_code) self.assertEqual('Unknown argument: "timestamp": ' 'not valid for this resource', jsonutils.loads(resp.body)['error_message'] ['faultstring']) def test_list_samples(self): data = self.get_json('/samples') self.assertEqual(7, len(data)) def test_query_samples_with_invalid_field_name_and_non_eq_operator(self): resp = self.get_json('/samples', q=[{'field': 'non_valid_field_name', 'op': 'gt', 'value': 3}], expect_errors=True) resp_string = jsonutils.loads(resp.body) fault_string = resp_string['error_message']['faultstring'] msg = ('Unknown argument: "non_valid_field_name"' ': unrecognized field in query: ' '[