|
1 | 1 | import json |
| 2 | +from unittest.mock import MagicMock, patch |
2 | 3 |
|
3 | 4 | import pytest |
4 | 5 | from assertpy import assert_that |
| 6 | +from constructs import Construct |
5 | 7 | from freezegun import freeze_time |
6 | 8 |
|
7 | 9 | from pcluster.schemas.cluster_schema import ClusterSchema |
8 | 10 | from pcluster.templates.cdk_builder import CDKTemplateBuilder |
| 11 | +from pcluster.templates.queues_stack import QueuesStack, add_network_interfaces |
9 | 12 | from pcluster.utils import load_json_dict, load_yaml_dict |
10 | 13 | from tests.pcluster.aws.dummy_aws_api import mock_aws_api |
11 | 14 | from tests.pcluster.models.dummy_s3_bucket import dummy_cluster_bucket, mock_bucket_object_utils |
@@ -152,6 +155,77 @@ def test_compute_nodes_dna_json( |
152 | 155 | assert_that(json.loads(compute_node_extra_json)).is_equal_to(expected_compute_node_extra_json) |
153 | 156 |
|
154 | 157 |
|
| 158 | +class NetworkCard: |
| 159 | + def __init__(self, index, max_interfaces=1): |
| 160 | + self._index = index |
| 161 | + self._max_interfaces = max_interfaces |
| 162 | + |
| 163 | + def network_card_index(self): |
| 164 | + return self._index |
| 165 | + |
| 166 | + def maximum_network_interfaces(self): |
| 167 | + return self._max_interfaces |
| 168 | + |
| 169 | + |
| 170 | +@pytest.mark.parametrize( |
| 171 | + "efa_enabled, instance_type, network_cards_list, expected_interfaces", |
| 172 | + [ |
| 173 | + ( |
| 174 | + True, |
| 175 | + "p6e-gb200.36xlarge", |
| 176 | + [NetworkCard(0), NetworkCard(1), NetworkCard(2, 2), NetworkCard(3), NetworkCard(4, 2)], |
| 177 | + [ |
| 178 | + {"network_card_index": 0, "interface_type": None, "device_index": 0}, |
| 179 | + {"network_card_index": 1, "interface_type": "efa-only", "device_index": 0}, |
| 180 | + {"network_card_index": 2, "interface_type": "efa", "device_index": 1}, |
| 181 | + {"network_card_index": 3, "interface_type": "efa-only", "device_index": 0}, |
| 182 | + {"network_card_index": 4, "interface_type": "efa", "device_index": 1}, |
| 183 | + ], |
| 184 | + ), |
| 185 | + ( |
| 186 | + False, |
| 187 | + "p6e-gb200.36xlarge", |
| 188 | + [NetworkCard(0), NetworkCard(1), NetworkCard(2, 2), NetworkCard(3), NetworkCard(4, 2)], |
| 189 | + [ |
| 190 | + {"network_card_index": 0, "interface_type": None, "device_index": 0}, |
| 191 | + {"network_card_index": 2, "interface_type": None, "device_index": 1}, |
| 192 | + {"network_card_index": 4, "interface_type": None, "device_index": 1}, |
| 193 | + ], |
| 194 | + ), |
| 195 | + ( |
| 196 | + True, |
| 197 | + "c6in.32xlarge", |
| 198 | + [NetworkCard(0), NetworkCard(1, 2), NetworkCard(2, 2)], |
| 199 | + [ |
| 200 | + {"network_card_index": 0, "interface_type": "efa", "device_index": 0}, |
| 201 | + {"network_card_index": 1, "interface_type": "efa", "device_index": 1}, |
| 202 | + {"network_card_index": 2, "interface_type": "efa", "device_index": 1}, |
| 203 | + ], |
| 204 | + ), |
| 205 | + ], |
| 206 | +) |
| 207 | +def test_add_compute_resource_launch_template( |
| 208 | + mocker, efa_enabled, instance_type, test_datadir, network_cards_list, expected_interfaces |
| 209 | +): |
| 210 | + mock_compute_resource = MagicMock() |
| 211 | + mock_compute_resource.name = "test-compute-resource" |
| 212 | + mock_compute_resource.instance_types = [instance_type] |
| 213 | + mock_compute_resource.efa.enabled = efa_enabled |
| 214 | + mock_compute_resource.network_cards_list = network_cards_list |
| 215 | + |
| 216 | + mock_queue = MagicMock() |
| 217 | + mock_queue.name = "test-queue" |
| 218 | + |
| 219 | + network_interfaces = add_network_interfaces(mock_queue, mock_compute_resource, ["sg-12345"]) |
| 220 | + |
| 221 | + assert len(network_interfaces) == len(expected_interfaces) |
| 222 | + |
| 223 | + for actual, expected in zip(network_interfaces, expected_interfaces): |
| 224 | + assert actual.network_card_index == expected["network_card_index"] |
| 225 | + assert actual.interface_type == expected["interface_type"] |
| 226 | + assert actual.device_index == expected["device_index"] |
| 227 | + |
| 228 | + |
155 | 229 | def render_join(elem: dict): |
156 | 230 | sep = str(elem[0]) |
157 | 231 | body = elem[1] |
|
0 commit comments