Skip to content

Commit b8f360e

Browse files
authored
Merge pull request #4750 from zenoss/fix/ZEN-35449
ZEN-35449: Add Model Phone in Cloud GUI Inventory View
2 parents 7bdbadb + 75ec869 commit b8f360e

File tree

2 files changed

+108
-3
lines changed

2 files changed

+108
-3
lines changed

src/Products/Zing/fact.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from Products.ZenModel.System import System
2424
from Products.ZenModel.Location import Location
2525
from Products.ZenRelations.ZenPropertyManager import iszprop, iscustprop
26+
from Products.ZenModel.Hardware import Hardware
2627

2728
from .interfaces import IImpactRelationshipsFactProvider
2829
from .shortid import shortid
@@ -219,17 +220,31 @@ def device_info_fact(device):
219220
if osManufacturer != "":
220221
f.data[MetadataKeys.OS_MANUFACTURER] = osManufacturer
221222

222-
hwModel, hwManufacturer = extract_model_manufacturer(device.getHWProductKey())
223+
hwProductKey = None
224+
hwTag = None
225+
hwSN = None
226+
227+
if isinstance(device, Hardware):
228+
hwProductKey = device.getProductKey()
229+
hwTag = getattr(device, "tag", None)
230+
hwSN = getattr(device, "serialNumber", None)
231+
else:
232+
if hasattr(device, "getHWProductKey"):
233+
hwProductKey = device.getHWProductKey()
234+
if hasattr(device, "getHWTag"):
235+
hwTag = device.getHWTag()
236+
if hasattr(device, "getHWSerialNumber"):
237+
hwSN = device.getHWSerialNumber()
238+
239+
hwModel, hwManufacturer = extract_model_manufacturer(hwProductKey)
223240
if hwModel != "":
224241
f.data[MetadataKeys.HW_MODEL] = hwModel
225242
if hwManufacturer != "":
226243
f.data[MetadataKeys.HW_MANUFACTURER] = hwManufacturer
227244

228-
hwTag = device.getHWTag()
229245
if hwTag is not None and hwTag != "":
230246
f.data[MetadataKeys.HW_TAG] = hwTag
231247

232-
hwSN = device.getHWSerialNumber()
233248
if hwSN is not None and hwSN != "":
234249
f.data[MetadataKeys.HW_SERIAL_NUMBER] = hwSN
235250

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
##############################################################################
2+
#
3+
# Copyright (C) Zenoss, Inc. 2026, all rights reserved.
4+
#
5+
# This content is made available according to terms specified in
6+
# License.zenoss under the directory where your Zenoss product is installed.
7+
#
8+
##############################################################################
9+
10+
from __future__ import absolute_import
11+
12+
from unittest import TestCase
13+
14+
from Products.ZenModel.Hardware import Hardware
15+
from Products.Zing.fact import device_info_fact, MetadataKeys
16+
17+
class DummyDevice(object):
18+
id = "dummy_device"
19+
title = "Dummy Device"
20+
21+
def _propertyMap(self): return []
22+
def device(self): return None
23+
def getProductionState(self): return 1000
24+
def getPriorityConversions(self): return {}
25+
def getProdStateConversions(self): return {}
26+
def convertProdState(self, state): return "Production"
27+
28+
def getOSProductKey(self): return ("os_model", "os_manufacturer")
29+
def getHWProductKey(self): return ("device_hw_model", "device_hw_manufacturer")
30+
def getHWTag(self): return "device_hw_tag"
31+
def getHWSerialNumber(self): return "device_hw_sn"
32+
33+
34+
class DummyHardwareComponent(Hardware):
35+
id = "dummy_hw_comp"
36+
title = "Dummy HW Component"
37+
38+
tag = "comp_hw_tag"
39+
serialNumber = "comp_hw_sn"
40+
41+
def __init__(self):
42+
# Prevent calling MEProduct.__init__ which relies on ZODB infrastructure
43+
pass
44+
45+
def _propertyMap(self): return []
46+
def device(self): return None
47+
def getProductionState(self): return 1000
48+
def getPriorityConversions(self): return {}
49+
def getProdStateConversions(self): return {}
50+
def convertProdState(self, state): return "Production"
51+
52+
def getOSProductKey(self): return ("os_model", "os_manufacturer")
53+
54+
# Its own hardware properties
55+
def getProductKey(self): return ("comp_hw_model", "comp_hw_manufacturer")
56+
57+
# Inherited device properties (fallback)
58+
def getHWProductKey(self): return ("device_hw_model", "device_hw_manufacturer")
59+
def getHWTag(self): return "device_hw_tag"
60+
def getHWSerialNumber(self): return "device_hw_sn"
61+
62+
63+
class TestFactGeneration(TestCase):
64+
65+
def test_device_hardware_extraction(self):
66+
"""
67+
Verify that device_info_fact correctly extracts hardware properties
68+
from a standard Device object using the fallback methods.
69+
"""
70+
device = DummyDevice()
71+
fact = device_info_fact(device)
72+
73+
self.assertEqual(fact.data.get(MetadataKeys.HW_MODEL), "device_hw_model")
74+
self.assertEqual(fact.data.get(MetadataKeys.HW_MANUFACTURER), "device_hw_manufacturer")
75+
self.assertEqual(fact.data.get(MetadataKeys.HW_TAG), "device_hw_tag")
76+
self.assertEqual(fact.data.get(MetadataKeys.HW_SERIAL_NUMBER), "device_hw_sn")
77+
78+
def test_hardware_component_extraction(self):
79+
"""
80+
Verify that device_info_fact extracts hardware properties directly from
81+
a component that inherits from Hardware, rather than falling back to the
82+
parent device methods.
83+
"""
84+
hw_comp = DummyHardwareComponent()
85+
fact = device_info_fact(hw_comp)
86+
87+
self.assertEqual(fact.data.get(MetadataKeys.HW_MODEL), "comp_hw_model")
88+
self.assertEqual(fact.data.get(MetadataKeys.HW_MANUFACTURER), "comp_hw_manufacturer")
89+
self.assertEqual(fact.data.get(MetadataKeys.HW_TAG), "comp_hw_tag")
90+
self.assertEqual(fact.data.get(MetadataKeys.HW_SERIAL_NUMBER), "comp_hw_sn")

0 commit comments

Comments
 (0)