1 # -*- coding: utf-8 -*-
4 # Copyright 2017 Intel Corporation.
6 # Licensed under the Apache License, Version 2.0 (the "License"); you may
7 # not use this file except in compliance with the License. You may obtain
8 # a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15 # License for the specific language governing permissions and limitations
18 # For those usages not covered by the Apache License, Version 2.0 please
19 # contact with: nfvlabs@tid.es
23 This module contains unit tests for the OpenStack VIM connector
24 Run this directly with python2 or python3.
27 from copy
import deepcopy
32 from mock
import MagicMock
, patch
33 from neutronclient
.v2_0
.client
import Client
34 from novaclient
import exceptions
as nvExceptions
35 from novaclient
.exceptions
import ClientException
, Conflict
36 from osm_ro_plugin
import vimconn
37 from osm_ro_plugin
.vimconn
import (
38 VimConnConnectionException
,
40 VimConnNotFoundException
,
42 from osm_rovim_openstack
.vimconn_openstack
import vimconnector
44 __author__
= "Igor D.C."
45 __date__
= "$23-aug-2017 23:59:59$"
47 # Variables Used in TestNewVmInstance Class
49 description
= "my firewall"
51 image_id
= "408b73-e9cc-5a6a-t270-82cc4811bd4a"
52 flavor_id
= "208b73-e9cc-5a6a-t270-82cc4811bd4a"
53 affinity_group_list
= []
58 {"size": 10, "image_id": image_id
},
61 availability_zone_index
= 0
62 availability_zone_list
= ["nova"]
63 floating_network_vim_id
= "108b73-e9cc-5a6a-t270-82cc4811bd4a"
64 net_id
= "83372685-f67f-49fd-8722-eabb7692fc22"
65 net2_id
= "46472685-f67f-49fd-8722-eabb7692fc22"
66 mac_address
= "00:00:5e:00:53:af"
67 port_id
= "03372685-f67f-49fd-8722-eabb7692fc22"
68 time_return_value
= 156570000
69 port2_id
= "17472685-f67f-49fd-8722-eabb7692fc22"
70 root_vol_id
= "tc408b73-r9cc-5a6a-a270-82cc4811bd4a"
72 volume_id
= "ac408b73-b9cc-4a6a-a270-82cc4811bd4a"
73 volume_id2
= "o4e0e83-b9uu-4akk-a234-89cc4811bd4a"
74 volume_id3
= "44e0e83-t9uu-4akk-a234-p9cc4811bd4a"
75 virtual_mac_id
= "64e0e83-t9uu-4akk-a234-p9cc4811bd4a"
76 created_items_all_true
= {
77 f
"floating_ip:{floating_network_vim_id}": True,
78 f
"volume:{volume_id}": True,
79 f
"port:{port_id}": True,
83 # Variables used in TestNewFlavor Class
84 name1
= "sample-flavor"
87 "cpu-quota": {"limit": 3},
88 "mem-quota": {"limit": 1},
89 "mempage-size": "LARGE",
90 "cpu-pinning-policy": "DEDICATED",
91 "mem-policy": "STRICT",
110 class TestSfcOperations(unittest
.TestCase
):
111 @mock.patch("logging.getLogger", autospec
=True)
112 def setUp(self
, mock_logger
):
113 # Instantiate dummy VIM connector so we can test it
114 # It throws exception because of dummy parameters,
115 # We are disabling the logging of exception not to print them to console.
116 mock_logger
= logging
.getLogger()
117 mock_logger
.disabled
= True
118 self
.vimconn
= vimconnector(
131 create_sfc_port_pair
,
133 ingress_ports
=["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
134 egress_ports
=["230cdf1b-de37-4891-bc07-f9010cf1f967"],
136 # input to VIM connector
140 # TODO(igordc): must be changed to NSH in Queens (MPLS is a workaround)
142 if sfc_encap
is not None:
146 # what OpenStack is assumed to respond (patch OpenStack"s return value)
147 dict_from_neutron
= {
149 "id": "3d7ddc13-923c-4332-971e-708ed82902ce",
152 "tenant_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
153 "project_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
154 "ingress": ingress_ports
[0] if len(ingress_ports
) else None,
155 "egress": egress_ports
[0] if len(egress_ports
) else None,
156 "service_function_parameters": {"correlation": correlation
},
159 create_sfc_port_pair
.return_value
= dict_from_neutron
161 # what the VIM connector is expected to
162 # send to OpenStack based on the input
166 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
167 "egress": "230cdf1b-de37-4891-bc07-f9010cf1f967",
168 "service_function_parameters": {"correlation": correlation
},
172 # call the VIM connector
173 if sfc_encap
is None:
174 result
= self
.vimconn
.new_sfi(name
, ingress_ports
, egress_ports
)
176 result
= self
.vimconn
.new_sfi(name
, ingress_ports
, egress_ports
, sfc_encap
)
178 # assert that the VIM connector made the expected call to OpenStack
179 create_sfc_port_pair
.assert_called_with(dict_to_neutron
)
180 # assert that the VIM connector had the expected result / return value
181 self
.assertEqual(result
, dict_from_neutron
["port_pair"]["id"])
183 def _test_new_sf(self
, create_sfc_port_pair_group
):
184 # input to VIM connector
187 "bbd01220-cf72-41f2-9e70-0669c2e5c4cd",
188 "12ba215e-3987-4892-bd3a-d0fd91eecf98",
189 "e25a7c79-14c8-469a-9ae1-f601c9371ffd",
192 # what OpenStack is assumed to respond (patch OpenStack"s return value)
193 dict_from_neutron
= {
195 "id": "3d7ddc13-923c-4332-971e-708ed82902ce",
198 "tenant_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
199 "project_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
200 "port_pairs": instances
,
202 "port_pair_group_parameters": {
204 "ppg_n_tuple_mapping": {
205 "ingress_n_tuple": {},
206 "egress_n_tuple": {},
211 create_sfc_port_pair_group
.return_value
= dict_from_neutron
213 # what the VIM connector is expected to
214 # send to OpenStack based on the input
219 "bbd01220-cf72-41f2-9e70-0669c2e5c4cd",
220 "12ba215e-3987-4892-bd3a-d0fd91eecf98",
221 "e25a7c79-14c8-469a-9ae1-f601c9371ffd",
226 # call the VIM connector
227 result
= self
.vimconn
.new_sf(name
, instances
)
229 # assert that the VIM connector made the expected call to OpenStack
230 create_sfc_port_pair_group
.assert_called_with(dict_to_neutron
)
231 # assert that the VIM connector had the expected result / return value
232 self
.assertEqual(result
, dict_from_neutron
["port_pair_group"]["id"])
234 def _test_new_sfp(self
, create_sfc_port_chain
, sfc_encap
, spi
):
235 # input to VIM connector
238 "2bd2a2e5-c5fd-4eac-a297-d5e255c35c19",
239 "00f23389-bdfa-43c2-8b16-5815f2582fa8",
242 "2314daec-c262-414a-86e3-69bb6fa5bc16",
243 "d8bfdb5d-195e-4f34-81aa-6135705317df",
246 # TODO(igordc): must be changed to NSH in Queens (MPLS is a workaround)
252 # what OpenStack is assumed to respond (patch OpenStack"s return value)
253 dict_from_neutron
= {
255 "id": "5bc05721-079b-4b6e-a235-47cac331cbb6",
258 "tenant_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
259 "project_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
260 "chain_id": chain_id
,
261 "flow_classifiers": classifications
,
262 "port_pair_groups": sfs
,
263 "chain_parameters": {"correlation": correlation
},
266 create_sfc_port_chain
.return_value
= dict_from_neutron
268 # what the VIM connector is expected to
269 # send to OpenStack based on the input
273 "flow_classifiers": [
274 "2bd2a2e5-c5fd-4eac-a297-d5e255c35c19",
275 "00f23389-bdfa-43c2-8b16-5815f2582fa8",
277 "port_pair_groups": [
278 "2314daec-c262-414a-86e3-69bb6fa5bc16",
279 "d8bfdb5d-195e-4f34-81aa-6135705317df",
281 "chain_parameters": {"correlation": correlation
},
285 dict_to_neutron
["port_chain"]["chain_id"] = spi
287 # call the VIM connector
288 if sfc_encap
is None:
289 dict_to_neutron
["port_chain"]["chain_parameters"] = {"correlation": "mpls"}
291 result
= self
.vimconn
.new_sfp(
292 name
, classifications
, sfs
, sfc_encap
=False
295 result
= self
.vimconn
.new_sfp(
296 name
, classifications
, sfs
, sfc_encap
=False, spi
=spi
300 result
= self
.vimconn
.new_sfp(name
, classifications
, sfs
, sfc_encap
)
302 result
= self
.vimconn
.new_sfp(
303 name
, classifications
, sfs
, sfc_encap
, spi
306 # assert that the VIM connector made the expected call to OpenStack
307 create_sfc_port_chain
.assert_called_with(dict_to_neutron
)
308 # assert that the VIM connector had the expected result / return value
309 self
.assertEqual(result
, dict_from_neutron
["port_chain"]["id"])
311 def _test_new_classification(self
, create_sfc_flow_classifier
, ctype
):
312 # input to VIM connector
313 name
= "osm_classification"
316 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
318 "source_ip_prefix": "192.168.2.0/24",
319 "source_port_range_max": 99,
320 "source_port_range_min": 50,
323 # what OpenStack is assumed to respond (patch OpenStack"s return value)
324 dict_from_neutron
= {"flow_classifier": copy
.copy(definition
)}
325 dict_from_neutron
["flow_classifier"][
327 ] = "7735ec2c-fddf-4130-9712-32ed2ab6a372"
328 dict_from_neutron
["flow_classifier"]["name"] = name
329 dict_from_neutron
["flow_classifier"]["description"] = ""
330 dict_from_neutron
["flow_classifier"][
332 ] = "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c"
333 dict_from_neutron
["flow_classifier"][
335 ] = "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c"
336 create_sfc_flow_classifier
.return_value
= dict_from_neutron
338 # what the VIM connector is expected to
339 # send to OpenStack based on the input
340 dict_to_neutron
= {"flow_classifier": copy
.copy(definition
)}
341 dict_to_neutron
["flow_classifier"]["name"] = "osm_classification"
343 # call the VIM connector
344 result
= self
.vimconn
.new_classification(name
, ctype
, definition
)
346 # assert that the VIM connector made the expected call to OpenStack
347 create_sfc_flow_classifier
.assert_called_with(dict_to_neutron
)
348 # assert that the VIM connector had the expected result / return value
349 self
.assertEqual(result
, dict_from_neutron
["flow_classifier"]["id"])
351 @mock.patch
.object(Client
, "create_sfc_flow_classifier")
352 def test_new_classification(self
, create_sfc_flow_classifier
):
353 self
._test
_new
_classification
(
354 create_sfc_flow_classifier
, "legacy_flow_classifier"
357 @mock.patch
.object(Client
, "create_sfc_flow_classifier")
358 def test_new_classification_unsupported_type(self
, create_sfc_flow_classifier
):
360 vimconn
.VimConnNotSupportedException
,
361 self
._test
_new
_classification
,
362 create_sfc_flow_classifier
,
366 @mock.patch
.object(Client
, "create_sfc_port_pair")
367 def test_new_sfi_with_sfc_encap(self
, create_sfc_port_pair
):
368 self
._test
_new
_sfi
(create_sfc_port_pair
, True)
370 @mock.patch
.object(Client
, "create_sfc_port_pair")
371 def test_new_sfi_without_sfc_encap(self
, create_sfc_port_pair
):
372 self
._test
_new
_sfi
(create_sfc_port_pair
, False)
374 @mock.patch
.object(Client
, "create_sfc_port_pair")
375 def test_new_sfi_default_sfc_encap(self
, create_sfc_port_pair
):
376 self
._test
_new
_sfi
(create_sfc_port_pair
, None)
378 @mock.patch
.object(Client
, "create_sfc_port_pair")
379 def test_new_sfi_bad_ingress_ports(self
, create_sfc_port_pair
):
381 "5311c75d-d718-4369-bbda-cdcc6da60fcc",
382 "a0273f64-82c9-11e7-b08f-6328e53f0fa7",
385 vimconn
.VimConnNotSupportedException
,
387 create_sfc_port_pair
,
389 ingress_ports
=ingress_ports
,
393 vimconn
.VimConnNotSupportedException
,
395 create_sfc_port_pair
,
397 ingress_ports
=ingress_ports
,
400 @mock.patch
.object(Client
, "create_sfc_port_pair")
401 def test_new_sfi_bad_egress_ports(self
, create_sfc_port_pair
):
403 "230cdf1b-de37-4891-bc07-f9010cf1f967",
404 "b41228fe-82c9-11e7-9b44-17504174320b",
407 vimconn
.VimConnNotSupportedException
,
409 create_sfc_port_pair
,
411 egress_ports
=egress_ports
,
415 vimconn
.VimConnNotSupportedException
,
417 create_sfc_port_pair
,
419 egress_ports
=egress_ports
,
422 @mock.patch
.object(vimconnector
, "get_sfi")
423 @mock.patch
.object(Client
, "create_sfc_port_pair_group")
424 def test_new_sf(self
, create_sfc_port_pair_group
, get_sfi
):
425 get_sfi
.return_value
= {"sfc_encap": True}
426 self
._test
_new
_sf
(create_sfc_port_pair_group
)
428 @mock.patch
.object(vimconnector
, "get_sfi")
429 @mock.patch
.object(Client
, "create_sfc_port_pair_group")
430 def test_new_sf_inconsistent_sfc_encap(self
, create_sfc_port_pair_group
, get_sfi
):
431 get_sfi
.return_value
= {"sfc_encap": "nsh"}
433 vimconn
.VimConnNotSupportedException
,
435 create_sfc_port_pair_group
,
438 @mock.patch
.object(Client
, "create_sfc_port_chain")
439 def test_new_sfp_with_sfc_encap(self
, create_sfc_port_chain
):
440 self
._test
_new
_sfp
(create_sfc_port_chain
, True, None)
442 @mock.patch
.object(Client
, "create_sfc_port_chain")
443 def test_new_sfp_without_sfc_encap(self
, create_sfc_port_chain
):
444 self
._test
_new
_sfp
(create_sfc_port_chain
, None, None)
445 self
._test
_new
_sfp
(create_sfc_port_chain
, None, 25)
447 @mock.patch
.object(Client
, "create_sfc_port_chain")
448 def test_new_sfp_default_sfc_encap(self
, create_sfc_port_chain
):
449 self
._test
_new
_sfp
(create_sfc_port_chain
, None, None)
451 @mock.patch
.object(Client
, "create_sfc_port_chain")
452 def test_new_sfp_with_sfc_encap_spi(self
, create_sfc_port_chain
):
453 self
._test
_new
_sfp
(create_sfc_port_chain
, True, 25)
455 @mock.patch
.object(Client
, "create_sfc_port_chain")
456 def test_new_sfp_default_sfc_encap_spi(self
, create_sfc_port_chain
):
457 self
._test
_new
_sfp
(create_sfc_port_chain
, None, 25)
459 @mock.patch
.object(Client
, "list_sfc_flow_classifiers")
460 def test_get_classification_list(self
, list_sfc_flow_classifiers
):
461 # what OpenStack is assumed to return to the VIM connector
462 list_sfc_flow_classifiers
.return_value
= {
463 "flow_classifiers": [
465 "source_port_range_min": 2000,
466 "destination_ip_prefix": "192.168.3.0/24",
471 "source_port_range_max": 2000,
472 "destination_port_range_min": 3000,
473 "source_ip_prefix": "192.168.2.0/24",
474 "logical_destination_port": None,
475 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
476 "destination_port_range_max": None,
477 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
478 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
479 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
485 # call the VIM connector
486 filter_dict
= {"protocol": "tcp", "ethertype": "IPv4"}
487 result
= self
.vimconn
.get_classification_list(filter_dict
.copy())
489 # assert that VIM connector called OpenStack with the expected filter
490 list_sfc_flow_classifiers
.assert_called_with(**filter_dict
)
491 # assert that the VIM connector successfully
492 # translated and returned the OpenStack result
497 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
500 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
501 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
502 "ctype": "legacy_flow_classifier",
504 "source_port_range_min": 2000,
505 "destination_ip_prefix": "192.168.3.0/24",
509 "source_port_range_max": 2000,
510 "destination_port_range_min": 3000,
511 "source_ip_prefix": "192.168.2.0/24",
512 "logical_destination_port": None,
513 "destination_port_range_max": None,
514 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
520 def _test_get_sfi_list(self
, list_port_pair
, correlation
, sfc_encap
):
521 # what OpenStack is assumed to return to the VIM connector
522 list_port_pair
.return_value
= {
525 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
527 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
528 "egress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
529 "service_function_parameters": {"correlation": correlation
},
530 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
531 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
537 # call the VIM connector
538 filter_dict
= {"name": "osm_sfi", "description": ""}
539 result
= self
.vimconn
.get_sfi_list(filter_dict
.copy())
541 # assert that VIM connector called OpenStack with the expected filter
542 list_port_pair
.assert_called_with(**filter_dict
)
543 # assert that the VIM connector successfully
544 # translated and returned the OpenStack result
549 "ingress_ports": ["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
551 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
552 "egress_ports": ["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
553 "sfc_encap": sfc_encap
,
554 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
555 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
561 @mock.patch
.object(Client
, "list_sfc_port_pairs")
562 def test_get_sfi_list_with_sfc_encap(self
, list_sfc_port_pairs
):
563 self
._test
_get
_sfi
_list
(list_sfc_port_pairs
, "nsh", True)
565 @mock.patch
.object(Client
, "list_sfc_port_pairs")
566 def test_get_sfi_list_without_sfc_encap(self
, list_sfc_port_pairs
):
567 self
._test
_get
_sfi
_list
(list_sfc_port_pairs
, None, False)
569 @mock.patch
.object(Client
, "list_sfc_port_pair_groups")
570 def test_get_sf_list(self
, list_sfc_port_pair_groups
):
571 # what OpenStack is assumed to return to the VIM connector
572 list_sfc_port_pair_groups
.return_value
= {
573 "port_pair_groups": [
576 "08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2",
577 "0d63799c-82d6-11e7-8deb-a746bb3ae9f5",
580 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
581 "port_pair_group_parameters": {},
582 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
583 "id": "f4a0bde8-82d5-11e7-90e1-a72b762fa27f",
589 # call the VIM connector
590 filter_dict
= {"name": "osm_sf", "description": ""}
591 result
= self
.vimconn
.get_sf_list(filter_dict
.copy())
593 # assert that VIM connector called OpenStack with the expected filter
594 list_sfc_port_pair_groups
.assert_called_with(**filter_dict
)
595 # assert that the VIM connector successfully
596 # translated and returned the OpenStack result
602 "08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2",
603 "0d63799c-82d6-11e7-8deb-a746bb3ae9f5",
606 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
607 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
608 "id": "f4a0bde8-82d5-11e7-90e1-a72b762fa27f",
614 def _test_get_sfp_list(self
, list_sfc_port_chains
, correlation
, sfc_encap
):
615 # what OpenStack is assumed to return to the VIM connector
616 list_sfc_port_chains
.return_value
= {
619 "port_pair_groups": [
620 "7d8e3bf8-82d6-11e7-a032-8ff028839d25",
621 "7dc9013e-82d6-11e7-a5a6-a3a8d78a5518",
623 "flow_classifiers": [
624 "1333c2f4-82d7-11e7-a5df-9327f33d104e",
625 "1387ab44-82d7-11e7-9bb0-476337183905",
628 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
629 "chain_parameters": {"correlation": correlation
},
631 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
632 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
638 # call the VIM connector
639 filter_dict
= {"name": "osm_sfp", "description": ""}
640 result
= self
.vimconn
.get_sfp_list(filter_dict
.copy())
642 # assert that VIM connector called OpenStack with the expected filter
643 list_sfc_port_chains
.assert_called_with(**filter_dict
)
644 # assert that the VIM connector successfully
645 # translated and returned the OpenStack result
650 "service_functions": [
651 "7d8e3bf8-82d6-11e7-a032-8ff028839d25",
652 "7dc9013e-82d6-11e7-a5a6-a3a8d78a5518",
655 "1333c2f4-82d7-11e7-a5df-9327f33d104e",
656 "1387ab44-82d7-11e7-9bb0-476337183905",
659 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
660 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
661 "sfc_encap": sfc_encap
,
663 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
669 @mock.patch
.object(Client
, "list_sfc_port_chains")
670 def test_get_sfp_list_with_sfc_encap(self
, list_sfc_port_chains
):
671 self
._test
_get
_sfp
_list
(list_sfc_port_chains
, "nsh", True)
673 @mock.patch
.object(Client
, "list_sfc_port_chains")
674 def test_get_sfp_list_without_sfc_encap(self
, list_sfc_port_chains
):
675 self
._test
_get
_sfp
_list
(list_sfc_port_chains
, None, False)
677 @mock.patch
.object(Client
, "list_sfc_flow_classifiers")
678 def test_get_classification(self
, list_sfc_flow_classifiers
):
679 # what OpenStack is assumed to return to the VIM connector
680 list_sfc_flow_classifiers
.return_value
= {
681 "flow_classifiers": [
683 "source_port_range_min": 2000,
684 "destination_ip_prefix": "192.168.3.0/24",
689 "source_port_range_max": 2000,
690 "destination_port_range_min": 3000,
691 "source_ip_prefix": "192.168.2.0/24",
692 "logical_destination_port": None,
693 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
694 "destination_port_range_max": None,
695 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
696 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
697 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
703 # call the VIM connector
704 result
= self
.vimconn
.get_classification("22198366-d4e8-4d6b-b4d2-637d5d6cbb7d")
706 # assert that VIM connector called OpenStack with the expected filter
707 list_sfc_flow_classifiers
.assert_called_with(
708 id="22198366-d4e8-4d6b-b4d2-637d5d6cbb7d"
710 # assert that VIM connector successfully returned the OpenStack result
714 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
717 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
718 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
719 "ctype": "legacy_flow_classifier",
721 "source_port_range_min": 2000,
722 "destination_ip_prefix": "192.168.3.0/24",
726 "source_port_range_max": 2000,
727 "destination_port_range_min": 3000,
728 "source_ip_prefix": "192.168.2.0/24",
729 "logical_destination_port": None,
730 "destination_port_range_max": None,
731 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
736 @mock.patch
.object(Client
, "list_sfc_flow_classifiers")
737 def test_get_classification_many_results(self
, list_sfc_flow_classifiers
):
738 # what OpenStack is assumed to return to the VIM connector
739 list_sfc_flow_classifiers
.return_value
= {
740 "flow_classifiers": [
742 "source_port_range_min": 2000,
743 "destination_ip_prefix": "192.168.3.0/24",
748 "source_port_range_max": 2000,
749 "destination_port_range_min": 3000,
750 "source_ip_prefix": "192.168.2.0/24",
751 "logical_destination_port": None,
752 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
753 "destination_port_range_max": None,
754 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
755 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
756 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
760 "source_port_range_min": 1000,
761 "destination_ip_prefix": "192.168.3.0/24",
766 "source_port_range_max": 1000,
767 "destination_port_range_min": 3000,
768 "source_ip_prefix": "192.168.2.0/24",
769 "logical_destination_port": None,
770 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
771 "destination_port_range_max": None,
772 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
773 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
774 "id": "3196bafc-82dd-11e7-a205-9bf6c14b0721",
780 # call the VIM connector
782 vimconn
.VimConnConflictException
,
783 self
.vimconn
.get_classification
,
784 "3196bafc-82dd-11e7-a205-9bf6c14b0721",
787 # assert the VIM connector called OpenStack with the expected filter
788 list_sfc_flow_classifiers
.assert_called_with(
789 id="3196bafc-82dd-11e7-a205-9bf6c14b0721"
792 @mock.patch
.object(Client
, "list_sfc_flow_classifiers")
793 def test_get_classification_no_results(self
, list_sfc_flow_classifiers
):
794 # what OpenStack is assumed to return to the VIM connector
795 list_sfc_flow_classifiers
.return_value
= {"flow_classifiers": []}
797 # call the VIM connector
799 vimconn
.VimConnNotFoundException
,
800 self
.vimconn
.get_classification
,
801 "3196bafc-82dd-11e7-a205-9bf6c14b0721",
804 # assert the VIM connector called OpenStack with the expected filter
805 list_sfc_flow_classifiers
.assert_called_with(
806 id="3196bafc-82dd-11e7-a205-9bf6c14b0721"
809 @mock.patch
.object(Client
, "list_sfc_port_pairs")
810 def test_get_sfi(self
, list_sfc_port_pairs
):
811 # what OpenStack is assumed to return to the VIM connector
812 list_sfc_port_pairs
.return_value
= {
815 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
817 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
818 "egress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
819 "service_function_parameters": {"correlation": "nsh"},
820 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
821 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
827 # call the VIM connector
828 result
= self
.vimconn
.get_sfi("c121ebdd-7f2d-4213-b933-3325298a6966")
830 # assert the VIM connector called OpenStack with the expected filter
831 list_sfc_port_pairs
.assert_called_with(
832 id="c121ebdd-7f2d-4213-b933-3325298a6966"
834 # assert the VIM connector successfully returned the OpenStack result
838 "ingress_ports": ["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
839 "egress_ports": ["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
842 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
843 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
844 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
849 @mock.patch
.object(Client
, "list_sfc_port_pairs")
850 def test_get_sfi_many_results(self
, list_sfc_port_pairs
):
851 # what OpenStack is assumed to return to the VIM connector
852 list_sfc_port_pairs
.return_value
= {
855 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
857 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
858 "egress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
859 "service_function_parameters": {"correlation": "nsh"},
860 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
861 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
865 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
867 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
868 "egress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
869 "service_function_parameters": {"correlation": "nsh"},
870 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
871 "id": "c0436d92-82db-11e7-8f9c-5fa535f1261f",
877 # call the VIM connector
879 vimconn
.VimConnConflictException
,
880 self
.vimconn
.get_sfi
,
881 "c0436d92-82db-11e7-8f9c-5fa535f1261f",
884 # assert that VIM connector called OpenStack with the expected filter
885 list_sfc_port_pairs
.assert_called_with(
886 id="c0436d92-82db-11e7-8f9c-5fa535f1261f"
889 @mock.patch
.object(Client
, "list_sfc_port_pairs")
890 def test_get_sfi_no_results(self
, list_sfc_port_pairs
):
891 # what OpenStack is assumed to return to the VIM connector
892 list_sfc_port_pairs
.return_value
= {"port_pairs": []}
894 # call the VIM connector
896 vimconn
.VimConnNotFoundException
,
897 self
.vimconn
.get_sfi
,
898 "b22892fc-82d9-11e7-ae85-0fea6a3b3757",
901 # assert that VIM connector called OpenStack with the expected filter
902 list_sfc_port_pairs
.assert_called_with(
903 id="b22892fc-82d9-11e7-ae85-0fea6a3b3757"
906 @mock.patch
.object(Client
, "list_sfc_port_pair_groups")
907 def test_get_sf(self
, list_sfc_port_pair_groups
):
908 # what OpenStack is assumed to return to the VIM connector
909 list_sfc_port_pair_groups
.return_value
= {
910 "port_pair_groups": [
912 "port_pairs": ["08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2"],
914 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
915 "port_pair_group_parameters": {},
916 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
917 "id": "aabba8a6-82d9-11e7-a18a-d3c7719b742d",
923 # call the VIM connector
924 result
= self
.vimconn
.get_sf("b22892fc-82d9-11e7-ae85-0fea6a3b3757")
926 # assert that VIM connector called OpenStack with the expected filter
927 list_sfc_port_pair_groups
.assert_called_with(
928 id="b22892fc-82d9-11e7-ae85-0fea6a3b3757"
930 # assert that VIM connector successfully returned the OpenStack result
935 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
936 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
937 "sfis": ["08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2"],
938 "id": "aabba8a6-82d9-11e7-a18a-d3c7719b742d",
943 @mock.patch
.object(Client
, "list_sfc_port_pair_groups")
944 def test_get_sf_many_results(self
, list_sfc_port_pair_groups
):
945 # what OpenStack is assumed to return to the VIM connector
946 list_sfc_port_pair_groups
.return_value
= {
947 "port_pair_groups": [
949 "port_pairs": ["08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2"],
951 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
952 "port_pair_group_parameters": {},
953 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
954 "id": "aabba8a6-82d9-11e7-a18a-d3c7719b742d",
958 "port_pairs": ["0d63799c-82d6-11e7-8deb-a746bb3ae9f5"],
960 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
961 "port_pair_group_parameters": {},
962 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
963 "id": "b22892fc-82d9-11e7-ae85-0fea6a3b3757",
969 # call the VIM connector
971 vimconn
.VimConnConflictException
,
973 "b22892fc-82d9-11e7-ae85-0fea6a3b3757",
976 # assert that VIM connector called OpenStack with the expected filter
977 list_sfc_port_pair_groups
.assert_called_with(
978 id="b22892fc-82d9-11e7-ae85-0fea6a3b3757"
981 @mock.patch
.object(Client
, "list_sfc_port_pair_groups")
982 def test_get_sf_no_results(self
, list_sfc_port_pair_groups
):
983 # what OpenStack is assumed to return to the VIM connector
984 list_sfc_port_pair_groups
.return_value
= {"port_pair_groups": []}
986 # call the VIM connector
988 vimconn
.VimConnNotFoundException
,
990 "b22892fc-82d9-11e7-ae85-0fea6a3b3757",
993 # assert that VIM connector called OpenStack with the expected filter
994 list_sfc_port_pair_groups
.assert_called_with(
995 id="b22892fc-82d9-11e7-ae85-0fea6a3b3757"
998 @mock.patch
.object(Client
, "list_sfc_port_chains")
999 def test_get_sfp(self
, list_sfc_port_chains
):
1000 # what OpenStack is assumed to return to the VIM connector
1001 list_sfc_port_chains
.return_value
= {
1004 "port_pair_groups": ["7d8e3bf8-82d6-11e7-a032-8ff028839d25"],
1005 "flow_classifiers": ["1333c2f4-82d7-11e7-a5df-9327f33d104e"],
1007 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1008 "chain_parameters": {"correlation": "nsh"},
1010 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1011 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
1017 # call the VIM connector
1018 result
= self
.vimconn
.get_sfp("821bc9be-82d7-11e7-8ce3-23a08a27ab47")
1020 # assert that VIM connector called OpenStack with the expected filter
1021 list_sfc_port_chains
.assert_called_with(
1022 id="821bc9be-82d7-11e7-8ce3-23a08a27ab47"
1024 # assert that VIM connector successfully returned the OpenStack result
1028 "service_functions": ["7d8e3bf8-82d6-11e7-a032-8ff028839d25"],
1029 "classifications": ["1333c2f4-82d7-11e7-a5df-9327f33d104e"],
1031 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1032 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1035 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
1040 @mock.patch
.object(Client
, "list_sfc_port_chains")
1041 def test_get_sfp_many_results(self
, list_sfc_port_chains
):
1042 # what OpenStack is assumed to return to the VIM connector
1043 list_sfc_port_chains
.return_value
= {
1046 "port_pair_groups": ["7d8e3bf8-82d6-11e7-a032-8ff028839d25"],
1047 "flow_classifiers": ["1333c2f4-82d7-11e7-a5df-9327f33d104e"],
1049 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1050 "chain_parameters": {"correlation": "nsh"},
1052 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1053 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
1057 "port_pair_groups": ["7d8e3bf8-82d6-11e7-a032-8ff028839d25"],
1058 "flow_classifiers": ["1333c2f4-82d7-11e7-a5df-9327f33d104e"],
1060 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1061 "chain_parameters": {"correlation": "nsh"},
1063 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1064 "id": "5d002f38-82de-11e7-a770-f303f11ce66a",
1070 # call the VIM connector
1072 vimconn
.VimConnConflictException
,
1073 self
.vimconn
.get_sfp
,
1074 "5d002f38-82de-11e7-a770-f303f11ce66a",
1077 # assert that VIM connector called OpenStack with the expected filter
1078 list_sfc_port_chains
.assert_called_with(
1079 id="5d002f38-82de-11e7-a770-f303f11ce66a"
1082 @mock.patch
.object(Client
, "list_sfc_port_chains")
1083 def test_get_sfp_no_results(self
, list_sfc_port_chains
):
1084 # what OpenStack is assumed to return to the VIM connector
1085 list_sfc_port_chains
.return_value
= {"port_chains": []}
1087 # call the VIM connector
1089 vimconn
.VimConnNotFoundException
,
1090 self
.vimconn
.get_sfp
,
1091 "5d002f38-82de-11e7-a770-f303f11ce66a",
1094 # assert that VIM connector called OpenStack with the expected filter
1095 list_sfc_port_chains
.assert_called_with(
1096 id="5d002f38-82de-11e7-a770-f303f11ce66a"
1099 @mock.patch
.object(Client
, "delete_sfc_flow_classifier")
1100 def test_delete_classification(self
, delete_sfc_flow_classifier
):
1101 result
= self
.vimconn
.delete_classification(
1102 "638f957c-82df-11e7-b7c8-132706021464"
1104 delete_sfc_flow_classifier
.assert_called_with(
1105 "638f957c-82df-11e7-b7c8-132706021464"
1107 self
.assertEqual(result
, "638f957c-82df-11e7-b7c8-132706021464")
1109 @mock.patch
.object(Client
, "delete_sfc_port_pair")
1110 def test_delete_sfi(self
, delete_sfc_port_pair
):
1111 result
= self
.vimconn
.delete_sfi("638f957c-82df-11e7-b7c8-132706021464")
1112 delete_sfc_port_pair
.assert_called_with("638f957c-82df-11e7-b7c8-132706021464")
1113 self
.assertEqual(result
, "638f957c-82df-11e7-b7c8-132706021464")
1115 @mock.patch
.object(Client
, "delete_sfc_port_pair_group")
1116 def test_delete_sf(self
, delete_sfc_port_pair_group
):
1117 result
= self
.vimconn
.delete_sf("638f957c-82df-11e7-b7c8-132706021464")
1118 delete_sfc_port_pair_group
.assert_called_with(
1119 "638f957c-82df-11e7-b7c8-132706021464"
1121 self
.assertEqual(result
, "638f957c-82df-11e7-b7c8-132706021464")
1123 @mock.patch
.object(Client
, "delete_sfc_port_chain")
1124 def test_delete_sfp(self
, delete_sfc_port_chain
):
1125 result
= self
.vimconn
.delete_sfp("638f957c-82df-11e7-b7c8-132706021464")
1126 delete_sfc_port_chain
.assert_called_with("638f957c-82df-11e7-b7c8-132706021464")
1127 self
.assertEqual(result
, "638f957c-82df-11e7-b7c8-132706021464")
1130 def check_if_assert_not_called(mocks
: list):
1131 for mocking
in mocks
:
1132 mocking
.assert_not_called()
1136 def __init__(self
, s
):
1143 class CopyingMock(MagicMock
):
1144 def __call__(self
, *args
, **kwargs
):
1145 args
= deepcopy(args
)
1146 kwargs
= deepcopy(kwargs
)
1147 return super(CopyingMock
, self
).__call
__(*args
, **kwargs
)
1150 class TestNewVmInstance(unittest
.TestCase
):
1151 @patch("logging.getLogger", autospec
=True)
1152 def setUp(self
, mock_logger
):
1153 # Instantiate dummy VIM connector so we can test it
1154 # It throws exception because of dummy parameters,
1155 # We are disabling the logging of exception not to print them to console.
1156 mock_logger
= logging
.getLogger()
1157 mock_logger
.disabled
= True
1158 self
.vimconn
= vimconnector(
1168 self
.vimconn
.neutron
= CopyingMock()
1169 self
.vimconn
.nova
= CopyingMock()
1170 self
.vimconn
.cinder
= CopyingMock()
1171 self
.server
= MagicMock(object, autospec
=True)
1172 self
.server
.tenant_id
= "408b73-r9cc-5a6a-a270-82cc4811bd4a"
1173 self
.server
.id = "908b73-e9cc-5a6a-t270-82cc4811bd4a"
1174 self
.vimconn
.config
["security_groups"] = "default"
1175 self
.vimconn
.config
["keypair"] = "my_keypair"
1176 self
.vimconn
.security_groups_id
= "12345"
1177 self
.vimconn
.nova
.api_version
.get_string
.return_value
= "2.32"
1178 self
.vimconn
.logger
= CopyingMock()
1180 @patch.object(vimconnector
, "_get_ids_from_name")
1181 def test_prepare_port_dict_security_security_groups_exists_in_config(
1184 """In VIM config security_groups exists, net port_security is True
1185 no_port_security_extension does not exist.
1187 self
.vimconn
.config
= {"security_groups": "example_security_group"}
1188 net
= {"port_security": True}
1190 result_dict
= {"security_groups": "12345"}
1192 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1193 self
.assertDictEqual(result_dict
, port_dict
)
1194 mock_get_ids
.assert_not_called()
1196 @patch.object(vimconnector
, "_get_ids_from_name")
1197 def test_prepare_port_dict_security_security_groups_exists_in_config_no_security_groups_id(
1200 """In VIM config Security_groups exists, net port_security is True, vim security_groups_id does not exist,
1201 no_port_security_extension does not exist.
1203 self
.vimconn
.config
= {"security_groups": "example_security_group"}
1204 self
.vimconn
.security_groups_id
= None
1205 net
= {"port_security": True}
1207 result_dict
= {"security_groups": None}
1209 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1210 self
.assertDictEqual(result_dict
, port_dict
)
1211 mock_get_ids
.assert_called()
1213 @patch.object(vimconnector
, "_get_ids_from_name")
1214 def test_prepare_port_dict_security_security_groups_exists_security_extension_true_in_config(
1217 """In VIM config security_groups exists, net port_security is True, in VIM security_groups_id exists,
1218 no_port_security_extension set to True.
1220 self
.vimconn
.config
= {
1221 "security_groups": "example_security_group",
1222 "no_port_security_extension": True,
1224 net
= {"port_security": True}
1228 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1229 self
.assertDictEqual(result_dict
, port_dict
)
1230 mock_get_ids
.assert_not_called()
1232 @patch.object(vimconnector
, "_get_ids_from_name")
1233 def test_prepare_port_dict_security_no_security_groups_in_config(
1236 """In VIM config security_group does not exist, net port_security True, in VIM security_groups_id exists,
1237 no_port_security_extension does not exist."""
1238 self
.vimconn
.config
= {}
1239 net
= {"port_security": True}
1243 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1244 self
.assertDictEqual(result_dict
, port_dict
)
1245 mock_get_ids
.assert_not_called()
1247 @patch.object(vimconnector
, "_get_ids_from_name")
1248 def test_prepare_port_dict_security_no_security_groups_security_extension_true_in_config(
1251 """Security_group does not exist, net port_security is True, in VIM security_groups_id exists,
1252 no_port_security_extension set to True."""
1253 self
.vimconn
.config
= {"no_port_security_extension": True}
1254 net
= {"port_security": True}
1258 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1259 self
.assertDictEqual(result_dict
, port_dict
)
1260 mock_get_ids
.assert_not_called()
1262 @patch.object(vimconnector
, "_get_ids_from_name")
1263 def test_prepare_port_dict_security_security_groups_exists_net_port_security_false(
1266 """In VIM config security_group exists, net port_security False, security_groups_id exists,
1267 no_port_security_extension does not exist."""
1268 self
.vimconn
.config
= {"security_groups": "example_security_group"}
1269 net
= {"port_security": False}
1273 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1274 self
.assertDictEqual(result_dict
, port_dict
)
1275 mock_get_ids
.assert_not_called()
1277 @patch.object(vimconnector
, "_get_ids_from_name")
1278 def test_prepare_port_dict_security_net_port_security_false_port_security_extension_true(
1281 """In VIM config security_group exists, net port_security False, security_groups_id exists,
1282 no_port_security_extension set to True."""
1283 self
.vimconn
.config
= {
1284 "security_groups": "example_security_group",
1285 "no_port_security_extension": True,
1287 net
= {"port_security": False}
1291 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1292 self
.assertDictEqual(result_dict
, port_dict
)
1293 mock_get_ids
.assert_not_called()
1295 def test_prepare_port_dict_binding_net_type_virtual(self
):
1296 """net type is virtual."""
1297 net
= {"type": "virtual"}
1300 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1301 self
.assertDictEqual(result_dict
, port_dict
)
1303 def test_prepare_port_dict_binding_net_type_vf(self
):
1304 """net type is VF, vim_type is not VIO."""
1305 net
= {"type": "VF"}
1306 self
.vimconn
.vim_type
= None
1308 result_dict
= {"binding:vnic_type": "direct"}
1309 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1310 self
.assertDictEqual(port_dict
, result_dict
)
1312 def test_prepare_port_dict_binding_net_type_sriov_vim_type_vio(self
):
1313 """net type is SR-IOV, vim_type is VIO."""
1314 net
= {"type": "SR-IOV"}
1315 self
.vimconn
.vim_type
= "VIO"
1318 "binding:vnic_type": "direct",
1319 "port_security_enabled": False,
1320 "provider_security_groups": [],
1321 "security_groups": [],
1323 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1324 self
.assertDictEqual(port_dict
, result_dict
)
1326 def test_prepare_port_dict_binding_net_type_passthrough(self
):
1327 """net type is pci-passthrough."""
1328 net
= {"type": "PCI-PASSTHROUGH"}
1331 "binding:vnic_type": "direct-physical",
1333 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1334 self
.assertDictEqual(port_dict
, result_dict
)
1336 def test_prepare_port_dict_binding_no_net_type(self
):
1337 """net type is missing."""
1340 with self
.assertRaises(VimConnException
) as err
:
1341 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1342 self
.assertEqual(str(err
.exception
), "Type is missing in the network details.")
1344 def test_set_fixed_ip(self
):
1345 """new_port has fixed ip."""
1349 "fixed_ips": [{"ip_address": "10.1.2.3"}, {"ip_address": "20.1.2.3"}]
1352 result
= {"ip": "10.1.2.3"}
1353 self
.vimconn
._set
_fixed
_ip
(new_port
, net
)
1354 self
.assertDictEqual(net
, result
)
1356 def test_set_fixed_ip_no_fixed_ip(self
):
1357 """new_port does not have fixed ip."""
1359 new_port
= {"port": {}}
1360 result
= {"ip": None}
1361 self
.vimconn
._set
_fixed
_ip
(new_port
, net
)
1362 self
.assertDictEqual(net
, result
)
1364 def test_set_fixed_ip_raise_exception(self
):
1365 """new_port does not have port details."""
1368 with self
.assertRaises(Exception) as err
:
1369 self
.vimconn
._set
_fixed
_ip
(new_port
, net
)
1370 self
.assertEqual(type(err
.exception
), KeyError)
1372 def test_prepare_port_dict_mac_ip_addr(self
):
1373 """mac address and ip address exist."""
1375 "mac_address": mac_address
,
1376 "ip_address": "10.0.1.5",
1380 "mac_address": mac_address
,
1381 "fixed_ips": [{"ip_address": "10.0.1.5"}],
1383 self
.vimconn
._prepare
_port
_dict
_mac
_ip
_addr
(net
, port_dict
)
1384 self
.assertDictEqual(port_dict
, result_dict
)
1386 def test_prepare_port_dict_mac_ip_addr_no_mac_and_ip(self
):
1387 """mac address and ip address does not exist."""
1391 self
.vimconn
._prepare
_port
_dict
_mac
_ip
_addr
(net
, port_dict
)
1392 self
.assertDictEqual(port_dict
, result_dict
)
1394 def test_create_new_port(self
):
1395 """new port has id and mac address."""
1399 "mac_address": mac_address
,
1402 self
.vimconn
.neutron
.create_port
.return_value
= new_port
1403 net
, port_dict
, created_items
= {}, {}, {}
1404 expected_result
= new_port
1406 "mac_adress": mac_address
,
1409 expected_created_items
= {f
"port:{port_id}": True}
1410 result
= self
.vimconn
._create
_new
_port
(port_dict
, created_items
, net
)
1411 self
.assertDictEqual(result
, expected_result
)
1412 self
.assertEqual(net
, expected_net
)
1413 self
.assertEqual(created_items
, expected_created_items
)
1414 self
.vimconn
.neutron
.create_port
.assert_called_once_with({"port": port_dict
})
1416 def test_create_new_port_without_mac_or_id(self
):
1417 """new port does not have mac address or ID."""
1419 self
.vimconn
.neutron
.create_port
.return_value
= new_port
1420 net
, port_dict
, created_items
= {}, {}, {}
1421 with self
.assertRaises(KeyError):
1422 self
.vimconn
._create
_new
_port
(port_dict
, created_items
, net
)
1423 self
.vimconn
.neutron
.create_port
.assert_called_once_with({"port": port_dict
})
1425 def test_create_new_port_neutron_create_port_raises_exception(self
):
1426 """Neutron create port raises exception."""
1427 self
.vimconn
.neutron
.create_port
.side_effect
= VimConnException(
1428 "New port is not created."
1430 net
, port_dict
, created_items
= {}, {}, {}
1431 with self
.assertRaises(VimConnException
):
1432 self
.vimconn
._create
_new
_port
(port_dict
, created_items
, net
)
1433 self
.vimconn
.neutron
.create_port
.assert_called_once_with({"port": port_dict
})
1435 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1436 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1437 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1438 @patch.object(vimconnector
, "_create_new_port")
1439 @patch.object(vimconnector
, "_set_fixed_ip")
1440 def test_create_port(
1443 mock_create_new_port
,
1444 mock_prepare_port_dict_mac_ip_addr
,
1445 mock_prepare_port_dict_binding
,
1446 mock_prepare_port_dict_security_groups
,
1448 """Net has name, type, net-id."""
1452 "name": "management",
1459 "mac_address": mac_address
,
1460 "name": "management",
1461 "fixed_ips": [{"ip_address": ip_addr1
}],
1464 mock_create_new_port
.return_value
= new_port
1467 "tag": "management",
1470 "network_id": net_id
,
1471 "name": "management",
1472 "admin_state_up": True,
1475 new_port_result
, port_result
= self
.vimconn
._create
_port
(
1476 net
, name
, created_items
1479 self
.assertDictEqual(new_port_result
, new_port
)
1480 self
.assertDictEqual(port_result
, expected_port
)
1482 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1483 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1484 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1485 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1486 mock_set_fixed_ip
.assert_called_once_with(new_port
, net
)
1488 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1489 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1490 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1491 @patch.object(vimconnector
, "_create_new_port")
1492 @patch.object(vimconnector
, "_set_fixed_ip")
1493 def test_create_port_no_port_name(
1496 mock_create_new_port
,
1497 mock_prepare_port_dict_mac_ip_addr
,
1498 mock_prepare_port_dict_binding
,
1499 mock_prepare_port_dict_security_groups
,
1501 """Net has no name."""
1510 "mac_address": mac_address
,
1512 "fixed_ips": [{"ip_address": ip_addr1
}],
1515 mock_create_new_port
.return_value
= new_port
1521 "network_id": net_id
,
1522 "admin_state_up": True,
1526 new_port_result
, port_result
= self
.vimconn
._create
_port
(
1527 net
, name
, created_items
1530 self
.assertDictEqual(new_port_result
, new_port
)
1531 self
.assertDictEqual(port_result
, expected_port
)
1533 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1534 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1535 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1536 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1537 mock_set_fixed_ip
.assert_called_once_with(new_port
, net
)
1539 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1540 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1541 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1542 @patch.object(vimconnector
, "_create_new_port")
1543 @patch.object(vimconnector
, "_set_fixed_ip")
1544 def test_create_port_nova_api_version_smaller_than_232(
1547 mock_create_new_port
,
1548 mock_prepare_port_dict_mac_ip_addr
,
1549 mock_prepare_port_dict_binding
,
1550 mock_prepare_port_dict_security_groups
,
1552 """Nova api version is smaller than 2.32."""
1553 self
.vimconn
.nova
.api_version
.get_string
.return_value
= "2.30"
1562 "mac_address": mac_address
,
1564 "fixed_ips": [{"ip_address": ip_addr1
}],
1567 mock_create_new_port
.return_value
= new_port
1572 "network_id": net_id
,
1573 "admin_state_up": True,
1577 new_port_result
, port_result
= self
.vimconn
._create
_port
(
1578 net
, name
, created_items
1581 self
.assertDictEqual(new_port_result
, new_port
)
1582 self
.assertDictEqual(port_result
, expected_port
)
1584 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1585 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1586 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1587 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1588 mock_set_fixed_ip
.assert_called_once_with(new_port
, net
)
1590 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1591 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1592 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1593 @patch.object(vimconnector
, "_create_new_port")
1594 @patch.object(vimconnector
, "_set_fixed_ip")
1595 def test_create_port_create_new_port_raise_exception(
1598 mock_create_new_port
,
1599 mock_prepare_port_dict_mac_ip_addr
,
1600 mock_prepare_port_dict_binding
,
1601 mock_prepare_port_dict_security_groups
,
1603 """_create_new_port method raises exception."""
1609 mock_create_new_port
.side_effect
= Exception
1611 "network_id": net_id
,
1612 "admin_state_up": True,
1616 with self
.assertRaises(Exception):
1617 self
.vimconn
._create
_port
(net
, name
, created_items
)
1619 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1620 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1621 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1622 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1623 mock_set_fixed_ip
.assert_not_called()
1625 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1626 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1627 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1628 @patch.object(vimconnector
, "_create_new_port")
1629 @patch.object(vimconnector
, "_set_fixed_ip")
1630 def test_create_port_create_sec_groups_raises_exception(
1633 mock_create_new_port
,
1634 mock_prepare_port_dict_mac_ip_addr
,
1635 mock_prepare_port_dict_binding
,
1636 mock_prepare_port_dict_security_groups
,
1638 """_prepare_port_dict_security_groups method raises exception."""
1644 mock_prepare_port_dict_security_groups
.side_effect
= Exception
1646 "network_id": net_id
,
1647 "admin_state_up": True,
1651 with self
.assertRaises(Exception):
1652 self
.vimconn
._create
_port
(net
, name
, created_items
)
1654 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1656 mock_prepare_port_dict_binding
.assert_not_called()
1657 mock_prepare_port_dict_mac_ip_addr
.assert_not_called()
1658 mock_create_new_port
.assert_not_called()
1659 mock_set_fixed_ip
.assert_not_called()
1661 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1662 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1663 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1664 @patch.object(vimconnector
, "_create_new_port")
1665 @patch.object(vimconnector
, "_set_fixed_ip")
1666 def test_create_port_create_port_dict_binding_raise_exception(
1669 mock_create_new_port
,
1670 mock_prepare_port_dict_mac_ip_addr
,
1671 mock_prepare_port_dict_binding
,
1672 mock_prepare_port_dict_security_groups
,
1674 """_prepare_port_dict_binding method raises exception."""
1681 mock_prepare_port_dict_binding
.side_effect
= Exception
1683 "network_id": net_id
,
1684 "admin_state_up": True,
1688 with self
.assertRaises(Exception):
1689 self
.vimconn
._create
_port
(net
, name
, created_items
)
1691 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1693 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1695 mock_prepare_port_dict_mac_ip_addr
.assert_not_called()
1696 mock_create_new_port
.assert_not_called()
1697 mock_set_fixed_ip
.assert_not_called()
1699 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1700 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1701 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1702 @patch.object(vimconnector
, "_create_new_port")
1703 @patch.object(vimconnector
, "_set_fixed_ip")
1704 def test_create_port_create_port_mac_ip_addr_raise_exception(
1707 mock_create_new_port
,
1708 mock_prepare_port_dict_mac_ip_addr
,
1709 mock_prepare_port_dict_binding
,
1710 mock_prepare_port_dict_security_groups
,
1712 """prepare_port_dict_mac_ip_addr method raises exception."""
1718 mock_prepare_port_dict_mac_ip_addr
.side_effect
= Exception
1720 "network_id": net_id
,
1721 "admin_state_up": True,
1725 with self
.assertRaises(Exception):
1726 self
.vimconn
._create
_port
(net
, name
, created_items
)
1728 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1729 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1730 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1732 mock_create_new_port
.assert_not_called()
1733 mock_set_fixed_ip
.assert_not_called()
1735 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1736 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1737 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1738 @patch.object(vimconnector
, "_create_new_port")
1739 @patch.object(vimconnector
, "_set_fixed_ip")
1740 def test_create_port_create_port_set_fixed_ip_raise_exception(
1743 mock_create_new_port
,
1744 mock_prepare_port_dict_mac_ip_addr
,
1745 mock_prepare_port_dict_binding
,
1746 mock_prepare_port_dict_security_groups
,
1748 """_set_fixed_ip method raises exception."""
1754 mock_set_fixed_ip
.side_effect
= VimConnException(
1755 "Port detail is missing in new_port."
1758 "network_id": net_id
,
1759 "admin_state_up": True,
1765 "mac_address": mac_address
,
1767 "fixed_ips": [{"ip_address": ip_addr1
}],
1770 mock_create_new_port
.return_value
= new_port
1772 with self
.assertRaises(VimConnException
):
1773 self
.vimconn
._create
_port
(net
, name
, created_items
)
1775 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1776 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1777 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1778 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1779 mock_set_fixed_ip
.assert_called_once_with(new_port
, net
)
1781 @patch.object(vimconnector
, "_reload_connection")
1782 @patch.object(vimconnector
, "_create_port")
1783 def test_prepare_network_for_vm_instance_no_net_id(
1784 self
, mock_create_port
, mock_reload_connection
1786 """Nets do not have net_id"""
1787 mock_reload_connection
.side_effect
= None
1792 "port_security": False,
1793 "exit_on_floating_ip_error": False,
1794 "port_security_disable_strategy": "full",
1797 "port_security": True,
1798 "exit_on_floating_ip_error": False,
1799 "floating_ip": True,
1803 external_network
, no_secured_ports
= [], []
1804 expected_external_network
, expected_no_secured_ports
= [], []
1805 expected_net_list_vim
= []
1807 self
.vimconn
._prepare
_network
_for
_vminstance
(
1815 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
1816 self
.assertEqual(external_network
, expected_external_network
)
1817 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
1819 mock_create_port
.assert_not_called()
1821 @patch.object(vimconnector
, "_reload_connection")
1822 @patch.object(vimconnector
, "_create_port")
1823 def test_prepare_network_for_vm_instance_empty_net_list(
1824 self
, mock_create_port
, mock_reload_connection
1826 """Net list is empty."""
1827 mock_reload_connection
.side_effect
= None
1830 external_network
, no_secured_ports
= [], []
1831 expected_external_network
, expected_no_secured_ports
= [], []
1832 expected_net_list_vim
= []
1834 self
.vimconn
._prepare
_network
_for
_vminstance
(
1842 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
1843 self
.assertEqual(external_network
, expected_external_network
)
1844 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
1846 mock_create_port
.assert_not_called()
1848 @patch.object(vimconnector
, "_reload_connection")
1849 @patch.object(vimconnector
, "_create_port")
1850 def test_prepare_network_for_vm_instance_use_floating_ip_false_mgmt_net(
1851 self
, mock_create_port
, mock_reload_connection
1853 """Nets have net-id, floating_ip False, mgmt network."""
1854 mock_reload_connection
.side_effect
= None
1859 "floating_ip": False,
1864 mock_create_port
.side_effect
= [
1869 "mac_address": mac_address
,
1873 {"port-dict": port2_id
},
1876 external_network
, no_secured_ports
= [], []
1877 expected_external_network
, expected_no_secured_ports
= [], []
1878 expected_net_list_vim
= [{"port-dict": port2_id
}]
1879 self
.vimconn
._prepare
_network
_for
_vminstance
(
1887 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
1888 self
.assertEqual(external_network
, expected_external_network
)
1889 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
1891 mock_create_port
.assert_called_once_with(
1894 "floating_ip": False,
1901 @patch.object(vimconnector
, "_reload_connection")
1902 def test_prepare_network_for_vm_instance_mgmt_net_net_port_security_and_floating_ip_true(
1903 self
, mock_reload_connection
1905 """Nets have net-id, use_floating_ip False in VIM config, mgmt network, net floating_ip is True."""
1906 self
.vimconn
.config
["use_floating_ip"] = False
1907 mock_create_port
= CopyingMock()
1908 mock_reload_connection
.side_effect
= None
1913 "floating_ip": True,
1918 mock_create_port
.side_effect
= [
1923 "mac_address": mac_address
,
1927 {"port-dict": port2_id
},
1930 external_network
, no_secured_ports
= [], []
1931 expected_external_network
= [
1934 "floating_ip": True,
1936 "exit_on_floating_ip_error": True,
1939 expected_no_secured_ports
= []
1940 expected_net_list_vim
= [{"port-dict": port2_id
}]
1941 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
1942 self
.vimconn
._prepare
_network
_for
_vminstance
(
1950 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
1951 self
.assertEqual(external_network
, expected_external_network
)
1952 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
1954 mock_create_port
.assert_called_once_with(
1957 "floating_ip": True,
1964 @patch.object(vimconnector
, "_reload_connection")
1965 def test_prepare_network_for_vm_instance_use_floating_ip_true_mgmt_net_port_security_false(
1966 self
, mock_reload_connection
1968 """Nets have net-id, use_floating_ip is True in VIM config, mgmt network, net port security is False."""
1969 mock_create_port
= CopyingMock()
1970 self
.vimconn
.config
["use_floating_ip"] = True
1971 self
.vimconn
.config
["no_port_security_extension"] = False
1972 mock_reload_connection
.side_effect
= None
1979 "port_security": False,
1980 "exit_on_floating_ip_error": False,
1981 "port_security_disable_strategy": "full",
1985 mock_create_port
.side_effect
= [
1990 "mac_address": mac_address
,
1994 {"port-dict": port2_id
},
1997 external_network
, no_secured_ports
= [], []
1998 expected_external_network
= [
2002 "port_security": False,
2003 "exit_on_floating_ip_error": False,
2004 "port_security_disable_strategy": "full",
2005 "floating_ip": True,
2008 expected_no_secured_ports
= [(port2_id
, "full")]
2009 expected_net_list_vim
= [{"port-dict": port2_id
}]
2010 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2011 self
.vimconn
._prepare
_network
_for
_vminstance
(
2020 mock_create_port
.assert_called_once_with(
2024 "port_security": False,
2025 "exit_on_floating_ip_error": False,
2026 "port_security_disable_strategy": "full",
2031 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2032 self
.assertEqual(external_network
, expected_external_network
)
2033 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2035 @patch.object(vimconnector
, "_reload_connection")
2036 def test_prepare_network_for_vm_instance_use_fip_true_non_mgmt_net_port_security_false(
2037 self
, mock_reload_connection
2039 """Nets have net-id, use_floating_ip True in VIM config, non-mgmt network, port security is False."""
2040 mock_create_port
= CopyingMock()
2041 self
.vimconn
.config
["use_floating_ip"] = True
2042 self
.vimconn
.config
["no_port_security_extension"] = False
2043 mock_reload_connection
.side_effect
= None
2050 "port_security": False,
2051 "port_security_disable_strategy": "full",
2055 mock_create_port
.side_effect
= [
2060 "mac_address": mac_address
,
2064 {"port-dict": port2_id
},
2067 external_network
, no_secured_ports
= [], []
2068 expected_external_network
= []
2069 expected_no_secured_ports
= [(port2_id
, "full")]
2070 expected_net_list_vim
= [{"port-dict": port2_id
}]
2071 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2072 self
.vimconn
._prepare
_network
_for
_vminstance
(
2081 mock_create_port
.assert_called_once_with(
2085 "port_security": False,
2086 "port_security_disable_strategy": "full",
2091 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2092 self
.assertEqual(external_network
, expected_external_network
)
2093 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2095 @patch.object(vimconnector
, "_reload_connection")
2096 def test_prepare_network_for_vm_instance_use_fip_true_non_mgmt_net_port_security_true(
2097 self
, mock_reload_connection
2099 """Nets have net-id, use_floating_ip is True in VIM config, non-mgmt network, net port security is True."""
2100 mock_create_port
= CopyingMock()
2101 self
.vimconn
.config
["use_floating_ip"] = True
2102 self
.vimconn
.config
["no_port_security_extension"] = True
2103 mock_reload_connection
.side_effect
= None
2110 "port_security": True,
2111 "port_security_disable_strategy": "full",
2115 mock_create_port
.side_effect
= [
2120 "mac_address": mac_address
,
2124 {"port-dict": port2_id
},
2127 external_network
, no_secured_ports
= [], []
2128 expected_external_network
= []
2129 expected_no_secured_ports
= []
2130 expected_net_list_vim
= [{"port-dict": port2_id
}]
2131 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2132 self
.vimconn
._prepare
_network
_for
_vminstance
(
2141 mock_create_port
.assert_called_once_with(
2145 "port_security": True,
2146 "port_security_disable_strategy": "full",
2151 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2152 self
.assertEqual(external_network
, expected_external_network
)
2153 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2155 @patch.object(vimconnector
, "_reload_connection")
2156 def test_prepare_network_for_vm_instance_create_port_raise_exception(
2157 self
, mock_reload_connection
2159 """_create_port method raise exception."""
2160 mock_create_port
= CopyingMock()
2161 self
.vimconn
.config
["use_floating_ip"] = True
2162 self
.vimconn
.config
["no_port_security_extension"] = True
2163 mock_reload_connection
.side_effect
= None
2170 "port_security": True,
2171 "port_security_disable_strategy": "full",
2175 mock_create_port
.side_effect
= KeyError
2176 external_network
, no_secured_ports
= [], []
2177 expected_external_network
= []
2178 expected_no_secured_ports
= []
2179 expected_net_list_vim
= []
2180 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2181 with self
.assertRaises(Exception) as err
:
2182 self
.vimconn
._prepare
_network
_for
_vminstance
(
2191 self
.assertEqual(type(err
.exception
), KeyError)
2193 mock_create_port
.assert_called_once_with(
2197 "port_security": True,
2198 "port_security_disable_strategy": "full",
2203 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2204 self
.assertEqual(external_network
, expected_external_network
)
2205 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2207 @patch.object(vimconnector
, "_reload_connection")
2208 def test_prepare_network_for_vm_instance_reload_connection_raise_exception(
2209 self
, mock_reload_connection
2211 """_reload_connection method raises exception."""
2212 mock_create_port
= CopyingMock()
2213 mock_reload_connection
.side_effect
= VimConnConnectionException(
2214 "Connection failed."
2216 self
.vimconn
.config
["use_floating_ip"] = True
2217 self
.vimconn
.config
["no_port_security_extension"] = True
2224 "port_security": True,
2225 "port_security_disable_strategy": "full",
2229 mock_create_port
.side_effect
= None
2230 external_network
, no_secured_ports
= [], []
2231 expected_external_network
= []
2232 expected_no_secured_ports
= []
2233 expected_net_list_vim
= []
2234 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2235 with self
.assertRaises(Exception) as err
:
2236 self
.vimconn
._prepare
_network
_for
_vminstance
(
2245 self
.assertEqual(type(err
.exception
), VimConnConnectionException
)
2246 self
.assertEqual(str(err
.exception
), "Connection failed.")
2247 mock_reload_connection
.assert_called_once()
2248 mock_create_port
.assert_not_called()
2249 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2250 self
.assertEqual(external_network
, expected_external_network
)
2251 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2253 def test_prepare_persistent_root_volumes_vim_using_volume_id(self
):
2254 """Existing persistent root volume with vim_volume_id."""
2255 vm_av_zone
= ["nova"]
2256 base_disk_index
= ord("a")
2257 disk
= {"vim_volume_id": volume_id
}
2258 block_device_mapping
= {}
2259 existing_vim_volumes
= []
2261 expected_boot_vol_id
= None
2262 expected_block_device_mapping
= {"vda": volume_id
}
2263 expected_existing_vim_volumes
= [{"id": volume_id
}]
2264 boot_volume_id
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2269 block_device_mapping
,
2270 existing_vim_volumes
,
2273 self
.assertEqual(boot_volume_id
, expected_boot_vol_id
)
2274 self
.assertDictEqual(block_device_mapping
, expected_block_device_mapping
)
2275 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2276 self
.vimconn
.cinder
.volumes
.create
.assert_not_called()
2278 @patch.object(vimconnector
, "update_block_device_mapping")
2279 def test_prepare_persistent_non_root_volumes_vim_using_volume_id(
2280 self
, mock_update_block_device_mapping
2282 """Existing persistent non root volume with vim_volume_id."""
2283 vm_av_zone
= ["nova"]
2284 base_disk_index
= ord("b")
2285 disk
= {"vim_volume_id": volume_id
}
2286 block_device_mapping
= {}
2287 existing_vim_volumes
= []
2289 expected_block_device_mapping
= {"vdb": volume_id
}
2290 expected_existing_vim_volumes
= [{"id": volume_id
}]
2291 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2295 block_device_mapping
,
2297 existing_vim_volumes
,
2300 self
.assertDictEqual(block_device_mapping
, expected_block_device_mapping
)
2301 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2302 self
.vimconn
.cinder
.volumes
.create
.assert_not_called()
2303 mock_update_block_device_mapping
.assert_not_called()
2305 @patch.object(vimconnector
, "update_block_device_mapping")
2306 def test_prepare_persistent_root_volumes_using_vim_id(
2307 self
, mock_update_block_device_mapping
2309 """Existing persistent root volume with vim_id."""
2310 vm_av_zone
= ["nova"]
2311 base_disk_index
= ord("a")
2312 disk
= {"vim_id": volume_id
}
2313 block_device_mapping
= {}
2314 existing_vim_volumes
= []
2316 expected_boot_vol_id
= None
2317 expected_block_device_mapping
= {"vda": volume_id
}
2318 expected_existing_vim_volumes
= [{"id": volume_id
}]
2319 boot_volume_id
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2324 block_device_mapping
,
2325 existing_vim_volumes
,
2328 self
.assertEqual(boot_volume_id
, expected_boot_vol_id
)
2329 self
.assertDictEqual(block_device_mapping
, expected_block_device_mapping
)
2330 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2331 self
.vimconn
.cinder
.volumes
.create
.assert_not_called()
2332 mock_update_block_device_mapping
.assert_not_called()
2334 @patch.object(vimconnector
, "update_block_device_mapping")
2335 def test_prepare_persistent_non_root_volumes_using_vim_id(
2336 self
, mock_update_block_device_mapping
2338 """Existing persistent root volume with vim_id."""
2339 vm_av_zone
= ["nova"]
2340 base_disk_index
= ord("b")
2341 disk
= {"vim_id": volume_id
}
2342 block_device_mapping
= {}
2343 existing_vim_volumes
= []
2346 expected_block_device_mapping
= {"vdb": volume_id
}
2347 expected_existing_vim_volumes
= [{"id": volume_id
}]
2348 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2352 block_device_mapping
,
2354 existing_vim_volumes
,
2358 self
.assertDictEqual(block_device_mapping
, expected_block_device_mapping
)
2359 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2360 self
.vimconn
.cinder
.volumes
.create
.assert_not_called()
2361 mock_update_block_device_mapping
.assert_not_called()
2363 @patch.object(vimconnector
, "update_block_device_mapping")
2364 def test_prepare_persistent_root_volumes_create(
2365 self
, mock_update_block_device_mapping
2367 """Create persistent root volume."""
2368 self
.vimconn
.cinder
.volumes
.create
.return_value
.id = volume_id2
2369 vm_av_zone
= ["nova"]
2370 base_disk_index
= ord("a")
2371 disk
= {"size": 10, "image_id": image_id
}
2372 block_device_mapping
= {}
2373 existing_vim_volumes
= []
2375 expected_boot_vol_id
= volume_id2
2376 boot_volume_id
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2381 block_device_mapping
,
2382 existing_vim_volumes
,
2385 self
.assertEqual(boot_volume_id
, expected_boot_vol_id
)
2386 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2390 availability_zone
=["nova"],
2392 mock_update_block_device_mapping
.assert_called_once()
2393 _call_mock_update_block_device_mapping
= (
2394 mock_update_block_device_mapping
.call_args_list
2397 _call_mock_update_block_device_mapping
[0].kwargs
["block_device_mapping"],
2398 block_device_mapping
,
2401 _call_mock_update_block_device_mapping
[0].kwargs
["base_disk_index"], 97
2403 self
.assertEqual(_call_mock_update_block_device_mapping
[0].kwargs
["disk"], disk
)
2405 _call_mock_update_block_device_mapping
[0].kwargs
["created_items"], {}
2408 @patch.object(vimconnector
, "update_block_device_mapping")
2409 def test_prepare_persistent_root_volumes_create_with_keep(
2410 self
, mock_update_block_device_mapping
2412 """Create persistent root volume, disk has keep parameter."""
2413 self
.vimconn
.cinder
.volumes
.create
.return_value
.id = volume_id2
2414 vm_av_zone
= ["nova"]
2415 base_disk_index
= ord("a")
2416 disk
= {"size": 10, "image_id": image_id
, "keep": True}
2417 block_device_mapping
= {}
2418 existing_vim_volumes
= []
2420 expected_boot_vol_id
= volume_id2
2421 expected_existing_vim_volumes
= []
2422 boot_volume_id
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2427 block_device_mapping
,
2428 existing_vim_volumes
,
2431 self
.assertEqual(boot_volume_id
, expected_boot_vol_id
)
2432 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2433 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2437 availability_zone
=["nova"],
2439 mock_update_block_device_mapping
.assert_called_once()
2440 _call_mock_update_block_device_mapping
= (
2441 mock_update_block_device_mapping
.call_args_list
2444 _call_mock_update_block_device_mapping
[0].kwargs
["block_device_mapping"],
2445 block_device_mapping
,
2448 _call_mock_update_block_device_mapping
[0].kwargs
["base_disk_index"], 97
2450 self
.assertEqual(_call_mock_update_block_device_mapping
[0].kwargs
["disk"], disk
)
2452 _call_mock_update_block_device_mapping
[0].kwargs
["created_items"], {}
2455 @patch.object(vimconnector
, "update_block_device_mapping")
2456 def test_prepare_persistent_non_root_volumes_create(
2457 self
, mock_update_block_device_mapping
2459 """Create persistent non-root volume."""
2460 self
.vimconn
.cinder
= CopyingMock()
2461 self
.vimconn
.cinder
.volumes
.create
.return_value
.id = volume_id2
2462 vm_av_zone
= ["nova"]
2463 base_disk_index
= ord("a")
2465 block_device_mapping
= {}
2466 existing_vim_volumes
= []
2468 expected_existing_vim_volumes
= []
2469 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2473 block_device_mapping
,
2475 existing_vim_volumes
,
2479 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2480 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2481 size
=10, name
="basicvmvda", availability_zone
=["nova"]
2483 mock_update_block_device_mapping
.assert_called_once()
2484 _call_mock_update_block_device_mapping
= (
2485 mock_update_block_device_mapping
.call_args_list
2488 _call_mock_update_block_device_mapping
[0].kwargs
["block_device_mapping"],
2489 block_device_mapping
,
2492 _call_mock_update_block_device_mapping
[0].kwargs
["base_disk_index"], 97
2494 self
.assertEqual(_call_mock_update_block_device_mapping
[0].kwargs
["disk"], disk
)
2496 _call_mock_update_block_device_mapping
[0].kwargs
["created_items"], {}
2499 @patch.object(vimconnector
, "update_block_device_mapping")
2500 def test_prepare_persistent_non_root_volumes_create_with_keep(
2501 self
, mock_update_block_device_mapping
2503 """Create persistent non-root volume."""
2504 self
.vimconn
.cinder
= CopyingMock()
2505 self
.vimconn
.cinder
.volumes
.create
.return_value
.id = volume_id2
2506 vm_av_zone
= ["nova"]
2507 base_disk_index
= ord("a")
2508 disk
= {"size": 10, "keep": True}
2509 block_device_mapping
= {}
2510 existing_vim_volumes
= []
2512 expected_existing_vim_volumes
= []
2513 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2517 block_device_mapping
,
2519 existing_vim_volumes
,
2523 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2524 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2525 size
=10, name
="basicvmvda", availability_zone
=["nova"]
2527 mock_update_block_device_mapping
.assert_called_once()
2528 _call_mock_update_block_device_mapping
= (
2529 mock_update_block_device_mapping
.call_args_list
2532 _call_mock_update_block_device_mapping
[0].kwargs
["block_device_mapping"],
2533 block_device_mapping
,
2536 _call_mock_update_block_device_mapping
[0].kwargs
["base_disk_index"], 97
2538 self
.assertEqual(_call_mock_update_block_device_mapping
[0].kwargs
["disk"], disk
)
2540 _call_mock_update_block_device_mapping
[0].kwargs
["created_items"], {}
2543 @patch.object(vimconnector
, "update_block_device_mapping")
2544 def test_prepare_persistent_root_volumes_create_raise_exception(
2545 self
, mock_update_block_device_mapping
2547 """Create persistent root volume raise exception."""
2548 self
.vimconn
.cinder
.volumes
.create
.side_effect
= Exception
2549 vm_av_zone
= ["nova"]
2550 base_disk_index
= ord("a")
2551 disk
= {"size": 10, "image_id": image_id
}
2552 block_device_mapping
= {}
2553 existing_vim_volumes
= []
2556 with self
.assertRaises(Exception):
2557 result
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2562 block_device_mapping
,
2563 existing_vim_volumes
,
2567 self
.assertEqual(result
, None)
2569 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2573 availability_zone
=["nova"],
2575 self
.assertEqual(existing_vim_volumes
, [])
2576 self
.assertEqual(block_device_mapping
, {})
2577 self
.assertEqual(created_items
, {})
2578 mock_update_block_device_mapping
.assert_not_called()
2580 @patch.object(vimconnector
, "update_block_device_mapping")
2581 def test_prepare_persistent_non_root_volumes_create_raise_exception(
2582 self
, mock_update_block_device_mapping
2584 """Create persistent non-root volume raise exception."""
2585 self
.vimconn
.cinder
.volumes
.create
.side_effect
= Exception
2586 vm_av_zone
= ["nova"]
2587 base_disk_index
= ord("b")
2589 block_device_mapping
= {}
2590 existing_vim_volumes
= []
2593 with self
.assertRaises(Exception):
2594 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2598 block_device_mapping
,
2600 existing_vim_volumes
,
2604 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2605 size
=10, name
="basicvmvdb", availability_zone
=["nova"]
2607 self
.assertEqual(existing_vim_volumes
, [])
2608 self
.assertEqual(block_device_mapping
, {})
2609 self
.assertEqual(created_items
, {})
2610 mock_update_block_device_mapping
.assert_not_called()
2612 @patch("time.sleep")
2613 def test_wait_for_created_volumes_availability_volume_status_available(
2616 """Created volume status is available."""
2618 created_items
= {f
"volume:{volume_id2}": True}
2619 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
2621 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2622 elapsed_time
, created_items
2624 self
.assertEqual(result
, elapsed_time
)
2625 self
.vimconn
.cinder
.volumes
.get
.assert_called_with(volume_id2
)
2626 mock_sleep
.assert_not_called()
2628 @patch("time.sleep")
2629 def test_wait_for_existing_volumes_availability_volume_status_available(
2632 """Existing volume status is available."""
2634 existing_vim_volumes
= [{"id": volume_id2
}]
2635 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
2637 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2638 elapsed_time
, existing_vim_volumes
2640 self
.assertEqual(result
, elapsed_time
)
2641 self
.vimconn
.cinder
.volumes
.get
.assert_called_with(volume_id2
)
2642 mock_sleep
.assert_not_called()
2644 @patch("time.sleep")
2645 def test_wait_for_created_volumes_availability_status_processing_multiple_volumes(
2648 """Created volume status is processing."""
2651 f
"volume:{volume_id2}": True,
2652 f
"volume:{volume_id3}": True,
2654 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [
2655 Status("processing"),
2656 Status("available"),
2657 Status("available"),
2660 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2661 elapsed_time
, created_items
2663 self
.assertEqual(result
, 10)
2664 _call_mock_get_volumes
= self
.vimconn
.cinder
.volumes
.get
.call_args_list
2665 self
.assertEqual(_call_mock_get_volumes
[0][0], (volume_id2
,))
2666 self
.assertEqual(_call_mock_get_volumes
[1][0], (volume_id2
,))
2667 self
.assertEqual(_call_mock_get_volumes
[2][0], (volume_id3
,))
2668 mock_sleep
.assert_called_with(5)
2669 self
.assertEqual(1, mock_sleep
.call_count
)
2671 @patch("time.sleep")
2672 def test_wait_for_existing_volumes_availability_status_processing_multiple_volumes(
2675 """Existing volume status is processing."""
2677 existing_vim_volumes
= [
2679 {"id": "44e0e83-b9uu-4akk-t234-p9cc4811bd4a"},
2681 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [
2682 Status("processing"),
2683 Status("available"),
2684 Status("available"),
2687 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2688 elapsed_time
, existing_vim_volumes
2690 self
.assertEqual(result
, 10)
2691 _call_mock_get_volumes
= self
.vimconn
.cinder
.volumes
.get
.call_args_list
2692 self
.assertEqual(_call_mock_get_volumes
[0][0], (volume_id2
,))
2693 self
.assertEqual(_call_mock_get_volumes
[1][0], (volume_id2
,))
2695 _call_mock_get_volumes
[2][0], ("44e0e83-b9uu-4akk-t234-p9cc4811bd4a",)
2697 mock_sleep
.assert_called_with(5)
2698 self
.assertEqual(1, mock_sleep
.call_count
)
2700 @patch("time.sleep")
2701 def test_wait_for_created_volumes_availability_volume_status_processing_timeout(
2704 """Created volume status is processing, elapsed time greater than timeout (1800)."""
2706 created_items
= {f
"volume:{volume_id2}": True}
2707 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [
2708 Status("processing"),
2709 Status("processing"),
2711 with
patch("time.sleep", mock_sleep
):
2712 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2713 elapsed_time
, created_items
2715 self
.assertEqual(result
, 1805)
2716 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
2717 mock_sleep
.assert_not_called()
2719 @patch("time.sleep")
2720 def test_wait_for_existing_volumes_availability_volume_status_processing_timeout(
2723 """Exsiting volume status is processing, elapsed time greater than timeout (1800)."""
2725 existing_vim_volumes
= [{"id": volume_id2
}]
2726 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [
2727 Status("processing"),
2728 Status("processing"),
2731 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2732 elapsed_time
, existing_vim_volumes
2734 self
.assertEqual(result
, 1805)
2735 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
2736 mock_sleep
.assert_not_called()
2738 @patch("time.sleep")
2739 def test_wait_for_created_volumes_availability_cinder_raise_exception(
2742 """Cinder get volumes raises exception for created volumes."""
2744 created_items
= {f
"volume:{volume_id2}": True}
2745 self
.vimconn
.cinder
.volumes
.get
.side_effect
= Exception
2746 with self
.assertRaises(Exception):
2747 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2748 elapsed_time
, created_items
2750 self
.assertEqual(result
, 1000)
2751 self
.vimconn
.cinder
.volumes
.get
.assert_called_with(volume_id2
)
2752 mock_sleep
.assert_not_called()
2754 @patch("time.sleep")
2755 def test_wait_for_existing_volumes_availability_cinder_raise_exception(
2758 """Cinder get volumes raises exception for existing volumes."""
2760 existing_vim_volumes
= [{"id": volume_id2
}]
2761 self
.vimconn
.cinder
.volumes
.get
.side_effect
= Exception
2762 with self
.assertRaises(Exception):
2763 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2764 elapsed_time
, existing_vim_volumes
2766 self
.assertEqual(result
, 1000)
2767 self
.vimconn
.cinder
.volumes
.get
.assert_called_with(volume_id2
)
2768 mock_sleep
.assert_not_called()
2770 @patch("time.sleep")
2771 def test_wait_for_created_volumes_availability_no_volume_in_created_items(
2774 """Created_items dict does not have volume-id."""
2778 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [None]
2780 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2781 elapsed_time
, created_items
2783 self
.assertEqual(result
, 10)
2784 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
2785 mock_sleep
.assert_not_called()
2787 @patch("time.sleep")
2788 def test_wait_for_existing_volumes_availability_no_volume_in_existing_vim_volumes(
2791 """Existing_vim_volumes list does not have volume."""
2793 existing_vim_volumes
= []
2795 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [None]
2797 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2798 elapsed_time
, existing_vim_volumes
2800 self
.assertEqual(result
, 10)
2801 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
2802 mock_sleep
.assert_not_called()
2804 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2805 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2806 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2807 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2808 def test_prepare_disk_for_vm_instance(
2810 mock_existing_vol_availability
,
2811 mock_created_vol_availability
,
2812 mock_non_root_volumes
,
2815 """Prepare disks for VM instance successfully."""
2816 existing_vim_volumes
= []
2818 block_device_mapping
= {}
2819 vm_av_zone
= ["nova"]
2821 mock_root_volumes
.return_value
= root_vol_id
2822 mock_created_vol_availability
.return_value
= 10
2823 mock_existing_vol_availability
.return_value
= 15
2824 self
.vimconn
.cinder
= CopyingMock()
2825 self
.vimconn
._prepare
_disk
_for
_vminstance
(
2827 existing_vim_volumes
,
2830 block_device_mapping
,
2833 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_called_once_with(
2836 mock_created_vol_availability
.assert_called_once_with(0, created_items
)
2837 mock_existing_vol_availability
.assert_called_once_with(10, existing_vim_volumes
)
2838 self
.assertEqual(mock_root_volumes
.call_count
, 1)
2839 self
.assertEqual(mock_non_root_volumes
.call_count
, 1)
2840 mock_root_volumes
.assert_called_once_with(
2842 vm_av_zone
=["nova"],
2843 disk
={"size": 10, "image_id": image_id
},
2845 block_device_mapping
={},
2846 existing_vim_volumes
=[],
2849 mock_non_root_volumes
.assert_called_once_with(
2852 vm_av_zone
=["nova"],
2854 block_device_mapping
={},
2855 existing_vim_volumes
=[],
2859 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2860 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2861 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2862 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2863 def test_prepare_disk_for_vm_instance_timeout_exceeded(
2865 mock_existing_vol_availability
,
2866 mock_created_vol_availability
,
2867 mock_non_root_volumes
,
2870 """Timeout exceeded while waiting for disks."""
2871 existing_vim_volumes
= []
2873 vm_av_zone
= ["nova"]
2874 block_device_mapping
= {}
2876 mock_root_volumes
.return_value
= root_vol_id
2877 mock_created_vol_availability
.return_value
= 1700
2878 mock_existing_vol_availability
.return_value
= 1900
2880 with self
.assertRaises(VimConnException
) as err
:
2881 self
.vimconn
._prepare
_disk
_for
_vminstance
(
2883 existing_vim_volumes
,
2886 block_device_mapping
,
2890 str(err
.exception
), "Timeout creating volumes for instance basicvm"
2892 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_not_called()
2893 mock_created_vol_availability
.assert_called_once_with(0, created_items
)
2894 mock_existing_vol_availability
.assert_called_once_with(
2895 1700, existing_vim_volumes
2897 self
.assertEqual(mock_root_volumes
.call_count
, 1)
2898 self
.assertEqual(mock_non_root_volumes
.call_count
, 1)
2899 mock_root_volumes
.assert_called_once_with(
2901 vm_av_zone
=["nova"],
2902 disk
={"size": 10, "image_id": image_id
},
2904 block_device_mapping
={},
2905 existing_vim_volumes
=[],
2908 mock_non_root_volumes
.assert_called_once_with(
2911 vm_av_zone
=["nova"],
2913 block_device_mapping
={},
2914 existing_vim_volumes
=[],
2918 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2919 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2920 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2921 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2922 def test_prepare_disk_for_vm_instance_empty_disk_list(
2924 mock_existing_vol_availability
,
2925 mock_created_vol_availability
,
2926 mock_non_root_volumes
,
2929 """Disk list is empty."""
2930 existing_vim_volumes
= []
2932 block_device_mapping
= {}
2933 vm_av_zone
= ["nova"]
2934 mock_created_vol_availability
.return_value
= 2
2935 mock_existing_vol_availability
.return_value
= 3
2937 self
.vimconn
._prepare
_disk
_for
_vminstance
(
2939 existing_vim_volumes
,
2942 block_device_mapping
,
2945 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_not_called()
2946 mock_created_vol_availability
.assert_called_once_with(0, created_items
)
2947 mock_existing_vol_availability
.assert_called_once_with(2, existing_vim_volumes
)
2948 mock_root_volumes
.assert_not_called()
2949 mock_non_root_volumes
.assert_not_called()
2951 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2952 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2953 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2954 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2955 def test_prepare_disk_for_vm_instance_persistent_root_volume_error(
2957 mock_existing_vol_availability
,
2958 mock_created_vol_availability
,
2959 mock_non_root_volumes
,
2962 """Persistent root volumes preparation raises error."""
2963 existing_vim_volumes
= []
2965 vm_av_zone
= ["nova"]
2966 block_device_mapping
= {}
2968 mock_root_volumes
.side_effect
= Exception()
2969 mock_created_vol_availability
.return_value
= 10
2970 mock_existing_vol_availability
.return_value
= 15
2972 with self
.assertRaises(Exception):
2973 self
.vimconn
._prepare
_disk
_for
_vminstance
(
2975 existing_vim_volumes
,
2978 block_device_mapping
,
2981 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_not_called()
2982 mock_created_vol_availability
.assert_not_called()
2983 mock_existing_vol_availability
.assert_not_called()
2984 mock_root_volumes
.assert_called_once_with(
2986 vm_av_zone
=["nova"],
2987 disk
={"size": 10, "image_id": image_id
},
2989 block_device_mapping
={},
2990 existing_vim_volumes
=[],
2993 mock_non_root_volumes
.assert_not_called()
2995 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2996 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2997 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2998 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2999 def test_prepare_disk_for_vm_instance_non_root_volume_error(
3001 mock_existing_vol_availability
,
3002 mock_created_vol_availability
,
3003 mock_non_root_volumes
,
3006 """Non-root volumes preparation raises error."""
3007 existing_vim_volumes
= []
3009 vm_av_zone
= ["nova"]
3010 block_device_mapping
= {}
3012 mock_root_volumes
.return_value
= root_vol_id
3013 mock_non_root_volumes
.side_effect
= Exception
3015 with self
.assertRaises(Exception):
3016 self
.vimconn
._prepare
_disk
_for
_vminstance
(
3018 existing_vim_volumes
,
3021 block_device_mapping
,
3024 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_not_called()
3025 mock_created_vol_availability
.assert_not_called()
3026 mock_existing_vol_availability
.assert_not_called()
3027 self
.assertEqual(mock_root_volumes
.call_count
, 1)
3028 self
.assertEqual(mock_non_root_volumes
.call_count
, 1)
3029 mock_root_volumes
.assert_called_once_with(
3031 vm_av_zone
=["nova"],
3032 disk
={"size": 10, "image_id": image_id
},
3034 block_device_mapping
={},
3035 existing_vim_volumes
=[],
3038 mock_non_root_volumes
.assert_called_once_with(
3041 vm_av_zone
=["nova"],
3043 block_device_mapping
={},
3044 existing_vim_volumes
=[],
3048 def test_find_external_network_for_floating_ip_no_external_network(self
):
3049 """External network could not be found."""
3050 self
.vimconn
.neutron
.list_networks
.return_value
= {
3052 {"id": "408b73-r9cc-5a6a-a270-82cc4811bd4a", "router:external": False}
3055 with self
.assertRaises(VimConnException
) as err
:
3056 self
.vimconn
._find
_the
_external
_network
_for
_floating
_ip
()
3059 "Cannot create floating_ip automatically since no external network is present",
3062 def test_find_external_network_for_floating_one_external_network(self
):
3063 """One external network has been found."""
3064 self
.vimconn
.neutron
.list_networks
.return_value
= {
3066 {"id": "408b73-r9cc-5a6a-a270-82cc4811bd4a", "router:external": True}
3069 expected_result
= "408b73-r9cc-5a6a-a270-82cc4811bd4a"
3070 result
= self
.vimconn
._find
_the
_external
_network
_for
_floating
_ip
()
3071 self
.assertEqual(result
, expected_result
)
3073 def test_find_external_network_for_floating_neutron_raises_exception(self
):
3074 """Neutron list networks raises exception."""
3075 self
.vimconn
.neutron
.list_networks
.side_effect
= Exception
3076 with self
.assertRaises(Exception):
3077 self
.vimconn
._find
_the
_external
_network
_for
_floating
_ip
()
3079 def test_find_external_network_for_floating_several_external_network(self
):
3080 """Several exernal networks has been found."""
3081 self
.vimconn
.neutron
.list_networks
.return_value
= {
3083 {"id": "408b73-r9cc-5a6a-a270-82cc4811bd4a", "router:external": True},
3084 {"id": "608b73-y9cc-5a6a-a270-12cc4811bd4a", "router:external": True},
3087 with self
.assertRaises(VimConnException
) as err
:
3088 self
.vimconn
._find
_the
_external
_network
_for
_floating
_ip
()
3091 "Cannot create floating_ip automatically since multiple external networks are present",
3094 def test_neutron_create_float_ip(self
):
3095 """Floating ip creation is successful."""
3096 param
= {"net_id": "408b73-r9cc-5a6a-a270-p2cc4811bd9a"}
3098 self
.vimconn
.neutron
.create_floatingip
.return_value
= {
3099 "floatingip": {"id": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3101 expected_created_items
= {
3102 "floating_ip:308b73-t9cc-1a6a-a270-12cc4811bd4a": True
3104 self
.vimconn
._neutron
_create
_float
_ip
(param
, created_items
)
3105 self
.assertEqual(created_items
, expected_created_items
)
3107 def test_neutron_create_float_ip_exception_occurred(self
):
3108 """Floating ip could not be created."""
3111 "floating_network_id": "408b73-r9cc-5a6a-a270-p2cc4811bd9a",
3112 "tenant_id": "308b73-19cc-8a6a-a270-02cc4811bd9a",
3116 self
.vimconn
.neutron
= CopyingMock()
3117 self
.vimconn
.neutron
.create_floatingip
.side_effect
= Exception(
3118 "Neutron floating ip create exception occurred."
3120 with self
.assertRaises(VimConnException
) as err
:
3121 self
.vimconn
._neutron
_create
_float
_ip
(param
, created_items
)
3122 self
.assertEqual(created_items
, {})
3125 "Exception: Cannot create new floating_ip Neutron floating ip create exception occurred.",
3128 @patch.object(vimconnector
, "_neutron_create_float_ip")
3129 @patch.object(vimconnector
, "_find_the_external_network_for_floating_ip")
3130 def test_create_floating_ip_pool_id_available(
3131 self
, mock_find_ext_network
, mock_create_float_ip
3133 """Floating ip creation, ip pool is available."""
3134 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3138 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3139 "tenant_id": "408b73-r9cc-5a6a-a270-82cc4811bd4a",
3142 self
.vimconn
._create
_floating
_ip
(floating_network
, self
.server
, created_items
)
3143 mock_find_ext_network
.assert_not_called()
3144 mock_create_float_ip
.assert_called_once_with(expected_param
, {})
3146 @patch.object(vimconnector
, "_neutron_create_float_ip")
3147 @patch.object(vimconnector
, "_find_the_external_network_for_floating_ip")
3148 def test_create_floating_ip_finding_pool_id(
3149 self
, mock_find_ext_network
, mock_create_float_ip
3151 """Floating ip creation, pool id need to be found."""
3152 floating_network
= {"floating_ip": True}
3154 mock_find_ext_network
.return_value
= "308b73-t9cc-1a6a-a270-12cc4811bd4a"
3157 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3158 "tenant_id": "408b73-r9cc-5a6a-a270-82cc4811bd4a",
3161 self
.vimconn
._create
_floating
_ip
(floating_network
, self
.server
, created_items
)
3162 mock_find_ext_network
.assert_called_once()
3163 mock_create_float_ip
.assert_called_once_with(expected_param
, {})
3165 @patch.object(vimconnector
, "_neutron_create_float_ip")
3166 @patch.object(vimconnector
, "_find_the_external_network_for_floating_ip")
3167 def test_create_floating_ip_neutron_create_floating_ip_exception(
3168 self
, mock_find_ext_network
, mock_create_float_ip
3170 """Neutron creat floating ip raises error."""
3171 floating_network
= {"floating_ip": True}
3173 mock_create_float_ip
.side_effect
= VimConnException(
3174 "Can not create floating ip."
3176 mock_find_ext_network
.return_value
= "308b73-t9cc-1a6a-a270-12cc4811bd4a"
3179 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3180 "tenant_id": "408b73-r9cc-5a6a-a270-82cc4811bd4a",
3184 with self
.assertRaises(VimConnException
) as err
:
3185 self
.vimconn
._create
_floating
_ip
(
3186 floating_network
, self
.server
, created_items
3188 self
.assertEqual(str(err
.exception
), "Can not create floating ip.")
3189 mock_find_ext_network
.assert_called_once()
3190 mock_create_float_ip
.assert_called_once_with(expected_param
, {})
3192 @patch.object(vimconnector
, "_neutron_create_float_ip")
3193 @patch.object(vimconnector
, "_find_the_external_network_for_floating_ip")
3194 def test_create_floating_ip_can_not_find_pool_id(
3195 self
, mock_find_ext_network
, mock_create_float_ip
3197 """Floating ip creation, pool id could not be found."""
3198 floating_network
= {"floating_ip": True}
3200 mock_find_ext_network
.side_effect
= VimConnException(
3201 "Cannot create floating_ip automatically since no external network is present"
3203 with self
.assertRaises(VimConnException
) as err
:
3204 self
.vimconn
._create
_floating
_ip
(
3205 floating_network
, self
.server
, created_items
3209 "Cannot create floating_ip automatically since no external network is present",
3211 mock_find_ext_network
.assert_called_once()
3212 mock_create_float_ip
.assert_not_called()
3214 def test_find_floating_ip_get_free_floating_ip(self
):
3215 """Get free floating ips successfully."""
3218 "tenant_id": "408b73-r9cc-5a6a-a270-82cc4811bd4a",
3219 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3220 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3223 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3224 expected_result
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3226 result
= self
.vimconn
._find
_floating
_ip
(
3227 self
.server
, floating_ips
, floating_network
3229 self
.assertEqual(result
, expected_result
)
3231 def test_find_floating_ip_different_floating_network_id(self
):
3232 """Floating network id is different with floating_ip of floating network."""
3235 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3236 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3239 floating_network
= {"floating_ip": "508b73-t9cc-1a6a-a270-12cc4811bd4a"}
3241 result
= self
.vimconn
._find
_floating
_ip
(
3242 self
.server
, floating_ips
, floating_network
3244 self
.assertEqual(result
, None)
3246 def test_find_floating_ip_different_fip_tenant(self
):
3247 """Items in floating_ips has port_id, tenant_is is not same with server tenant id."""
3250 "port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3251 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3252 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3253 "tenant_id": self
.server
.id,
3256 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3257 mock_create_floating_ip
= CopyingMock()
3258 with patch
.object(vimconnector
, "_create_floating_ip", mock_create_floating_ip
):
3259 result
= self
.vimconn
._find
_floating
_ip
(
3260 self
.server
, floating_ips
, floating_network
3262 self
.assertEqual(result
, None)
3264 @patch("time.sleep")
3265 def test_assign_floating_ip(self
, mock_sleep
):
3266 """Assign floating ip successfully."""
3267 free_floating_ip
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3268 floating_network
= {"vim_id": floating_network_vim_id
}
3270 "port_id": floating_network_vim_id
,
3271 "floating_network_id": "p08b73-e9cc-5a6a-t270-82cc4811bd4a",
3272 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3273 "tenant_id": "k08b73-e9cc-5a6a-t270-82cc4811bd4a",
3275 self
.vimconn
.neutron
.update_floatingip
.side_effect
= None
3276 self
.vimconn
.neutron
.show_floatingip
.return_value
= fip
3277 expected_result
= fip
3279 result
= self
.vimconn
._assign
_floating
_ip
(free_floating_ip
, floating_network
)
3280 self
.assertEqual(result
, expected_result
)
3281 self
.vimconn
.neutron
.update_floatingip
.assert_called_once_with(
3283 {"floatingip": {"port_id": floating_network_vim_id
}},
3285 mock_sleep
.assert_called_once_with(5)
3286 self
.vimconn
.neutron
.show_floatingip
.assert_called_once_with(free_floating_ip
)
3288 @patch("time.sleep")
3289 def test_assign_floating_ip_update_floating_ip_exception(self
, mock_sleep
):
3290 """Neutron update floating ip raises exception."""
3291 free_floating_ip
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3292 floating_network
= {"vim_id": floating_network_vim_id
}
3293 self
.vimconn
.neutron
= CopyingMock()
3294 self
.vimconn
.neutron
.update_floatingip
.side_effect
= Exception(
3295 "Floating ip is not updated."
3298 with self
.assertRaises(Exception) as err
:
3299 result
= self
.vimconn
._assign
_floating
_ip
(
3300 free_floating_ip
, floating_network
3302 self
.assertEqual(result
, None)
3303 self
.assertEqual(str(err
.exception
), "Floating ip is not updated.")
3305 self
.vimconn
.neutron
.update_floatingip
.assert_called_once_with(
3307 {"floatingip": {"port_id": floating_network_vim_id
}},
3309 mock_sleep
.assert_not_called()
3310 self
.vimconn
.neutron
.show_floatingip
.assert_not_called()
3312 @patch("time.sleep")
3313 def test_assign_floating_ip_show_floating_ip_exception(self
, mock_sleep
):
3314 """Neutron show floating ip raises exception."""
3315 free_floating_ip
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3316 floating_network
= {"vim_id": floating_network_vim_id
}
3317 self
.vimconn
.neutron
.update_floatingip
.side_effect
= None
3318 self
.vimconn
.neutron
.show_floatingip
.side_effect
= Exception(
3319 "Floating ip could not be shown."
3322 with self
.assertRaises(Exception) as err
:
3323 result
= self
.vimconn
._assign
_floating
_ip
(
3324 free_floating_ip
, floating_network
3326 self
.assertEqual(result
, None)
3327 self
.assertEqual(str(err
.exception
), "Floating ip could not be shown.")
3328 self
.vimconn
.neutron
.update_floatingip
.assert_called_once_with(
3330 {"floatingip": {"port_id": floating_network_vim_id
}},
3332 mock_sleep
.assert_called_once_with(5)
3333 self
.vimconn
.neutron
.show_floatingip
.assert_called_once_with(free_floating_ip
)
3335 @patch("random.shuffle")
3336 @patch.object(vimconnector
, "_find_floating_ip")
3337 def test_get_free_floating_ip(self
, mock_find_floating_ip
, mock_shuffle
):
3338 """Get free floating ip successfully."""
3339 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3342 "port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3343 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3344 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3345 "tenant_id": "208b73-e9cc-5a6a-t270-82cc4811bd4a",
3348 "port_id": "508b73-r9cc-5a6a-5270-o2cc4811bd4a",
3349 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3350 "id": "208b73-o9cc-5a6a-a270-52cc4811bd8",
3351 "tenant_id": "208b73-e9cc-5a6a-t270-82cc4811bd4a",
3354 self
.vimconn
.neutron
.list_floatingips
.return_value
= {
3355 "floatingips": floating_ips
3357 mock_find_floating_ip
.return_value
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3358 expected_result
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3360 result
= self
.vimconn
._get
_free
_floating
_ip
(self
.server
, floating_network
)
3361 self
.assertEqual(result
, expected_result
)
3362 mock_shuffle
.assert_called_once_with(floating_ips
)
3363 mock_find_floating_ip
.assert_called_once_with(
3364 self
.server
, floating_ips
, floating_network
3367 @patch("random.shuffle")
3368 @patch.object(vimconnector
, "_find_floating_ip")
3369 def test_get_free_floating_ip_list_floating_ip_exception(
3370 self
, mock_find_floating_ip
, mock_shuffle
3372 """Neutron list floating IPs raises exception."""
3373 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3374 self
.vimconn
.neutron
= CopyingMock()
3375 self
.vimconn
.neutron
.list_floatingips
.side_effect
= Exception(
3376 "Floating ips could not be listed."
3378 with self
.assertRaises(Exception) as err
:
3379 result
= self
.vimconn
._get
_free
_floating
_ip
(self
.server
, floating_network
)
3380 self
.assertEqual(result
, None)
3381 self
.assertEqual(str(err
.exception
), "Floating ips could not be listed.")
3382 mock_shuffle
.assert_not_called()
3383 mock_find_floating_ip
.assert_not_called()
3385 @patch("random.shuffle")
3386 @patch.object(vimconnector
, "_find_floating_ip")
3387 def test_get_free_floating_ip_find_floating_ip_exception(
3388 self
, mock_find_floating_ip
, mock_shuffle
3390 """_find_floating_ip method raises exception."""
3391 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3394 "port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3395 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3396 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3397 "tenant_id": "208b73-e9cc-5a6a-t270-82cc4811bd4a",
3400 "port_id": "508b73-r9cc-5a6a-5270-o2cc4811bd4a",
3401 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3402 "id": "208b73-o9cc-5a6a-a270-52cc4811bd8",
3403 "tenant_id": "208b73-e9cc-5a6a-t270-82cc4811bd4a",
3406 self
.vimconn
.neutron
= CopyingMock()
3407 self
.vimconn
.neutron
.list_floatingips
.return_value
= {
3408 "floatingips": floating_ips
3410 mock_find_floating_ip
.side_effect
= Exception(
3411 "Free floating ip could not be found."
3414 with self
.assertRaises(Exception) as err
:
3415 result
= self
.vimconn
._get
_free
_floating
_ip
(self
.server
, floating_network
)
3416 self
.assertEqual(result
, None)
3417 self
.assertEqual(str(err
.exception
), "Free floating ip could not be found.")
3418 mock_shuffle
.assert_called_once_with(floating_ips
)
3419 mock_find_floating_ip
.assert_called_once_with(
3420 self
.server
, floating_ips
, floating_network
3423 @patch.object(vimconnector
, "_create_floating_ip")
3424 @patch.object(vimconnector
, "_get_free_floating_ip")
3425 @patch.object(vimconnector
, "_assign_floating_ip")
3426 def test_prepare_external_network_for_vm_instance(
3428 mock_assign_floating_ip
,
3429 mock_get_free_floating_ip
,
3430 mock_create_floating_ip
,
3432 """Prepare external network successfully."""
3433 external_network
= [
3435 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3436 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3440 vm_start_time
= time_return_value
3441 mock_get_free_floating_ip
.side_effect
= ["y08b73-o9cc-1a6a-a270-12cc4811bd4u"]
3442 mock_assign_floating_ip
.return_value
= {
3443 "floatingip": {"port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a"}
3445 self
.vimconn
.neutron
= CopyingMock()
3446 self
.vimconn
.nova
= CopyingMock()
3447 self
.vimconn
.neutron
.show_floatingip
.return_value
= {
3448 "floatingip": {"port_id": ""}
3451 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3452 external_network
, self
.server
, created_items
, vm_start_time
3455 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 1)
3456 mock_get_free_floating_ip
.assert_called_once_with(
3459 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3460 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3463 self
.vimconn
.neutron
.show_floatingip
.assert_called_once_with(
3464 "y08b73-o9cc-1a6a-a270-12cc4811bd4u"
3466 self
.vimconn
.nova
.servers
.get
.assert_not_called()
3467 mock_create_floating_ip
.assert_not_called()
3468 mock_assign_floating_ip
.assert_called_once_with(
3469 "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3471 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3472 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3477 @patch("time.sleep")
3478 @patch.object(vimconnector
, "_create_floating_ip")
3479 @patch.object(vimconnector
, "_get_free_floating_ip")
3480 @patch.object(vimconnector
, "_assign_floating_ip")
3481 def test_prepare_external_network_for_vm_instance_no_free_floating_ip(
3483 mock_assign_floating_ip
,
3484 mock_get_free_floating_ip
,
3485 mock_create_floating_ip
,
3489 """There is not any free floating ip."""
3490 floating_network
= {
3491 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3492 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3494 external_network
= [floating_network
]
3497 vm_start_time
= time_return_value
3498 mock_get_free_floating_ip
.return_value
= None
3499 mock_assign_floating_ip
.return_value
= {}
3500 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3501 self
.vimconn
.neutron
.show_floatingip
.return_value
= {}
3503 with self
.assertRaises(KeyError):
3504 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3505 external_network
, self
.server
, created_items
, vm_start_time
3508 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 4)
3509 mock_get_free_floating_ip
.assert_called_with(
3512 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3513 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3516 self
.vimconn
.neutron
.show_floatingip
.assert_called_with(None)
3517 mock_sleep
.assert_not_called()
3518 mock_time
.assert_not_called()
3519 self
.assertEqual(self
.vimconn
.nova
.servers
.get
.call_count
, 4)
3520 mock_create_floating_ip
.assert_called_with(
3521 floating_network
, self
.server
, created_items
3523 self
.assertEqual(mock_create_floating_ip
.call_count
, 4)
3524 mock_assign_floating_ip
.assert_not_called()
3525 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
3528 @patch("time.sleep")
3529 @patch.object(vimconnector
, "_create_floating_ip")
3530 @patch.object(vimconnector
, "_get_free_floating_ip")
3531 @patch.object(vimconnector
, "_assign_floating_ip")
3532 def test_prepare_external_network_for_vm_instance_no_free_fip_can_not_create_fip_exit_on_error_false(
3534 mock_assign_floating_ip
,
3535 mock_get_free_floating_ip
,
3536 mock_create_floating_ip
,
3540 """There is not any free floating ip, create_floating ip method raise exception
3541 exit_on_floating_ip_error set to False."""
3542 floating_network
= {
3543 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3544 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3545 "exit_on_floating_ip_error": False,
3547 external_network
= [floating_network
]
3550 vm_start_time
= time_return_value
3551 mock_get_free_floating_ip
.return_value
= None
3552 mock_assign_floating_ip
.return_value
= {}
3553 mock_create_floating_ip
.side_effect
= VimConnException(
3554 "Can not create floating ip."
3556 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3557 self
.vimconn
.neutron
.show_floatingip
.return_value
= {}
3559 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3560 external_network
, self
.server
, created_items
, vm_start_time
3562 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 1)
3563 mock_get_free_floating_ip
.assert_called_with(
3566 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3567 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3568 "exit_on_floating_ip_error": False,
3571 self
.vimconn
.neutron
.show_floatingip
.assert_not_called()
3572 mock_sleep
.assert_not_called()
3573 mock_time
.assert_not_called()
3574 self
.vimconn
.nova
.servers
.get
.assert_not_called()
3575 mock_create_floating_ip
.assert_called_with(
3576 floating_network
, self
.server
, created_items
3578 self
.assertEqual(mock_create_floating_ip
.call_count
, 1)
3579 mock_assign_floating_ip
.assert_not_called()
3582 @patch("time.sleep")
3583 @patch.object(vimconnector
, "_create_floating_ip")
3584 @patch.object(vimconnector
, "_get_free_floating_ip")
3585 @patch.object(vimconnector
, "_assign_floating_ip")
3586 def test_prepare_external_network_for_vm_instance_no_free_fip_can_not_create_fip_exit_on_error_true(
3588 mock_assign_floating_ip
,
3589 mock_get_free_floating_ip
,
3590 mock_create_floating_ip
,
3594 """There is not any free floating ip, create_floating ip method raise exception
3595 exit_on_floating_ip_error set to False."""
3596 floating_network
= {
3597 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3598 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3599 "exit_on_floating_ip_error": True,
3601 external_network
= [floating_network
]
3604 vm_start_time
= time_return_value
3605 mock_get_free_floating_ip
.return_value
= None
3606 mock_assign_floating_ip
.return_value
= {}
3607 mock_create_floating_ip
.side_effect
= VimConnException(
3608 "Can not create floating ip."
3610 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3611 self
.vimconn
.neutron
.show_floatingip
.return_value
= {}
3612 with self
.assertRaises(VimConnException
):
3613 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3614 external_network
, self
.server
, created_items
, vm_start_time
3616 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 1)
3617 mock_get_free_floating_ip
.assert_called_with(
3620 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3621 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3622 "exit_on_floating_ip_error": True,
3625 self
.vimconn
.neutron
.show_floatingip
.assert_not_called()
3626 mock_sleep
.assert_not_called()
3627 mock_time
.assert_not_called()
3628 self
.vimconn
.nova
.servers
.get
.assert_not_called()
3629 mock_create_floating_ip
.assert_called_with(
3630 floating_network
, self
.server
, created_items
3632 self
.assertEqual(mock_create_floating_ip
.call_count
, 1)
3633 mock_assign_floating_ip
.assert_not_called()
3635 @patch.object(vimconnector
, "_create_floating_ip")
3636 @patch.object(vimconnector
, "_get_free_floating_ip")
3637 @patch.object(vimconnector
, "_assign_floating_ip")
3638 def test_prepare_external_network_for_vm_instance_fip_has_port_id(
3640 mock_assign_floating_ip
,
3641 mock_get_free_floating_ip
,
3642 mock_create_floating_ip
,
3644 """Neutron show floating ip return the fip with port_id and floating network vim_id
3645 is different from port_id."""
3646 floating_network
= {
3647 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3648 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3650 external_network
= [floating_network
]
3653 mock_get_free_floating_ip
.side_effect
= [
3654 "t08b73-o9cc-1a6a-a270-12cc4811bd4u",
3655 "r08b73-o9cc-1a6a-a270-12cc4811bd4u",
3656 "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3658 mock_assign_floating_ip
.side_effect
= [
3659 {"floatingip": {"port_id": "k08b73-r9cc-5a6a-a270-82cc4811bd4a"}},
3660 {"floatingip": {"port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a"}},
3662 self
.vimconn
.neutron
= CopyingMock()
3663 self
.vimconn
.nova
= CopyingMock()
3664 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3665 {"floatingip": {"port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a"}},
3666 {"floatingip": {"port_id": ""}},
3667 {"floatingip": {"port_id": ""}},
3669 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3670 external_network
, self
.server
, created_items
, vm_start_time
3672 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 3)
3673 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3675 _call_mock_get_free_floating_ip
[0][0],
3682 _call_mock_get_free_floating_ip
[1][0],
3689 _call_mock_get_free_floating_ip
[2][0],
3695 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 3)
3696 self
.vimconn
.nova
.servers
.get
.assert_not_called()
3697 mock_create_floating_ip
.assert_not_called()
3698 self
.assertEqual(mock_assign_floating_ip
.call_count
, 2)
3699 _call_mock_assign_floating_ip
= mock_assign_floating_ip
.call_args_list
3701 _call_mock_assign_floating_ip
[0][0],
3702 ("r08b73-o9cc-1a6a-a270-12cc4811bd4u", floating_network
),
3705 _call_mock_assign_floating_ip
[1][0],
3706 ("y08b73-o9cc-1a6a-a270-12cc4811bd4u", floating_network
),
3710 @patch("time.sleep")
3711 @patch.object(vimconnector
, "_create_floating_ip")
3712 @patch.object(vimconnector
, "_get_free_floating_ip")
3713 @patch.object(vimconnector
, "_assign_floating_ip")
3714 def test_prepare_external_network_for_vm_instance_neutron_show_fip_exception_vm_status_in_error(
3716 mock_assign_floating_ip
,
3717 mock_get_free_floating_ip
,
3718 mock_create_floating_ip
,
3722 """Neutron show floating ip gives exception, exit_on_floating_ip_error set to True,
3723 VM status is in error."""
3724 floating_network
= {
3725 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3726 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3727 "exit_on_floating_ip_error": True,
3729 external_network
= [floating_network
]
3731 vm_start_time
= time_return_value
3733 mock_time
.side_effect
= [156570150, 156570800, 156571200]
3735 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3736 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3737 Exception("Floating ip could not be shown.")
3739 with self
.assertRaises(Exception) as err
:
3740 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3741 external_network
, self
.server
, created_items
, vm_start_time
3745 "Cannot create floating_ip: Exception Floating ip could not be shown.",
3748 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 4)
3749 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3751 _call_mock_get_free_floating_ip
[0][0],
3758 _call_mock_get_free_floating_ip
[1][0],
3765 _call_mock_get_free_floating_ip
[2][0],
3772 _call_mock_get_free_floating_ip
[3][0],
3779 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 4)
3780 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
3781 mock_create_floating_ip
.assert_not_called()
3782 mock_assign_floating_ip
.assert_not_called()
3783 mock_time
.assert_not_called()
3784 mock_sleep
.assert_not_called()
3787 @patch("time.sleep")
3788 @patch.object(vimconnector
, "_create_floating_ip")
3789 @patch.object(vimconnector
, "_get_free_floating_ip")
3790 @patch.object(vimconnector
, "_assign_floating_ip")
3791 def test_prepare_external_network_for_vm_instance_neutron_show_fip_exception_vm_status_in_active(
3793 mock_assign_floating_ip
,
3794 mock_get_free_floating_ip
,
3795 mock_create_floating_ip
,
3799 """Neutron show floating ip gives exception, exit_on_floating_ip_error is set to False,
3800 VM status is in active."""
3801 floating_network
= {
3802 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3803 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3804 "exit_on_floating_ip_error": False,
3806 external_network
= [floating_network
]
3808 vm_start_time
= time_return_value
3810 mock_time
.side_effect
= [156570150, 156570800, 156571200]
3812 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ACTIVE"
3813 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3814 Exception("Floating ip could not be shown.")
3817 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3818 external_network
, self
.server
, created_items
, vm_start_time
3820 # self.assertEqual(str(err.exception), "Cannot create floating_ip")
3822 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 4)
3823 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3825 _call_mock_get_free_floating_ip
[0][0],
3832 _call_mock_get_free_floating_ip
[1][0],
3839 _call_mock_get_free_floating_ip
[2][0],
3846 _call_mock_get_free_floating_ip
[3][0],
3853 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 4)
3854 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
3855 mock_create_floating_ip
.assert_not_called()
3856 mock_assign_floating_ip
.assert_not_called()
3857 mock_time
.assert_not_called()
3858 mock_sleep
.assert_not_called()
3861 @patch("time.sleep")
3862 @patch.object(vimconnector
, "_create_floating_ip")
3863 @patch.object(vimconnector
, "_get_free_floating_ip")
3864 @patch.object(vimconnector
, "_assign_floating_ip")
3865 def test_prepare_external_network_for_vm_instance_neutron_show_fip_exception_exit_on_error(
3867 mock_assign_floating_ip
,
3868 mock_get_free_floating_ip
,
3869 mock_create_floating_ip
,
3873 """Neutron show floating ip gives exception, but exit_on_floating_ip_error is set to True.
3874 VM status is not ACTIVE or ERROR, server timeout happened."""
3875 floating_network
= {
3876 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3877 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3878 "exit_on_floating_ip_error": True,
3880 external_network
= [floating_network
]
3882 vm_start_time
= time_return_value
3883 mock_get_free_floating_ip
.side_effect
= None
3884 mock_time
.side_effect
= [156571790, 156571795, 156571800, 156571805]
3885 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "OTHER"
3886 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3887 Exception("Floating ip could not be shown.")
3890 with self
.assertRaises(VimConnException
) as err
:
3891 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3892 external_network
, self
.server
, created_items
, vm_start_time
3896 "Cannot create floating_ip: Exception Floating ip could not be shown.",
3899 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 3)
3900 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3902 _call_mock_get_free_floating_ip
[0][0],
3909 _call_mock_get_free_floating_ip
[1][0],
3916 _call_mock_get_free_floating_ip
[2][0],
3923 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 3)
3924 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
3925 mock_create_floating_ip
.assert_not_called()
3926 mock_assign_floating_ip
.assert_not_called()
3927 self
.assertEqual(mock_time
.call_count
, 3)
3928 self
.assertEqual(mock_sleep
.call_count
, 2)
3931 @patch("time.sleep")
3932 @patch.object(vimconnector
, "_create_floating_ip")
3933 @patch.object(vimconnector
, "_get_free_floating_ip")
3934 @patch.object(vimconnector
, "_assign_floating_ip")
3935 def test_prepare_external_network_for_vm_instance_assign_floating_ip_exception_exit_on_error(
3937 mock_assign_floating_ip
,
3938 mock_get_free_floating_ip
,
3939 mock_create_floating_ip
,
3943 """Assign floating ip method gives exception, exit_on_floating_ip_error is set to True.
3944 VM status is in ERROR."""
3945 floating_network
= {
3946 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3947 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3948 "exit_on_floating_ip_error": True,
3950 external_network
= [floating_network
]
3952 vm_start_time
= time_return_value
3954 mock_get_free_floating_ip
.side_effect
= [
3955 "y08b73-o9cc-1a6a-a270-12cc4811bd4u"
3958 mock_time
.side_effect
= [156571790, 156571795, 156571800, 156571805]
3960 mock_assign_floating_ip
.side_effect
= [
3961 Exception("Floating ip could not be assigned.")
3964 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3965 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3966 {"floatingip": {"port_id": ""}}
3969 with self
.assertRaises(VimConnException
) as err
:
3970 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3971 external_network
, self
.server
, created_items
, vm_start_time
3975 "Cannot create floating_ip: Exception Floating ip could not be assigned.",
3978 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 4)
3979 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3981 _call_mock_get_free_floating_ip
[0][0],
3988 _call_mock_get_free_floating_ip
[1][0],
3995 _call_mock_get_free_floating_ip
[2][0],
4002 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 4)
4003 self
.vimconn
.neutron
.show_floatingip
.assert_called_with(
4004 "y08b73-o9cc-1a6a-a270-12cc4811bd4u"
4006 self
.assertEqual(self
.vimconn
.nova
.servers
.get
.call_count
, 4)
4007 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
4008 mock_time
.assert_not_called()
4009 mock_sleep
.assert_not_called()
4010 mock_create_floating_ip
.assert_not_called()
4013 @patch("time.sleep")
4014 @patch.object(vimconnector
, "_create_floating_ip")
4015 @patch.object(vimconnector
, "_get_free_floating_ip")
4016 @patch.object(vimconnector
, "_assign_floating_ip")
4017 def test_prepare_external_network_for_vm_instance_empty_external_network_list(
4019 mock_assign_floating_ip
,
4020 mock_get_free_floating_ip
,
4021 mock_create_floating_ip
,
4025 """External network list is empty."""
4026 external_network
= []
4028 vm_start_time
= time_return_value
4030 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
4031 external_network
, self
.server
, created_items
, vm_start_time
4033 mock_create_floating_ip
.assert_not_called()
4034 mock_time
.assert_not_called()
4035 mock_sleep
.assert_not_called()
4036 mock_assign_floating_ip
.assert_not_called()
4037 mock_get_free_floating_ip
.assert_not_called()
4038 self
.vimconn
.neutron
.show
.show_floatingip
.assert_not_called()
4039 self
.vimconn
.nova
.servers
.get
.assert_not_called()
4041 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4042 def test_update_port_security_for_vm_instance(self
, mock_wait_for_vm
):
4043 """no_secured_ports has port and the port has allow-address-pairs."""
4044 no_secured_ports
= [(port2_id
, "allow-address-pairs")]
4046 self
.vimconn
._update
_port
_security
_for
_vminstance
(no_secured_ports
, self
.server
)
4048 mock_wait_for_vm
.assert_called_once_with(self
.server
.id, "ACTIVE")
4050 self
.vimconn
.neutron
.update_port
.assert_called_once_with(
4052 {"port": {"allowed_address_pairs": [{"ip_address": "0.0.0.0/0"}]}},
4055 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4056 def test_update_port_security_for_vm_instance_no_allowed_address_pairs(
4057 self
, mock_wait_for_vm
4059 """no_secured_ports has port and the port does not have allow-address-pairs."""
4060 no_secured_ports
= [(port2_id
, "something")]
4062 self
.vimconn
._update
_port
_security
_for
_vminstance
(no_secured_ports
, self
.server
)
4064 mock_wait_for_vm
.assert_called_once_with(self
.server
.id, "ACTIVE")
4066 self
.vimconn
.neutron
.update_port
.assert_called_once_with(
4068 {"port": {"port_security_enabled": False, "security_groups": None}},
4071 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4072 def test_update_port_security_for_vm_instance_wait_for_vm_raise_exception(
4073 self
, mock_wait_for_vm
4075 """__wait_for_vm raises timeout exception."""
4076 no_secured_ports
= [(port2_id
, "something")]
4078 mock_wait_for_vm
.side_effect
= VimConnException("Timeout waiting for instance.")
4080 with self
.assertRaises(VimConnException
) as err
:
4081 self
.vimconn
._update
_port
_security
_for
_vminstance
(
4082 no_secured_ports
, self
.server
4084 self
.assertEqual(str(err
.exception
), "Timeout waiting for instance.")
4086 mock_wait_for_vm
.assert_called_once_with(self
.server
.id, "ACTIVE")
4088 self
.vimconn
.neutron
.update_port
.assert_not_called()
4090 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4091 def test_update_port_security_for_vm_instance_neutron_update_port_raise_exception(
4092 self
, mock_wait_for_vm
4094 """neutron_update_port method raises exception."""
4095 no_secured_ports
= [(port2_id
, "something")]
4097 self
.vimconn
.neutron
.update_port
.side_effect
= Exception(
4098 "Port security could not be updated."
4101 with self
.assertRaises(VimConnException
) as err
:
4102 self
.vimconn
._update
_port
_security
_for
_vminstance
(
4103 no_secured_ports
, self
.server
4107 "It was not possible to disable port security for port 17472685-f67f-49fd-8722-eabb7692fc22",
4109 mock_wait_for_vm
.assert_called_once_with(self
.server
.id, "ACTIVE")
4111 self
.vimconn
.neutron
.update_port
.assert_called_once_with(
4113 {"port": {"port_security_enabled": False, "security_groups": None}},
4116 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4117 def test_update_port_security_for_vm_instance_empty_port_list(
4118 self
, mock_wait_for_vm
4120 """no_secured_ports list does not have any ports."""
4121 no_secured_ports
= []
4123 self
.vimconn
._update
_port
_security
_for
_vminstance
(no_secured_ports
, self
.server
)
4125 mock_wait_for_vm
.assert_not_called()
4127 self
.vimconn
.neutron
.update_port
.assert_not_called()
4130 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4131 @patch.object(vimconnector
, "_reload_connection")
4132 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4133 @patch.object(vimconnector
, "_create_user_data")
4134 @patch.object(vimconnector
, "_get_vm_availability_zone")
4135 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4136 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4137 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4138 @patch.object(vimconnector
, "delete_vminstance")
4139 @patch.object(vimconnector
, "_format_exception")
4140 def test_new_vm_instance(
4142 mock_format_exception
,
4143 mock_delete_vm_instance
,
4144 mock_prepare_external_network
,
4145 mock_update_port_security
,
4146 mock_prepare_disk_for_vm_instance
,
4147 mock_get_vm_availability_zone
,
4148 mock_create_user_data
,
4149 mock_prepare_network_for_vm_instance
,
4150 mock_reload_connection
,
4151 mock_remove_keep_flag_from_persistent_volumes
,
4154 """New VM instance creation is successful."""
4156 mock_create_user_data
.return_value
= True, "userdata"
4158 mock_get_vm_availability_zone
.return_value
= "nova"
4160 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4162 mock_time
.return_value
= time_return_value
4164 expected_result
= self
.server
.id, {}
4166 result
= self
.vimconn
.new_vminstance(
4172 affinity_group_list
,
4176 availability_zone_index
,
4177 availability_zone_list
,
4179 self
.assertEqual(result
, expected_result
)
4181 mock_reload_connection
.assert_called_once()
4182 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4187 external_network
=[],
4188 no_secured_ports
=[],
4190 mock_create_user_data
.assert_called_once_with(cloud_config
)
4191 mock_get_vm_availability_zone
.assert_called_once_with(
4192 availability_zone_index
, availability_zone_list
4194 mock_prepare_disk_for_vm_instance
.assert_called_once_with(
4196 existing_vim_volumes
=[],
4199 block_device_mapping
={},
4200 disk_list
=disk_list2
,
4202 self
.vimconn
.nova
.servers
.create
.assert_called_once_with(
4207 security_groups
="default",
4208 availability_zone
="nova",
4209 key_name
="my_keypair",
4210 userdata
="userdata",
4212 block_device_mapping
={},
4215 mock_time
.assert_called_once()
4216 mock_update_port_security
.assert_called_once_with([], self
.server
)
4217 mock_prepare_external_network
.assert_called_once_with(
4218 external_network
=[],
4221 vm_start_time
=time_return_value
,
4223 mock_remove_keep_flag_from_persistent_volumes
.assert_not_called()
4224 mock_delete_vm_instance
.assert_not_called()
4225 mock_format_exception
.assert_not_called()
4228 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4229 @patch.object(vimconnector
, "_reload_connection")
4230 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4231 @patch.object(vimconnector
, "_create_user_data")
4232 @patch.object(vimconnector
, "_get_vm_availability_zone")
4233 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4234 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4235 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4236 @patch.object(vimconnector
, "delete_vminstance")
4237 @patch.object(vimconnector
, "_format_exception")
4238 def test_new_vm_instance_create_user_data_fails(
4240 mock_format_exception
,
4241 mock_delete_vm_instance
,
4242 mock_prepare_external_network
,
4243 mock_update_port_security
,
4244 mock_prepare_disk_for_vm_instance
,
4245 mock_get_vm_availability_zone
,
4246 mock_create_user_data
,
4247 mock_prepare_network_for_vm_instance
,
4248 mock_reload_connection
,
4249 mock_remove_keep_flag_from_persistent_volumes
,
4252 """New VM instance creation failed because of user data creation failure."""
4254 mock_create_user_data
.side_effect
= Exception(
4255 "User data could not be retrieved."
4258 mock_get_vm_availability_zone
.return_value
= "nova"
4260 mock_remove_keep_flag_from_persistent_volumes
.return_value
= {}
4262 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4264 mock_time
.return_value
= time_return_value
4266 self
.vimconn
.new_vminstance(
4272 affinity_group_list
,
4276 availability_zone_index
,
4277 availability_zone_list
,
4280 mock_reload_connection
.assert_called_once()
4281 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4286 external_network
=[],
4287 no_secured_ports
=[],
4289 mock_create_user_data
.assert_called_once_with(cloud_config
)
4290 mock_get_vm_availability_zone
.assert_not_called()
4291 mock_prepare_disk_for_vm_instance
.assert_not_called()
4292 self
.vimconn
.nova
.servers
.create
.assert_not_called()
4293 mock_time
.assert_not_called()
4294 mock_update_port_security
.assert_not_called()
4295 mock_prepare_external_network
.assert_not_called()
4296 mock_remove_keep_flag_from_persistent_volumes
.assert_called_once_with({})
4297 mock_delete_vm_instance
.assert_called_once_with(None, {})
4298 mock_format_exception
.assert_called_once()
4299 arg
= mock_format_exception
.call_args
[0][0]
4300 self
.assertEqual(str(arg
), "User data could not be retrieved.")
4303 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4304 @patch.object(vimconnector
, "_reload_connection")
4305 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4306 @patch.object(vimconnector
, "_create_user_data")
4307 @patch.object(vimconnector
, "_get_vm_availability_zone")
4308 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4309 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4310 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4311 @patch.object(vimconnector
, "delete_vminstance")
4312 @patch.object(vimconnector
, "_format_exception")
4313 def test_new_vm_instance_external_network_exception(
4315 mock_format_exception
,
4316 mock_delete_vm_instance
,
4317 mock_prepare_external_network
,
4318 mock_update_port_security
,
4319 mock_prepare_disk_for_vm_instance
,
4320 mock_get_vm_availability_zone
,
4321 mock_create_user_data
,
4322 mock_prepare_network_for_vm_instance
,
4323 mock_reload_connection
,
4324 mock_remove_keep_flag_from_persistent_volumes
,
4327 """New VM instance creation, external network connection has failed as floating
4328 ip could not be created."""
4330 mock_create_user_data
.return_value
= True, "userdata"
4332 mock_get_vm_availability_zone
.return_value
= "nova"
4334 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4336 mock_time
.return_value
= time_return_value
4338 mock_remove_keep_flag_from_persistent_volumes
.return_value
= {}
4340 mock_prepare_external_network
.side_effect
= VimConnException(
4341 "Can not create floating ip."
4344 self
.vimconn
.new_vminstance(
4350 affinity_group_list
,
4354 availability_zone_index
,
4355 availability_zone_list
,
4358 mock_reload_connection
.assert_called_once()
4359 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4364 external_network
=[],
4365 no_secured_ports
=[],
4367 mock_create_user_data
.assert_called_once_with(cloud_config
)
4368 mock_get_vm_availability_zone
.assert_called_once_with(
4369 availability_zone_index
, availability_zone_list
4371 mock_prepare_disk_for_vm_instance
.assert_called_once_with(
4373 existing_vim_volumes
=[],
4376 block_device_mapping
={},
4377 disk_list
=disk_list2
,
4379 self
.vimconn
.nova
.servers
.create
.assert_called_once_with(
4384 security_groups
="default",
4385 availability_zone
="nova",
4386 key_name
="my_keypair",
4387 userdata
="userdata",
4389 block_device_mapping
={},
4392 mock_time
.assert_called_once()
4393 mock_update_port_security
.assert_called_once_with([], self
.server
)
4394 mock_prepare_external_network
.assert_called_once_with(
4395 external_network
=[],
4398 vm_start_time
=time_return_value
,
4400 mock_remove_keep_flag_from_persistent_volumes
.assert_called_once_with({})
4401 mock_delete_vm_instance
.assert_called_once_with(self
.server
.id, {})
4402 mock_format_exception
.assert_called_once()
4403 arg
= mock_format_exception
.call_args
[0][0]
4404 self
.assertEqual(str(arg
), "Can not create floating ip.")
4407 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4408 @patch.object(vimconnector
, "_reload_connection")
4409 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4410 @patch.object(vimconnector
, "_create_user_data")
4411 @patch.object(vimconnector
, "_get_vm_availability_zone")
4412 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4413 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4414 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4415 @patch.object(vimconnector
, "delete_vminstance")
4416 @patch.object(vimconnector
, "_format_exception")
4417 def test_new_vm_instance_with_affinity_group(
4419 mock_format_exception
,
4420 mock_delete_vm_instance
,
4421 mock_prepare_external_network
,
4422 mock_update_port_security
,
4423 mock_prepare_disk_for_vm_instance
,
4424 mock_get_vm_availability_zone
,
4425 mock_create_user_data
,
4426 mock_prepare_network_for_vm_instance
,
4427 mock_reload_connection
,
4428 mock_remove_keep_flag_from_persistent_volumes
,
4431 """New VM creation with affinity group."""
4432 affinity_group_list
= [
4433 {"affinity_group_id": "38b73-e9cc-5a6a-t270-82cc4811bd4a"}
4435 mock_create_user_data
.return_value
= True, "userdata"
4436 mock_get_vm_availability_zone
.return_value
= "nova"
4437 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4438 mock_time
.return_value
= time_return_value
4439 expected_result
= self
.server
.id, {}
4441 result
= self
.vimconn
.new_vminstance(
4447 affinity_group_list
,
4451 availability_zone_index
,
4452 availability_zone_list
,
4454 self
.assertEqual(result
, expected_result
)
4456 mock_reload_connection
.assert_called_once()
4457 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4462 external_network
=[],
4463 no_secured_ports
=[],
4465 mock_create_user_data
.assert_called_once_with(cloud_config
)
4466 mock_get_vm_availability_zone
.assert_called_once_with(
4467 availability_zone_index
, availability_zone_list
4469 mock_prepare_disk_for_vm_instance
.assert_called_once_with(
4471 existing_vim_volumes
=[],
4474 block_device_mapping
={},
4475 disk_list
=disk_list2
,
4477 self
.vimconn
.nova
.servers
.create
.assert_called_once_with(
4482 security_groups
="default",
4483 availability_zone
="nova",
4484 key_name
="my_keypair",
4485 userdata
="userdata",
4487 block_device_mapping
={},
4488 scheduler_hints
={"group": "38b73-e9cc-5a6a-t270-82cc4811bd4a"},
4490 mock_time
.assert_called_once()
4491 mock_update_port_security
.assert_called_once_with([], self
.server
)
4492 mock_prepare_external_network
.assert_called_once_with(
4493 external_network
=[],
4496 vm_start_time
=time_return_value
,
4498 mock_remove_keep_flag_from_persistent_volumes
.assert_not_called()
4499 mock_delete_vm_instance
.assert_not_called()
4500 mock_format_exception
.assert_not_called()
4503 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4504 @patch.object(vimconnector
, "_reload_connection")
4505 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4506 @patch.object(vimconnector
, "_create_user_data")
4507 @patch.object(vimconnector
, "_get_vm_availability_zone")
4508 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4509 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4510 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4511 @patch.object(vimconnector
, "delete_vminstance")
4512 @patch.object(vimconnector
, "_format_exception")
4513 def test_new_vm_instance_nova_server_create_failed(
4515 mock_format_exception
,
4516 mock_delete_vm_instance
,
4517 mock_prepare_external_network
,
4518 mock_update_port_security
,
4519 mock_prepare_disk_for_vm_instance
,
4520 mock_get_vm_availability_zone
,
4521 mock_create_user_data
,
4522 mock_prepare_network_for_vm_instance
,
4523 mock_reload_connection
,
4524 mock_remove_keep_flag_from_persistent_volumes
,
4527 """New VM(server) creation failed."""
4529 mock_create_user_data
.return_value
= True, "userdata"
4531 mock_get_vm_availability_zone
.return_value
= "nova"
4533 self
.vimconn
.nova
.servers
.create
.side_effect
= Exception(
4534 "Server could not be created."
4537 mock_time
.return_value
= time_return_value
4539 mock_remove_keep_flag_from_persistent_volumes
.return_value
= {}
4541 self
.vimconn
.new_vminstance(
4547 affinity_group_list
,
4551 availability_zone_index
,
4552 availability_zone_list
,
4555 mock_reload_connection
.assert_called_once()
4556 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4561 external_network
=[],
4562 no_secured_ports
=[],
4564 mock_create_user_data
.assert_called_once_with(cloud_config
)
4565 mock_get_vm_availability_zone
.assert_called_once_with(
4566 availability_zone_index
, availability_zone_list
4568 mock_prepare_disk_for_vm_instance
.assert_called_once_with(
4570 existing_vim_volumes
=[],
4573 block_device_mapping
={},
4574 disk_list
=disk_list2
,
4577 self
.vimconn
.nova
.servers
.create
.assert_called_once_with(
4582 security_groups
="default",
4583 availability_zone
="nova",
4584 key_name
="my_keypair",
4585 userdata
="userdata",
4587 block_device_mapping
={},
4590 mock_time
.assert_not_called()
4591 mock_update_port_security
.assert_not_called()
4592 mock_prepare_external_network
.assert_not_called()
4593 mock_remove_keep_flag_from_persistent_volumes
.assert_called_once_with({})
4594 mock_delete_vm_instance
.assert_called_once_with(None, {})
4595 mock_format_exception
.assert_called_once()
4596 arg
= mock_format_exception
.call_args
[0][0]
4597 self
.assertEqual(str(arg
), "Server could not be created.")
4600 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4601 @patch.object(vimconnector
, "_reload_connection")
4602 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4603 @patch.object(vimconnector
, "_create_user_data")
4604 @patch.object(vimconnector
, "_get_vm_availability_zone")
4605 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4606 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4607 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4608 @patch.object(vimconnector
, "delete_vminstance")
4609 @patch.object(vimconnector
, "_format_exception")
4610 def test_new_vm_instance_connection_exception(
4612 mock_format_exception
,
4613 mock_delete_vm_instance
,
4614 mock_prepare_external_network
,
4615 mock_update_port_security
,
4616 mock_prepare_disk_for_vm_instance
,
4617 mock_get_vm_availability_zone
,
4618 mock_create_user_data
,
4619 mock_prepare_network_for_vm_instance
,
4620 mock_reload_connection
,
4621 mock_remove_keep_flag_from_persistent_volumes
,
4624 """Connection to Cloud API has failed."""
4625 mock_reload_connection
.side_effect
= Exception("Can not connect to Cloud APIs.")
4626 mock_create_user_data
.return_value
= True, "userdata"
4627 mock_get_vm_availability_zone
.return_value
= "nova"
4628 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4629 mock_time
.return_value
= time_return_value
4630 mock_remove_keep_flag_from_persistent_volumes
.return_value
= {}
4632 self
.vimconn
.new_vminstance(
4638 affinity_group_list
,
4642 availability_zone_index
,
4643 availability_zone_list
,
4645 mock_format_exception
.assert_called_once()
4646 arg
= mock_format_exception
.call_args
[0][0]
4647 self
.assertEqual(str(arg
), "Can not connect to Cloud APIs.")
4648 mock_reload_connection
.assert_called_once()
4649 mock_prepare_network_for_vm_instance
.assert_not_called()
4650 mock_create_user_data
.assert_not_called()
4651 mock_get_vm_availability_zone
.assert_not_called()
4652 mock_prepare_disk_for_vm_instance
.assert_not_called()
4653 self
.vimconn
.nova
.servers
.create
.assert_not_called()
4654 mock_time
.assert_not_called()
4655 mock_update_port_security
.assert_not_called()
4656 mock_prepare_external_network
.assert_not_called()
4657 mock_remove_keep_flag_from_persistent_volumes
.assert_called_once_with({})
4658 mock_delete_vm_instance
.assert_called_once_with(None, {})
4660 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4661 def test_delete_vm_ports_attached_to_network_empty_created_items(
4662 self
, mock_delete_ports_by_id_wth_neutron
4664 """Created_items is emtpty."""
4666 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4667 self
.vimconn
.neutron
.list_ports
.assert_not_called()
4668 self
.vimconn
.neutron
.delete_port
.assert_not_called()
4669 mock_delete_ports_by_id_wth_neutron
.assert_not_called()
4671 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4672 def test_delete_vm_ports_attached_to_network(
4673 self
, mock_delete_ports_by_id_wth_neutron
4676 "floating_ip:308b73-t9cc-1a6a-a270-12cc4811bd4a": True,
4677 f
"volume:{volume_id2}": True,
4678 f
"volume:{volume_id}": True,
4679 f
"port:{port_id}": True,
4681 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4682 mock_delete_ports_by_id_wth_neutron
.assert_called_once_with(f
"{port_id}")
4683 self
.vimconn
.logger
.error
.assert_not_called()
4685 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4686 def test_delete_vm_ports_attached_to_network_wthout_port(
4687 self
, mock_delete_ports_by_id_wth_neutron
4689 """Created_items does not have port."""
4691 f
"floating_ip:{floating_network_vim_id}": True,
4692 f
"volume:{volume_id2}": True,
4693 f
"volume:{volume_id}": True,
4695 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4696 mock_delete_ports_by_id_wth_neutron
.assert_not_called()
4697 self
.vimconn
.logger
.error
.assert_not_called()
4699 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4700 def test_delete_vm_ports_attached_to_network_delete_port_raise_vimconnexception(
4701 self
, mock_delete_ports_by_id_wth_neutron
4703 """_delete_ports_by_id_wth_neutron raises vimconnexception."""
4704 created_items
= deepcopy(created_items_all_true
)
4705 mock_delete_ports_by_id_wth_neutron
.side_effect
= VimConnException(
4706 "Can not delete port"
4708 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4709 mock_delete_ports_by_id_wth_neutron
.assert_called_once_with(f
"{port_id}")
4710 self
.vimconn
.logger
.error
.assert_called_once_with(
4711 "Error deleting port: VimConnException: Can not delete port"
4714 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4715 def test_delete_vm_ports_attached_to_network_delete_port_raise_nvexception(
4716 self
, mock_delete_ports_by_id_wth_neutron
4718 """_delete_ports_by_id_wth_neutron raises nvExceptions.ClientException."""
4719 created_items
= deepcopy(created_items_all_true
)
4720 mock_delete_ports_by_id_wth_neutron
.side_effect
= nvExceptions
.ClientException(
4721 "Connection aborted."
4723 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4724 mock_delete_ports_by_id_wth_neutron
.assert_called_once_with(f
"{port_id}")
4725 self
.vimconn
.logger
.error
.assert_called_once_with(
4726 "Error deleting port: ClientException: Unknown Error (HTTP Connection aborted.)"
4729 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4730 def test_delete_vm_ports_attached_to_network_delete_port_invalid_port_item(
4731 self
, mock_delete_ports_by_id_wth_neutron
4733 """port item is invalid."""
4735 f
"floating_ip:{floating_network_vim_id}": True,
4736 f
"volume:{volume_id2}": True,
4737 f
"volume:{volume_id}": True,
4738 f
"port:{port_id}:": True,
4740 mock_delete_ports_by_id_wth_neutron
.side_effect
= VimConnException(
4741 "Port is not valid."
4743 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4744 mock_delete_ports_by_id_wth_neutron
.assert_called_once_with(f
"{port_id}:")
4745 self
.vimconn
.logger
.error
.assert_called_once_with(
4746 "Error deleting port: VimConnException: Port is not valid."
4749 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4750 def test_delete_vm_ports_attached_to_network_delete_port_already_deleted(
4751 self
, mock_delete_ports_by_id_wth_neutron
4753 """port is already deleted."""
4755 f
"floating_ip:{floating_network_vim_id}": True,
4756 f
"volume:{volume_id2}": True,
4757 f
"volume:{volume_id}": None,
4758 f
"port:{port_id}": None,
4760 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4761 mock_delete_ports_by_id_wth_neutron
.assert_not_called()
4762 self
.vimconn
.logger
.error
.assert_not_called()
4764 def test_delete_floating_ip_by_id(self
):
4766 f
"floating_ip:{floating_network_vim_id}": True,
4767 f
"port:{port_id}": True,
4769 expected_created_items
= {
4770 f
"floating_ip:{floating_network_vim_id}": None,
4771 f
"port:{port_id}": True,
4773 k_id
= floating_network_vim_id
4774 k
= f
"floating_ip:{floating_network_vim_id}"
4775 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4776 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4777 self
.assertEqual(created_items
, expected_created_items
)
4779 def test_delete_floating_ip_by_id_floating_ip_already_deleted(self
):
4780 """floating ip is already deleted."""
4782 f
"floating_ip:{floating_network_vim_id}": None,
4783 f
"port:{port_id}": True,
4785 k_id
= floating_network_vim_id
4786 k
= f
"floating_ip:{floating_network_vim_id}"
4787 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4788 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4792 f
"floating_ip:{floating_network_vim_id}": None,
4793 f
"port:{port_id}": True,
4797 def test_delete_floating_ip_by_id_floating_ip_raises_nvexception(self
):
4798 """netron delete floating ip raises nvExceptions.ClientException."""
4800 f
"floating_ip:{floating_network_vim_id}": True,
4801 f
"port:{port_id}": True,
4803 k_id
= floating_network_vim_id
4804 k
= f
"floating_ip:{floating_network_vim_id}"
4805 self
.vimconn
.neutron
.delete_floatingip
.side_effect
= (
4806 nvExceptions
.ClientException("Client exception occurred.")
4808 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4809 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4813 f
"floating_ip:{floating_network_vim_id}": True,
4814 f
"port:{port_id}": True,
4817 self
.vimconn
.logger
.error
.assert_called_once_with(
4818 "Error deleting floating ip: ClientException: Unknown Error (HTTP Client exception occurred.)"
4821 def test_delete_floating_ip_by_id_floating_ip_raises_vimconnexception(self
):
4822 """netron delete floating ip raises VimConnNotFoundException."""
4824 f
"floating_ip:{floating_network_vim_id}": True,
4825 f
"port:{port_id}": True,
4827 k_id
= floating_network_vim_id
4828 k
= f
"floating_ip:{floating_network_vim_id}"
4829 self
.vimconn
.neutron
.delete_floatingip
.side_effect
= VimConnNotFoundException(
4830 "Port id could not found."
4832 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4833 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4837 f
"floating_ip:{floating_network_vim_id}": True,
4838 f
"port:{port_id}": True,
4841 self
.vimconn
.logger
.error
.assert_called_once_with(
4842 "Error deleting floating ip: VimConnNotFoundException: Port id could not found."
4845 def test_delete_floating_ip_by_id_floating_ip_invalid_k_item(self
):
4846 """invalid floating ip item."""
4848 f
"floating_ip:{floating_network_vim_id}": True,
4849 f
"port:{port_id}": True,
4851 expected_created_items
= {
4852 f
"floating_ip:{floating_network_vim_id}::": None,
4853 f
"floating_ip:{floating_network_vim_id}": True,
4854 f
"port:{port_id}": True,
4856 k_id
= floating_network_vim_id
4857 k
= f
"floating_ip:{floating_network_vim_id}::"
4858 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4859 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4860 self
.assertEqual(created_items
, expected_created_items
)
4862 def test_delete_volumes_by_id_with_cinder_volume_status_available(self
):
4863 """volume status is available."""
4865 f
"floating_ip:{floating_network_vim_id}": True,
4866 f
"volume:{volume_id2}": True,
4867 f
"volume:{volume_id}": True,
4868 f
"port:{port_id}": None,
4870 expected_created_items
= {
4871 f
"floating_ip:{floating_network_vim_id}": True,
4872 f
"volume:{volume_id2}": True,
4873 f
"volume:{volume_id}": None,
4874 f
"port:{port_id}": None,
4876 volumes_to_hold
= []
4877 k
= f
"volume:{volume_id}"
4879 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
4880 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4881 k
, k_id
, volumes_to_hold
, created_items
4883 self
.assertEqual(result
, None)
4884 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
4885 self
.vimconn
.cinder
.volumes
.delete
.assert_called_once_with(k_id
)
4886 self
.vimconn
.logger
.error
.assert_not_called()
4887 self
.assertEqual(created_items
, expected_created_items
)
4889 def test_delete_volumes_by_id_with_cinder_volume_already_deleted(self
):
4890 """volume is already deleted."""
4892 f
"floating_ip:{floating_network_vim_id}": True,
4893 f
"volume:{volume_id2}": True,
4894 f
"volume:{volume_id}": None,
4895 f
"port:{port_id}": None,
4897 expected_created_items
= {
4898 f
"floating_ip:{floating_network_vim_id}": True,
4899 f
"volume:{volume_id2}": True,
4900 f
"volume:{volume_id}": None,
4901 f
"port:{port_id}": None,
4903 volumes_to_hold
= []
4904 k
= f
"volume:{volume_id}"
4906 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
4907 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4908 k
, k_id
, volumes_to_hold
, created_items
4910 self
.assertEqual(result
, None)
4911 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
4912 self
.vimconn
.cinder
.volumes
.delete
.assert_called_once_with(k_id
)
4913 self
.vimconn
.logger
.error
.assert_not_called()
4914 self
.assertEqual(created_items
, expected_created_items
)
4916 def test_delete_volumes_by_id_with_cinder_get_volume_raise_exception(self
):
4917 """cinder get volume raises exception."""
4919 f
"floating_ip:{floating_network_vim_id}": True,
4920 f
"volume:{volume_id2}": True,
4921 f
"volume:{volume_id}": True,
4922 f
"port:{port_id}": None,
4924 expected_created_items
= {
4925 f
"floating_ip:{floating_network_vim_id}": True,
4926 f
"volume:{volume_id2}": True,
4927 f
"volume:{volume_id}": True,
4928 f
"port:{port_id}": None,
4930 volumes_to_hold
= []
4931 k
= f
"volume:{volume_id}"
4933 self
.vimconn
.cinder
.volumes
.get
.side_effect
= Exception(
4934 "Can not get volume status."
4936 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4937 k
, k_id
, volumes_to_hold
, created_items
4939 self
.assertEqual(result
, None)
4940 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
4941 self
.vimconn
.cinder
.volumes
.delete
.assert_not_called()
4942 self
.vimconn
.logger
.error
.assert_called_once_with(
4943 "Error deleting volume: Exception: Can not get volume status."
4945 self
.assertEqual(created_items
, expected_created_items
)
4947 def test_delete_volumes_by_id_with_cinder_delete_volume_raise_exception(self
):
4948 """cinder delete volume raises exception."""
4950 f
"floating_ip:{floating_network_vim_id}": True,
4951 f
"volume:{volume_id2}": True,
4952 f
"volume:{volume_id}": True,
4953 f
"port:{port_id}": None,
4955 expected_created_items
= {
4956 f
"floating_ip:{floating_network_vim_id}": True,
4957 f
"volume:{volume_id2}": True,
4958 f
"volume:{volume_id}": True,
4959 f
"port:{port_id}": None,
4961 volumes_to_hold
= []
4962 k
= f
"volume:{volume_id}"
4964 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
4965 self
.vimconn
.cinder
.volumes
.delete
.side_effect
= nvExceptions
.ClientException(
4966 "Connection aborted."
4968 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4969 k
, k_id
, volumes_to_hold
, created_items
4971 self
.assertEqual(result
, None)
4972 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
4973 self
.vimconn
.cinder
.volumes
.delete
.assert_called_once_with(k_id
)
4974 self
.vimconn
.logger
.error
.assert_called_once_with(
4975 "Error deleting volume: ClientException: Unknown Error (HTTP Connection aborted.)"
4977 self
.assertEqual(created_items
, expected_created_items
)
4979 def test_delete_volumes_by_id_with_cinder_volume_to_be_hold(self
):
4980 """volume_to_hold has item."""
4982 f
"floating_ip:{floating_network_vim_id}": True,
4983 f
"volume:{volume_id2}": True,
4984 f
"volume:{volume_id}": True,
4985 f
"port:{port_id}": None,
4987 expected_created_items
= {
4988 f
"floating_ip:{floating_network_vim_id}": True,
4989 f
"volume:{volume_id2}": True,
4990 f
"volume:{volume_id}": True,
4991 f
"port:{port_id}": None,
4993 volumes_to_hold
= [volume_id
]
4994 k
= f
"volume:{volume_id}"
4996 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4997 k
, k_id
, volumes_to_hold
, created_items
4999 self
.assertEqual(result
, None)
5000 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
5001 self
.vimconn
.cinder
.volumes
.delete
.assert_not_called()
5002 self
.vimconn
.logger
.error
.assert_not_called()
5003 self
.assertEqual(created_items
, expected_created_items
)
5005 def test_delete_volumes_by_id_with_cinder_volume_status_not_available(self
):
5006 """volume status is not available."""
5008 f
"floating_ip:{floating_network_vim_id}": True,
5009 f
"volume:{volume_id2}": True,
5010 f
"volume:{volume_id}": True,
5011 f
"port:{port_id}": None,
5013 expected_created_items
= {
5014 f
"floating_ip:{floating_network_vim_id}": True,
5015 f
"volume:{volume_id2}": True,
5016 f
"volume:{volume_id}": True,
5017 f
"port:{port_id}": None,
5019 volumes_to_hold
= []
5020 k
= f
"volume:{volume_id}"
5022 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "unavailable"
5023 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
5024 k
, k_id
, volumes_to_hold
, created_items
5026 self
.assertEqual(result
, True)
5027 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
5028 self
.vimconn
.cinder
.volumes
.delete
.assert_not_called()
5029 self
.vimconn
.logger
.error
.assert_not_called()
5030 self
.assertEqual(created_items
, expected_created_items
)
5032 def test_delete_ports_by_id_by_neutron(self
):
5033 """neutron delete ports."""
5035 self
.vimconn
.neutron
.list_ports
.return_value
= {
5036 "ports": [{"id": port_id
}, {"id": port2_id
}]
5039 self
.vimconn
._delete
_ports
_by
_id
_wth
_neutron
(k_id
)
5040 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5041 self
.vimconn
.neutron
.delete_port
.assert_called_once_with(k_id
)
5042 self
.vimconn
.logger
.error
.assert_not_called()
5044 def test_delete_ports_by_id_by_neutron_id_not_in_port_list(self
):
5045 """port id not in the port list."""
5047 self
.vimconn
.neutron
.list_ports
.return_value
= {
5048 "ports": [{"id": port_id
}, {"id": port2_id
}]
5051 self
.vimconn
._delete
_ports
_by
_id
_wth
_neutron
(k_id
)
5052 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5053 self
.vimconn
.neutron
.delete_port
.assert_not_called()
5054 self
.vimconn
.logger
.error
.assert_not_called()
5056 def test_delete_ports_by_id_by_neutron_list_port_raise_exception(self
):
5057 """neutron list port raises exception."""
5059 self
.vimconn
.neutron
.list_ports
.side_effect
= nvExceptions
.ClientException(
5060 "Connection aborted."
5062 self
.vimconn
._delete
_ports
_by
_id
_wth
_neutron
(k_id
)
5063 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5064 self
.vimconn
.neutron
.delete_port
.assert_not_called()
5065 self
.vimconn
.logger
.error
.assert_called_once_with(
5066 "Error deleting port: ClientException: Unknown Error (HTTP Connection aborted.)"
5069 def test_delete_ports_by_id_by_neutron_delete_port_raise_exception(self
):
5070 """neutron delete port raises exception."""
5072 self
.vimconn
.neutron
.list_ports
.return_value
= {
5073 "ports": [{"id": port_id
}, {"id": port2_id
}]
5075 self
.vimconn
.neutron
.delete_port
.side_effect
= nvExceptions
.ClientException(
5076 "Connection aborted."
5078 self
.vimconn
._delete
_ports
_by
_id
_wth
_neutron
(k_id
)
5079 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5080 self
.vimconn
.neutron
.delete_port
.assert_called_once_with(k_id
)
5081 self
.vimconn
.logger
.error
.assert_called_once_with(
5082 "Error deleting port: ClientException: Unknown Error (HTTP Connection aborted.)"
5085 def test_get_item_name_id(self
):
5086 """Get name and id successfully."""
5087 k
= f
"some:{port_id}"
5088 result
= self
.vimconn
._get
_item
_name
_id
(k
)
5089 self
.assertEqual(result
, ("some", f
"{port_id}"))
5091 def test_get_item_name_id_wthout_semicolon(self
):
5092 """Does not have seperator."""
5093 k
= f
"some{port_id}"
5094 result
= self
.vimconn
._get
_item
_name
_id
(k
)
5095 self
.assertEqual(result
, (f
"some{port_id}", ""))
5097 def test_get_item_name_id_empty_string(self
):
5100 result
= self
.vimconn
._get
_item
_name
_id
(k
)
5101 self
.assertEqual(result
, ("", ""))
5103 def test_get_item_name_id_k_is_none(self
):
5106 with self
.assertRaises(AttributeError):
5107 self
.vimconn
._get
_item
_name
_id
(k
)
5109 @patch.object(vimconnector
, "_get_item_name_id")
5110 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5111 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5112 def test_delete_created_items(
5114 mock_delete_floating_ip_by_id
,
5115 mock_delete_volumes_by_id_wth_cinder
,
5116 mock_get_item_name_id
,
5118 """Created items has floating ip and volume."""
5120 f
"floating_ip:{floating_network_vim_id}": True,
5121 f
"volume:{volume_id}": True,
5122 f
"port:{port_id}": None,
5124 mock_get_item_name_id
.side_effect
= [
5125 ("floating_ip", f
"{floating_network_vim_id}"),
5126 ("volume", f
"{volume_id}"),
5128 mock_delete_volumes_by_id_wth_cinder
.return_value
= True
5129 volumes_to_hold
= []
5130 keep_waiting
= False
5131 result
= self
.vimconn
._delete
_created
_items
(
5132 created_items
, volumes_to_hold
, keep_waiting
5134 self
.assertEqual(result
, True)
5135 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5136 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5137 f
"volume:{volume_id}", f
"{volume_id}", [], created_items
5139 mock_delete_floating_ip_by_id
.assert_called_once_with(
5140 f
"floating_ip:{floating_network_vim_id}",
5141 f
"{floating_network_vim_id}",
5144 self
.vimconn
.logger
.error
.assert_not_called()
5146 @patch.object(vimconnector
, "_get_item_name_id")
5147 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5148 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5149 def test_delete_created_items_wth_volumes_to_hold(
5151 mock_delete_floating_ip_by_id
,
5152 mock_delete_volumes_by_id_wth_cinder
,
5153 mock_get_item_name_id
,
5155 """Created items has floating ip and volume and volumes_to_hold has items."""
5157 f
"floating_ip:{floating_network_vim_id}": True,
5158 f
"volume:{volume_id}": True,
5159 f
"port:{port_id}": None,
5161 mock_get_item_name_id
.side_effect
= [
5162 ("floating_ip", f
"{floating_network_vim_id}"),
5163 ("volume", f
"{volume_id}"),
5165 mock_delete_volumes_by_id_wth_cinder
.return_value
= True
5166 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5167 keep_waiting
= False
5168 result
= self
.vimconn
._delete
_created
_items
(
5169 created_items
, volumes_to_hold
, keep_waiting
5171 self
.assertEqual(result
, True)
5172 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5173 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5174 f
"volume:{volume_id}", f
"{volume_id}", volumes_to_hold
, created_items
5176 mock_delete_floating_ip_by_id
.assert_called_once_with(
5177 f
"floating_ip:{floating_network_vim_id}",
5178 f
"{floating_network_vim_id}",
5181 self
.vimconn
.logger
.error
.assert_not_called()
5183 @patch.object(vimconnector
, "_get_item_name_id")
5184 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5185 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5186 def test_delete_created_items_wth_keep_waiting_true(
5188 mock_delete_floating_ip_by_id
,
5189 mock_delete_volumes_by_id_wth_cinder
,
5190 mock_get_item_name_id
,
5192 """Keep waiting initial value is True."""
5194 f
"floating_ip:{floating_network_vim_id}": True,
5195 f
"volume:{volume_id}": True,
5196 f
"port:{port_id}": None,
5198 mock_get_item_name_id
.side_effect
= [
5199 ("floating_ip", f
"{floating_network_vim_id}"),
5200 ("volume", f
"{volume_id}"),
5202 mock_delete_volumes_by_id_wth_cinder
.return_value
= False
5203 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5205 result
= self
.vimconn
._delete
_created
_items
(
5206 created_items
, volumes_to_hold
, keep_waiting
5208 self
.assertEqual(result
, True)
5209 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5210 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5211 f
"volume:{volume_id}", f
"{volume_id}", volumes_to_hold
, created_items
5213 mock_delete_floating_ip_by_id
.assert_called_once_with(
5214 f
"floating_ip:{floating_network_vim_id}",
5215 f
"{floating_network_vim_id}",
5218 self
.vimconn
.logger
.error
.assert_not_called()
5220 @patch.object(vimconnector
, "_get_item_name_id")
5221 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5222 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5223 def test_delete_created_items_delete_vol_raises(
5225 mock_delete_floating_ip_by_id
,
5226 mock_delete_volumes_by_id_wth_cinder
,
5227 mock_get_item_name_id
,
5229 """Delete volume raises exception."""
5231 f
"floating_ip:{floating_network_vim_id}": True,
5232 f
"volume:{volume_id}": True,
5233 f
"port:{port_id}": None,
5235 mock_get_item_name_id
.side_effect
= [
5236 ("floating_ip", f
"{floating_network_vim_id}"),
5237 ("volume", f
"{volume_id}"),
5239 mock_delete_volumes_by_id_wth_cinder
.side_effect
= ConnectionError(
5240 "Connection failed."
5242 volumes_to_hold
= []
5243 keep_waiting
= False
5244 result
= self
.vimconn
._delete
_created
_items
(
5245 created_items
, volumes_to_hold
, keep_waiting
5247 self
.assertEqual(result
, False)
5248 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5249 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5250 f
"volume:{volume_id}", f
"{volume_id}", [], created_items
5252 mock_delete_floating_ip_by_id
.assert_called_once_with(
5253 f
"floating_ip:{floating_network_vim_id}",
5254 f
"{floating_network_vim_id}",
5257 self
.vimconn
.logger
.error
.assert_called_once_with(
5258 "Error deleting volume:ac408b73-b9cc-4a6a-a270-82cc4811bd4a: Connection failed."
5261 @patch.object(vimconnector
, "_get_item_name_id")
5262 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5263 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5264 def test_delete_created_items_delete_fip_raises(
5266 mock_delete_floating_ip_by_id
,
5267 mock_delete_volumes_by_id_wth_cinder
,
5268 mock_get_item_name_id
,
5270 """Delete floating ip raises exception."""
5272 f
"floating_ip:{floating_network_vim_id}": True,
5273 f
"volume:{volume_id}": True,
5274 f
"port:{port_id}": None,
5276 mock_get_item_name_id
.side_effect
= [
5277 ("floating_ip", f
"{floating_network_vim_id}"),
5278 ("volume", f
"{volume_id}"),
5280 mock_delete_volumes_by_id_wth_cinder
.return_value
= False
5281 mock_delete_floating_ip_by_id
.side_effect
= ConnectionError(
5282 "Connection failed."
5284 volumes_to_hold
= []
5286 result
= self
.vimconn
._delete
_created
_items
(
5287 created_items
, volumes_to_hold
, keep_waiting
5289 self
.assertEqual(result
, True)
5290 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5291 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5292 f
"volume:{volume_id}", f
"{volume_id}", [], created_items
5294 mock_delete_floating_ip_by_id
.assert_called_once_with(
5295 f
"floating_ip:{floating_network_vim_id}",
5296 f
"{floating_network_vim_id}",
5299 self
.vimconn
.logger
.error
.assert_called_once_with(
5300 "Error deleting floating_ip:108b73-e9cc-5a6a-t270-82cc4811bd4a: Connection failed."
5303 @patch.object(vimconnector
, "_get_item_name_id")
5304 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5305 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5306 def test_delete_created_items_get_item_name_raises(
5308 mock_delete_floating_ip_by_id
,
5309 mock_delete_volumes_by_id_wth_cinder
,
5310 mock_get_item_name_id
,
5312 """Get item, name raises exception."""
5315 f
"volume{volume_id}": True,
5316 f
"port:{port_id}": None,
5318 mock_get_item_name_id
.side_effect
= [
5319 TypeError("Invalid Type"),
5320 AttributeError("Invalid attribute"),
5322 volumes_to_hold
= []
5323 keep_waiting
= False
5324 result
= self
.vimconn
._delete
_created
_items
(
5325 created_items
, volumes_to_hold
, keep_waiting
5327 self
.assertEqual(result
, False)
5328 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5329 mock_delete_volumes_by_id_wth_cinder
.assert_not_called()
5330 mock_delete_floating_ip_by_id
.assert_not_called()
5331 _call_logger
= self
.vimconn
.logger
.error
.call_args_list
5332 self
.assertEqual(_call_logger
[0][0], ("Error deleting 3: Invalid Type",))
5335 (f
"Error deleting volume{volume_id}: Invalid attribute",),
5338 @patch.object(vimconnector
, "_get_item_name_id")
5339 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5340 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5341 def test_delete_created_items_no_fip_wth_port(
5343 mock_delete_floating_ip_by_id
,
5344 mock_delete_volumes_by_id_wth_cinder
,
5345 mock_get_item_name_id
,
5347 """Created items has port, does not have floating ip."""
5349 f
"volume:{volume_id}": True,
5350 f
"port:{port_id}": True,
5352 mock_get_item_name_id
.side_effect
= [
5353 ("volume", f
"{volume_id}"),
5354 ("port", f
"{port_id}"),
5356 mock_delete_volumes_by_id_wth_cinder
.return_value
= False
5357 volumes_to_hold
= []
5358 keep_waiting
= False
5359 result
= self
.vimconn
._delete
_created
_items
(
5360 created_items
, volumes_to_hold
, keep_waiting
5362 self
.assertEqual(result
, False)
5363 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5364 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5365 f
"volume:{volume_id}", f
"{volume_id}", [], created_items
5367 mock_delete_floating_ip_by_id
.assert_not_called()
5368 self
.vimconn
.logger
.error
.assert_not_called()
5370 @patch.object(vimconnector
, "_get_item_name_id")
5371 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5372 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5373 def test_delete_created_items_no_volume(
5375 mock_delete_floating_ip_by_id
,
5376 mock_delete_volumes_by_id_wth_cinder
,
5377 mock_get_item_name_id
,
5379 """Created items does not have volume."""
5381 f
"floating_ip:{floating_network_vim_id}": True,
5382 f
"port:{port_id}": None,
5384 mock_get_item_name_id
.side_effect
= [
5385 ("floating_ip", f
"{floating_network_vim_id}")
5387 volumes_to_hold
= []
5388 keep_waiting
= False
5389 result
= self
.vimconn
._delete
_created
_items
(
5390 created_items
, volumes_to_hold
, keep_waiting
5392 self
.assertEqual(result
, False)
5393 self
.assertEqual(mock_get_item_name_id
.call_count
, 1)
5394 mock_delete_volumes_by_id_wth_cinder
.assert_not_called()
5395 mock_delete_floating_ip_by_id
.assert_called_once_with(
5396 f
"floating_ip:{floating_network_vim_id}",
5397 f
"{floating_network_vim_id}",
5400 self
.vimconn
.logger
.error
.assert_not_called()
5402 @patch.object(vimconnector
, "_get_item_name_id")
5403 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5404 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5405 def test_delete_created_items_already_deleted(
5407 mock_delete_floating_ip_by_id
,
5408 mock_delete_volumes_by_id_wth_cinder
,
5409 mock_get_item_name_id
,
5411 """All created items are alerady deleted."""
5413 f
"floating_ip:{floating_network_vim_id}": None,
5414 f
"volume:{volume_id}": None,
5415 f
"port:{port_id}": None,
5417 volumes_to_hold
= []
5418 keep_waiting
= False
5419 result
= self
.vimconn
._delete
_created
_items
(
5420 created_items
, volumes_to_hold
, keep_waiting
5422 self
.assertEqual(result
, False)
5423 mock_get_item_name_id
.assert_not_called()
5424 mock_delete_volumes_by_id_wth_cinder
.assert_not_called()
5425 mock_delete_floating_ip_by_id
.assert_not_called()
5426 self
.vimconn
.logger
.error
.assert_not_called()
5428 @patch("time.sleep")
5429 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5430 @patch.object(vimconnector
, "_format_exception")
5431 @patch.object(vimconnector
, "_reload_connection")
5432 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5433 @patch.object(vimconnector
, "_delete_created_items")
5434 def test_delete_vminstance_successfully(
5436 mock_delete_created_items
,
5437 mock_delete_vm_ports_attached_to_network
,
5438 mock_reload_connection
,
5439 mock_format_exception
,
5440 mock_extract_items_wth_keep_flag_from_created_items
,
5443 vm_id
= f
"{virtual_mac_id}"
5444 created_items
= deepcopy(created_items_all_true
)
5445 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5446 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5447 mock_delete_created_items
.return_value
= False
5448 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5449 mock_reload_connection
.assert_called_once()
5450 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5451 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5452 mock_delete_created_items
.assert_called_once_with(
5453 created_items
, volumes_to_hold
, False
5455 mock_sleep
.assert_not_called()
5456 mock_format_exception
.assert_not_called()
5457 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5461 @patch("time.sleep")
5462 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5463 @patch.object(vimconnector
, "_format_exception")
5464 @patch.object(vimconnector
, "_reload_connection")
5465 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5466 @patch.object(vimconnector
, "_delete_created_items")
5467 def test_delete_vminstance_created_items_has_keep_flag(
5469 mock_delete_created_items
,
5470 mock_delete_vm_ports_attached_to_network
,
5471 mock_reload_connection
,
5472 mock_format_exception
,
5473 mock_extract_items_wth_keep_flag_from_created_items
,
5476 """Created_items includes items which has keep flag."""
5477 vm_id
= f
"{virtual_mac_id}"
5478 initial_created_items
= {
5479 f
"port{port_id}": True,
5480 f
"floating_ip{floating_network_vim_id}": None,
5481 f
"volume{volume_id}keep": True,
5482 f
"volume{volume_id2}keep": True,
5485 f
"port{port_id}": True,
5486 f
"floating_ip{floating_network_vim_id}": None,
5488 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5489 volumes_to_hold
= []
5490 mock_delete_created_items
.return_value
= False
5491 self
.vimconn
.delete_vminstance(vm_id
, initial_created_items
, volumes_to_hold
)
5492 mock_reload_connection
.assert_called_once()
5493 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5494 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5495 mock_delete_created_items
.assert_called_once_with(
5496 created_items
, volumes_to_hold
, False
5498 mock_sleep
.assert_not_called()
5499 mock_format_exception
.assert_not_called()
5500 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5501 initial_created_items
5504 @patch("time.sleep")
5505 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5506 @patch.object(vimconnector
, "_format_exception")
5507 @patch.object(vimconnector
, "_reload_connection")
5508 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5509 @patch.object(vimconnector
, "_delete_created_items")
5510 def test_delete_vminstance_extract_items_wth_keep_raises(
5512 mock_delete_created_items
,
5513 mock_delete_vm_ports_attached_to_network
,
5514 mock_reload_connection
,
5515 mock_format_exception
,
5516 mock_extract_items_wth_keep_flag_from_created_items
,
5519 """extract_items_wth_keep_flag_from_created_items raises AttributeError."""
5520 vm_id
= f
"{virtual_mac_id}"
5521 initial_created_items
= {
5522 f
"port{port_id}": True,
5523 f
"floating_ip{floating_network_vim_id}": None,
5524 f
"volume{volume_id}keep": True,
5525 f
"volume{volume_id2}keep": True,
5528 mock_extract_items_wth_keep_flag_from_created_items
.side_effect
= AttributeError
5529 volumes_to_hold
= []
5530 mock_delete_created_items
.return_value
= False
5531 with self
.assertRaises(AttributeError):
5532 self
.vimconn
.delete_vminstance(
5533 vm_id
, initial_created_items
, volumes_to_hold
5535 mock_reload_connection
.assert_not_called()
5536 mock_delete_vm_ports_attached_to_network
.assert_not_called()
5537 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5538 mock_delete_created_items
.assert_not_called()
5539 mock_sleep
.assert_not_called()
5540 mock_format_exception
.assert_not_called()
5541 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5542 initial_created_items
5545 @patch("time.sleep")
5546 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5547 @patch.object(vimconnector
, "_format_exception")
5548 @patch.object(vimconnector
, "_reload_connection")
5549 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5550 @patch.object(vimconnector
, "_delete_created_items")
5551 def test_delete_vminstance_delete_created_items_raises(
5553 mock_delete_created_items
,
5554 mock_delete_vm_ports_attached_to_network
,
5555 mock_reload_connection
,
5556 mock_format_exception
,
5557 mock_extract_items_wth_keep_flag_from_created_items
,
5560 """Delete creted items raises exception."""
5561 vm_id
= f
"{virtual_mac_id}"
5562 created_items
= deepcopy(created_items_all_true
)
5563 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5564 mock_sleep
= MagicMock()
5565 volumes_to_hold
= []
5566 err
= ConnectionError("ClientException occurred.")
5567 mock_delete_created_items
.side_effect
= err
5568 with self
.assertRaises(ConnectionError
) as err
:
5569 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5570 self
.assertEqual(str(err
), "ClientException occurred.")
5571 mock_reload_connection
.assert_called_once()
5572 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5573 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5574 mock_delete_created_items
.assert_called_once()
5575 mock_sleep
.assert_not_called()
5576 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5580 @patch("time.sleep")
5581 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5582 @patch.object(vimconnector
, "_format_exception")
5583 @patch.object(vimconnector
, "_reload_connection")
5584 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5585 @patch.object(vimconnector
, "_delete_created_items")
5586 def test_delete_vminstance_delete_vm_ports_raises(
5588 mock_delete_created_items
,
5589 mock_delete_vm_ports_attached_to_network
,
5590 mock_reload_connection
,
5591 mock_format_exception
,
5592 mock_extract_items_wth_keep_flag_from_created_items
,
5595 """Delete vm ports raises exception."""
5596 vm_id
= f
"{virtual_mac_id}"
5597 created_items
= deepcopy(created_items_all_true
)
5598 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5599 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5600 err
= ConnectionError("ClientException occurred.")
5601 mock_delete_vm_ports_attached_to_network
.side_effect
= err
5602 mock_delete_created_items
.side_effect
= err
5603 with self
.assertRaises(ConnectionError
) as err
:
5604 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5605 self
.assertEqual(str(err
), "ClientException occurred.")
5606 mock_reload_connection
.assert_called_once()
5607 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5608 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5609 mock_delete_created_items
.assert_not_called()
5610 mock_sleep
.assert_not_called()
5611 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5615 @patch("time.sleep")
5616 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5617 @patch.object(vimconnector
, "_format_exception")
5618 @patch.object(vimconnector
, "_reload_connection")
5619 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5620 @patch.object(vimconnector
, "_delete_created_items")
5621 def test_delete_vminstance_nova_server_delete_raises(
5623 mock_delete_created_items
,
5624 mock_delete_vm_ports_attached_to_network
,
5625 mock_reload_connection
,
5626 mock_format_exception
,
5627 mock_extract_items_wth_keep_flag_from_created_items
,
5630 """Nova server delete raises exception."""
5631 vm_id
= f
"{virtual_mac_id}"
5632 created_items
= deepcopy(created_items_all_true
)
5633 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5634 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5635 err
= VimConnConnectionException("ClientException occurred.")
5636 self
.vimconn
.nova
.servers
.delete
.side_effect
= err
5637 mock_delete_created_items
.side_effect
= err
5638 with self
.assertRaises(VimConnConnectionException
) as err
:
5639 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5640 self
.assertEqual(str(err
), "ClientException occurred.")
5641 mock_reload_connection
.assert_called_once()
5642 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5643 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5644 mock_delete_created_items
.assert_not_called()
5645 mock_sleep
.assert_not_called()
5646 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5650 @patch("time.sleep")
5651 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5652 @patch.object(vimconnector
, "_format_exception")
5653 @patch.object(vimconnector
, "_reload_connection")
5654 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5655 @patch.object(vimconnector
, "_delete_created_items")
5656 def test_delete_vminstance_reload_connection_raises(
5658 mock_delete_created_items
,
5659 mock_delete_vm_ports_attached_to_network
,
5660 mock_reload_connection
,
5661 mock_format_exception
,
5662 mock_extract_items_wth_keep_flag_from_created_items
,
5665 """Reload connection raises exception."""
5666 vm_id
= f
"{virtual_mac_id}"
5667 created_items
= deepcopy(created_items_all_true
)
5668 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5669 mock_sleep
= MagicMock()
5670 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5671 err
= ConnectionError("ClientException occurred.")
5672 mock_delete_created_items
.return_value
= False
5673 mock_reload_connection
.side_effect
= err
5674 with self
.assertRaises(ConnectionError
) as err
:
5675 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5676 self
.assertEqual(str(err
), "ClientException occurred.")
5677 mock_reload_connection
.assert_called_once()
5678 mock_delete_vm_ports_attached_to_network
.assert_not_called()
5679 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5680 mock_delete_created_items
.assert_not_called()
5681 mock_sleep
.assert_not_called()
5682 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5686 @patch("time.sleep")
5687 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5688 @patch.object(vimconnector
, "_format_exception")
5689 @patch.object(vimconnector
, "_reload_connection")
5690 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5691 @patch.object(vimconnector
, "_delete_created_items")
5692 def test_delete_vminstance_created_item_vol_to_hold_are_none(
5694 mock_delete_created_items
,
5695 mock_delete_vm_ports_attached_to_network
,
5696 mock_reload_connection
,
5697 mock_format_exception
,
5698 mock_extract_items_wth_keep_flag_from_created_items
,
5701 """created_items and volumes_to_hold are None."""
5702 vm_id
= f
"{virtual_mac_id}"
5703 created_items
= None
5704 volumes_to_hold
= None
5705 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= {}
5706 mock_delete_created_items
.return_value
= False
5707 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5708 mock_reload_connection
.assert_called_once()
5709 mock_delete_vm_ports_attached_to_network
.assert_not_called()
5710 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5711 mock_delete_created_items
.assert_called_once_with({}, [], False)
5712 mock_sleep
.assert_not_called()
5713 mock_format_exception
.assert_not_called()
5714 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with({})
5716 @patch("time.sleep")
5717 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5718 @patch.object(vimconnector
, "_format_exception")
5719 @patch.object(vimconnector
, "_reload_connection")
5720 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5721 @patch.object(vimconnector
, "_delete_created_items")
5722 def test_delete_vminstance_vm_id_is_none(
5724 mock_delete_created_items
,
5725 mock_delete_vm_ports_attached_to_network
,
5726 mock_reload_connection
,
5727 mock_format_exception
,
5728 mock_extract_items_wth_keep_flag_from_created_items
,
5731 """vm_id is None."""
5733 created_items
= deepcopy(created_items_all_true
)
5734 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5735 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5736 mock_delete_created_items
.side_effect
= [True, True, False]
5737 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5738 mock_reload_connection
.assert_called_once()
5739 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5740 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5741 self
.assertEqual(mock_delete_created_items
.call_count
, 3)
5742 self
.assertEqual(mock_sleep
.call_count
, 2)
5743 mock_format_exception
.assert_not_called()
5744 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5748 @patch("time.sleep")
5749 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5750 @patch.object(vimconnector
, "_format_exception")
5751 @patch.object(vimconnector
, "_reload_connection")
5752 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5753 @patch.object(vimconnector
, "_delete_created_items")
5754 def test_delete_vminstance_delete_created_items_return_true(
5756 mock_delete_created_items
,
5757 mock_delete_vm_ports_attached_to_network
,
5758 mock_reload_connection
,
5759 mock_format_exception
,
5760 mock_extract_items_wth_keep_flag_from_created_items
,
5763 """Delete created items always return True."""
5765 created_items
= deepcopy(created_items_all_true
)
5766 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5767 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5768 mock_delete_created_items
.side_effect
= [True] * 1800
5769 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5770 mock_reload_connection
.assert_called_once()
5771 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5772 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5773 self
.assertEqual(mock_delete_created_items
.call_count
, 1800)
5774 self
.assertEqual(mock_sleep
.call_count
, 1800)
5775 mock_format_exception
.assert_not_called()
5776 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5780 def test_remove_keep_tag_from_persistent_volumes_keep_flag_exists(self
):
5781 """Keep flag exists in created items."""
5783 f
"port:{port_id}": True,
5784 f
"floating_ip:{floating_network_vim_id}": True,
5785 f
"volume:{volume_id}:keep": True,
5786 f
"volume:{volume_id2}:keep": True,
5789 f
"port:{port_id}": True,
5790 f
"floating_ip:{floating_network_vim_id}": True,
5791 f
"volume:{volume_id}": True,
5792 f
"volume:{volume_id2}": True,
5794 result
= self
.vimconn
.remove_keep_tag_from_persistent_volumes(created_items
)
5795 self
.assertDictEqual(result
, expected_result
)
5797 def test_remove_keep_tag_from_persistent_volumes_without_keep_flag(self
):
5798 """Keep flag does not exist in created items."""
5800 f
"port:{port_id}": True,
5801 f
"floating_ip:{floating_network_vim_id}": True,
5802 f
"volume:{volume_id}": True,
5803 f
"volume:{volume_id2}": True,
5805 result
= self
.vimconn
.remove_keep_tag_from_persistent_volumes(created_items
)
5806 self
.assertDictEqual(result
, created_items
)
5808 def test_update_block_device_mapping_empty_volume(self
):
5810 block_device_mapping
= {}
5811 base_disk_index
= 100
5814 with self
.assertRaises(VimConnException
) as err
:
5815 self
.vimconn
.update_block_device_mapping(
5816 volume
, block_device_mapping
, base_disk_index
, disk
, created_items
5818 self
.assertEqual(str(err
), "Volume is empty.")
5819 self
.assertEqual(block_device_mapping
, {})
5820 self
.assertEqual(created_items
, {})
5822 def test_update_block_device_mapping_invalid_volume(self
):
5824 block_device_mapping
= {}
5825 base_disk_index
= 100
5828 with self
.assertRaises(VimConnException
) as err
:
5829 self
.vimconn
.update_block_device_mapping(
5830 volume
, block_device_mapping
, base_disk_index
, disk
, created_items
5833 str(err
), "Created volume is not valid, does not have id attribute."
5835 self
.assertEqual(block_device_mapping
, {})
5836 self
.assertEqual(created_items
, {})
5838 def test_update_block_device_mapping(self
):
5839 volume
= MagicMock(autospec
=True)
5840 volume
.id = volume_id
5841 block_device_mapping
= {}
5842 base_disk_index
= 100
5845 self
.vimconn
.update_block_device_mapping(
5846 volume
, block_device_mapping
, base_disk_index
, disk
, created_items
5849 block_device_mapping
, {"vdd": "ac408b73-b9cc-4a6a-a270-82cc4811bd4a"}
5852 created_items
, {"volume:ac408b73-b9cc-4a6a-a270-82cc4811bd4a": True}
5855 def test_update_block_device_mapping_with_keep_flag(self
):
5856 volume
= MagicMock(autospec
=True)
5857 volume
.id = volume_id
5858 block_device_mapping
= {}
5859 base_disk_index
= 100
5860 disk
= {"size": 10, "keep": True}
5862 self
.vimconn
.update_block_device_mapping(
5863 volume
, block_device_mapping
, base_disk_index
, disk
, created_items
5866 block_device_mapping
, {"vdd": "ac408b73-b9cc-4a6a-a270-82cc4811bd4a"}
5869 created_items
, {"volume:ac408b73-b9cc-4a6a-a270-82cc4811bd4a:keep": True}
5872 def test_extract_items_with_keep_flag_item_has_keep_flag(self
):
5873 created_items
= deepcopy(created_items_all_true
)
5874 created_items
[f
"volume:{volume_id2}:keep"] = True
5875 result
= self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(
5878 self
.assertEqual(result
, deepcopy(created_items_all_true
))
5880 def test_extract_items_with_keep_flag_no_item_wth_keep_flag(self
):
5881 created_items
= deepcopy(created_items_all_true
)
5882 result
= self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(
5885 self
.assertEqual(result
, deepcopy(created_items_all_true
))
5887 def test_extract_items_with_keep_flag_all_items_are_already_deleted(self
):
5889 f
"port:{port_id}": None,
5890 f
"floating_ip:{floating_network_vim_id}": None,
5891 f
"volume:{volume_id}:keep": None,
5892 f
"volume:{volume_id2}:keep": None,
5895 f
"port:{port_id}": None,
5896 f
"floating_ip:{floating_network_vim_id}": None,
5898 result
= self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(
5901 self
.assertEqual(result
, expected_result
)
5903 def test_extract_items_with_keep_flag_without_semicolon(self
):
5905 f
"port{port_id}": True,
5906 f
"floating_ip{floating_network_vim_id}": None,
5907 f
"volume{volume_id}keep": True,
5908 f
"volume{volume_id2}keep": True,
5910 result
= self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(
5913 self
.assertEqual(result
, {})
5915 def test_extract_items_with_keep_flag_invalid_type_created_items(self
):
5916 created_items
= [{f
"port{port_id}": True}, {f
"volume{volume_id2}keep": True}]
5917 with self
.assertRaises(AttributeError):
5918 self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(created_items
)
5920 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
5921 def test_get_monitoring_data(self
, mock_reload_conection
):
5922 servers
= ["server1", "server2"]
5923 ports
= {"ports": ["port1", "port2"]}
5924 self
.vimconn
.nova
.servers
.list.return_value
= servers
5925 self
.vimconn
.neutron
.list_ports
.return_value
= ports
5926 result
= self
.vimconn
.get_monitoring_data()
5927 self
.assertTupleEqual(result
, (servers
, ports
))
5928 mock_reload_conection
.assert_called_once()
5929 self
.vimconn
.nova
.servers
.list.assert_called_once_with(detailed
=True)
5930 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5932 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
5933 def test_get_monitoring_data_reload_connection_raises(self
, mock_reload_conection
):
5934 mock_reload_conection
.side_effect
= VimConnNotFoundException(
5935 "Connection object not found."
5937 with self
.assertRaises(VimConnException
) as err
:
5938 result
= self
.vimconn
.get_monitoring_data()
5939 self
.assertTupleEqual(result
, None)
5941 str(err
.exception
.args
[0]),
5942 "Exception in monitoring while getting VMs and ports status: Connection object not found.",
5944 mock_reload_conection
.assert_called_once()
5945 check_if_assert_not_called(
5946 [self
.vimconn
.nova
.servers
.list, self
.vimconn
.neutron
.list_ports
]
5949 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
5950 def test_get_monitoring_data_server_list_raises(self
, mock_reload_conection
):
5951 self
.vimconn
.nova
.servers
.list.side_effect
= VimConnConnectionException(
5952 "Can not connect to Cloud API."
5954 with self
.assertRaises(VimConnException
) as err
:
5955 result
= self
.vimconn
.get_monitoring_data()
5956 self
.assertTupleEqual(result
, None)
5958 str(err
.exception
.args
[0]),
5959 "Exception in monitoring while getting VMs and ports status: Can not connect to Cloud API.",
5961 mock_reload_conection
.assert_called_once()
5962 self
.vimconn
.nova
.servers
.list.assert_called_once_with(detailed
=True)
5963 self
.vimconn
.neutron
.list_ports
.assert_not_called()
5965 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
5966 def test_get_monitoring_data_list_ports_raises(self
, mock_reload_conection
):
5967 self
.vimconn
.neutron
.list_ports
.side_effect
= VimConnConnectionException(
5968 "Can not connect to Cloud API."
5970 with self
.assertRaises(VimConnException
) as err
:
5971 result
= self
.vimconn
.get_monitoring_data()
5972 self
.assertTupleEqual(result
, None)
5974 str(err
.exception
.args
[0]),
5975 "Exception in monitoring while getting VMs and ports status: Can not connect to Cloud API.",
5977 mock_reload_conection
.assert_called_once()
5978 self
.vimconn
.nova
.servers
.list.assert_called_once_with(detailed
=True)
5979 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5982 class TestNewFlavor(unittest
.TestCase
):
5983 @patch("logging.getLogger", autospec
=True)
5984 def setUp(self
, mock_logger
):
5985 # We are disabling the logging of exception not to print them to console.
5986 mock_logger
= logging
.getLogger()
5987 mock_logger
.disabled
= True
5988 self
.vimconn
= vimconnector(
5998 self
.vimconn
.nova
= CopyingMock(autospec
=True)
5999 self
.flavor1
= CopyingMock(autospec
=True, name
="sample-flavor")
6000 self
.flavor2
= CopyingMock(autospec
=True, name
="other-flavor")
6001 self
.new_flavor
= CopyingMock(autospec
=True, name
="new_flavor")
6002 self
.new_flavor
.id = "075d2482-5edb-43e3-91b3-234e65b6268a"
6003 self
.vimconn
.nova
.flavors
.create
.return_value
= self
.new_flavor
6005 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6006 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6007 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6010 "process_numa_paired_threads",
6011 new_callable
=CopyingMock(),
6013 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6014 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6015 def test_process_numa_parameters_of_flavor_id_memory_vcpu_in_numa_type_vio(
6017 mock_process_numa_threads
,
6018 mock_process_numa_cores
,
6019 mock_process_numa_paired_threads
,
6020 mock_process_numa_vcpu
,
6021 mock_process_numa_memory
,
6022 mock_process_vio_numa_nodes
,
6024 """Process numa parameters, id, memory, vcpu exist, vim type is VIO,
6025 paired-threads, cores, threads do not exist in numa.
6028 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6029 {"id": 1, "memory": 2, "vcpu": [2]},
6032 expected_extra_specs
= {
6033 "hw:numa_nodes": "2",
6034 "hw:cpu_sockets": "2",
6036 self
.vimconn
.vim_type
= "VIO"
6037 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6039 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6040 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6041 mock_process_vio_numa_nodes
.assert_called_once_with(2, {"hw:numa_nodes": "2"})
6042 _call_mock_process_numa_memory
= mock_process_numa_memory
.call_args_list
6044 _call_mock_process_numa_memory
[0].args
,
6046 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6049 "hw:numa_nodes": "2",
6054 _call_mock_process_numa_memory
[1].args
,
6056 {"id": 1, "memory": 2, "vcpu": [2]},
6059 "hw:cpu_sockets": "2",
6060 "hw:numa_nodes": "2",
6064 _call_mock_process_numa_vcpu
= mock_process_numa_vcpu
.call_args_list
6066 _call_mock_process_numa_vcpu
[0].args
,
6068 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6071 "hw:numa_nodes": "2",
6076 _call_mock_process_numa_vcpu
[1].args
,
6078 {"id": 1, "memory": 2, "vcpu": [2]},
6081 "hw:cpu_sockets": "2",
6082 "hw:numa_nodes": "2",
6086 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6087 check_if_assert_not_called(
6089 mock_process_numa_threads
,
6090 mock_process_numa_cores
,
6091 mock_process_numa_paired_threads
,
6095 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6096 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6097 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6100 "process_numa_paired_threads",
6101 new_callable
=CopyingMock(),
6103 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6104 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6105 def test_process_numa_parameters_of_flavor_id_memory_vcpu_in_numa_type_openstack(
6107 mock_process_numa_threads
,
6108 mock_process_numa_cores
,
6109 mock_process_numa_paired_threads
,
6110 mock_process_numa_vcpu
,
6111 mock_process_numa_memory
,
6112 mock_process_vio_numa_nodes
,
6114 """Process numa parameters, id, memory, vcpu exist, vim type is openstack,
6115 paired-threads, cores, threads do not exist in numa.
6118 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6119 {"id": 1, "memory": 2, "vcpu": [2]},
6122 expected_extra_specs
= {
6123 "hw:numa_nodes": "2",
6124 "hw:cpu_sockets": "2",
6126 self
.vimconn
.vim_type
= "openstack"
6127 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6129 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6130 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6131 _call_mock_process_numa_memory
= mock_process_numa_memory
.call_args_list
6133 _call_mock_process_numa_memory
[0].args
,
6135 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6137 {"hw:numa_nodes": "2"},
6141 _call_mock_process_numa_memory
[1].args
,
6143 {"id": 1, "memory": 2, "vcpu": [2]},
6145 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2"},
6148 _call_mock_process_numa_vcpu
= mock_process_numa_vcpu
.call_args_list
6150 _call_mock_process_numa_vcpu
[0].args
,
6152 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6154 {"hw:numa_nodes": "2"},
6158 _call_mock_process_numa_vcpu
[1].args
,
6160 {"id": 1, "memory": 2, "vcpu": [2]},
6162 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2"},
6165 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6166 check_if_assert_not_called(
6168 mock_process_numa_threads
,
6169 mock_process_numa_cores
,
6170 mock_process_numa_paired_threads
,
6174 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6175 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6176 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6179 "process_numa_paired_threads",
6180 new_callable
=CopyingMock(),
6182 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6183 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6184 def test_process_numa_parameters_of_flavor_id_paired_threads_in_numa_type_openstack_extra_spec_not_empty(
6186 mock_process_numa_threads
,
6187 mock_process_numa_cores
,
6188 mock_process_numa_paired_threads
,
6189 mock_process_numa_vcpu
,
6190 mock_process_numa_memory
,
6191 mock_process_vio_numa_nodes
,
6193 """Process numa parameters, id, paired-threads exist, vim type is openstack.
6194 vcpus calculation according to paired-threads in numa, there is extra_spec.
6196 numas
= [{"id": 0, "paired-threads": 3}, {"id": 1, "paired-threads": 3}]
6197 extra_specs
= {"some-key": "some-value"}
6198 expected_extra_specs
= {
6199 "hw:cpu_sockets": "2",
6200 "hw:cpu_threads": "12",
6201 "hw:numa_nodes": "2",
6202 "some-key": "some-value",
6204 self
.vimconn
.vim_type
= "openstack"
6205 mock_process_numa_paired_threads
.side_effect
= [6, 6]
6206 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6208 check_if_assert_not_called([mock_process_numa_threads
, mock_process_numa_cores
])
6209 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6210 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6211 self
.assertEqual(mock_process_numa_paired_threads
.call_count
, 2)
6212 _call_mock_process_numa_paired_threads
= (
6213 mock_process_numa_paired_threads
.call_args_list
6216 _call_mock_process_numa_paired_threads
[0].args
,
6218 {"id": 0, "paired-threads": 3},
6219 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2", "some-key": "some-value"},
6223 _call_mock_process_numa_paired_threads
[1].args
,
6225 {"id": 1, "paired-threads": 3},
6226 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2", "some-key": "some-value"},
6229 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6231 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6232 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6233 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6236 "process_numa_paired_threads",
6237 new_callable
=CopyingMock(),
6239 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6240 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6241 def test_process_numa_parameters_of_flavor_id_paired_threads_in_numa_type_vio_extra_spec_not_empty(
6243 mock_process_numa_threads
,
6244 mock_process_numa_cores
,
6245 mock_process_numa_paired_threads
,
6246 mock_process_numa_vcpu
,
6247 mock_process_numa_memory
,
6248 mock_process_vio_numa_nodes
,
6250 """Process numa parameters, id, paired-threads exist, vim type is VIO.
6251 vcpus calculation according to paired-threads in numa, there is extra_spec.
6253 numas
= [{"id": 0, "paired-threads": 2}, {"id": 1, "paired-threads": 2}]
6254 extra_specs
= {"some-key": "some-value"}
6255 expected_extra_specs
= {
6256 "hw:numa_nodes": "2",
6257 "hw:cpu_sockets": "2",
6258 "hw:cpu_threads": "8",
6259 "some-key": "some-value",
6261 self
.vimconn
.vim_type
= "VIO"
6262 mock_process_numa_paired_threads
.side_effect
= [4, 4]
6263 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6264 check_if_assert_not_called([mock_process_numa_threads
, mock_process_numa_cores
])
6265 self
.assertEqual(mock_process_numa_paired_threads
.call_count
, 2)
6266 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6267 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6268 _call_mock_process_numa_paired_threads
= (
6269 mock_process_numa_paired_threads
.call_args_list
6271 mock_process_vio_numa_nodes
.assert_called_once_with(
6272 2, {"some-key": "some-value", "hw:numa_nodes": "2"}
6275 _call_mock_process_numa_paired_threads
[0].args
,
6277 {"id": 0, "paired-threads": 2},
6279 "hw:cpu_sockets": "2",
6280 "hw:numa_nodes": "2",
6281 "some-key": "some-value",
6286 _call_mock_process_numa_paired_threads
[1].args
,
6288 {"id": 1, "paired-threads": 2},
6290 "hw:cpu_sockets": "2",
6291 "hw:numa_nodes": "2",
6292 "some-key": "some-value",
6296 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6298 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6299 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6300 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6303 "process_numa_paired_threads",
6304 new_callable
=CopyingMock(),
6306 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6307 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6308 def test_process_numa_parameters_of_flavor_id_cores_in_numa_type_openstack(
6310 mock_process_numa_threads
,
6311 mock_process_numa_cores
,
6312 mock_process_numa_paired_threads
,
6313 mock_process_numa_vcpu
,
6314 mock_process_numa_memory
,
6315 mock_process_vio_numa_nodes
,
6317 """Process numa parameters, id, cores exist, vim type is openstack.
6318 vcpus calculation according to cores in numa.
6320 numas
= [{"id": 0, "cores": 1}, {"id": 1, "cores": 2}]
6322 updated_extra_specs
= {"hw:numa_nodes": "2", "hw:cpu_sockets": "2"}
6323 expected_extra_specs
= {
6324 "hw:numa_nodes": "2",
6325 "hw:cpu_sockets": "2",
6326 "hw:cpu_cores": "3",
6328 self
.vimconn
.vim_type
= "openstack"
6329 mock_process_numa_cores
.side_effect
= [1, 2]
6330 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6332 check_if_assert_not_called(
6333 [mock_process_numa_threads
, mock_process_numa_paired_threads
]
6335 self
.assertEqual(mock_process_numa_cores
.call_count
, 2)
6336 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6337 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6338 _call_mock_process_numa_cores
= mock_process_numa_cores
.call_args_list
6340 _call_mock_process_numa_cores
[0].args
,
6341 ({"id": 0, "cores": 1}, updated_extra_specs
),
6344 _call_mock_process_numa_cores
[1].args
,
6345 ({"id": 1, "cores": 2}, updated_extra_specs
),
6347 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6349 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6350 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6351 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6354 "process_numa_paired_threads",
6355 new_callable
=CopyingMock(),
6357 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6358 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6359 def test_process_numa_parameters_of_flavor_id_cores_in_numa_type_vio(
6361 mock_process_numa_threads
,
6362 mock_process_numa_cores
,
6363 mock_process_numa_paired_threads
,
6364 mock_process_numa_vcpu
,
6365 mock_process_numa_memory
,
6366 mock_process_vio_numa_nodes
,
6368 """Process numa parameters, id, cores exist, vim type is VIO.
6369 vcpus calculation according to cores in numa.
6371 numas
= [{"id": 0, "cores": 1}, {"id": 1, "cores": 2}]
6373 expected_extra_specs
= {
6374 "hw:cpu_cores": "3",
6375 "hw:cpu_sockets": "2",
6376 "hw:numa_nodes": "2",
6378 self
.vimconn
.vim_type
= "VIO"
6379 mock_process_numa_cores
.side_effect
= [1, 2]
6380 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6381 check_if_assert_not_called(
6382 [mock_process_numa_threads
, mock_process_numa_paired_threads
]
6384 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6385 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6386 self
.assertEqual(mock_process_numa_cores
.call_count
, 2)
6387 mock_process_vio_numa_nodes
.assert_called_once_with(2, {"hw:numa_nodes": "2"})
6388 _call_mock_process_numa_cores
= mock_process_numa_cores
.call_args_list
6390 _call_mock_process_numa_cores
[0].args
,
6392 {"id": 0, "cores": 1},
6394 "hw:cpu_sockets": "2",
6395 "hw:numa_nodes": "2",
6400 _call_mock_process_numa_cores
[1].args
,
6402 {"id": 1, "cores": 2},
6404 "hw:cpu_sockets": "2",
6405 "hw:numa_nodes": "2",
6409 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6411 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6412 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6413 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6416 "process_numa_paired_threads",
6417 new_callable
=CopyingMock(),
6419 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6420 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6421 def test_process_numa_parameters_of_flavor_without_numa_id_with_threads_type_vio(
6423 mock_process_numa_threads
,
6424 mock_process_numa_cores
,
6425 mock_process_numa_paired_threads
,
6426 mock_process_numa_vcpu
,
6427 mock_process_numa_memory
,
6428 mock_process_vio_numa_nodes
,
6430 """Process numa parameters, memory, vcpu, thread exist, vim type is VIO,
6431 vcpus calculation according threads in numa, there are not numa ids.
6434 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6435 {"memory": 2, "vcpu": [2]},
6438 expected_extra_specs
= {
6439 "hw:numa_nodes": "2",
6440 "hw:cpu_sockets": "2",
6441 "hw:cpu_threads": "3",
6443 self
.vimconn
.vim_type
= "VIO"
6444 mock_process_numa_threads
.return_value
= 3
6445 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6446 check_if_assert_not_called(
6448 mock_process_numa_memory
,
6449 mock_process_numa_vcpu
,
6450 mock_process_numa_cores
,
6451 mock_process_numa_paired_threads
,
6454 mock_process_vio_numa_nodes
.assert_called_once_with(2, {"hw:numa_nodes": "2"})
6455 self
.assertEqual(mock_process_numa_threads
.call_count
, 1)
6456 _call_mock_process_numa_threads
= mock_process_numa_threads
.call_args_list
6458 _call_mock_process_numa_threads
[0].args
,
6460 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6462 "hw:cpu_sockets": "2",
6463 "hw:numa_nodes": "2",
6467 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6469 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6470 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6471 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6474 "process_numa_paired_threads",
6475 new_callable
=CopyingMock(autospec
=True),
6477 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6478 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6479 def test_process_numa_parameters_of_flavor_without_numa_id_with_threads_type_openstack(
6481 mock_process_numa_threads
,
6482 mock_process_numa_cores
,
6483 mock_process_numa_paired_threads
,
6484 mock_process_numa_vcpu
,
6485 mock_process_numa_memory
,
6486 mock_process_vio_numa_nodes
,
6488 """Process numa parameters, memory, vcpu, thread exist, vim type is openstack,
6489 vcpus calculation according threads in numa, there are not numa ids.
6492 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6493 {"memory": 2, "vcpu": [2]},
6496 expected_extra_specs
= {
6497 "hw:numa_nodes": "2",
6498 "hw:cpu_sockets": "2",
6499 "hw:cpu_threads": "3",
6501 self
.vimconn
.vim_type
= "openstack"
6502 mock_process_numa_threads
.return_value
= 3
6503 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6505 check_if_assert_not_called(
6507 mock_process_numa_memory
,
6508 mock_process_numa_vcpu
,
6509 mock_process_numa_cores
,
6510 mock_process_numa_paired_threads
,
6511 mock_process_vio_numa_nodes
,
6514 self
.assertEqual(mock_process_numa_threads
.call_count
, 1)
6515 _call_mock_process_numa_threads
= mock_process_numa_threads
.call_args_list
6517 _call_mock_process_numa_threads
[0].args
,
6519 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6520 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2"},
6523 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6525 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6526 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6527 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6530 "process_numa_paired_threads",
6531 new_callable
=CopyingMock(),
6533 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6534 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6535 def test_process_numa_parameters_of_flavor_empty_numas_list_type_vio(
6537 mock_process_numa_threads
,
6538 mock_process_numa_cores
,
6539 mock_process_numa_paired_threads
,
6540 mock_process_numa_vcpu
,
6541 mock_process_numa_memory
,
6542 mock_process_vio_numa_nodes
,
6544 """Numa list is empty, vim type is VIO."""
6547 expected_extra_specs
= {"hw:numa_nodes": "0"}
6548 self
.vimconn
.vim_type
= "VIO"
6549 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6550 check_if_assert_not_called(
6552 mock_process_numa_memory
,
6553 mock_process_numa_vcpu
,
6554 mock_process_numa_cores
,
6555 mock_process_numa_paired_threads
,
6556 mock_process_numa_threads
,
6559 mock_process_vio_numa_nodes
.assert_called_once_with(0, {"hw:numa_nodes": "0"})
6560 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6562 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6563 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6564 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6567 "process_numa_paired_threads",
6568 new_callable
=CopyingMock(),
6570 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6571 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6572 def test_process_numa_parameters_of_flavor_empty_numas_list_type_openstack(
6574 mock_process_numa_threads
,
6575 mock_process_numa_cores
,
6576 mock_process_numa_paired_threads
,
6577 mock_process_numa_vcpu
,
6578 mock_process_numa_memory
,
6579 mock_process_vio_numa_nodes
,
6581 """Numa list is empty, vim type is openstack."""
6584 expected_extra_specs
= {"hw:numa_nodes": "0"}
6585 self
.vimconn
.vim_type
= "openstack"
6586 mock_process_numa_threads
.return_value
= None
6587 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6589 check_if_assert_not_called(
6591 mock_process_numa_memory
,
6592 mock_process_numa_vcpu
,
6593 mock_process_numa_cores
,
6594 mock_process_numa_paired_threads
,
6595 mock_process_numa_threads
,
6596 mock_process_vio_numa_nodes
,
6599 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6601 def test_process_numa_memory_empty_extra_spec(self
):
6602 numa
= {"memory": 2, "vcpu": [2]}
6605 expected_extra_spec
= {"hw:numa_mem.2": 2048}
6606 self
.vimconn
.process_numa_memory(numa
, node_id
, extra_specs
)
6607 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6609 def test_process_numa_memory_not_exist(self
):
6610 numa
= {"vcpu": [2]}
6612 extra_specs
= {"vmware:latency_sensitivity_level": "high"}
6613 self
.vimconn
.process_numa_memory(numa
, node_id
, extra_specs
)
6614 self
.assertDictEqual(extra_specs
, {"vmware:latency_sensitivity_level": "high"})
6616 def test_process_numa_memory_node_id_is_none(self
):
6617 numa
= {"memory": 2, "vcpu": [2]}
6620 expected_extra_spec
= {"hw:numa_mem.None": 2048}
6621 self
.vimconn
.process_numa_memory(numa
, node_id
, extra_specs
)
6622 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6624 def test_process_numa_vcpu_empty_extra_spec(self
):
6625 numa
= {"vcpu": [2]}
6628 expected_extra_spec
= {"hw:numa_cpus.0": "2"}
6629 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6630 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6632 def test_process_numa_vcpu_not_exist(self
):
6633 numa
= {"memory": 2}
6635 extra_specs
= {"vmware:latency_sensitivity_level": "high"}
6636 expected_extra_spec
= {"vmware:latency_sensitivity_level": "high"}
6637 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6638 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6640 def test_process_numa_vcpu_empty_node_id(self
):
6641 numa
= {"vcpu": [2]}
6644 expected_extra_spec
= {"hw:numa_cpus.": "2"}
6645 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6646 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6648 def test_process_numa_vcpu_empty_numa_dict(self
):
6652 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6653 self
.assertDictEqual(extra_specs
, {})
6655 def test_process_numa_vcpu_str_node_id(self
):
6656 numa
= {"vcpu": [2]}
6659 expected_extra_spec
= {"hw:numa_cpus.12": "2"}
6660 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6661 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6663 def test_process_numa_paired_threads_empty_extra_spec(self
):
6664 numa
= {"id": 0, "paired-threads": 3}
6666 expected_extra_spec
= {
6667 "hw:cpu_thread_policy": "require",
6668 "hw:cpu_policy": "dedicated",
6670 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6671 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6672 self
.assertEqual(result
, 6)
6674 def test_process_numa_paired_threads_empty_numa(self
):
6677 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6678 self
.assertDictEqual(extra_specs
, {})
6679 self
.assertEqual(result
, None)
6681 def test_process_numa_paired_threads_not_exist(self
):
6682 numa
= {"vcpu": [2]}
6684 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6685 self
.assertDictEqual(extra_specs
, {})
6686 self
.assertEqual(result
, None)
6688 def test_process_numa_paired_threads_str_thread_num(self
):
6689 numa
= {"id": 0, "paired-threads": "3"}
6691 expected_extra_spec
= {
6692 "hw:cpu_thread_policy": "require",
6693 "hw:cpu_policy": "dedicated",
6695 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6696 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6697 self
.assertEqual(result
, "33")
6699 def test_process_numa_paired_threads_none_thread_num(self
):
6700 numa
= {"id": 0, "paired-threads": None}
6702 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6703 self
.assertDictEqual(extra_specs
, {})
6704 self
.assertEqual(result
, None)
6706 def test_process_numa_cores_empty_extra_spec(self
):
6707 numa
= {"id": 0, "cores": 1}
6709 expected_extra_spec
= {
6710 "hw:cpu_policy": "dedicated",
6711 "hw:cpu_thread_policy": "isolate",
6713 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6714 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6715 self
.assertEqual(result
, 1)
6717 def test_process_numa_cores_not_exist(self
):
6718 numa
= {"id": 0, "paired-threads": 3}
6720 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6721 self
.assertDictEqual(extra_specs
, {})
6722 self
.assertEqual(result
, None)
6724 def test_process_numa_cores_empty_numa(self
):
6726 extra_specs
= expected_extra_spec
= {"some-key": "some-val"}
6727 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6728 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6729 self
.assertEqual(result
, None)
6731 def test_process_numa_cores_none_core_num(self
):
6732 numa
= {"memory": 1, "cores": None}
6734 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6735 self
.assertDictEqual(extra_specs
, {})
6736 self
.assertEqual(result
, None)
6738 def test_process_numa_cores_string_core_num(self
):
6739 numa
= {"id": 0, "cores": "1"}
6740 extra_specs
= {"some-key": "some-val"}
6741 expected_extra_spec
= {
6742 "hw:cpu_policy": "dedicated",
6743 "hw:cpu_thread_policy": "isolate",
6744 "some-key": "some-val",
6746 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6747 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6748 self
.assertEqual(result
, "1")
6750 def test_process_numa_cores_float_core_num(self
):
6751 numa
= {"memory": 2, "cores": 10.03}
6752 extra_specs
= {"some-key": "some-val"}
6753 expected_extra_spec
= {
6754 "hw:cpu_policy": "dedicated",
6755 "hw:cpu_thread_policy": "isolate",
6756 "some-key": "some-val",
6758 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6759 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6760 self
.assertEqual(result
, 10.03)
6762 def test_process_numa_threads_empty_extra_spec_int_thread_num(self
):
6763 numa
= {"memory": 1, "vcpu": [1, 3], "threads": 3}
6765 expected_extra_spec
= {
6766 "hw:cpu_policy": "dedicated",
6767 "hw:cpu_thread_policy": "prefer",
6769 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6770 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6771 self
.assertEqual(result
, 3)
6773 def test_process_numa_threads_empty_numa(self
):
6775 extra_specs
= {"some-key": "some-val"}
6776 expected_extra_spec
= {"some-key": "some-val"}
6777 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6778 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6779 self
.assertEqual(result
, None)
6781 def test_process_numa_threads_not_exist(self
):
6782 numa
= {"memory": 1}
6783 extra_specs
= expected_extra_spec
= {"some-key": "some-val"}
6784 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6785 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6786 self
.assertEqual(result
, None)
6788 def test_process_numa_threads_str_thread_num(self
):
6789 numa
= {"vcpu": [1, 3], "threads": "3"}
6791 expected_extra_spec
= {
6792 "hw:cpu_policy": "dedicated",
6793 "hw:cpu_thread_policy": "prefer",
6795 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6796 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6797 self
.assertEqual(result
, "3")
6799 def test_process_numa_threads_none_thread_num(self
):
6800 numa
= {"vcpu": [1, 3], "threads": None}
6802 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6803 self
.assertDictEqual(extra_specs
, {})
6804 self
.assertEqual(result
, None)
6806 def test_process_numa_threads_float_thread_num(self
):
6807 numa
= {"memory": 1, "vcpu": [1, 3], "threads": 3.3}
6808 extra_specs
= {"some-key": "some-val"}
6809 expected_extra_spec
= {
6810 "hw:cpu_policy": "dedicated",
6811 "hw:cpu_thread_policy": "prefer",
6812 "some-key": "some-val",
6814 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6815 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6816 self
.assertEqual(result
, 3.3)
6818 def test_change_the_flavor_name_not_existing_name(self
):
6819 """Flavor name does not exist in Openstack flavor list."""
6820 self
.flavor1
.name
= "sample-flavor-3"
6821 self
.flavor2
.name
= "other-flavor-4"
6822 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6823 name
= "other-flavor-3"
6825 flavor_data
= {"name": "other-flavor"}
6826 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6827 self
.assertEqual(result
, name
)
6828 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6829 # Checking whether name_suffix changed or not.
6830 self
.assertEqual(name_suffix
, 3)
6832 def test_change_the_flavor_name_existing_name(self
):
6833 """Flavor name exists in Openstack flavor list."""
6834 self
.flavor1
.name
= "other-flavor-6"
6835 self
.flavor2
.name
= "other-flavor-3"
6836 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6837 name
= "other-flavor-3"
6839 flavor_data
= {"name": "other-flavor"}
6840 expected_result
= "other-flavor-7"
6841 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6842 self
.assertEqual(result
, expected_result
)
6843 # Checking whether name_suffix changed or not.
6844 self
.assertEqual(name_suffix
, 5)
6845 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6847 def test_change_the_flavor_name_flavor_data_does_not_have_name(self
):
6848 """Flavor data does not have name."""
6849 self
.flavor1
.name
= "other-flavor-6"
6850 self
.flavor2
.name
= "other-flavor-3"
6851 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6852 name
= "other-flavor-3"
6855 with self
.assertRaises(KeyError):
6856 self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6857 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6858 # Checking whether name_suffix changed or not.
6859 self
.assertEqual(name_suffix
, 5)
6861 def test_change_the_flavor_name_invalid_name_suffix(self
):
6862 """Name suffix is invalid."""
6863 self
.flavor1
.name
= "other-flavor-6"
6864 self
.flavor2
.name
= "other-flavor-3"
6865 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6866 name
= "other-flavor-3"
6868 flavor_data
= {"name": "other-flavor"}
6869 with self
.assertRaises(TypeError):
6870 self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6871 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6872 # Checking whether name_suffix changed or not.
6873 self
.assertEqual(name_suffix
, "a")
6875 def test_change_the_flavor_name_given_name_is_empty(self
):
6876 """Given name is empty string."""
6877 self
.flavor1
.name
= "other-flavor-6"
6878 self
.flavor2
.name
= "other-flavor-3"
6879 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6882 flavor_data
= {"name": "other-flavor"}
6883 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6884 self
.assertEqual(result
, "")
6885 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6886 # Checking whether name_suffix increased or not.
6887 self
.assertEqual(name_suffix
, 3)
6889 def test_change_the_flavor_name_given_name_is_none(self
):
6890 """Given name is None."""
6891 self
.flavor1
.name
= "other-flavor-6"
6892 self
.flavor2
.name
= "other-flavor-3"
6893 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6896 flavor_data
= {"name": "other-flavor"}
6897 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6898 self
.assertEqual(result
, None)
6899 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6900 # Checking whether name_suffix increased or not.
6901 self
.assertEqual(name_suffix
, 6)
6903 def test_change_the_flavor_name_empty_nova_flavor_list(self
):
6904 """Nova flavor list is empty."""
6905 self
.vimconn
.nova
.flavors
.list.return_value
= []
6906 name
= "other-flavor-3"
6908 flavor_data
= {"name": "other-flavor"}
6909 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6910 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6911 self
.assertEqual(result
, name
)
6912 # Checking whether name_suffix increased or not.
6913 self
.assertEqual(name_suffix
, 5)
6917 "_process_numa_parameters_of_flavor",
6918 new_callable
=CopyingMock(),
6920 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
6921 def test_process_extended_config_of_flavor_with_numa_cpu_mem_vif_disk_quota(
6922 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
6924 """Process extended config, extended has numas, cpu, mem, vif and disk-io quota."""
6926 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6927 {"memory": 2, "vcpu": [2]},
6931 "cpu-quota": {"limit": 3},
6932 "mem-quota": {"limit": 1},
6933 "vif-quota": {"limit": 10},
6934 "disk-io-quota": {"limit": 50},
6935 "mempage-size": "LARGE",
6938 expected_extra_specs
= {
6939 "hw:mem_page_size": "large",
6941 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
6943 self
.assertEqual(mock_process_resource_quota
.call_count
, 4)
6944 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
6945 self
.assertEqual(extra_specs
, expected_extra_specs
)
6949 "_process_numa_parameters_of_flavor",
6950 new_callable
=CopyingMock(),
6952 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
6953 def test_process_extended_config_of_flavor_with_numa_wrong_disk_quota(
6954 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
6956 """Process extended config, extended has wrong disk quota key."""
6958 {"memory": 1, "threads": 3},
6959 {"memory": 2, "vcpu": [2]},
6963 "disk-quota": {"limit": 50},
6964 "mempage-size": "PREFER_LARGE",
6967 expected_extra_specs
= {
6968 "hw:mem_page_size": "any",
6970 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
6971 mock_process_resource_quota
.assert_not_called()
6972 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
6973 self
.assertEqual(extra_specs
, expected_extra_specs
)
6977 "_process_numa_parameters_of_flavor",
6978 new_callable
=CopyingMock(),
6980 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
6981 def test_process_extended_config_of_flavor_without_numa_cpu_mem_vif_disk_quota(
6982 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
6984 """Process extended config, extended has cpu, mem, vif and disk-io quota but not numas."""
6986 "cpu-quota": {"limit": 3},
6987 "mem-quota": {"limit": 1},
6988 "vif-quota": {"limit": 10},
6989 "disk-io-quota": {"limit": 50},
6990 "mempage-size": "SMALL",
6993 expected_extra_specs
= {
6994 "hw:mem_page_size": "small",
6996 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
6997 self
.assertEqual(mock_process_resource_quota
.call_count
, 4)
6998 mock_process_numa_parameters_of_flavor
.assert_not_called()
6999 self
.assertEqual(extra_specs
, expected_extra_specs
)
7003 "_process_numa_parameters_of_flavor",
7004 new_callable
=CopyingMock(),
7006 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7007 def test_process_extended_config_of_flavor_with_numa_with_cpu_pinning_mem_policy(
7008 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7010 """Process extended config, extended has cpu, mem quota, cpu-pinning and mem-policy."""
7013 {"memory": 2, "vcpu": [2]},
7017 "cpu-quota": {"limit": 3},
7018 "mem-quota": {"limit": 1},
7019 "mempage-size": "LARGE",
7020 "cpu-pinning-policy": "DEDICATED",
7021 "mem-policy": "STRICT",
7024 expected_extra_specs
= {
7025 "hw:mem_page_size": "large",
7026 "hw:cpu_policy": "dedicated",
7027 "hw:numa_mempolicy": "strict",
7029 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7030 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7031 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
7032 self
.assertEqual(extra_specs
, expected_extra_specs
)
7036 "_process_numa_parameters_of_flavor",
7037 new_callable
=CopyingMock(),
7039 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7040 def test_process_extended_config_of_flavor_without_numa_with_cpu_pinning_mem_policy(
7041 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7043 """Process extended config, extended has cpu, mem quota, cpu-pinning and mem-policy but not numas."""
7045 "cpu-quota": {"limit": 3},
7046 "mem-quota": {"limit": 1},
7047 "mempage-size": "LARGE",
7048 "cpu-pinning-policy": "DEDICATED",
7049 "mem-policy": "STRICT",
7052 expected_extra_specs
= {
7053 "hw:mem_page_size": "large",
7054 "hw:cpu_policy": "dedicated",
7055 "hw:numa_mempolicy": "strict",
7057 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7058 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7059 mock_process_numa_parameters_of_flavor
.assert_not_called()
7060 self
.assertEqual(extra_specs
, expected_extra_specs
)
7064 "_process_numa_parameters_of_flavor",
7065 new_callable
=CopyingMock(),
7067 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7068 def test_process_extended_config_of_flavor_without_numa_with_wrong_mempage_size(
7069 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7071 """Process extended config, extended has wrong mempage-size without numas."""
7073 "cpu-quota": {"limit": 3},
7074 "mem-quota": {"limit": 1},
7075 "mempage-size": "SIZE_2GB",
7076 "cpu-pinning-policy": "DEDICATED",
7077 "mem-policy": "STRICT",
7081 expected_extra_specs
= {
7082 "hw:cpu_policy": "dedicated",
7083 "hw:numa_mempolicy": "strict",
7085 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7086 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7087 mock_process_numa_parameters_of_flavor
.assert_not_called()
7088 self
.assertEqual(extra_specs
, expected_extra_specs
)
7092 "_process_numa_parameters_of_flavor",
7093 new_callable
=CopyingMock(),
7095 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7096 def test_process_extended_config_of_flavor_with_numa_with_wrong_mempage_size(
7097 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7099 """Process extended config, extended has wrong mempage-size with numas."""
7102 {"memory": 2, "vcpu": [2]},
7106 "cpu-quota": {"limit": 3},
7107 "mem-quota": {"limit": 1},
7108 "mempage-size": "SIZE_2GB",
7109 "cpu-pinning-policy": "DEDICATED",
7110 "mem-policy": "STRICT",
7113 expected_extra_specs
= {
7114 "hw:cpu_policy": "dedicated",
7115 "hw:numa_mempolicy": "strict",
7117 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7118 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7119 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
7120 self
.assertEqual(extra_specs
, expected_extra_specs
)
7124 "_process_numa_parameters_of_flavor",
7125 new_callable
=CopyingMock(),
7127 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7128 def test_process_extended_config_of_flavor_none_vcpus(
7129 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7131 """Process extended config, extended has cpu, mem quota, cpu-pinning and mem-policy, vcpus is None."""
7134 {"memory": 2, "vcpu": [2]},
7138 "cpu-quota": {"limit": 3},
7139 "mem-quota": {"limit": 1},
7140 "mempage-size": "SIZE_2GB",
7141 "cpu-pinning-policy": "DEDICATED",
7142 "mem-policy": "STRICT",
7145 expected_extra_specs
= {
7146 "hw:cpu_policy": "dedicated",
7147 "hw:numa_mempolicy": "strict",
7149 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7150 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7151 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
7152 self
.assertEqual(extra_specs
, expected_extra_specs
)
7156 "_process_numa_parameters_of_flavor",
7157 new_callable
=CopyingMock(),
7159 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7160 def test_process_extended_config_of_flavor_none_vcpus_without_numas(
7161 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7163 """Process extended config, extended has cpu, mem quota, cpu-pinning and mem-policy, vcpus is None."""
7165 "cpu-quota": {"limit": 3},
7166 "mem-quota": {"limit": 1},
7167 "mempage-size": "SIZE_2GB",
7168 "cpu-pinning-policy": "DEDICATED",
7169 "mem-policy": "STRICT",
7171 extra_specs
= {"some-key": "some-val"}
7172 expected_extra_specs
= {
7173 "hw:cpu_policy": "dedicated",
7174 "hw:numa_mempolicy": "strict",
7175 "some-key": "some-val",
7177 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7178 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7179 mock_process_numa_parameters_of_flavor
.assert_not_called()
7180 self
.assertEqual(extra_specs
, expected_extra_specs
)
7184 "_process_numa_parameters_of_flavor",
7185 new_callable
=CopyingMock(),
7187 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7188 def test_process_extended_config_of_flavor_wrong_cpu_pinning_mem_policy_empty_vcpus(
7189 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7191 """Process extended config, extended has wrong cpu-pinning and mem-policy keys."""
7194 {"memory": 2, "vcpu": [2]},
7198 "cpu-quota": {"limit": 3},
7199 "mem-quota": {"limit": 1},
7200 "mempage-size": "SIZE_2GB",
7201 "cpu-pinning-pol": "DEDICATED",
7202 "mem-pol": "STRICT",
7205 expected_extra_specs
= {}
7206 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7207 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7208 mock_process_numa_parameters_of_flavor
.assert_called_once_with(
7211 self
.assertEqual(extra_specs
, expected_extra_specs
)
7215 "_process_numa_parameters_of_flavor",
7216 new_callable
=CopyingMock(),
7218 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7219 def test_process_extended_config_of_flavor_empty_extended(
7220 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7222 """Process extended config, extended is empty."""
7225 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7226 check_if_assert_not_called(
7227 [mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
]
7229 self
.assertEqual(extra_specs
, {})
7231 def test_get_flavor_details_empty_flavor_data(self
):
7233 expected_result
= (64, 1, {}, None)
7234 result
= self
.vimconn
._get
_flavor
_details
(flavor_data
)
7235 self
.assertEqual(result
, expected_result
)
7237 def test_get_flavor_details_flavor_data_has_ram_vcpus_extended(self
):
7242 "some-key": "some-val",
7245 expected_result
= (32, 3, {}, {"some-key": "some-val"})
7246 result
= self
.vimconn
._get
_flavor
_details
(flavor_data
)
7247 self
.assertEqual(result
, expected_result
)
7249 def test_get_flavor_details_flavor_data_is_none(self
):
7251 with self
.assertRaises(AttributeError):
7252 self
.vimconn
._get
_flavor
_details
(flavor_data
)
7254 def test_get_flavor_details_flavor_data_has_only_extended(self
):
7257 "some-key": "some-val",
7260 expected_result
= (64, 1, {}, {"some-key": "some-val"})
7261 result
= self
.vimconn
._get
_flavor
_details
(flavor_data
)
7262 self
.assertEqual(result
, expected_result
)
7264 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7267 "_process_extended_config_of_flavor",
7268 new_callable
=CopyingMock(),
7270 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7271 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7272 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7273 def test_new_flavor_with_extended_with_extra_specs(
7275 mock_format_exception
,
7276 mock_reload_connection
,
7277 mock_change_flavor_name
,
7278 mock_extended_config_of_flavor
,
7279 mock_get_flavor_details
,
7281 """Create new flavor with using extended parameters and extra specs."""
7284 mock_change_flavor_name
.return_value
= name1
7285 mock_get_flavor_details
.return_value
= (
7288 {"some-key": "some-value"},
7291 expected_result
= self
.new_flavor
.id
7292 result
= self
.vimconn
.new_flavor(flavor_data
)
7293 self
.assertEqual(result
, expected_result
)
7294 mock_reload_connection
.assert_called_once()
7295 self
.new_flavor
.set_keys
.assert_called_once()
7296 mock_get_flavor_details
.assert_called_once_with(flavor_data
)
7297 mock_change_flavor_name
.assert_called_once_with(name1
, name_suffix
, flavor_data
)
7298 mock_extended_config_of_flavor
.assert_called_once_with(
7299 extended
, {"some-key": "some-value"}
7301 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7302 name
=name1
, ram
=3, vcpus
=8, disk
=50, ephemeral
=0, swap
=0, is_public
=True
7304 mock_format_exception
.assert_not_called()
7306 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7309 "_process_extended_config_of_flavor",
7310 new_callable
=CopyingMock(),
7312 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7313 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7314 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7315 def test_new_flavor_with_extended_without_extra_specs(
7317 mock_format_exception
,
7318 mock_reload_connection
,
7319 mock_change_flavor_name
,
7320 mock_extended_config_of_flavor
,
7321 mock_get_flavor_details
,
7323 """Create new flavor with using extended parameters without extra specs."""
7326 mock_change_flavor_name
.return_value
= name1
7327 mock_get_flavor_details
.return_value
= (3, vcpus
, {}, extended
)
7328 expected_result
= self
.new_flavor
.id
7329 result
= self
.vimconn
.new_flavor(flavor_data
)
7330 self
.assertEqual(result
, expected_result
)
7331 mock_reload_connection
.assert_called_once()
7332 mock_get_flavor_details
.assert_called_once_with(flavor_data
)
7333 mock_change_flavor_name
.assert_called_once_with(name1
, name_suffix
, flavor_data
)
7334 mock_extended_config_of_flavor
.assert_called_once_with(extended
, {})
7335 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7336 name
=name1
, ram
=3, vcpus
=vcpus
, disk
=50, ephemeral
=0, swap
=0, is_public
=True
7338 check_if_assert_not_called([self
.new_flavor
.set_keys
, mock_format_exception
])
7340 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7343 "_process_extended_config_of_flavor",
7344 new_callable
=CopyingMock(),
7346 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7347 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7348 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7349 def test_new_flavor_change_name_if_used_false_with_extended(
7351 mock_format_exception
,
7352 mock_reload_connection
,
7353 mock_change_flavor_name
,
7354 mock_extended_config_of_flavor
,
7355 mock_get_flavor_details
,
7357 """Create new flavor, change_name_if_used_false, there is extended."""
7359 mock_get_flavor_details
.return_value
= (3, vcpus
, {}, extended
)
7360 expected_result
= self
.new_flavor
.id
7361 result
= self
.vimconn
.new_flavor(flavor_data
, False)
7362 self
.assertEqual(result
, expected_result
)
7363 mock_reload_connection
.assert_called_once()
7364 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7365 mock_extended_config_of_flavor
.assert_called_once_with(extended
, {})
7366 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7367 name
=name1
, ram
=3, vcpus
=8, disk
=50, ephemeral
=0, swap
=0, is_public
=True
7369 check_if_assert_not_called(
7370 [mock_change_flavor_name
, mock_format_exception
, self
.new_flavor
.set_keys
]
7373 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7376 "_process_extended_config_of_flavor",
7377 new_callable
=CopyingMock(),
7379 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7380 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7381 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7382 def test_new_flavor_change_name_if_used_true_without_extended(
7384 mock_format_exception
,
7385 mock_reload_connection
,
7386 mock_change_flavor_name
,
7387 mock_extended_config_of_flavor
,
7388 mock_get_flavor_details
,
7390 """Create new flavor without extended parameters."""
7392 mock_change_flavor_name
.return_value
= name1
7393 expected_result
= self
.new_flavor
.id
7394 mock_get_flavor_details
.return_value
= (3, 8, {}, None)
7395 result
= self
.vimconn
.new_flavor(flavor_data2
)
7396 self
.assertEqual(result
, expected_result
)
7397 mock_reload_connection
.assert_called_once()
7398 mock_change_flavor_name
.assert_called_once_with(
7399 name1
, name_suffix
, flavor_data2
7401 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7402 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7403 name
=name1
, ram
=3, vcpus
=8, disk
=50, ephemeral
=0, swap
=0, is_public
=True
7405 check_if_assert_not_called(
7407 self
.new_flavor
.set_keys
,
7408 mock_extended_config_of_flavor
,
7409 mock_format_exception
,
7413 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7416 "_process_extended_config_of_flavor",
7417 new_callable
=CopyingMock(),
7419 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7420 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7421 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7422 def test_new_flavor_reload_connection_exception(
7424 mock_format_exception
,
7425 mock_reload_connection
,
7426 mock_change_flavor_name
,
7427 mock_extended_config_of_flavor
,
7428 mock_get_flavor_details
,
7430 """Create new flavor, reload connection exception occurred."""
7431 error_msg
= "Can not connect to client APIs."
7432 error
= nvExceptions
.ClientException(error_msg
)
7433 mock_change_flavor_name
.return_value
= name1
7434 mock_reload_connection
.side_effect
= error
7435 with self
.assertRaises(Exception) as err
:
7436 self
.vimconn
.new_flavor(flavor_data2
)
7437 self
.assertEqual(str(err
.exception
), "Can not connect to client APIs.")
7438 self
.assertEqual(mock_reload_connection
.call_count
, 1)
7439 call_mock_format_exception
= mock_format_exception
.call_args
7441 str(call_mock_format_exception
[0][0]), str(ClientException(error_msg
))
7443 check_if_assert_not_called(
7445 mock_change_flavor_name
,
7446 mock_get_flavor_details
,
7447 mock_extended_config_of_flavor
,
7448 self
.vimconn
.nova
.flavors
.create
,
7452 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7455 "_process_extended_config_of_flavor",
7456 new_callable
=CopyingMock(autospec
=True),
7458 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7459 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7460 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7461 def test_new_flavor_flavor_data_without_name(
7463 mock_format_exception
,
7464 mock_reload_connection
,
7465 mock_change_flavor_name
,
7466 mock_extended_config_of_flavor
,
7467 mock_get_flavor_details
,
7469 """Create new flavor, flavor data does not have name."""
7476 self
.vimconn
.new_flavor(flavor_data3
)
7477 mock_format_exception
.assert_called_once()
7478 call_mock_format_exception
= mock_format_exception
.call_args
7480 str(call_mock_format_exception
[0][0]), str(KeyError(error_msg
))
7482 check_if_assert_not_called(
7484 mock_reload_connection
,
7485 mock_change_flavor_name
,
7486 mock_get_flavor_details
,
7487 mock_extended_config_of_flavor
,
7488 self
.vimconn
.nova
.flavors
.create
,
7492 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7495 "_process_extended_config_of_flavor",
7496 new_callable
=CopyingMock(),
7498 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7499 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7500 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7501 def test_new_flavor_change_flavor_name_has_extended_conflict_exception_recovered_in_retry(
7503 mock_format_exception
,
7504 mock_reload_connection
,
7505 mock_change_flavor_name
,
7506 mock_extended_config_of_flavor
,
7507 mock_get_flavor_details
,
7509 """Create new flavor, nvExceptions.Conflict occurred and recovered, there is extended config."""
7511 error_msg
= "Conflict has occurred while creating flavor name."
7512 error2
= nvExceptions
.Conflict(error_msg
)
7513 mock_change_flavor_name
.side_effect
= [error2
, "sample-flavor-3"]
7514 expected_result
= self
.new_flavor
.id
7515 mock_get_flavor_details
.return_value
= (3, 8, {}, extended
)
7516 result
= self
.vimconn
.new_flavor(flavor_data2
)
7517 self
.assertEqual(result
, expected_result
)
7518 self
.assertEqual(mock_reload_connection
.call_count
, 2)
7519 mock_change_flavor_name
.assert_called_with(name1
, name_suffix
, flavor_data2
)
7520 self
.assertEqual(mock_change_flavor_name
.call_count
, 2)
7521 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7522 self
.assertEqual(mock_extended_config_of_flavor
.call_count
, 1)
7523 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7524 name
="sample-flavor-3",
7532 check_if_assert_not_called([self
.new_flavor
.set_keys
, mock_format_exception
])
7534 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7537 "_process_extended_config_of_flavor",
7538 new_callable
=CopyingMock(),
7540 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7541 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7542 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7543 def test_new_flavor_change_flavor_name_without_extended_conflict_exception_recovered_in_retry(
7545 mock_format_exception
,
7546 mock_reload_connection
,
7547 mock_change_flavor_name
,
7548 mock_extended_config_of_flavor
,
7549 mock_get_flavor_details
,
7551 """Create new flavor, nvExceptions.Conflict occurred and recovered, there is not extended config."""
7553 error2
= nvExceptions
.Conflict(
7554 "Conflict has occurred while creating flavor name."
7556 mock_change_flavor_name
.side_effect
= [error2
, "sample-flavor-3"]
7557 expected_result
= self
.new_flavor
.id
7558 mock_get_flavor_details
.return_value
= (3, 8, {}, None)
7559 result
= self
.vimconn
.new_flavor(flavor_data2
)
7560 self
.assertEqual(result
, expected_result
)
7561 self
.assertEqual(mock_reload_connection
.call_count
, 2)
7562 mock_change_flavor_name
.assert_called_with(name1
, name_suffix
, flavor_data2
)
7563 self
.assertEqual(mock_change_flavor_name
.call_count
, 2)
7564 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7565 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7566 name
="sample-flavor-3",
7574 check_if_assert_not_called(
7576 self
.new_flavor
.set_keys
,
7577 mock_extended_config_of_flavor
,
7578 mock_format_exception
,
7582 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7585 "_process_extended_config_of_flavor",
7586 new_callable
=CopyingMock(),
7588 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7589 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7590 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7591 def test_new_flavor_change_flavor_name_conflict_exception_change_name_if_used_false(
7593 mock_format_exception
,
7594 mock_reload_connection
,
7595 mock_change_flavor_name
,
7596 mock_extended_config_of_flavor
,
7597 mock_get_flavor_details
,
7599 """Create new flavor, nvExceptions.Conflict occurred,
7600 change_name_if_used is false."""
7601 change_name_if_used
= False
7602 error_msg
= "Conflict has occurred while creating flavor name."
7603 error2
= nvExceptions
.Conflict(error_msg
)
7604 mock_get_flavor_details
.return_value
= (4, 8, {}, None)
7605 self
.vimconn
.nova
.flavors
.create
.side_effect
= error2
7606 with self
.assertRaises(Exception) as err
:
7607 self
.vimconn
.new_flavor(flavor_data2
, change_name_if_used
)
7608 self
.assertEqual(str(err
.exception
), error_msg
)
7609 self
.assertEqual(type(err
.exception
), nvExceptions
.Conflict
)
7610 self
.vimconn
.nova
.flavors
.create
.assert_called_with(
7611 name
="sample-flavor",
7619 self
.assertEqual(mock_get_flavor_details
.call_count
, 3)
7620 self
.assertEqual(self
.vimconn
.nova
.flavors
.create
.call_count
, 3)
7621 self
.assertEqual(mock_reload_connection
.call_count
, 3)
7622 check_if_assert_not_called(
7623 [mock_change_flavor_name
, mock_extended_config_of_flavor
]
7625 _call_mock_format_exception
= mock_format_exception
.call_args
7627 str(_call_mock_format_exception
[0][0]), str(Conflict(error_msg
))
7629 self
.assertEqual(mock_format_exception
.call_count
, 3)
7631 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7634 "_process_extended_config_of_flavor",
7635 new_callable
=CopyingMock(),
7637 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7638 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7639 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7640 def test_new_flavor_client_exception_occurred_change_name_if_used_true(
7642 mock_format_exception
,
7643 mock_reload_connection
,
7644 mock_change_flavor_name
,
7645 mock_extended_config_of_flavor
,
7646 mock_get_flavor_details
,
7648 """Create new flavor, nvExceptions.ClientException occurred,
7649 change_name_if_used is true."""
7650 error_msg
= "Connection failed."
7651 error2
= nvExceptions
.ClientException(error_msg
)
7652 mock_change_flavor_name
.side_effect
= [
7657 mock_get_flavor_details
.return_value
= (3, 8, {}, None)
7658 self
.vimconn
.nova
.flavors
.create
.side_effect
= error2
7659 with self
.assertRaises(Exception) as err
:
7660 self
.vimconn
.new_flavor(flavor_data2
)
7662 str(err
.exception
), "Conflict has occurred while creating flavor name."
7664 self
.assertEqual(type(err
.exception
), nvExceptions
.Conflict
)
7665 self
.assertEqual(self
.vimconn
.nova
.flavors
.create
.call_count
, 1)
7666 _call_mock_nova_create_flavor
= self
.vimconn
.nova
.flavors
.create
.call_args_list
7668 _call_mock_nova_create_flavor
[0][1],
7671 "name": "sample-flavor-3",
7682 self
.assertEqual(mock_reload_connection
.call_count
, 1)
7683 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7684 _call_mock_change_flavor
= mock_change_flavor_name
.call_args_list
7686 _call_mock_change_flavor
[0][0],
7690 {"name": "sample-flavor", "ram": 3, "vcpus": 8, "disk": 50},
7693 self
.assertEqual(mock_change_flavor_name
.call_count
, 1)
7694 mock_extended_config_of_flavor
.assert_not_called()
7695 call_mock_format_exception
= mock_format_exception
.call_args
7697 str(call_mock_format_exception
[0][0]), str(ClientException(error_msg
))
7699 self
.assertEqual(mock_format_exception
.call_count
, 1)
7701 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7704 "_process_extended_config_of_flavor",
7705 new_callable
=CopyingMock(),
7707 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7708 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7709 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7710 def test_new_flavor_change_flavor_name_conflict_exception_occurred_change_name_if_used_true(
7712 mock_format_exception
,
7713 mock_reload_connection
,
7714 mock_change_flavor_name
,
7715 mock_extended_config_of_flavor
,
7716 mock_get_flavor_details
,
7718 """Create new flavor, nvExceptions.Conflict occurred,
7719 change_name_if_used is true."""
7720 error_msg
= "Conflict has occurred while creating flavor name."
7721 error2
= nvExceptions
.Conflict(error_msg
)
7722 mock_change_flavor_name
.side_effect
= [
7727 mock_get_flavor_details
.return_value
= (3, 8, {}, None)
7728 self
.vimconn
.nova
.flavors
.create
.side_effect
= error2
7729 with self
.assertRaises(Exception) as err
:
7730 self
.vimconn
.new_flavor(flavor_data2
)
7731 self
.assertEqual(str(err
.exception
), error_msg
)
7732 self
.assertEqual(type(err
.exception
), nvExceptions
.Conflict
)
7733 self
.assertEqual(self
.vimconn
.nova
.flavors
.create
.call_count
, 3)
7734 _call_mock_nova_create_flavor
= self
.vimconn
.nova
.flavors
.create
.call_args_list
7736 _call_mock_nova_create_flavor
[0][1],
7739 "name": "sample-flavor-3",
7750 _call_mock_nova_create_flavor
[1][1],
7753 "name": "sample-flavor-4",
7764 _call_mock_nova_create_flavor
[2][1],
7767 "name": "sample-flavor-5",
7777 self
.assertEqual(mock_reload_connection
.call_count
, 3)
7778 _call_mock_change_flavor
= mock_change_flavor_name
.call_args_list
7780 _call_mock_change_flavor
[0][0],
7784 {"name": "sample-flavor", "ram": 3, "vcpus": 8, "disk": 50},
7788 _call_mock_change_flavor
[1][0],
7792 {"name": "sample-flavor", "ram": 3, "vcpus": 8, "disk": 50},
7796 _call_mock_change_flavor
[2][0],
7800 {"name": "sample-flavor", "ram": 3, "vcpus": 8, "disk": 50},
7803 self
.assertEqual(mock_change_flavor_name
.call_count
, 3)
7804 mock_extended_config_of_flavor
.assert_not_called()
7805 call_mock_format_exception
= mock_format_exception
.call_args
7807 str(call_mock_format_exception
[0][0]), str(Conflict(error_msg
))
7809 self
.assertEqual(mock_format_exception
.call_count
, 1)
7811 def test_process_process_vio_numa_nodes_without_numa_with_extra_spec(self
):
7813 extra_specs
= {"hw:numa_nodes": "0"}
7814 expected_extra_spec
= {
7815 "vmware:latency_sensitivity_level": "high",
7816 "hw:numa_nodes": "0",
7818 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7819 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
7821 def test_process_process_vio_numa_nodes_list_type_numa_nodes_empty_extra_spec(self
):
7822 numa_nodes
= [7, 9, 4]
7824 expected_extra_spec
= {
7825 "vmware:latency_sensitivity_level": "high",
7827 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7828 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
7830 def test_process_process_vio_numa_nodes_with_numa_with_extra_spec(self
):
7832 extra_specs
= {"hw:numa_nodes": "5"}
7833 expected_extra_spec
= {
7834 "vmware:latency_sensitivity_level": "high",
7835 "hw:numa_nodes": "5",
7837 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7838 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
7840 def test_process_process_vio_numa_nodes_none_numa_nodes(self
):
7842 extra_specs
= {"hw:numa_nodes": "None"}
7843 expected_extra_spec
= {
7844 "vmware:latency_sensitivity_level": "high",
7845 "hw:numa_nodes": "None",
7847 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7848 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
7850 def test_process_process_vio_numa_nodes_invalid_type_extra_specs(self
):
7853 with self
.assertRaises(TypeError):
7854 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7857 if __name__
== "__main__":