Skip to content

Commit c8d0ea6

Browse files
Merge pull request #197 from amd/alex_nic_update
NicPlugin update
2 parents 309e219 + 4f2f277 commit c8d0ea6

2 files changed

Lines changed: 67 additions & 13 deletions

File tree

nodescraper/plugins/inband/nic/nic_collector.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,9 @@ class NicCollector(InBandDataCollector[NicDataModel, NicCollectorArgs]):
354354
CMD_NICCLI_QOS_TEMPLATE_LEGACY,
355355
]
356356
# New (> v233): double-dash options and qos --ets --show
357-
CMD_NICCLI_SUPPORT_RDMA_TEMPLATE_NEW = "niccli --dev {device_num} nvm --getoption support_rdma"
357+
CMD_NICCLI_SUPPORT_RDMA_TEMPLATE_NEW = (
358+
"niccli --dev {device_num} nvm --getoption support_rdma --scope 0"
359+
)
358360
CMD_NICCLI_PERFORMANCE_PROFILE_TEMPLATE_NEW = (
359361
"niccli --dev {device_num} nvm --getoption performance_profile"
360362
)
@@ -471,6 +473,19 @@ def collect_data(
471473
card_ids = [c.id for c in legacy_cards]
472474
card_list_from_text = [c.model_dump() for c in legacy_cards]
473475

476+
if custom_commands is None and not device_nums and not card_ids:
477+
self._log_event(
478+
category=EventCategory.NETWORK,
479+
description="No Broadcom (niccli) or Pensando (nicctl) NIC hardware detected",
480+
priority=EventPriority.INFO,
481+
)
482+
self.result.status = ExecutionStatus.NOT_RAN
483+
self.result.message = (
484+
"No Broadcom (niccli) or Pensando (nicctl) NIC hardware detected; "
485+
"NIC collection skipped"
486+
)
487+
return self.result, None
488+
474489
# Build full command list (expand placeholders)
475490
if custom_commands is not None:
476491
commands_to_run: List[str] = []
@@ -486,18 +501,19 @@ def collect_data(
486501
else:
487502
commands_to_run = []
488503
# niccli list already stored
489-
per_device_templates = _get_niccli_per_device_templates(niccli_version)
490-
for tpl in per_device_templates:
491-
for d in device_nums:
492-
commands_to_run.append(tpl.format(device_num=d))
493-
# nicctl global (card discovery already done via CMD_NICCTL_CARD_TEXT)
494-
for c in NicCollector.CMD_NICCTL_GLOBAL:
495-
commands_to_run.append(c)
496-
for tpl in NicCollector.CMD_NICCTL_PER_CARD:
497-
for cid in card_ids:
498-
commands_to_run.append(tpl.format(card_id=cid))
499-
for cmd in NicCollector.CMD_NICCTL_LEGACY_TEXT:
500-
commands_to_run.append(cmd)
504+
if device_nums:
505+
per_device_templates = _get_niccli_per_device_templates(niccli_version)
506+
for tpl in per_device_templates:
507+
for d in device_nums:
508+
commands_to_run.append(tpl.format(device_num=d))
509+
if card_ids:
510+
for c in NicCollector.CMD_NICCTL_GLOBAL:
511+
commands_to_run.append(c)
512+
for tpl in NicCollector.CMD_NICCTL_PER_CARD:
513+
for cid in card_ids:
514+
commands_to_run.append(tpl.format(card_id=cid))
515+
for cmd in NicCollector.CMD_NICCTL_LEGACY_TEXT:
516+
commands_to_run.append(cmd)
501517

502518
# Run each command and store (artifact-only commands are not added to results / data model).
503519
for cmd in commands_to_run:

test/unit/plugin/test_niccli_collector.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,44 @@ def test_nic_data_model_with_pensando_nic(collector):
242242
assert data.pensando_nic_cards[1].serial_number == "FPL253710E5"
243243

244244

245+
def test_collect_data_not_ran_when_no_nic_hardware(collector, conn_mock):
246+
"""Skip collection when discovery finds no Broadcom or Pensando NICs."""
247+
collector.system_info.os_family = OSFamily.LINUX
248+
collector._run_sut_cmd = MagicMock(
249+
return_value=MagicMock(exit_code=1, stdout="", stderr="not found", command="")
250+
)
251+
252+
result, data = collector.collect_data()
253+
254+
assert result.status == ExecutionStatus.NOT_RAN
255+
assert data is None
256+
assert "skipped" in result.message.lower()
257+
assert collector._run_sut_cmd.call_count <= 4
258+
259+
260+
def test_collect_data_skips_nicctl_commands_when_no_pensando_cards(collector, conn_mock):
261+
"""Do not run nicctl global/legacy commands when nicctl show card finds no cards."""
262+
collector.system_info.os_family = OSFamily.LINUX
263+
commands_run: list[str] = []
264+
265+
def run_sut_cmd_side_effect(cmd, **kwargs):
266+
commands_run.append(cmd)
267+
if "niccli" in cmd and ("--list" in cmd or "--list_devices" in cmd or "--listdev" in cmd):
268+
return MagicMock(exit_code=0, stdout=NICCLI_LISTDEV_OUTPUT, stderr="", command=cmd)
269+
if cmd.strip() == "nicctl show card":
270+
return MagicMock(exit_code=1, stdout="", stderr="no card", command=cmd)
271+
return MagicMock(exit_code=0, stdout="", stderr="", command=cmd)
272+
273+
collector._run_sut_cmd = MagicMock(side_effect=run_sut_cmd_side_effect)
274+
275+
result, data = collector.collect_data()
276+
277+
assert result.status == ExecutionStatus.OK
278+
assert data is not None
279+
assert not any(c.startswith("nicctl show card flash") for c in commands_run)
280+
assert not any(c == "nicctl --version" for c in commands_run)
281+
282+
245283
def test_collect_data_success(collector, conn_mock):
246284
"""Test successful collection of niccli/nicctl data."""
247285
collector.system_info.os_family = OSFamily.LINUX

0 commit comments

Comments
 (0)