24465859 Update Swift for the Mitaka release
authorLaszlo Peter <laszlo.peter@oracle.com>
Wed, 07 Sep 2016 14:48:42 -0700
changeset 6853 cf1567491b1b
parent 6852 bf55de364b19
child 6854 52081f923019
24465859 Update Swift for the Mitaka release
components/openstack/swift/Makefile
components/openstack/swift/files/proxy-server.conf
components/openstack/swift/patches/CVE-2015-5223.patch
components/openstack/swift/patches/CVE-2016-0737.patch
components/openstack/swift/patches/CVE-2016-0738.patch
components/openstack/swift/patches/manager.patch
components/openstack/swift/patches/manpages.patch
components/openstack/swift/patches/recon.patch
components/openstack/swift/patches/remove_PyECLib.patch
components/openstack/swift/patches/requirements.patch
components/openstack/swift/patches/rlimit_nproc.patch
components/openstack/swift/patches/test.patch
components/openstack/swift/patches/workers.patch
components/openstack/swift/patches/xattr-ENOENT.patch
components/openstack/swift/swift.p5m
--- 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)