From: Dmitry Burmistrov Date: Thu, 15 May 2014 18:07:25 +0000 (+0400) Subject: Update specs to 2013.2.3 version X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=eb6e32f99a917ab60d24d00019cef8d4433a31e6;p=openstack-build%2Fceilometer-build.git Update specs to 2013.2.3 version Change-Id: Ifb44f4a3275648da44a06db12dc1f3a0a069fd59 --- diff --git a/debian/changelog b/debian/changelog index 15c2c0f..f805f27 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,87 @@ -ceilometer (2013.2-0ubuntu1~cloud0) precise-havana; urgency=low +ceilometer (2013.2.3-0ubuntu1~cloud0) precise-havana; urgency=medium * New upstream release for the Ubuntu Cloud Archive. - -- James Page Mon, 14 Oct 2013 15:29:44 +0100 + -- Openstack Ubuntu Testing Bot Mon, 14 Apr 2014 07:15:52 -0400 + +ceilometer (2013.2.3-0ubuntu1) saucy-proposed; urgency=medium + + * debian/patches/fix-setup-requirements.patch: Rebase on top of + new upstream requirements.txt file. + * Resynchronize with stable/havana (0ac6942) (LP: #1302575): + - [c92c106] latest alembic imcompatible with current sqlalchemy requirements + - [4ffeead] User a more accurate max_delay for reconnects + - [6637acd] Checks for presence of Hyper-V cpu metrics before accessing + - [7cb5f4c] Fix ceilometer.conf.sample mismatch + - [ebe72d5] Fixes Hyper-V Inspector disk metrics bug + - [bbab3d5] Fix validation error for invalid field name in simple query + - [83a2725] Adds doc string to query validate functions in V2 API + - [4461828] Ensure insecure config option propagated by alarm service + - [0a1db09] Fix the default rpc policy value + - [b13ee97] Ensure the correct error message is displayed + - [2c6a84f] Refactor timestamp existence validation in V2 API + - [ff0375c] cacert is not picked up correctly by alarm services + - [0a85f22] Add an insecure option for Keystone client + - [0ac6942] Propogate cacert and insecure flags to glanceclient + + -- Corey Bryant Fri, 04 Apr 2014 12:02:50 -0400 + +ceilometer (2013.2.2-0ubuntu1) saucy-proposed; urgency=low + + * Resynchronize with stable/havana (9149861) (LP: #1284643): + - [a3da4dc] instance.scheduled meter is never persisted LP: 1262255 + - [3089be8] first & last sample timestamps not included in the Resource + representation LP: 1262335 + - [ef71dc6] cardinality of storage.models.Resource.meter attribute is one- + per-sample LP: 1267162 + - [16eb199] pep8 gating fails due to tools/config/check_uptodate.sh + LP: 1268614 + - [df7ff3b] ceilometer-agent-compute not working when using instances are + directly using volumes as backend LP: 1233103 + - [6524bf3] mongo aggregation pipeline for resource retrieval fails with + excessive memory use LP: 1262571 + - [28a2307] Can not create alarm successfully according to examples in + community LP: 1245362 + - [51328a3] Add keystone_authtoken.enforce_token_bind boilerplate + - [9149861] Pipeline configuration is missing from doc LP: 1272988 + + -- James Page Wed, 26 Feb 2014 09:06:20 +0000 + +ceilometer (2013.2.1-0ubuntu2) saucy-proposed; urgency=low + + * Resynchronize with stable/havana (fa5c8e2) (LP: #1262788): + - [ec31468] change alarm_history.detail column type to Text LP: 1236861 + - [b616562] wsme 0.5b6 is broken LP: 1240741 + - [d90c8e1] Open stable/havana + - [ef6c659] Ceilometer log contains DB password in plain text LP: 1244476 + - [7ad530b] Pin test-requirement for Nova to Havana + - [d554fa8] import of rabbitMQ-specific config options regardless of + configured RPC backend LP: 1244698 + - [99b21df] Havan rc2 acl scenarios failing due to timezone assumption + LP: 1240994 + - [c5b7462] alarm creation with sqlalchemy fails with intermittent + IntegrityError LP: 1255107 + - [ae82878] [Postgresql] ERROR in ceilometer-collector log after successful + tempest run LP: 1237671 + - [5cbb965] [messaging] QPID broadcast RPC requests to all servers for a + given topic LP: 1257293 + - [40b833c] On restart of QPID broker, fanout no longer works LP: 1251757 + - [fa5c8e2] Updated from global requirements + * debian/patches: Refreshed. + * debian/patches/revert-keystone-compat.patch: Revert additional + keystoneclient 0.4.0 compat changes that were applied to stable/havana + to fix upstream gate issues. + * debian/patches/revert-stable-havana-requirements.patch: Revert + version bumps to dependencies in stable/havana back to what was + shipped with Saucy. + + -- Adam Gandelman Thu, 12 Dec 2013 13:29:59 -0800 + +ceilometer (2013.2-0ubuntu1) saucy; urgency=low + + * New upstream release (LP: #1236462). + + -- Chuck Short Thu, 17 Oct 2013 09:38:31 -0400 ceilometer (2013.2~rc2-0ubuntu1) saucy; urgency=low diff --git a/debian/patches/fix-setup-requirements.patch b/debian/patches/fix-setup-requirements.patch index 60ecf76..4aae0a8 100644 --- a/debian/patches/fix-setup-requirements.patch +++ b/debian/patches/fix-setup-requirements.patch @@ -1,15 +1,15 @@ Description: Bump requirements to support sqlalchemy 0.8.2 Author: Chuck Short Forwarded: No -diff -Naurp ceilometer-2013.2.rc1.orig/requirements.txt ceilometer-2013.2.rc1/requirements.txt ---- ceilometer-2013.2.rc1.orig/requirements.txt 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/requirements.txt 2013-10-02 18:10:47.357807230 -0400 -@@ -3,7 +3,7 @@ WebOb>=1.2.3,<1.3 +Index: ceilometer/requirements.txt +--- a/requirements.txt ++++ b/requirements.txt +@@ -3,7 +3,7 @@ kombu>=2.4.8 iso8601>=0.1.8 argparse -SQLAlchemy>=0.7.8,<=0.7.99 +SQLAlchemy>=0.7.8,<=0.8.99 sqlalchemy-migrate>=0.7.2 - alembic>=0.4.1 + alembic>=0.4.1,<0.6.4 netaddr diff --git a/debian/patches/revert-keystone-compat-2.patch b/debian/patches/revert-keystone-compat-2.patch new file mode 100644 index 0000000..cbceb1c --- /dev/null +++ b/debian/patches/revert-keystone-compat-2.patch @@ -0,0 +1,34 @@ +From: Adam Gandelman +Date: Thu, 12 Dec 2013 13:25:30 -0800 + +This reverts commit becae1827530c0cb43cd57180f853b364ec1dcbd, +which was applied to allow upstream gates to pass with newer +versions of python-keystoneclient. This causes failures on +Ubuntu which uses a stable, older version of python-keystoneclient. + +--- + tests/api/v2/test_acl_scenarios.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: ceilometer/tests/api/v2/test_acl_scenarios.py +=================================================================== +--- ceilometer.orig/tests/api/v2/test_acl_scenarios.py 2013-12-12 13:29:17.367189074 -0800 ++++ ceilometer/tests/api/v2/test_acl_scenarios.py 2013-12-12 13:29:17.359189074 -0800 +@@ -44,7 +44,7 @@ + + def get(self, key): + if key == "tokens/%s" % VALID_TOKEN: +- dt = timeutils.utcnow() + datetime.timedelta(minutes=5) ++ dt = datetime.datetime.now() + datetime.timedelta(minutes=5) + return json.dumps(({'access': { + 'token': {'id': VALID_TOKEN}, + 'user': { +@@ -57,7 +57,7 @@ + ]}, + }}, dt.strftime("%s"))) + if key == "tokens/%s" % VALID_TOKEN2: +- dt = timeutils.utcnow() + datetime.timedelta(minutes=5) ++ dt = datetime.datetime.now() + datetime.timedelta(minutes=5) + return json.dumps(({'access': { + 'token': {'id': VALID_TOKEN2}, + 'user': { diff --git a/debian/patches/revert-keystone-compat.patch b/debian/patches/revert-keystone-compat.patch index 409706c..a0ec130 100644 --- a/debian/patches/revert-keystone-compat.patch +++ b/debian/patches/revert-keystone-compat.patch @@ -3,9 +3,11 @@ Author: James Page Bug: https://bugs.launchpad.net/ceilometer/+bug/1239651 Origin: revert, https://github.com/openstack/ceilometer/commit/c0a3f3cd69eb609216a07111067478f3755cceb4 ---- a/etc/ceilometer/ceilometer.conf.sample -+++ b/etc/ceilometer/ceilometer.conf.sample -@@ -742,10 +742,6 @@ connection=sqlite:////var/lib/ceilometer +Index: ceilometer/etc/ceilometer/ceilometer.conf.sample +=================================================================== +--- ceilometer.orig/etc/ceilometer/ceilometer.conf.sample 2013-12-12 13:11:29.243179330 -0800 ++++ ceilometer/etc/ceilometer/ceilometer.conf.sample 2013-12-12 13:11:29.239179330 -0800 +@@ -742,10 +742,6 @@ # server. (boolean value) #http_connect_timeout= @@ -16,7 +18,7 @@ Origin: revert, https://github.com/openstack/ceilometer/commit/c0a3f3cd69eb60921 # Allows to pass in the name of a fake http_handler callback # function used instead of httplib.HTTPConnection or # httplib.HTTPSConnection. Useful for unit testing where -@@ -778,13 +774,6 @@ connection=sqlite:////var/lib/ceilometer +@@ -778,13 +774,6 @@ # (string value) #keyfile= @@ -30,9 +32,11 @@ Origin: revert, https://github.com/openstack/ceilometer/commit/c0a3f3cd69eb60921 # Directory used to cache files related to PKI tokens (string # value) #signing_dir= ---- a/tests/api/v2/test_acl_scenarios.py -+++ b/tests/api/v2/test_acl_scenarios.py -@@ -27,7 +27,6 @@ from ceilometer import sample +Index: ceilometer/tests/api/v2/test_acl_scenarios.py +=================================================================== +--- ceilometer.orig/tests/api/v2/test_acl_scenarios.py 2013-12-12 13:11:29.243179330 -0800 ++++ ceilometer/tests/api/v2/test_acl_scenarios.py 2013-12-12 13:11:29.239179330 -0800 +@@ -27,7 +27,6 @@ from ceilometer.api import acl from ceilometer.publisher import rpc from ceilometer.tests import db as tests_db @@ -40,7 +44,7 @@ Origin: revert, https://github.com/openstack/ceilometer/commit/c0a3f3cd69eb60921 from .base import FunctionalTest -@@ -38,8 +37,12 @@ VALID_TOKEN2 = '4562138218392832' +@@ -38,8 +37,12 @@ class FakeMemcache(object): @@ -55,7 +59,7 @@ Origin: revert, https://github.com/openstack/ceilometer/commit/c0a3f3cd69eb60921 if key == "tokens/%s" % VALID_TOKEN: dt = timeutils.utcnow() + datetime.timedelta(minutes=5) return json.dumps(({'access': { -@@ -52,7 +55,7 @@ class FakeMemcache(object): +@@ -52,7 +55,7 @@ 'roles': [ {'name': 'admin'}, ]}, @@ -64,7 +68,7 @@ Origin: revert, https://github.com/openstack/ceilometer/commit/c0a3f3cd69eb60921 if key == "tokens/%s" % VALID_TOKEN2: dt = timeutils.utcnow() + datetime.timedelta(minutes=5) return json.dumps(({'access': { -@@ -65,11 +68,11 @@ class FakeMemcache(object): +@@ -65,11 +68,11 @@ 'roles': [ {'name': 'Member'}, ]}, diff --git a/debian/patches/revert-stable-havana-requirements.patch b/debian/patches/revert-stable-havana-requirements.patch new file mode 100644 index 0000000..5e2b790 --- /dev/null +++ b/debian/patches/revert-stable-havana-requirements.patch @@ -0,0 +1,30 @@ +Author: Adam Gandelman +Date: Wed Dec 18 10:06:25 PST 2013 +Subject: Reverts stable/havana version bumps to requirements.txt + +Reverts various version bumps to dependencies in stable/havana that +were updated in global requirements to fix gating issues and synced +across projects. + +Index: ceilometer/requirements.txt +=================================================================== +--- ceilometer.orig/requirements.txt 2013-12-18 10:02:07.943272440 -0800 ++++ ceilometer/requirements.txt 2013-12-18 10:05:01.251270870 -0800 +@@ -1,7 +1,7 @@ + pbr>=0.5.21,<1.0 + WebOb>=1.2.3,<1.3 + kombu>=2.4.8 +-iso8601>=0.1.8 ++iso8601>=0.1.4 + argparse + SQLAlchemy>=0.7.8,<=0.8.99 + sqlalchemy-migrate>=0.7.2 +@@ -21,7 +21,7 @@ + python-swiftclient>=1.5 + lxml>=2.3 + requests>=1.1 +-six>=1.4.1 ++six + WSME>=0.5b5,<0.5b6 + PyYAML>=3.1.0 + oslo.config>=1.2.0 diff --git a/debian/patches/series b/debian/patches/series index df1b414..a5927fa 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,4 +1,6 @@ +fix-setup-requirements.patch default-dbconnection-sqlite.patch skip-database-tests.patch -fix-setup-requirements.patch -#revert-keystone-compat.patch +revert-keystone-compat.patch +revert-keystone-compat-2.patch +revert-stable-havana-requirements.patch diff --git a/debian/patches/skip-database-tests.patch b/debian/patches/skip-database-tests.patch index 4d479a8..b018378 100644 --- a/debian/patches/skip-database-tests.patch +++ b/debian/patches/skip-database-tests.patch @@ -1,6 +1,31 @@ -diff -Naurp ceilometer-2013.2.rc1.orig/ceilometer/tests/db.py ceilometer-2013.2.rc1/ceilometer/tests/db.py ---- ceilometer-2013.2.rc1.orig/ceilometer/tests/db.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/ceilometer/tests/db.py 2013-10-02 18:00:51.237793017 -0400 +From baf40de9892278d59069d380b254c379d4f66504 Mon Sep 17 00:00:00 2001 +From: Dmitry Burmistrov +Date: Thu, 15 May 2014 22:24:43 +0400 +Subject: [PATCH] skip-database-tests + +--- + ceilometer/tests/db.py | 11 +- + tests/agentbase.py | 10 +- + tests/alarm/test_notifier.py | 39 +++- + .../test_compute_duration_by_resource_scenarios.py | 5 +- + tests/api/v2/test_app.py | 16 +- + tests/api/v2/test_app.py.orig | 220 ++++++++++++++++++++ + tests/api/v2/test_statistics_scenarios.py | 10 +- + tests/collector/dispatcher/test_db.py | 5 +- + tests/collector/test_service.py | 24 ++- + tests/compute/pollsters/test_location_metadata.py | 5 +- + tests/compute/test_manager.py | 10 +- + tests/storage/test_get_engine.py | 5 +- + tests/test_bin.py | 38 ++-- + tests/test_notifier.py | 5 +- + tests/test_service.py | 19 +- + 15 files changed, 362 insertions(+), 60 deletions(-) + create mode 100644 tests/api/v2/test_app.py.orig + +diff --git a/ceilometer/tests/db.py b/ceilometer/tests/db.py +index 6a767cf..58f2539 100644 +--- a/ceilometer/tests/db.py ++++ b/ceilometer/tests/db.py @@ -41,8 +41,8 @@ class TestBase(test_base.TestCase): message='.*you must provide a username and password.*') try: @@ -23,7 +48,7 @@ diff -Naurp ceilometer-2013.2.rc1.orig/ceilometer/tests/db.py ceilometer-2013.2. def __str__(self): return '%(url)s_%(db)s' % dict(url=self.url, db=uuid.uuid4().hex) -@@ -83,7 +81,4 @@ class MixinTestsWithBackendScenarios(obj +@@ -83,7 +81,4 @@ class MixinTestsWithBackendScenarios(object): scenarios = [ ('sqlalchemy', dict(database_connection='sqlite://')), @@ -31,10 +56,11 @@ diff -Naurp ceilometer-2013.2.rc1.orig/ceilometer/tests/db.py ceilometer-2013.2. - ('hbase', dict(database_connection='hbase://__test__')), - ('db2', dict(database_connection=DB2FakeConnectionUrl())), ] -diff -Naurp ceilometer-2013.2.rc1.orig/tests/agentbase.py ceilometer-2013.2.rc1/tests/agentbase.py ---- ceilometer-2013.2.rc1.orig/tests/agentbase.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/agentbase.py 2013-10-02 18:00:51.237793017 -0400 -@@ -175,7 +175,10 @@ class BaseAgentManagerTestCase(base.Test +diff --git a/tests/agentbase.py b/tests/agentbase.py +index 383b8e7..23d6f65 100644 +--- a/tests/agentbase.py ++++ b/tests/agentbase.py +@@ -175,7 +175,10 @@ class BaseAgentManagerTestCase(base.TestCase): self.assertEqual(len(polling_tasks), 1) self.assertTrue(60 in polling_tasks.keys()) self.mgr.interval_task(polling_tasks.values()[0]) @@ -46,7 +72,7 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/agentbase.py ceilometer-2013.2.rc1/ self.assertEqual(pub.samples[0], self.Pollster.test_data) def test_setup_polling_tasks_multiple_interval(self): -@@ -244,7 +247,10 @@ class BaseAgentManagerTestCase(base.Test +@@ -244,7 +247,10 @@ class BaseAgentManagerTestCase(base.TestCase): self.assertEqual(len(polling_tasks.keys()), 1) polling_tasks.get(10) self.mgr.interval_task(polling_tasks.get(10)) @@ -58,9 +84,10 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/agentbase.py ceilometer-2013.2.rc1/ self.assertEqual(len(pub.samples), 0) def test_agent_manager_initialize_service_hook(self): -diff -Naurp ceilometer-2013.2.rc1.orig/tests/alarm/test_notifier.py ceilometer-2013.2.rc1/tests/alarm/test_notifier.py ---- ceilometer-2013.2.rc1.orig/tests/alarm/test_notifier.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/alarm/test_notifier.py 2013-10-02 18:00:51.237793017 -0400 +diff --git a/tests/alarm/test_notifier.py b/tests/alarm/test_notifier.py +index 3d71b75..46ea1aa 100644 +--- a/tests/alarm/test_notifier.py ++++ b/tests/alarm/test_notifier.py @@ -58,7 +58,10 @@ class TestAlarmNotifier(base.TestCase): 'reason': 'Everything is on fire', } @@ -149,10 +176,11 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/alarm/test_notifier.py ceilometer-2 with mock.patch('eventlet.spawn_n', self._fake_spawn_n): with mock.patch.object(requests, 'post') as poster: -diff -Naurp ceilometer-2013.2.rc1.orig/tests/api/v1/test_compute_duration_by_resource_scenarios.py ceilometer-2013.2.rc1/tests/api/v1/test_compute_duration_by_resource_scenarios.py ---- ceilometer-2013.2.rc1.orig/tests/api/v1/test_compute_duration_by_resource_scenarios.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/api/v1/test_compute_duration_by_resource_scenarios.py 2013-10-02 18:00:51.237793017 -0400 -@@ -85,7 +85,10 @@ class TestComputeDurationByResource(test +diff --git a/tests/api/v1/test_compute_duration_by_resource_scenarios.py b/tests/api/v1/test_compute_duration_by_resource_scenarios.py +index 775b890..5a2d26a 100644 +--- a/tests/api/v1/test_compute_duration_by_resource_scenarios.py ++++ b/tests/api/v1/test_compute_duration_by_resource_scenarios.py +@@ -85,7 +85,10 @@ class TestComputeDurationByResource(tests_api.TestBase, assert data['duration'] is None def _assert_times_match(self, actual, expected): @@ -164,39 +192,271 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/api/v1/test_compute_duration_by_res assert actual == expected def test_overlap_range_start(self): -diff -Naurp ceilometer-2013.2.rc1.orig/tests/api/v2/test_app.py ceilometer-2013.2.rc1/tests/api/v2/test_app.py ---- ceilometer-2013.2.rc1.orig/tests/api/v2/test_app.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/api/v2/test_app.py 2013-10-02 18:06:51.001801595 -0400 -@@ -46,7 +46,11 @@ class TestApp(base.TestCase): +diff --git a/tests/api/v2/test_app.py b/tests/api/v2/test_app.py +index a7c930c..c9f8329 100644 +--- a/tests/api/v2/test_app.py ++++ b/tests/api/v2/test_app.py +@@ -49,8 +49,12 @@ class TestApp(base.TestCase): cfg.CONF.set_override('connection', "log://", group="database") cfg.CONF.set_override("auth_uri", None, group=acl.OPT_GROUP_NAME) - api_app = app.setup_app() +- self.assertTrue(api_app.auth_uri.startswith('file')) + try: + api_app = app.setup_app() + except: + self.skipTest('Skipped by Ubuntu') + - self.assertTrue(api_app.auth_uri.startswith('foottp')) ++ self.assertTrue(api_app.auth_uri.startswith('foottp')) def test_keystone_middleware_parse_conffile(self): -@@ -61,7 +65,11 @@ class TestApp(base.TestCase): + tmpfile = self.temp_config_file_path() +@@ -64,8 +68,12 @@ class TestApp(base.TestCase): service.prepare_service(['ceilometer-api', '--config-file=%s' % tmpfile]) cfg.CONF.set_override('connection', "log://", group="database") - api_app = app.setup_app() +- self.assertTrue(api_app.auth_uri.startswith('file')) + try: + api_app = app.setup_app() + except: + self.skipTest6('Skipped by Ubuntu') + - self.assertTrue(api_app.auth_uri.startswith('barttp')) ++ self.assertTrue(api_app.auth_uri.startswith('barttp')) os.unlink(tmpfile) -diff -Naurp ceilometer-2013.2.rc1.orig/tests/api/v2/test_statistics_scenarios.py ceilometer-2013.2.rc1/tests/api/v2/test_statistics_scenarios.py ---- ceilometer-2013.2.rc1.orig/tests/api/v2/test_statistics_scenarios.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/api/v2/test_statistics_scenarios.py 2013-10-02 18:00:51.241793017 -0400 -@@ -1234,15 +1234,17 @@ class TestGroupBySource(base.FunctionalT + +diff --git a/tests/api/v2/test_app.py.orig b/tests/api/v2/test_app.py.orig +new file mode 100644 +index 0000000..e2b4a78 +--- /dev/null ++++ b/tests/api/v2/test_app.py.orig +@@ -0,0 +1,220 @@ ++# -*- encoding: utf-8 -*- ++# ++# Copyright 2013 IBM Corp. ++# Copyright © 2013 Julien Danjou ++# ++# Author: Julien Danjou ++# ++# 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 basic ceilometer-api app ++""" ++import json ++import mock ++import os ++ ++from oslo.config import cfg ++import wsme ++ ++from ceilometer.api import app ++from ceilometer.api import acl ++from ceilometer import service ++from ceilometer.openstack.common import gettextutils ++from ceilometer.tests import base ++from ceilometer.tests import db as tests_db ++from .base import FunctionalTest ++ ++ ++class TestApp(base.TestCase): ++ ++ def tearDown(self): ++ super(TestApp, self).tearDown() ++ cfg.CONF.reset() ++ ++ def test_keystone_middleware_conf(self): ++ cfg.CONF.set_override("auth_protocol", "foottp", ++ group=acl.OPT_GROUP_NAME) ++ cfg.CONF.set_override("auth_version", "v2.0", group=acl.OPT_GROUP_NAME) ++ cfg.CONF.set_override("pipeline_cfg_file", ++ self.path_get("etc/ceilometer/pipeline.yaml")) ++ cfg.CONF.set_override('connection', "log://", group="database") ++ cfg.CONF.set_override("auth_uri", None, group=acl.OPT_GROUP_NAME) ++ ++ api_app = app.setup_app() ++ self.assertTrue(api_app.auth_uri.startswith('foottp')) ++ ++ def test_keystone_middleware_parse_conffile(self): ++ tmpfile = self.temp_config_file_path() ++ with open(tmpfile, "w") as f: ++ f.write("[DEFAULT]\n") ++ f.write("pipeline_cfg_file = %s\n" % ++ self.path_get("etc/ceilometer/pipeline.yaml")) ++ f.write("[%s]\n" % acl.OPT_GROUP_NAME) ++ f.write("auth_protocol = barttp\n") ++ f.write("auth_version = v2.0\n") ++ service.prepare_service(['ceilometer-api', ++ '--config-file=%s' % tmpfile]) ++ cfg.CONF.set_override('connection', "log://", group="database") ++ api_app = app.setup_app() ++ self.assertTrue(api_app.auth_uri.startswith('barttp')) ++ os.unlink(tmpfile) ++ ++ ++class TestPecanApp(FunctionalTest): ++ database_connection = tests_db.MongoDBFakeConnectionUrl() ++ ++ def test_pecan_extension_guessing_unset(self): ++ # check Pecan does not assume .jpg is an extension ++ response = self.app.get(self.PATH_PREFIX + '/meters/meter.jpg') ++ self.assertEqual(response.content_type, 'application/json') ++ ++ ++class TestApiMiddleware(FunctionalTest): ++ ++ # This doesn't really matter ++ database_connection = tests_db.MongoDBFakeConnectionUrl() ++ ++ no_lang_translated_error = 'No lang translated error' ++ en_US_translated_error = 'en-US translated error' ++ ++ def _fake_get_localized_message(self, message, user_locale): ++ if user_locale is None: ++ return self.no_lang_translated_error ++ else: ++ return self.en_US_translated_error ++ ++ def test_json_parsable_error_middleware_404(self): ++ response = self.get_json('/invalid_path', ++ expect_errors=True, ++ headers={"Accept": ++ "application/json"} ++ ) ++ self.assertEqual(response.status_int, 404) ++ self.assertEqual(response.content_type, "application/json") ++ self.assertTrue(response.json['error_message']) ++ response = self.get_json('/invalid_path', ++ expect_errors=True, ++ headers={"Accept": ++ "application/json,application/xml"} ++ ) ++ self.assertEqual(response.status_int, 404) ++ self.assertEqual(response.content_type, "application/json") ++ self.assertTrue(response.json['error_message']) ++ response = self.get_json('/invalid_path', ++ expect_errors=True, ++ headers={"Accept": ++ "application/xml;q=0.8, \ ++ application/json"} ++ ) ++ self.assertEqual(response.status_int, 404) ++ self.assertEqual(response.content_type, "application/json") ++ self.assertTrue(response.json['error_message']) ++ response = self.get_json('/invalid_path', ++ expect_errors=True ++ ) ++ self.assertEqual(response.status_int, 404) ++ self.assertEqual(response.content_type, "application/json") ++ self.assertTrue(response.json['error_message']) ++ response = self.get_json('/invalid_path', ++ expect_errors=True, ++ headers={"Accept": ++ "text/html,*/*"} ++ ) ++ self.assertEqual(response.status_int, 404) ++ self.assertEqual(response.content_type, "application/json") ++ self.assertTrue(response.json['error_message']) ++ ++ def test_json_parsable_error_middleware_translation_400(self): ++ # Ensure translated messages get placed properly into json faults ++ self.stubs.Set(gettextutils, 'get_localized_message', ++ self._fake_get_localized_message) ++ response = self.post_json('/alarms', params={}, ++ expect_errors=True, ++ headers={"Accept": ++ "application/json"} ++ ) ++ self.assertEqual(response.status_int, 400) ++ self.assertEqual(response.content_type, "application/json") ++ self.assertTrue(response.json['error_message']) ++ self.assertEqual(response.json['error_message']['faultstring'], ++ self.no_lang_translated_error) ++ ++ def test_xml_parsable_error_middleware_404(self): ++ response = self.get_json('/invalid_path', ++ expect_errors=True, ++ headers={"Accept": ++ "application/xml,*/*"} ++ ) ++ self.assertEqual(response.status_int, 404) ++ self.assertEqual(response.content_type, "application/xml") ++ self.assertEqual(response.xml.tag, 'error_message') ++ response = self.get_json('/invalid_path', ++ expect_errors=True, ++ headers={"Accept": ++ "application/json;q=0.8 \ ++ ,application/xml"} ++ ) ++ self.assertEqual(response.status_int, 404) ++ self.assertEqual(response.content_type, "application/xml") ++ self.assertEqual(response.xml.tag, 'error_message') ++ ++ def test_xml_parsable_error_middleware_translation_400(self): ++ # Ensure translated messages get placed properly into xml faults ++ self.stubs.Set(gettextutils, 'get_localized_message', ++ self._fake_get_localized_message) ++ ++ response = self.post_json('/alarms', params={}, ++ expect_errors=True, ++ headers={"Accept": ++ "application/xml,*/*"} ++ ) ++ self.assertEqual(response.status_int, 400) ++ self.assertEqual(response.content_type, "application/xml") ++ self.assertEqual(response.xml.tag, 'error_message') ++ fault = response.xml.findall('./error/faultstring') ++ for fault_string in fault: ++ self.assertEqual(fault_string.text, self.no_lang_translated_error) ++ ++ def test_best_match_language(self): ++ # Ensure that we are actually invoking language negotiation ++ self.stubs.Set(gettextutils, 'get_localized_message', ++ self._fake_get_localized_message) ++ ++ response = self.post_json('/alarms', params={}, ++ expect_errors=True, ++ headers={"Accept": ++ "application/xml,*/*", ++ "Accept-Language": ++ "en-US"} ++ ) ++ self.assertEqual(response.status_int, 400) ++ self.assertEqual(response.content_type, "application/xml") ++ self.assertEqual(response.xml.tag, 'error_message') ++ fault = response.xml.findall('./error/faultstring') ++ for fault_string in fault: ++ self.assertEqual(fault_string.text, self.en_US_translated_error) ++ ++ def test_translated_then_untranslated_error(self): ++ resp = self.get_json('/alarms/alarm-id-3', expect_errors=True) ++ self.assertEqual(resp.status_code, 404) ++ self.assertEqual(json.loads(resp.body)['error_message'] ++ ['faultstring'], "Alarm alarm-id-3 Not Found") ++ ++ cls = 'ceilometer.api.controllers.v2.EntityNotFound' ++ with mock.patch(cls) as CustomErrorClass: ++ CustomErrorClass.return_value = wsme.exc.ClientSideError( ++ "untranslated_error") ++ resp = self.get_json('/alarms/alarm-id-5', expect_errors=True) ++ ++ self.assertEqual(resp.status_code, 400) ++ self.assertEqual(json.loads(resp.body)['error_message'] ++ ['faultstring'], "untranslated_error") +diff --git a/tests/api/v2/test_statistics_scenarios.py b/tests/api/v2/test_statistics_scenarios.py +index 38da05f..aeb93bc 100644 +--- a/tests/api/v2/test_statistics_scenarios.py ++++ b/tests/api/v2/test_statistics_scenarios.py +@@ -1234,15 +1234,17 @@ class TestGroupBySource(base.FunctionalTest, # tests. scenarios = [ @@ -218,10 +478,11 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/api/v2/test_statistics_scenarios.py super(TestGroupBySource, self).setUp() test_sample_data = ( -diff -Naurp ceilometer-2013.2.rc1.orig/tests/collector/dispatcher/test_db.py ceilometer-2013.2.rc1/tests/collector/dispatcher/test_db.py ---- ceilometer-2013.2.rc1.orig/tests/collector/dispatcher/test_db.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/collector/dispatcher/test_db.py 2013-10-02 18:00:51.241793017 -0400 -@@ -30,7 +30,10 @@ class TestDispatcherDB(tests_base.TestCa +diff --git a/tests/collector/dispatcher/test_db.py b/tests/collector/dispatcher/test_db.py +index a538a5d..7ca68ed 100644 +--- a/tests/collector/dispatcher/test_db.py ++++ b/tests/collector/dispatcher/test_db.py +@@ -30,7 +30,10 @@ class TestDispatcherDB(tests_base.TestCase): def setUp(self): super(TestDispatcherDB, self).setUp() @@ -233,10 +494,11 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/collector/dispatcher/test_db.py cei self.ctx = None def test_valid_message(self): -diff -Naurp ceilometer-2013.2.rc1.orig/tests/collector/test_service.py ceilometer-2013.2.rc1/tests/collector/test_service.py ---- ceilometer-2013.2.rc1.orig/tests/collector/test_service.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/collector/test_service.py 2013-10-02 18:00:51.241793017 -0400 -@@ -114,7 +114,10 @@ class TestUDPCollectorService(TestCollec +diff --git a/tests/collector/test_service.py b/tests/collector/test_service.py +index b94d13b..e292e8e 100644 +--- a/tests/collector/test_service.py ++++ b/tests/collector/test_service.py +@@ -114,7 +114,10 @@ class TestUDPCollectorService(TestCollector): def setUp(self): super(TestUDPCollectorService, self).setUp() @@ -248,7 +510,7 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/collector/test_service.py ceilomete self.counter = sample.Sample( name='foobar', type='bad', -@@ -189,7 +192,10 @@ class TestCollectorService(TestCollector +@@ -189,7 +192,10 @@ class TestCollectorService(TestCollector): def setUp(self): super(TestCollectorService, self).setUp() @@ -260,7 +522,7 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/collector/test_service.py ceilomete self.ctx = None @patch('ceilometer.pipeline.setup_pipeline', MagicMock()) -@@ -197,8 +203,11 @@ class TestCollectorService(TestCollector +@@ -197,8 +203,11 @@ class TestCollectorService(TestCollector): # If we try to create a real RPC connection, init_host() never # returns. Mock it out so we can establish the service # configuration. @@ -274,7 +536,7 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/collector/test_service.py ceilomete @patch('ceilometer.pipeline.setup_pipeline', MagicMock()) def test_process_notification(self): -@@ -206,8 +215,11 @@ class TestCollectorService(TestCollector +@@ -206,8 +215,11 @@ class TestCollectorService(TestCollector): # returns. Mock it out so we can establish the service # configuration. cfg.CONF.set_override("store_events", False, group="collector") @@ -288,10 +550,11 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/collector/test_service.py ceilomete self.srv.pipeline_manager.pipelines[0] = MagicMock() self.srv.notification_manager = test_manager.TestExtensionManager( [extension.Extension('test', -diff -Naurp ceilometer-2013.2.rc1.orig/tests/compute/pollsters/test_location_metadata.py ceilometer-2013.2.rc1/tests/compute/pollsters/test_location_metadata.py ---- ceilometer-2013.2.rc1.orig/tests/compute/pollsters/test_location_metadata.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/compute/pollsters/test_location_metadata.py 2013-10-02 18:00:51.241793017 -0400 -@@ -47,7 +47,10 @@ class TestLocationMetadata(test_base.Tes +diff --git a/tests/compute/pollsters/test_location_metadata.py b/tests/compute/pollsters/test_location_metadata.py +index a14ddfc..60619b5 100644 +--- a/tests/compute/pollsters/test_location_metadata.py ++++ b/tests/compute/pollsters/test_location_metadata.py +@@ -47,7 +47,10 @@ class TestLocationMetadata(test_base.TestCase): @mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock()) def setUp(self): @@ -303,9 +566,10 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/compute/pollsters/test_location_met super(TestLocationMetadata, self).setUp() # Mimics an instance returned from nova api call -diff -Naurp ceilometer-2013.2.rc1.orig/tests/compute/test_manager.py ceilometer-2013.2.rc1/tests/compute/test_manager.py ---- ceilometer-2013.2.rc1.orig/tests/compute/test_manager.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/compute/test_manager.py 2013-10-02 18:00:51.241793017 -0400 +diff --git a/tests/compute/test_manager.py b/tests/compute/test_manager.py +index b3f3b3d..8e28a50 100644 +--- a/tests/compute/test_manager.py ++++ b/tests/compute/test_manager.py @@ -29,7 +29,10 @@ class TestManager(base.TestCase): @mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock()) @@ -318,7 +582,7 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/compute/test_manager.py ceilometer- self.assertIsNotNone(list(mgr.pollster_manager)) -@@ -45,7 +48,10 @@ class TestRunTasks(agentbase.BaseAgentMa +@@ -45,7 +48,10 @@ class TestRunTasks(agentbase.BaseAgentManagerTestCase): raise Exception def setup_manager(self): @@ -330,9 +594,10 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/compute/test_manager.py ceilometer- @mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock()) def setUp(self): -diff -Naurp ceilometer-2013.2.rc1.orig/tests/storage/test_get_engine.py ceilometer-2013.2.rc1/tests/storage/test_get_engine.py ---- ceilometer-2013.2.rc1.orig/tests/storage/test_get_engine.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/storage/test_get_engine.py 2013-10-02 18:00:51.241793017 -0400 +diff --git a/tests/storage/test_get_engine.py b/tests/storage/test_get_engine.py +index 498b6f4..4824461 100644 +--- a/tests/storage/test_get_engine.py ++++ b/tests/storage/test_get_engine.py @@ -31,7 +31,10 @@ class EngineTest(testtools.TestCase): conf = mox.Mox().CreateMockAnything() conf.database = mox.Mox().CreateMockAnything() @@ -345,9 +610,10 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/storage/test_get_engine.py ceilomet self.assertIsInstance(engine, impl_log.LogStorage) def test_get_engine_no_such_engine(self): -diff -Naurp ceilometer-2013.2.rc1.orig/tests/test_bin.py ceilometer-2013.2.rc1/tests/test_bin.py ---- ceilometer-2013.2.rc1.orig/tests/test_bin.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/test_bin.py 2013-10-02 18:00:51.241793017 -0400 +diff --git a/tests/test_bin.py b/tests/test_bin.py +index a358b57..bc2cd2a 100644 +--- a/tests/test_bin.py ++++ b/tests/test_bin.py @@ -36,14 +36,20 @@ class BinTestCase(base.TestCase): tmp.write("connection=log://localhost\n") @@ -375,7 +641,7 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/test_bin.py ceilometer-2013.2.rc1/t class BinSendCounterTestCase(base.TestCase): -@@ -59,11 +65,14 @@ class BinSendCounterTestCase(base.TestCa +@@ -59,11 +65,14 @@ class BinSendCounterTestCase(base.TestCase): "pipeline_cfg_file=%s\n" % pipeline_cfg_file) def test_send_counter_run(self): @@ -409,9 +675,10 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/test_bin.py ceilometer-2013.2.rc1/t def tearDown(self): super(BinApiTestCase, self).tearDown() -diff -Naurp ceilometer-2013.2.rc1.orig/tests/test_notifier.py ceilometer-2013.2.rc1/tests/test_notifier.py ---- ceilometer-2013.2.rc1.orig/tests/test_notifier.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/test_notifier.py 2013-10-02 18:00:51.241793017 -0400 +diff --git a/tests/test_notifier.py b/tests/test_notifier.py +index 814dca1..9a659fb 100644 +--- a/tests/test_notifier.py ++++ b/tests/test_notifier.py @@ -80,7 +80,10 @@ class TestNotifier(tests_base.TestCase): }], transformer_manager) @@ -424,9 +691,10 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/test_notifier.py ceilometer-2013.2. self.assertEqual(len(pub.samples), 0) notifier.notify(None, MESSAGE) self.assertTrue(len(pub.samples) > 0) -diff -Naurp ceilometer-2013.2.rc1.orig/tests/test_service.py ceilometer-2013.2.rc1/tests/test_service.py ---- ceilometer-2013.2.rc1.orig/tests/test_service.py 2013-10-02 15:17:37.000000000 -0400 -+++ ceilometer-2013.2.rc1/tests/test_service.py 2013-10-02 18:00:51.241793017 -0400 +diff --git a/tests/test_service.py b/tests/test_service.py +index 5245c3d..f757dd1 100644 +--- a/tests/test_service.py ++++ b/tests/test_service.py @@ -98,8 +98,8 @@ class ServiceRestartTest(base.TestCase): def tearDown(self): @@ -466,3 +734,6 @@ diff -Naurp ceilometer-2013.2.rc1.orig/tests/test_service.py ceilometer-2013.2.r + self._service_restart('ceilometer-agent-central') + except: + self.skipTest('Skipped by Ubuntu') +-- +1.7.9.5 + diff --git a/rpm/SOURCES/0001-Ensure-we-don-t-access-the-net-when-building-docs.patch b/rpm/SOURCES/0001-Ensure-we-don-t-access-the-net-when-building-docs.patch index 0a698ea..20e7dbd 100644 --- a/rpm/SOURCES/0001-Ensure-we-don-t-access-the-net-when-building-docs.patch +++ b/rpm/SOURCES/0001-Ensure-we-don-t-access-the-net-when-building-docs.patch @@ -1,4 +1,4 @@ -From 4e1c90bcccaa5bfd78a8bd3fd1bef1c578fe586a Mon Sep 17 00:00:00 2001 +From ba3bb18de4719a769b809921dcb87e0e9f441808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Fri, 6 Jan 2012 12:16:34 +0000 Subject: [PATCH] Ensure we don't access the net when building docs @@ -7,8 +7,8 @@ Subject: [PATCH] Ensure we don't access the net when building docs Change-Id: I9d02fb4053a8106672aded1614a2850e21603eb2 --- - doc/source/conf.py | 2 -- - 1 files changed, 0 insertions(+), 2 deletions(-) + doc/source/conf.py | 2 -- + 1 file changed, 2 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 98646df..c561497 100644 diff --git a/rpm/SPECS/openstack-ceilometer.spec b/rpm/SPECS/openstack-ceilometer.spec index 7998873..5fab7ec 100644 --- a/rpm/SPECS/openstack-ceilometer.spec +++ b/rpm/SPECS/openstack-ceilometer.spec @@ -3,7 +3,7 @@ %global pypi_name ceilometer Name: openstack-ceilometer -Version: 2013.2 +Version: 2013.2.3 Release: 1%{?dist} Summary: OpenStack measurement collection service @@ -28,7 +28,7 @@ Source15: %{name}-alarm-evaluator.init Source150: %{name}-alarm-evaluator.upstart # -# patches_base=2013.2 +# patches_base=2013.2.3 # Patch0001: 0001-Ensure-we-don-t-access-the-net-when-building-docs.patch @@ -47,7 +47,7 @@ BuildRequires: openstack-utils # These are required to build due to the requirements check added BuildRequires: python-sqlalchemy0.7 -BuildRequires: python-webob >= 1.2 +BuildRequires: python-webob1.2 %description @@ -63,6 +63,7 @@ Requires: python-qpid Requires: python-kombu Requires: python-amqplib +Requires: python-babel Requires: python-eventlet Requires: python-greenlet Requires: python-iso8601 @@ -496,6 +497,18 @@ fi %changelog +* Thu Apr 10 2014 Pádraig Brady - 2013.2.3-1 +- Update to Havana stable release 2013.2.3 + +* Fri Feb 14 2014 Matthias Runge - 2014.2.2-1 +- Update to havana stable release 2013.2.2 + +* Tue Feb 04 2014 Pádraig Brady - 2013.2.1-2 +- Fix missing dependency on python-babel + +* Tue Dec 17 2013 Pádraig Brady - 2013.2.1-1 +- Update to Havana stable release 2013.2.1 + * Thu Oct 17 2013 Pádraig Brady - 2013.2-1 - Update to Havana release