Add missing attribute in Processor in RSD 2.2

Change-Id: I966e007a4b7362d2f86147de89a9e34aa0e1f151
This commit is contained in:
Lin Yang 2019-05-29 11:55:57 -07:00
parent b72d928986
commit bf06a290b4
4 changed files with 276 additions and 193 deletions

View File

@ -22,77 +22,90 @@ from rsd_lib.resources.v2_2.system import processor_metrics
from rsd_lib import utils as rsd_lib_utils
class OnPackageMemoryField(base.ListField):
class ProcessorMemoryCollectionField(base.ListField):
"""ProcessorMemory field
memory_type = base.Field('Type')
"""Type of memory"""
On die processor memory
"""
capacity_mb = base.Field('CapacityMB', adapter=rsd_lib_utils.num_or_none)
"""Memory capacity"""
type = base.Field("Type")
"""Type of memory."""
speed_mhz = base.Field('SpeedMHz', adapter=rsd_lib_utils.num_or_none)
"""Memory speed"""
capacity_mb = base.Field("CapacityMB", adapter=rsd_lib_utils.num_or_none)
"""Memory capacity."""
speed_mhz = base.Field("SpeedMHz", adapter=rsd_lib_utils.num_or_none)
"""Memory speed."""
class FpgaField(base.CompositeField):
class FPGAField(base.CompositeField):
"""FPGA field
fpga_type = base.Field('Type')
"""Type of FPGA"""
FPGA properties
"""
bit_stream_version = base.Field('BitStreamVersion')
"""Version of BitStream loaded on FPGA"""
type = base.Field("Type")
"""FPGA type."""
hssi_configuration = base.Field('HSSIConfiguration')
"""High Speed Serial Interface configuration"""
bit_stream_version = base.Field("BitStreamVersion")
"""Version of BitStream loaded on FPGA."""
hssi_sideband = base.Field('HSSISideband')
"""High Speed Serial Interface sideband interface type"""
hssi_configuration = base.Field("HSSIConfiguration")
"""High Speed Serial Interface configuration."""
hssi_sideband = base.Field("HSSISideband")
"""High Speed Serial Interface sideband interface type."""
reconfiguration_slots = base.Field(
'ReconfigurationSlots', adapter=rsd_lib_utils.num_or_none)
"""Number of supported reconfiguration slots"""
"ReconfigurationSlots", adapter=rsd_lib_utils.num_or_none
)
"""Number of supported reconfiguration slots."""
class IntelRackScaleField(processor.IntelRackScaleField):
on_package_memory = OnPackageMemoryField('OnPackageMemory')
"""An array of references to the endpoints that connect to this processor
brand = base.Field("Brand")
"""This indicates processor brand"""
capabilities = base.Field("Capabilities")
"""This indicates array of processor capabilities"""
on_package_memory = ProcessorMemoryCollectionField("OnPackageMemory")
"""An array of references to the endpoints that connect to this processor.
"""
thermal_design_power_watt = base.Field(
'ThermalDesignPowerWatt', adapter=rsd_lib_utils.num_or_none)
"""Thermal Design Power (TDP) of this processor"""
"ThermalDesignPowerWatt", adapter=rsd_lib_utils.num_or_none
)
"""Thermal Design Power (TDP) of this processor."""
metrics = base.Field(
'Metrics', adapter=rsd_lib_utils.get_resource_identity)
"""A reference to the Metrics associated with this Processor"""
fpga = FPGAField("FPGA")
"""FPGA specific properties for FPGA ProcessorType."""
extended_identification_registers = rsd_lib_base.DynamicField(
'ExtendedIdentificationRegisters')
"ExtendedIdentificationRegisters"
)
"""Extended contents of the Identification Registers (CPUID) for this
processor
"""
fpga = FpgaField('FPGA')
"""FPGA specific properties for FPGA ProcessorType"""
metrics = base.Field(
"Metrics", adapter=rsd_lib_utils.get_resource_identity
)
"""A reference to the Metrics associated with this Processor"""
class OemField(base.CompositeField):
intel_rackscale = IntelRackScaleField('Intel_RackScale')
intel_rackscale = IntelRackScaleField("Intel_RackScale")
"""Intel Rack Scale Design extensions ('Intel_RackScale' object)"""
class Processor(processor.Processor):
oem = OemField('Oem')
oem = OemField("Oem")
"""Oem extension object"""
def _get_metrics_path(self):
"""Helper function to find the System process metrics path"""
return utils.get_sub_resource_path_by(
self, ['Oem', 'Intel_RackScale', 'Metrics'])
@property
@utils.cache_it
def metrics(self):
@ -102,12 +115,15 @@ class Processor(processor.Processor):
this property is reset.
"""
return processor_metrics.ProcessorMetrics(
self._conn, self._get_metrics_path(),
redfish_version=self.redfish_version)
self._conn,
utils.get_sub_resource_path_by(
self, ["Oem", "Intel_RackScale", "Metrics"]
),
redfish_version=self.redfish_version,
)
class ProcessorCollection(processor.ProcessorCollection):
@property
def _resource_type(self):
return Processor

