diff --git a/openstack/connection.py b/openstack/connection.py index 341fa75b..b778aa07 100644 --- a/openstack/connection.py +++ b/openstack/connection.py @@ -179,3 +179,48 @@ class Connection(object): setattr(self, attr_name, proxy(self.session)) except Exception as e: _logger.warn("Unable to load %s: %s" % (module, e)) + + def create(self, obj): + """Create an object. + + :param obj: A resource object. + :type resource: :class:`~openstack.resource.Resource` + """ + obj.create(self.session) + return obj + + def get(self, obj, include_headers=False): + """Get an object. + + :param obj: A resource object. + :type resource: :class:`~openstack.resource.Resource` + :param bool include_headers: Read object headers. + """ + obj.get(self.session, include_headers) + return obj + + def head(self, obj): + """Get an object. + + :param obj: A resource object. + :type resource: :class:`~openstack.resource.Resource` + """ + obj.head(self.session) + return obj + + def update(self, obj): + """Update an object. + + :param obj: A resource object. + :type resource: :class:`~openstack.resource.Resource` + """ + obj.update(self.session) + return obj + + def delete(self, obj): + """Delete an object. + + :param obj: A resource object. + :type resource: :class:`~openstack.resource.Resource` + """ + obj.delete(self.session) diff --git a/openstack/tests/test_connection.py b/openstack/tests/test_connection.py index 77e2e7fe..e6d36527 100644 --- a/openstack/tests/test_connection.py +++ b/openstack/tests/test_connection.py @@ -10,9 +10,13 @@ # License for the specific language governing permissions and limitations # under the License. +import mock + from openstack.auth.identity import v2 +from openstack.auth import service_filter from openstack import connection from openstack import exceptions +from openstack import resource from openstack.tests import base from openstack import transport from openstack import user_preference @@ -24,6 +28,9 @@ class TestConnection(base.TestCase): self.xport = transport.Transport() self.auth = v2.Auth(auth_url='http://127.0.0.1/v2', token='b') self.pref = user_preference.UserPreference() + self.conn = connection.Connection(authenticator=mock.MagicMock(), + transport=mock.MagicMock()) + self.conn.session = mock.MagicMock() def test_create_transport(self): conn = connection.Connection(authenticator='2', verify=True, @@ -107,3 +114,82 @@ class TestConnection(base.TestCase): conn.orchestration.__class__.__module__) self.assertEqual('openstack.telemetry.v2._proxy', conn.telemetry.__class__.__module__) + + +class TestService(service_filter.ServiceFilter): + valid_versions = [service_filter.ValidVersion('v2')] + + def __init__(self): + super(TestService, self).__init__(service_type='test') + + +class TestResource(resource.Resource): + resource_key = "testable" + resources_key = "testables" + base_path = "/testables" + service = TestService() + allow_create = True + allow_retrieve = True + allow_update = True + allow_delete = True + allow_list = True + allow_head = True + name = resource.prop('name') + + +class TestConnectionObjectMethods(base.TestCase): + def setUp(self): + super(TestConnectionObjectMethods, self).setUp() + self.conn = connection.Connection(authenticator=mock.MagicMock(), + transport=mock.MagicMock()) + self.conn.session = mock.MagicMock() + self.args = {'name': 'fee', 'id': 'fie'} + self.body = {'testable': self.args} + self.response = mock.Mock + self.response.body = self.body + + def test_obj_create(self): + test = TestResource.existing(**self.args) + self.conn.session.put = mock.MagicMock() + self.conn.session.put.and_return = self.response + self.assertEqual(test, self.conn.create(test)) + url = 'testables/fie' + self.conn.session.put.assert_called_with(url, json=self.body, + service=test.service) + + def test_obj_get(self): + test = TestResource.existing(**self.args) + self.conn.session.get = mock.MagicMock() + self.conn.session.get.and_return = self.response + self.assertEqual(test, self.conn.get(test)) + url = 'testables/fie' + self.conn.session.get.assert_called_with(url, service=test.service) + + def test_obj_head(self): + test = TestResource.existing(**self.args) + self.conn.session.head = mock.MagicMock() + self.conn.session.head.and_return = self.response + self.assertEqual(test, self.conn.head(test)) + url = 'testables/fie' + self.conn.session.head.assert_called_with(url, service=test.service, + accept=None) + + def test_obj_update(self): + test = TestResource.existing(**self.args) + test['name'] = 'newname' + self.body = {'testable': {'name': 'newname'}} + self.conn.session.patch = mock.MagicMock() + self.conn.session.patch.and_return = self.response + self.assertEqual(test, self.conn.update(test)) + url = 'testables/fie' + self.conn.session.patch.assert_called_with(url, json=self.body, + service=test.service) + + def test_obj_delete(self): + test = TestResource.existing(**self.args) + self.conn.session.delete = mock.MagicMock() + self.conn.session.delete.and_return = self.response + self.assertEqual(None, self.conn.delete(test)) + url = 'testables/fie' + self.conn.session.delete.assert_called_with(url, service=test.service, + accept=None)