Add support for inspection rules
Related-Change: https://review.opendev.org/c/openstack/ironic/+/939217 Change-Id: I41141fd0aff9a2c8961caf0ef2caadc4a4a45e19
This commit is contained in:
@@ -110,6 +110,14 @@ Runbook Operations
|
|||||||
create_runbook, update_runbook,
|
create_runbook, update_runbook,
|
||||||
patch_runbook, delete_runbook
|
patch_runbook, delete_runbook
|
||||||
|
|
||||||
|
Inspection Rule Operations
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
.. autoclass:: openstack.baremetal.v1._proxy.Proxy
|
||||||
|
:noindex:
|
||||||
|
:members: inspection_rules, get_inspection_rule,
|
||||||
|
create_inspection_rule, update_inspection_rule,
|
||||||
|
patch_inspection_rule, delete_inspection_rule
|
||||||
|
|
||||||
Utilities
|
Utilities
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
@@ -15,3 +15,4 @@ Baremetal Resources
|
|||||||
v1/deploy_templates
|
v1/deploy_templates
|
||||||
v1/conductor
|
v1/conductor
|
||||||
v1/runbooks
|
v1/runbooks
|
||||||
|
v1/inspection_rules
|
||||||
|
13
doc/source/user/resources/baremetal/v1/inspection_rules.rst
Normal file
13
doc/source/user/resources/baremetal/v1/inspection_rules.rst
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
openstack.baremetal.v1.inspection_rules
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
.. automodule:: openstack.baremetal.v1.inspection_rules
|
||||||
|
|
||||||
|
The InspectionRule Class
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
The ``InspectionRule`` class inherits
|
||||||
|
from :class:`~openstack.resource.Resource`.
|
||||||
|
|
||||||
|
.. autoclass:: openstack.baremetal.v1.inspection_rules.InspectionRule
|
||||||
|
:members:
|
@@ -20,6 +20,7 @@ from openstack.baremetal.v1 import chassis as _chassis
|
|||||||
from openstack.baremetal.v1 import conductor as _conductor
|
from openstack.baremetal.v1 import conductor as _conductor
|
||||||
from openstack.baremetal.v1 import deploy_templates as _deploytemplates
|
from openstack.baremetal.v1 import deploy_templates as _deploytemplates
|
||||||
from openstack.baremetal.v1 import driver as _driver
|
from openstack.baremetal.v1 import driver as _driver
|
||||||
|
from openstack.baremetal.v1 import inspection_rules as _inspectionrules
|
||||||
from openstack.baremetal.v1 import node as _node
|
from openstack.baremetal.v1 import node as _node
|
||||||
from openstack.baremetal.v1 import port as _port
|
from openstack.baremetal.v1 import port as _port
|
||||||
from openstack.baremetal.v1 import port_group as _portgroup
|
from openstack.baremetal.v1 import port_group as _portgroup
|
||||||
@@ -47,6 +48,7 @@ class Proxy(proxy.Proxy):
|
|||||||
"runbook": _runbooks.Runbook,
|
"runbook": _runbooks.Runbook,
|
||||||
"volume_connector": _volumeconnector.VolumeConnector,
|
"volume_connector": _volumeconnector.VolumeConnector,
|
||||||
"volume_target": _volumetarget.VolumeTarget,
|
"volume_target": _volumetarget.VolumeTarget,
|
||||||
|
"inspection_rules": _inspectionrules.InspectionRule,
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_with_fields(self, resource_type, value, fields=None):
|
def _get_with_fields(self, resource_type, value, fields=None):
|
||||||
@@ -2026,3 +2028,105 @@ class Proxy(proxy.Proxy):
|
|||||||
to delete failed to occur in the specified seconds.
|
to delete failed to occur in the specified seconds.
|
||||||
"""
|
"""
|
||||||
return resource.wait_for_delete(self, res, interval, wait, callback)
|
return resource.wait_for_delete(self, res, interval, wait, callback)
|
||||||
|
|
||||||
|
# ========== Inspection Rules ==========
|
||||||
|
|
||||||
|
def inspection_rules(self, details=False, **query):
|
||||||
|
"""Retrieve a generator of inspection rules.
|
||||||
|
|
||||||
|
:param dict query: Optional query parameters to be sent to
|
||||||
|
restrict the inspection rules to be returned.
|
||||||
|
|
||||||
|
:returns: A generator of InspectionRule instances.
|
||||||
|
"""
|
||||||
|
if details:
|
||||||
|
query['details'] = True
|
||||||
|
return _inspectionrules.InspectionRule.list(self, **query)
|
||||||
|
|
||||||
|
def create_inspection_rule(self, **attrs):
|
||||||
|
"""Create a new inspection rule from attributes.
|
||||||
|
|
||||||
|
:param dict attrs: Keyword arguments that will be used to create a
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`.
|
||||||
|
|
||||||
|
:returns: The results of inspection rule creation.
|
||||||
|
:rtype:
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`.
|
||||||
|
"""
|
||||||
|
return self._create(_inspectionrules.InspectionRule, **attrs)
|
||||||
|
|
||||||
|
def get_inspection_rule(self, inspection_rule, fields=None):
|
||||||
|
"""Get a specific inspection rule.
|
||||||
|
|
||||||
|
:param inspection_rule: The ID of an inspection rule
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`
|
||||||
|
instance.
|
||||||
|
|
||||||
|
:param fields: Limit the resource fields to fetch.
|
||||||
|
|
||||||
|
:returns: One
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`
|
||||||
|
:raises: :class:`~openstack.exceptions.NotFoundException` when no
|
||||||
|
inspection rule matching the ID could be found.
|
||||||
|
"""
|
||||||
|
return self._get_with_fields(
|
||||||
|
_inspectionrules.InspectionRule, inspection_rule, fields=fields
|
||||||
|
)
|
||||||
|
|
||||||
|
def update_inspection_rule(self, inspection_rule, **attrs):
|
||||||
|
"""Update an inspection rule.
|
||||||
|
|
||||||
|
:param inspection_rule: Either the ID of an inspection rule
|
||||||
|
or an instance of
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`.
|
||||||
|
:param dict attrs: The attributes to update on the
|
||||||
|
inspection rule represented by the ``inspection_rule`` parameter.
|
||||||
|
|
||||||
|
:returns: The updated inspection rule.
|
||||||
|
:rtype:
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`
|
||||||
|
"""
|
||||||
|
return self._update(
|
||||||
|
_inspectionrules.InspectionRule, inspection_rule, **attrs
|
||||||
|
)
|
||||||
|
|
||||||
|
def delete_inspection_rule(self, inspection_rule, ignore_missing=True):
|
||||||
|
"""Delete an inspection rule.
|
||||||
|
|
||||||
|
:param inspection_rule: The value can be either the ID of a
|
||||||
|
inspection_rule or a
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`
|
||||||
|
instance.
|
||||||
|
:param bool ignore_missing: When set to ``False``, an exception
|
||||||
|
:class:`~openstack.exceptions.NotFoundException` will be raised
|
||||||
|
when the inspection rule could not be found.
|
||||||
|
When set to ``True``, no exception will be raised when
|
||||||
|
attempting to delete a non-existent inspection rule.
|
||||||
|
|
||||||
|
:returns: The instance of the inspection rule which was deleted.
|
||||||
|
:rtype:
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`.
|
||||||
|
"""
|
||||||
|
return self._delete(
|
||||||
|
_inspectionrules.InspectionRule,
|
||||||
|
inspection_rule,
|
||||||
|
ignore_missing=ignore_missing,
|
||||||
|
)
|
||||||
|
|
||||||
|
def patch_inspection_rule(self, inspection_rule, patch):
|
||||||
|
"""Apply a JSON patch to the inspection rule.
|
||||||
|
|
||||||
|
:param inspection_rule: The value can be the ID of a
|
||||||
|
inspection_rule or a
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`
|
||||||
|
instance.
|
||||||
|
|
||||||
|
:param patch: JSON patch to apply.
|
||||||
|
|
||||||
|
:returns: The updated inspection rule.
|
||||||
|
:rtype:
|
||||||
|
:class:`~openstack.baremetal.v1.inspection_rules.InspectionRule`
|
||||||
|
"""
|
||||||
|
return self._get_resource(
|
||||||
|
_inspectionrules.InspectionRule, inspection_rule
|
||||||
|
).patch(self, patch)
|
||||||
|
57
openstack/baremetal/v1/inspection_rules.py
Normal file
57
openstack/baremetal/v1/inspection_rules.py
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack.baremetal.v1 import _common
|
||||||
|
from openstack import resource
|
||||||
|
|
||||||
|
|
||||||
|
class InspectionRule(_common.Resource):
|
||||||
|
resources_key = 'inspection_rules'
|
||||||
|
base_path = '/inspection_rules'
|
||||||
|
|
||||||
|
# capabilities
|
||||||
|
allow_create = True
|
||||||
|
allow_fetch = True
|
||||||
|
allow_commit = True
|
||||||
|
allow_delete = True
|
||||||
|
allow_list = True
|
||||||
|
allow_patch = True
|
||||||
|
commit_method = 'PATCH'
|
||||||
|
commit_jsonpatch = True
|
||||||
|
|
||||||
|
_query_mapping = resource.QueryParameters(
|
||||||
|
'detail',
|
||||||
|
fields={'type': _common.fields_type},
|
||||||
|
)
|
||||||
|
|
||||||
|
# Inspection rules is available since 1.96
|
||||||
|
_max_microversion = '1.96'
|
||||||
|
#: The actions to be executed when the rule conditions are met.
|
||||||
|
actions = resource.Body('actions', type=list)
|
||||||
|
#: A brief explanation about the inspection rule.
|
||||||
|
description = resource.Body('description')
|
||||||
|
#: The conditions under which the rule should be triggered.
|
||||||
|
conditions = resource.Body('conditions', type=list)
|
||||||
|
#: Timestamp at which the resource was created.
|
||||||
|
created_at = resource.Body('created_at')
|
||||||
|
#: A list of relative links. Includes the self and bookmark links.
|
||||||
|
links = resource.Body('links', type=list)
|
||||||
|
#: Specifies the phase when the rule should run, defaults to 'main'.
|
||||||
|
phase = resource.Body('phase')
|
||||||
|
#: Specifies the rule's precedence level during execution.
|
||||||
|
priority = resource.Body('priority')
|
||||||
|
#: Indicates whether the rule contains sensitive information.
|
||||||
|
sensitive = resource.Body('sensitive', type=bool)
|
||||||
|
#: Timestamp at which the resource was last updated.
|
||||||
|
updated_at = resource.Body('updated_at')
|
||||||
|
#: The UUID of the resource.
|
||||||
|
id = resource.Body('uuid', alternate_id=True)
|
@@ -132,3 +132,15 @@ class BaseBaremetalTest(base.BaseFunctionalTest):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
return runbook
|
return runbook
|
||||||
|
|
||||||
|
def create_inspection_rule(self, **kwargs):
|
||||||
|
"""Create a new inspection_rule from attributes."""
|
||||||
|
|
||||||
|
inspection_rule = self.conn.baremetal.create_inspection_rule(**kwargs)
|
||||||
|
|
||||||
|
self.addCleanup(
|
||||||
|
lambda: self.conn.baremetal.delete_inspection_rule(
|
||||||
|
inspection_rule.id, ignore_missing=True
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return inspection_rule
|
||||||
|
@@ -0,0 +1,192 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack import exceptions
|
||||||
|
from openstack.tests.functional.baremetal import base
|
||||||
|
|
||||||
|
|
||||||
|
class TestBareMetalInspectionRule(base.BaseBaremetalTest):
|
||||||
|
min_microversion = '1.96'
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
|
||||||
|
def test_baremetal_inspection_rule_create_get_delete(self):
|
||||||
|
actions = [{"op": "set-attribute", "args": ["/driver", "idrac"]}]
|
||||||
|
conditions = [
|
||||||
|
{"op": "eq", "args": ["node:memory_mb", 4096], "multiple": "all"}
|
||||||
|
]
|
||||||
|
inspection_rule = self.create_inspection_rule(
|
||||||
|
actions=actions,
|
||||||
|
conditions=conditions,
|
||||||
|
description="Test inspection rule",
|
||||||
|
phase="main",
|
||||||
|
priority=100,
|
||||||
|
sensitive=False,
|
||||||
|
)
|
||||||
|
loaded = self.conn.baremetal.get_inspection_rule(inspection_rule.id)
|
||||||
|
self.assertEqual(loaded.id, inspection_rule.id)
|
||||||
|
self.conn.baremetal.delete_inspection_rule(
|
||||||
|
inspection_rule, ignore_missing=False
|
||||||
|
)
|
||||||
|
self.assertRaises(
|
||||||
|
exceptions.NotFoundException,
|
||||||
|
self.conn.baremetal.get_inspection_rule,
|
||||||
|
inspection_rule.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_baremetal_inspection_rule_list(self):
|
||||||
|
actions = [{"op": "set-attribute", "args": ["/driver", "idrac"]}]
|
||||||
|
conditions = [
|
||||||
|
{
|
||||||
|
"op": "is-true",
|
||||||
|
"args": ["{node.auto_discovered}"],
|
||||||
|
"multiple": "any",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
inspection_rule1 = self.create_inspection_rule(
|
||||||
|
actions=actions,
|
||||||
|
conditions=conditions,
|
||||||
|
description="Test inspection rule 1",
|
||||||
|
)
|
||||||
|
inspection_rule2 = self.create_inspection_rule(
|
||||||
|
actions=actions,
|
||||||
|
conditions=conditions,
|
||||||
|
description="Test inspection rule 2",
|
||||||
|
)
|
||||||
|
inspection_rules = self.conn.baremetal.inspection_rules()
|
||||||
|
ids = [rule.id for rule in inspection_rules]
|
||||||
|
self.assertIn(inspection_rule1.id, ids)
|
||||||
|
self.assertIn(inspection_rule2.id, ids)
|
||||||
|
|
||||||
|
inspection_rules_with_details = self.conn.baremetal.inspection_rules(
|
||||||
|
details=True
|
||||||
|
)
|
||||||
|
for rule in inspection_rules_with_details:
|
||||||
|
self.assertIsNotNone(rule.id)
|
||||||
|
self.assertIsNotNone(rule.description)
|
||||||
|
|
||||||
|
inspection_rule_with_fields = self.conn.baremetal.inspection_rules(
|
||||||
|
fields=['uuid']
|
||||||
|
)
|
||||||
|
for rule in inspection_rule_with_fields:
|
||||||
|
self.assertIsNotNone(rule.id)
|
||||||
|
self.assertIsNone(rule.description)
|
||||||
|
|
||||||
|
def test_baremetal_inspection_rule_list_update_delete(self):
|
||||||
|
actions = [{"op": "set-attribute", "args": ["/driver", "idrac"]}]
|
||||||
|
conditions = [
|
||||||
|
{
|
||||||
|
"op": "eq",
|
||||||
|
"args": ["node:cpu_arch", "x86_64"],
|
||||||
|
"multiple": "all",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
inspection_rule = self.create_inspection_rule(
|
||||||
|
actions=actions,
|
||||||
|
conditions=conditions,
|
||||||
|
description="Test inspection rule",
|
||||||
|
)
|
||||||
|
self.assertFalse(inspection_rule.extra)
|
||||||
|
inspection_rule.description = 'Updated inspection rule'
|
||||||
|
|
||||||
|
inspection_rule = self.conn.baremetal.update_inspection_rule(
|
||||||
|
inspection_rule
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
'Updated inspection rule', inspection_rule.description
|
||||||
|
)
|
||||||
|
|
||||||
|
inspection_rule = self.conn.baremetal.get_inspection_rule(
|
||||||
|
inspection_rule.id
|
||||||
|
)
|
||||||
|
|
||||||
|
self.conn.baremetal.delete_inspection_rule(
|
||||||
|
inspection_rule.id, ignore_missing=False
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_baremetal_inspection_rule_update(self):
|
||||||
|
actions = [{"op": "set-attribute", "args": ["/driver", "idrac"]}]
|
||||||
|
conditions = [
|
||||||
|
{"op": "ge", "args": ["node:memory_mb", 4096], "multiple": "all"}
|
||||||
|
]
|
||||||
|
inspection_rule = self.create_inspection_rule(
|
||||||
|
actions=actions, conditions=conditions, phase="main", priority=100
|
||||||
|
)
|
||||||
|
inspection_rule.priority = 150
|
||||||
|
|
||||||
|
inspection_rule = self.conn.baremetal.update_inspection_rule(
|
||||||
|
inspection_rule
|
||||||
|
)
|
||||||
|
self.assertEqual(150, inspection_rule.priority)
|
||||||
|
|
||||||
|
inspection_rule = self.conn.baremetal.get_inspection_rule(
|
||||||
|
inspection_rule.id
|
||||||
|
)
|
||||||
|
self.assertEqual(150, inspection_rule.priority)
|
||||||
|
|
||||||
|
def test_inspection_rule_patch(self):
|
||||||
|
description = "BIOS configuration rule"
|
||||||
|
actions = [
|
||||||
|
{
|
||||||
|
"op": "set-attribute",
|
||||||
|
"args": ["/properties/capabilities", "boot_mode:uefi"],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
conditions = [
|
||||||
|
{
|
||||||
|
"op": "is-true",
|
||||||
|
"args": ["{node.auto_discovered}"],
|
||||||
|
"multiple": "any",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
inspection_rule = self.create_inspection_rule(
|
||||||
|
actions=actions,
|
||||||
|
conditions=conditions,
|
||||||
|
description=description,
|
||||||
|
sensitive=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
updated_actions = [
|
||||||
|
{
|
||||||
|
"op": "set-attribute",
|
||||||
|
"args": ["/driver", "fake"],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
inspection_rule = self.conn.baremetal.patch_inspection_rule(
|
||||||
|
inspection_rule,
|
||||||
|
dict(path='/actions', op='add', value=updated_actions),
|
||||||
|
)
|
||||||
|
self.assertEqual(updated_actions, inspection_rule.actions)
|
||||||
|
self.assertEqual(description, inspection_rule.description)
|
||||||
|
|
||||||
|
inspection_rule = self.conn.baremetal.get_inspection_rule(
|
||||||
|
inspection_rule.id
|
||||||
|
)
|
||||||
|
self.assertEqual(updated_actions, inspection_rule.actions)
|
||||||
|
|
||||||
|
def test_inspection_rule_negative_non_existing(self):
|
||||||
|
uuid = "bbb45f41-d4bc-4307-8d1d-32f95ce1e920"
|
||||||
|
self.assertRaises(
|
||||||
|
exceptions.NotFoundException,
|
||||||
|
self.conn.baremetal.get_inspection_rule,
|
||||||
|
uuid,
|
||||||
|
)
|
||||||
|
self.assertRaises(
|
||||||
|
exceptions.NotFoundException,
|
||||||
|
self.conn.baremetal.delete_inspection_rule,
|
||||||
|
uuid,
|
||||||
|
ignore_missing=False,
|
||||||
|
)
|
||||||
|
self.assertIsNone(self.conn.baremetal.delete_inspection_rule(uuid))
|
90
openstack/tests/unit/baremetal/v1/test_inspection_rules.py
Normal file
90
openstack/tests/unit/baremetal/v1/test_inspection_rules.py
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack.baremetal.v1 import inspection_rules
|
||||||
|
from openstack.tests.unit import base
|
||||||
|
|
||||||
|
|
||||||
|
FAKE = {
|
||||||
|
"created_at": "2025-03-18T22:28:48.643434+11:11",
|
||||||
|
"description": "BMC credentials",
|
||||||
|
"phase": "main",
|
||||||
|
"priority": 100,
|
||||||
|
"sensitive": False,
|
||||||
|
"actions": [
|
||||||
|
{
|
||||||
|
"op": "set-attribute",
|
||||||
|
"args": {
|
||||||
|
"path": "/properties/cpus",
|
||||||
|
"value": "{inventory[cpu][count]}",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"op": "set-attribute",
|
||||||
|
"args": {
|
||||||
|
"path": "/properties/memory_mb",
|
||||||
|
"value": "{inventory[memory][physical_mb]}",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"op": "set-attribute",
|
||||||
|
"args": {
|
||||||
|
"path": "/properties/cpu_arch",
|
||||||
|
"value": "{inventory[cpu][architecture]}",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"conditions": [
|
||||||
|
{"op": "is-true", "args": {"value": "{inventory[cpu][count]}"}}
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://10.60.253.180:6385/v1/inspection_rules"
|
||||||
|
"/783bf33a-a8e3-1e23-a645-1e95a1f95186",
|
||||||
|
"rel": "self",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://10.60.253.180:6385/inspection_rules"
|
||||||
|
"/783bf33a-a8e3-1e23-a645-1e95a1f95186",
|
||||||
|
"rel": "bookmark",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"updated_at": None,
|
||||||
|
"uuid": "783bf33a-a8e3-1e23-a645-1e95a1f95186",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class InspectionRules(base.TestCase):
|
||||||
|
def test_basic(self):
|
||||||
|
sot = inspection_rules.InspectionRule()
|
||||||
|
self.assertIsNone(sot.resource_key)
|
||||||
|
self.assertEqual('inspection_rules', sot.resources_key)
|
||||||
|
self.assertEqual('/inspection_rules', sot.base_path)
|
||||||
|
self.assertTrue(sot.allow_create)
|
||||||
|
self.assertTrue(sot.allow_fetch)
|
||||||
|
self.assertTrue(sot.allow_commit)
|
||||||
|
self.assertTrue(sot.allow_delete)
|
||||||
|
self.assertTrue(sot.allow_list)
|
||||||
|
self.assertEqual('PATCH', sot.commit_method)
|
||||||
|
|
||||||
|
def test_instantiate(self):
|
||||||
|
sot = inspection_rules.InspectionRule(**FAKE)
|
||||||
|
self.assertEqual(FAKE['actions'], sot.actions)
|
||||||
|
self.assertEqual(FAKE['description'], sot.description)
|
||||||
|
self.assertEqual(FAKE['conditions'], sot.conditions)
|
||||||
|
self.assertEqual(FAKE['created_at'], sot.created_at)
|
||||||
|
self.assertEqual(FAKE['links'], sot.links)
|
||||||
|
self.assertEqual(FAKE['phase'], sot.phase)
|
||||||
|
self.assertEqual(FAKE['priority'], sot.priority)
|
||||||
|
self.assertEqual(FAKE['sensitive'], sot.sensitive)
|
||||||
|
self.assertEqual(FAKE['updated_at'], sot.updated_at)
|
||||||
|
self.assertEqual(FAKE['uuid'], sot.id)
|
@@ -17,6 +17,7 @@ from openstack.baremetal.v1 import allocation
|
|||||||
from openstack.baremetal.v1 import chassis
|
from openstack.baremetal.v1 import chassis
|
||||||
from openstack.baremetal.v1 import deploy_templates
|
from openstack.baremetal.v1 import deploy_templates
|
||||||
from openstack.baremetal.v1 import driver
|
from openstack.baremetal.v1 import driver
|
||||||
|
from openstack.baremetal.v1 import inspection_rules
|
||||||
from openstack.baremetal.v1 import node
|
from openstack.baremetal.v1 import node
|
||||||
from openstack.baremetal.v1 import port
|
from openstack.baremetal.v1 import port
|
||||||
from openstack.baremetal.v1 import port_group
|
from openstack.baremetal.v1 import port_group
|
||||||
@@ -510,3 +511,49 @@ class TestWaitForNodesProvisionState(base.TestCase):
|
|||||||
self.assertEqual(['1'], [x.id for x in result.success])
|
self.assertEqual(['1'], [x.id for x in result.success])
|
||||||
self.assertEqual(['3'], [x.id for x in result.timeout])
|
self.assertEqual(['3'], [x.id for x in result.timeout])
|
||||||
self.assertEqual(['2'], [x.id for x in result.failure])
|
self.assertEqual(['2'], [x.id for x in result.failure])
|
||||||
|
|
||||||
|
|
||||||
|
class TestInspectionRules(TestBaremetalProxy):
|
||||||
|
@mock.patch.object(inspection_rules.InspectionRule, 'list')
|
||||||
|
def test_inspection_rules_detailed(self, mock_list):
|
||||||
|
result = self.proxy.inspection_rules(details=True, query=1)
|
||||||
|
self.assertIs(result, mock_list.return_value)
|
||||||
|
mock_list.assert_called_once_with(self.proxy, details=True, query=1)
|
||||||
|
|
||||||
|
@mock.patch.object(inspection_rules.InspectionRule, 'list')
|
||||||
|
def test_inspection_rules_not_detailed(self, mock_list):
|
||||||
|
result = self.proxy.inspection_rules(query=1)
|
||||||
|
self.assertIs(result, mock_list.return_value)
|
||||||
|
mock_list.assert_called_once_with(self.proxy, query=1)
|
||||||
|
|
||||||
|
def test_create_inspection_rule(self):
|
||||||
|
self.verify_create(
|
||||||
|
self.proxy.create_inspection_rule, inspection_rules.InspectionRule
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_get_inspection_rule(self):
|
||||||
|
self.verify_get(
|
||||||
|
self.proxy.get_inspection_rule,
|
||||||
|
inspection_rules.InspectionRule,
|
||||||
|
mock_method=_MOCK_METHOD,
|
||||||
|
expected_kwargs={'fields': None},
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_update_inspection_rule(self):
|
||||||
|
self.verify_update(
|
||||||
|
self.proxy.update_inspection_rule, inspection_rules.InspectionRule
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_delete_inspection_rule(self):
|
||||||
|
self.verify_delete(
|
||||||
|
self.proxy.delete_inspection_rule,
|
||||||
|
inspection_rules.InspectionRule,
|
||||||
|
False,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_delete_inspection_rule_ignore(self):
|
||||||
|
self.verify_delete(
|
||||||
|
self.proxy.delete_inspection_rule,
|
||||||
|
inspection_rules.InspectionRule,
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Adds support for inspection rules; an API feature to create a resource
|
||||||
|
containing conditions that evaluate against inspection data and actions
|
||||||
|
that run on a node when conditions are met during inspection.
|
Reference in New Issue
Block a user