View File

@ -15,34 +15,41 @@
from sushy.resources import base
from rsd_lib import base as rsd_lib_base
from rsd_lib import utils as rsd_lib_utils
class ProcessorMetrics(base.ResourceBase):
name = base.Field('Name')
"""The metrics name"""
class ProcessorMetrics(rsd_lib_base.ResourceBase):
"""ProcessorMetrics resource class
description = base.Field('Description')
"""The metrics description"""
ProcessorMetrics contains usage and health statistics for a Processor
(all Cores) .
"""
identity = base.Field('Id')
"""The metrics identity"""
bandwidth_percent = base.Field(
"BandwidthPercent", adapter=rsd_lib_utils.num_or_none
)
"""CPU Bandwidth in [%]"""
average_frequency_mhz = base.Field('AverageFrequencyMHz',
adapter=rsd_lib_utils.num_or_none)
"""The processor average frequency mhz"""
average_frequency_mhz = base.Field(
"AverageFrequencyMHz", adapter=rsd_lib_utils.num_or_none
)
"""Average frequency [MHz]"""
throttling_celsius = base.Field('ThrottlingCelsius',
adapter=rsd_lib_utils.num_or_none)
"""The processor throttling celsius"""
throttling_celsius = base.Field(
"ThrottlingCelsius", adapter=rsd_lib_utils.num_or_none
)
"""CPU Margin to throttle (temperature offset in degree Celsius)"""
temperature_celsius = base.Field('TemperatureCelsius',
adapter=rsd_lib_utils.num_or_none)
"""The processor temperature celsius"""
temperature_celsius = base.Field(
"TemperatureCelsius", adapter=rsd_lib_utils.num_or_none
)
"""Temperature of the Processor resource"""
consumed_power_watt = base.Field('ConsumedPowerWatt',
adapter=rsd_lib_utils.num_or_none)
"""The processor consumed power watt"""
consumed_power_watt = base.Field(
"ConsumedPowerWatt", adapter=rsd_lib_utils.num_or_none
)
"""Power consumed by Processor resource"""
health = base.Field('Health')
"""The detail health information"""
health = base.Field("Health")
"""CPU Health as a discrete sensor reading"""

View File

