Skip to content

Commit 0892ea9

Browse files
authored
Merge pull request #1369 from rackerlabs/netapp-define
fix(netapp): do not fail if some resources exist on the NetApp
2 parents a37d8bc + 837371e commit 0892ea9

File tree

4 files changed

+134
-74
lines changed

4 files changed

+134
-74
lines changed

python/understack-workflows/tests/test_netapp_client.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ def test_create_ip_interface_success(self, mock_interface_class, netapp_client):
323323
broadcast_domain_name="test-domain",
324324
)
325325

326-
result = netapp_client.create_ip_interface(interface_spec)
326+
result = netapp_client.get_or_create_ip_interface(interface_spec)
327327

328328
assert isinstance(result, InterfaceResult)
329329
assert result.name == "test-interface"
@@ -362,14 +362,15 @@ def test_create_ip_interface_failure(self, mock_interface_class, netapp_client):
362362
)
363363

364364
with pytest.raises(NetworkOperationError):
365-
netapp_client.create_ip_interface(interface_spec)
365+
netapp_client.get_or_create_ip_interface(interface_spec)
366366

367367
@patch("understack_workflows.netapp.client.Port")
368368
def test_create_port_success(self, mock_port_class, netapp_client):
369369
"""Test successful port creation."""
370370
mock_port_instance = MagicMock()
371371
mock_port_instance.uuid = "port-uuid-123"
372372
mock_port_instance.name = "e4a-100"
373+
mock_port_class.get_collection.return_value = iter([])
373374
mock_port_class.return_value = mock_port_instance
374375

375376
port_spec = PortSpec(
@@ -379,7 +380,7 @@ def test_create_port_success(self, mock_port_class, netapp_client):
379380
broadcast_domain_name="test-domain",
380381
)
381382

382-
result = netapp_client.create_port(port_spec)
383+
result = netapp_client.get_or_create_port(port_spec)
383384

384385
assert isinstance(result, PortResult)
385386
assert result.uuid == "port-uuid-123"
@@ -390,10 +391,37 @@ def test_create_port_success(self, mock_port_class, netapp_client):
390391
mock_port_instance.post.assert_called_once_with(hydrate=True)
391392

392393
@patch("understack_workflows.netapp.client.Port")
393-
def test_create_port_failure(self, mock_port_class, netapp_client):
394+
def test_get_port_success(self, mock_port_class, netapp_client):
395+
"""Test successful port creation."""
396+
mock_port_instance = MagicMock()
397+
mock_port_instance.uuid = "port-uuid-123"
398+
mock_port_instance.name = "e4a-100"
399+
mock_port_class.get_collection.return_value = iter(mock_port_instance)
400+
mock_port_class.return_value = mock_port_instance
401+
402+
port_spec = PortSpec(
403+
node_name="node-01",
404+
vlan_id=100,
405+
base_port_name="e4a",
406+
broadcast_domain_name="test-domain",
407+
)
408+
409+
result = netapp_client.get_or_create_port(port_spec)
410+
411+
assert isinstance(result, PortResult)
412+
assert result.uuid == "port-uuid-123"
413+
assert result.name == "e4a-100"
414+
assert result.node_name == "node-01"
415+
assert result.port_type == "vlan"
416+
417+
mock_port_instance.post.assert_called_once_with(hydrate=True)
418+
419+
@patch("understack_workflows.netapp.client.Port")
420+
def test_get_or_create_port_failure(self, mock_port_class, netapp_client):
394421
"""Test port creation failure."""
395422
mock_port_instance = MagicMock()
396423
mock_port_instance.post.side_effect = NetAppRestError("Port creation failed")
424+
mock_port_class.get_collection.return_value = iter([])
397425
mock_port_class.return_value = mock_port_instance
398426

399427
# Configure mock error handler to raise the expected exception
@@ -409,7 +437,7 @@ def test_create_port_failure(self, mock_port_class, netapp_client):
409437
)
410438

411439
with pytest.raises(NetworkOperationError):
412-
netapp_client.create_port(port_spec)
440+
netapp_client.get_or_create_port(port_spec)
413441

414442
@patch("understack_workflows.netapp.client.Node")
415443
def test_get_nodes_success(self, mock_node_class, netapp_client):
@@ -715,8 +743,8 @@ def test_interface_methods_are_abstract(self):
715743
"create_volume",
716744
"delete_volume",
717745
"find_volume",
718-
"create_ip_interface",
719-
"create_port",
746+
"get_or_create_ip_interface",
747+
"get_or_create_port",
720748
"get_nodes",
721749
"get_namespaces",
722750
"create_route",

