Add status attribution to all resources

Change-Id: I6deee073fb906dccc52dafb4803dfb00e73a1757
This commit is contained in:
Lin Yang 2018-02-07 20:38:24 -08:00
parent 50d8947ca4
commit acc3dc8394
17 changed files with 113 additions and 17 deletions

View File

@ -16,6 +16,12 @@
from sushy.resources import base
class StatusField(base.CompositeField):
state = base.Field('State')
health = base.Field('Health')
health_rollup = base.Field('HealthRollup')
class Chassis(base.ResourceBase):
identity = base.Field('Id', required=True)
"""The chassis identity string"""
@ -41,6 +47,9 @@ class Chassis(base.ResourceBase):
sku = base.Field('SKU')
"""The chassis stock-keeping unit"""
status = StatusField('Status')
"""The chassis status"""
chassis_type = base.Field('ChassisType')
"""The chassis type"""

View File

@ -41,6 +41,12 @@ class ConnectedEntitiesField(rsd_base.FieldList):
identifiers = IdentifiersField('Identifiers')
class StatusField(base.CompositeField):
state = base.Field('State')
health = base.Field('Health')
health_rollup = base.Field('HealthRollup')
class Endpoint(base.ResourceBase):
connected_entities = ConnectedEntitiesField('ConnectedEntities')
@ -67,6 +73,9 @@ class Endpoint(base.ResourceBase):
redundancy = base.Field('Redundancy')
"""The endpoint redundancy"""
status = StatusField('Status')
"""The endpoint status"""
def __init__(self, connector, identity, redfish_version=None):
"""A class representing an Endpoint

View File

@ -28,6 +28,11 @@ class ZoneLinksField(base.CompositeField):
adapter=utils.get_members_identities)
class StatusField(base.CompositeField):
state = base.Field('State')
health = base.Field('Health')
class Zone(base.ResourceBase):
description = base.Field('Description')
@ -42,6 +47,9 @@ class Zone(base.ResourceBase):
links = ZoneLinksField('Links')
"""The zone links"""
status = StatusField('Status')
"""The zone status"""
_endpoints = None # ref to contained endpoints
def __init__(self, connector, identity, redfish_version=None):

View File

@ -87,11 +87,8 @@ class BootField(base.CompositeField):
class MemorySummaryField(base.CompositeField):
health = base.Field(['Status', 'Health'])
"""The overall health state of memory.
This signifies health state of memory along with its dependent resources.
"""
status = StatusField('Status')
"""The memory status"""
size_gib = base.Field('TotalSystemMemoryGiB', adapter=int)
"""The size of memory of the node in GiB.
@ -102,8 +99,8 @@ class MemorySummaryField(base.CompositeField):
class ProcessorSummaryField(base.CompositeField):
health = base.Field(['Status', 'Health'])
"""The overall health state of the node processors."""
status = StatusField('Status')
"""The processor status"""
count = base.Field('Count', adapter=int)
"""The number of CPUs in the node."""

View File

@ -20,6 +20,12 @@ from sushy.resources import base
LOG = logging.getLogger(__name__)
class StatusField(base.CompositeField):
state = base.Field('State')
health = base.Field('Health')
health_rollup = base.Field('HealthRollup')
class LogicalDrive(base.ResourceBase):
identity = base.Field('Id', required=True)
@ -46,6 +52,9 @@ class LogicalDrive(base.ResourceBase):
snapshot = base.Field('Snapshot')
"""Type of drive replication. Yes - copy on write, No - disc clone"""
status = StatusField('Status')
"""The logical drive status"""
def __init__(self, connector, identity, redfish_version=None):
"""A class representing a LogicalDrive

View File

@ -20,6 +20,12 @@ from sushy.resources import base
LOG = logging.getLogger(__name__)
class StatusField(base.CompositeField):
state = base.Field('State')
health = base.Field('Health')
health_rollup = base.Field('HealthRollup')
class PhysicalDrive(base.ResourceBase):
identity = base.Field('Id', required=True)
@ -46,6 +52,9 @@ class PhysicalDrive(base.ResourceBase):
serial_number = base.Field('SerialNumber')
"""The serial number for the physical drive"""
status = StatusField('Status')
"""The physical drive status"""
def __init__(self, connector, identity, redfish_version=None):
"""A class representing a PhysicalDrive

