From c805d7540e97add457b9ff151c6274eb584b2234 Mon Sep 17 00:00:00 2001 From: Lin Yang Date: Tue, 18 Dec 2018 13:26:21 -0800 Subject: [PATCH] Support float casting for resource property Use num_or_none instead of int_or_none to support those resource property in float. Change-Id: I8830e7104ff69524379ccfbd90eda37133a8960a --- rsd_lib/resources/v2_1/chassis/power_zone.py | 20 ++++++------- .../resources/v2_1/chassis/thermal_zone.py | 20 ++++++------- .../v2_1/ethernet_switch/acl_rule.py | 14 ++++----- .../resources/v2_1/ethernet_switch/port.py | 6 ++-- .../v2_1/ethernet_switch/static_mac.py | 2 +- .../resources/v2_1/ethernet_switch/vlan.py | 2 +- rsd_lib/resources/v2_1/fabric/switch.py | 2 +- rsd_lib/resources/v2_1/manager/manager.py | 6 ++-- rsd_lib/resources/v2_1/node/node.py | 4 +-- rsd_lib/resources/v2_1/system/memory.py | 10 +++---- .../v2_1/system/network_interface.py | 6 ++-- .../v2_1/system/storage_subsystem.py | 2 +- .../v2_2/ethernet_switch/port_metrics.py | 30 +++++++++---------- .../resources/v2_2/system/memory_metrics.py | 2 +- rsd_lib/resources/v2_2/system/metrics.py | 12 ++++---- .../v2_2/system/processor_metrics.py | 8 ++--- .../v2_3/ethernet_switch/ethernet_switch.py | 16 +++++----- rsd_lib/resources/v2_3/fabric/endpoint.py | 2 +- .../resources/v2_3/storage_service/drive.py | 2 +- .../v2_3/storage_service/storage_pool.py | 8 ++--- .../resources/v2_3/storage_service/volume.py | 6 ++-- rsd_lib/tests/unit/test_utils.py | 10 ++++--- rsd_lib/utils.py | 12 +++++--- 23 files changed, 104 insertions(+), 98 deletions(-) diff --git a/rsd_lib/resources/v2_1/chassis/power_zone.py b/rsd_lib/resources/v2_1/chassis/power_zone.py index 1d91613..7414a54 100644 --- a/rsd_lib/resources/v2_1/chassis/power_zone.py +++ b/rsd_lib/resources/v2_1/chassis/power_zone.py @@ -28,17 +28,17 @@ class RackLocationField(base.CompositeField): rack_units = base.Field('RackUnits') """Indicates the rack unit type""" - xlocation = base.Field('XLocation', adapter=rsd_lib_utils.int_or_none) + xlocation = base.Field('XLocation', adapter=rsd_lib_utils.num_or_none) """The horizontal location within uLocation, from left to right (1.. MAXIMUM) 0 indicate not available """ - ulocation = base.Field('ULocation', adapter=rsd_lib_utils.int_or_none) + ulocation = base.Field('ULocation', adapter=rsd_lib_utils.num_or_none) """The index of the top-most U of the component, from top to bottom (1.. MAXIMUM) 0 indicate not available """ - uheight = base.Field('UHeight', adapter=rsd_lib_utils.int_or_none) + uheight = base.Field('UHeight', adapter=rsd_lib_utils.num_or_none) """The height of managed zone, e.g. 8 for 8U, 16 for 16U""" @@ -47,11 +47,11 @@ class PowerSuppliesField(base.ListField): """The Power Supply name""" power_capacity_watts = base.Field( - 'PowerCapacityWatts', adapter=rsd_lib_utils.int_or_none) + 'PowerCapacityWatts', adapter=rsd_lib_utils.num_or_none) """The maximum capacity of this Power Supply""" last_power_output_watts = base.Field( - 'LastPowerOutputWatts', adapter=rsd_lib_utils.int_or_none) + 'LastPowerOutputWatts', adapter=rsd_lib_utils.num_or_none) """The average power output of this Power Supply""" manufacturer = base.Field('Manufacturer') @@ -93,7 +93,7 @@ class PowerZone(base.ResourceBase): """The PowerZone physical location""" max_psus_supported = base.Field( - 'MaxPSUsSupported', adapter=rsd_lib_utils.int_or_none) + 'MaxPSUsSupported', adapter=rsd_lib_utils.num_or_none) """The maximum number of Power Supply Units supported by PowerZone""" presence = base.Field('Presence') @@ -107,21 +107,21 @@ class PowerZone(base.ResourceBase): """ number_of_psus_present = base.Field( - 'NumberOfPSUsPresent', adapter=rsd_lib_utils.int_or_none) + 'NumberOfPSUsPresent', adapter=rsd_lib_utils.num_or_none) """Indicates the number of existing Power Supply Units in PowerZone""" power_consumed_watts = base.Field( - 'PowerConsumedWatts', adapter=rsd_lib_utils.int_or_none) + 'PowerConsumedWatts', adapter=rsd_lib_utils.num_or_none) """The total power consumption of PowerZone, sum of trays' power consumption """ power_output_watts = base.Field( - 'PowerOutputWatts', adapter=rsd_lib_utils.int_or_none) + 'PowerOutputWatts', adapter=rsd_lib_utils.num_or_none) """The total power production of PowerZone, sum of PSUs' output""" power_capacity_watts = base.Field( - 'PowerCapacityWatts', adapter=rsd_lib_utils.int_or_none) + 'PowerCapacityWatts', adapter=rsd_lib_utils.num_or_none) """The maximum power capacity supported by PowerZone""" power_supplies = PowerSuppliesField('PowerSupplies') diff --git a/rsd_lib/resources/v2_1/chassis/thermal_zone.py b/rsd_lib/resources/v2_1/chassis/thermal_zone.py index ef517f0..90dadbf 100644 --- a/rsd_lib/resources/v2_1/chassis/thermal_zone.py +++ b/rsd_lib/resources/v2_1/chassis/thermal_zone.py @@ -28,17 +28,17 @@ class RackLocationField(base.CompositeField): rack_units = base.Field('RackUnits') """Indicates the rack unit type""" - xlocation = base.Field('XLocation', adapter=rsd_lib_utils.int_or_none) + xlocation = base.Field('XLocation', adapter=rsd_lib_utils.num_or_none) """The horizontal location within uLocation, from left to right (1.. MAXIMUM) 0 indicate not available """ - ulocation = base.Field('ULocation', adapter=rsd_lib_utils.int_or_none) + ulocation = base.Field('ULocation', adapter=rsd_lib_utils.num_or_none) """The index of the top-most U of the component, from top to bottom (1.. MAXIMUM) 0 indicate not available """ - uheight = base.Field('UHeight', adapter=rsd_lib_utils.int_or_none) + uheight = base.Field('UHeight', adapter=rsd_lib_utils.num_or_none) """The height of managed zone, e.g. 8 for 8U, 16 for 16U""" @@ -46,7 +46,7 @@ class FansField(base.ListField): name = base.Field('Name') """The Power Supply name""" - reading_rpm = base.Field('ReadingRPM', adapter=rsd_lib_utils.int_or_none) + reading_rpm = base.Field('ReadingRPM', adapter=rsd_lib_utils.num_or_none) """Fan RPM reading""" status = StatusField('Status') @@ -61,7 +61,7 @@ class TemperaturesField(base.ListField): """The Power Supply name""" reading_celsius = base.Field( - 'ReadingCelsius', adapter=rsd_lib_utils.int_or_none) + 'ReadingCelsius', adapter=rsd_lib_utils.num_or_none) """Current value of the temperature sensor's reading""" physical_context = base.Field('PhysicalContext') @@ -107,23 +107,23 @@ class ThermalZone(base.ResourceBase): """ desired_speed_pwm = base.Field( - 'DesiredSpeedPWM', adapter=rsd_lib_utils.int_or_none) + 'DesiredSpeedPWM', adapter=rsd_lib_utils.num_or_none) """The desired FAN speed in current ThermalZone present in PWM unit""" desired_speed_rpm = base.Field( - 'DesiredSpeedRPM', adapter=rsd_lib_utils.int_or_none) + 'DesiredSpeedRPM', adapter=rsd_lib_utils.num_or_none) """The desired FAN speed in current ThermalZone present in RPM unit""" max_fans_supported = base.Field( - 'MaxFansSupported', adapter=rsd_lib_utils.int_or_none) + 'MaxFansSupported', adapter=rsd_lib_utils.num_or_none) """Number of maximum fans that can be installed in a given Thermal Zone""" number_of_fans_present = base.Field( - 'NumberOfFansPresent', adapter=rsd_lib_utils.int_or_none) + 'NumberOfFansPresent', adapter=rsd_lib_utils.num_or_none) """The existing number of fans in current ThermalZone""" volumetric_airflow = base.Field( - 'VolumetricAirflow', adapter=rsd_lib_utils.int_or_none) + 'VolumetricAirflow', adapter=rsd_lib_utils.num_or_none) """Rack Level PTAS Telemetry - Volumetric airflow in current ThermalZone""" fans = FansField('Fans') diff --git a/rsd_lib/resources/v2_1/ethernet_switch/acl_rule.py b/rsd_lib/resources/v2_1/ethernet_switch/acl_rule.py index 3f3d9f4..29a7703 100644 --- a/rsd_lib/resources/v2_1/ethernet_switch/acl_rule.py +++ b/rsd_lib/resources/v2_1/ethernet_switch/acl_rule.py @@ -32,17 +32,17 @@ class IPSourceField(base.CompositeField): class MACSourceField(base.CompositeField): address = base.Field('Address') - mask = base.Field('Mask', adapter=rsd_lib_utils.int_or_none) + mask = base.Field('Mask', adapter=rsd_lib_utils.num_or_none) class VLANIdField(base.CompositeField): - id = base.Field('Id', adapter=rsd_lib_utils.int_or_none) - mask = base.Field('Mask', adapter=rsd_lib_utils.int_or_none) + id = base.Field('Id', adapter=rsd_lib_utils.num_or_none) + mask = base.Field('Mask', adapter=rsd_lib_utils.num_or_none) class L4SourcePortField(base.CompositeField): - port = base.Field('Port', adapter=rsd_lib_utils.int_or_none) - mask = base.Field('Mask', adapter=rsd_lib_utils.int_or_none) + port = base.Field('Port', adapter=rsd_lib_utils.num_or_none) + mask = base.Field('Mask', adapter=rsd_lib_utils.num_or_none) class ConditionField(base.CompositeField): @@ -53,7 +53,7 @@ class ConditionField(base.CompositeField): vlan_id = VLANIdField('VLANId') l4_source_port = L4SourcePortField('L4SourcePort') l4_destination_port = base.Field('L4DestinationPort', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) l4_protocol = base.Field('L4Protocol') @@ -68,7 +68,7 @@ class ACLRule(base.ResourceBase): description = base.Field('Description') """The acl rule description""" - rule_id = base.Field('RuleId', adapter=rsd_lib_utils.int_or_none) + rule_id = base.Field('RuleId', adapter=rsd_lib_utils.num_or_none) """The acl rule id""" action = base.Field('Action') diff --git a/rsd_lib/resources/v2_1/ethernet_switch/port.py b/rsd_lib/resources/v2_1/ethernet_switch/port.py index 6a67f40..2588936 100644 --- a/rsd_lib/resources/v2_1/ethernet_switch/port.py +++ b/rsd_lib/resources/v2_1/ethernet_switch/port.py @@ -61,7 +61,7 @@ class IPv6AddressesField(base.ListField): """The port ipv6 address""" prefix_length = base.Field( - 'PrefixLength', adapter=rsd_lib_utils.int_or_none) + 'PrefixLength', adapter=rsd_lib_utils.num_or_none) """The port ipv6 address prefix length""" address_origin = base.Field('AddressOrigin') @@ -109,7 +109,7 @@ class Port(base.ResourceBase): """The port administrative state""" link_speed_mbps = base.Field( - 'LinkSpeedMbps', adapter=rsd_lib_utils.int_or_none) + 'LinkSpeedMbps', adapter=rsd_lib_utils.num_or_none) """The port link speed(mbps)""" neighbor_info = NeighborInfoField('NeighborInfo') @@ -119,7 +119,7 @@ class Port(base.ResourceBase): """The port neighbor mac""" frame_size = base.Field( - 'FrameSize', adapter=rsd_lib_utils.int_or_none) + 'FrameSize', adapter=rsd_lib_utils.num_or_none) """The port frame size""" autosense = base.Field('Autosense', adapter=bool) diff --git a/rsd_lib/resources/v2_1/ethernet_switch/static_mac.py b/rsd_lib/resources/v2_1/ethernet_switch/static_mac.py index 2afc8ec..3d46021 100644 --- a/rsd_lib/resources/v2_1/ethernet_switch/static_mac.py +++ b/rsd_lib/resources/v2_1/ethernet_switch/static_mac.py @@ -32,7 +32,7 @@ class StaticMAC(base.ResourceBase): mac_address = base.Field('MACAddress') """The static mac address""" - vlan_id = base.Field('VLANId', adapter=rsd_lib_utils.int_or_none) + vlan_id = base.Field('VLANId', adapter=rsd_lib_utils.num_or_none) """The static mac vlan id""" oem = base.Field('Oem') diff --git a/rsd_lib/resources/v2_1/ethernet_switch/vlan.py b/rsd_lib/resources/v2_1/ethernet_switch/vlan.py index 077ec8a..60ce89e 100644 --- a/rsd_lib/resources/v2_1/ethernet_switch/vlan.py +++ b/rsd_lib/resources/v2_1/ethernet_switch/vlan.py @@ -38,7 +38,7 @@ class VLAN(base.ResourceBase): vlan_enable = base.Field('VLANEnable', adapter=bool) """The boolean indicate this vlan network interface is enabled or not""" - vlan_id = base.Field('VLANId', adapter=rsd_lib_utils.int_or_none) + vlan_id = base.Field('VLANId', adapter=rsd_lib_utils.num_or_none) """The vlan network interafce id""" oem = base.Field('Oem') diff --git a/rsd_lib/resources/v2_1/fabric/switch.py b/rsd_lib/resources/v2_1/fabric/switch.py index 18be157..a0ca067 100644 --- a/rsd_lib/resources/v2_1/fabric/switch.py +++ b/rsd_lib/resources/v2_1/fabric/switch.py @@ -74,7 +74,7 @@ class Switch(base.ResourceBase): """The switch managed state""" total_switch_width = base.Field('TotalSwitchWidth', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The switch total switch width""" indicator_led = base.Field('IndicatorLED') diff --git a/rsd_lib/resources/v2_1/manager/manager.py b/rsd_lib/resources/v2_1/manager/manager.py index 4c6d73b..8be9b2c 100644 --- a/rsd_lib/resources/v2_1/manager/manager.py +++ b/rsd_lib/resources/v2_1/manager/manager.py @@ -28,21 +28,21 @@ class StatusField(base.CompositeField): class GraphicalConsoleField(base.CompositeField): service_enabled = base.Field('ServiceEnabled') max_concurrent_sessions = base.Field('MaxConcurrentSessions', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) connect_types_supported = base.Field('ConnectTypesSupported') class SerialConsoleField(base.CompositeField): service_enabled = base.Field('ServiceEnabled') max_concurrent_sessions = base.Field('MaxConcurrentSessions', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) connect_types_supported = base.Field('ConnectTypesSupported') class CommandShellField(base.CompositeField): service_enabled = base.Field('ServiceEnabled') max_concurrent_sessions = base.Field('MaxConcurrentSessions', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) connect_types_supported = base.Field('ConnectTypesSupported') diff --git a/rsd_lib/resources/v2_1/node/node.py b/rsd_lib/resources/v2_1/node/node.py index 59fd3dc..9584ac2 100644 --- a/rsd_lib/resources/v2_1/node/node.py +++ b/rsd_lib/resources/v2_1/node/node.py @@ -91,7 +91,7 @@ class MemorySummaryField(base.CompositeField): """The memory status""" size_gib = base.Field('TotalSystemMemoryGiB', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The size of memory of the node in GiB. This signifies the total installed, operating system-accessible memory @@ -103,7 +103,7 @@ class ProcessorSummaryField(base.CompositeField): status = StatusField('Status') """The processor status""" - count = base.Field('Count', adapter=rsd_lib_utils.int_or_none) + count = base.Field('Count', adapter=rsd_lib_utils.num_or_none) """The number of CPUs in the node.""" model = base.Field('Model') diff --git a/rsd_lib/resources/v2_1/system/memory.py b/rsd_lib/resources/v2_1/system/memory.py index 9864e10..74e7dde 100644 --- a/rsd_lib/resources/v2_1/system/memory.py +++ b/rsd_lib/resources/v2_1/system/memory.py @@ -51,15 +51,15 @@ class Memory(base.ResourceBase): memory_media = base.Field('MemoryMedia') """The memory media""" - capacity_mib = base.Field('CapacityMiB', adapter=rsd_lib_utils.int_or_none) + capacity_mib = base.Field('CapacityMiB', adapter=rsd_lib_utils.num_or_none) """The capacity of this memory in MiB""" data_width_bits = base.Field('DataWidthBits', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The data width bits of this memory.""" bus_width_bits = base.Field('BusWidthBits', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The bus width bits of this memory.""" manufacturer = base.Field('Manufacturer') @@ -90,7 +90,7 @@ class Memory(base.ResourceBase): """The device identity""" rank_count = base.Field('RankCount', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The rank count of this memory""" device_locator = base.Field('DeviceLocator') @@ -100,7 +100,7 @@ class Memory(base.ResourceBase): """The error correction""" operating_speed_mhz = base.Field('OperatingSpeedMhz', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The operating speed of this memory in MHz""" operating_memory_modes = base.Field('OperatingMemoryModes') diff --git a/rsd_lib/resources/v2_1/system/network_interface.py b/rsd_lib/resources/v2_1/system/network_interface.py index f9e7cf7..0adc3ee 100644 --- a/rsd_lib/resources/v2_1/system/network_interface.py +++ b/rsd_lib/resources/v2_1/system/network_interface.py @@ -46,7 +46,7 @@ class IPv6StaticAddressesField(base.ListField): class VLANField(base.CompositeField): vlan_enable = base.Field('VLANEnable', adapter=bool) vlan_id = base.Field('VLANId', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) class NetworkInterface(base.ResourceBase): @@ -84,7 +84,7 @@ class NetworkInterface(base.ResourceBase): """Indicates if the NIC is in Full Duplex mode or not""" mtu_size = base.Field('MTUSize', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The network interface mtu size""" host_name = base.Field('HostName') @@ -97,7 +97,7 @@ class NetworkInterface(base.ResourceBase): """Default gateway address that is currently in use on this interface""" max_ipv6_static_addresses = base.Field('MaxIPv6StaticAddresses', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """Indicates the maximum number of Static IPv6 addresses that can be configured on this interface """ diff --git a/rsd_lib/resources/v2_1/system/storage_subsystem.py b/rsd_lib/resources/v2_1/system/storage_subsystem.py index 2f46538..ea02a08 100644 --- a/rsd_lib/resources/v2_1/system/storage_subsystem.py +++ b/rsd_lib/resources/v2_1/system/storage_subsystem.py @@ -39,7 +39,7 @@ class StorageControllersField(base.ListField): serial_number = base.Field('SerialNumber') part_number = base.Field('PartNumber') asset_tag = base.Field('AssetTag') - speed_gbps = base.Field('SpeedGbps', adapter=rsd_lib_utils.int_or_none) + speed_gbps = base.Field('SpeedGbps', adapter=rsd_lib_utils.num_or_none) firmware_version = base.Field('FirmwareVersion') supported_controller_protocols = base.Field( 'SupportedControllerProtocols') diff --git a/rsd_lib/resources/v2_2/ethernet_switch/port_metrics.py b/rsd_lib/resources/v2_2/ethernet_switch/port_metrics.py index 3f8cffd..5a6632c 100644 --- a/rsd_lib/resources/v2_2/ethernet_switch/port_metrics.py +++ b/rsd_lib/resources/v2_2/ethernet_switch/port_metrics.py @@ -19,31 +19,31 @@ from rsd_lib import utils as rsd_lib_utils class ReceivedField(base.CompositeField): - packets = base.Field('Packets', adapter=rsd_lib_utils.int_or_none) + packets = base.Field('Packets', adapter=rsd_lib_utils.num_or_none) dropped_packets = base.Field('DroppedPackets', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) error_packets = base.Field('ErrorPackets', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) broadcast_packets = base.Field('BroadcastPackets', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) multicast_packets = base.Field('MulticastPackets', - adapter=rsd_lib_utils.int_or_none) - errors = base.Field('Errors', adapter=rsd_lib_utils.int_or_none) - received_bytes = base.Field('Bytes', adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) + errors = base.Field('Errors', adapter=rsd_lib_utils.num_or_none) + received_bytes = base.Field('Bytes', adapter=rsd_lib_utils.num_or_none) class TransmittedField(base.CompositeField): - packets = base.Field('Packets', adapter=rsd_lib_utils.int_or_none) + packets = base.Field('Packets', adapter=rsd_lib_utils.num_or_none) dropped_packets = base.Field('DroppedPackets', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) error_packets = base.Field('ErrorPackets', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) broadcast_packets = base.Field('BroadcastPackets', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) multicast_packets = base.Field('MulticastPackets', - adapter=rsd_lib_utils.int_or_none) - errors = base.Field('Errors', adapter=rsd_lib_utils.int_or_none) - transmitted_bytes = base.Field('Bytes', adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) + errors = base.Field('Errors', adapter=rsd_lib_utils.num_or_none) + transmitted_bytes = base.Field('Bytes', adapter=rsd_lib_utils.num_or_none) class PortMetrics(base.ResourceBase): @@ -59,5 +59,5 @@ class PortMetrics(base.ResourceBase): transmitted = TransmittedField('Transmitted') """The transmitted packets status""" - collisions = base.Field('Collisions', adapter=rsd_lib_utils.int_or_none) + collisions = base.Field('Collisions', adapter=rsd_lib_utils.num_or_none) """The collisions status""" diff --git a/rsd_lib/resources/v2_2/system/memory_metrics.py b/rsd_lib/resources/v2_2/system/memory_metrics.py index d55acbc..7e6633d 100644 --- a/rsd_lib/resources/v2_2/system/memory_metrics.py +++ b/rsd_lib/resources/v2_2/system/memory_metrics.py @@ -31,7 +31,7 @@ class MemoryMetrics(base.ResourceBase): temperature_celsius = base.Field( ['Oem', 'Intel_RackScale', 'TemperatureCelsius'], - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The memory temperature celsius""" health = base.Field(['Oem', 'Intel_RackScale', 'Health']) diff --git a/rsd_lib/resources/v2_2/system/metrics.py b/rsd_lib/resources/v2_2/system/metrics.py index 86dea81..bd9abef 100644 --- a/rsd_lib/resources/v2_2/system/metrics.py +++ b/rsd_lib/resources/v2_2/system/metrics.py @@ -29,27 +29,27 @@ class Metrics(base.ResourceBase): """The metrics identity""" processor_bandwidth_percent = base.Field('ProcessorBandwidthPercent', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The processor bandwidth percent""" memory_bandwidth_percent = base.Field('MemoryBandwidthPercent', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The memory bandwidth percent""" memory_throttled_cycles_percent = base.Field( - 'MemoryThrottledCyclesPercent', adapter=rsd_lib_utils.int_or_none) + 'MemoryThrottledCyclesPercent', adapter=rsd_lib_utils.num_or_none) """The memory throttled cycles percent""" processor_power_watt = base.Field('ProcessorPowerWatt', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The processor power watt""" memory_power_watt = base.Field('MemoryPowerWatt', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The memory power watt""" io_bandwidth_gbps = base.Field('IOBandwidthGBps', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The io bandwidth GBps""" health = base.Field('Health') diff --git a/rsd_lib/resources/v2_2/system/processor_metrics.py b/rsd_lib/resources/v2_2/system/processor_metrics.py index 267c9bf..f220c1e 100644 --- a/rsd_lib/resources/v2_2/system/processor_metrics.py +++ b/rsd_lib/resources/v2_2/system/processor_metrics.py @@ -29,19 +29,19 @@ class ProcessorMetrics(base.ResourceBase): """The metrics identity""" average_frequency_mhz = base.Field('AverageFrequencyMHz', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The processor average frequency mhz""" throttling_celsius = base.Field('ThrottlingCelsius', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The processor throttling celsius""" temperature_celsius = base.Field('TemperatureCelsius', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The processor temperature celsius""" consumed_power_watt = base.Field('ConsumedPowerWatt', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The processor consumed power watt""" health = base.Field('Health') diff --git a/rsd_lib/resources/v2_3/ethernet_switch/ethernet_switch.py b/rsd_lib/resources/v2_3/ethernet_switch/ethernet_switch.py index e4a23d6..4ed3a8a 100644 --- a/rsd_lib/resources/v2_3/ethernet_switch/ethernet_switch.py +++ b/rsd_lib/resources/v2_3/ethernet_switch/ethernet_switch.py @@ -25,10 +25,10 @@ LOG = logging.getLogger(__name__) class ClassToPriorityMappingField(base.ListField): - priority = base.Field('Priority', adapter=rsd_lib_utils.int_or_none) + priority = base.Field('Priority', adapter=rsd_lib_utils.num_or_none) traffic_class = base.Field( - 'TrafficClass', adapter=rsd_lib_utils.int_or_none) + 'TrafficClass', adapter=rsd_lib_utils.num_or_none) class PriorityFlowControlField(base.CompositeField): @@ -38,27 +38,27 @@ class PriorityFlowControlField(base.CompositeField): class PriorityToClassMappingField(base.ListField): - priority = base.Field('Priority', adapter=rsd_lib_utils.int_or_none) + priority = base.Field('Priority', adapter=rsd_lib_utils.num_or_none) traffic_class = base.Field( - 'TrafficClass', adapter=rsd_lib_utils.int_or_none) + 'TrafficClass', adapter=rsd_lib_utils.num_or_none) class TrafficClassficationField(base.ListField): - port = base.Field('Port', adapter=rsd_lib_utils.int_or_none) + port = base.Field('Port', adapter=rsd_lib_utils.num_or_none) protocol = base.Field('Protocol') traffic_class = base.Field( - 'TrafficClass', adapter=rsd_lib_utils.int_or_none) + 'TrafficClass', adapter=rsd_lib_utils.num_or_none) class TransmissionSelectionField(base.ListField): bandwidth_percent = base.Field( - 'BandwidthPercent', adapter=rsd_lib_utils.int_or_none) + 'BandwidthPercent', adapter=rsd_lib_utils.num_or_none) traffic_class = base.Field( - 'TrafficClass', adapter=rsd_lib_utils.int_or_none) + 'TrafficClass', adapter=rsd_lib_utils.num_or_none) class EthernetSwitch(v2_2_ethernet_switch.EthernetSwitch): diff --git a/rsd_lib/resources/v2_3/fabric/endpoint.py b/rsd_lib/resources/v2_3/fabric/endpoint.py index ecc4611..3249ade 100644 --- a/rsd_lib/resources/v2_3/fabric/endpoint.py +++ b/rsd_lib/resources/v2_3/fabric/endpoint.py @@ -57,7 +57,7 @@ class IPTransportDetailsField(base.ListField): transport_protocol = base.Field('TransportProtocol') ipv4_address = base.Field(['IPv4Address', 'Address']) ipv6_address = base.Field(['IPv6Address', 'Address']) - port = base.Field('Port', adapter=rsd_lib_utils.int_or_none) + port = base.Field('Port', adapter=rsd_lib_utils.num_or_none) class AuthenticationField(base.CompositeField): diff --git a/rsd_lib/resources/v2_3/storage_service/drive.py b/rsd_lib/resources/v2_3/storage_service/drive.py index d4fad91..6a3c408 100644 --- a/rsd_lib/resources/v2_3/storage_service/drive.py +++ b/rsd_lib/resources/v2_3/storage_service/drive.py @@ -81,7 +81,7 @@ class Drive(base.ResourceBase): """The media type of this drive""" capacity_bytes = base.Field('CapacityBytes', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The capacity in Bytes of this drive""" manufacturer = base.Field('Manufacturer') diff --git a/rsd_lib/resources/v2_3/storage_service/storage_pool.py b/rsd_lib/resources/v2_3/storage_service/storage_pool.py index 4412ac3..f0e152c 100644 --- a/rsd_lib/resources/v2_3/storage_service/storage_pool.py +++ b/rsd_lib/resources/v2_3/storage_service/storage_pool.py @@ -33,13 +33,13 @@ class StatusField(base.CompositeField): class CapacityField(base.CompositeField): allocated_bytes = base.Field(['Data', 'AllocatedBytes'], - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) consumed_bytes = base.Field(['Data', 'ConsumedBytes'], - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) guaranteed_bytes = base.Field(['Data', 'GuaranteedBytes'], - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) provisioned_bytes = base.Field(['Data', 'ProvisionedBytes'], - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) class CapacitySourcesField(base.ListField): diff --git a/rsd_lib/resources/v2_3/storage_service/volume.py b/rsd_lib/resources/v2_3/storage_service/volume.py index ceb2d0a..ea55cfc 100644 --- a/rsd_lib/resources/v2_3/storage_service/volume.py +++ b/rsd_lib/resources/v2_3/storage_service/volume.py @@ -37,7 +37,7 @@ class CapacitySourcesField(base.ListField): adapter=utils.get_members_identities) allocated_Bytes = base.Field( ['ProvidedCapacity', 'Data', 'AllocatedBytes'], - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) class LinksField(base.CompositeField): @@ -92,11 +92,11 @@ class Volume(base.ResourceBase): """The access capabilities of volume""" capacity_bytes = base.Field('CapacityBytes', - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The capacity of volume in bytes""" allocated_Bytes = base.Field(['Capacity', 'Data', 'AllocatedBytes'], - adapter=rsd_lib_utils.int_or_none) + adapter=rsd_lib_utils.num_or_none) """The allocated capacity of volume in bytes""" capacity_sources = CapacitySourcesField('CapacitySources') diff --git a/rsd_lib/tests/unit/test_utils.py b/rsd_lib/tests/unit/test_utils.py index 80e2e3a..a90f036 100644 --- a/rsd_lib/tests/unit/test_utils.py +++ b/rsd_lib/tests/unit/test_utils.py @@ -28,7 +28,9 @@ class UtilsTestCase(testtools.TestCase): rsd_lib_utils.get_resource_identity({ "@odata.id": "/redfish/v1/Systems/437XR1138R2/BIOS"})) - def test_int_or_none(self): - self.assertIsNone(rsd_lib_utils.int_or_none(None)) - self.assertEqual(0, rsd_lib_utils.int_or_none('0')) - self.assertEqual(1, rsd_lib_utils.int_or_none('1')) + def test_num_or_none(self): + self.assertIsNone(rsd_lib_utils.num_or_none(None)) + self.assertEqual(0, rsd_lib_utils.num_or_none('0')) + self.assertEqual(1, rsd_lib_utils.num_or_none('1')) + self.assertEqual(10, rsd_lib_utils.num_or_none('10.0')) + self.assertEqual(12.5, rsd_lib_utils.num_or_none('12.5')) diff --git a/rsd_lib/utils.py b/rsd_lib/utils.py index 1ba84c8..7bf71a0 100644 --- a/rsd_lib/utils.py +++ b/rsd_lib/utils.py @@ -21,13 +21,17 @@ def get_resource_identity(resource): return resource.get('@odata.id', None) -def int_or_none(x): - """Given a value x it cast as int or None +def num_or_none(x): + """Given a value x it cast as int, float or None :param x: The value to transform and return - :returns: Either None or x cast to an int + :returns: Either None or x cast to an int/float """ if x is None: return None - return int(x) + + try: + return int(x) + except ValueError: + return float(x)