From 7fe8cd16dc23a6d7af3e34cc678b09d0a7eff229 Mon Sep 17 00:00:00 2001
From: Daira Hopwood <daira@jacaranda.org>
Date: Thu, 21 Feb 2013 22:17:06 +0000
Subject: [PATCH] OpenStack: if we get a 401 Unauthorized response,
 reauthenticate immediately.

Signed-off-by: David-Sarah Hopwood <david-sarah@jacaranda.org>
---
 .../backends/cloud/openstack/openstack_container.py | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/allmydata/storage/backends/cloud/openstack/openstack_container.py b/src/allmydata/storage/backends/cloud/openstack/openstack_container.py
index 4e52dc07..7aedf175 100644
--- a/src/allmydata/storage/backends/cloud/openstack/openstack_container.py
+++ b/src/allmydata/storage/backends/cloud/openstack/openstack_container.py
@@ -9,6 +9,7 @@ from allmydata.util.deferredutil import eventually_callback, eventually_errback
 from twisted.internet.protocol import Protocol
 from twisted.web.client import Agent, FileBodyProducer, ResponseDone
 from twisted.web.http_headers import Headers
+from twisted.web.http import UNAUTHORIZED
 
 from zope.interface import implements, Interface
 
@@ -230,6 +231,10 @@ class AuthenticationClient(object):
         d.addCallback(lambda ign: self._auth_info)
         return d
 
+    def invalidate(self):
+        self._auth_info = None
+        self._reauthenticate()
+
     def _authenticate(self):
         (method, url, request_headers, body, need_response_body) = self._authenticator.make_auth_request()
 
@@ -311,6 +316,14 @@ class OpenStackContainer(ContainerRetryMixin):
         return "%s/%s/%s" % (auth_info.public_storage_url, urllib.quote(self._container_name, safe=''),
                              urllib.quote(object_name))
 
+    def _react_to_error(self, response_code):
+        if response_code == UNAUTHORIZED:
+            # Invalidate auth_info and retry.
+            self._auth_client.invalidate()
+            return True
+        else:
+            return ContainerRetryMixin._react_to_error(self, response_code)
+
     def _create(self):
         """
         Create this container.
-- 
2.45.2