From 9ad556f5984510b843b2b52c127af2fa804d98cf Mon Sep 17 00:00:00 2001 From: Dmitry Mescheryakov Date: Fri, 11 Apr 2014 02:59:08 +0400 Subject: [PATCH] Fix storing binaries in Swift * Swift does not work with Keystone API v3, so we need to always provide auth_url for API v2 to Swift. * We incorrectly parsed swift URL, which resulted in Sahara trying to get binaries from containers with '.sahara' suffix, while the suffix should be stripped. Closes-Bug: #1305210 Change-Id: I76dee756165e089bc408e584f3aa476c45ed6067 --- .../edp/binary_retrievers/internal_swift.py | 20 +++++++++++++++---- sahara/swift/utils.py | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/sahara/service/edp/binary_retrievers/internal_swift.py b/sahara/service/edp/binary_retrievers/internal_swift.py index 56fa9e6ab6..e2fb7ba243 100644 --- a/sahara/service/edp/binary_retrievers/internal_swift.py +++ b/sahara/service/edp/binary_retrievers/internal_swift.py @@ -18,20 +18,25 @@ import swiftclient import sahara.exceptions as ex from sahara.swift import utils as su -from sahara.utils.openstack import base CONF = cfg.CONF def _get_conn(user, password): - return swiftclient.Connection(base.retrieve_auth_url(), + return swiftclient.Connection(su.retrieve_auth_url(), user, password, tenant_name=CONF.os_admin_tenant_name, auth_version="2.0") +def _strip_sahara_suffix(container_name): + if container_name.endswith(su.SWIFT_URL_SUFFIX): + container_name = container_name[:-len(su.SWIFT_URL_SUFFIX)] + return container_name + + def get_raw_data(context, job_binary): user = job_binary.extra["user"] @@ -53,6 +58,9 @@ def get_raw_data(context, job_binary): # We are getting a whole container, return as a dictionary. container = names[0] + # if container name has '.sahara' suffix we need to strip it + container = _strip_sahara_suffix(container) + # First check the size... try: headers = conn.head_container(container) @@ -64,15 +72,19 @@ def get_raw_data(context, job_binary): "is greater than maximum (%sKB)") body = {} - headers, objects = conn.get_container(names[0]) + headers, objects = conn.get_container(container) for item in objects: - headers, obj = conn.get_object(names[0], item["name"]) + headers, obj = conn.get_object(container, item["name"]) body[item["name"]] = obj except swiftclient.ClientException as e: raise ex.SwiftClientException(e.message) else: container, obj = names + + # if container name has '.sahara' suffix we need to strip it + container = _strip_sahara_suffix(container) + try: # First check the size headers = conn.head_object(container, obj) diff --git a/sahara/swift/utils.py b/sahara/swift/utils.py index 2ba9f30dbb..581c00178a 100644 --- a/sahara/swift/utils.py +++ b/sahara/swift/utils.py @@ -26,6 +26,7 @@ CONF = cfg.CONF SWIFT_INTERNAL_PREFIX = "swift://" # TODO(mattf): remove support for OLD_SWIFT_INTERNAL_PREFIX OLD_SWIFT_INTERNAL_PREFIX = "swift-internal://" +SWIFT_URL_SUFFIX = '.sahara' def _get_service_address(service_type):