Skip to content

Commit a3df6c4

Browse files
committed
Add unit test for network interface setup
1 parent a59f9c9 commit a3df6c4

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

cli/src/pcluster/templates/queues_stack.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
DEFAULT_EPHEMERAL_DIR,
1414
NODE_BOOTSTRAP_TIMEOUT,
1515
OS_MAPPING,
16+
P6E_GB200,
1617
PCLUSTER_COMPUTE_RESOURCE_NAME_TAG,
1718
PCLUSTER_QUEUE_NAME_TAG,
1819
PCLUSTER_S3_ARTIFACTS_DICT,
@@ -366,9 +367,8 @@ def add_network_interfaces(
366367
compute_resource,
367368
queue_lt_security_groups,
368369
):
369-
"""Generate launch template network interfaces list"""
370-
371-
is_gb200 = compute_resource.instance_types[0] == "p6e-gb200.36xlarge"
370+
"""Generate launch template network interfaces list."""
371+
is_gb200 = compute_resource.instance_types[0].split(".")[0] == P6E_GB200
372372
interface = "efa" if compute_resource.efa and compute_resource.efa.enabled and not is_gb200 else None
373373

374374
compute_lt_nw_interfaces = [

cli/tests/pcluster/templates/test_queues_stack.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import json
2+
from unittest.mock import MagicMock
23

34
import pytest
45
from assertpy import assert_that
56
from freezegun import freeze_time
67

78
from pcluster.schemas.cluster_schema import ClusterSchema
89
from pcluster.templates.cdk_builder import CDKTemplateBuilder
10+
from pcluster.templates.queues_stack import add_network_interfaces
911
from pcluster.utils import load_json_dict, load_yaml_dict
1012
from tests.pcluster.aws.dummy_aws_api import mock_aws_api
1113
from tests.pcluster.models.dummy_s3_bucket import dummy_cluster_bucket, mock_bucket_object_utils
@@ -152,6 +154,77 @@ def test_compute_nodes_dna_json(
152154
assert_that(json.loads(compute_node_extra_json)).is_equal_to(expected_compute_node_extra_json)
153155

154156

157+
class NetworkCard:
158+
def __init__(self, index, max_interfaces=1):
159+
self._index = index
160+
self._max_interfaces = max_interfaces
161+
162+
def network_card_index(self):
163+
return self._index
164+
165+
def maximum_network_interfaces(self):
166+
return self._max_interfaces
167+
168+
169+
@pytest.mark.parametrize(
170+
"efa_enabled, instance_type, network_cards_list, expected_interfaces",
171+
[
172+
(
173+
True,
174+
"p6e-gb200.36xlarge",
175+
[NetworkCard(0), NetworkCard(1), NetworkCard(2, 2), NetworkCard(3), NetworkCard(4, 2)],
176+
[
177+
{"network_card_index": 0, "interface_type": None, "device_index": 0},
178+
{"network_card_index": 1, "interface_type": "efa-only", "device_index": 0},
179+
{"network_card_index": 2, "interface_type": "efa", "device_index": 1},
180+
{"network_card_index": 3, "interface_type": "efa-only", "device_index": 0},
181+
{"network_card_index": 4, "interface_type": "efa", "device_index": 1},
182+
],
183+
),
184+
(
185+
False,
186+
"p6e-gb200.36xlarge",
187+
[NetworkCard(0), NetworkCard(1), NetworkCard(2, 2), NetworkCard(3), NetworkCard(4, 2)],
188+
[
189+
{"network_card_index": 0, "interface_type": None, "device_index": 0},
190+
{"network_card_index": 2, "interface_type": None, "device_index": 1},
191+
{"network_card_index": 4, "interface_type": None, "device_index": 1},
192+
],
193+
),
194+
(
195+
True,
196+
"c6in.32xlarge",
197+
[NetworkCard(0), NetworkCard(1, 2), NetworkCard(2, 2)],
198+
[
199+
{"network_card_index": 0, "interface_type": "efa", "device_index": 0},
200+
{"network_card_index": 1, "interface_type": "efa", "device_index": 1},
201+
{"network_card_index": 2, "interface_type": "efa", "device_index": 1},
202+
],
203+
),
204+
],
205+
)
206+
def test_add_compute_resource_launch_template(
207+
mocker, efa_enabled, instance_type, test_datadir, network_cards_list, expected_interfaces
208+
):
209+
mock_compute_resource = MagicMock()
210+
mock_compute_resource.name = "test-compute-resource"
211+
mock_compute_resource.instance_types = [instance_type]
212+
mock_compute_resource.efa.enabled = efa_enabled
213+
mock_compute_resource.network_cards_list = network_cards_list
214+
215+
mock_queue = MagicMock()
216+
mock_queue.name = "test-queue"
217+
218+
network_interfaces = add_network_interfaces(mock_queue, mock_compute_resource, ["sg-12345"])
219+
220+
assert len(network_interfaces) == len(expected_interfaces)
221+
222+
for actual, expected in zip(network_interfaces, expected_interfaces):
223+
assert actual.network_card_index == expected["network_card_index"]
224+
assert actual.interface_type == expected["interface_type"]
225+
assert actual.device_index == expected["device_index"]
226+
227+
155228
def render_join(elem: dict):
156229
sep = str(elem[0])
157230
body = elem[1]

0 commit comments

Comments
 (0)