From 43f5a00ce1cac98e44b2846041c6dc12efeccdc1 Mon Sep 17 00:00:00 2001 From: Brian Curtin Date: Thu, 20 Aug 2015 12:52:37 -0500 Subject: [PATCH] Get container off of an Object if its passed The previous object operations on object_store proxy were too strict on requiring a container argument to be passed, and in some cases they were too loose. When an Object is passed, look to see if it has a container attribute already set and use it if so. If that doesn't work out, look at the container argument, which that that point would have to be specified. If we get a container out of that, use it. After this, we won't be able to do any object operations with a container, so raise ValueError specifying that a container has to be provided. Change-Id: I6b587831321998245815fccf8f822025e83141c5 Closes-Bug: 1487147 --- openstack/object_store/v1/_proxy.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/openstack/object_store/v1/_proxy.py b/openstack/object_store/v1/_proxy.py index ff620052d..aac49fe02 100644 --- a/openstack/object_store/v1/_proxy.py +++ b/openstack/object_store/v1/_proxy.py @@ -131,6 +131,16 @@ class Proxy(proxy.BaseProxy): ob.container = container.name yield ob + def _get_container_name(self, value, container): + if isinstance(value, _obj.Object): + if value.container is not None: + return value.container + if container is not None: + container = _container.Container.from_id(container) + return container.name + + raise ValueError("container must be specified") + def get_object(self, value, container=None): """Get the data associated with an object @@ -146,11 +156,11 @@ class Proxy(proxy.BaseProxy): :raises: :class:`~openstack.exceptions.ResourceNotFound` when no resource can be found. """ - container = _container.Container.from_id(container) + container_name = self._get_container_name(value, container) # TODO(brian): s/_obj/obj once other changes propogate return self._get(_obj.Object, value, - path_args={"container": container.name}) + path_args={"container": container_name}) def save_object(self, obj, path): """Save the data contained inside an object to disk. @@ -177,13 +187,11 @@ class Proxy(proxy.BaseProxy): :rtype: :class:`~openstack.object_store.v1.container.Container` """ container = attrs.pop("container", None) - if container is None: - raise ValueError("container must be specified") - container = _container.Container.from_id(container) + container_name = self._get_container_name(None, container) # TODO(brian): s/_container/container once other changes propogate return self._create(_obj.Object, - path_args={"container": container.name}, **attrs) + path_args={"container": container_name}, **attrs) def copy_object(self): """Copy an object.""" @@ -206,11 +214,11 @@ class Proxy(proxy.BaseProxy): :returns: ``None`` """ - container = _container.Container.from_id(container) + container_name = self._get_container_name(value, container) # TODO(brian): s/_obj/obj once other changes propogate self._delete(_obj.Object, value, ignore_missing=ignore_missing, - path_args={"container": container.name}) + path_args={"container": container_name}) def get_object_metadata(self, value, container=None): """Get metatdata for an object @@ -226,10 +234,10 @@ class Proxy(proxy.BaseProxy): :raises: :class:`~openstack.exceptions.ResourceNotFound` when no resource can be found. """ - container = _container.Container.from_id(container) + container_name = self._get_container_name(value, container) return self._head(_obj.Object, value, - path_args={"container": container.name}) + path_args={"container": container_name}) def set_object_metadata(self, obj): """Set metatdata for an object.