Merge "Refactored query filters."
This commit is contained in:
commit
21e5bd0539
@ -190,6 +190,10 @@ class InvalidUUID(Invalid):
|
|||||||
message = _("Expected a uuid but received %(uuid)s.")
|
message = _("Expected a uuid but received %(uuid)s.")
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidIdentity(Invalid):
|
||||||
|
message = _("Expected an uuid or int but received %(identity)s.")
|
||||||
|
|
||||||
|
|
||||||
class InvalidMAC(Invalid):
|
class InvalidMAC(Invalid):
|
||||||
message = _("Expected a MAC address but received %(mac)s.")
|
message = _("Expected a MAC address but received %(mac)s.")
|
||||||
|
|
||||||
|
@ -297,7 +297,7 @@ def is_valid_boolstr(val):
|
|||||||
def is_valid_mac(address):
|
def is_valid_mac(address):
|
||||||
"""Verify the format of a MAC addres."""
|
"""Verify the format of a MAC addres."""
|
||||||
m = "[0-9a-f]{2}([-:])[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$"
|
m = "[0-9a-f]{2}([-:])[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$"
|
||||||
if re.match(m, address.lower()):
|
if isinstance(address, str) and re.match(m, address.lower()):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -58,24 +58,38 @@ def model_query(model, *args, **kwargs):
|
|||||||
return query
|
return query
|
||||||
|
|
||||||
|
|
||||||
def add_uuid_filter(query, value):
|
def add_identity_filter(query, value):
|
||||||
|
"""Adds an identity filter to a query.
|
||||||
|
|
||||||
|
Filters results by ID, if supplied value is a valid integer.
|
||||||
|
Otherwise attempts to filter results by UUID.
|
||||||
|
|
||||||
|
:param query: Initial query to add filter to.
|
||||||
|
:param value: Value for filtering results by.
|
||||||
|
:return: Modified query.
|
||||||
|
"""
|
||||||
if utils.is_int_like(value):
|
if utils.is_int_like(value):
|
||||||
return query.filter_by(id=value)
|
return query.filter_by(id=value)
|
||||||
elif uuidutils.is_uuid_like(value):
|
elif uuidutils.is_uuid_like(value):
|
||||||
return query.filter_by(uuid=value)
|
return query.filter_by(uuid=value)
|
||||||
else:
|
else:
|
||||||
raise exception.InvalidUUID(uuid=value)
|
raise exception.InvalidIdentity(identity=value)
|
||||||
|
|
||||||
|
|
||||||
def add_port_filter(query, value):
|
def add_port_filter(query, value):
|
||||||
if utils.is_int_like(value):
|
"""Adds a port-specific filter to a query.
|
||||||
return query.filter_by(id=value)
|
|
||||||
elif utils.is_valid_mac(value):
|
Filters results by address, if supplied value is a valid MAC
|
||||||
|
address. Otherwise attempts to filter results by identity.
|
||||||
|
|
||||||
|
:param query: Initial query to add filter to.
|
||||||
|
:param value: Value for filtering results by.
|
||||||
|
:return: Modified query.
|
||||||
|
"""
|
||||||
|
if utils.is_valid_mac(value):
|
||||||
return query.filter_by(address=value)
|
return query.filter_by(address=value)
|
||||||
elif uuidutils.is_uuid_like(value):
|
|
||||||
return add_uuid_filter(query, value)
|
|
||||||
else:
|
else:
|
||||||
raise exception.InvalidMAC(mac=value)
|
return add_identity_filter(query, value)
|
||||||
|
|
||||||
|
|
||||||
class Connection(api.Connection):
|
class Connection(api.Connection):
|
||||||
@ -109,7 +123,7 @@ class Connection(api.Connection):
|
|||||||
# only if needed to determine the cause of an error.
|
# only if needed to determine the cause of an error.
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
query = model_query(models.Node, session=session)
|
query = model_query(models.Node, session=session)
|
||||||
query = add_uuid_filter(query, node)
|
query = add_identity_filter(query, node)
|
||||||
|
|
||||||
# Be optimistic and assume we usually get a reservation.
|
# Be optimistic and assume we usually get a reservation.
|
||||||
count = query.filter_by(reservation=None).\
|
count = query.filter_by(reservation=None).\
|
||||||
@ -135,7 +149,7 @@ class Connection(api.Connection):
|
|||||||
# only if needed to determine the cause of an error.
|
# only if needed to determine the cause of an error.
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
query = model_query(models.Node, session=session)
|
query = model_query(models.Node, session=session)
|
||||||
query = add_uuid_filter(query, node)
|
query = add_identity_filter(query, node)
|
||||||
|
|
||||||
# be optimistic and assume we usually release a reservation
|
# be optimistic and assume we usually release a reservation
|
||||||
count = query.filter_by(reservation=tag).\
|
count = query.filter_by(reservation=tag).\
|
||||||
@ -160,7 +174,7 @@ class Connection(api.Connection):
|
|||||||
@objects.objectify(objects.Node)
|
@objects.objectify(objects.Node)
|
||||||
def get_node(self, node):
|
def get_node(self, node):
|
||||||
query = model_query(models.Node)
|
query = model_query(models.Node)
|
||||||
query = add_uuid_filter(query, node)
|
query = add_identity_filter(query, node)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = query.one()
|
result = query.one()
|
||||||
@ -188,7 +202,7 @@ class Connection(api.Connection):
|
|||||||
session = get_session()
|
session = get_session()
|
||||||
with session.begin():
|
with session.begin():
|
||||||
query = model_query(models.Node, session=session)
|
query = model_query(models.Node, session=session)
|
||||||
query = add_uuid_filter(query, node)
|
query = add_identity_filter(query, node)
|
||||||
|
|
||||||
count = query.delete()
|
count = query.delete()
|
||||||
if count != 1:
|
if count != 1:
|
||||||
@ -199,7 +213,7 @@ class Connection(api.Connection):
|
|||||||
session = get_session()
|
session = get_session()
|
||||||
with session.begin():
|
with session.begin():
|
||||||
query = model_query(models.Node, session=session)
|
query = model_query(models.Node, session=session)
|
||||||
query = add_uuid_filter(query, node)
|
query = add_identity_filter(query, node)
|
||||||
|
|
||||||
print "Updating with %s." % values
|
print "Updating with %s." % values
|
||||||
count = query.update(values, synchronize_session='fetch')
|
count = query.update(values, synchronize_session='fetch')
|
||||||
|
@ -64,7 +64,7 @@ class DbNodeTestCase(base.DbTestCase):
|
|||||||
self.assertRaises(exception.NodeNotFound,
|
self.assertRaises(exception.NodeNotFound,
|
||||||
self.dbapi.get_node,
|
self.dbapi.get_node,
|
||||||
'12345678-9999-0000-aaaa-123456789012')
|
'12345678-9999-0000-aaaa-123456789012')
|
||||||
self.assertRaises(exception.InvalidUUID,
|
self.assertRaises(exception.InvalidIdentity,
|
||||||
self.dbapi.get_node, 'not-a-uuid')
|
self.dbapi.get_node, 'not-a-uuid')
|
||||||
|
|
||||||
def test_get_node_by_instance(self):
|
def test_get_node_by_instance(self):
|
||||||
|
@ -52,7 +52,7 @@ class DbPortTestCase(base.DbTestCase):
|
|||||||
self.dbapi.get_port, 99)
|
self.dbapi.get_port, 99)
|
||||||
self.assertRaises(exception.PortNotFound,
|
self.assertRaises(exception.PortNotFound,
|
||||||
self.dbapi.get_port, 'aa:bb:cc:dd:ee:ff')
|
self.dbapi.get_port, 'aa:bb:cc:dd:ee:ff')
|
||||||
self.assertRaises(exception.InvalidMAC,
|
self.assertRaises(exception.InvalidIdentity,
|
||||||
self.dbapi.get_port, 'not-a-mac')
|
self.dbapi.get_port, 'not-a-mac')
|
||||||
|
|
||||||
def test_get_ports_by_node_id(self):
|
def test_get_ports_by_node_id(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user