Merge "database/v1.0 instance resource"

This commit is contained in:
Jenkins 2014-08-13 19:25:46 +00:00 committed by Gerrit Code Review
commit 9855a7c4bd
8 changed files with 227 additions and 0 deletions

View File

View File

@ -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')

View File

View File

@ -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)

View File

View File

@ -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)

View File

View File

@ -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)