@ -17,266 +17,317 @@ import json
import mock
import testtools
from sushy import exceptions
from rsd_lib.resources.v2_2.system import processor
from rsd_lib.resources.v2_2.system import processor_metrics
class ProcessorTestCase(testtools.TestCase):
def setUp(self):
super(ProcessorTestCase, self).setUp()
self.conn = mock.Mock()
with open('rsd_lib/tests/unit/json_samples/v2_2/processor.json',
'r') as f:
with open(
"rsd_lib/tests/unit/json_samples/v2_2/processor.json", "r"
) as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
self.processor_inst = processor.Processor(
self.conn, '/redfish/v1/Systems/System1/Processors/CPU1',
redfish_version='1.1.0')
self.conn,
"/redfish/v1/Systems/System1/Processors/CPU1",
redfish_version="1.1.0",
)
def test__parse_attributes(self):
self.processor_inst._parse_attributes()
self.assertEqual('1.1.0', self.processor_inst.redfish_version)
self.assertEqual('CPU1', self.processor_inst.identity)
self.assertEqual('Processor', self.processor_inst.name)
self.assertEqual("1.1.0", self.processor_inst.redfish_version)
self.assertEqual("CPU1", self.processor_inst.identity)
self.assertEqual("Processor", self.processor_inst.name)
self.assertEqual(None, self.processor_inst.description)
self.assertEqual('CPU 1', self.processor_inst.socket)
self.assertEqual('CPU', self.processor_inst.processor_type)
self.assertEqual('x86', self.processor_inst.processor_architecture)
self.assertEqual('x86-64', self.processor_inst.instruction_set)
self.assertEqual('Intel(R) Corporation',
self.processor_inst.manufacturer)
self.assertEqual('Multi-Core Intel(R) Xeon(R) processor 7xxx Series',
self.processor_inst.model)
self.assertEqual("CPU 1", self.processor_inst.socket)
self.assertEqual("CPU", self.processor_inst.processor_type)
self.assertEqual("x86", self.processor_inst.processor_architecture)
self.assertEqual("x86-64", self.processor_inst.instruction_set)
self.assertEqual(
"Intel(R) Corporation", self.processor_inst.manufacturer
)
self.assertEqual(
"Multi-Core Intel(R) Xeon(R) processor 7xxx Series",
self.processor_inst.model,
)
self.assertEqual(3700, self.processor_inst.max_speed_mhz)
self.assertEqual(
'0x42', self.processor_inst.processor_id.effective_family)
"0x42", self.processor_inst.processor_id.effective_family
)
self.assertEqual(
'0x61', self.processor_inst.processor_id.effective_model)
"0x61", self.processor_inst.processor_id.effective_model
)
self.assertEqual(
'0x34AC34DC8901274A',
self.processor_inst.processor_id.identification_registers)
"0x34AC34DC8901274A",
self.processor_inst.processor_id.identification_registers,
)
self.assertEqual(
'0x429943', self.processor_inst.processor_id.microcode_info)
self.assertEqual('0x1', self.processor_inst.processor_id.step)
"0x429943", self.processor_inst.processor_id.microcode_info
)
self.assertEqual("0x1", self.processor_inst.processor_id.step)
self.assertEqual(
'GenuineIntel', self.processor_inst.processor_id.vendor_id)
self.assertEqual('OK', self.processor_inst.status.health)
self.assertEqual('OK', self.processor_inst.status.health_rollup)
self.assertEqual('Enabled', self.processor_inst.status.state)
"GenuineIntel", self.processor_inst.processor_id.vendor_id
)
self.assertEqual("OK", self.processor_inst.status.health)
self.assertEqual("OK", self.processor_inst.status.health_rollup)
self.assertEqual("Enabled", self.processor_inst.status.state)
self.assertEqual(8, self.processor_inst.total_cores)
self.assertEqual(16, self.processor_inst.total_threads)
self.assertEqual('E5', self.processor_inst.oem.intel_rackscale.brand)
self.assertEqual("E5", self.processor_inst.oem.intel_rackscale.brand)
self.assertEqual(
['sse', 'sse2', 'sse3'],
self.processor_inst.oem.intel_rackscale.capabilities)
["sse", "sse2", "sse3"],
self.processor_inst.oem.intel_rackscale.capabilities,
)
self.assertEqual(
'L2Cache',
self.processor_inst.oem.intel_rackscale.on_package_memory[0].
memory_type)
"L2Cache",
self.processor_inst.oem.intel_rackscale.on_package_memory[0].type,
)
self.assertEqual(
2,
self.processor_inst.oem.intel_rackscale.on_package_memory[0].
capacity_mb)
self.processor_inst.oem.intel_rackscale.on_package_memory[
0
].capacity_mb,
)
self.assertEqual(
None,
self.processor_inst.oem.intel_rackscale.on_package_memory[0].
speed_mhz)
self.processor_inst.oem.intel_rackscale.on_package_memory[
0
].speed_mhz,
)
self.assertEqual(
'L3Cache',
self.processor_inst.oem.intel_rackscale.on_package_memory[1].
memory_type)
"L3Cache",
self.processor_inst.oem.intel_rackscale.on_package_memory[1].type,
)
self.assertEqual(
20,
self.processor_inst.oem.intel_rackscale.on_package_memory[1].
capacity_mb)
self.processor_inst.oem.intel_rackscale.on_package_memory[
1
].capacity_mb,
)
self.assertEqual(
None,
self.processor_inst.oem.intel_rackscale.on_package_memory[1].
speed_mhz)
self.processor_inst.oem.intel_rackscale.on_package_memory[
1
].speed_mhz,
)
self.assertEqual(
160,
self.processor_inst.oem.intel_rackscale.thermal_design_power_watt)
self.processor_inst.oem.intel_rackscale.thermal_design_power_watt,
)
self.assertEqual(
'/redfish/v1/Systems/System1/Processors/CPU1/Metrics',
self.processor_inst.oem.intel_rackscale.metrics)
"/redfish/v1/Systems/System1/Processors/CPU1/Metrics",
self.processor_inst.oem.intel_rackscale.metrics,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_00h)
extended_identification_registers.eax_00h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_01h)
extended_identification_registers.eax_01h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_02h)
extended_identification_registers.eax_02h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_03h)
extended_identification_registers.eax_03h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_04h)
extended_identification_registers.eax_04h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_05h)
extended_identification_registers.eax_05h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_07h)
extended_identification_registers.eax_07h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000000h)
extended_identification_registers.eax_80000000h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000001h)
extended_identification_registers.eax_80000001h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000002h)
extended_identification_registers.eax_80000002h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000003h)
extended_identification_registers.eax_80000003h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000004h)
extended_identification_registers.eax_80000004h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000005h)
extended_identification_registers.eax_80000005h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000006h)
extended_identification_registers.eax_80000006h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000007h)
extended_identification_registers.eax_80000007h,
)
self.assertEqual(
"0x0429943FFFFFFFFF",
self.processor_inst.oem.intel_rackscale.
extended_identification_registers.eax_80000008h)
extended_identification_registers.eax_80000008h,
)
self.assertEqual(
'Integrated',
self.processor_inst.oem.intel_rackscale.fpga.fpga_type)
"Integrated", self.processor_inst.oem.intel_rackscale.fpga.type
)
self.assertEqual(
'Blue1',
self.processor_inst.oem.intel_rackscale.fpga.bit_stream_version)
"Blue1",
self.processor_inst.oem.intel_rackscale.fpga.bit_stream_version,
)
self.assertEqual(
'4x10G',
self.processor_inst.oem.intel_rackscale.fpga.hssi_configuration)
"4x10G",
self.processor_inst.oem.intel_rackscale.fpga.hssi_configuration,
)
self.assertEqual(
'I2C', self.processor_inst.oem.intel_rackscale.fpga.hssi_sideband)
"I2C", self.processor_inst.oem.intel_rackscale.fpga.hssi_sideband
)
self.assertEqual(
1,
self.processor_inst.oem.intel_rackscale.fpga.reconfiguration_slots)
def test__get_metrics_path(self):
self.assertEqual('/redfish/v1/Systems/System1/Processors/CPU1/Metrics',
self.processor_inst._get_metrics_path())
def test__get_metrics_path_missing_attr(self):
self.processor_inst._json.get('Oem').get('Intel_RackScale')\
.pop('Metrics')
with self.assertRaisesRegex(exceptions.MissingAttributeError,
'attribute Oem/Intel_RackScale/Metrics'):
self.processor_inst._get_metrics_path()
self.processor_inst.oem.intel_rackscale.fpga.reconfiguration_slots,
)
def test_metrics(self):
# | GIVEN |
self.conn.get.return_value.json.reset_mock()
with open('rsd_lib/tests/unit/json_samples/v2_2/'
'processor_metrics.json', 'r') as f:
with open(
"rsd_lib/tests/unit/json_samples/v2_2/" "processor_metrics.json",
"r",
) as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN |
actual_metrics = self.processor_inst.metrics
# | THEN |
self.assertIsInstance(actual_metrics,
processor_metrics.ProcessorMetrics)
self.assertIsInstance(
actual_metrics, processor_metrics.ProcessorMetrics
)
self.conn.get.return_value.json.assert_called_once_with()
# reset mock
self.conn.get.return_value.json.reset_mock()
# | WHEN & THEN |
# tests for same object on invoking subsequently
self.assertIs(actual_metrics,
self.processor_inst.metrics)
self.assertIs(actual_metrics, self.processor_inst.metrics)
self.conn.get.return_value.json.assert_not_called()
def test_metrics_on_refresh(self):
# | GIVEN |
with open('rsd_lib/tests/unit/json_samples/v2_2/'
'processor_metrics.json', 'r') as f:
with open(
"rsd_lib/tests/unit/json_samples/v2_2/" "processor_metrics.json",
"r",
) as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN & THEN |
self.assertIsInstance(self.processor_inst.metrics,
processor_metrics.ProcessorMetrics)
self.assertIsInstance(
self.processor_inst.metrics, processor_metrics.ProcessorMetrics
)
# On refreshing the processor instance...
with open('rsd_lib/tests/unit/json_samples/v2_2/processor.json',
'r') as f:
with open(
"rsd_lib/tests/unit/json_samples/v2_2/processor.json", "r"
) as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
self.processor_inst.invalidate()
self.processor_inst.refresh(force=False)
# | GIVEN |
with open('rsd_lib/tests/unit/json_samples/v2_2/'
'processor_metrics.json', 'r') as f:
with open(
"rsd_lib/tests/unit/json_samples/v2_2/" "processor_metrics.json",
"r",
) as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN & THEN |
self.assertIsInstance(self.processor_inst.metrics,
processor_metrics.ProcessorMetrics)
self.assertIsInstance(
self.processor_inst.metrics, processor_metrics.ProcessorMetrics
)
class ProcessorCollectionTestCase(testtools.TestCase):
def setUp(self):
super(ProcessorCollectionTestCase, self).setUp()
self.conn = mock.Mock()
with open('rsd_lib/tests/unit/json_samples/v2_2/'
'processor_collection.json', 'r') as f:
with open(
"rsd_lib/tests/unit/json_samples/v2_2/"
"processor_collection.json",
"r",
) as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
self.processor_col = processor.ProcessorCollection(
self.conn, '/redfish/v1/Systems/System1/Processors',
redfish_version='1.1.0')
self.conn,
"/redfish/v1/Systems/System1/Processors",
redfish_version="1.1.0",
)
def test__parse_attributes(self):
self.processor_col._parse_attributes()
self.assertEqual('1.1.0', self.processor_col.redfish_version)
self.assertEqual(('/redfish/v1/Systems/System1/Processors/CPU1',
'/redfish/v1/Systems/System1/Processors/CPU2'),
self.processor_col.members_identities)
self.assertEqual("1.1.0", self.processor_col.redfish_version)
self.assertEqual(
(
"/redfish/v1/Systems/System1/Processors/CPU1",
"/redfish/v1/Systems/System1/Processors/CPU2",
),
self.processor_col.members_identities,
)
@mock.patch.object(processor, 'Processor', autospec=True)
@mock.patch.object(processor, "Processor", autospec=True)
def test_get_member(self, mock_system):
self.processor_col.get_member(
'/redfish/v1/Systems/System1/Processors/CPU1')
"/redfish/v1/Systems/System1/Processors/CPU1"
)
mock_system.assert_called_once_with(
self.processor_col._conn,
'/redfish/v1/Systems/System1/Processors/CPU1',
redfish_version=self.processor_col.redfish_version)
"/redfish/v1/Systems/System1/Processors/CPU1",
redfish_version=self.processor_col.redfish_version,
)
@mock.patch.object(processor, 'Processor', autospec=True)
@mock.patch.object(processor, "Processor", autospec=True)
def test_get_members(self, mock_system):
members = self.processor_col.get_members()
calls = [
mock.call(self.processor_col._conn,
'/redfish/v1/Systems/System1/Processors/CPU1',
redfish_version=self.processor_col.redfish_version),
mock.call(self.processor_col._conn,
'/redfish/v1/Systems/System1/Processors/CPU2',
redfish_version=self.processor_col.redfish_version)
mock.call(
self.processor_col._conn,
"/redfish/v1/Systems/System1/Processors/CPU1",
redfish_version=self.processor_col.redfish_version,
),
mock.call(
self.processor_col._conn,
"/redfish/v1/Systems/System1/Processors/CPU2",
redfish_version=self.processor_col.redfish_version,
),
]
mock_system.assert_has_calls(calls)
self.assertIsInstance(members, list)

