summaryrefslogtreecommitdiff
path: root/ironic/api
diff options
context:
space:
mode:
authorKaifeng Wang <kaifeng.w@gmail.com>2018-06-05 20:33:00 +0800
committerRuby Loo <opensrloo@gmail.com>2018-06-06 13:20:55 +0000
commit8ee2f4b58f62d2c96e7da640e17102e979322eb1 (patch)
tree1f842d4927156cebda00c0d06029b7b6263709f9 /ironic/api
parentd69dc019cb0573a3edcbff3ccca479cefc5ec67c (diff)
downloadironic-8ee2f4b58f62d2c96e7da640e17102e979322eb1.tar.gz
Power fault recovery follow up
This patch addresses comments relate to API and notification. [1] https://review.openstack.org/#/c/558152 [2] https://review.openstack.org/#/c/556015/ Story: #1596107 Task: #10469 Change-Id: Ic2f7e6847790ae7af43570ca7af572539e7d5f2c
Diffstat (limited to 'ironic/api')
-rw-r--r--ironic/api/controllers/v1/node.py24
-rw-r--r--ironic/api/controllers/v1/utils.py13
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.