--- a/components/openstack/swift/Makefile Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/Makefile Wed Sep 07 14:48:42 2016 -0700
@@ -26,19 +26,19 @@
include ../../../make-rules/shared-macros.mk
COMPONENT_NAME= swift
-COMPONENT_CODENAME= kilo
-COMPONENT_VERSION= 2.3.0
-COMPONENT_BE_VERSION= 2015.1
+COMPONENT_CODENAME= mitaka
+COMPONENT_VERSION= 2.7.0
+COMPONENT_BE_VERSION= 2016.1
COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION)
COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz
-COMPONENT_ARCHIVE_HASH= \
- sha256:7225061f92597e7eaf6196c9336c5e590c7626b7e84126c51e8ca5bf5b7bdae1
-COMPONENT_ARCHIVE_URL= http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE)
+COMPONENT_ARCHIVE_HASH= \
+ sha256:ef71126c2fb5e59617b94179dff710c5362ca7e7bfc63fd906e622c95410256e
+COMPONENT_ARCHIVE_URL= https://tarballs.openstack.org/$(COMPONENT_NAME)/$(COMPONENT_ARCHIVE)
COMPONENT_SIG_URL= $(COMPONENT_ARCHIVE_URL).asc
COMPONENT_PROJECT_URL= http://www.openstack.org/
COMPONENT_BUGDB= service/swift
-TPNO= 25793
+TPNO= 30364
PKG_VARS += COMPONENT_BE_VERSION
@@ -62,8 +62,8 @@
COMPONENT_POST_INSTALL_ACTION += \
($(MKDIR) $(PROTO_DIR)/lib/svc/manifest/application/openstack; \
$(CP) \
- files/swift-*.xml \
- $(PROTO_DIR)/lib/svc/manifest/application/openstack)
+ files/swift-*.xml \
+ $(PROTO_DIR)/lib/svc/manifest/application/openstack)
COMPONENT_TEST_DIR = $(SOURCE_DIR)
COMPONENT_TEST_CMD = nosetests
@@ -82,10 +82,8 @@
system-test: $(SYSTEM_TESTS_NOT_IMPLEMENTED)
-
REQUIRED_PACKAGES += cloud/openstack/openstack-common
REQUIRED_PACKAGES += library/python/eventlet-27
-REQUIRED_PACKAGES += library/python/simplejson-27
REQUIRED_PACKAGES += library/python/swiftclient-27
REQUIRED_PACKAGES += network/rsync
REQUIRED_PACKAGES += service/memcached
--- a/components/openstack/swift/files/proxy-server.conf Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/files/proxy-server.conf Wed Sep 07 14:48:42 2016 -0700
@@ -25,7 +25,7 @@
# accept connections. Should default to the number of effective cpu
# cores in the system. It's worth noting that individual workers will
# use many eventlet co-routines to service multiple concurrent requests.
-# workers = auto
+workers = 1
#
# Maximum concurrent requests per worker
# max_clients = 1024
--- a/components/openstack/swift/patches/CVE-2015-5223.patch Wed Sep 07 14:48:42 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-This upstream patch addresses CVE-2015-5223 in swift. It may be removed
-when swift 2.4.0 or later is integrated.
-
-From 0694e1911d10a18075ff99462c96781372422b2c Mon Sep 17 00:00:00 2001
-From: Clay Gerrard <[email protected]>
-Date: Thu, 23 Jul 2015 22:36:21 -0700
-Subject: Disallow unsafe tempurl operations to point to unauthorized data
-
-Do not allow PUT tempurls to create pointers to other data. Specifically
-disallow the creation of DLO object manifests by returning an error if a
-non-safe tempurl request includes an X-Object-Manifest header regardless of
-the value of the header.
-
-This prevents discoverability attacks which can use any PUT tempurl to probe
-for private data by creating a DLO object manifest and then using the PUT
-tempurl to head the object which would 404 if the prefix does not match any
-object data or form a valid DLO HEAD response if it does.
-
-This also prevents a tricky and potentially unexpected consequence of PUT
-tempurls which would make it unsafe to allow a user to download objects
-created by tempurl (even if they just created them) because the result of
-reading the object created via tempurl may not be the data which was uploaded.
-
-[CVE-2015-5223]
-
-Co-Authored-By: Kota Tsuyuzaki <[email protected]>
-
-Closes-Bug: 1453948
-
-Change-Id: I91161dfb0f089c3990aca1b4255b520299ef73c8
-
---- swift-2.3.0/swift/common/middleware/tempurl.py.~1~ 2015-04-30 09:57:42.000000000 -0400
-+++ swift-2.3.0/swift/common/middleware/tempurl.py 2015-11-03 17:11:02.364113024 -0500
[email protected]@ -122,11 +122,13 @@
- from urlparse import parse_qs
-
- from swift.proxy.controllers.base import get_account_info, get_container_info
--from swift.common.swob import HeaderKeyDict, HTTPUnauthorized
-+from swift.common.swob import HeaderKeyDict, HTTPUnauthorized, HTTPBadRequest
- from swift.common.utils import split_path, get_valid_utf8_str, \
- register_swift_info, get_hmac, streq_const_time, quote
-
-
-+DISALLOWED_INCOMING_HEADERS = 'x-object-manifest'
-+
- #: Default headers to remove from incoming requests. Simply a whitespace
- #: delimited list of header names and names can optionally end with '*' to
- #: indicate a prefix match. DEFAULT_INCOMING_ALLOW_HEADERS is a list of
[email protected]@ -230,6 +232,10 @@
- #: The methods allowed with Temp URLs.
- self.methods = methods
-
-+ self.disallowed_headers = set(
-+ 'HTTP_' + h.upper().replace('-', '_')
-+ for h in DISALLOWED_INCOMING_HEADERS.split())
-+
- headers = DEFAULT_INCOMING_REMOVE_HEADERS
- if 'incoming_remove_headers' in conf:
- headers = conf['incoming_remove_headers']
[email protected]@ -323,6 +329,13 @@
- for hmac in hmac_vals)
- if not is_valid_hmac:
- return self._invalid(env, start_response)
-+ # disallowed headers prevent accidently allowing upload of a pointer
-+ # to data that the PUT tempurl would not otherwise allow access for.
-+ # It should be safe to provide a GET tempurl for data that an
-+ # untrusted client just uploaded with a PUT tempurl.
-+ resp = self._clean_disallowed_headers(env, start_response)
-+ if resp:
-+ return resp
- self._clean_incoming_headers(env)
- env['swift.authorize'] = lambda req: None
- env['swift.authorize_override'] = True
[email protected]@ -465,6 +478,22 @@
- body = '401 Unauthorized: Temp URL invalid\n'
- return HTTPUnauthorized(body=body)(env, start_response)
-
-+ def _clean_disallowed_headers(self, env, start_response):
-+ """
-+ Validate the absense of disallowed headers for "unsafe" operations.
-+
-+ :returns: None for safe operations or swob.HTTPBadResponse if the
-+ request includes disallowed headers.
-+ """
-+ if env['REQUEST_METHOD'] in ('GET', 'HEAD', 'OPTIONS'):
-+ return
-+ for h in env:
-+ if h in self.disallowed_headers:
-+ return HTTPBadRequest(
-+ body='The header %r is not allowed in this tempurl' %
-+ h[len('HTTP_'):].title().replace('_', '-'))(
-+ env, start_response)
-+
- def _clean_incoming_headers(self, env):
- """
- Removes any headers from the WSGI environment as per the
---- swift-2.3.0/test/functional/tests.py.~1~ 2015-04-30 09:57:42.000000000 -0400
-+++ swift-2.3.0/test/functional/tests.py 2015-11-03 15:27:42.202245458 -0500
[email protected]@ -2732,6 +2732,42 @@
- self.assert_(new_obj.info(parms=put_parms,
- cfg={'no_auth_token': True}))
-
-+ def test_PUT_manifest_access(self):
-+ new_obj = self.env.container.file(Utils.create_name())
-+
-+ # give out a signature which allows a PUT to new_obj
-+ expires = int(time.time()) + 86400
-+ sig = self.tempurl_sig(
-+ 'PUT', expires, self.env.conn.make_path(new_obj.path),
-+ self.env.tempurl_key)
-+ put_parms = {'temp_url_sig': sig,
-+ 'temp_url_expires': str(expires)}
-+
-+ # try to create manifest pointing to some random container
-+ try:
-+ new_obj.write('', {
-+ 'x-object-manifest': '%s/foo' % 'some_random_container'
-+ }, parms=put_parms, cfg={'no_auth_token': True})
-+ except ResponseError as e:
-+ self.assertEqual(e.status, 400)
-+ else:
-+ self.fail('request did not error')
-+
-+ # create some other container
-+ other_container = self.env.account.container(Utils.create_name())
-+ if not other_container.create():
-+ raise ResponseError(self.conn.response)
-+
-+ # try to create manifest pointing to new container
-+ try:
-+ new_obj.write('', {
-+ 'x-object-manifest': '%s/foo' % other_container
-+ }, parms=put_parms, cfg={'no_auth_token': True})
-+ except ResponseError as e:
-+ self.assertEqual(e.status, 400)
-+ else:
-+ self.fail('request did not error')
-+
- def test_HEAD(self):
- expires = int(time.time()) + 86400
- sig = self.tempurl_sig(
---- swift-2.3.0/test/unit/common/middleware/test_tempurl.py.~1~ 2015-04-30 09:57:42.000000000 -0400
-+++ swift-2.3.0/test/unit/common/middleware/test_tempurl.py 2015-11-03 15:27:42.202552552 -0500
[email protected]@ -649,6 +649,25 @@
- self.assertTrue('Temp URL invalid' in resp.body)
- self.assertTrue('Www-Authenticate' in resp.headers)
-
-+ def test_disallowed_header_object_manifest(self):
-+ self.tempurl = tempurl.filter_factory({})(self.auth)
-+ method = 'PUT'
-+ expires = int(time() + 86400)
-+ path = '/v1/a/c/o'
-+ key = 'abc'
-+ hmac_body = '%s\n%s\n%s' % (method, expires, path)
-+ sig = hmac.new(key, hmac_body, sha1).hexdigest()
-+ req = self._make_request(
-+ path, method='PUT', keys=[key],
-+ headers={'x-object-manifest': 'private/secret'},
-+ environ={'QUERY_STRING': 'temp_url_sig=%s&temp_url_expires=%s' % (
-+ sig, expires)})
-+ resp = req.get_response(self.tempurl)
-+ self.assertEquals(resp.status_int, 400)
-+ self.assertTrue('header' in resp.body)
-+ self.assertTrue('not allowed' in resp.body)
-+ self.assertTrue('X-Object-Manifest' in resp.body)
-+
- def test_removed_incoming_header(self):
- self.tempurl = tempurl.filter_factory({
- 'incoming_remove_headers': 'x-remove-this'})(self.auth)
--- a/components/openstack/swift/patches/CVE-2016-0737.patch Wed Sep 07 14:48:42 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,476 +0,0 @@
-This upstream patch addresses CVE-2016-0737 which is filed under
-Launchpad bug 1466549. The issue is addressed in Swift 2.3.1 as well as
-2.5.1 or later.
-
-From 036c2f348d24c01c7a4deba3e44889c45270b46d Mon Sep 17 00:00:00 2001
-From: Samuel Merritt <[email protected]>
-Date: Thu, 18 Jun 2015 12:58:03 -0700
-Subject: Get better at closing WSGI iterables.
-
-PEP 333 (WSGI) says: "If the iterable returned by the application has
-a close() method, the server or gateway must call that method upon
-completion of the current request[.]"
-
-There's a bunch of places where we weren't doing that; some of them
-matter more than others. Calling .close() can prevent a connection
-leak in some cases. In others, it just provides a certain pedantic
-smugness. Either way, we should do what WSGI requires.
-
-Noteworthy goofs include:
-
- * If a client is downloading a large object and disconnects halfway
- through, a proxy -> obj connection may be leaked. In this case,
- the WSGI iterable is a SegmentedIterable, which lacked a close()
- method. Thus, when the WSGI server noticed the client disconnect,
- it had no way of telling the SegmentedIterable about it, and so
- the underlying iterable for the segment's data didn't get
- closed.
-
- Here, it seems likely (though unproven) that the object server
- would time out and kill the connection, or that a
- ChunkWriteTimeout would fire down in the proxy server, so the
- leaked connection would eventually go away. However, a flurry of
- client disconnects could leave a big pile of useless connections.
-
- * If a conditional request receives a 304 or 412, the underlying
- app_iter is not closed. This mostly affects conditional requests
- for large objects.
-
-The leaked connections were noticed by this patch's co-author, who
-made the changes to SegmentedIterable. Those changes helped, but did
-not completely fix, the issue. The rest of the patch is an attempt to
-plug the rest of the holes.
-
-Co-Authored-By: Romain LE DISEZ <[email protected]>
-
-Closes-Bug: #1466549
-
-Change-Id: I168e147aae7c1728e7e3fdabb7fba6f2d747d937
-(cherry picked from commit 12d8a53fffea6e4bed8ba3d502ce625f5c6710b9
-with fixed import conflicts)
----
- swift/common/middleware/dlo.py | 8 ++++++--
- swift/common/middleware/slo.py | 10 ++++++----
- swift/common/request_helpers.py | 35 ++++++++++++---------------------
- swift/common/swob.py | 9 ++++++++-
- swift/common/utils.py | 22 +++++++++++++++++++++
- swift/proxy/controllers/obj.py | 4 ++--
- test/unit/common/middleware/helpers.py | 32 +++++++++++++++++++++++++++++-
- test/unit/common/middleware/test_dlo.py | 10 ++++++++--
- test/unit/common/middleware/test_slo.py | 13 ++++++++----
- 9 files changed, 105 insertions(+), 38 deletions(-)
-
-diff --git a/swift/common/middleware/dlo.py b/swift/common/middleware/dlo.py
-index d2761ac..9330ccb 100644
---- a/swift/common/middleware/dlo.py
-+++ b/swift/common/middleware/dlo.py
[email protected]@ -22,7 +22,8 @@ from swift.common.http import is_success
- from swift.common.swob import Request, Response, \
- HTTPRequestedRangeNotSatisfiable, HTTPBadRequest, HTTPConflict
- from swift.common.utils import get_logger, json, \
-- RateLimitedIterator, read_conf_dir, quote
-+ RateLimitedIterator, read_conf_dir, quote, close_if_possible, \
-+ closing_if_possible
- from swift.common.request_helpers import SegmentedIterable
- from swift.common.wsgi import WSGIContext, make_subrequest
- from urllib import unquote
[email protected]@ -48,7 +49,8 @@ class GetContext(WSGIContext):
- con_resp = con_req.get_response(self.dlo.app)
- if not is_success(con_resp.status_int):
- return con_resp, None
-- return None, json.loads(''.join(con_resp.app_iter))
-+ with closing_if_possible(con_resp.app_iter):
-+ return None, json.loads(''.join(con_resp.app_iter))
-
- def _segment_listing_iterator(self, req, version, account, container,
- prefix, segments, first_byte=None,
[email protected]@ -107,6 +109,7 @@ class GetContext(WSGIContext):
- # we've already started sending the response body to the
- # client, so all we can do is raise an exception to make the
- # WSGI server close the connection early
-+ close_if_possible(error_response.app_iter)
- raise ListingIterError(
- "Got status %d listing container /%s/%s" %
- (error_response.status_int, account, container))
[email protected]@ -233,6 +236,7 @@ class GetContext(WSGIContext):
- # make sure this response is for a dynamic large object manifest
- for header, value in self._response_headers:
- if (header.lower() == 'x-object-manifest'):
-+ close_if_possible(resp_iter)
- response = self.get_or_head_response(req, value)
- return response(req.environ, start_response)
- else:
-diff --git a/swift/common/middleware/slo.py b/swift/common/middleware/slo.py
-index e8f1707..c7a97a6 100644
---- a/swift/common/middleware/slo.py
-+++ b/swift/common/middleware/slo.py
[email protected]@ -147,9 +147,9 @@ from swift.common.swob import Request, HTTPBadRequest, HTTPServerError, \
- Response
- from swift.common.utils import json, get_logger, config_true_value, \
- get_valid_utf8_str, override_bytes_from_content_type, split_path, \
-- register_swift_info, RateLimitedIterator, quote
--from swift.common.request_helpers import SegmentedIterable, \
-- closing_if_possible, close_if_possible
-+ register_swift_info, RateLimitedIterator, quote, close_if_possible, \
-+ closing_if_possible
-+from swift.common.request_helpers import SegmentedIterable
- from swift.common.constraints import check_utf8, MAX_BUFFERED_SLO_SEGMENTS
- from swift.common.http import HTTP_NOT_FOUND, HTTP_UNAUTHORIZED, is_success
- from swift.common.wsgi import WSGIContext, make_subrequest
[email protected]@ -227,6 +227,7 @@ class SloGetContext(WSGIContext):
- sub_resp = sub_req.get_response(self.slo.app)
-
- if not is_success(sub_resp.status_int):
-+ close_if_possible(sub_resp.app_iter)
- raise ListingIterError(
- 'ERROR: while fetching %s, GET of submanifest %s '
- 'failed with status %d' % (req.path, sub_req.path,
[email protected]@ -400,7 +401,8 @@ class SloGetContext(WSGIContext):
- return response(req.environ, start_response)
-
- def get_or_head_response(self, req, resp_headers, resp_iter):
-- resp_body = ''.join(resp_iter)
-+ with closing_if_possible(resp_iter):
-+ resp_body = ''.join(resp_iter)
- try:
- segments = json.loads(resp_body)
- except ValueError:
-diff --git a/swift/common/request_helpers.py b/swift/common/request_helpers.py
-index 14b9fd8..8aa8457 100644
---- a/swift/common/request_helpers.py
-+++ b/swift/common/request_helpers.py
[email protected]@ -23,7 +23,6 @@ from swob in here without creating circular imports.
- import hashlib
- import itertools
- import time
--from contextlib import contextmanager
- from urllib import unquote
- from swift import gettext_ as _
- from swift.common.storage_policy import POLICIES
[email protected]@ -32,7 +31,8 @@ from swift.common.exceptions import ListingIterError, SegmentError
- from swift.common.http import is_success
- from swift.common.swob import (HTTPBadRequest, HTTPNotAcceptable,
- HTTPServiceUnavailable)
--from swift.common.utils import split_path, validate_device_partition
-+from swift.common.utils import split_path, validate_device_partition, \
-+ close_if_possible
- from swift.common.wsgi import make_subrequest
-
-
[email protected]@ -249,26 +249,6 @@ def copy_header_subset(from_r, to_r, condition):
- to_r.headers[k] = v
-
-
--def close_if_possible(maybe_closable):
-- close_method = getattr(maybe_closable, 'close', None)
-- if callable(close_method):
-- return close_method()
--
--
[email protected]
--def closing_if_possible(maybe_closable):
-- """
-- Like contextlib.closing(), but doesn't crash if the object lacks a close()
-- method.
--
-- PEP 333 (WSGI) says: "If the iterable returned by the application has a
-- close() method, the server or gateway must call that method upon
-- completion of the current request[.]" This function makes that easier.
-- """
-- yield maybe_closable
-- close_if_possible(maybe_closable)
--
--
- class SegmentedIterable(object):
- """
- Iterable that returns the object contents for a large object.
[email protected]@ -304,6 +284,7 @@ class SegmentedIterable(object):
- self.peeked_chunk = None
- self.app_iter = self._internal_iter()
- self.validated_first_segment = False
-+ self.current_resp = None
-
- def _internal_iter(self):
- start_time = time.time()
[email protected]@ -360,6 +341,8 @@ class SegmentedIterable(object):
- 'r_size': seg_resp.content_length,
- 's_etag': seg_etag,
- 's_size': seg_size})
-+ else:
-+ self.current_resp = seg_resp
-
- seg_hash = hashlib.md5()
- for chunk in seg_resp.app_iter:
[email protected]@ -431,3 +414,11 @@ class SegmentedIterable(object):
- return itertools.chain([pc], self.app_iter)
- else:
- return self.app_iter
-+
-+ def close(self):
-+ """
-+ Called when the client disconnect. Ensure that the connection to the
-+ backend server is closed.
-+ """
-+ if self.current_resp:
-+ close_if_possible(self.current_resp.app_iter)
-diff --git a/swift/common/swob.py b/swift/common/swob.py
-index c2e3afb..a1bd9f6 100644
---- a/swift/common/swob.py
-+++ b/swift/common/swob.py
[email protected]@ -49,7 +49,8 @@ import random
- import functools
- import inspect
-
--from swift.common.utils import reiterate, split_path, Timestamp, pairs
-+from swift.common.utils import reiterate, split_path, Timestamp, pairs, \
-+ close_if_possible
- from swift.common.exceptions import InvalidTimestamp
-
-
[email protected]@ -1203,12 +1204,14 @@ class Response(object):
- etag in self.request.if_none_match:
- self.status = 304
- self.content_length = 0
-+ close_if_possible(app_iter)
- return ['']
-
- if etag and self.request.if_match and \
- etag not in self.request.if_match:
- self.status = 412
- self.content_length = 0
-+ close_if_possible(app_iter)
- return ['']
-
- if self.status_int == 404 and self.request.if_match \
[email protected]@ -1219,18 +1222,21 @@ class Response(object):
- # Failed) response. [RFC 2616 section 14.24]
- self.status = 412
- self.content_length = 0
-+ close_if_possible(app_iter)
- return ['']
-
- if self.last_modified and self.request.if_modified_since \
- and self.last_modified <= self.request.if_modified_since:
- self.status = 304
- self.content_length = 0
-+ close_if_possible(app_iter)
- return ['']
-
- if self.last_modified and self.request.if_unmodified_since \
- and self.last_modified > self.request.if_unmodified_since:
- self.status = 412
- self.content_length = 0
-+ close_if_possible(app_iter)
- return ['']
-
- if self.request and self.request.method == 'HEAD':
[email protected]@ -1244,6 +1250,7 @@ class Response(object):
- if ranges == []:
- self.status = 416
- self.content_length = 0
-+ close_if_possible(app_iter)
- return ['']
- elif ranges:
- range_size = len(ranges)
-diff --git a/swift/common/utils.py b/swift/common/utils.py
-index 19dcfd3..85c3824 100644
---- a/swift/common/utils.py
-+++ b/swift/common/utils.py
[email protected]@ -3143,6 +3143,28 @@ def ismount_raw(path):
- return False
-
-
-+def close_if_possible(maybe_closable):
-+ close_method = getattr(maybe_closable, 'close', None)
-+ if callable(close_method):
-+ return close_method()
-+
-+
[email protected]
-+def closing_if_possible(maybe_closable):
-+ """
-+ Like contextlib.closing(), but doesn't crash if the object lacks a close()
-+ method.
-+
-+ PEP 333 (WSGI) says: "If the iterable returned by the application has a
-+ close() method, the server or gateway must call that method upon
-+ completion of the current request[.]" This function makes that easier.
-+ """
-+ try:
-+ yield maybe_closable
-+ finally:
-+ close_if_possible(maybe_closable)
-+
-+
- _rfc_token = r'[^()<>@,;:\"/\[\]?={}\x00-\x20\x7f]+'
- _rfc_extension_pattern = re.compile(
- r'(?:\s*;\s*(' + _rfc_token + r")\s*(?:=\s*(" + _rfc_token +
-diff --git a/swift/proxy/controllers/obj.py b/swift/proxy/controllers/obj.py
-index a83242b..784dfef 100644
---- a/swift/proxy/controllers/obj.py
-+++ b/swift/proxy/controllers/obj.py
[email protected]@ -43,7 +43,7 @@ from swift.common.utils import (
- clean_content_type, config_true_value, ContextPool, csv_append,
- GreenAsyncPile, GreenthreadSafeIterator, json, Timestamp,
- normalize_delete_at_timestamp, public, get_expirer_container,
-- quorum_size)
-+ quorum_size, close_if_possible)
- from swift.common.bufferedhttp import http_connect
- from swift.common.constraints import check_metadata, check_object_creation, \
- check_copy_from_header, check_destination_header, \
[email protected]@ -68,7 +68,7 @@ from swift.common.swob import HTTPAccepted, HTTPBadRequest, HTTPNotFound, \
- HTTPServerError, HTTPServiceUnavailable, Request, HeaderKeyDict, \
- HTTPClientDisconnect, HTTPUnprocessableEntity, Response, HTTPException
- from swift.common.request_helpers import is_sys_or_user_meta, is_sys_meta, \
-- remove_items, copy_header_subset, close_if_possible
-+ remove_items, copy_header_subset
-
-
- def copy_headers_into(from_r, to_r):
-diff --git a/test/unit/common/middleware/helpers.py b/test/unit/common/middleware/helpers.py
-index 68a4bfe..7c1b455 100644
---- a/test/unit/common/middleware/helpers.py
-+++ b/test/unit/common/middleware/helpers.py
[email protected]@ -15,6 +15,7 @@
-
- # This stuff can't live in test/unit/__init__.py due to its swob dependency.
-
-+from collections import defaultdict
- from copy import deepcopy
- from hashlib import md5
- from swift.common import swob
[email protected]@ -23,6 +24,20 @@ from swift.common.utils import split_path
- from test.unit import FakeLogger, FakeRing
-
-
-+class LeakTrackingIter(object):
-+ def __init__(self, inner_iter, fake_swift, path):
-+ self.inner_iter = inner_iter
-+ self.fake_swift = fake_swift
-+ self.path = path
-+
-+ def __iter__(self):
-+ for x in self.inner_iter:
-+ yield x
-+
-+ def close(self):
-+ self.fake_swift.mark_closed(self.path)
-+
-+
- class FakeSwift(object):
- """
- A good-enough fake Swift proxy server to use in testing middleware.
[email protected]@ -30,6 +45,7 @@ class FakeSwift(object):
-
- def __init__(self):
- self._calls = []
-+ self._unclosed_req_paths = defaultdict(int)
- self.req_method_paths = []
- self.swift_sources = []
- self.uploaded = {}
[email protected]@ -105,7 +121,21 @@ class FakeSwift(object):
- req = swob.Request(env)
- resp = resp_class(req=req, headers=headers, body=body,
- conditional_response=True)
-- return resp(env, start_response)
-+ wsgi_iter = resp(env, start_response)
-+ self.mark_opened(path)
-+ return LeakTrackingIter(wsgi_iter, self, path)
-+
-+ def mark_opened(self, path):
-+ self._unclosed_req_paths[path] += 1
-+
-+ def mark_closed(self, path):
-+ self._unclosed_req_paths[path] -= 1
-+
-+ @property
-+ def unclosed_requests(self):
-+ return {path: count
-+ for path, count in self._unclosed_req_paths.items()
-+ if count > 0}
-
- @property
- def calls(self):
-diff --git a/test/unit/common/middleware/test_dlo.py b/test/unit/common/middleware/test_dlo.py
-index 16237eb..119e4ab 100644
---- a/test/unit/common/middleware/test_dlo.py
-+++ b/test/unit/common/middleware/test_dlo.py
[email protected]@ -26,6 +26,7 @@ import unittest
-
- from swift.common import exceptions, swob
- from swift.common.middleware import dlo
-+from swift.common.utils import closing_if_possible
- from test.unit.common.middleware.helpers import FakeSwift
-
-
[email protected]@ -54,8 +55,10 @@ class DloTestCase(unittest.TestCase):
- body = ''
- caught_exc = None
- try:
-- for chunk in body_iter:
-- body += chunk
-+ # appease the close-checker
-+ with closing_if_possible(body_iter):
-+ for chunk in body_iter:
-+ body += chunk
- except Exception as exc:
- if expect_exception:
- caught_exc = exc
[email protected]@ -279,6 +282,9 @@ class TestDloHeadManifest(DloTestCase):
-
-
- class TestDloGetManifest(DloTestCase):
-+ def tearDown(self):
-+ self.assertEqual(self.app.unclosed_requests, {})
-+
- def test_get_manifest(self):
- expected_etag = '"%s"' % md5hex(
- md5hex("aaaaa") + md5hex("bbbbb") + md5hex("ccccc") +
-diff --git a/test/unit/common/middleware/test_slo.py b/test/unit/common/middleware/test_slo.py
-index 4160d91..4d483c8 100644
---- a/test/unit/common/middleware/test_slo.py
-+++ b/test/unit/common/middleware/test_slo.py
[email protected]@ -24,7 +24,7 @@ from swift.common import swob, utils
- from swift.common.exceptions import ListingIterError, SegmentError
- from swift.common.middleware import slo
- from swift.common.swob import Request, Response, HTTPException
--from swift.common.utils import json
-+from swift.common.utils import json, closing_if_possible
- from test.unit.common.middleware.helpers import FakeSwift
-
-
[email protected]@ -74,8 +74,10 @@ class SloTestCase(unittest.TestCase):
- body = ''
- caught_exc = None
- try:
-- for chunk in body_iter:
-- body += chunk
-+ # appease the close-checker
-+ with closing_if_possible(body_iter):
-+ for chunk in body_iter:
-+ body += chunk
- except Exception as exc:
- if expect_exception:
- caught_exc = exc
[email protected]@ -222,7 +224,7 @@ class TestSloPutManifest(SloTestCase):
- '/?multipart-manifest=put',
- environ={'REQUEST_METHOD': 'PUT'}, body=test_json_data)
- self.assertEquals(
-- self.slo.handle_multipart_put(req, fake_start_response),
-+ list(self.slo.handle_multipart_put(req, fake_start_response)),
- ['passed'])
-
- def test_handle_multipart_put_success(self):
[email protected]@ -844,6 +846,9 @@ class TestSloGetManifest(SloTestCase):
- 'X-Object-Meta-Fish': 'Bass'},
- "[not {json (at ++++all")
-
-+ def tearDown(self):
-+ self.assertEqual(self.app.unclosed_requests, {})
-+
- def test_get_manifest_passthrough(self):
- req = Request.blank(
- '/v1/AUTH_test/gettest/manifest-bc?multipart-manifest=get',
---
-cgit v0.11.2
-
--- a/components/openstack/swift/patches/CVE-2016-0738.patch Wed Sep 07 14:48:42 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-This upstream patch addresses CVE-2016-0738 which is filed under
-Launchpad bug 1493303. The issue is addressed in Swift 2.3.1 as well as
-2.5.1 or later.
-
-From a4c1825a026655b7ed21d779824ae7c25318fd52 Mon Sep 17 00:00:00 2001
-From: Samuel Merritt <[email protected]>
-Date: Tue, 8 Dec 2015 16:36:05 -0800
-Subject: Fix memory/socket leak in proxy on truncated SLO/DLO GET
-
-When a client disconnected while consuming an SLO or DLO GET response,
-the proxy would leak a socket. This could be observed via strace as a
-socket that had shutdown() called on it, but was never closed. It
-could also be observed by counting entries in /proc/<pid>/fd, where
-<pid> is the pid of a proxy server worker process.
-
-This is due to a memory leak in SegmentedIterable. A SegmentedIterable
-has an 'app_iter' attribute, which is a generator. That generator
-references 'self' (the SegmentedIterable object). This creates a
-cyclic reference: the generator refers to the SegmentedIterable, and
-the SegmentedIterable refers to the generator.
-
-Python can normally handle cyclic garbage; reference counting won't
-reclaim it, but the garbage collector will. However, objects with
-finalizers will stop the garbage collector from collecting them* and
-the cycle of which they are part.
-
-For most objects, "has finalizer" is synonymous with "has a __del__
-method". However, a generator has a finalizer once it's started
-running and before it finishes: basically, while it has stack frames
-associated with it**.
-
-When a client disconnects mid-stream, we get a memory leak. We have
-our SegmentedIterable object (call it "si"), and its associated
-generator. si.app_iter is the generator, and the generator closes over
-si, so we have a cycle; and the generator has started but not yet
-finished, so the generator needs finalization; hence, the garbage
-collector won't ever clean it up.
-
-The socket leak comes in because the generator *also* refers to the
-request's WSGI environment, which contains wsgi.input, which
-ultimately refers to a _socket object from the standard
-library. Python's _socket objects only close their underlying file
-descriptor when their reference counts fall to 0***.
-
-This commit makes SegmentedIterable.close() call
-self.app_iter.close(), thereby unwinding its generator's stack and
-making it eligible for garbage collection.
-
-* in Python < 3.4, at least. See PEP 442.
-
-** see PyGen_NeedsFinalizing() in Objects/genobject.c and also
- has_finalizer() in Modules/gcmodule.c in Python.
-
-*** see sock_dealloc() in Modules/socketmodule.c in Python. See
- sock_close() in the same file for the other half of the sad story.
-
-This closes CVE-2016-0738.
-
-Closes-Bug: 1493303
-
-Change-Id: I9b617bfc152dca40d1750131d1d814d85c0a88dd
-Co-Authored-By: Kota Tsuyuzaki <[email protected]>
----
- swift/common/request_helpers.py | 6 ++--
- test/unit/common/middleware/test_slo.py | 62 +++++++++++++++++++++++++++++++++
- 2 files changed, 66 insertions(+), 2 deletions(-)
-
-diff --git a/swift/common/request_helpers.py b/swift/common/request_helpers.py
-index 8aa8457..611ee83 100644
---- a/swift/common/request_helpers.py
-+++ b/swift/common/request_helpers.py
[email protected]@ -378,6 +378,9 @@ class SegmentedIterable(object):
- self.logger.exception(_('ERROR: An error occurred '
- 'while retrieving segments'))
- raise
-+ finally:
-+ if self.current_resp:
-+ close_if_possible(self.current_resp.app_iter)
-
- def app_iter_range(self, *a, **kw):
- """
[email protected]@ -420,5 +423,4 @@ class SegmentedIterable(object):
- Called when the client disconnect. Ensure that the connection to the
- backend server is closed.
- """
-- if self.current_resp:
-- close_if_possible(self.current_resp.app_iter)
-+ close_if_possible(self.app_iter)
-diff --git a/test/unit/common/middleware/test_slo.py b/test/unit/common/middleware/test_slo.py
-index 4d483c8..8119b5f 100644
---- a/test/unit/common/middleware/test_slo.py
-+++ b/test/unit/common/middleware/test_slo.py
[email protected]@ -1253,6 +1253,68 @@ class TestSloGetManifest(SloTestCase):
- self.assertEqual(headers['X-Object-Meta-Fish'], 'Bass')
- self.assertEqual(body, '')
-
-+ def test_generator_closure(self):
-+ # Test that the SLO WSGI iterable closes its internal .app_iter when
-+ # it receives a close() message.
-+ #
-+ # This is sufficient to fix a memory leak. The memory leak arises
-+ # due to cyclic references involving a running generator; a running
-+ # generator sometimes preventes the GC from collecting it in the
-+ # same way that an object with a defined __del__ does.
-+ #
-+ # There are other ways to break the cycle and fix the memory leak as
-+ # well; calling .close() on the generator is sufficient, but not
-+ # necessary. However, having this test is better than nothing for
-+ # preventing regressions.
-+ leaks = [0]
-+
-+ class LeakTracker(object):
-+ def __init__(self, inner_iter):
-+ leaks[0] += 1
-+ self.inner_iter = iter(inner_iter)
-+
-+ def __iter__(self):
-+ return self
-+
-+ def next(self):
-+ return next(self.inner_iter)
-+
-+ def close(self):
-+ leaks[0] -= 1
-+ self.inner_iter.close()
-+
-+ class LeakTrackingSegmentedIterable(slo.SegmentedIterable):
-+ def _internal_iter(self, *a, **kw):
-+ it = super(
-+ LeakTrackingSegmentedIterable, self)._internal_iter(
-+ *a, **kw)
-+ return LeakTracker(it)
-+
-+ status = [None]
-+ headers = [None]
-+
-+ def start_response(s, h, ei=None):
-+ status[0] = s
-+ headers[0] = h
-+
-+ req = Request.blank(
-+ '/v1/AUTH_test/gettest/manifest-abcd',
-+ environ={'REQUEST_METHOD': 'GET',
-+ 'HTTP_ACCEPT': 'application/json'})
-+
-+ # can't self.call_slo() here since we don't want to consume the
-+ # whole body
-+ with patch.object(slo, 'SegmentedIterable',
-+ LeakTrackingSegmentedIterable):
-+ app_resp = self.slo(req.environ, start_response)
-+ self.assertEqual(status[0], '200 OK') # sanity check
-+ body_iter = iter(app_resp)
-+ chunk = next(body_iter)
-+ self.assertEqual(chunk, 'aaaaa') # sanity check
-+
-+ app_resp.close()
-+ self.assertEqual(0, leaks[0])
-+
- def test_head_manifest_is_efficient(self):
- req = Request.blank(
- '/v1/AUTH_test/gettest/manifest-abcd',
---
-cgit v0.11.2
-
--- a/components/openstack/swift/patches/manager.patch Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/patches/manager.patch Wed Sep 07 14:48:42 2016 -0700
@@ -5,9 +5,9 @@
This patch is not suitable for pushing upstream.
---- swift-2.3.0/swift/common/manager.py.~1~ 2015-04-30 06:57:49.000000000 -0700
-+++ swift-2.3.0/swift/common/manager.py 2016-02-08 00:46:36.615826872 -0800
[email protected]@ -577,7 +577,8 @@ class Server(object):
+--- swift-2.7.0/swift/common/manager.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/common/manager.py 2016-08-08 18:50:52.318623880 -0700
[email protected]@ -655,7 +655,8 @@ class Server(object):
re_out = subprocess.PIPE
else:
re_out = open(os.devnull, 'w+b')
@@ -17,9 +17,9 @@
pid_file = self.get_pid_file_name(conf_file)
write_file(pid_file, proc.pid)
self.procs.append(proc)
---- swift-2.3.0/test/unit/common/test_manager.py.~1~ 2015-04-30 06:57:49.000000000 -0700
-+++ swift-2.3.0/test/unit/common/test_manager.py 2016-02-08 00:45:32.431081803 -0800
[email protected]@ -955,7 +955,7 @@ class TestServer(unittest.TestCase):
+--- swift-2.7.0/test/unit/common/test_manager.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/test/unit/common/test_manager.py 2016-08-08 18:50:52.320000055 -0700
[email protected]@ -1054,7 +1054,7 @@ class TestServer(unittest.TestCase):
class MockProc(object):
def __init__(self, pid, args, stdout=MockProcess.NOTHING,
--- a/components/openstack/swift/patches/manpages.patch Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/patches/manpages.patch Wed Sep 07 14:48:42 2016 -0700
@@ -2,8 +2,8 @@
describing use of SMF. Fix a few small errors. Some of this is obviously
Solaris-specific, but the rest could be submitted upstream.
---- swift-2.3.0/doc/manpages/account-server.conf.5.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/account-server.conf.5 2016-02-07 23:36:11.482101790 -0800
+--- swift-2.7.0/doc/manpages/account-server.conf.5.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/account-server.conf.5 2016-08-08 19:02:27.970894135 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -19,7 +19,7 @@
[email protected]@ -254,11 +254,11 @@ Connection timeout to external services.
[email protected]@ -346,11 +346,11 @@ requested by delay_reaping.
.SH DOCUMENTATION
.LP
More in depth documentation about the swift-account-server and
@@ -33,8 +33,8 @@
.SH "SEE ALSO"
-.BR swift-account-server(1),
+.BR swift-account-server (1)
---- swift-2.3.0/doc/manpages/container-server.conf.5.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/container-server.conf.5 2016-02-07 23:36:11.482749481 -0800
+--- swift-2.7.0/doc/manpages/container-server.conf.5.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/container-server.conf.5 2016-08-08 19:02:27.971606335 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -50,7 +50,7 @@
[email protected]@ -283,11 +283,11 @@ Internal client config file path.
[email protected]@ -379,11 +379,11 @@ Internal client config file path.
.SH DOCUMENTATION
.LP
More in depth documentation about the swift-container-server and
@@ -64,8 +64,8 @@
.SH "SEE ALSO"
-.BR swift-container-server(1)
+.BR swift-container-server (1)
---- swift-2.3.0/doc/manpages/dispersion.conf.5.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/dispersion.conf.5 2016-02-07 23:36:11.483318879 -0800
+--- swift-2.7.0/doc/manpages/dispersion.conf.5.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/dispersion.conf.5 2016-08-08 19:02:27.972256225 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -81,16 +81,16 @@
.SH SYNOPSIS
.LP
[email protected]@ -45,7 +45,7 @@ Authentication system account/user name
- .IP "\fBauth_key\fR"
- Authentication system account/user password
[email protected]@ -55,7 +55,7 @@ The default is 'publicURL'.
+ .IP "\fBkeystone_api_insecure\fR"
+ The default is false.
.IP "\fBswift_dir\fR"
-Location of openstack-swift configuration and ring files
+Location of OpenStack Swift configuration and ring files
.IP "\fBdispersion_coverage\fR"
Percentage of partition coverage to use. The default is 1.0.
.IP "\fBretries\fR"
[email protected]@ -83,13 +83,13 @@ Whether to run the object report. The de
[email protected]@ -100,13 +100,13 @@ Whether to run the object report. The de
.SH DOCUMENTATION
.LP
More in depth documentation about the swift-dispersion utilities and
@@ -107,8 +107,8 @@
+.BR swift-dispersion-report (1),
+.BR swift-dispersion-populate (1)
---- swift-2.3.0/doc/manpages/object-expirer.conf.5.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/object-expirer.conf.5 2016-02-07 23:36:11.483836544 -0800
+--- swift-2.7.0/doc/manpages/object-expirer.conf.5.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/object-expirer.conf.5 2016-08-08 19:02:27.972835975 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -124,7 +124,7 @@
[email protected]@ -133,12 +133,12 @@ The default is \fBegg:swift#catch_errors
[email protected]@ -206,12 +206,12 @@ Path to recon cache directory. The defau
.SH DOCUMENTATION
.LP
More in depth documentation about the swift-object-expirer and
@@ -139,8 +139,8 @@
-.BR swift-proxy-server.conf(5),
+.BR proxy-server.conf (4)
---- swift-2.3.0/doc/manpages/object-server.conf.5.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/object-server.conf.5 2016-02-07 23:36:11.484380639 -0800
+--- swift-2.7.0/doc/manpages/object-server.conf.5.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/object-server.conf.5 2016-08-08 19:02:27.973565170 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -156,7 +156,7 @@
[email protected]@ -273,11 +273,11 @@ The default is 50.
[email protected]@ -510,11 +510,11 @@ will try to use object-replicator's rsyn
.SH DOCUMENTATION
.LP
More in depth documentation about the swift-object-server and
@@ -170,8 +170,8 @@
.SH "SEE ALSO"
-.BR swift-object-server(1),
+.BR swift-object-server (1)
---- swift-2.3.0/doc/manpages/proxy-server.conf.5.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/proxy-server.conf.5 2016-02-07 23:36:11.485027685 -0800
+--- swift-2.7.0/doc/manpages/proxy-server.conf.5.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/proxy-server.conf.5 2016-08-08 19:02:27.974300095 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -187,7 +187,7 @@
[email protected]@ -547,10 +547,10 @@ per second. The default is 1.
[email protected]@ -1036,10 +1036,10 @@ The default is 'x-container-read, x-cont
.SH DOCUMENTATION
.LP
More in depth documentation about the swift-proxy-server and
@@ -200,8 +200,8 @@
.SH "SEE ALSO"
-.BR swift-proxy-server(1)
+.BR swift-proxy-server (1)
---- swift-2.3.0/doc/manpages/swift-account-auditor.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-account-auditor.1 2016-02-07 23:36:11.485555356 -0800
+--- swift-2.7.0/doc/manpages/swift-account-auditor.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-account-auditor.1 2016-08-08 19:02:27.974810365 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -250,8 +250,8 @@
-.BR account-server.conf(5)
+.BR account-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-account-info.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-account-info.1 2016-02-07 23:36:11.486089148 -0800
+--- swift-2.7.0/doc/manpages/swift-account-info.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-account-info.1 2016-08-08 19:02:27.975290530 -0700
@@ -14,12 +14,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -283,8 +283,8 @@
+.BR swift-container-info (1),
+.BR swift-get-nodes (1),
+.BR swift-object-info (1)
---- swift-2.3.0/doc/manpages/swift-account-reaper.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-account-reaper.1 2016-02-07 23:36:11.486663893 -0800
+--- swift-2.7.0/doc/manpages/swift-account-reaper.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-account-reaper.1 2016-08-08 19:02:27.975805060 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -335,8 +335,8 @@
-.BR account-server.conf(5)
+.BR account-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-account-replicator.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-account-replicator.1 2016-02-07 23:36:11.487188226 -0800
+--- swift-2.7.0/doc/manpages/swift-account-replicator.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-account-replicator.1 2016-08-08 19:02:27.976300255 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -386,8 +386,8 @@
-.BR account-server.conf(5)
+.BR account-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-account-server.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-account-server.1 2016-02-07 23:36:11.487720472 -0800
+--- swift-2.7.0/doc/manpages/swift-account-server.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-account-server.1 2016-08-08 19:02:27.976796260 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -438,8 +438,8 @@
-.BR account-server.conf(5)
+.BR account-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-container-auditor.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-container-auditor.1 2016-02-07 23:36:11.488238332 -0800
+--- swift-2.7.0/doc/manpages/swift-container-auditor.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-container-auditor.1 2016-08-08 19:02:27.977281630 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -491,8 +491,8 @@
-.BR container-server.conf(5)
+.BR container-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-container-info.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-container-info.1 2016-02-07 23:36:11.488748194 -0800
+--- swift-2.7.0/doc/manpages/swift-container-info.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-container-info.1 2016-08-08 19:02:27.977764165 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -521,8 +521,8 @@
-.BR swift-object-info(1)
+.BR swift-get-nodes (1),
+.BR swift-object-info (1)
---- swift-2.3.0/doc/manpages/swift-container-replicator.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-container-replicator.1 2016-02-07 23:36:11.489262124 -0800
+--- swift-2.7.0/doc/manpages/swift-container-replicator.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-container-replicator.1 2016-08-08 19:02:27.978254170 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -573,8 +573,8 @@
-.BR container-server.conf(5)
+.BR container-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-container-server.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-container-server.1 2016-02-07 23:36:11.489822556 -0800
+--- swift-2.7.0/doc/manpages/swift-container-server.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-container-server.1 2016-08-08 19:02:27.978779845 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -626,8 +626,8 @@
-.BR container-server.conf(5)
+.BR container-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-container-sync.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-container-sync.1 2016-02-07 23:36:11.490362130 -0800
+--- swift-2.7.0/doc/manpages/swift-container-sync.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-container-sync.1 2016-08-08 19:02:27.979295920 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -658,8 +658,8 @@
.SH "SEE ALSO"
-.BR container-server.conf(5)
+.BR container-server.conf (4)
---- swift-2.3.0/doc/manpages/swift-container-updater.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-container-updater.1 2016-02-07 23:36:11.490895992 -0800
+--- swift-2.7.0/doc/manpages/swift-container-updater.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-container-updater.1 2016-08-08 19:02:27.979802740 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -710,8 +710,8 @@
-.BR container-server.conf(5)
+.BR container-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-dispersion-populate.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-dispersion-populate.1 2016-02-07 23:36:11.491414678 -0800
+--- swift-2.7.0/doc/manpages/swift-dispersion-populate.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-dispersion-populate.1 2016-08-08 19:02:27.980351620 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -727,7 +727,7 @@
.SH SYNOPSIS
.LP
[email protected]@ -107,12 +107,12 @@ $ swift-dispersion-populate
[email protected]@ -110,12 +110,12 @@ $ swift-dispersion-populate
.SH DOCUMENTATION
.LP
More in depth documentation about the swift-dispersion utilities and
@@ -743,8 +743,8 @@
-.BR dispersion.conf (5)
+.BR swift-dispersion-report (1),
+.BR dispersion.conf (4)
---- swift-2.3.0/doc/manpages/swift-dispersion-report.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-dispersion-report.1 2016-02-07 23:36:11.491947359 -0800
+--- swift-2.7.0/doc/manpages/swift-dispersion-report.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-dispersion-report.1 2016-08-08 19:02:27.980871430 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -760,7 +760,7 @@
.SH SYNOPSIS
.LP
[email protected]@ -131,12 +131,12 @@ $ swift-dispersion-report
[email protected]@ -134,12 +134,12 @@ $ swift-dispersion-report
.SH DOCUMENTATION
.LP
More in depth documentation about the swift-dispersion utilities and
@@ -776,8 +776,8 @@
-.BR dispersion.conf (5)
+.BR swift-dispersion-populate (1),
+.BR dispersion.conf (4)
---- swift-2.3.0/doc/manpages/swift-get-nodes.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-get-nodes.1 2016-02-07 23:36:11.492460076 -0800
+--- swift-2.7.0/doc/manpages/swift-get-nodes.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-get-nodes.1 2016-08-08 19:02:27.981361915 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -813,8 +813,8 @@
+.BR swift-container-info (1),
+.BR swift-object-info (1),
+.BR swift-ring-builder (1)
---- swift-2.3.0/doc/manpages/swift-init.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-init.1 2016-02-07 23:36:11.493003288 -0800
+--- swift-2.7.0/doc/manpages/swift-init.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-init.1 2016-08-08 19:02:27.981914380 -0700
@@ -15,22 +15,54 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -875,7 +875,7 @@
swift daemon, one can just use swift-init. With swift-init you can initialize
just one swift service, such as the "proxy", or a combination of them. The tool also
allows one to use the keywords such as "all", "main" and "rest" for the <server> argument.
[email protected]@ -116,8 +148,26 @@ allows one to use the keywords such as "
[email protected]@ -119,8 +151,26 @@ allows one to use the keywords such as "
.SH DOCUMENTATION
.LP
@@ -903,8 +903,8 @@
+.BR swift-proxy-server (1),
+.BR swift-replicator-rsync (1),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-object-auditor.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-object-auditor.1 2016-02-07 23:36:11.493520910 -0800
+--- swift-2.7.0/doc/manpages/swift-object-auditor.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-object-auditor.1 2016-08-08 19:02:27.982404670 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -956,8 +956,8 @@
-.BR object-server.conf(5)
+.BR object-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-object-expirer.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-object-expirer.1 2016-02-07 23:36:11.494051119 -0800
+--- swift-2.7.0/doc/manpages/swift-object-expirer.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-object-expirer.1 2016-08-08 19:02:27.982889395 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -1012,8 +1012,8 @@
-
+.BR object-expirer.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-object-info.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-object-info.1 2016-02-07 23:36:11.494560238 -0800
+--- swift-2.7.0/doc/manpages/swift-object-info.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-object-info.1 2016-08-08 19:02:27.983363875 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -1045,8 +1045,8 @@
+.BR swift-account-info (1),
+.BR swift-container-info (1),
+.BR swift-get-nodes (1)
---- swift-2.3.0/doc/manpages/swift-object-replicator.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-object-replicator.1 2016-02-07 23:36:11.495086872 -0800
+--- swift-2.7.0/doc/manpages/swift-object-replicator.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-object-replicator.1 2016-08-08 19:02:27.983847760 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -1098,8 +1098,8 @@
-.BR object-server.conf(5)
+.BR object-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-object-server.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-object-server.1 2016-02-07 23:36:11.495607099 -0800
+--- swift-2.7.0/doc/manpages/swift-object-server.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-object-server.1 2016-08-08 19:02:27.984336625 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -1150,8 +1150,8 @@
-.BR object-server.conf(5)
+.BR object-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-object-updater.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-object-updater.1 2016-02-07 23:36:11.496138018 -0800
+--- swift-2.7.0/doc/manpages/swift-object-updater.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-object-updater.1 2016-08-08 19:02:27.984816205 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -1203,8 +1203,8 @@
-.BR object-server.conf(5)
+.BR object-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-orphans.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-orphans.1 2016-02-07 23:36:11.496660523 -0800
+--- swift-2.7.0/doc/manpages/swift-orphans.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-orphans.1 2016-08-08 19:02:27.985268230 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -1228,8 +1228,8 @@
+More documentation about OpenStack Swift can be found at
.BI http://swift.openstack.org/index.html
---- swift-2.3.0/doc/manpages/swift-proxy-server.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-proxy-server.1 2016-02-07 23:36:11.497176572 -0800
+--- swift-2.7.0/doc/manpages/swift-proxy-server.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-proxy-server.1 2016-08-08 19:02:27.985740415 -0700
@@ -15,16 +15,16 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -1278,8 +1278,8 @@
-.BR proxy-server.conf(5)
+.BR proxy-server.conf (4),
+.BR smf (7)
---- swift-2.3.0/doc/manpages/swift-recon.1.~1~ 2015-04-30 06:57:49.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-recon.1 2016-02-07 23:36:11.497732841 -0800
+--- swift-2.7.0/doc/manpages/swift-recon.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-recon.1 2016-08-08 19:02:27.986285440 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
@@ -1295,7 +1295,7 @@
.SH SYNOPSIS
.LP
[email protected]@ -108,7 +108,7 @@ cronjob to run the swift-recon-cron scri
[email protected]@ -124,7 +124,7 @@ cronjob to run the swift-recon-cron scri
.SH DOCUMENTATION
.LP
@@ -1304,7 +1304,7 @@
.BI http://swift.openstack.org/index.html
Also more specific documentation about swift-recon can be found at
.BI http://swift.openstack.org/admin_guide.html#cluster-telemetry-and-monitoring
[email protected]@ -116,6 +116,6 @@ Also more specific documentation about s
[email protected]@ -132,6 +132,6 @@ Also more specific documentation about s
.SH "SEE ALSO"
@@ -1312,8 +1312,8 @@
+.BR object-server.conf (4)
---- swift-2.3.0/doc/manpages/swift-ring-builder.1.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/doc/manpages/swift-ring-builder.1 2016-02-07 23:36:11.498256500 -0800
+--- swift-2.7.0/doc/manpages/swift-ring-builder.1.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/doc/manpages/swift-ring-builder.1 2016-08-08 19:02:27.986766640 -0700
@@ -15,12 +15,12 @@
.\" See the License for the specific language governing permissions and
.\" limitations under the License.
--- a/components/openstack/swift/patches/recon.patch Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/patches/recon.patch Wed Sep 07 14:48:42 2016 -0700
@@ -2,9 +2,9 @@
Change some of the ways we gather information, since those are normally
Linux-specific. Make the tests acknowledge these changes.
---- swift-2.3.0/bin/swift-recon-cron.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/bin/swift-recon-cron 2016-02-08 00:58:57.095754838 -0800
[email protected]@ -57,8 +57,9 @@ def main():
+--- swift-2.7.0/bin/swift-recon-cron.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/bin/swift-recon-cron 2016-08-08 19:54:46.316275905 -0700
[email protected]@ -58,8 +58,9 @@ def main():
sys.exit(1)
conf = dict(c.items('filter:recon'))
device_dir = conf.get('devices', '/srv/node')
@@ -16,8 +16,8 @@
cache_file = os.path.join(recon_cache_path, "object.recon")
lock_dir = os.path.join(recon_lock_path, "swift-recon-object-cron")
conf['log_name'] = conf.get('log_name', 'recon-cron')
---- swift-2.3.0/etc/account-server.conf-sample.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/etc/account-server.conf-sample 2016-02-08 00:56:36.131898549 -0800
+--- swift-2.7.0/etc/account-server.conf-sample.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/etc/account-server.conf-sample 2016-08-08 19:54:46.322166576 -0700
@@ -81,7 +81,7 @@ use = egg:swift#healthcheck
[filter:recon]
@@ -27,26 +27,26 @@
[account-replicator]
# You can override the default log routing for this app here (don't use set!):
[email protected]@ -114,7 +114,7 @@ use = egg:swift#recon
- # of run_pause.
- # run_pause = 30
[email protected]@ -125,7 +125,7 @@ use = egg:swift#recon
+ # etc/rsyncd.conf-sample for some usage examples.
+ # rsync_module = {replication_ip}::account
#
-# recon_cache_path = /var/cache/swift
+# recon_cache_path = /var/lib/swift/recon-cache
[account-auditor]
# You can override the default log routing for this app here (don't use set!):
[email protected]@ -129,7 +129,7 @@ use = egg:swift#recon
- # log_facility = LOG_LOCAL0
- # log_level = INFO
[email protected]@ -138,7 +138,7 @@ use = egg:swift#recon
+ # interval = 1800
+ #
# accounts_per_second = 200
-# recon_cache_path = /var/cache/swift
+# recon_cache_path = /var/lib/swift/recon-cache
[account-reaper]
# You can override the default log routing for this app here (don't use set!):
---- swift-2.3.0/etc/container-server.conf-sample.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/etc/container-server.conf-sample 2016-02-08 00:56:36.132407941 -0800
+--- swift-2.7.0/etc/container-server.conf-sample.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/etc/container-server.conf-sample 2016-08-08 19:54:46.323271527 -0700
@@ -90,7 +90,7 @@ use = egg:swift#healthcheck
[filter:recon]
@@ -56,16 +56,16 @@
[container-replicator]
# You can override the default log routing for this app here (don't use set!):
[email protected]@ -115,7 +115,7 @@ use = egg:swift#recon
- # of run_pause.
- # run_pause = 30
[email protected]@ -134,7 +134,7 @@ use = egg:swift#recon
+ # etc/rsyncd.conf-sample for some usage examples.
+ # rsync_module = {replication_ip}::container
#
-# recon_cache_path = /var/cache/swift
+# recon_cache_path = /var/lib/swift/recon-cache
[container-updater]
# You can override the default log routing for this app here (don't use set!):
[email protected]@ -135,7 +135,7 @@ use = egg:swift#recon
[email protected]@ -154,7 +154,7 @@ use = egg:swift#recon
# Seconds to suppress updating an account that has generated an error
# account_suppression_time = 60
#
@@ -74,7 +74,7 @@
[container-auditor]
# You can override the default log routing for this app here (don't use set!):
[email protected]@ -148,7 +148,7 @@ use = egg:swift#recon
[email protected]@ -167,7 +167,7 @@ use = egg:swift#recon
# interval = 1800
#
# containers_per_second = 200
@@ -83,10 +83,10 @@
[container-sync]
# You can override the default log routing for this app here (don't use set!):
---- swift-2.3.0/etc/drive-audit.conf-sample.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/etc/drive-audit.conf-sample 2016-02-08 00:56:36.132840827 -0800
[email protected]@ -8,7 +8,7 @@
- # log_max_line_length = 0
+--- swift-2.7.0/etc/drive-audit.conf-sample.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/etc/drive-audit.conf-sample 2016-08-08 19:54:46.323747514 -0700
[email protected]@ -12,7 +12,7 @@
+ #
# minutes = 60
# error_limit = 1
-# recon_cache_path = /var/cache/swift
@@ -94,8 +94,8 @@
# unmount_failed_device = True
#
# By default, drive-audit logs only to syslog. Setting this option True
---- swift-2.3.0/etc/object-expirer.conf-sample.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/etc/object-expirer.conf-sample 2016-02-08 00:56:36.133283025 -0800
+--- swift-2.7.0/etc/object-expirer.conf-sample.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/etc/object-expirer.conf-sample 2016-08-08 19:54:46.322631086 -0700
@@ -50,7 +50,7 @@
# up to reclaim_age seconds before it gives up and deletes the entry in the
# queue.
@@ -105,9 +105,9 @@
[pipeline:main]
pipeline = catch_errors proxy-logging cache proxy-server
---- swift-2.3.0/etc/object-server.conf-sample.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/etc/object-server.conf-sample 2016-02-08 00:56:36.133858983 -0800
[email protected]@ -143,8 +143,8 @@ use = egg:swift#healthcheck
+--- swift-2.7.0/etc/object-server.conf-sample.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/etc/object-server.conf-sample 2016-08-08 19:54:46.324402778 -0700
[email protected]@ -158,8 +158,8 @@ use = egg:swift#healthcheck
[filter:recon]
use = egg:swift#recon
@@ -118,7 +118,7 @@
[object-replicator]
# You can override the default log routing for this app here (don't use set!):
[email protected]@ -186,7 +186,7 @@ use = egg:swift#recon
[email protected]@ -213,7 +213,7 @@ use = egg:swift#recon
# reclaim_age = 604800
#
# ring_check_interval = 15
@@ -127,7 +127,7 @@
#
# limits how long rsync error log lines are
# 0 means to log the entire line
[email protected]@ -247,7 +247,7 @@ use = egg:swift#recon
[email protected]@ -279,7 +279,7 @@ use = egg:swift#recon
# slowdown will sleep that amount between objects
# slowdown = 0.01
#
@@ -136,7 +136,7 @@
[object-auditor]
# You can override the default log routing for this app here (don't use set!):
[email protected]@ -264,7 +264,7 @@ use = egg:swift#recon
[email protected]@ -299,7 +299,7 @@ use = egg:swift#recon
# bytes_per_second = 10000000
# log_time = 3600
# zero_byte_files_per_second = 50
@@ -145,8 +145,8 @@
# Takes a comma separated list of ints. If set, the object auditor will
# increment a counter for every object whose size is <= to the given break
---- swift-2.3.0/swift/account/auditor.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/account/auditor.py 2016-02-08 00:56:36.134366990 -0800
+--- swift-2.7.0/swift/account/auditor.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/account/auditor.py 2016-08-08 19:54:46.317895668 -0700
@@ -46,7 +46,7 @@ class AccountAuditor(Daemon):
swift.common.db.DB_PREALLOCATION = \
config_true_value(conf.get('db_preallocation', 'f'))
@@ -156,9 +156,9 @@
self.rcache = os.path.join(self.recon_cache_path, "account.recon")
def _one_audit_pass(self, reported):
---- swift-2.3.0/swift/common/db_replicator.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/common/db_replicator.py 2016-02-08 00:56:36.135027676 -0800
[email protected]@ -172,7 +172,7 @@ class Replicator(Daemon):
+--- swift-2.7.0/swift/common/db_replicator.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/common/db_replicator.py 2016-08-08 19:54:46.321528243 -0700
[email protected]@ -186,7 +186,7 @@ class Replicator(Daemon):
config_true_value(conf.get('db_preallocation', 'f'))
self._zero_stats()
self.recon_cache_path = conf.get('recon_cache_path',
@@ -167,17 +167,17 @@
self.recon_replicator = '%s.recon' % self.server_type
self.rcache = os.path.join(self.recon_cache_path,
self.recon_replicator)
---- swift-2.3.0/swift/common/middleware/recon.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/common/middleware/recon.py 2016-02-08 00:59:32.515208787 -0800
[email protected]@ -15,6 +15,7 @@
-
+--- swift-2.7.0/swift/common/middleware/recon.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/common/middleware/recon.py 2016-08-08 19:54:46.320913874 -0700
[email protected]@ -16,6 +16,7 @@
import errno
+ import json
import os
+import sys
+ import time
from swift import gettext_ as _
- from swift import __version__ as swiftver
[email protected]@ -46,7 +47,7 @@ class ReconMiddleware(object):
[email protected]@ -49,7 +50,7 @@ class ReconMiddleware(object):
swift_dir = conf.get('swift_dir', '/etc/swift')
self.logger = get_logger(conf, log_route='recon')
self.recon_cache_path = conf.get('recon_cache_path',
@@ -186,7 +186,7 @@
self.object_recon_cache = os.path.join(self.recon_cache_path,
'object.recon')
self.container_recon_cache = os.path.join(self.recon_cache_path,
[email protected]@ -92,28 +93,44 @@ class ReconMiddleware(object):
[email protected]@ -97,28 +98,44 @@ class ReconMiddleware(object):
def get_mounted(self, openr=open):
"""get ALL mounted fs from /proc/mounts"""
mounts = []
@@ -238,8 +238,8 @@
meminfo = {}
with openr('/proc/meminfo', 'r') as memlines:
for i in memlines:
---- swift-2.3.0/swift/container/auditor.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/container/auditor.py 2016-02-08 00:56:36.136109394 -0800
+--- swift-2.7.0/swift/container/auditor.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/container/auditor.py 2016-08-08 19:54:46.316858635 -0700
@@ -44,7 +44,7 @@ class ContainerAuditor(Daemon):
swift.common.db.DB_PREALLOCATION = \
config_true_value(conf.get('db_preallocation', 'f'))
@@ -249,9 +249,9 @@
self.rcache = os.path.join(self.recon_cache_path, "container.recon")
def _one_audit_pass(self, reported):
---- swift-2.3.0/swift/container/updater.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/container/updater.py 2016-02-08 00:56:36.136593440 -0800
[email protected]@ -60,7 +60,7 @@ class ContainerUpdater(Daemon):
+--- swift-2.7.0/swift/container/updater.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/container/updater.py 2016-08-08 19:54:46.317391251 -0700
[email protected]@ -61,7 +61,7 @@ class ContainerUpdater(Daemon):
swift.common.db.DB_PREALLOCATION = \
config_true_value(conf.get('db_preallocation', 'f'))
self.recon_cache_path = conf.get('recon_cache_path',
@@ -260,20 +260,20 @@
self.rcache = os.path.join(self.recon_cache_path, "container.recon")
self.user_agent = 'container-updater %s' % os.getpid()
---- swift-2.3.0/swift/obj/auditor.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/obj/auditor.py 2016-02-08 00:56:36.137103648 -0800
[email protected]@ -227,7 +227,7 @@ class ObjectAuditor(Daemon):
+--- swift-2.7.0/swift/obj/auditor.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/obj/auditor.py 2016-08-08 19:54:46.319194261 -0700
[email protected]@ -279,7 +279,7 @@ class ObjectAuditor(Daemon):
self.conf_zero_byte_fps = int(
conf.get('zero_byte_files_per_second', 50))
self.recon_cache_path = conf.get('recon_cache_path',
- '/var/cache/swift')
+ '/var/lib/swift/recon-cache')
self.rcache = os.path.join(self.recon_cache_path, "object.recon")
+ self.interval = int(conf.get('interval', 30))
- def _sleep(self):
---- swift-2.3.0/swift/obj/expirer.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/obj/expirer.py 2016-02-08 00:56:36.137585778 -0800
[email protected]@ -57,7 +57,7 @@ class ObjectExpirer(Daemon):
+--- swift-2.7.0/swift/obj/expirer.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/obj/expirer.py 2016-08-08 19:54:46.319696124 -0700
[email protected]@ -58,7 +58,7 @@ class ObjectExpirer(Daemon):
self.report_first_time = self.report_last_time = time()
self.report_objects = 0
self.recon_cache_path = conf.get('recon_cache_path',
@@ -282,9 +282,9 @@
self.rcache = join(self.recon_cache_path, 'object.recon')
self.concurrency = int(conf.get('concurrency', 1))
if self.concurrency < 1:
---- swift-2.3.0/swift/obj/replicator.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/obj/replicator.py 2016-02-08 00:56:36.138119411 -0800
[email protected]@ -79,7 +79,7 @@ class ObjectReplicator(Daemon):
+--- swift-2.7.0/swift/obj/replicator.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/obj/replicator.py 2016-08-08 19:54:46.318623762 -0700
[email protected]@ -96,7 +96,7 @@ class ObjectReplicator(Daemon):
self.http_timeout = int(conf.get('http_timeout', 60))
self.lockup_timeout = int(conf.get('lockup_timeout', 1800))
self.recon_cache_path = conf.get('recon_cache_path',
@@ -293,8 +293,8 @@
self.rcache = os.path.join(self.recon_cache_path, "object.recon")
self.conn_timeout = float(conf.get('conn_timeout', 0.5))
self.node_timeout = float(conf.get('node_timeout', 10))
---- swift-2.3.0/swift/obj/updater.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/obj/updater.py 2016-02-08 00:56:36.138592637 -0800
+--- swift-2.7.0/swift/obj/updater.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/obj/updater.py 2016-08-08 19:54:46.320189490 -0700
@@ -53,7 +53,7 @@ class ObjectUpdater(Daemon):
self.successes = 0
self.failures = 0
@@ -304,34 +304,37 @@
self.rcache = os.path.join(self.recon_cache_path, 'object.recon')
def _listdir(self, path):
---- swift-2.3.0/test/unit/common/middleware/test_recon.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/test/unit/common/middleware/test_recon.py 2016-02-08 01:01:12.393031484 -0800
[email protected]@ -21,7 +21,9 @@ import array
- from swift.common import ring, utils
- from shutil import rmtree
+--- swift-2.7.0/test/unit/common/middleware/test_recon.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/test/unit/common/middleware/test_recon.py 2016-08-08 19:54:46.325993628 -0700
[email protected]@ -17,10 +17,12 @@ import array
+ from contextlib import contextmanager
+ import mock
import os
+import sys
- import mock
+ from posix import stat_result, statvfs_result
+ from shutil import rmtree
+ import unittest
+ from unittest import TestCase
+from nose import SkipTest
from swift import __version__ as swiftver
- from swift.common.swob import Request
[email protected]@ -387,10 +389,12 @@ class TestReconSuccess(TestCase):
+ from swift.common import ring, utils
[email protected]@ -543,10 +545,12 @@ class TestReconSuccess(TestCase):
{'device': 'none', 'path': '/proc/fs/vmblock/mountPoint'}]
oart = OpenAndReadTester(mounts_content)
rv = self.app.get_mounted(openr=oart.open)
-- self.assertEquals(oart.open_calls, [(('/proc/mounts', 'r'), {})])
-+ self.assertEquals(oart.open_calls, [(('/etc/mnttab', 'r'), {})])
- self.assertEquals(rv, mounted_resp)
+- self.assertEqual(oart.open_calls, [(('/proc/mounts', 'r'), {})])
++ self.assertEqual(oart.open_calls, [(('/etc/mnttab', 'r'), {})])
+ self.assertEqual(rv, mounted_resp)
def test_get_load(self):
+ if sys.platform == 'sunos5':
+ raise SkipTest
oart = OpenAndReadTester(['0.03 0.03 0.00 1/220 16306'])
rv = self.app.get_load(openr=oart.open)
- self.assertEquals(oart.read_calls, [((), {})])
[email protected]@ -400,6 +404,8 @@ class TestReconSuccess(TestCase):
- '1m': 0.029999999999999999})
+ self.assertEqual(oart.read_calls, [((), {})])
[email protected]@ -556,6 +560,8 @@ class TestReconSuccess(TestCase):
+ '1m': 0.029999999999999999})
def test_get_mem(self):
+ if sys.platform == 'sunos5':
@@ -339,89 +342,122 @@
meminfo_content = ['MemTotal: 505840 kB',
'MemFree: 26588 kB',
'Buffers: 44948 kB',
[email protected]@ -514,7 +520,8 @@ class TestReconSuccess(TestCase):
- self.assertEquals(self.fakecache.fakeout_calls,
- [((['replication_time', 'replication_stats',
- 'replication_last'],
-- '/var/cache/swift/account.recon'), {})])
[email protected]@ -650,7 +656,7 @@ class TestReconSuccess(TestCase):
+ rv = self.app.get_async_info()
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['async_pending'],
+- '/var/cache/swift/object.recon'), {})])
++ '/var/lib/swift/recon-cache/object.recon'), {})])
+ self.assertEqual(rv, {'async_pending': 5})
+
+ def test_get_replication_info_account(self):
[email protected]@ -673,7 +679,8 @@ class TestReconSuccess(TestCase):
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['replication_time', 'replication_stats',
+ 'replication_last'],
+- '/var/cache/swift/account.recon'), {})])
+ '/var/lib/swift/recon-cache/account.recon'),
+ {})])
- self.assertEquals(rv, {
+ self.assertEqual(rv, {
"replication_stats": {
"attempted": 1, "diff": 0,
[email protected]@ -545,7 +552,8 @@ class TestReconSuccess(TestCase):
- self.assertEquals(self.fakecache.fakeout_calls,
- [((['replication_time', 'replication_stats',
- 'replication_last'],
-- '/var/cache/swift/container.recon'), {})])
-+ '/var/lib/swift/recon-cache/container.recon'),
-+ {})])
- self.assertEquals(rv, {
- "replication_time": 200.0,
- "replication_stats": {
[email protected]@ -567,7 +575,7 @@ class TestReconSuccess(TestCase):
- self.assertEquals(self.fakecache.fakeout_calls,
- [((['object_replication_time',
- 'object_replication_last'],
-- '/var/cache/swift/object.recon'), {})])
-+ '/var/lib/swift/recon-cache/object.recon'), {})])
- self.assertEquals(rv, {'object_replication_time': 200.0,
- 'object_replication_last': 1357962809.15})
-
[email protected]@ -578,7 +586,8 @@ class TestReconSuccess(TestCase):
- rv = self.app.get_updater_info('container')
- self.assertEquals(self.fakecache.fakeout_calls,
- [((['container_updater_sweep'],
[email protected]@ -710,7 +717,8 @@ class TestReconSuccess(TestCase):
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['replication_time', 'replication_stats',
+ 'replication_last'],
- '/var/cache/swift/container.recon'), {})])
+ '/var/lib/swift/recon-cache/container.recon'),
+ {})])
- self.assertEquals(rv, {"container_updater_sweep": 18.476239919662476})
+ self.assertEqual(rv, {
+ "replication_time": 200.0,
+ "replication_stats": {
[email protected]@ -747,7 +755,8 @@ class TestReconSuccess(TestCase):
+ [((['replication_time', 'replication_stats',
+ 'replication_last', 'object_replication_time',
+ 'object_replication_last'],
+- '/var/cache/swift/object.recon'), {})])
++ '/var/lib/swift/recon-cache/container.recon'),
++ {})])
+ self.assertEqual(rv, {
+ "replication_time": 0.2615511417388916,
+ "replication_stats": {
[email protected]@ -773,7 +782,8 @@ class TestReconSuccess(TestCase):
+ rv = self.app.get_updater_info('container')
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['container_updater_sweep'],
+- '/var/cache/swift/container.recon'), {})])
++ '/var/lib/swift/recon-cache/container.recon'),
++ {})])
+ self.assertEqual(rv, {"container_updater_sweep": 18.476239919662476})
def test_get_updater_info_object(self):
[email protected]@ -588,7 +597,7 @@ class TestReconSuccess(TestCase):
[email protected]@ -783,7 +793,8 @@ class TestReconSuccess(TestCase):
rv = self.app.get_updater_info('object')
- self.assertEquals(self.fakecache.fakeout_calls,
- [((['object_updater_sweep'],
-- '/var/cache/swift/object.recon'), {})])
-+ '/var/lib/swift/recon-cache/object.recon'), {})])
- self.assertEquals(rv, {"object_updater_sweep": 0.79848217964172363})
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['object_updater_sweep'],
+- '/var/cache/swift/object.recon'), {})])
++ '/var/lib/swift/recon-cache/object.recon'),
++ {})])
+ self.assertEqual(rv, {"object_updater_sweep": 0.79848217964172363})
+
+ def test_get_updater_info_unrecognized(self):
[email protected]@ -798,7 +809,8 @@ class TestReconSuccess(TestCase):
+ rv = self.app.get_expirer_info('object')
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['object_expiration_pass', 'expired_last_pass'],
+- '/var/cache/swift/object.recon'), {})])
++ '/var/lib/swift/recon-cache/object.recon'),
++ {})])
+ self.assertEqual(rv, from_cache_response)
- def test_get_expirer_info_object(self):
[email protected]@ -615,7 +624,8 @@ class TestReconSuccess(TestCase):
- 'account_auditor_pass_completed',
- 'account_audits_since',
- 'account_audits_failed'],
-- '/var/cache/swift/account.recon'), {})])
-+ '/var/lib/swift/recon-cache/account.recon'),
-+ {})])
- self.assertEquals(rv, {"account_auditor_pass_completed": 0.24,
- "account_audits_failed": 0,
- "account_audits_passed": 6,
[email protected]@ -634,7 +644,8 @@ class TestReconSuccess(TestCase):
- 'container_auditor_pass_completed',
- 'container_audits_since',
- 'container_audits_failed'],
-- '/var/cache/swift/container.recon'), {})])
-+ '/var/lib/swift/recon-cache/container.recon'),
-+ {})])
- self.assertEquals(rv, {"container_auditor_pass_completed": 0.24,
- "container_audits_failed": 0,
- "container_audits_passed": 6,
[email protected]@ -662,7 +673,7 @@ class TestReconSuccess(TestCase):
- self.assertEquals(self.fakecache.fakeout_calls,
- [((['object_auditor_stats_ALL',
- 'object_auditor_stats_ZBF'],
-- '/var/cache/swift/object.recon'), {})])
-+ '/var/lib/swift/recon-cache/object.recon'), {})])
- self.assertEquals(rv, {
+ def test_get_auditor_info_account(self):
[email protected]@ -814,7 +826,8 @@ class TestReconSuccess(TestCase):
+ 'account_auditor_pass_completed',
+ 'account_audits_since',
+ 'account_audits_failed'],
+- '/var/cache/swift/account.recon'), {})])
++ '/var/lib/swift/recon-cache/account.recon'),
++ {})])
+ self.assertEqual(rv, {"account_auditor_pass_completed": 0.24,
+ "account_audits_failed": 0,
+ "account_audits_passed": 6,
[email protected]@ -833,7 +846,8 @@ class TestReconSuccess(TestCase):
+ 'container_auditor_pass_completed',
+ 'container_audits_since',
+ 'container_audits_failed'],
+- '/var/cache/swift/container.recon'), {})])
++ '/var/lib/swift/recon-cache/container.recon'),
++ {})])
+ self.assertEqual(rv, {"container_auditor_pass_completed": 0.24,
+ "container_audits_failed": 0,
+ "container_audits_passed": 6,
[email protected]@ -861,7 +875,8 @@ class TestReconSuccess(TestCase):
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['object_auditor_stats_ALL',
+ 'object_auditor_stats_ZBF'],
+- '/var/cache/swift/object.recon'), {})])
++ '/var/lib/swift/recon-cache/object.recon'),
++ {})])
+ self.assertEqual(rv, {
"object_auditor_stats_ALL": {
"audit_time": 115.14418768882751,
[email protected]@ -709,7 +720,7 @@ class TestReconSuccess(TestCase):
- self.assertEquals(self.fakecache.fakeout_calls,
- [((['object_auditor_stats_ALL',
- 'object_auditor_stats_ZBF'],
-- '/var/cache/swift/object.recon'), {})])
-+ '/var/lib/swift/recon-cache/object.recon'), {})])
- self.assertEquals(rv, {
[email protected]@ -908,7 +923,8 @@ class TestReconSuccess(TestCase):
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['object_auditor_stats_ALL',
+ 'object_auditor_stats_ZBF'],
+- '/var/cache/swift/object.recon'), {})])
++ '/var/lib/swift/recon-cache/object.recon'),
++ {})])
+ self.assertEqual(rv, {
"object_auditor_stats_ALL": {
'disk1': {
[email protected]@ -1097,7 +1113,8 @@ class TestReconSuccess(TestCase):
+ rv = self.app.get_driveaudit_error()
+ self.assertEqual(self.fakecache.fakeout_calls,
+ [((['drive_audit_errors'],
+- '/var/cache/swift/drive.recon'), {})])
++ '/var/lib/swift/recon-cache/drive.recon'),
++ {})])
+ self.assertEqual(rv, {'drive_audit_errors': 7})
+
+ def test_get_time(self):
--- a/components/openstack/swift/patches/remove_PyECLib.patch Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/patches/remove_PyECLib.patch Wed Sep 07 14:48:42 2016 -0700
@@ -3,27 +3,10 @@
This patch is Solaris-specific and not suitable for upstream.
---- swift-2.3.0/requirements.txt.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/requirements.txt 2016-02-10 22:26:24.654342455 -0800
[email protected]@ -9,4 +9,3 @@ netifaces>=0.5,!=0.10.0,!=0.10.1
- pastedeploy>=1.3.3
- simplejson>=2.0.9
- xattr>=0.4
--PyECLib>=1.0.7
---- swift-2.3.0/swift.egg-info/requires.txt.~1~ 2015-04-30 06:59:12.000000000 -0700
-+++ swift-2.3.0/swift.egg-info/requires.txt 2016-02-10 22:26:28.217050442 -0800
[email protected]@ -4,5 +4,4 @@ greenlet>=0.3.1
- netifaces>=0.5,!=0.10.0,!=0.10.1
- pastedeploy>=1.3.3
- simplejson>=2.0.9
--xattr>=0.4
--PyECLib>=1.0.7
-+xattr>=0.4
-\ No newline at end of file
---- swift-2.3.0/swift/common/storage_policy.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/swift/common/storage_policy.py 2016-02-10 22:26:24.656850844 -0800
[email protected]@ -19,7 +19,12 @@ from swift.common.utils import config_tr
- from swift.common.ring import Ring
+--- swift-2.7.0/swift/common/storage_policy.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/common/storage_policy.py 2016-08-08 19:02:28.033539550 -0700
[email protected]@ -22,7 +22,12 @@ from swift.common.utils import (
+ from swift.common.ring import Ring, RingData
from swift.common.utils import quorum_size
from swift.common.exceptions import RingValidationError
-from pyeclib.ec_iface import ECDriver, ECDriverError, VALID_EC_TYPES
@@ -35,19 +18,19 @@
+ pass
LEGACY_POLICY_NAME = 'Policy-0'
- VALID_CHARS = '-' + string.letters + string.digits
---- swift-2.3.0/swift/proxy/controllers/obj.py.~2~ 2016-02-10 22:26:24.472991667 -0800
-+++ swift-2.3.0/swift/proxy/controllers/obj.py 2016-02-10 22:26:24.659144290 -0800
[email protected]@ -60,7 +60,7 @@ from swift.common.http import (
- HTTP_SERVICE_UNAVAILABLE, HTTP_INSUFFICIENT_STORAGE,
- HTTP_PRECONDITION_FAILED, HTTP_CONFLICT, is_informational)
+ VALID_CHARS = '-' + string.ascii_letters + string.digits
+--- swift-2.7.0/swift/proxy/controllers/obj.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/swift/proxy/controllers/obj.py 2016-08-08 19:02:28.035065785 -0700
[email protected]@ -65,7 +65,7 @@ from swift.common.http import (
+ HTTP_INSUFFICIENT_STORAGE, HTTP_PRECONDITION_FAILED, HTTP_CONFLICT,
+ HTTP_UNPROCESSABLE_ENTITY, HTTP_REQUESTED_RANGE_NOT_SATISFIABLE)
from swift.common.storage_policy import (POLICIES, REPL_POLICY, EC_POLICY,
- ECDriverError, PolicyError)
+ PolicyError)
from swift.proxy.controllers.base import Controller, delay_denial, \
- cors_validation
+ cors_validation, ResumingGetter
from swift.common.swob import HTTPAccepted, HTTPBadRequest, HTTPNotFound, \
[email protected]@ -70,6 +70,12 @@ from swift.common.swob import HTTPAccept
[email protected]@ -76,6 +76,12 @@ from swift.common.swob import HTTPAccept
from swift.common.request_helpers import is_sys_or_user_meta, is_sys_meta, \
remove_items, copy_header_subset
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/requirements.patch Wed Sep 07 14:48:42 2016 -0700
@@ -0,0 +1,34 @@
+In-house patch to remove unnecessary dependencies from Heat's
+requirements files. The specific reasons are as follows:
+
+dnspython3 Not applicable to Solaris
+
+--- swift-2.7.0/requirements.txt.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/requirements.txt 2016-08-08 17:21:52.277804965 -0700
[email protected]@ -2,12 +2,10 @@
+ # of appearance. Changing the order has an impact on the overall integration
+ # process, which may cause wedges in the gate later.
+
+-dnspython>=1.12.0;python_version<'3.0'
+-dnspython3>=1.12.0;python_version>='3.0'
++dnspython>=1.12.0
+ eventlet>=0.17.4 # MIT
+ greenlet>=0.3.1
+ netifaces>=0.5,!=0.10.0,!=0.10.1
+ pastedeploy>=1.3.3
+ six>=1.9.0
+ xattr>=0.4
+-PyECLib>=1.2.0 # BSD
+--- swift-2.7.0/swift.egg-info/requires.txt.~1~ 2016-03-25 02:44:40.000000000 -0700
++++ swift-2.7.0/swift.egg-info/requires.txt 2016-08-08 17:20:12.178152517 -0700
[email protected]@ -4,10 +4,4 @@ netifaces>=0.5,!=0.10.0,!=0.10.1
+ pastedeploy>=1.3.3
+ six>=1.9.0
+ xattr>=0.4
+-PyECLib>=1.2.0
+-
+-[:(python_version<'3.0')]
+ dnspython>=1.12.0
+-
+-[:(python_version>='3.0')]
+-dnspython3>=1.12.0
--- a/components/openstack/swift/patches/rlimit_nproc.patch Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/patches/rlimit_nproc.patch Wed Sep 07 14:48:42 2016 -0700
@@ -7,20 +7,20 @@
appropriate for upstream (but has not been submitted), depending on whether
RLIMIT_NPROC is unavailable on any platforms other than Solaris.
---- swift-2.3.0/swift/common/manager.py.~2~ 2016-02-08 01:15:05.393368607 -0800
-+++ swift-2.3.0/swift/common/manager.py 2016-02-08 01:15:05.487373162 -0800
[email protected]@ -76,6 +76,8 @@ def setup_env():
+--- swift-2.7.0/swift/common/manager.py.~2~ 2016-08-08 19:02:27.957723715 -0700
++++ swift-2.7.0/swift/common/manager.py 2016-08-08 19:02:28.057288615 -0700
[email protected]@ -81,6 +81,8 @@ def setup_env():
except ValueError:
- print _("WARNING: Unable to modify max process limit. "
- "Running as non-root?")
+ print(_("WARNING: Unable to modify max process limit. "
+ "Running as non-root?"))
+ except AttributeError:
+ pass
# Set PYTHON_EGG_CACHE if it isn't already set
os.environ.setdefault('PYTHON_EGG_CACHE', '/tmp')
---- swift-2.3.0/test/unit/common/test_manager.py.~2~ 2016-02-08 01:15:05.394490747 -0800
-+++ swift-2.3.0/test/unit/common/test_manager.py 2016-02-08 01:20:25.280013617 -0800
[email protected]@ -105,9 +105,10 @@ class TestManagerModule(unittest.TestCas
+--- swift-2.7.0/test/unit/common/test_manager.py.~2~ 2016-08-08 19:02:27.958990495 -0700
++++ swift-2.7.0/test/unit/common/test_manager.py 2016-08-08 19:02:28.058387965 -0700
[email protected]@ -107,9 +107,10 @@ class TestManagerModule(unittest.TestCas
manager.MAX_DESCRIPTORS)),
(resource.RLIMIT_DATA, (manager.MAX_MEMORY,
manager.MAX_MEMORY)),
@@ -30,6 +30,6 @@
+ if getattr(resource, "RLIMIT_NPROC", None):
+ expected.append((resource.RLIMIT_NPROC,
+ (manager.MAX_PROCS, manager.MAX_PROCS)))
- self.assertEquals(manager.resource.called_with_args, expected)
+ self.assertEqual(manager.resource.called_with_args, expected)
self.assertTrue(
manager.os.environ['PYTHON_EGG_CACHE'].startswith('/tmp'))
--- a/components/openstack/swift/patches/test.patch Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/patches/test.patch Wed Sep 07 14:48:42 2016 -0700
@@ -21,9 +21,9 @@
the test should fork a separate process to test the lock, which should work
regardless of the OS.
---- swift-2.3.0/test/sample.conf.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/test/sample.conf 2016-02-08 01:24:17.841343735 -0800
[email protected]@ -87,17 +87,17 @@ fake_syslog = False
+--- swift-2.7.0/test/sample.conf.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/test/sample.conf 2016-08-08 19:02:28.069576150 -0700
[email protected]@ -94,18 +94,18 @@ fake_syslog = False
# Note that the cluster must have "sane" values for the test suite to pass
# (for some definition of sane).
#
@@ -33,6 +33,7 @@
-#max_meta_count = 90
-#max_meta_overall_size = 4096
-#max_header_size = 8192
+-#extra_header_count = 0
-#max_object_name_length = 1024
-#container_listing_limit = 10000
-#account_listing_limit = 10000
@@ -44,6 +45,7 @@
+max_meta_count = 90
+max_meta_overall_size = 4096
+max_header_size = 8192
++extra_header_count = 0
+max_object_name_length = 1024
+container_listing_limit = 10000
+account_listing_limit = 10000
@@ -52,28 +54,28 @@
# Newer swift versions default to strict cors mode, but older ones were the
# opposite.
---- swift-2.3.0/test/unit/__init__.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/test/unit/__init__.py 2016-02-08 01:24:17.842339594 -0800
[email protected]@ -817,7 +817,7 @@ def fake_http_connect(*code_iter, **kwar
+--- swift-2.7.0/test/unit/__init__.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/test/unit/__init__.py 2016-08-08 19:02:28.070402665 -0700
[email protected]@ -903,7 +903,7 @@ def fake_http_connect(*code_iter, **kwar
etag = '"68b329da9893e34099c7d8ad5cb9c940"'
- headers = swob.HeaderKeyDict({
+ headers = HeaderKeyDict({
- 'content-length': len(self.body),
+ 'content-length': self.body.__len__(),
'content-type': 'x-application/test',
'x-timestamp': self.timestamp,
'x-backend-timestamp': self.timestamp,
---- swift-2.3.0/test/unit/common/test_utils.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/test/unit/common/test_utils.py 2016-02-08 01:24:17.844724978 -0800
[email protected]@ -53,6 +53,7 @@ from functools import partial
+--- swift-2.7.0/test/unit/common/test_utils.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/test/unit/common/test_utils.py 2016-08-08 19:02:28.072989400 -0700
[email protected]@ -54,6 +54,7 @@ from functools import partial
from tempfile import TemporaryFile, NamedTemporaryFile, mkdtemp
from netifaces import AF_INET6
from mock import MagicMock, patch
+from nose import SkipTest
+ from six.moves.configparser import NoSectionError, NoOptionError
- from swift.common.exceptions import (Timeout, MessageTimeout,
- ConnectionTimeout, LockTimeout,
[email protected]@ -748,6 +749,8 @@ class TestUtils(unittest.TestCase):
+ from swift.common.exceptions import Timeout, MessageTimeout, \
[email protected]@ -916,6 +917,8 @@ class TestUtils(unittest.TestCase):
utils.HASH_PATH_PREFIX = 'startcap'
def test_lock_path(self):
@@ -82,7 +84,7 @@
tmpdir = mkdtemp()
try:
with utils.lock_path(tmpdir, 0.1):
[email protected]@ -764,6 +767,8 @@ class TestUtils(unittest.TestCase):
[email protected]@ -932,6 +935,8 @@ class TestUtils(unittest.TestCase):
shutil.rmtree(tmpdir)
def test_lock_path_num_sleeps(self):
@@ -91,7 +93,7 @@
tmpdir = mkdtemp()
num_short_calls = [0]
exception_raised = [False]
[email protected]@ -788,6 +793,8 @@ class TestUtils(unittest.TestCase):
[email protected]@ -956,6 +961,8 @@ class TestUtils(unittest.TestCase):
self.assertTrue(exception_raised[0])
def test_lock_path_class(self):
@@ -100,7 +102,7 @@
tmpdir = mkdtemp()
try:
with utils.lock_path(tmpdir, 0.1, ReplicationLockTimeout):
[email protected]@ -1214,7 +1221,8 @@ class TestUtils(unittest.TestCase):
[email protected]@ -1405,7 +1412,8 @@ class TestUtils(unittest.TestCase):
}, 'server', log_route='server')
expected_args = [((), {'address': '/dev/log',
'facility': orig_sysloghandler.LOG_LOCAL3})]
@@ -110,7 +112,7 @@
os.path.isfile('/dev/log') or \
os.path.isdir('/dev/log'):
# Since socket on OSX is in /var/run/syslog, there will be
[email protected]@ -2402,6 +2410,8 @@ cluster_dfw1 = http://dfw1.host/v1/
[email protected]@ -2726,6 +2734,8 @@ cluster_dfw1 = http://dfw1.host/v1/
MagicMock(side_effect=BaseException('test3')))
def test_lock_file(self):
@@ -119,7 +121,7 @@
flags = os.O_CREAT | os.O_RDWR
with NamedTemporaryFile(delete=False) as nt:
nt.write("test string")
[email protected]@ -2480,6 +2490,8 @@ cluster_dfw1 = http://dfw1.host/v1/
[email protected]@ -2805,6 +2815,8 @@ cluster_dfw1 = http://dfw1.host/v1/
os.fstat(f.fileno()).st_ino)
def test_lock_file_held_on_unlink(self):
@@ -128,7 +130,7 @@
os_unlink = os.unlink
def flocking_unlink(filename):
[email protected]@ -2496,6 +2508,8 @@ cluster_dfw1 = http://dfw1.host/v1/
[email protected]@ -2821,6 +2833,8 @@ cluster_dfw1 = http://dfw1.host/v1/
pass
def test_lock_file_no_unlink_if_fail(self):
@@ -137,17 +139,17 @@
os_open = os.open
with NamedTemporaryFile(delete=True) as nt:
---- swift-2.3.0/test/unit/obj/test_diskfile.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/test/unit/obj/test_diskfile.py 2016-02-08 01:24:17.846568734 -0800
+--- swift-2.7.0/test/unit/obj/test_diskfile.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/test/unit/obj/test_diskfile.py 2016-08-08 19:02:28.075330000 -0700
@@ -18,6 +18,7 @@
- import cPickle as pickle
+ import six.moves.cPickle as pickle
import os
+import sys
import errno
import itertools
- import mock
[email protected]@ -608,6 +609,8 @@ class DiskFileManagerMixin(BaseDiskFileT
+ from unittest.util import safe_repr
[email protected]@ -718,6 +719,8 @@ class DiskFileManagerMixin(BaseDiskFileT
self.assertEqual(locations, [])
def test_replication_lock_on(self):
@@ -156,9 +158,9 @@
# Double check settings
self.df_mgr.replication_one_per_device = True
self.df_mgr.replication_lock_timeout = 0.1
---- swift-2.3.0/test/unit/proxy/test_server.py.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/test/unit/proxy/test_server.py 2016-02-08 01:24:17.849738022 -0800
[email protected]@ -4263,6 +4263,9 @@ class TestObjectController(unittest.Test
+--- swift-2.7.0/test/unit/proxy/test_server.py.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/test/unit/proxy/test_server.py 2016-08-08 19:02:28.078178485 -0700
[email protected]@ -4860,6 +4860,9 @@ class TestObjectController(unittest.Test
class LargeResponseBody(object):
@@ -168,7 +170,7 @@
def __len__(self):
return constraints.MAX_FILE_SIZE + 1
[email protected]@ -4510,6 +4513,9 @@ class TestObjectController(unittest.Test
[email protected]@ -5107,6 +5110,9 @@ class TestObjectController(unittest.Test
class LargeResponseBody(object):
@@ -178,7 +180,7 @@
def __len__(self):
return constraints.MAX_FILE_SIZE + 1
[email protected]@ -4537,6 +4543,9 @@ class TestObjectController(unittest.Test
[email protected]@ -5134,6 +5140,9 @@ class TestObjectController(unittest.Test
class LargeResponseBody(object):
--- a/components/openstack/swift/patches/workers.patch Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/patches/workers.patch Wed Sep 07 14:48:42 2016 -0700
@@ -3,8 +3,8 @@
the number of CPUs (cores) found may not be efficient on a system with
a large number of cores. This patch is not suitable for the upstream.
---- swift-2.3.0/etc/account-server.conf-sample.~2~ 2016-02-08 00:02:16.969218591 -0800
-+++ swift-2.3.0/etc/account-server.conf-sample 2016-02-08 00:02:17.037019168 -0800
+--- swift-2.7.0/etc/account-server.conf-sample.~2~ 2016-08-08 19:02:28.015815430 -0700
++++ swift-2.7.0/etc/account-server.conf-sample 2016-08-08 19:02:28.090297810 -0700
@@ -10,8 +10,9 @@ bind_port = 6002
# disable_fallocate = false
#
@@ -17,8 +17,8 @@
#
# Maximum concurrent requests per worker
# max_clients = 1024
---- swift-2.3.0/etc/container-server.conf-sample.~2~ 2016-02-08 00:02:16.969741046 -0800
-+++ swift-2.3.0/etc/container-server.conf-sample 2016-02-08 00:02:17.037565309 -0800
+--- swift-2.7.0/etc/container-server.conf-sample.~2~ 2016-08-08 19:02:28.016881720 -0700
++++ swift-2.7.0/etc/container-server.conf-sample 2016-08-08 19:02:28.090842415 -0700
@@ -10,8 +10,9 @@ bind_port = 6001
# disable_fallocate = false
#
@@ -31,22 +31,23 @@
#
# Maximum concurrent requests per worker
# max_clients = 1024
---- swift-2.3.0/etc/object-server.conf-sample.~2~ 2016-02-08 00:02:16.971225158 -0800
-+++ swift-2.3.0/etc/object-server.conf-sample 2016-02-08 00:02:17.038057162 -0800
[email protected]@ -12,8 +12,9 @@ bind_port = 6000
+--- swift-2.7.0/etc/object-server.conf-sample.~2~ 2016-08-08 19:02:28.018004470 -0700
++++ swift-2.7.0/etc/object-server.conf-sample 2016-08-08 19:02:28.091373715 -0700
[email protected]@ -12,9 +12,10 @@ bind_port = 6000
# expiring_objects_account_name = expiring_objects
#
# Use an integer to override the number of pre-forked processes that will
--# accept connections.
+-# accept connections. NOTE: if servers_per_port is set, this setting is
++# accept connections. Use "auto" or default for the number of effective cpu
++# cores in the system. NOTE: if servers_per_port is set, this setting is
+ # ignored.
-# workers = auto
-+# accept connections. Use "auto" or default for the number of effective cpu
-+# cores in the system.
+workers = 1
#
- # Maximum concurrent requests per worker
- # max_clients = 1024
---- swift-2.3.0/etc/proxy-server.conf-sample.~1~ 2015-04-30 06:57:42.000000000 -0700
-+++ swift-2.3.0/etc/proxy-server.conf-sample 2016-02-08 00:02:17.038685067 -0800
+ # Make object-server run this many worker processes per unique port of
+ # "local" ring devices across all storage policies. This can help provide
+--- swift-2.7.0/etc/proxy-server.conf-sample.~1~ 2016-03-25 02:42:55.000000000 -0700
++++ swift-2.7.0/etc/proxy-server.conf-sample 2016-08-08 19:39:35.918794285 -0700
@@ -23,10 +23,10 @@ bind_port = 8080
# disallowed_sections = swift.valid_api_versions, container_quotas, tempurl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/xattr-ENOENT.patch Wed Sep 07 14:48:42 2016 -0700
@@ -0,0 +1,26 @@
+This patch is not appropriate for upstream, since the problem doesn't exist
+on other platforms. RFE 23579927 has been filed for Solaris to be able to
+distinguish between a non-existent file an a missing extended attribute.
+
+--- swift-2.7.0/swift/obj/diskfile.py Fri Mar 25 02:42:55 2016
++++ swift-2.7.0/swift/obj/diskfile.py Tue Jun 14 09:10:30 2016
[email protected]@ -127,7 +127,18 @@
+ logging.exception(msg)
+ raise DiskFileXattrNotSupported(e)
+ if e.errno == errno.ENOENT:
+- raise DiskFileNotExist()
++ # Solaris returns ENOENT either if the file doesn't exist or if the
++ # attribute doesn't exist. If we've been passed an fd, then we
++ # already successfully opened the file, so the ENOENT refers to the
++ # missing attribute. But if we were passed a filename, then the
++ # error is ambiguous, so we test explicitly for the file's existence
++ # and raise DiskFileNotExist only if it doesn't.
++ if isinstance(fd, basestring):
++ try:
++ os.stat(fd)
++ except OSError as e:
++ if e.errno == errno.ENOENT:
++ raise DiskFileNotExist()
+ # TODO: we might want to re-raise errors that don't denote a missing
+ # xattr here. Seems to be ENODATA on linux and ENOATTR on BSD/OSX.
+ return pickle.loads(metadata)
--- a/components/openstack/swift/swift.p5m Wed Sep 07 14:48:42 2016 -0700
+++ b/components/openstack/swift/swift.p5m Wed Sep 07 14:48:42 2016 -0700
@@ -47,6 +47,7 @@
set name=pkg.summary value="OpenStack Swift (Object Storage Service)"
set name=pkg.description \
value="The OpenStack Object Store project, known as Swift, offers cloud storage software so that you can store and retrieve data in virtual containers"
+set name=pkg.human-version value="Mitaka $(COMPONENT_VERSION)"
set name=com.oracle.info.description \
value="Swift, the OpenStack object storage service"
set name=com.oracle.info.tpno value=$(TPNO)
@@ -55,12 +56,12 @@
value="org.opensolaris.category.2008:System/Enterprise Management" \
value=org.opensolaris.category.2008:System/Virtualization \
value="org.opensolaris.category.2008:Web Services/Application and Web Servers"
-set name=info.source-url value=$(COMPONENT_ARCHIVE_URL)
+set name=info.source-url value="$(GIT_REPO) $(GIT_COMMIT_ID)"
set name=info.upstream value="OpenStack <[email protected]>"
set name=info.upstream-url value=$(COMPONENT_PROJECT_URL)
set name=openstack.upgrade-id reboot-needed=true value=$(COMPONENT_BE_VERSION)
set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/050 \
- value=PSARC/2015/110 value=PSARC/2015/535
+ value=PSARC/2015/110 value=PSARC/2015/535 value=PSARC/2016/455
set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
file path=etc/security/auth_attr.d/cloud:openstack:swift
file path=etc/security/exec_attr.d/cloud:openstack:swift
@@ -115,19 +116,20 @@
file path=lib/svc/method/swift-proxy-server
file path=lib/svc/method/swift-replicator-rsync
file path=lib/svc/method/swift-upgrade
-file path=usr/bin/swift-account-audit
+file path=usr/bin/swift-account-audit pkg.depend.bypass-generate=.*/six.*
file path=usr/bin/swift-account-info
file path=usr/bin/swift-config
file path=usr/bin/swift-container-info
-file path=usr/bin/swift-dispersion-populate
-file path=usr/bin/swift-dispersion-report
+file path=usr/bin/swift-dispersion-populate pkg.depend.bypass-generate=.*/six.*
+file path=usr/bin/swift-dispersion-report pkg.depend.bypass-generate=.*/six.*
file path=usr/bin/swift-form-signature
file path=usr/bin/swift-get-nodes
file path=usr/bin/swift-object-info
file path=usr/bin/swift-recon
file path=usr/bin/swift-reconciler-enqueue
file path=usr/bin/swift-ring-builder
-file path=usr/bin/swift-temp-url
+file path=usr/bin/swift-ring-builder-analyzer
+file path=usr/bin/swift-temp-url pkg.depend.bypass-generate=.*/six.*
file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/PKG-INFO
file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/SOURCES.txt
file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt
@@ -148,6 +150,7 @@
file path=usr/lib/python$(PYVER)/vendor-packages/swift/cli/form_signature.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/cli/info.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/cli/recon.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/cli/ring_builder_analyzer.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/cli/ringbuilder.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/__init__.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/base_storage_server.py
@@ -159,6 +162,7 @@
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/db_replicator.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/direct_client.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/exceptions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/header_key_dict.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/http.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/internal_client.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/manager.py
@@ -188,6 +192,7 @@
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/staticweb.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/tempauth.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/tempurl.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/versioned_writes.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/x_profile/__init__.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/x_profile/exceptions.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/x_profile/html_viewer.py
@@ -210,6 +215,7 @@
file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/replicator.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/server.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/sync.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/sync_store.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/updater.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/obj/__init__.py
file path=usr/lib/python$(PYVER)/vendor-packages/swift/obj/auditor.py
@@ -248,7 +254,7 @@
file path=usr/lib/swift/swift-object-server
file path=usr/lib/swift/swift-object-updater
file path=usr/lib/swift/swift-proxy-server
-file path=usr/lib/swift/swift-recon-cron
+file path=usr/lib/swift/swift-recon-cron pkg.depend.bypass-generate=.*/six.*
file path=usr/share/man/man1/swift-account-auditor.1
file path=usr/share/man/man1/swift-account-info.1
file path=usr/share/man/man1/swift-account-reaper.1
@@ -289,8 +295,9 @@
#
license swift.license license="Apache v2.0"
-# To upgrade to Kilo version, Juno version of the package must be on the system
-depend type=origin fmri=cloud/openstack/[email protected] root-image=true
+# To upgrade to the Mitaka version, the Kilo version of the package
+# must be on the system
+depend type=origin fmri=cloud/openstack/[email protected] root-image=true
# force a dependency on package delivering rsync(1)
depend type=require fmri=__TBD pkg.debug.depend.file=usr/bin/rsync
@@ -317,5 +324,8 @@
# force a dependency on setuptools; pkgdepend work is needed to flush this out.
depend type=require fmri=library/python/setuptools-$(PYV)
+# force a dependency on six; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python/six-$(PYV)
+
# force a dependency on xattr; pkgdepend work is needed to flush this out.
depend type=require fmri=library/python/xattr-$(PYV)