Remove a DB query for get_ports_by_node()

This renames get_ports_by_node() to get_ports_by_node_id() and changes
the node_id argument to always need to be the integer ID. This removes
the need for get_ports_by_node() to query the DB for UUID -> ID
conversion.

By doing this, we can save a DB query in the cases where we already have
the Node integer ID.

This is needed to help set up the next patch to clean up calls to
get_node(). There's now a case in port API controller where we need
to lookup the Node by UUID just to get its ID to be passed into this
call. Until we implement the Node lazy-loading code, we fetch the
full Node, but this isn't any worse than before for this case, as
I'm just moving it from the DB layer. I've noted this with a FIXME
and it will be made more efficient in the future.

Change-Id: I9993c0c87794171fb971524ac5c30490b3e33716
This commit is contained in:
Chris Behrens 2014-04-02 13:33:28 -07:00
parent 7a4446eb52
commit 74d56d187a
5 changed files with 19 additions and 27 deletions

View File

@ -175,10 +175,15 @@ class PortsController(rest.RestController):
marker)
if node_uuid:
ports = pecan.request.dbapi.get_ports_by_node(node_uuid, limit,
marker_obj,
sort_key=sort_key,
sort_dir=sort_dir)
# FIXME(comstud): Since all we need is the node ID, we can
# make this more efficient by only querying
# for that column. This will get cleaned up
# as we move to the object interface.
node = pecan.request.dbapi.get_node(node_uuid)
ports = pecan.request.dbapi.get_ports_by_node_id(node.id, limit,
marker_obj,
sort_key=sort_key,
sort_dir=sort_dir)
elif address:
ports = self._get_ports_by_address(address)
else:

View File

@ -165,7 +165,7 @@ class TaskManager(object):
locked_node_list.append(node.id)
else:
node = self.dbapi.get_node(id)
ports = self.dbapi.get_ports_by_node(id)
ports = self.dbapi.get_ports_by_node_id(node.id)
driver = driver_factory.get_driver(driver_name or node.driver)
self.resources.append(NodeResource(node, ports, driver))

View File

@ -208,11 +208,11 @@ class Connection(object):
"""
@abc.abstractmethod
def get_ports_by_node(self, node_id, limit=None, marker=None,
sort_key=None, sort_dir=None):
def get_ports_by_node_id(self, node_id, limit=None, marker=None,
sort_key=None, sort_dir=None):
"""List all the ports for a given node.
:param node_id: The id or uuid of a node.
:param node_id: The integer node ID.
:param limit: Maximum number of ports to return.
:param marker: the last item of the previous page; we return the next
result set.

View File

@ -403,12 +403,10 @@ class Connection(api.Connection):
sort_key, sort_dir)
@objects.objectify(objects.Port)
def get_ports_by_node(self, node_id, limit=None, marker=None,
sort_key=None, sort_dir=None):
# get_node() to raise an exception if the node is not found
node_obj = self.get_node(node_id)
def get_ports_by_node_id(self, node_id, limit=None, marker=None,
sort_key=None, sort_dir=None):
query = model_query(models.Port)
query = query.filter_by(node_id=node_obj.id)
query = query.filter_by(node_id=node_id)
return _paginate_query(models.Port, limit, marker,
sort_key, sort_dir, query)

View File

@ -73,23 +73,12 @@ class DbPortTestCase(base.DbTestCase):
def test_get_ports_by_node_id(self):
p = db_utils.get_test_port(node_id=self.n.id)
self.dbapi.create_port(p)
res = self.dbapi.get_ports_by_node(self.n.id)
res = self.dbapi.get_ports_by_node_id(self.n.id)
self.assertEqual(self.p['address'], res[0].address)
def test_get_ports_by_node_uuid(self):
p = db_utils.get_test_port(node_id=self.n.id)
self.dbapi.create_port(p)
res = self.dbapi.get_ports_by_node(self.n.uuid)
self.assertEqual(self.p['address'], res[0].address)
def test_get_ports_by_node_that_does_not_exist(self):
def test_get_ports_by_node_id_that_does_not_exist(self):
self.dbapi.create_port(self.p)
self.assertRaises(exception.NodeNotFound,
self.dbapi.get_ports_by_node,
99)
self.assertRaises(exception.NodeNotFound,
self.dbapi.get_ports_by_node,
'12345678-9999-0000-aaaa-123456789012')
self.assertEqual([], self.dbapi.get_ports_by_node_id(99))
def test_destroy_port(self):
self.dbapi.create_port(self.p)