Change app.restapi to app.client_manager.session

This is step 1 toward using Keystone client's session.Session as the
primary session/requests interface in OSC.

* Move the session create into ClientManager and rename 'restapi' attribute to 'session'
* Set up ClientManager and session loggers
* Fix container and object command references to restapi/api

Change-Id: I013d81520b336c7a6422cd22c05d1d65655e64f8
This commit is contained in:
Dean Troyer 2014-08-08 17:38:44 -05:00
parent 19b8605224
commit 4bbd03210f
13 changed files with 296 additions and 183 deletions

View File

@ -19,6 +19,7 @@ import logging
import pkg_resources
import sys
from openstackclient.common import restapi
from openstackclient.identity import client as identity_client
@ -77,7 +78,18 @@ class ClientManager(object):
self._insecure = not verify
else:
self._cacert = verify
self._insecure = True
self._insecure = False
self.session = restapi.RESTApi(
verify=verify,
debug=True,
)
# Get logging from root logger
root_logger = logging.getLogger('')
LOG.setLevel(root_logger.getEffectiveLevel())
restapi_logger = logging.getLogger('restapi')
restapi_logger.setLevel(root_logger.getEffectiveLevel())
self.auth_ref = None

View File

@ -66,7 +66,17 @@ def make_client(instance):
insecure=instance._insecure,
trust_id=instance._trust_id,
)
# TODO(dtroyer): the identity v2 role commands use this yet, fix that
# so we can remove it
instance.auth_ref = client.auth_ref
# NOTE(dtroyer): this is hanging around until restapi is replace by
# ksc session
instance.session.set_auth(
client.auth_ref.auth_token,
)
return client

View File

@ -45,7 +45,7 @@ class CreateContainer(show.ShowOne):
self.log.debug('take_action(%s)', parsed_args)
data = lib_container.create_container(
self.app.restapi,
self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
)
@ -71,7 +71,7 @@ class DeleteContainer(command.Command):
self.log.debug('take_action(%s)', parsed_args)
lib_container.delete_container(
self.app.restapi,
self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
)
@ -140,7 +140,7 @@ class ListContainer(lister.Lister):
kwargs['full_listing'] = True
data = lib_container.list_containers(
self.app.restapi,
self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
**kwargs
)
@ -170,7 +170,7 @@ class ShowContainer(show.ShowOne):
self.log.debug('take_action(%s)', parsed_args)
data = lib_container.show_container(
self.app.restapi,
self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
)

View File

