From a3e62fd80133aa7f41869ce64497d4ad58cafcbb Mon Sep 17 00:00:00 2001 From: Dmitry Burmistrov Date: Wed, 25 Sep 2013 22:39:28 +0400 Subject: [PATCH] Update RPM-specs to 2013.2 version Change-Id: I72b3b7d9d5e4b0db3db18defbf1a810031a02557 --- ...-t-access-the-net-when-building-docs.patch | 8 +- ...llel-install-versions-of-epel-packag.patch | 54 +- ...ntime-dep-on-python-pbr-python-d2to1.patch | 40 + ...d-assert_unicode-sqlalchemy-attribut.patch | 126 -- ...sphinx-and-remove-local-copy-of-doc-.patch | 1238 +++++++++++++++++ ...ode-path-causing-qpid-exchange-leaks.patch | 26 - rpm/SOURCES/openstack-cinder-backup.init | 104 ++ rpm/SOURCES/openstack-cinder-backup.upstart | 8 + rpm/SOURCES/openstack-cinder-newdeps.patch | 78 -- rpm/SPECS/openstack-cinder.spec | 65 +- 10 files changed, 1464 insertions(+), 283 deletions(-) create mode 100644 rpm/SOURCES/0003-Remove-runtime-dep-on-python-pbr-python-d2to1.patch delete mode 100644 rpm/SOURCES/0003-remove-deprecated-assert_unicode-sqlalchemy-attribut.patch create mode 100644 rpm/SOURCES/0004-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch delete mode 100644 rpm/SOURCES/0004-avoid-code-path-causing-qpid-exchange-leaks.patch create mode 100644 rpm/SOURCES/openstack-cinder-backup.init create mode 100644 rpm/SOURCES/openstack-cinder-backup.upstart delete mode 100644 rpm/SOURCES/openstack-cinder-newdeps.patch 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 ee681acce..865d8afeb 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,15 +1,15 @@ -From 6c5b2b229fcd9a30369335127980a39d644ca3c3 Mon Sep 17 00:00:00 2001 +From 9904118c6d3d130624eaec31878649e41efd1bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Fri, 21 Sep 2012 13:33:26 +0100 Subject: [PATCH] Ensure we don't access the net when building docs (Note, this has not been sent upstream) --- - doc/source/conf.py | 1 - - 1 files changed, 0 insertions(+), 1 deletions(-) + doc/source/conf.py | 1 - + 1 file changed, 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py -index 40e564b..01bd3b4 100644 +index e27d458..7a2bf1a 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -29,7 +29,6 @@ sys.path.insert(0, os.path.abspath('./')) diff --git a/rpm/SOURCES/0002-Use-updated-parallel-install-versions-of-epel-packag.patch b/rpm/SOURCES/0002-Use-updated-parallel-install-versions-of-epel-packag.patch index d77a9444b..6f2d7415e 100644 --- a/rpm/SOURCES/0002-Use-updated-parallel-install-versions-of-epel-packag.patch +++ b/rpm/SOURCES/0002-Use-updated-parallel-install-versions-of-epel-packag.patch @@ -1,58 +1,52 @@ -From 2cd2b4092d529eebc2485567c92622fe3b055faa Mon Sep 17 00:00:00 2001 +From c8b9384ccf0e9c69f35978f3abbb5e5d5638d859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Wed, 24 Oct 2012 13:44:37 +0100 Subject: [PATCH] Use updated parallel install versions of epel package -Use sqlalchemy >= 0.6.3 WebOb >= 1.0 Routes >= 1.12.3 PasteDeploy >= 1.5.0 +Use sqlalchemy >= 0.6.3 WebOb >= 1.2 Routes >= 1.12.3 PasteDeploy >= 1.5.0 and depend on the parallel installable versions of these packages to satisfy those requirements. Delve into pkg_resources a little to get it to modify sys.path, so that our parallel installed egg takes precedence over the system default module versions. -(cherry picked from commit 7b25747ffc21d0771e864f57ab2088725c8851f0) - -Conflicts: - bin/cinder-manage --- - bin/cinder-manage | 7 ++++--- - cinder/__init__.py | 30 ++++++++++++++++++++++++++++++ - cinder/db/sqlalchemy/migration.py | 7 ++++++- - 3 files changed, 40 insertions(+), 4 deletions(-) + bin/cinder-manage | 4 +++- + cinder/__init__.py | 30 ++++++++++++++++++++++++++++++ + cinder/db/sqlalchemy/migration.py | 7 ++++++- + 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/bin/cinder-manage b/bin/cinder-manage -index de7955d..364944a 100755 +index 3c05d77..9474e2e 100755 --- a/bin/cinder-manage +++ b/bin/cinder-manage -@@ -59,9 +59,6 @@ import os - import sys - import uuid - --from sqlalchemy import create_engine, MetaData, Table --from sqlalchemy.ext.declarative import declarative_base --from sqlalchemy.orm import sessionmaker +@@ -62,7 +62,6 @@ import sys + from oslo.config import cfg +- # If ../cinder/__init__.py exists, add ../ to Python search path, so that -@@ -87,6 +84,10 @@ from cinder.openstack.common import uuidutils + # it will override what happens to be installed in /usr/(local/)lib/python... + POSSIBLE_TOPDIR = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), +@@ -84,6 +83,9 @@ from cinder.openstack.common import uuidutils from cinder import utils from cinder import version +from sqlalchemy import create_engine, MetaData, Table -+from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base -+ - FLAGS = flags.FLAGS ++from sqlalchemy.orm import sessionmaker + CONF = cfg.CONF diff --git a/cinder/__init__.py b/cinder/__init__.py -index f8db8e8..1b4ac39 100644 +index d765b08..720320e 100644 --- a/cinder/__init__.py +++ b/cinder/__init__.py -@@ -31,6 +31,36 @@ +@@ -30,3 +30,33 @@ + .. moduleauthor:: Manish Singh .. moduleauthor:: Andy Smith """ - ++ +import sys +import pkg_resources + @@ -72,7 +66,7 @@ index f8db8e8..1b4ac39 100644 + # and the associated pkg_resources.working_set.entries + return pkg_resources.require(requirement) + -+replace_dist("WebOb >= 1.0") ++replace_dist("WebOb >= 1.2") +replace_dist("SQLAlchemy >= 0.6.3") +replace_dist("Routes >= 1.12.3") + @@ -82,15 +76,11 @@ index f8db8e8..1b4ac39 100644 +# TODO: See can we get pkg_resources to do the right thing directly +import paste +paste.__path__.insert(0, paste.__path__.pop(-1)) -+ - import gettext - - diff --git a/cinder/db/sqlalchemy/migration.py b/cinder/db/sqlalchemy/migration.py -index 5365d9c..e2fcd83 100644 +index e2463bc..9ba7b73 100644 --- a/cinder/db/sqlalchemy/migration.py +++ b/cinder/db/sqlalchemy/migration.py -@@ -57,7 +57,12 @@ if (not hasattr(migrate, '__version__') or +@@ -56,7 +56,12 @@ if (not hasattr(migrate, '__version__') or # NOTE(jkoelker) Delay importing migrate until we are patched diff --git a/rpm/SOURCES/0003-Remove-runtime-dep-on-python-pbr-python-d2to1.patch b/rpm/SOURCES/0003-Remove-runtime-dep-on-python-pbr-python-d2to1.patch new file mode 100644 index 000000000..5fd94c95b --- /dev/null +++ b/rpm/SOURCES/0003-Remove-runtime-dep-on-python-pbr-python-d2to1.patch @@ -0,0 +1,40 @@ +From 6ed6db76f6e6b1a579d07c3db63283d444385c14 Mon Sep 17 00:00:00 2001 +From: Eric Harney +Date: Thu, 13 Jun 2013 17:50:12 -0400 +Subject: [PATCH] Remove runtime dep on python-pbr, python-d2to1 + +Requires RPM spec to fill in REDHATCINDERVERSION. +--- + cinder/version.py | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/cinder/version.py b/cinder/version.py +index ad1ebc0..b4f6fd8 100644 +--- a/cinder/version.py ++++ b/cinder/version.py +@@ -14,12 +14,22 @@ + # License for the specific language governing permissions and limitations + # under the License. + +-from pbr import version as pbr_version +- + CINDER_VENDOR = "OpenStack Foundation" + CINDER_PRODUCT = "OpenStack Cinder" + CINDER_PACKAGE = None # OS distro package version suffix + + loaded = False +-version_info = pbr_version.VersionInfo('cinder') ++ ++ ++class VersionInfo: ++ version = "REDHATCINDERVERSION" ++ release = "REDHATCINDERRELEASE" ++ ++ def release_string(self): ++ return '%s-%s' % (self.version, self.release) ++ ++ def version_string(self): ++ return self.version ++ ++version_info = VersionInfo() + version_string = version_info.version_string diff --git a/rpm/SOURCES/0003-remove-deprecated-assert_unicode-sqlalchemy-attribut.patch b/rpm/SOURCES/0003-remove-deprecated-assert_unicode-sqlalchemy-attribut.patch deleted file mode 100644 index 1d90078d5..000000000 --- a/rpm/SOURCES/0003-remove-deprecated-assert_unicode-sqlalchemy-attribut.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 7c0e9b09c2dd48f0f408f438bedd9c9676690592 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?P=C3=A1draig=20Brady?= -Date: Tue, 2 Apr 2013 14:44:51 +0100 -Subject: [PATCH] remove deprecated assert_unicode sqlalchemy attribute - -Removing this enables use with sqlalchemy 0.8.0 -The deprecation is described upstream at: -http://docs.sqlalchemy.org/en/latest/changelog/changelog_08.html#change-ad44af79c886d1bb283042deb64f9cbe - -Change-Id: I305bfdbcd3c3669c41318ea34115624f729b3909 ---- - .../migrate_repo/versions/002_quota_class.py | 11 ++++------- - .../migrate_repo/versions/008_add_backup.py | 11 ----------- - 2 files changed, 4 insertions(+), 18 deletions(-) - -diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py b/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py -index 9f5b643..fe911c0 100644 ---- a/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py -+++ b/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py -@@ -37,14 +37,12 @@ def upgrade(migrate_engine): - Column('class_name', - String(length=255, - convert_unicode=True, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False), - index=True), - Column('resource', - String(length=255, - convert_unicode=True, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('hard_limit', Integer(), nullable=True), -@@ -67,12 +65,12 @@ def upgrade(migrate_engine): - Column('id', Integer(), primary_key=True), - Column('project_id', - String(length=255, convert_unicode=True, -- assert_unicode=None, unicode_error=None, -+ unicode_error=None, - _warn_on_bytestring=False), - index=True), - Column('resource', - String(length=255, convert_unicode=True, -- assert_unicode=None, unicode_error=None, -+ unicode_error=None, - _warn_on_bytestring=False)), - Column('in_use', Integer(), nullable=False), - Column('reserved', Integer(), nullable=False), -@@ -97,7 +95,6 @@ def upgrade(migrate_engine): - Column('uuid', - String(length=36, - convert_unicode=True, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False), - nullable=False), -@@ -107,12 +104,12 @@ def upgrade(migrate_engine): - nullable=False), - Column('project_id', - String(length=255, convert_unicode=True, -- assert_unicode=None, unicode_error=None, -+ unicode_error=None, - _warn_on_bytestring=False), - index=True), - Column('resource', - String(length=255, convert_unicode=True, -- assert_unicode=None, unicode_error=None, -+ unicode_error=None, - _warn_on_bytestring=False)), - Column('delta', Integer(), nullable=False), - Column('expire', DateTime(timezone=False)), -diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py b/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py -index 4cc1689..5dfbed0 100644 ---- a/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py -+++ b/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py -@@ -37,49 +37,38 @@ def upgrade(migrate_engine): - Column('id', String(36), primary_key=True, nullable=False), - Column('volume_id', String(36), nullable=False), - Column('user_id', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('project_id', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('host', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('availability_zone', String(length=255, - convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('display_name', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('display_description', String(length=255, - convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('container', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('status', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('fail_reason', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('service_metadata', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('service', String(length=255, convert_unicode=False, -- assert_unicode=None, - unicode_error=None, - _warn_on_bytestring=False)), - Column('size', Integer()), diff --git a/rpm/SOURCES/0004-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch b/rpm/SOURCES/0004-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch new file mode 100644 index 000000000..362462ac7 --- /dev/null +++ b/rpm/SOURCES/0004-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch @@ -0,0 +1,1238 @@ +From bd1bfd86fbeacd893ff5d9abb969c7b0c994fbf4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?P=C3=A1draig=20Brady?= +Date: Mon, 22 Jul 2013 03:14:27 +0100 +Subject: [PATCH] Revert "Use oslo.sphinx and remove local copy of doc theme" + +This reverts commit 8b1ae18ba95f04fedc04592b419401d75d448543. + +Conflicts: + + test-requirements.txt +--- + doc/source/_static/.gitignore | 0 + doc/source/_static/.placeholder | 0 + doc/source/_static/basic.css | 416 +++++++++++++++++++++++++++++++++++++ + doc/source/_static/default.css | 230 ++++++++++++++++++++ + doc/source/_static/jquery.tweet.js | 154 ++++++++++++++ + doc/source/_static/tweaks.css | 218 +++++++++++++++++++ + doc/source/_templates/.gitignore | 0 + doc/source/_templates/.placeholder | 0 + doc/source/_theme/layout.html | 95 +++++++++ + doc/source/_theme/theme.conf | 5 + + doc/source/conf.py | 8 +- + test-requirements.txt | 1 - + 12 files changed, 1121 insertions(+), 6 deletions(-) + create mode 100644 doc/source/_static/.gitignore + create mode 100644 doc/source/_static/.placeholder + create mode 100644 doc/source/_static/basic.css + create mode 100644 doc/source/_static/default.css + create mode 100644 doc/source/_static/jquery.tweet.js + create mode 100644 doc/source/_static/tweaks.css + create mode 100644 doc/source/_templates/.gitignore + create mode 100644 doc/source/_templates/.placeholder + create mode 100644 doc/source/_theme/layout.html + create mode 100644 doc/source/_theme/theme.conf + +diff --git a/doc/source/_static/.gitignore b/doc/source/_static/.gitignore +new file mode 100644 +index 0000000..e69de29 +diff --git a/doc/source/_static/.placeholder b/doc/source/_static/.placeholder +new file mode 100644 +index 0000000..e69de29 +diff --git a/doc/source/_static/basic.css b/doc/source/_static/basic.css +new file mode 100644 +index 0000000..d909ce3 +--- /dev/null ++++ b/doc/source/_static/basic.css +@@ -0,0 +1,416 @@ ++/** ++ * Sphinx stylesheet -- basic theme ++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ */ ++ ++/* -- main layout ----------------------------------------------------------- */ ++ ++div.clearer { ++ clear: both; ++} ++ ++/* -- relbar ---------------------------------------------------------------- */ ++ ++div.related { ++ width: 100%; ++ font-size: 90%; ++} ++ ++div.related h3 { ++ display: none; ++} ++ ++div.related ul { ++ margin: 0; ++ padding: 0 0 0 10px; ++ list-style: none; ++} ++ ++div.related li { ++ display: inline; ++} ++ ++div.related li.right { ++ float: right; ++ margin-right: 5px; ++} ++ ++/* -- sidebar --------------------------------------------------------------- */ ++ ++div.sphinxsidebarwrapper { ++ padding: 10px 5px 0 10px; ++} ++ ++div.sphinxsidebar { ++ float: left; ++ width: 230px; ++ margin-left: -100%; ++ font-size: 90%; ++} ++ ++div.sphinxsidebar ul { ++ list-style: none; ++} ++ ++div.sphinxsidebar ul ul, ++div.sphinxsidebar ul.want-points { ++ margin-left: 20px; ++ list-style: square; ++} ++ ++div.sphinxsidebar ul ul { ++ margin-top: 0; ++ margin-bottom: 0; ++} ++ ++div.sphinxsidebar form { ++ margin-top: 10px; ++} ++ ++div.sphinxsidebar input { ++ border: 1px solid #98dbcc; ++ font-family: sans-serif; ++ font-size: 1em; ++} ++ ++img { ++ border: 0; ++} ++ ++/* -- search page ----------------------------------------------------------- */ ++ ++ul.search { ++ margin: 10px 0 0 20px; ++ padding: 0; ++} ++ ++ul.search li { ++ padding: 5px 0 5px 20px; ++ background-image: url(file.png); ++ background-repeat: no-repeat; ++ background-position: 0 7px; ++} ++ ++ul.search li a { ++ font-weight: bold; ++} ++ ++ul.search li div.context { ++ color: #888; ++ margin: 2px 0 0 30px; ++ text-align: left; ++} ++ ++ul.keywordmatches li.goodmatch a { ++ font-weight: bold; ++} ++ ++/* -- index page ------------------------------------------------------------ */ ++ ++table.contentstable { ++ width: 90%; ++} ++ ++table.contentstable p.biglink { ++ line-height: 150%; ++} ++ ++a.biglink { ++ font-size: 1.3em; ++} ++ ++span.linkdescr { ++ font-style: italic; ++ padding-top: 5px; ++ font-size: 90%; ++} ++ ++/* -- general index --------------------------------------------------------- */ ++ ++table.indextable td { ++ text-align: left; ++ vertical-align: top; ++} ++ ++table.indextable dl, table.indextable dd { ++ margin-top: 0; ++ margin-bottom: 0; ++} ++ ++table.indextable tr.pcap { ++ height: 10px; ++} ++ ++table.indextable tr.cap { ++ margin-top: 10px; ++ background-color: #f2f2f2; ++} ++ ++img.toggler { ++ margin-right: 3px; ++ margin-top: 3px; ++ cursor: pointer; ++} ++ ++/* -- general body styles --------------------------------------------------- */ ++ ++a.headerlink { ++ visibility: hidden; ++} ++ ++h1:hover > a.headerlink, ++h2:hover > a.headerlink, ++h3:hover > a.headerlink, ++h4:hover > a.headerlink, ++h5:hover > a.headerlink, ++h6:hover > a.headerlink, ++dt:hover > a.headerlink { ++ visibility: visible; ++} ++ ++div.body p.caption { ++ text-align: inherit; ++} ++ ++div.body td { ++ text-align: left; ++} ++ ++.field-list ul { ++ padding-left: 1em; ++} ++ ++.first { ++} ++ ++p.rubric { ++ margin-top: 30px; ++ font-weight: bold; ++} ++ ++/* -- sidebars -------------------------------------------------------------- */ ++ ++div.sidebar { ++ margin: 0 0 0.5em 1em; ++ border: 1px solid #ddb; ++ padding: 7px 7px 0 7px; ++ background-color: #ffe; ++ width: 40%; ++ float: right; ++} ++ ++p.sidebar-title { ++ font-weight: bold; ++} ++ ++/* -- topics ---------------------------------------------------------------- */ ++ ++div.topic { ++ border: 1px solid #ccc; ++ padding: 7px 7px 0 7px; ++ margin: 10px 0 10px 0; ++} ++ ++p.topic-title { ++ font-size: 1.1em; ++ font-weight: bold; ++ margin-top: 10px; ++} ++ ++/* -- admonitions ----------------------------------------------------------- */ ++ ++div.admonition { ++ margin-top: 10px; ++ margin-bottom: 10px; ++ padding: 7px; ++} ++ ++div.admonition dt { ++ font-weight: bold; ++} ++ ++div.admonition dl { ++ margin-bottom: 0; ++} ++ ++p.admonition-title { ++ margin: 0px 10px 5px 0px; ++ font-weight: bold; ++} ++ ++div.body p.centered { ++ text-align: center; ++ margin-top: 25px; ++} ++ ++/* -- tables ---------------------------------------------------------------- */ ++ ++table.docutils { ++ border: 0; ++ border-collapse: collapse; ++} ++ ++table.docutils td, table.docutils th { ++ padding: 1px 8px 1px 0; ++ border-top: 0; ++ border-left: 0; ++ border-right: 0; ++ border-bottom: 1px solid #aaa; ++} ++ ++table.field-list td, table.field-list th { ++ border: 0 !important; ++} ++ ++table.footnote td, table.footnote th { ++ border: 0 !important; ++} ++ ++th { ++ text-align: left; ++ padding-right: 5px; ++} ++ ++/* -- other body styles ----------------------------------------------------- */ ++ ++dl { ++ margin-bottom: 15px; ++} ++ ++dd p { ++ margin-top: 0px; ++} ++ ++dd ul, dd table { ++ margin-bottom: 10px; ++} ++ ++dd { ++ margin-top: 3px; ++ margin-bottom: 10px; ++ margin-left: 30px; ++} ++ ++dt:target, .highlight { ++ background-color: #fbe54e; ++} ++ ++dl.glossary dt { ++ font-weight: bold; ++ font-size: 1.1em; ++} ++ ++.field-list ul { ++ margin: 0; ++ padding-left: 1em; ++} ++ ++.field-list p { ++ margin: 0; ++} ++ ++.refcount { ++ color: #060; ++} ++ ++.optional { ++ font-size: 1.3em; ++} ++ ++.versionmodified { ++ font-style: italic; ++} ++ ++.system-message { ++ background-color: #fda; ++ padding: 5px; ++ border: 3px solid red; ++} ++ ++.footnote:target { ++ background-color: #ffa ++} ++ ++.line-block { ++ display: block; ++ margin-top: 1em; ++ margin-bottom: 1em; ++} ++ ++.line-block .line-block { ++ margin-top: 0; ++ margin-bottom: 0; ++ margin-left: 1.5em; ++} ++ ++/* -- code displays --------------------------------------------------------- */ ++ ++pre { ++ overflow: auto; ++} ++ ++td.linenos pre { ++ padding: 5px 0px; ++ border: 0; ++ background-color: transparent; ++ color: #aaa; ++} ++ ++table.highlighttable { ++ margin-left: 0.5em; ++} ++ ++table.highlighttable td { ++ padding: 0 0.5em 0 0.5em; ++} ++ ++tt.descname { ++ background-color: transparent; ++ font-weight: bold; ++ font-size: 1.2em; ++} ++ ++tt.descclassname { ++ background-color: transparent; ++} ++ ++tt.xref, a tt { ++ background-color: transparent; ++ font-weight: bold; ++} ++ ++h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { ++ background-color: transparent; ++} ++ ++/* -- math display ---------------------------------------------------------- */ ++ ++img.math { ++ vertical-align: middle; ++} ++ ++div.body div.math p { ++ text-align: center; ++} ++ ++span.eqno { ++ float: right; ++} ++ ++/* -- printout stylesheet --------------------------------------------------- */ ++ ++@media print { ++ div.document, ++ div.documentwrapper, ++ div.bodywrapper { ++ margin: 0 !important; ++ width: 100%; ++ } ++ ++ div.sphinxsidebar, ++ div.related, ++ div.footer, ++ #top-link { ++ display: none; ++ } ++} +diff --git a/doc/source/_static/default.css b/doc/source/_static/default.css +new file mode 100644 +index 0000000..c8091ec +--- /dev/null ++++ b/doc/source/_static/default.css +@@ -0,0 +1,230 @@ ++/** ++ * Sphinx stylesheet -- default theme ++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ */ ++ ++@import url("basic.css"); ++ ++/* -- page layout ----------------------------------------------------------- */ ++ ++body { ++ font-family: sans-serif; ++ font-size: 100%; ++ background-color: #11303d; ++ color: #000; ++ margin: 0; ++ padding: 0; ++} ++ ++div.document { ++ background-color: #1c4e63; ++} ++ ++div.documentwrapper { ++ float: left; ++ width: 100%; ++} ++ ++div.bodywrapper { ++ margin: 0 0 0 230px; ++} ++ ++div.body { ++ background-color: #ffffff; ++ color: #000000; ++ padding: 0 20px 30px 20px; ++} ++ ++div.footer { ++ color: #ffffff; ++ width: 100%; ++ padding: 9px 0 9px 0; ++ text-align: center; ++ font-size: 75%; ++} ++ ++div.footer a { ++ color: #ffffff; ++ text-decoration: underline; ++} ++ ++div.related { ++ background-color: #133f52; ++ line-height: 30px; ++ color: #ffffff; ++} ++ ++div.related a { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar { ++} ++ ++div.sphinxsidebar h3 { ++ font-family: 'Trebuchet MS', sans-serif; ++ color: #ffffff; ++ font-size: 1.4em; ++ font-weight: normal; ++ margin: 0; ++ padding: 0; ++} ++ ++div.sphinxsidebar h3 a { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar h4 { ++ font-family: 'Trebuchet MS', sans-serif; ++ color: #ffffff; ++ font-size: 1.3em; ++ font-weight: normal; ++ margin: 5px 0 0 0; ++ padding: 0; ++} ++ ++div.sphinxsidebar p { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar p.topless { ++ margin: 5px 10px 10px 10px; ++} ++ ++div.sphinxsidebar ul { ++ margin: 10px; ++ padding: 0; ++ color: #ffffff; ++} ++ ++div.sphinxsidebar a { ++ color: #98dbcc; ++} ++ ++div.sphinxsidebar input { ++ border: 1px solid #98dbcc; ++ font-family: sans-serif; ++ font-size: 1em; ++} ++ ++/* -- body styles ----------------------------------------------------------- */ ++ ++a { ++ color: #355f7c; ++ text-decoration: none; ++} ++ ++a:hover { ++ text-decoration: underline; ++} ++ ++div.body p, div.body dd, div.body li { ++ text-align: left; ++ line-height: 130%; ++} ++ ++div.body h1, ++div.body h2, ++div.body h3, ++div.body h4, ++div.body h5, ++div.body h6 { ++ font-family: 'Trebuchet MS', sans-serif; ++ background-color: #f2f2f2; ++ font-weight: normal; ++ color: #20435c; ++ border-bottom: 1px solid #ccc; ++ margin: 20px -20px 10px -20px; ++ padding: 3px 0 3px 10px; ++} ++ ++div.body h1 { margin-top: 0; font-size: 200%; } ++div.body h2 { font-size: 160%; } ++div.body h3 { font-size: 140%; } ++div.body h4 { font-size: 120%; } ++div.body h5 { font-size: 110%; } ++div.body h6 { font-size: 100%; } ++ ++a.headerlink { ++ color: #c60f0f; ++ font-size: 0.8em; ++ padding: 0 4px 0 4px; ++ text-decoration: none; ++} ++ ++a.headerlink:hover { ++ background-color: #c60f0f; ++ color: white; ++} ++ ++div.body p, div.body dd, div.body li { ++ text-align: left; ++ line-height: 130%; ++} ++ ++div.admonition p.admonition-title + p { ++ display: inline; ++} ++ ++div.admonition p { ++ margin-bottom: 5px; ++} ++ ++div.admonition pre { ++ margin-bottom: 5px; ++} ++ ++div.admonition ul, div.admonition ol { ++ margin-bottom: 5px; ++} ++ ++div.note { ++ background-color: #eee; ++ border: 1px solid #ccc; ++} ++ ++div.seealso { ++ background-color: #ffc; ++ border: 1px solid #ff6; ++} ++ ++div.topic { ++ background-color: #eee; ++} ++ ++div.warning { ++ background-color: #ffe4e4; ++ border: 1px solid #f66; ++} ++ ++p.admonition-title { ++ display: inline; ++} ++ ++p.admonition-title:after { ++ content: ":"; ++} ++ ++pre { ++ padding: 5px; ++ background-color: #eeffcc; ++ color: #333333; ++ line-height: 120%; ++ border: 1px solid #ac9; ++ border-left: none; ++ border-right: none; ++} ++ ++tt { ++ background-color: #ecf0f3; ++ padding: 0 1px 0 1px; ++ font-size: 0.95em; ++} ++ ++.warning tt { ++ background: #efc2c2; ++} ++ ++.note tt { ++ background: #d6d6d6; ++} +diff --git a/doc/source/_static/jquery.tweet.js b/doc/source/_static/jquery.tweet.js +new file mode 100644 +index 0000000..79bf0bd +--- /dev/null ++++ b/doc/source/_static/jquery.tweet.js +@@ -0,0 +1,154 @@ ++(function($) { ++ ++ $.fn.tweet = function(o){ ++ var s = { ++ username: ["seaofclouds"], // [string] required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"] ++ list: null, //[string] optional name of list belonging to username ++ avatar_size: null, // [integer] height and width of avatar if displayed (48px max) ++ count: 3, // [integer] how many tweets to display? ++ intro_text: null, // [string] do you want text BEFORE your your tweets? ++ outro_text: null, // [string] do you want text AFTER your tweets? ++ join_text: null, // [string] optional text in between date and tweet, try setting to "auto" ++ auto_join_text_default: "i said,", // [string] auto text for non verb: "i said" bullocks ++ auto_join_text_ed: "i", // [string] auto text for past tense: "i" surfed ++ auto_join_text_ing: "i am", // [string] auto tense for present tense: "i was" surfing ++ auto_join_text_reply: "i replied to", // [string] auto tense for replies: "i replied to" @someone "with" ++ auto_join_text_url: "i was looking at", // [string] auto tense for urls: "i was looking at" http:... ++ loading_text: null, // [string] optional loading text, displayed while tweets load ++ query: null // [string] optional search query ++ }; ++ ++ if(o) $.extend(s, o); ++ ++ $.fn.extend({ ++ linkUrl: function() { ++ var returning = []; ++ var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp,"$1")); ++ }); ++ return $(returning); ++ }, ++ linkUser: function() { ++ var returning = []; ++ var regexp = /[\@]+([A-Za-z0-9-_]+)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp,"@$1")); ++ }); ++ return $(returning); ++ }, ++ linkHash: function() { ++ var returning = []; ++ var regexp = / [\#]+([A-Za-z0-9-_]+)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp, ' #$1')); ++ }); ++ return $(returning); ++ }, ++ capAwesome: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/\b(awesome)\b/gi, '$1')); ++ }); ++ return $(returning); ++ }, ++ capEpic: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/\b(epic)\b/gi, '$1')); ++ }); ++ return $(returning); ++ }, ++ makeHeart: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/(<)+[3]/gi, "")); ++ }); ++ return $(returning); ++ } ++ }); ++ ++ function relative_time(time_value) { ++ var parsed_date = Date.parse(time_value); ++ var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); ++ var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); ++ var pluralize = function (singular, n) { ++ return '' + n + ' ' + singular + (n == 1 ? '' : 's'); ++ }; ++ if(delta < 60) { ++ return 'less than a minute ago'; ++ } else if(delta < (45*60)) { ++ return 'about ' + pluralize("minute", parseInt(delta / 60)) + ' ago'; ++ } else if(delta < (24*60*60)) { ++ return 'about ' + pluralize("hour", parseInt(delta / 3600)) + ' ago'; ++ } else { ++ return 'about ' + pluralize("day", parseInt(delta / 86400)) + ' ago'; ++ } ++ } ++ ++ function build_url() { ++ var proto = ('https:' == document.location.protocol ? 'https:' : 'http:'); ++ if (s.list) { ++ return proto+"//api.twitter.com/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?per_page="+s.count+"&callback=?"; ++ } else if (s.query == null && s.username.length == 1) { ++ return proto+'//twitter.com/status/user_timeline/'+s.username[0]+'.json?count='+s.count+'&callback=?'; ++ } else { ++ var query = (s.query || 'from:'+s.username.join('%20OR%20from:')); ++ return proto+'//search.twitter.com/search.json?&q='+query+'&rpp='+s.count+'&callback=?'; ++ } ++ } ++ ++ return this.each(function(){ ++ var list = $('
    ').appendTo(this); ++ var intro = '

    '+s.intro_text+'

    '; ++ var outro = '

    '+s.outro_text+'

    '; ++ var loading = $('

    '+s.loading_text+'

    '); ++ ++ if(typeof(s.username) == "string"){ ++ s.username = [s.username]; ++ } ++ ++ if (s.loading_text) $(this).append(loading); ++ $.getJSON(build_url(), function(data){ ++ if (s.loading_text) loading.remove(); ++ if (s.intro_text) list.before(intro); ++ $.each((data.results || data), function(i,item){ ++ // auto join text based on verb tense and content ++ if (s.join_text == "auto") { ++ if (item.text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) { ++ var join_text = s.auto_join_text_reply; ++ } else if (item.text.match(/(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i)) { ++ var join_text = s.auto_join_text_url; ++ } else if (item.text.match(/^((\w+ed)|just) .*/im)) { ++ var join_text = s.auto_join_text_ed; ++ } else if (item.text.match(/^(\w*ing) .*/i)) { ++ var join_text = s.auto_join_text_ing; ++ } else { ++ var join_text = s.auto_join_text_default; ++ } ++ } else { ++ var join_text = s.join_text; ++ }; ++ ++ var from_user = item.from_user || item.user.screen_name; ++ var profile_image_url = item.profile_image_url || item.user.profile_image_url; ++ var join_template = ' '+join_text+' '; ++ var join = ((s.join_text) ? join_template : ' '); ++ var avatar_template = ''+from_user+'\'s avatar'; ++ var avatar = (s.avatar_size ? avatar_template : ''); ++ var date = ''+relative_time(item.created_at)+''; ++ var text = '' +$([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]+ ''; ++ ++ // until we create a template option, arrange the items below to alter a tweet's display. ++ list.append('
  • ' + avatar + date + join + text + '
  • '); ++ ++ list.children('li:first').addClass('tweet_first'); ++ list.children('li:odd').addClass('tweet_even'); ++ list.children('li:even').addClass('tweet_odd'); ++ }); ++ if (s.outro_text) list.after(outro); ++ }); ++ ++ }); ++ }; ++})(jQuery); +\ No newline at end of file +diff --git a/doc/source/_static/tweaks.css b/doc/source/_static/tweaks.css +new file mode 100644 +index 0000000..046ead8 +--- /dev/null ++++ b/doc/source/_static/tweaks.css +@@ -0,0 +1,218 @@ ++ul.todo_list { ++ list-style-type: none; ++ margin: 0; ++ padding: 0; ++} ++ ++ul.todo_list li { ++ display: block; ++ margin: 0; ++ padding: 7px 0; ++ border-top: 1px solid #eee; ++} ++ ++ul.todo_list li p { ++ display: inline; ++} ++ ++ul.todo_list li p.link { ++ font-weight: bold; ++} ++ ++ul.todo_list li p.details { ++ font-style: italic; ++} ++ ++ul.todo_list li { ++} ++ ++div.admonition { ++ border: 1px solid #8F1000; ++} ++ ++div.admonition p.admonition-title { ++ background-color: #8F1000; ++ border-bottom: 1px solid #8E8E8E; ++} ++ ++a { ++ color: #CF2F19; ++} ++ ++div.related ul li a { ++ color: #CF2F19; ++} ++ ++div.sphinxsidebar h4 { ++ background-color:#8E8E8E; ++ border:1px solid #255E6E; ++ color:white; ++ font-size:1em; ++ margin:1em 0 0.5em; ++ padding:0.1em 0 0.1em 0.5em; ++} ++ ++em { ++ font-style: normal; ++} ++ ++table.docutils { ++ font-size: 11px; ++} ++ ++.tweet_list li { ++ font-size: 0.9em; ++ border-bottom: 1px solid #eee; ++ padding: 5px 0; ++} ++ ++.tweet_list li .tweet_avatar { ++ float: left; ++} ++ ++/* ------------------------------------------ ++PURE CSS SPEECH BUBBLES ++by Nicolas Gallagher ++- http://nicolasgallagher.com/pure-css-speech-bubbles/ ++ ++http://nicolasgallagher.com ++http://twitter.com/necolas ++ ++Created: 02 March 2010 ++Version: 1.1 (21 October 2010) ++ ++Dual licensed under MIT and GNU GPLv2 © Nicolas Gallagher ++------------------------------------------ */ ++/* THE SPEECH BUBBLE ++------------------------------------------------------------------------------------------------------------------------------- */ ++ ++/* THE SPEECH BUBBLE ++------------------------------------------------------------------------------------------------------------------------------- */ ++ ++.triangle-border { ++ position:relative; ++ padding:15px; ++ margin:1em 0 3em; ++ border:5px solid #BC1518; ++ color:#333; ++ background:#fff; ++ ++ /* css3 */ ++ -moz-border-radius:10px; ++ -webkit-border-radius:10px; ++ border-radius:10px; ++} ++ ++/* Variant : for left positioned triangle ++------------------------------------------ */ ++ ++.triangle-border.left { ++ margin-left:30px; ++} ++ ++/* Variant : for right positioned triangle ++------------------------------------------ */ ++ ++.triangle-border.right { ++ margin-right:30px; ++} ++ ++/* THE TRIANGLE ++------------------------------------------------------------------------------------------------------------------------------- */ ++ ++.triangle-border:before { ++ content:""; ++ display:block; /* reduce the damage in FF3.0 */ ++ position:absolute; ++ bottom:-40px; /* value = - border-top-width - border-bottom-width */ ++ left:40px; /* controls horizontal position */ ++ width:0; ++ height:0; ++ border:20px solid transparent; ++ border-top-color:#BC1518; ++} ++ ++/* creates the smaller triangle */ ++.triangle-border:after { ++ content:""; ++ display:block; /* reduce the damage in FF3.0 */ ++ position:absolute; ++ bottom:-26px; /* value = - border-top-width - border-bottom-width */ ++ left:47px; /* value = (:before left) + (:before border-left) - (:after border-left) */ ++ width:0; ++ height:0; ++ border:13px solid transparent; ++ border-top-color:#fff; ++} ++ ++/* Variant : top ++------------------------------------------ */ ++ ++/* creates the larger triangle */ ++.triangle-border.top:before { ++ top:-40px; /* value = - border-top-width - border-bottom-width */ ++ right:40px; /* controls horizontal position */ ++ bottom:auto; ++ left:auto; ++ border:20px solid transparent; ++ border-bottom-color:#BC1518; ++} ++ ++/* creates the smaller triangle */ ++.triangle-border.top:after { ++ top:-26px; /* value = - border-top-width - border-bottom-width */ ++ right:47px; /* value = (:before right) + (:before border-right) - (:after border-right) */ ++ bottom:auto; ++ left:auto; ++ border:13px solid transparent; ++ border-bottom-color:#fff; ++} ++ ++/* Variant : left ++------------------------------------------ */ ++ ++/* creates the larger triangle */ ++.triangle-border.left:before { ++ top:10px; /* controls vertical position */ ++ left:-30px; /* value = - border-left-width - border-right-width */ ++ bottom:auto; ++ border-width:15px 30px 15px 0; ++ border-style:solid; ++ border-color:transparent #BC1518; ++} ++ ++/* creates the smaller triangle */ ++.triangle-border.left:after { ++ top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */ ++ left:-21px; /* value = - border-left-width - border-right-width */ ++ bottom:auto; ++ border-width:9px 21px 9px 0; ++ border-style:solid; ++ border-color:transparent #fff; ++} ++ ++/* Variant : right ++------------------------------------------ */ ++ ++/* creates the larger triangle */ ++.triangle-border.right:before { ++ top:10px; /* controls vertical position */ ++ right:-30px; /* value = - border-left-width - border-right-width */ ++ bottom:auto; ++ left:auto; ++ border-width:15px 0 15px 30px; ++ border-style:solid; ++ border-color:transparent #BC1518; ++} ++ ++/* creates the smaller triangle */ ++.triangle-border.right:after { ++ top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */ ++ right:-21px; /* value = - border-left-width - border-right-width */ ++ bottom:auto; ++ left:auto; ++ border-width:9px 0 9px 21px; ++ border-style:solid; ++ border-color:transparent #fff; ++} ++ +diff --git a/doc/source/_templates/.gitignore b/doc/source/_templates/.gitignore +new file mode 100644 +index 0000000..e69de29 +diff --git a/doc/source/_templates/.placeholder b/doc/source/_templates/.placeholder +new file mode 100644 +index 0000000..e69de29 +diff --git a/doc/source/_theme/layout.html b/doc/source/_theme/layout.html +new file mode 100644 +index 0000000..f5b388c +--- /dev/null ++++ b/doc/source/_theme/layout.html +@@ -0,0 +1,95 @@ ++{% extends "sphinxdoc/layout.html" %} ++{% set css_files = css_files + ['_static/tweaks.css'] %} ++{% set script_files = script_files + ['_static/jquery.tweet.js'] %} ++{% block extrahead %} ++ ++{% endblock %} ++ ++{%- macro sidebar() %} ++ {%- if not embedded %}{% if not theme_nosidebar|tobool %} ++
    ++
    ++ {%- block sidebarlogo %} ++ {%- if logo %} ++ ++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebartoc %} ++ {%- if display_toc %} ++

    {{ _('Table Of Contents') }}

    ++ {{ toc }} ++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebarrel %} ++ {%- if prev %} ++

    {{ _('Previous topic') }}

    ++

    {{ prev.title }}

    ++ {%- endif %} ++ {%- if next %} ++

    {{ _('Next topic') }}

    ++

    {{ next.title }}

    ++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebarsourcelink %} ++ {%- if show_source and has_source and sourcename %} ++

    {{ _('This Page') }}

    ++ ++ {%- endif %} ++ {%- endblock %} ++ {%- if customsidebar %} ++ {% include customsidebar %} ++ {%- endif %} ++ {%- block sidebarsearch %} ++ {%- if pagename != "search" %} ++ ++ ++ ++

    ++ Psst... hey. You're reading the latest content, but it's for the Block Storage project only. You can read all OpenStack docs too. ++

    ++ ++ {%- endif %} ++ ++ {%- if pagename == "index" %} ++ ++ ++

    {{ _('Twitter Feed') }}

    ++ ++ {%- endif %} ++ ++ ++ ++ ++ {%- endblock %} ++
    ++
    ++ {%- endif %}{% endif %} ++{%- endmacro %} +diff --git a/doc/source/_theme/theme.conf b/doc/source/_theme/theme.conf +new file mode 100644 +index 0000000..e039fe0 +--- /dev/null ++++ b/doc/source/_theme/theme.conf +@@ -0,0 +1,5 @@ ++[theme] ++inherit = sphinxdoc ++stylesheet = sphinxdoc.css ++pygments_style = friendly ++ +diff --git a/doc/source/conf.py b/doc/source/conf.py +index 7a2bf1a..01bd3b4 100644 +--- a/doc/source/conf.py ++++ b/doc/source/conf.py +@@ -33,9 +33,7 @@ extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.coverage', + 'sphinx.ext.pngmath', + 'sphinx.ext.ifconfig', +- 'sphinx.ext.graphviz', +- 'oslo.sphinx', +- ] ++ 'sphinx.ext.graphviz'] + + # autodoc generation is a bit aggressive and a nuisance + # when doing heavy text edit cycles. Execute "export SPHINX_DEBUG=1" +@@ -133,8 +131,8 @@ man_pages = [ + + # The theme to use for HTML and HTML Help pages. Major themes that come with + # Sphinx are currently 'default' and 'sphinxdoc'. +-# html_theme_path = ["."] +-# html_theme = '_theme' ++html_theme_path = ["."] ++html_theme = '_theme' + + # Theme options are theme-specific and customize the look and feel of a theme + # further. For a list of options available for each theme, see the +diff --git a/test-requirements.txt b/test-requirements.txt +index 3d8e9bf..f83b20b 100644 +--- a/test-requirements.txt ++++ b/test-requirements.txt +@@ -12,5 +12,4 @@ + sphinx>=1.1.2 + python-subunit + testtools>=0.9.32 + testrepository>=0.0.17 +-oslo.sphinx diff --git a/rpm/SOURCES/0004-avoid-code-path-causing-qpid-exchange-leaks.patch b/rpm/SOURCES/0004-avoid-code-path-causing-qpid-exchange-leaks.patch deleted file mode 100644 index d219d7779..000000000 --- a/rpm/SOURCES/0004-avoid-code-path-causing-qpid-exchange-leaks.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 9e65a17f9143616548c722231d0f4399c142bcd5 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?P=C3=A1draig=20Brady?= -Date: Wed, 17 Jul 2013 16:03:44 +0100 -Subject: [PATCH] avoid code path causing qpid exchange leaks - -Always assume amqp_rpc_single_reply_queue is True, -so that the problematic code path is ignored. -The issue is discussed at https://pad.lv/1178375 ---- - cinder/openstack/common/rpc/amqp.py | 3 ++- - 1 files changed, 2 insertions(+), 1 deletions(-) - -diff --git a/cinder/openstack/common/rpc/amqp.py b/cinder/openstack/common/rpc/amqp.py -index 832511c..fd621c4 100644 ---- a/cinder/openstack/common/rpc/amqp.py -+++ b/cinder/openstack/common/rpc/amqp.py -@@ -590,7 +590,8 @@ def multicall(conf, context, topic, msg, timeout, connection_pool): - - # TODO(pekowski): Remove this flag and the code under the if clause - # in Havana. -- if not conf.amqp_rpc_single_reply_queue: -+ # (p-draigbrady): This clause is disabled to avoid qpid exchange leaks -+ if False and not conf.amqp_rpc_single_reply_queue: - conn = ConnectionContext(conf, connection_pool) - wait_msg = MulticallWaiter(conf, conn, timeout) - conn.declare_direct_consumer(msg_id, wait_msg) diff --git a/rpm/SOURCES/openstack-cinder-backup.init b/rpm/SOURCES/openstack-cinder-backup.init new file mode 100644 index 000000000..2e9593a00 --- /dev/null +++ b/rpm/SOURCES/openstack-cinder-backup.init @@ -0,0 +1,104 @@ +#!/bin/sh +# +# openstack-cinder-backup OpenStack Cinder Backup Service +# +# chkconfig: - 98 02 +# description: The backup service provides a way to back up Cinder \ +# volume data. + +### BEGIN INIT INFO +# Provides: +# Required-Start: $remote_fs $network $syslog +# Required-Stop: $remote_fs $syslog +# Default-Stop: 0 1 6 +# Short-Description: OpenStack Cinder Backup Service +# Description: The backup service provides a way to back up Cinder \ +# volume data. +### END INIT INFO + +. /etc/rc.d/init.d/functions + +suffix=backup +prog=openstack-cinder-$suffix +exec="/usr/bin/cinder-$suffix" +config="/etc/cinder/cinder.conf" +pidfile="/var/run/cinder/cinder-$suffix.pid" +logfile="/var/log/cinder/$suffix.log" + +[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog + +lockfile=/var/lock/subsys/$prog + +start() { + [ -x $exec ] || exit 5 + [ -f $config ] || exit 6 + echo -n $"Starting $prog: " + daemon --user cinder --pidfile $pidfile "$exec --config-file $config --logfile $logfile &>/dev/null & echo \$! > $pidfile" + retval=$? + echo + [ $retval -eq 0 ] && touch $lockfile + return $retval +} + +stop() { + echo -n $"Stopping $prog: " + killproc -p $pidfile $prog + retval=$? + echo + [ $retval -eq 0 ] && rm -f $lockfile + return $retval +} + +restart() { + stop + start +} + +reload() { + restart +} + +force_reload() { + restart +} + +rh_status() { + status -p $pidfile $prog +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + + +case "$1" in + start) + rh_status_q && exit 0 + $1 + ;; + stop) + rh_status_q || exit 0 + $1 + ;; + restart) + $1 + ;; + reload) + rh_status_q || exit 7 + $1 + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit 2 +esac +exit $? diff --git a/rpm/SOURCES/openstack-cinder-backup.upstart b/rpm/SOURCES/openstack-cinder-backup.upstart new file mode 100644 index 000000000..a90cb673c --- /dev/null +++ b/rpm/SOURCES/openstack-cinder-backup.upstart @@ -0,0 +1,8 @@ +description "OpenStack Cinder Backup Server" + +start on stopped rc RUNLEVEL=[2345] +stop on runlevel [S016] + +respawn + +exec su -s /bin/sh -c "exec /usr/bin/cinder-backup --config-file /etc/cinder/cinder.conf --logfile /var/log/cinder/backup.log" cinder diff --git a/rpm/SOURCES/openstack-cinder-newdeps.patch b/rpm/SOURCES/openstack-cinder-newdeps.patch deleted file mode 100644 index 19f2d0de9..000000000 --- a/rpm/SOURCES/openstack-cinder-newdeps.patch +++ /dev/null @@ -1,78 +0,0 @@ ---- cinder-2013.1-orig/cinder/__init__.py 2012-11-22 04:22:19.000000000 -0500 -+++ cinder-2013.1/cinder/__init__.py 2012-12-20 12:57:42.337489999 -0500 -@@ -31,6 +31,36 @@ - .. moduleauthor:: Andy Smith - """ - -+import sys -+import pkg_resources -+ -+# If there is a conflicting non egg module, -+# i.e. an older standard system module installed, -+# then replace it with this requirement -+def replace_dist(requirement): -+ try: -+ return pkg_resources.require(requirement) -+ except pkg_resources.VersionConflict: -+ e = sys.exc_info()[1] -+ dist=e.args[0] -+ req=e.args[1] -+ if dist.key == req.key and not dist.location.endswith('.egg'): -+ del pkg_resources.working_set.by_key[dist.key] -+ # We assume there is no need to adjust sys.path -+ # and the associated pkg_resources.working_set.entries -+ return pkg_resources.require(requirement) -+ -+replace_dist("WebOb >= 1.0") -+replace_dist("SQLAlchemy >= 0.6.3") -+replace_dist("Routes >= 1.12.3") -+ -+replace_dist("PasteDeploy >= 1.5.0") -+# This hack is needed because replace_dist() results in -+# the standard paste module path being at the start of __path__. -+# TODO: See can we get pkg_resources to do the right thing directly -+import paste -+paste.__path__.insert(0, paste.__path__.pop(-1)) -+ - import gettext - - ---- cinder-2013.1-orig/bin/cinder-manage 2012-11-22 04:22:19.000000000 -0500 -+++ cinder-2013.1/bin/cinder-manage 2012-12-20 12:58:01.014504835 -0500 -@@ -60,9 +60,6 @@ - import sys - import uuid - --from sqlalchemy import create_engine, MetaData, Table --from sqlalchemy.ext.declarative import declarative_base --from sqlalchemy.orm import sessionmaker - - - # If ../cinder/__init__.py exists, add ../ to Python search path, so that -@@ -86,6 +83,10 @@ - from cinder import utils - from cinder import version - -+from sqlalchemy import create_engine, MetaData, Table -+from sqlalchemy.orm import sessionmaker -+from sqlalchemy.ext.declarative import declarative_base -+ - FLAGS = flags.FLAGS - - ---- cinder-2013.1-orig/cinder/db/sqlalchemy/migration.py 2012-11-22 04:22:19.000000000 -0500 -+++ cinder-2013.1/cinder/db/sqlalchemy/migration.py 2012-12-20 12:57:44.821491814 -0500 -@@ -57,7 +57,12 @@ - - - # NOTE(jkoelker) Delay importing migrate until we are patched --from migrate import exceptions as versioning_exceptions -+try: -+ # Try the more specific path first (migrate <= 0.6) -+ from migrate.versioning import exceptions as versioning_exceptions -+except ImportError: -+ # Use the newer path (migrate >= 0.7) -+ from migrate import exceptions as versioning_exceptions - from migrate.versioning import api as versioning_api - from migrate.versioning.repository import Repository - diff --git a/rpm/SPECS/openstack-cinder.spec b/rpm/SPECS/openstack-cinder.spec index 1830b3e17..7bcec3663 100644 --- a/rpm/SPECS/openstack-cinder.spec +++ b/rpm/SPECS/openstack-cinder.spec @@ -1,14 +1,14 @@ %global with_doc %{!?_without_doc:1}%{?_without_doc:0} Name: openstack-cinder -Version: 2013.1.2 -Release: 4%{?dist} +Version: 2013.2 +Release: 0.8.b3%{?dist} Summary: OpenStack Volume service Group: Applications/System License: ASL 2.0 URL: http://www.openstack.org/software/openstack-storage/ -Source0: https://launchpad.net/cinder/grizzly/%{version}/+download/cinder-%{version}.tar.gz +Source0: https://launchpad.net/cinder/havana/havana-3/+download/cinder-%{version}.b3.tar.gz Source1: cinder.conf Source2: cinder.logrotate Source3: cinder-tgt.conf @@ -19,28 +19,31 @@ Source11: openstack-cinder-scheduler.init Source110: openstack-cinder-scheduler.upstart Source12: openstack-cinder-volume.init Source120: openstack-cinder-volume.upstart +Source13: openstack-cinder-backup.init +Source130: openstack-cinder-backup.upstart Source20: cinder-sudoers # -# patches_base=2013.1.2 +# patches_base=2013.2.b3 # Patch0001: 0001-Ensure-we-don-t-access-the-net-when-building-docs.patch Patch0002: 0002-Use-updated-parallel-install-versions-of-epel-packag.patch -Patch0003: 0003-remove-deprecated-assert_unicode-sqlalchemy-attribut.patch -Patch0004: 0004-avoid-code-path-causing-qpid-exchange-leaks.patch +Patch0003: 0003-Remove-runtime-dep-on-python-pbr-python-d2to1.patch +Patch0004: 0004-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch BuildArch: noarch BuildRequires: intltool +BuildRequires: python-d2to1 +BuildRequires: python-pbr BuildRequires: python-sphinx10 BuildRequires: python-setuptools BuildRequires: python-netaddr BuildRequires: openstack-utils -# These are required to build due to the requirements check added BuildRequires: python-paste-deploy1.5 BuildRequires: python-routes1.12 BuildRequires: python-sqlalchemy0.7 -BuildRequires: python-webob1.0 +BuildRequires: python-webob1.2 Requires: openstack-utils Requires: python-cinder = %{version}-%{release} @@ -66,9 +69,11 @@ Summary: OpenStack Volume Python libraries Group: Applications/System Requires: sudo + Requires: MySQL-python Requires: qemu-img +Requires: sysfsutils Requires: python-paramiko @@ -91,11 +96,18 @@ Requires: python-migrate Requires: python-paste-deploy1.5 Requires: python-routes1.12 -Requires: python-webob1.0 +Requires: python-webob1.2 Requires: python-glanceclient >= 1:0 +Requires: python-swiftclient >= 1.2 Requires: python-keystoneclient +Requires: python-novaclient >= 2.14 + Requires: python-oslo-config +Requires: python-six + +Requires: python-babel +Requires: python-lockfile %description -n python-cinder OpenStack Volume (codename Cinder) provides services to manage and @@ -116,7 +128,7 @@ BuildRequires: graphviz BuildRequires: python-eventlet BuildRequires: python-routes1.12 BuildRequires: python-sqlalchemy0.7 -BuildRequires: python-webob1.0 +BuildRequires: python-webob1.2 # while not strictly required, quiets the build down when building docs. BuildRequires: python-migrate, python-iso8601 @@ -142,6 +154,14 @@ find cinder -name \*.py -exec sed -i '/\/usr\/bin\/env python/{d;q}' {} + # TODO: Have the following handle multi line entries sed -i '/setup_requires/d; /install_requires/d; /dependency_links/d' setup.py +# Remove the requirements file so that pbr hooks don't add it +# to distutils requires_dist config +rm -rf {test-,}requirements.txt tools/{pip,test}-requires + +# We add REDHATCINDERVERSION/RELEASE with the pbr removal patch +sed -i s/REDHATCINDERVERSION/%{version}/ cinder/version.py +sed -i s/REDHATCINDERRELEASE/%{release}/ cinder/version.py + %build # Move authtoken configuration out of paste.ini @@ -195,6 +215,7 @@ install -p -D -m 640 etc/cinder/policy.json %{buildroot}%{_sysconfdir}/cinder/po install -p -D -m 755 %{SOURCE10} %{buildroot}%{_initrddir}/openstack-cinder-api install -p -D -m 755 %{SOURCE11} %{buildroot}%{_initrddir}/openstack-cinder-scheduler install -p -D -m 755 %{SOURCE12} %{buildroot}%{_initrddir}/openstack-cinder-volume +install -p -D -m 755 %{SOURCE13} %{buildroot}%{_initrddir}/openstack-cinder-backup # Install sudoers install -p -D -m 440 %{SOURCE20} %{buildroot}%{_sysconfdir}/sudoers.d/cinder @@ -210,6 +231,7 @@ install -d -m 755 %{buildroot}%{_datadir}/cinder install -p -m 644 %{SOURCE100} %{buildroot}%{_datadir}/cinder/ install -p -m 644 %{SOURCE110} %{buildroot}%{_datadir}/cinder/ install -p -m 644 %{SOURCE120} %{buildroot}%{_datadir}/cinder/ +install -p -m 644 %{SOURCE130} %{buildroot}%{_datadir}/cinder/ # Install rootwrap files in /usr/share/cinder/rootwrap mkdir -p %{buildroot}%{_datarootdir}/cinder/rootwrap/ @@ -288,17 +310,26 @@ fi %endif %changelog -* Mon Jul 22 2013 Pádraig Brady - 2013.1.2-4 +* Mon Sep 9 2013 Eric Harney - 2013.2-0.8.b3 +- Update to Havana milestone 3 +- Add dependency on python-novaclient + +* Thu Aug 29 2013 Pádraig Brady - 2013.2-0.7.b2 +- Add dependency on sysfsutils to support the fiber channel driver + +* Mon Aug 26 2013 Eric Harney - 2013.2-0.5.b2 +- Add cinder-backup service init script + +* Mon Jul 22 2013 Pádraig Brady - 2013.2-0.4.b2 - Add dependency on python-suds to support the netapp driver - Add dependency on python-keystoneclient for auth token middleware -- Add dependency on python-oslo-config new in Grizzly - Add dependency on qemu-img for volume creation from Glance images -* Wed Jul 17 2013 Pádraig Brady - 2013.1.2-2 -- Avoid qpid exchange leaks +* Sun Jul 21 2013 Pádraig Brady - 2013.2-0.3.b2 +- Update to Havana milestone 2 -* Mon Jun 20 2013 Eric Harney - 2013.1.2-1 -- Update to Grizzly stable release 2 +* Thu Jun 13 2013 Eric Harney - 2013.2-0.2.b1 +- Update to Havana milestone 1 * Fri May 10 2013 Eric Harney - 2013.1.1-1 - Update to Grizzly stable release 1 @@ -310,7 +341,7 @@ fi * Thu Apr 04 2013 Eric Harney - 2013.1-1 - Update to Grizzly final release -* Mon Mar 27 2013 Eric Harney - 2013.1-0.5.rc3 +* Wed Mar 27 2013 Eric Harney - 2013.1-0.5.rc3 - Update to Grizzly RC3 release * Mon Mar 25 2013 Eric Harney - 2013.1-0.5.rc2 -- 2.45.2