View File

@ -45,6 +45,12 @@ class InitiatorsField(rsd_base.FieldList):
iscsi = ISCSIInitiatorField('iSCSI')
class StatusField(base.CompositeField):
state = base.Field('State')
health = base.Field('Health')
health_rollup = base.Field('HealthRollup')
class RemoteTarget(base.ResourceBase):
identity = base.Field('Id', required=True)
@ -57,6 +63,9 @@ class RemoteTarget(base.ResourceBase):
initiators = InitiatorsField('Initiator')
status = StatusField('Status')
"""The remote target status"""
def __init__(self, connector, identity, redfish_version=None):
"""A class representing a RemoteTarget

View File

@ -28,6 +28,7 @@ LOG = logging.getLogger(__name__)
class StatusField(base.CompositeField):
state = base.Field('State')
health = base.Field('Health')
health_rollup = base.Field('HealthRollup')
class StorageService(base.ResourceBase):

View File

@ -8,7 +8,7 @@
"Status": {
"State": "Enabled",
"Health": "OK",
"HealthRollUp": "OK"
"HealthRollup": "OK"
},
"EndpointProtocol": "PCIe",
"Identifiers": [

View File

@ -8,6 +8,7 @@
"Status": {
"State": "Enabled",
"Health": "OK",
"HealthRollup": "OK"
},
"Type": "LVM",
"Mode": "RAID0",

View File

@ -17,14 +17,16 @@
"Model": "Multi-Core Intel(R) Xeon(R) processor 7xxx Series",
"Status": {
"State": "Enabled",
"Health": "OK"
"Health": "OK",
"HealthRollup" : "OK"
}
},
"Memory": {
"TotalSystemMemoryGiB": 32,
"Status": {
"State": "Enabled",
"Health": "OK"
"Health": "OK",
"HealthRollup" : "OK"
}
},
"ComposedNodeState": "Allocated",

View File

@ -7,7 +7,8 @@
"Description": "Storage Service",
"Status": {
"State": "Enabled",
"Health": "OK"
"Health": "OK",
"HealthRollup": "OK"
},
"RemoteTargets": {
"@odata.id": "/redfish/v1/Services/RSS1/Targets"
@ -27,4 +28,4 @@
],
"Oem": {}
}
}
}

View File

@ -47,6 +47,9 @@ class TestChassis(base.TestCase):
self.assertEqual('e1c2d764-5c72', self.chassis_inst.sku)
self.assertEqual('e1c2d764-5c72-36d6-9945-a78255edab51',
self.chassis_inst.oem['Intel:RackScale']['UUID'])
self.assertEqual('Enabled', self.chassis_inst.status.state)
self.assertEqual('OK', self.chassis_inst.status.health)
self.assertEqual('OK', self.chassis_inst.status.health_rollup)
class TestChassisCollection(base.TestCase):

View File

@ -60,6 +60,9 @@ class EndpointTestCase(testtools.TestCase):
self.assertEqual(
'00000000-0000-0000-0000-000000000000',
self.endpoint_inst.connected_entities[0].identifiers[0].name)
self.assertEqual('Enabled', self.endpoint_inst.status.state)
self.assertEqual('OK', self.endpoint_inst.status.health)
self.assertEqual('OK', self.endpoint_inst.status.health_rollup)
class EndpointCollectionTestCase(testtools.TestCase):

View File

@ -45,6 +45,8 @@ class ZoneTestCase(testtools.TestCase):
'Endpoints/HostRootComplex1',
'/redfish/v1/Fabrics/PCIe/Endpoints/NVMeDrivePF2'),
self.zone_inst.links.endpoint_identities)
self.assertEqual('Enabled', self.zone_inst.status.state)
self.assertEqual('OK', self.zone_inst.status.health)
def test_get_endpoints(self):
self.conn.get.return_value.json.reset_mock()

View File

@ -54,11 +54,18 @@ class NodeTestCase(testtools.TestCase):
self.assertEqual('OK', self.node_inst.status.health)
self.assertEqual('OK', self.node_inst.status.health_rollup)
self.assertEqual(32, self.node_inst.memory_summary.size_gib)
self.assertEqual('OK', self.node_inst.memory_summary.health)
self.assertEqual('Enabled', self.node_inst.memory_summary.status.state)
self.assertEqual('OK', self.node_inst.memory_summary.status.health)
self.assertEqual(
'OK', self.node_inst.memory_summary.status.health_rollup)
self.assertEqual(2, self.node_inst.processor_summary.count)
self.assertEqual('Multi-Core Intel(R) Xeon(R) processor 7xxx Series',
self.node_inst.processor_summary.model)
self.assertEqual('OK', self.node_inst.processor_summary.health)
self.assertEqual(
'Enabled', self.node_inst.processor_summary.status.state)
self.assertEqual('OK', self.node_inst.processor_summary.status.health)
self.assertEqual(
'OK', self.node_inst.processor_summary.status.health_rollup)
def test__parse_attributes_missing_actions(self):
self.node_inst.json.pop('Actions')
@ -275,7 +282,32 @@ class NodeTestCase(testtools.TestCase):
self.node_inst._parse_attributes()
# | THEN |
self.assertEqual(32, self.node_inst.memory_summary.size_gib)
self.assertEqual(None, self.node_inst.memory_summary.health)
self.assertEqual(None, self.node_inst.memory_summary.status.health)
self.assertEqual('Enabled', self.node_inst.memory_summary.status.state)
self.assertEqual(
'OK', self.node_inst.memory_summary.status.health_rollup)
# | GIVEN |
self.node_inst._json['Memory']['Status'].pop('State')
# | WHEN |
self.node_inst._parse_attributes()
# | THEN |
self.assertEqual(32, self.node_inst.memory_summary.size_gib)
self.assertEqual(None, self.node_inst.memory_summary.status.health)
self.assertEqual(None, self.node_inst.memory_summary.status.state)
self.assertEqual(
'OK', self.node_inst.memory_summary.status.health_rollup)
# | GIVEN |
self.node_inst._json['Memory']['Status'].pop('HealthRollup')
# | WHEN |
self.node_inst._parse_attributes()
# | THEN |
self.assertEqual(32, self.node_inst.memory_summary.size_gib)
self.assertEqual(None, self.node_inst.memory_summary.status.health)
self.assertEqual(None, self.node_inst.memory_summary.status.state)
self.assertEqual(
None, self.node_inst.memory_summary.status.health_rollup)
# | GIVEN |
self.node_inst._json['Memory'].pop('Status')
@ -283,7 +315,7 @@ class NodeTestCase(testtools.TestCase):
self.node_inst._parse_attributes()
# | THEN |
self.assertEqual(32, self.node_inst.memory_summary.size_gib)
self.assertEqual(None, self.node_inst.memory_summary.health)
self.assertEqual(None, self.node_inst.memory_summary.status)
# | GIVEN |
self.node_inst._json['Memory'].pop('TotalSystemMemoryGiB')
@ -291,7 +323,7 @@ class NodeTestCase(testtools.TestCase):
self.node_inst._parse_attributes()
# | THEN |
self.assertEqual(None, self.node_inst.memory_summary.size_gib)
self.assertEqual(None, self.node_inst.memory_summary.health)
self.assertEqual(None, self.node_inst.memory_summary.status)
# | GIVEN |
self.node_inst._json.pop('Memory')

View File

@ -47,6 +47,7 @@ class StorageServiceTestCase(testtools.TestCase):
self.assertEqual('Storage Service', self.storage_service_inst.name)
self.assertEqual('Enabled', self.storage_service_inst.status.state)
self.assertEqual('OK', self.storage_service_inst.status.health)
self.assertEqual('OK', self.storage_service_inst.status.health_rollup)
self.assertIsNone(self.storage_service_inst._logical_drives)
self.assertIsNone(self.storage_service_inst._physical_drives)
self.assertIsNone(self.storage_service_inst._remote_targets)