View File

@ -22,31 +22,40 @@ from rsd_lib.resources.v2_2.system import processor_metrics
class ProcessorMetricsTestCase(testtools.TestCase):
def setUp(self):
super(ProcessorMetricsTestCase, self).setUp()
self.conn = mock.Mock()
with open('rsd_lib/tests/unit/json_samples/v2_2/'
'processor_metrics.json', 'r') as f:
with open(
"rsd_lib/tests/unit/json_samples/v2_2/" "processor_metrics.json",
"r",
) as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
self.processor_metrics_inst = processor_metrics.ProcessorMetrics(
self.conn, '/redfish/v1/Systems/System1/Metrics',
redfish_version='1.1.0')
self.conn,
"/redfish/v1/Systems/System1/Metrics",
redfish_version="1.1.0",
)
def test__parse_attributes(self):
self.processor_metrics_inst._parse_attributes()
self.assertEqual('1.1.0', self.processor_metrics_inst.redfish_version)
self.assertEqual('ProcessorMetrics for CPU1',
self.processor_metrics_inst.name)
self.assertEqual('description-as-string',
self.processor_metrics_inst.description)
self.assertEqual('Metrics for CPU1',
self.processor_metrics_inst.identity)
self.assertEqual("1.1.0", self.processor_metrics_inst.redfish_version)
self.assertEqual(
3014, self.processor_metrics_inst.average_frequency_mhz)
"ProcessorMetrics for CPU1", self.processor_metrics_inst.name
)
self.assertEqual(
"description-as-string", self.processor_metrics_inst.description
)
self.assertEqual(
"Metrics for CPU1", self.processor_metrics_inst.identity
)
self.assertEqual(
3014, self.processor_metrics_inst.average_frequency_mhz
)
self.assertEqual(19, self.processor_metrics_inst.throttling_celsius)
self.assertEqual(73, self.processor_metrics_inst.temperature_celsius)
self.assertEqual(153, self.processor_metrics_inst.consumed_power_watt)
self.assertEqual(["FRB1 BIST Failure", "Processor Throttled"],
self.processor_metrics_inst.health)
self.assertEqual(
["FRB1 BIST Failure", "Processor Throttled"],
self.processor_metrics_inst.health,
)