Improved share_servers db api

Returning backend_details in dict.
Removed unused db method
share_server_get_by_host_and_share_net.
Added unittests.

Partially-implements bp implement-backend-details-in-drivers

Change-Id: I1998ce06e1568ea6318fad9c535832295bbddcaa
This commit is contained in:
Yulia Portnova 2014-06-17 13:05:17 +03:00
parent f07936c277
commit 3edbce8c0c
4 changed files with 278 additions and 84 deletions

View File

@ -34,10 +34,7 @@ class ViewBuilder(common.ViewBuilder):
}
def build_share_server_details(self, details):
details_dict = {}
for pair in details:
details_dict[pair.key] = pair.value
return {'details': details_dict}
return {'details': details}
def _build_share_server_view(self, share_server, detailed=False):
share_server_dict = {
@ -50,7 +47,5 @@ class ViewBuilder(common.ViewBuilder):
}
if detailed:
share_server_dict['created_at'] = share_server.created_at
share_server_dict['backend_details'] = {}
for pair in share_server.backend_details:
share_server_dict['backend_details'][pair.key] = pair.value
share_server_dict['backend_details'] = share_server.backend_details
return share_server_dict

View File

@ -1662,8 +1662,7 @@ def share_server_delete(context, id):
session = get_session()
with session.begin():
server_ref = share_server_get(context, id, session=session)
for item in server_ref['backend_details']:
item.delete(session=session)
share_server_backend_details_delete(context, id, session=session)
server_ref.delete(session=session)
@ -1688,16 +1687,6 @@ def share_server_get(context, server_id, session=None):
return result
@require_context
def share_server_get_by_host_and_share_net(context, host, share_net_id,
session=None):
result = _server_get_query(context, session).filter_by(host=host)\
.filter_by(share_network_id=share_net_id).all()
if result is None:
raise exception.ShareServerNotFound(share_server_id=id)
return result
@require_context
def share_server_get_by_host_and_share_net_valid(context, host, share_net_id,
session=None):
@ -1707,6 +1696,8 @@ def share_server_get_by_host_and_share_net_valid(context, host, share_net_id,
(constants.STATUS_CREATING, constants.STATUS_ACTIVE))).first()
if result is None:
raise exception.ShareServerNotFound(share_server_id=id)
result['backend_details'] = share_server_backend_details_get(
context, result['id'], session=session)
return result
@ -1735,8 +1726,10 @@ def share_server_backend_details_delete(context, share_server_id,
session=None):
if not session:
session = get_session()
share_server_details = share_server_backend_details_get(
context, share_server_id, session=session)
share_server_details = model_query(context,
models.ShareServerBackendDetails,
session=session)\
.filter_by(share_server_id=share_server_id).all()
for item in share_server_details:
item.delete(session=session)
@ -1744,9 +1737,10 @@ def share_server_backend_details_delete(context, share_server_id,
@require_context
def share_server_backend_details_get(context, share_server_id,
session=None):
return model_query(context, models.ShareServerBackendDetails,
session=session)\
query = model_query(context, models.ShareServerBackendDetails,
session=session)\
.filter_by(share_server_id=share_server_id).all()
return dict([(item.key, item.value) for item in query])
###################

View File

@ -23,63 +23,6 @@ from manila import policy
from manila import test
class FakeBackendDetails(object):
key = 'fake_key_1'
value = 'fake_value_1'
class FakeBackendDetails2(object):
key = 'fake_key_2'
value = 'fake_value_2'
class FakeShareServer(object):
def __init__(self, *args, **kwargs):
super(FakeShareServer, self).__init__()
self.id = kwargs.get('id', 'fake_server_id')
if 'created_at' in kwargs:
self.created_at = kwargs.get('created_at', None)
self.updated_at = kwargs.get('updated_at', None)
self.host = kwargs.get('host', 'fake_host')
self.share_network = kwargs.get('share_network', {
'name': 'fake_sn_name', 'id': 'fake_sn_id',
'project_id': 'fake_project_id'})
self.share_network_id = kwargs.get('share_network_id',
self.share_network['id'])
self.status = kwargs.get('status', constants.STATUS_ACTIVE)
self.project_id = self.share_network['project_id']
self.backend_details = [
FakeBackendDetails(),
FakeBackendDetails2(),
]
def __getitem__(self, item):
return getattr(self, item)
def fake_share_server_get_all():
fake_share_servers = [
FakeShareServer(),
FakeShareServer(id='fake_server_id_2',
host='fake_host_2',
share_network={
'name': None,
'id': 'fake_sn_id_2',
'project_id': 'fake_project_id_2'},
status=constants.STATUS_ERROR)
]
return fake_share_servers
def fake_share_server_get():
return FakeShareServer(created_at=None)
def fake_share_server_backend_details_get():
return [FakeBackendDetails(), FakeBackendDetails2(), ]
fake_share_server_list = {
'share_servers': [
{
@ -118,18 +61,63 @@ fake_share_server_get_result = {
}
}
share_server_backend_details = {
'fake_key_1': 'fake_value_1',
'fake_key_2': 'fake_value_2',
}
fake_share_server_backend_details_get_result = {
'details': {
'fake_key_1': 'fake_value_1',
'fake_key_2': 'fake_value_2',
}
'details': share_server_backend_details
}
CONTEXT = context.get_admin_context()
class FakeShareServer(object):
def __init__(self, *args, **kwargs):
super(FakeShareServer, self).__init__()
self.id = kwargs.get('id', 'fake_server_id')
if 'created_at' in kwargs:
self.created_at = kwargs.get('created_at', None)
self.updated_at = kwargs.get('updated_at', None)
self.host = kwargs.get('host', 'fake_host')
self.share_network = kwargs.get('share_network', {
'name': 'fake_sn_name', 'id': 'fake_sn_id',
'project_id': 'fake_project_id'})
self.share_network_id = kwargs.get('share_network_id',
self.share_network['id'])
self.status = kwargs.get('status', constants.STATUS_ACTIVE)
self.project_id = self.share_network['project_id']
self.backend_details = share_server_backend_details
def __getitem__(self, item):
return getattr(self, item)
def fake_share_server_get_all():
fake_share_servers = [
FakeShareServer(),
FakeShareServer(id='fake_server_id_2',
host='fake_host_2',
share_network={
'name': None,
'id': 'fake_sn_id_2',
'project_id': 'fake_project_id_2'},
status=constants.STATUS_ERROR)
]
return fake_share_servers
def fake_share_server_get():
return FakeShareServer(created_at=None)
def fake_share_server_backend_details_get():
return share_server_backend_details
class FakeRequestAdmin(object):
environ = {"manila.context": CONTEXT}
GET = {}

View File

@ -0,0 +1,217 @@
# Copyright (c) 2014 NetApp, Inc.
# All Rights Reserved.
#
# 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.
"""Tests for the ShareServer and ShareServerBackendDetails tables."""
from manila import context
from manila import db
from manila import exception
from manila.openstack.common import uuidutils
from manila import test
class ShareServerTableTestCase(test.TestCase):
def setUp(self):
super(ShareServerTableTestCase, self).setUp()
self.ctxt = context.RequestContext(user_id='user_id',
project_id='project_id',
is_admin=True)
def _create_share_server(self, values=None):
if not values:
values = {
'share_network_id': uuidutils.generate_uuid(),
'host': 'host1',
'status': 'ACTIVE'
}
return db.share_server_create(self.ctxt, values)
def test_share_server_get(self):
values = {
'share_network_id': 'fake-share-net-id',
'host': 'hostname',
'status': 'ACTIVE'
}
expected = self._create_share_server(values)
server = db.share_server_get(self.ctxt, expected['id'])
self.assertEqual(expected['id'], server['id'])
self.assertEqual(server.share_network_id, expected.share_network_id)
self.assertEqual(server.host, expected.host)
self.assertEqual(server.status, expected.status)
def test_share_get_not_found(self):
fake_id = 'FAKE_UUID'
self.assertRaises(exception.ShareServerNotFound, db.share_server_get,
self.ctxt, fake_id)
def test_share_server_create(self):
values = {
'share_network_id': 'fake-share-net-id',
'host': 'hostname',
'status': 'ACTIVE'
}
server = self._create_share_server(values)
self.assertTrue(server['id'])
self.assertEqual(server.share_network_id, values['share_network_id'])
self.assertEqual(server.host, values['host'])
self.assertEqual(server.status, values['status'])
def test_share_server_delete(self):
server = self._create_share_server()
num_records = len(db.share_server_get_all(self.ctxt))
db.share_server_delete(self.ctxt, server['id'])
self.assertEqual(len(db.share_server_get_all(self.ctxt)),
num_records - 1)
def test_share_server_delete_not_found(self):
fake_id = 'FAKE_UUID'
self.assertRaises(exception.ShareServerNotFound,
db.share_server_delete,
self.ctxt, fake_id)
def test_share_server_update(self):
update = {
'share_network_id': 'update_net',
'host': 'update_host',
'status': 'updated_status'
}
server = self._create_share_server()
updated_server = db.share_server_update(self.ctxt, server['id'],
update)
self.assertEqual(server['id'], updated_server['id'])
self.assertEqual(updated_server.share_network_id,
update['share_network_id'])
self.assertEqual(updated_server.host, update['host'])
self.assertEqual(updated_server.status, update['status'])
def test_share_server_update_not_found(self):
fake_id = 'FAKE_UUID'
self.assertRaises(exception.ShareServerNotFound,
db.share_server_update,
self.ctxt, fake_id, {})
def test_share_server_get_by_host_and_share_net_valid(self):
valid = {
'share_network_id': '1',
'host': 'host1',
'status': 'ACTIVE'
}
invalid = {
'share_network_id': '1',
'host': 'host1',
'status': 'ERROR'
}
other = {
'share_network_id': '2',
'host': 'host2',
'status': 'ACTIVE'
}
valid = self._create_share_server(valid)
self._create_share_server(invalid)
self._create_share_server(other)
servers = db.share_server_get_by_host_and_share_net_valid(
self.ctxt,
host='host1',
share_net_id='1')
self.assertEqual(servers['id'], valid['id'])
def test_share_server_get_by_host_and_share_net_not_found(self):
self.assertRaises(exception.ShareServerNotFound,
db.share_server_get_by_host_and_share_net_valid,
self.ctxt, host='fake', share_net_id='fake')
def test_share_server_get_all(self):
srv1 = {
'share_network_id': '1',
'host': 'host1',
'status': 'ACTIVE'
}
srv2 = {
'share_network_id': '1',
'host': 'host1',
'status': 'ERROR'
}
srv3 = {
'share_network_id': '2',
'host': 'host2',
'status': 'ACTIVE'
}
servers = db.share_server_get_all(self.ctxt)
self.assertEqual(len(servers), 0)
to_delete = self._create_share_server(srv1)
self._create_share_server(srv2)
self._create_share_server(srv3)
servers = db.share_server_get_all(self.ctxt)
self.assertEqual(len(servers), 3)
db.share_server_delete(self.ctxt, to_delete['id'])
servers = db.share_server_get_all(self.ctxt)
self.assertEqual(len(servers), 2)
def test_share_server_backend_details_set(self):
details = {
'value1': '1',
'value2': '2',
}
server = self._create_share_server()
db.share_server_backend_details_set(self.ctxt, server['id'], details)
self.assertDictMatch(
details,
db.share_server_backend_details_get(self.ctxt, server['id'])
)
def test_share_server_backend_details_set_not_found(self):
fake_id = 'FAKE_UUID'
self.assertRaises(exception.ShareServerNotFound,
db.share_server_backend_details_set,
self.ctxt, fake_id, {})
def test_share_server_get_with_details(self):
values = {
'share_network_id': 'fake-share-net-id',
'host': 'hostname',
'status': 'ACTIVE'
}
details = {
'value1': '1',
'value2': '2',
}
srv_id = self._create_share_server(values)['id']
db.share_server_backend_details_set(self.ctxt, srv_id, details)
server = db.share_server_get(self.ctxt, srv_id)
self.assertEqual(srv_id, server['id'])
self.assertEqual(server.share_network_id, values['share_network_id'])
self.assertEqual(server.host, values['host'])
self.assertEqual(server.status, values['status'])
self.assertDictMatch(details, server['backend_details'])
def test_share_server_delete_with_details(self):
server = self._create_share_server()
details = {
'value1': '1',
'value2': '2',
}
db.share_server_backend_details_set(self.ctxt, server['id'], details)
num_records = len(db.share_server_get_all(self.ctxt))
db.share_server_delete(self.ctxt, server['id'])
self.assertEqual(len(db.share_server_get_all(self.ctxt)),
num_records - 1)
self.assertFalse(
db.share_server_backend_details_get(self.ctxt, server['id']))