diff options
Diffstat (limited to 'ironic/api')
-rw-r--r-- | ironic/api/controllers/v1/node.py | 24 | ||||
-rw-r--r-- | ironic/api/controllers/v1/utils.py | 13 |
2 files changed, 29 insertions, 8 deletions
diff --git a/ironic/api/controllers/v1/node.py b/ironic/api/controllers/v1/node.py index c02e693df..bcbdbb40f 100644 --- a/ironic/api/controllers/v1/node.py +++ b/ironic/api/controllers/v1/node.py @@ -1523,8 +1523,8 @@ class NodesController(rest.RestController): def _get_nodes_collection(self, chassis_uuid, instance_uuid, associated, maintenance, provision_state, marker, limit, sort_key, sort_dir, driver=None, - resource_class=None, - resource_url=None, fields=None): + resource_class=None, resource_url=None, + fields=None, fault=None): if self.from_chassis and not chassis_uuid: raise exception.MissingParameterValue( _("Chassis id not specified.")) @@ -1570,6 +1570,8 @@ class NodesController(rest.RestController): filters['driver'] = driver if resource_class is not None: filters['resource_class'] = resource_class + if fault is not None: + filters['fault'] = fault nodes = objects.Node.list(pecan.request.context, limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir, @@ -1673,11 +1675,12 @@ class NodesController(rest.RestController): @METRICS.timer('NodesController.get_all') @expose.expose(NodeCollection, types.uuid, types.uuid, types.boolean, types.boolean, wtypes.text, types.uuid, int, wtypes.text, - wtypes.text, wtypes.text, types.listtype, wtypes.text) + wtypes.text, wtypes.text, types.listtype, wtypes.text, + wtypes.text) def get_all(self, chassis_uuid=None, instance_uuid=None, associated=None, maintenance=None, provision_state=None, marker=None, limit=None, sort_key='id', sort_dir='asc', driver=None, - fields=None, resource_class=None): + fields=None, resource_class=None, fault=None): """Retrieve a list of nodes. :param chassis_uuid: Optional UUID of a chassis, to get only nodes for @@ -1705,6 +1708,7 @@ class NodesController(rest.RestController): that resource_class. :param fields: Optional, a list with a specified set of fields of the resource to be returned. + :param fault: Optional string value to get only nodes with that fault. """ cdict = pecan.request.context.to_policy_values() policy.authorize('baremetal:node:get', cdict, cdict) @@ -1715,6 +1719,7 @@ class NodesController(rest.RestController): api_utils.check_for_invalid_state_and_allow_filter(provision_state) api_utils.check_allow_specify_driver(driver) api_utils.check_allow_specify_resource_class(resource_class) + api_utils.check_allow_filter_by_fault(fault) if fields is None: fields = _DEFAULT_RETURN_FIELDS return self._get_nodes_collection(chassis_uuid, instance_uuid, @@ -1723,16 +1728,16 @@ class NodesController(rest.RestController): limit, sort_key, sort_dir, driver=driver, resource_class=resource_class, - fields=fields) + fields=fields, fault=fault) @METRICS.timer('NodesController.detail') @expose.expose(NodeCollection, types.uuid, types.uuid, types.boolean, types.boolean, wtypes.text, types.uuid, int, wtypes.text, - wtypes.text, wtypes.text, wtypes.text) + wtypes.text, wtypes.text, wtypes.text, wtypes.text) def detail(self, chassis_uuid=None, instance_uuid=None, associated=None, maintenance=None, provision_state=None, marker=None, limit=None, sort_key='id', sort_dir='asc', driver=None, - resource_class=None): + resource_class=None, fault=None): """Retrieve a list of nodes with detail. :param chassis_uuid: Optional UUID of a chassis, to get only nodes for @@ -1758,6 +1763,7 @@ class NodesController(rest.RestController): driver. :param resource_class: Optional string value to get only nodes with that resource_class. + :param fault: Optional string value to get only nodes with that fault. """ cdict = pecan.request.context.to_policy_values() policy.authorize('baremetal:node:get', cdict, cdict) @@ -1765,6 +1771,7 @@ class NodesController(rest.RestController): api_utils.check_for_invalid_state_and_allow_filter(provision_state) api_utils.check_allow_specify_driver(driver) api_utils.check_allow_specify_resource_class(resource_class) + api_utils.check_allow_filter_by_fault(fault) api_utils.check_allowed_fields([sort_key]) # /detail should only work against collections parent = pecan.request.path.split('/')[:-1][-1] @@ -1778,7 +1785,8 @@ class NodesController(rest.RestController): limit, sort_key, sort_dir, driver=driver, resource_class=resource_class, - resource_url=resource_url) + resource_url=resource_url, + fault=fault) @METRICS.timer('NodesController.validate') @expose.expose(wtypes.text, types.uuid_or_name, types.uuid) diff --git a/ironic/api/controllers/v1/utils.py b/ironic/api/controllers/v1/utils.py index 7ea7cf578..e97cadb75 100644 --- a/ironic/api/controllers/v1/utils.py +++ b/ironic/api/controllers/v1/utils.py @@ -479,6 +479,19 @@ def check_allow_configdrive(target): msg, status_code=http_client.BAD_REQUEST) +def check_allow_filter_by_fault(fault): + """Check if filtering nodes by fault is allowed. + + Version 1.42 of the API allows filtering nodes by fault. + """ + if (fault is not None and pecan.request.version.minor + < versions.MINOR_42_FAULT): + raise exception.NotAcceptable(_( + "Request not acceptable. The minimal required API version " + "should be %(base)s.%(opr)s") % {'base': versions.BASE_VERSION, + 'opr': versions.MINOR_42_FAULT}) + + def initial_node_provision_state(): """Return node state to use by default when creating new nodes. |