From 67f5468ee485ac3480530df1e59f8f7f92071f66 Mon Sep 17 00:00:00 2001
From: Alistair Coles <alistair.coles@hpe.com>
Date: Mon, 22 Feb 2016 15:05:27 +0000
Subject: [PATCH] Fix wrong args for get_container with full listing

In client get_container(), when full_listing is true,
the calls back to get_container() pass service_token
as a positional arg which maps its value to the
full_listing arg. It should use a keyword.

Change-Id: Iac2af45df124ff33fcb7fbaf1ba959ef06c96378
Closes-Bug: #1496093
---
 swiftclient/client.py          |  4 ++--
 tests/unit/test_swiftclient.py | 22 ++++++++++++++++++++++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/swiftclient/client.py b/swiftclient/client.py
index 58fff7b8..ad3fd70f 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -769,7 +769,7 @@ def get_container(url, token, container, marker=None, limit=None,
     if full_listing:
         rv = get_container(url, token, container, marker, limit, prefix,
                            delimiter, end_marker, path, http_conn,
-                           service_token, headers=headers)
+                           service_token=service_token, headers=headers)
         listing = rv[1]
         while listing:
             if not delimiter:
@@ -778,7 +778,7 @@ def get_container(url, token, container, marker=None, limit=None,
                 marker = listing[-1].get('name', listing[-1].get('subdir'))
             listing = get_container(url, token, container, marker, limit,
                                     prefix, delimiter, end_marker, path,
-                                    http_conn, service_token,
+                                    http_conn, service_token=service_token,
                                     headers=headers)[1]
             if listing:
                 rv[1].extend(listing)
diff --git a/tests/unit/test_swiftclient.py b/tests/unit/test_swiftclient.py
index a2724650..e4876a1d 100644
--- a/tests/unit/test_swiftclient.py
+++ b/tests/unit/test_swiftclient.py
@@ -2382,6 +2382,28 @@ class TestServiceToken(MockHttpTest):
                              actual['full_path'])
         self.assertEqual(conn.attempts, 1)
 
+    def test_service_token_get_container_full_listing(self):
+        # verify service token is sent with each request for a full listing
+        with mock.patch('swiftclient.client.http_connection',
+                        self.fake_http_connection(200, 200)):
+            with mock.patch('swiftclient.client.parse_api_response') as resp:
+                resp.side_effect = ([{"name": "obj1"}], [])
+                conn = self.get_connection()
+                conn.get_container('container1', full_listing=True)
+        self.assertEqual(2, len(self.request_log), self.request_log)
+        expected_urls = iter((
+            'http://storage_url.com/container1?format=json',
+            'http://storage_url.com/container1?format=json&marker=obj1'
+        ))
+        for actual in self.iter_request_log():
+            self.assertEqual('GET', actual['method'])
+            actual_hdrs = actual['headers']
+            self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
+            self.assertEqual('token', actual_hdrs['X-Auth-Token'])
+            self.assertEqual(next(expected_urls),
+                             actual['full_path'])
+        self.assertEqual(conn.attempts, 1)
+
     def test_service_token_head_container(self):
         with mock.patch('swiftclient.client.http_connection',
                         self.fake_http_connection(200)):