Add parameter for filtering nodes by maintenance mode

Boolean parameter 'maintenance' added to API for filtering
nodes by maintenance mode, example:
/nodes?maintenance=false
strutils.bool_from_string() used for converting 'associated'
and 'maintenance' parameters, accepted values now for True
('1', 't', 'true', 'on', 'y', 'yes'), for False
('0', 'f', 'false', 'off', 'n', 'no') case-insensitive.
Refactored dbapi method get_node_list with filters used for
_get_nodes_collection in nodes controller.

Partial-Bug: #1260099
Partial-Bug: #1271291
Change-Id: I01a62eb641316e890d191cf569bb3cf00b7619f2
This commit is contained in:
Yuriy Zveryanskyy
2013-12-24 15:41:54 +02:00
parent b7a243b63f
commit 487f6738bc
5 changed files with 180 additions and 156 deletions

View File

@@ -183,18 +183,14 @@ class Connection(api.Connection):
def __init__(self):
pass
def get_nodeinfo_list(self, columns=None, filters=None, limit=None,
marker=None, sort_key=None, sort_dir=None):
# list-ify columns and filters default values because it is bad form
# to include a mutable list in function definitions.
def _add_nodes_filters(self, query, filters):
if filters is None:
filters = []
if columns is None:
columns = [models.Node.id]
else:
columns = [getattr(models.Node, c) for c in columns]
query = model_query(*columns, base_model=models.Node)
if 'chassis_uuid' in filters:
# get_chassis() to raise an exception if the chassis is not found
chassis_obj = self.get_chassis(filters['chassis_uuid'])
query = query.filter_by(chassis_id=chassis_obj.id)
if 'associated' in filters:
if filters['associated']:
query = query.filter(models.Node.instance_uuid != None)
@@ -205,40 +201,32 @@ class Connection(api.Connection):
query = query.filter(models.Node.reservation != None)
else:
query = query.filter(models.Node.reservation == None)
if 'maintenance' in filters:
query = query.filter_by(maintenance=filters['maintenance'])
if 'driver' in filters:
query = query.filter(models.Node.driver == filters['driver'])
query = query.filter_by(driver=filters['driver'])
return query
def get_nodeinfo_list(self, columns=None, filters=None, limit=None,
marker=None, sort_key=None, sort_dir=None):
# list-ify columns default values because it is bad form
# to include a mutable list in function definitions.
if columns is None:
columns = [models.Node.id]
else:
columns = [getattr(models.Node, c) for c in columns]
query = model_query(*columns, base_model=models.Node)
query = self._add_nodes_filters(query, filters)
return _paginate_query(models.Node, limit, marker,
sort_key, sort_dir, query)
@objects.objectify(objects.Node)
def get_node_list(self, limit=None, marker=None,
def get_node_list(self, filters=None, limit=None, marker=None,
sort_key=None, sort_dir=None):
return _paginate_query(models.Node, limit, marker,
sort_key, sort_dir)
@objects.objectify(objects.Node)
def get_nodes_by_chassis(self, chassis_id, limit=None, marker=None,
sort_key=None, sort_dir=None):
# get_chassis() to raise an exception if the chassis is not found
chassis_obj = self.get_chassis(chassis_id)
query = model_query(models.Node)
query = query.filter_by(chassis_id=chassis_obj.id)
return _paginate_query(models.Node, limit, marker,
sort_key, sort_dir, query)
@objects.objectify(objects.Node)
def get_associated_nodes(self, limit=None, marker=None,
sort_key=None, sort_dir=None):
query = model_query(models.Node).\
filter(models.Node.instance_uuid != None)
return _paginate_query(models.Node, limit, marker,
sort_key, sort_dir, query)
@objects.objectify(objects.Node)
def get_unassociated_nodes(self, limit=None, marker=None,
sort_key=None, sort_dir=None):
query = model_query(models.Node).\
filter(models.Node.instance_uuid == None)
query = self._add_nodes_filters(query, filters)
return _paginate_query(models.Node, limit, marker,
sort_key, sort_dir, query)