Adjust some parameters and return types

This change removes a TODO from get_account_metadata which was
previously taking a Container when it wasn't necessary (and didn't make
a ton of sense). Most of the other changes are to document return types
which were previously unlisted, and in a few cases of requests which
don't return a body, their responses are turned to None. If the request
worked, you're going to get an unchanged object back, so no need to be
returning the same thing back at this level.

Change-Id: Ic547e6912e14dfe622533550f1432415070566c1
This commit is contained in:
Brian Curtin
2015-01-22 22:31:16 -06:00
parent f528d8857b
commit ba1b80ed20
2 changed files with 84 additions and 42 deletions

View File

@@ -19,34 +19,40 @@ class Proxy(object):
def __init__(self, session):
self.session = session
def get_account_metadata(self, container=None):
def get_account_metadata(self):
"""Get metatdata for this account.
:param container: The container to retreive metadata for.
:type container:
:rtype:
:class:`~openstack.object_store.v1.container.Container`
"""
# TODO(briancurtin): should just use Container.head directly?
if container is None:
container = _container.Container()
container.head(self.session)
return container
return _container.Container().head(self.session)
def set_account_metadata(self, container):
"""Set metatdata for this account.
:param container: The container to set metadata for.
:param container: Account metadata specified on a
:class:`~openstack.object_store.v1.container.Container` object
to be sent to the server.
:type container:
:class:`~openstack.object_store.v1.container.Container`
:rtype: ``None``
"""
container.update(self.session)
return container
def containers(self, limit=None, marker=None, **kwargs):
"""Return a generator that yields the account's Container objects.
"""Obtain Container objects for this account.
:param int limit: Set the limit of how many containers to retrieve.
:param int limit: Set the limit of how many containers to retrieve
in each request to the server. By default, the value is ``None``,
retrieving the maximum amount of containers per request that
your server allows.
:param str marker: The name of the container to begin iterating from.
By default, the value is ``None``, returning all available
containers.
:rtype: A generator of
:class:`~openstack.object_store.v1.container.Container` objects.
"""
return _container.Container.list(self.session, limit=limit,
marker=marker, **kwargs)
@@ -54,44 +60,58 @@ class Proxy(object):
def get_container_metadata(self, container):
"""Get metatdata for a container.
:param container: The container to retreive metadata for.
:param container: The container to retreive metadata for. You can
pass a container object or the name of a container to
retrieve metadata for.
:type container:
:class:`~openstack.object_store.v1.container.Container`
:rtype:
:class:`~openstack.object_store.v1.container.Container`
:raises: :exc:`ValueError` when an unnamed container object was
specified, as this would instead retrieve account metadata.
"""
container = _container.Container.from_id(container)
# TODO(briancurtin): may want to check if the container has a
# name at this point. If it doesn't, this call will work but it's
# actually getting *account* metadata.
container.head(self.session)
return container
if getattr(container, "name") is None:
msg = "A named container or a name itself must be passed"
raise ValueError(msg)
return container.head(self.session)
def set_container_metadata(self, container):
"""Set metatdata for a container.
:param container: The container to set metadata for.
:param container: A container object containing metadata to be set.
:type container:
:class:`~openstack.object_store.v1.container.Container`
:rtype: ``None``
"""
container.create(self.session)
return container
def create_container(self, container):
"""Create a container,
:param container: A container name or object.
:param container: The container to create. You can pass a container
object or the name of a container to create.
:type container:
:class:`~openstack.object_store.v1.container.Container`
:rtype:
:class:`~openstack.object_store.v1.container.Container`
"""
container = _container.Container.from_id(container)
container.create(self.session)
return container
return container.create(self.session)
def delete_container(self, container):
"""Delete a container.
:param container: A container name or object.
:param container: The container to delete. You can pass a container
object or the name of a container to delete.
:type container:
:class:`~openstack.object_store.v1.container.Container`
:rtype: ``None``
"""
container = _container.Container.from_id(container)
container.delete(self.session)
@@ -99,9 +119,13 @@ class Proxy(object):
def objects(self, container, limit=None, marker=None, **kwargs):
"""Return a generator that yields the Container's objects.
:param container: A container name or object.
:param container: A container object or the name of a container
that you want to retrieve objects from.
:type container:
:class:`~openstack.object_store.v1.container.Container`
:rtype: A generator of
:class:`~openstack.object_store.v1.obj.Object` objects.
"""
container = _container.Container.from_id(container)
@@ -151,8 +175,7 @@ class Proxy(object):
cnt = _container.Container.from_id(container)
obj.container = cnt.name
obj.create(self.session, data)
return obj
return obj.create(self.session, data)
def copy_object(self):
"""Copy an object."""
@@ -163,6 +186,8 @@ class Proxy(object):
:param obj: The object to delete.
:type obj: :class:`~openstack.object_store.v1.obj.Object`
:rtype: ``None``
"""
obj.delete(self.session)
@@ -171,15 +196,18 @@ class Proxy(object):
:param obj: The object to retreive metadata from.
:type obj: :class:`~openstack.object_store.v1.obj.Object`
:return: A :class:`~openstack.object_store.v1.obj.Object`
populated with the server's response.
"""
obj.head(self.session)
return obj
return obj.head(self.session)
def set_object_metadata(self, obj):
"""Set metatdata for an object.
:param obj: The object to set metadata for.
:type obj: :class:`~openstack.object_store.v1.obj.Object`
:rtype: ``None``
"""
obj.create(self.session)
return obj

View File

@@ -35,20 +35,25 @@ class TestObjectStoreProxy(test_proxy_base.TestProxyBase):
class Test_account_metadata(TestObjectStoreProxy):
def _test_container_object(self, method, verb):
container = mock.MagicMock()
@mock.patch("openstack.resource.Resource")
def test_get_account_metadata(self, mock_resource):
cont = container.Container()
mock_resource = mock.MagicMock()
mock_resource.head.return_value = cont
result = method(container)
result = self.proxy.get_account_metadata()
self.assertIs(result, container)
getattr(container, verb).assert_called_once_with(self.session)
def test_get_account_metadata(self):
self._test_container_object(self.proxy.get_account_metadata, "head")
self.assertEqual(result, cont)
def test_set_account_metadata(self):
self._test_container_object(self.proxy.set_account_metadata, "update")
container = mock.MagicMock()
container.update.return_value = container
result = self.proxy.set_account_metadata(container)
self.assertIs(result, None)
container.update.assert_called_once_with(self.session)
@mock.patch("openstack.object_store.v1._proxy._container.Container")
def test_get_account_metadata_no_arg(self, mock_container):
@@ -146,6 +151,8 @@ class Test_container_metadata(TestObjectStoreProxy):
@mock.patch("openstack.resource.Resource.from_id")
def test_get_container_metadata_object(self, mock_fi):
container = mock.MagicMock()
container.name = "test"
container.head.return_value = container
mock_fi.return_value = container
result = self.proxy.get_container_metadata(container)
@@ -158,6 +165,7 @@ class Test_container_metadata(TestObjectStoreProxy):
name = six.text_type("my_container")
created_container = mock.MagicMock()
created_container.name = name
created_container.head.return_value = created_container
mock_fi.return_value = created_container
result = self.proxy.get_container_metadata(name)
@@ -170,7 +178,7 @@ class Test_container_metadata(TestObjectStoreProxy):
result = self.proxy.set_container_metadata(container)
self.assertIs(result, container)
self.assertIsNone(result)
container.create.assert_called_once_with(self.session)
@@ -179,6 +187,7 @@ class Test_create_container(TestObjectStoreProxy):
@mock.patch("openstack.resource.Resource.from_id")
def test_container_object(self, mock_fi):
container = mock.MagicMock()
container.create.return_value = container
mock_fi.return_value = container
result = self.proxy.create_container(container)
@@ -191,6 +200,7 @@ class Test_create_container(TestObjectStoreProxy):
name = six.text_type("my_container")
created_container = mock.MagicMock()
created_container.name = name
created_container.create.return_value = created_container
mock_fi.return_value = created_container
result = self.proxy.create_container(name)
@@ -362,6 +372,7 @@ class Test_create_object(TestObjectStoreProxy):
def test_create_with_obj_name_real_container(self, mock_fi):
created_object = mock.MagicMock()
created_object.name = self.object_name
created_object.create.return_value = created_object
# Since we're using a MagicMock, we have to explicitly set this to
# None otherwise when it gets accessed it'll have a value which
# is not what we want to happen.
@@ -382,6 +393,7 @@ class Test_create_object(TestObjectStoreProxy):
def test_create_with_real_obj_real_container(self):
ob = obj.Object.new(name=self.object_name)
ob.create = mock.MagicMock()
ob.create.return_value = ob
cont = container.Container.new(name=self.container_name)
result = self.proxy.create_object(self.the_data, ob, cont)
@@ -395,6 +407,7 @@ class Test_create_object(TestObjectStoreProxy):
ob = obj.Object.new(name=self.object_name,
container=self.container_name)
ob.create = mock.MagicMock()
ob.create.return_value = ob
result = self.proxy.create_object(self.the_data, ob)
@@ -409,6 +422,7 @@ class Test_object_metadata(TestObjectStoreProxy):
@mock.patch("openstack.resource.Resource.from_id")
def test_get_object_metadata(self, mock_fi):
ob = mock.MagicMock()
ob.head.return_value = ob
mock_fi.return_value = ob
result = self.proxy.get_object_metadata(ob)
@@ -421,7 +435,7 @@ class Test_object_metadata(TestObjectStoreProxy):
result = self.proxy.set_object_metadata(ob)
self.assertIs(result, ob)
self.assertIsNone(result)
ob.create.assert_called_once_with(self.session)