@ -23,46 +23,46 @@ except ImportError:
def create_container(
api,
session,
url,
container,
):
"""Create a container
:param api: a restapi object
:param session: a restapi object
:param url: endpoint
:param container: name of container to create
:returns: dict of returned headers
"""
response = api.put("%s/%s" % (url, container))
response = session.put("%s/%s" % (url, container))
url_parts = urlparse(url)
data = {
'account': url_parts.path.split('/')[-1],
'container': container,
'x-trans-id': response.headers.get('x-trans-id', None),
}
data['x-trans-id'] = response.headers.get('x-trans-id', None)
return data
def delete_container(
api,
session,
url,
container,
):
"""Delete a container
:param api: a restapi object
:param session: a restapi object
:param url: endpoint
:param container: name of container to delete
"""
api.delete("%s/%s" % (url, container))
session.delete("%s/%s" % (url, container))
def list_containers(
api,
session,
url,
marker=None,
limit=None,
@ -72,7 +72,7 @@ def list_containers(
):
"""Get containers in an account
:param api: a restapi object
:param session: a restapi object
:param url: endpoint
:param marker: marker query
:param limit: limit query
@ -85,7 +85,7 @@ def list_containers(
if full_listing:
data = listing = list_containers(
api,
session,
url,
marker,
limit,
@ -95,7 +95,7 @@ def list_containers(
while listing:
marker = listing[-1]['name']
listing = list_containers(
api,
session,
url,
marker,
limit,
@ -117,34 +117,35 @@ def list_containers(
params['end_marker'] = end_marker
if prefix:
params['prefix'] = prefix
return api.list(url, params=params)
return session.get(url, params=params).json()
def show_container(
api,
session,
url,
container,
):
"""Get container details
:param api: a restapi object
:param session: a restapi object
:param url: endpoint
:param container: name of container to show
:returns: dict of returned headers
"""
response = api.head("%s/%s" % (url, container))
url_parts = urlparse(url)
response = session.head("%s/%s" % (url, container))
data = {
'account': url_parts.path.split('/')[-1],
'account': response.headers.get('x-container-meta-owner', None),
'container': container,
'object_count': response.headers.get(
'x-container-object-count',
None,
),
'bytes_used': response.headers.get('x-container-bytes-used', None),
'read_acl': response.headers.get('x-container-read', None),
'write_acl': response.headers.get('x-container-write', None),
'sync_to': response.headers.get('x-container-sync-to', None),
'sync_key': response.headers.get('x-container-sync-key', None),
}
data['object_count'] = response.headers.get(
'x-container-object-count', None)
data['bytes_used'] = response.headers.get('x-container-bytes-used', None)
data['read_acl'] = response.headers.get('x-container-read', None)
data['write_acl'] = response.headers.get('x-container-write', None)
data['sync_to'] = response.headers.get('x-container-sync-to', None)
data['sync_key'] = response.headers.get('x-container-sync-key', None)
return data

View File

@ -25,14 +25,14 @@ except ImportError:
def create_object(
api,
session,
url,
container,
object,
):
"""Create an object, upload it to a container
:param api: a restapi object
:param session: a restapi object
:param url: endpoint
:param container: name of container to store object
:param object: local path to object
@ -40,38 +40,38 @@ def create_object(
"""
full_url = "%s/%s/%s" % (url, container, object)
response = api.put(full_url, data=open(object))
response = session.put(full_url, data=open(object))
url_parts = urlparse(url)
data = {
'account': url_parts.path.split('/')[-1],
'container': container,
'object': object,
'x-trans-id': response.headers.get('X-Trans-Id', None),
'etag': response.headers.get('Etag', None),
}
data['x-trans-id'] = response.headers.get('X-Trans-Id', None)
data['etag'] = response.headers.get('Etag', None)
return data
def delete_object(
api,
session,
url,
container,
object,
):
"""Delete an object stored in a container
:param api: a restapi object
:param session: a restapi object
:param url: endpoint
:param container: name of container that stores object
:param container: name of object to delete
"""
api.delete("%s/%s/%s" % (url, container, object))
session.delete("%s/%s/%s" % (url, container, object))
def list_objects(
api,
session,
url,
container,
marker=None,
@ -84,7 +84,7 @@ def list_objects(
):
"""Get objects in a container
:param api: a restapi object
:param session: a restapi object
:param url: endpoint
:param container: container name to get a listing for
:param marker: marker query
@ -101,7 +101,7 @@ def list_objects(
if full_listing:
data = listing = list_objects(
api,
session,
url,
container,
marker,
@ -117,7 +117,7 @@ def list_objects(
else:
marker = listing[-1]['name']
listing = list_objects(
api,
session,
url,
container,
marker,
@ -131,7 +131,6 @@ def list_objects(
data.extend(listing)
return data
object_url = url
params = {
'format': 'json',
}
@ -147,32 +146,31 @@ def list_objects(
params['prefix'] = prefix
if path:
params['path'] = path
url = "%s/%s" % (object_url, container)
return api.list(url, params=params)
requrl = "%s/%s" % (url, container)
return session.get(requrl, params=params).json()
def show_object(
api,
session,
url,
container,
obj,
):
"""Get object details
:param api: a restapi object
:param session: a restapi object
:param url: endpoint
:param container: container name to get a listing for
:returns: dict of object properties
"""
response = api.head("%s/%s/%s" % (url, container, obj))
url_parts = urlparse(url)
response = session.head("%s/%s/%s" % (url, container, obj))
data = {
'account': url_parts.path.split('/')[-1],
'account': response.headers.get('x-container-meta-owner', None),
'container': container,
'object': obj,
'content-type': response.headers.get('content-type', None),
}
data['content-type'] = response.headers.get('content-type', None)
if 'content-length' in response.headers:
data['content-length'] = response.headers.get('content-length', None)
if 'last-modified' in response.headers:
@ -184,10 +182,10 @@ def show_object(
'x-object-manifest', None)
for key, value in six.iteritems(response.headers):
if key.startswith('x-object-meta-'):
data[key[len('x-object-meta-'):].title()] = value
data[key[len('x-object-meta-'):].lower()] = value
elif key not in (
'content-type', 'content-length', 'last-modified',
'etag', 'date', 'x-object-manifest'):
data[key.title()] = value
'etag', 'date', 'x-object-manifest', 'x-container-meta-owner'):
data[key.lower()] = value
return data

View File

@ -50,7 +50,7 @@ class CreateObject(show.ShowOne):
self.log.debug('take_action(%s)', parsed_args)
data = lib_object.create_object(
self.app.restapi,
self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
parsed_args.object,
@ -82,7 +82,7 @@ class DeleteObject(command.Command):
self.log.debug('take_action(%s)', parsed_args)
lib_object.delete_object(
self.app.restapi,
self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
parsed_args.object,
@ -170,7 +170,7 @@ class ListObject(lister.Lister):
kwargs['full_listing'] = True
data = lib_object.list_objects(
self.app.restapi,
self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
**kwargs
@ -206,7 +206,7 @@ class ShowObject(show.ShowOne):
self.log.debug('take_action(%s)', parsed_args)
data = lib_object.show_object(
self.app.restapi,
self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
parsed_args.object,

View File

@ -31,7 +31,6 @@ import openstackclient
from openstackclient.common import clientmanager
from openstackclient.common import commandmanager
from openstackclient.common import exceptions as exc
from openstackclient.common import restapi
from openstackclient.common import timing
from openstackclient.common import utils
from openstackclient.identity import client as identity_client
@ -484,10 +483,6 @@ class OpenStackShell(app.App):
self.verify = self.options.os_cacert
else:
self.verify = not self.options.insecure
self.restapi = restapi.RESTApi(
verify=self.verify,
debug=self.options.debug,
)
def prepare_to_run_command(self, cmd):
"""Set up auth and API versions"""
@ -498,12 +493,10 @@ class OpenStackShell(app.App):
if cmd.best_effort:
try:
self.authenticate_user()
self.restapi.set_auth(self.client_manager.identity.auth_token)
except Exception:
pass
else:
self.authenticate_user()
self.restapi.set_auth(self.client_manager.identity.auth_token)
return
def clean_up(self, cmd, result, err):
@ -539,7 +532,6 @@ class OpenStackShell(app.App):
# NOTE(dtroyer): Maintain the old behaviour for interactive use as
# this path does not call prepare_to_run_command()
self.authenticate_user()
self.restapi.set_auth(self.client_manager.identity.auth_token)
super(OpenStackShell, self).interact()

View File

@ -14,11 +14,26 @@
#
from openstackclient.common import clientmanager
from openstackclient.common import restapi
from openstackclient.tests import utils
AUTH_REF = {'a': 1}
AUTH_TOKEN = "foobar"
AUTH_URL = "http://0.0.0.0"
USERNAME = "itchy"
PASSWORD = "scratchy"
SERVICE_CATALOG = {'sc': '123'}
def FakeMakeClient(instance):
return FakeClient()
class FakeClient(object):
auth_ref = AUTH_REF
auth_token = AUTH_TOKEN
service_catalog = SERVICE_CATALOG
class Container(object):
@ -28,18 +43,7 @@ class Container(object):
pass
class TestClientManager(utils.TestCase):
def setUp(self):
super(TestClientManager, self).setUp()
api_version = {"identity": "2.0"}
self.client_manager = clientmanager.ClientManager(
token=AUTH_TOKEN,
url=AUTH_URL,
auth_url=AUTH_URL,
api_version=api_version,
)
class TestClientCache(utils.TestCase):
def test_singleton(self):
# NOTE(dtroyer): Verify that the ClientCache descriptor only invokes
@ -47,12 +51,88 @@ class TestClientManager(utils.TestCase):
c = Container()
self.assertEqual(c.attr, c.attr)
def test_make_client_identity_default(self):
class TestClientManager(utils.TestCase):
def setUp(self):
super(TestClientManager, self).setUp()
clientmanager.ClientManager.identity = \
clientmanager.ClientCache(FakeMakeClient)
def test_client_manager_token(self):
client_manager = clientmanager.ClientManager(
token=AUTH_TOKEN,
url=AUTH_URL,
verify=True,
)
self.assertEqual(
self.client_manager.identity.auth_token,
AUTH_TOKEN,
client_manager._token,
)
self.assertEqual(
self.client_manager.identity.management_url,
AUTH_URL,
client_manager._url,
)
self.assertIsInstance(
client_manager.session,
restapi.RESTApi,
)
self.assertFalse(client_manager._insecure)
self.assertTrue(client_manager._verify)
def test_client_manager_password(self):
client_manager = clientmanager.ClientManager(
auth_url=AUTH_URL,
username=USERNAME,
password=PASSWORD,
verify=False,
)
self.assertEqual(
AUTH_URL,
client_manager._auth_url,
)
self.assertEqual(
USERNAME,
client_manager._username,
)
self.assertEqual(
PASSWORD,
client_manager._password,
)
self.assertIsInstance(
client_manager.session,
restapi.RESTApi,
)
self.assertTrue(client_manager._insecure)
self.assertFalse(client_manager._verify)
# These need to stick around until the old-style clients are gone
self.assertEqual(
AUTH_REF,
client_manager.auth_ref,
)
self.assertEqual(
AUTH_TOKEN,
client_manager._token,
)
self.assertEqual(
SERVICE_CATALOG,
client_manager._service_catalog,
)
def test_client_manager_password_verify_ca(self):
client_manager = clientmanager.ClientManager(
auth_url=AUTH_URL,
username=USERNAME,
password=PASSWORD,
verify='cafile',
)
self.assertFalse(client_manager._insecure)
self.assertTrue(client_manager._verify)
self.assertEqual('cafile', client_manager._cacert)

View File

@ -13,9 +13,12 @@
# under the License.
#
import json
import six
import sys
import requests
AUTH_TOKEN = "foobar"
AUTH_URL = "http://0.0.0.0"
@ -42,7 +45,6 @@ class FakeApp(object):
self.stdin = sys.stdin
self.stdout = _stdout or sys.stdout
self.stderr = sys.stderr
self.restapi = None
class FakeClientManager(object):
@ -53,6 +55,7 @@ class FakeClientManager(object):
self.object = None
self.volume = None
self.network = None
self.session = None
self.auth_ref = None
@ -78,3 +81,15 @@ class FakeResource(object):
k != 'manager')
info = ", ".join("%s=%s" % (k, getattr(self, k)) for k in reprkeys)
return "<%s %s>" % (self.__class__.__name__, info)
class FakeResponse(requests.Response):
def __init__(self, headers={}, status_code=200, data=None, encoding=None):
super(FakeResponse, self).__init__()
self.status_code = status_code
self.headers.update(headers)
self._content = json.dumps(data)
if not isinstance(self._content, six.binary_type):
self._content = self._content.encode()

View File

@ -18,7 +18,7 @@
import mock
from openstackclient.object.v1.lib import container as lib_container
from openstackclient.tests.common import test_restapi as restapi
from openstackclient.tests import fakes
from openstackclient.tests.object.v1 import fakes as object_fakes
@ -39,156 +39,158 @@ class TestContainer(object_fakes.TestObjectv1):
def setUp(self):
super(TestContainer, self).setUp()
self.app.restapi = mock.MagicMock()
self.app.client_manager.session = mock.MagicMock()
class TestContainerList(TestContainer):
def test_container_list_no_options(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_container.list_containers(
self.app.restapi,
self.app.client_manager.session,
fake_url,
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url,
params={
'format': 'json',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_container_list_marker(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_container.list_containers(
self.app.restapi,
self.app.client_manager.session,
fake_url,
marker='next',
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url,
params={
'format': 'json',
'marker': 'next',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_container_list_limit(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_container.list_containers(
self.app.restapi,
self.app.client_manager.session,
fake_url,
limit=5,
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url,
params={
'format': 'json',
'limit': 5,
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_container_list_end_marker(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_container.list_containers(
self.app.restapi,
self.app.client_manager.session,
fake_url,
end_marker='last',
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url,
params={
'format': 'json',
'end_marker': 'last',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_container_list_prefix(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_container.list_containers(
self.app.restapi,
self.app.client_manager.session,
fake_url,
prefix='foo/',
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url,
params={
'format': 'json',
'prefix': 'foo/',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_container_list_full_listing(self):
sess = self.app.client_manager.session
def side_effect(*args, **kwargs):
rv = self.app.restapi.list.return_value
self.app.restapi.list.return_value = []
self.app.restapi.list.side_effect = None
rv = sess.get().json.return_value
sess.get().json.return_value = []
sess.get().json.side_effect = None
return rv
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.restapi.list.side_effect = side_effect
sess.get().json.return_value = resp
sess.get().json.side_effect = side_effect
data = lib_container.list_containers(
self.app.restapi,
self.app.client_manager.session,
fake_url,
full_listing=True,
)
# Check expected values
self.app.restapi.list.assert_called_with(
sess.get.assert_called_with(
fake_url,
params={
'format': 'json',
'marker': 'is-name',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
class TestContainerShow(TestContainer):
def test_container_show_no_options(self):
resp = {
'X-Container-Meta-Owner': fake_account,
'x-container-object-count': 1,
'x-container-bytes-used': 577,
}
self.app.restapi.head.return_value = \
restapi.FakeResponse(headers=resp)
self.app.client_manager.session.head.return_value = \
fakes.FakeResponse(headers=resp)
data = lib_container.show_container(
self.app.restapi,
self.app.client_manager.session,
fake_url,
'is-name',
)
# Check expected values
self.app.restapi.head.assert_called_with(
self.app.client_manager.session.head.assert_called_with(
fake_url + '/is-name',
)
@ -202,4 +204,4 @@ class TestContainerShow(TestContainer):
'sync_to': None,
'sync_key': None,
}
self.assertEqual(data, data_expected)
self.assertEqual(data_expected, data)

View File

@ -18,7 +18,7 @@
import mock
from openstackclient.object.v1.lib import object as lib_object
from openstackclient.tests.common import test_restapi as restapi
from openstackclient.tests import fakes
from openstackclient.tests.object.v1 import fakes as object_fakes
@ -40,99 +40,99 @@ class TestObject(object_fakes.TestObjectv1):
def setUp(self):
super(TestObject, self).setUp()
self.app.restapi = mock.MagicMock()
self.app.client_manager.session = mock.MagicMock()
class TestObjectListObjects(TestObject):
def test_list_objects_no_options(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_object.list_objects(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url + '/' + fake_container,
params={
'format': 'json',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_list_objects_marker(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_object.list_objects(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
marker='next',
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url + '/' + fake_container,
params={
'format': 'json',
'marker': 'next',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_list_objects_limit(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_object.list_objects(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
limit=5,
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url + '/' + fake_container,
params={
'format': 'json',
'limit': 5,
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_list_objects_end_marker(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_object.list_objects(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
end_marker='last',
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url + '/' + fake_container,
params={
'format': 'json',
'end_marker': 'last',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_list_objects_delimiter(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_object.list_objects(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
delimiter='|',
@ -142,85 +142,86 @@ class TestObjectListObjects(TestObject):
# NOTE(dtroyer): requests handles the URL encoding and we're
# mocking that so use the otherwise-not-legal
# pipe '|' char in the response.
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url + '/' + fake_container,
params={
'format': 'json',
'delimiter': '|',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_list_objects_prefix(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_object.list_objects(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
prefix='foo/',
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url + '/' + fake_container,
params={
'format': 'json',
'prefix': 'foo/',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_list_objects_path(self):
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.client_manager.session.get().json.return_value = resp
data = lib_object.list_objects(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
path='next',
)
# Check expected values
self.app.restapi.list.assert_called_with(
self.app.client_manager.session.get.assert_called_with(
fake_url + '/' + fake_container,
params={
'format': 'json',
'path': 'next',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
def test_list_objects_full_listing(self):
sess = self.app.client_manager.session
def side_effect(*args, **kwargs):
rv = self.app.restapi.list.return_value
self.app.restapi.list.return_value = []
self.app.restapi.list.side_effect = None
rv = sess.get().json.return_value
sess.get().json.return_value = []
sess.get().json.side_effect = None
return rv
resp = [{'name': 'is-name'}]
self.app.restapi.list.return_value = resp
self.app.restapi.list.side_effect = side_effect
sess.get().json.return_value = resp
sess.get().json.side_effect = side_effect
data = lib_object.list_objects(
self.app.restapi,
sess,
fake_url,
fake_container,
full_listing=True,
)
# Check expected values
self.app.restapi.list.assert_called_with(
sess.get.assert_called_with(
fake_url + '/' + fake_container,
params={
'format': 'json',
'marker': 'is-name',
}
)
self.assertEqual(data, resp)
self.assertEqual(resp, data)
class TestObjectShowObjects(TestObject):
@ -228,19 +229,20 @@ class TestObjectShowObjects(TestObject):
def test_object_show_no_options(self):
resp = {
'content-type': 'text/alpha',
'x-container-meta-owner': fake_account,
}
self.app.restapi.head.return_value = \
restapi.FakeResponse(headers=resp)
self.app.client_manager.session.head.return_value = \
fakes.FakeResponse(headers=resp)
data = lib_object.show_object(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
fake_object,
)
# Check expected values
self.app.restapi.head.assert_called_with(
self.app.client_manager.session.head.assert_called_with(
fake_url + '/%s/%s' % (fake_container, fake_object),
)
@ -250,7 +252,7 @@ class TestObjectShowObjects(TestObject):
'object': fake_object,
'content-type': 'text/alpha',
}
self.assertEqual(data, data_expected)
self.assertEqual(data_expected, data)
def test_object_show_all_options(self):
resp = {
@ -258,22 +260,23 @@ class TestObjectShowObjects(TestObject):
'content-length': 577,
'last-modified': '20130101',
'etag': 'qaz',
'x-container-meta-owner': fake_account,
'x-object-manifest': None,
'x-object-meta-wife': 'Wilma',
'x-tra-header': 'yabba-dabba-do',
}
self.app.restapi.head.return_value = \
restapi.FakeResponse(headers=resp)
self.app.client_manager.session.head.return_value = \
fakes.FakeResponse(headers=resp)
data = lib_object.show_object(
self.app.restapi,
self.app.client_manager.session,
fake_url,
fake_container,
fake_object,
)
# Check expected values
self.app.restapi.head.assert_called_with(
self.app.client_manager.session.head.assert_called_with(
fake_url + '/%s/%s' % (fake_container, fake_object),
)
@ -286,7 +289,7 @@ class TestObjectShowObjects(TestObject):
'last-modified': '20130101',
'etag': 'qaz',
'x-object-manifest': None,
'Wife': 'Wilma',
'X-Tra-Header': 'yabba-dabba-do',
'wife': 'Wilma',
'x-tra-header': 'yabba-dabba-do',
}
self.assertEqual(data, data_expected)
self.assertEqual(data_expected, data)

View File

@ -77,7 +77,7 @@ class TestContainerList(TestObject):
kwargs = {
}
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
**kwargs
)
@ -113,7 +113,7 @@ class TestContainerList(TestObject):
'prefix': 'bit',
}
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
**kwargs
)
@ -148,7 +148,7 @@ class TestContainerList(TestObject):
'marker': object_fakes.container_name,
}
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
**kwargs
)
@ -183,7 +183,7 @@ class TestContainerList(TestObject):
'end_marker': object_fakes.container_name_3,
}
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
**kwargs
)
@ -218,7 +218,7 @@ class TestContainerList(TestObject):
'limit': 2,
}
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
**kwargs
)
@ -252,7 +252,7 @@ class TestContainerList(TestObject):
kwargs = {
}
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
**kwargs
)
@ -296,7 +296,7 @@ class TestContainerList(TestObject):
'full_listing': True,
}
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
**kwargs
)
@ -341,7 +341,7 @@ class TestContainerShow(TestObject):
}
# lib.container.show_container(api, url, container)
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name,
**kwargs

View File

@ -71,7 +71,7 @@ class TestObjectList(TestObject):
columns, data = self.cmd.take_action(parsed_args)
o_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name,
)
@ -107,7 +107,7 @@ class TestObjectList(TestObject):
'prefix': 'floppy',
}
o_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name_2,
**kwargs
@ -143,7 +143,7 @@ class TestObjectList(TestObject):
'delimiter': '=',
}
o_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name_2,
**kwargs
@ -179,7 +179,7 @@ class TestObjectList(TestObject):
'marker': object_fakes.object_name_2,
}
o_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name_2,
**kwargs
@ -215,7 +215,7 @@ class TestObjectList(TestObject):
'end_marker': object_fakes.object_name_2,
}
o_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name_2,
**kwargs
@ -251,7 +251,7 @@ class TestObjectList(TestObject):
'limit': 2,
}
o_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name_2,
**kwargs
@ -287,7 +287,7 @@ class TestObjectList(TestObject):
kwargs = {
}
o_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name,
**kwargs
@ -337,7 +337,7 @@ class TestObjectList(TestObject):
'full_listing': True,
}
o_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name,
**kwargs
@ -384,7 +384,7 @@ class TestObjectShow(TestObject):
}
# lib.container.show_container(api, url, container)
c_mock.assert_called_with(
self.app.restapi,
self.app.client_manager.session,
AUTH_URL,
object_fakes.container_name,
object_fakes.object_name_1,