python/understack-workflows/tests/test_netapp_lif_service.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def test_create_lif_success(
6060
mock_port = PortResult(
6161
uuid="port-uuid-123", name="e4a-100", node_name="node-01", port_type="vlan"
6262
)
63-
mock_client.create_port.return_value = mock_port
63+
mock_client.get_or_create_port.return_value = mock_port
6464

6565
# Mock interface creation
6666
mock_interface = InterfaceResult(
@@ -71,7 +71,7 @@ def test_create_lif_success(
7171
enabled=True,
7272
svm_name=expected_svm_name,
7373
)
74-
mock_client.create_ip_interface.return_value = mock_interface
74+
mock_client.get_or_create_ip_interface.return_value = mock_interface
7575

7676
# Mock node identification
7777
mock_node = NodeResult(name="node-01", uuid="node-uuid-1")
@@ -83,15 +83,15 @@ def test_create_lif_success(
8383
mock_client.find_svm.assert_called_once_with(expected_svm_name)
8484

8585
# Verify port was created
86-
mock_client.create_port.assert_called_once()
87-
port_call_args = mock_client.create_port.call_args[0][0]
86+
mock_client.get_or_create_port.assert_called_once()
87+
port_call_args = mock_client.get_or_create_port.call_args[0][0]
8888
assert isinstance(port_call_args, PortSpec)
8989
assert port_call_args.node_name == "node-01"
9090
assert port_call_args.vlan_id == 100
9191

9292
# Verify interface was created
93-
mock_client.create_ip_interface.assert_called_once()
94-
interface_call_args = mock_client.create_ip_interface.call_args[0][0]
93+
mock_client.get_or_create_ip_interface.assert_called_once()
94+
interface_call_args = mock_client.get_or_create_ip_interface.call_args[0][0]
9595
assert isinstance(interface_call_args, InterfaceSpec)
9696
assert interface_call_args.name == sample_config.name
9797
assert interface_call_args.svm_name == expected_svm_name
@@ -117,8 +117,8 @@ def test_create_lif_svm_not_found(
117117
mock_client.find_svm.assert_called_once_with(expected_svm_name)
118118

119119
# Verify no port or interface creation was attempted
120-
mock_client.create_port.assert_not_called()
121-
mock_client.create_ip_interface.assert_not_called()
120+
mock_client.get_or_create_port.assert_not_called()
121+
mock_client.get_or_create_ip_interface.assert_not_called()
122122

123123
def test_create_lif_port_creation_error(
124124
self, lif_service, mock_client, mock_error_handler, sample_config
@@ -137,7 +137,7 @@ def test_create_lif_port_creation_error(
137137
mock_client.get_nodes.return_value = [mock_node]
138138

139139
# Mock port creation failure
140-
mock_client.create_port.side_effect = Exception("Port creation failed")
140+
mock_client.get_or_create_port.side_effect = Exception("Port creation failed")
141141
mock_error_handler.handle_operation_error.side_effect = NetAppManagerError(
142142
"Operation failed"
143143
)
@@ -160,15 +160,15 @@ def test_create_home_port_success(
160160
mock_port = PortResult(
161161
uuid="port-uuid-123", name="e4a-100", node_name="node-01", port_type="vlan"
162162
)
163-
mock_client.create_port.return_value = mock_port
163+
mock_client.get_or_create_port.return_value = mock_port
164164

165165
result = lif_service.create_home_port(sample_config)
166166

167167
assert result == mock_port
168168

169169
# Verify port was created with correct specification
170-
mock_client.create_port.assert_called_once()
171-
call_args = mock_client.create_port.call_args[0][0]
170+
mock_client.get_or_create_port.assert_called_once()
171+
call_args = mock_client.get_or_create_port.call_args[0][0]
172172
assert isinstance(call_args, PortSpec)
173173
assert call_args.node_name == "node-01"
174174
assert call_args.vlan_id == 100
@@ -189,7 +189,7 @@ def test_create_home_port_no_node(
189189
lif_service.create_home_port(sample_config)
190190

191191
# Verify no port creation was attempted
192-
mock_client.create_port.assert_not_called()
192+
mock_client.get_or_create_port.assert_not_called()
193193

194194
def test_identify_home_node_success(
195195
self, lif_service, mock_client, mock_error_handler, sample_config
@@ -284,10 +284,10 @@ def test_interface_spec_creation(
284284
mock_port = PortResult(
285285
uuid="port-uuid-123", name="e4a-100", node_name="node-01", port_type="vlan"
286286
)
287-
mock_client.create_port.return_value = mock_port
287+
mock_client.get_or_create_port.return_value = mock_port
288288

289289
# Mock interface creation
290-
mock_client.create_ip_interface.return_value = InterfaceResult(
290+
mock_client.get_or_create_ip_interface.return_value = InterfaceResult(
291291
name=sample_config.name,
292292
uuid="interface-uuid-123",
293293
address=str(sample_config.address),
@@ -302,7 +302,7 @@ def test_interface_spec_creation(
302302
lif_service.create_lif(project_id, sample_config)
303303

304304
# Verify the interface spec is created correctly
305-
interface_call_args = mock_client.create_ip_interface.call_args[0][0]
305+
interface_call_args = mock_client.get_or_create_ip_interface.call_args[0][0]
306306
assert interface_call_args.name == sample_config.name
307307
assert str(interface_call_args.address) == str(sample_config.address)
308308
assert interface_call_args.netmask == str(sample_config.network.netmask)
@@ -323,14 +323,14 @@ def test_port_spec_creation(
323323
mock_client.get_nodes.return_value = [mock_node]
324324

325325
# Mock port creation
326-
mock_client.create_port.return_value = PortResult(
326+
mock_client.get_or_create_port.return_value = PortResult(
327327
uuid="port-uuid-123", name="e4a-100", node_name="node-01", port_type="vlan"
328328
)
329329

330330
lif_service.create_home_port(sample_config)
331331

332332
# Verify the port spec is created correctly
333-
port_call_args = mock_client.create_port.call_args[0][0]
333+
port_call_args = mock_client.get_or_create_port.call_args[0][0]
334334
assert port_call_args.node_name == "node-01"
335335
assert port_call_args.vlan_id == sample_config.vlan_id
336336
assert port_call_args.base_port_name == sample_config.base_port_name

0 commit comments

Comments
 (0)