From 00a0a7a196362a2efe2923aa38bdae6a75c17df7 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Sun, 3 Aug 2014 08:19:41 -0600 Subject: [PATCH] database/v1.0 instance resource Change-Id: Iaf830eb2d6879bfb1209d6a5cab1453b518945dc --- openstack/database/__init__.py | 0 openstack/database/database_service.py | 21 +++ openstack/database/v1/__init__.py | 0 openstack/database/v1/instance.py | 61 +++++++++ openstack/tests/database/__init__.py | 0 .../tests/database/test_database_service.py | 25 ++++ openstack/tests/database/v1/__init__.py | 0 openstack/tests/database/v1/test_instance.py | 120 ++++++++++++++++++ 8 files changed, 227 insertions(+) create mode 100644 openstack/database/__init__.py create mode 100644 openstack/database/database_service.py create mode 100644 openstack/database/v1/__init__.py create mode 100644 openstack/database/v1/instance.py create mode 100644 openstack/tests/database/__init__.py create mode 100644 openstack/tests/database/test_database_service.py create mode 100644 openstack/tests/database/v1/__init__.py create mode 100644 openstack/tests/database/v1/test_instance.py diff --git a/openstack/database/__init__.py b/openstack/database/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/database/database_service.py b/openstack/database/database_service.py new file mode 100644 index 00000000..b4dc94e7 --- /dev/null +++ b/openstack/database/database_service.py @@ -0,0 +1,21 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack.auth import service_filter + + +class DatabaseService(service_filter.ServiceFilter): + """The database service.""" + + def __init__(self): + """Create an database service.""" + super(DatabaseService, self).__init__(service_type='database') diff --git a/openstack/database/v1/__init__.py b/openstack/database/v1/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/database/v1/instance.py b/openstack/database/v1/instance.py new file mode 100644 index 00000000..3e6d5aae --- /dev/null +++ b/openstack/database/v1/instance.py @@ -0,0 +1,61 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack.database import database_service +from openstack import resource +from openstack import utils + + +class Instance(resource.Resource): + resource_key = 'instance' + resources_key = 'instances' + base_path = '/instances' + service = database_service.DatabaseService() + + # capabilities + allow_create = True + allow_retrieve = True + allow_update = True + allow_delete = True + allow_list = True + + # Properties + flavor = resource.prop('flavor') + links = resource.prop('links') + name = resource.prop('name') + status = resource.prop('status') + volume = resource.prop('volume') + + def enable_root_user(self, session): + url = utils.urljoin(self.base_path, self.id, 'root') + resp = session.post(url, service=self.service).body + return resp['user'] + + def is_root_enabled(self, session): + url = utils.urljoin(self.base_path, self.id, 'root') + resp = session.get(url, service=self.service).body + return resp['rootEnabled'] + + def restart(self, session): + body = {'restart': {}} + url = utils.urljoin(self.base_path, self.id, 'action') + session.post(url, service=self.service, json=body) + + def resize(self, session, flavor_reference): + body = {'resize': {'flavorRef': flavor_reference}} + url = utils.urljoin(self.base_path, self.id, 'action') + session.post(url, service=self.service, json=body) + + def resize_volume(self, session, volume_size): + body = {'resize': {'volume': volume_size}} + url = utils.urljoin(self.base_path, self.id, 'action') + session.post(url, service=self.service, json=body) diff --git a/openstack/tests/database/__init__.py b/openstack/tests/database/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/tests/database/test_database_service.py b/openstack/tests/database/test_database_service.py new file mode 100644 index 00000000..676c572a --- /dev/null +++ b/openstack/tests/database/test_database_service.py @@ -0,0 +1,25 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import testtools + +from openstack.database import database_service + + +class TestDatabaseService(testtools.TestCase): + + def test_service(self): + sot = database_service.DatabaseService() + self.assertEqual('database', sot.service_type) + self.assertEqual('public', sot.visibility) + self.assertIsNone(sot.region) + self.assertIsNone(sot.service_name) diff --git a/openstack/tests/database/v1/__init__.py b/openstack/tests/database/v1/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/tests/database/v1/test_instance.py b/openstack/tests/database/v1/test_instance.py new file mode 100644 index 00000000..95647851 --- /dev/null +++ b/openstack/tests/database/v1/test_instance.py @@ -0,0 +1,120 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock +import testtools + +from openstack.database.v1 import instance + +IDENTIFIER = 'IDENTIFIER' +EXAMPLE = { + 'flavor': '1', + 'id': IDENTIFIER, + 'links': '3', + 'name': '4', + 'status': '5', + 'volume': '6', +} + + +class TestInstance(testtools.TestCase): + + def test_basic(self): + sot = instance.Instance() + self.assertEqual('instance', sot.resource_key) + self.assertEqual('instances', sot.resources_key) + self.assertEqual('/instances', sot.base_path) + self.assertEqual('database', sot.service.service_type) + self.assertTrue(sot.allow_create) + self.assertTrue(sot.allow_retrieve) + self.assertTrue(sot.allow_update) + self.assertTrue(sot.allow_delete) + self.assertTrue(sot.allow_list) + + def test_make_it(self): + sot = instance.Instance(EXAMPLE) + self.assertEqual(EXAMPLE['flavor'], sot.flavor) + self.assertEqual(EXAMPLE['id'], sot.id) + self.assertEqual(EXAMPLE['links'], sot.links) + self.assertEqual(EXAMPLE['name'], sot.name) + self.assertEqual(EXAMPLE['status'], sot.status) + self.assertEqual(EXAMPLE['volume'], sot.volume) + + def test_enable_root_user(self): + sot = instance.Instance(EXAMPLE) + response = mock.Mock() + response.body = {'user': {'name': 'root', 'password': 'foo'}} + sess = mock.Mock() + sess.post = mock.MagicMock() + sess.post.return_value = response + + self.assertEqual(response.body['user'], sot.enable_root_user(sess)) + + url = ("instances/%s/root" % IDENTIFIER) + sess.post.assert_called_with(url, service=sot.service) + + def test_is_root_enabled(self): + sot = instance.Instance(EXAMPLE) + response = mock.Mock() + response.body = {'rootEnabled': True} + sess = mock.Mock() + sess.get = mock.MagicMock() + sess.get.return_value = response + + self.assertEqual(True, sot.is_root_enabled(sess)) + + url = ("instances/%s/root" % IDENTIFIER) + sess.get.assert_called_with(url, service=sot.service) + + def test_action_restart(self): + sot = instance.Instance(EXAMPLE) + response = mock.Mock() + response.body = '' + sess = mock.Mock() + sess.post = mock.MagicMock() + sess.post.return_value = response + + self.assertEqual(None, sot.restart(sess)) + + url = ("instances/%s/action" % IDENTIFIER) + body = {'restart': {}} + sess.post.assert_called_with(url, service=sot.service, json=body) + + def test_action_resize(self): + sot = instance.Instance(EXAMPLE) + response = mock.Mock() + response.body = '' + sess = mock.Mock() + sess.post = mock.MagicMock() + sess.post.return_value = response + flavor = 'http://flavor/flav' + + self.assertEqual(None, sot.resize(sess, flavor)) + + url = ("instances/%s/action" % IDENTIFIER) + body = {'resize': {'flavorRef': flavor}} + sess.post.assert_called_with(url, service=sot.service, json=body) + + def test_action_resize_volume(self): + sot = instance.Instance(EXAMPLE) + response = mock.Mock() + response.body = '' + sess = mock.Mock() + sess.post = mock.MagicMock() + sess.post.return_value = response + size = 4 + + self.assertEqual(None, sot.resize_volume(sess, size)) + + url = ("instances/%s/action" % IDENTIFIER) + body = {'resize': {'volume': size}} + sess.post.assert_called_with(url, service=sot.service, json=body)