Skip to content

Commit 7eeacec

Browse files
committed
2 parents e3a0536 + 95fd12b commit 7eeacec

8 files changed

Lines changed: 38 additions & 27 deletions

File tree

scripts/generate_dump

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,7 @@ collect_mellanox() {
13431343
local platform=$(python3 -c "from sonic_py_common import device_info; print(device_info.get_platform())")
13441344
local platform_folder="/usr/share/sonic/device/${platform}"
13451345
local hwsku=$(python3 -c "from sonic_py_common import device_info; print(device_info.get_hwsku())")
1346+
local is_smartswitch=$(python3 -c "from sonic_py_common import device_info; print(device_info.is_smartswitch())")
13461347
local sku_folder="/usr/share/sonic/device/${platform}/${hwsku}"
13471348
local cmis_host_mgmt_files=(
13481349
"/tmp/nv-syncd-shared/sai.profile"
@@ -1404,6 +1405,9 @@ collect_mellanox() {
14041405
fi
14051406

14061407
save_cmd "get_component_versions.py" "component_versions"
1408+
if [[ $is_smartswitch == "True" ]]; then
1409+
save_cmd "dpuctl dpu-status" "dpu_status"
1410+
fi
14071411

14081412
# Save CMIS-host-management related files
14091413
local cmis_host_mgmt_path="cmis-host-mgmt"

show/chassis_modules.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from tabulate import tabulate
44
from swsscommon.swsscommon import SonicV2Connector
55
from utilities_common.chassis import is_smartswitch
6+
from sonic_platform_base.module_base import ModuleBase
67

78
import utilities_common.cli as clicommon
89
from sonic_py_common import multi_asic
@@ -58,18 +59,21 @@ def status(db, chassis_module_name):
5859
continue
5960

6061
data_dict = state_db.get_all(state_db.STATE_DB, key)
61-
desc = data_dict[CHASSIS_MODULE_INFO_DESC_FIELD]
62-
slot = data_dict[CHASSIS_MODULE_INFO_SLOT_FIELD]
63-
oper_status = data_dict[CHASSIS_MODULE_INFO_OPERSTATUS_FIELD]
64-
serial = data_dict[CHASSIS_MODULE_INFO_SERIAL_FIELD]
6562

63+
# Use default values if any field is missing
64+
desc = data_dict.get(CHASSIS_MODULE_INFO_DESC_FIELD, 'N/A')
65+
slot = data_dict.get(CHASSIS_MODULE_INFO_SLOT_FIELD, 'N/A')
66+
oper_status = data_dict.get(CHASSIS_MODULE_INFO_OPERSTATUS_FIELD, ModuleBase.MODULE_STATUS_EMPTY)
67+
serial = data_dict.get(CHASSIS_MODULE_INFO_SERIAL_FIELD, 'N/A')
68+
69+
# Determine admin_status
6670
if is_smartswitch():
6771
admin_status = 'down'
6872
else:
6973
admin_status = 'up'
7074
config_data = chassis_cfg_table.get(key_list[1])
7175
if config_data is not None:
72-
admin_status = config_data.get(CHASSIS_MODULE_INFO_ADMINSTATUS_FIELD)
76+
admin_status = config_data.get(CHASSIS_MODULE_INFO_ADMINSTATUS_FIELD, admin_status)
7377

7478
table.append((key_list[1], desc, slot, oper_status, admin_status, serial))
7579

@@ -100,13 +104,15 @@ def midplane_status(chassis_module_name):
100104
table = []
101105
for key in natsorted(keys):
102106
key_list = key.split('|')
103-
if len(key_list) != 2: # error data in DB, log it and ignore
107+
if len(key_list) != 2:
104108
print('Warn: Invalid Key {} in {} table'.format(key, CHASSIS_MIDPLANE_INFO_TABLE))
105109
continue
106110

107111
data_dict = state_db.get_all(state_db.STATE_DB, key)
108-
ip = data_dict[CHASSIS_MIDPLANE_INFO_IP_FIELD]
109-
access = data_dict[CHASSIS_MIDPLANE_INFO_ACCESS_FIELD]
112+
113+
# Defensive access with fallback defaults
114+
ip = data_dict.get(CHASSIS_MIDPLANE_INFO_IP_FIELD, 'N/A')
115+
access = data_dict.get(CHASSIS_MIDPLANE_INFO_ACCESS_FIELD, 'Unknown')
110116

111117
table.append((key_list[1], ip, access))
112118

sonic_package_manager/database.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ class PackageEntry:
3131
built_in: Boolean flag whether the package is built in.
3232
image_id: Image ID for this package or None if package
3333
is not installed.
34-
tag: Tag for this package or None if package is not installed.
34+
docker_image_reference: Docker image reference for this package or None if package
35+
is not installed.
3536
"""
3637

3738
name: str
@@ -42,7 +43,7 @@ class PackageEntry:
4243
installed: bool = False
4344
built_in: bool = False
4445
image_id: Optional[str] = None
45-
tag: Optional[str] = None
46+
docker_image_reference: Optional[str] = None
4647

4748

4849
def package_from_dict(name: str, package_info: Dict) -> PackageEntry:
@@ -57,10 +58,10 @@ def package_from_dict(name: str, package_info: Dict) -> PackageEntry:
5758
installed = package_info.get('installed', False)
5859
built_in = package_info.get('built-in', False)
5960
image_id = package_info.get('image-id')
60-
tag = package_info.get('tag')
61+
docker_image_reference = package_info.get('docker-image-reference')
6162
return PackageEntry(name, repository, description,
6263
default_reference, version, installed,
63-
built_in, image_id, tag)
64+
built_in, image_id, docker_image_reference)
6465

6566

6667
def package_to_dict(package: PackageEntry) -> Dict:
@@ -74,7 +75,7 @@ def package_to_dict(package: PackageEntry) -> Dict:
7475
'installed': package.installed,
7576
'built-in': package.built_in,
7677
'image-id': package.image_id,
77-
'tag': package.tag,
78+
'docker-image-reference': package.docker_image_reference,
7879
}
7980

8081

sonic_package_manager/service_creator/creator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ def generate_container_mgmt(self, package: Package):
283283
'docker_container_name': name,
284284
'docker_image_id': image_id,
285285
'docker_image_name': package.entry.repository,
286-
'docker_image_tag': package.entry.tag,
286+
'docker_image_reference': package.entry.docker_image_reference,
287287
'docker_image_run_opt': run_opt,
288288
'sonic_asic_platform': sonic_asic_platform
289289
}

sonic_package_manager/source.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ def install(self, package: Package):
5151

5252
image = self.install_image(package)
5353
package.entry.image_id = image.id
54-
if image.tags:
55-
package.entry.tag = image.tags[0]
54+
if image.docker_image_references:
55+
package.entry.docker_image_reference = image.docker_image_references[0]
5656
else:
57-
package.entry.tag = image.id
57+
package.entry.docker_image_reference = image.id
5858

5959
# if no repository is defined for this package
6060
# get repository from image

tests/sonic_package_manager/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def mock_docker_api():
2626
@dataclass
2727
class Image:
2828
id: str
29-
tags: list[str]
29+
docker_image_references: list[str]
3030

3131
@property
3232
def attrs(self):

tests/sonic_package_manager/test_database.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def test_package_from_dict():
9999
'installed': True,
100100
'built-in': False,
101101
'image-id': 'abc123',
102-
'tag': 'latest'
102+
'docker-image-reference': 'latest'
103103
}
104104

105105
package = package_from_dict('test-package', package_info)
@@ -112,7 +112,7 @@ def test_package_from_dict():
112112
assert package.installed is True
113113
assert package.built_in is False
114114
assert package.image_id == 'abc123'
115-
assert package.tag == 'latest'
115+
assert package.docker_image_reference == 'latest'
116116

117117

118118
def test_package_from_dict_minimal():
@@ -131,4 +131,4 @@ def test_package_from_dict_minimal():
131131
assert package.installed is False
132132
assert package.built_in is False
133133
assert package.image_id is None
134-
assert package.tag is None
134+
assert package.docker_image_reference is None

tests/sonic_package_manager/test_manager.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -602,21 +602,21 @@ def test_download_file_sftp(package_manager):
602602
)
603603

604604

605-
def test_installation_from_file_no_tags(package_manager, mock_docker_api, sonic_fs):
606-
# Override the load function to return an image without tags
607-
def load_no_tags(filename):
605+
def test_installation_from_file_no_image_references(package_manager, mock_docker_api, sonic_fs):
606+
# Override the load function to return an image without image references
607+
def load_no_image_references(filename):
608608
class Image:
609609
def __init__(self, id):
610610
self.id = id
611-
self.tags = []
611+
self.docker_image_references = []
612612

613613
@property
614614
def attrs(self):
615615
return {'RepoTags': []}
616616

617617
return Image(filename)
618618

619-
mock_docker_api.load = MagicMock(side_effect=load_no_tags)
619+
mock_docker_api.load = MagicMock(side_effect=load_no_image_references)
620620

621621
sonic_fs.create_file('Azure/docker-test:1.6.0')
622622
package_manager.install(tarball='Azure/docker-test:1.6.0')
@@ -626,4 +626,4 @@ def attrs(self):
626626

627627
# Get the package from the database and verify the tag was set to the image ID
628628
package = package_manager.database.get_package('test-package')
629-
assert package.tag == 'Azure/docker-test:1.6.0'
629+
assert package.docker_image_reference == 'Azure/docker-test:1.6.0'

0 commit comments

Comments
 (0)