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",
111 "Test is incomplete as it did not mock reload_connection and SFC methods are not in use."
113 class TestSfcOperations(unittest
.TestCase
):
114 @mock.patch("logging.getLogger", autospec
=True)
115 def setUp(self
, mock_logger
):
116 # Instantiate dummy VIM connector so we can test it
117 # It throws exception because of dummy parameters,
118 # We are disabling the logging of exception not to print them to console.
119 mock_logger
= logging
.getLogger()
120 mock_logger
.disabled
= True
121 self
.vimconn
= vimconnector(
134 create_sfc_port_pair
,
136 ingress_ports
=["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
137 egress_ports
=["230cdf1b-de37-4891-bc07-f9010cf1f967"],
139 # input to VIM connector
143 # TODO(igordc): must be changed to NSH in Queens (MPLS is a workaround)
145 if sfc_encap
is not None:
149 # what OpenStack is assumed to respond (patch OpenStack"s return value)
150 dict_from_neutron
= {
152 "id": "3d7ddc13-923c-4332-971e-708ed82902ce",
155 "tenant_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
156 "project_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
157 "ingress": ingress_ports
[0] if len(ingress_ports
) else None,
158 "egress": egress_ports
[0] if len(egress_ports
) else None,
159 "service_function_parameters": {"correlation": correlation
},
162 create_sfc_port_pair
.return_value
= dict_from_neutron
164 # what the VIM connector is expected to
165 # send to OpenStack based on the input
169 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
170 "egress": "230cdf1b-de37-4891-bc07-f9010cf1f967",
171 "service_function_parameters": {"correlation": correlation
},
175 # call the VIM connector
176 if sfc_encap
is None:
177 result
= self
.vimconn
.new_sfi(name
, ingress_ports
, egress_ports
)
179 result
= self
.vimconn
.new_sfi(name
, ingress_ports
, egress_ports
, sfc_encap
)
181 # assert that the VIM connector made the expected call to OpenStack
182 create_sfc_port_pair
.assert_called_with(dict_to_neutron
)
183 # assert that the VIM connector had the expected result / return value
184 self
.assertEqual(result
, dict_from_neutron
["port_pair"]["id"])
186 def _test_new_sf(self
, create_sfc_port_pair_group
):
187 # input to VIM connector
190 "bbd01220-cf72-41f2-9e70-0669c2e5c4cd",
191 "12ba215e-3987-4892-bd3a-d0fd91eecf98",
192 "e25a7c79-14c8-469a-9ae1-f601c9371ffd",
195 # what OpenStack is assumed to respond (patch OpenStack"s return value)
196 dict_from_neutron
= {
198 "id": "3d7ddc13-923c-4332-971e-708ed82902ce",
201 "tenant_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
202 "project_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
203 "port_pairs": instances
,
205 "port_pair_group_parameters": {
207 "ppg_n_tuple_mapping": {
208 "ingress_n_tuple": {},
209 "egress_n_tuple": {},
214 create_sfc_port_pair_group
.return_value
= dict_from_neutron
216 # what the VIM connector is expected to
217 # send to OpenStack based on the input
222 "bbd01220-cf72-41f2-9e70-0669c2e5c4cd",
223 "12ba215e-3987-4892-bd3a-d0fd91eecf98",
224 "e25a7c79-14c8-469a-9ae1-f601c9371ffd",
229 # call the VIM connector
230 result
= self
.vimconn
.new_sf(name
, instances
)
232 # assert that the VIM connector made the expected call to OpenStack
233 create_sfc_port_pair_group
.assert_called_with(dict_to_neutron
)
234 # assert that the VIM connector had the expected result / return value
235 self
.assertEqual(result
, dict_from_neutron
["port_pair_group"]["id"])
237 def _test_new_sfp(self
, create_sfc_port_chain
, sfc_encap
, spi
):
238 # input to VIM connector
241 "2bd2a2e5-c5fd-4eac-a297-d5e255c35c19",
242 "00f23389-bdfa-43c2-8b16-5815f2582fa8",
245 "2314daec-c262-414a-86e3-69bb6fa5bc16",
246 "d8bfdb5d-195e-4f34-81aa-6135705317df",
249 # TODO(igordc): must be changed to NSH in Queens (MPLS is a workaround)
255 # what OpenStack is assumed to respond (patch OpenStack"s return value)
256 dict_from_neutron
= {
258 "id": "5bc05721-079b-4b6e-a235-47cac331cbb6",
261 "tenant_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
262 "project_id": "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c",
263 "chain_id": chain_id
,
264 "flow_classifiers": classifications
,
265 "port_pair_groups": sfs
,
266 "chain_parameters": {"correlation": correlation
},
269 create_sfc_port_chain
.return_value
= dict_from_neutron
271 # what the VIM connector is expected to
272 # send to OpenStack based on the input
276 "flow_classifiers": [
277 "2bd2a2e5-c5fd-4eac-a297-d5e255c35c19",
278 "00f23389-bdfa-43c2-8b16-5815f2582fa8",
280 "port_pair_groups": [
281 "2314daec-c262-414a-86e3-69bb6fa5bc16",
282 "d8bfdb5d-195e-4f34-81aa-6135705317df",
284 "chain_parameters": {"correlation": correlation
},
288 dict_to_neutron
["port_chain"]["chain_id"] = spi
290 # call the VIM connector
291 if sfc_encap
is None:
292 dict_to_neutron
["port_chain"]["chain_parameters"] = {"correlation": "mpls"}
294 result
= self
.vimconn
.new_sfp(
295 name
, classifications
, sfs
, sfc_encap
=False
298 result
= self
.vimconn
.new_sfp(
299 name
, classifications
, sfs
, sfc_encap
=False, spi
=spi
303 result
= self
.vimconn
.new_sfp(name
, classifications
, sfs
, sfc_encap
)
305 result
= self
.vimconn
.new_sfp(
306 name
, classifications
, sfs
, sfc_encap
, spi
309 # assert that the VIM connector made the expected call to OpenStack
310 create_sfc_port_chain
.assert_called_with(dict_to_neutron
)
311 # assert that the VIM connector had the expected result / return value
312 self
.assertEqual(result
, dict_from_neutron
["port_chain"]["id"])
314 def _test_new_classification(self
, create_sfc_flow_classifier
, ctype
):
315 # input to VIM connector
316 name
= "osm_classification"
319 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
321 "source_ip_prefix": "192.168.2.0/24",
322 "source_port_range_max": 99,
323 "source_port_range_min": 50,
326 # what OpenStack is assumed to respond (patch OpenStack"s return value)
327 dict_from_neutron
= {"flow_classifier": copy
.copy(definition
)}
328 dict_from_neutron
["flow_classifier"][
330 ] = "7735ec2c-fddf-4130-9712-32ed2ab6a372"
331 dict_from_neutron
["flow_classifier"]["name"] = name
332 dict_from_neutron
["flow_classifier"]["description"] = ""
333 dict_from_neutron
["flow_classifier"][
335 ] = "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c"
336 dict_from_neutron
["flow_classifier"][
338 ] = "130b1e97-b0f1-40a8-8804-b6ad9b8c3e0c"
339 create_sfc_flow_classifier
.return_value
= dict_from_neutron
341 # what the VIM connector is expected to
342 # send to OpenStack based on the input
343 dict_to_neutron
= {"flow_classifier": copy
.copy(definition
)}
344 dict_to_neutron
["flow_classifier"]["name"] = "osm_classification"
346 # call the VIM connector
347 result
= self
.vimconn
.new_classification(name
, ctype
, definition
)
349 # assert that the VIM connector made the expected call to OpenStack
350 create_sfc_flow_classifier
.assert_called_with(dict_to_neutron
)
351 # assert that the VIM connector had the expected result / return value
352 self
.assertEqual(result
, dict_from_neutron
["flow_classifier"]["id"])
354 @mock.patch
.object(Client
, "create_sfc_flow_classifier")
355 def test_new_classification(self
, create_sfc_flow_classifier
):
356 self
._test
_new
_classification
(
357 create_sfc_flow_classifier
, "legacy_flow_classifier"
360 @mock.patch
.object(Client
, "create_sfc_flow_classifier")
361 def test_new_classification_unsupported_type(self
, create_sfc_flow_classifier
):
363 vimconn
.VimConnNotSupportedException
,
364 self
._test
_new
_classification
,
365 create_sfc_flow_classifier
,
369 @mock.patch
.object(Client
, "create_sfc_port_pair")
370 def test_new_sfi_with_sfc_encap(self
, create_sfc_port_pair
):
371 self
._test
_new
_sfi
(create_sfc_port_pair
, True)
373 @mock.patch
.object(Client
, "create_sfc_port_pair")
374 def test_new_sfi_without_sfc_encap(self
, create_sfc_port_pair
):
375 self
._test
_new
_sfi
(create_sfc_port_pair
, False)
377 @mock.patch
.object(Client
, "create_sfc_port_pair")
378 def test_new_sfi_default_sfc_encap(self
, create_sfc_port_pair
):
379 self
._test
_new
_sfi
(create_sfc_port_pair
, None)
381 @mock.patch
.object(Client
, "create_sfc_port_pair")
382 def test_new_sfi_bad_ingress_ports(self
, create_sfc_port_pair
):
384 "5311c75d-d718-4369-bbda-cdcc6da60fcc",
385 "a0273f64-82c9-11e7-b08f-6328e53f0fa7",
388 vimconn
.VimConnNotSupportedException
,
390 create_sfc_port_pair
,
392 ingress_ports
=ingress_ports
,
396 vimconn
.VimConnNotSupportedException
,
398 create_sfc_port_pair
,
400 ingress_ports
=ingress_ports
,
403 @mock.patch
.object(Client
, "create_sfc_port_pair")
404 def test_new_sfi_bad_egress_ports(self
, create_sfc_port_pair
):
406 "230cdf1b-de37-4891-bc07-f9010cf1f967",
407 "b41228fe-82c9-11e7-9b44-17504174320b",
410 vimconn
.VimConnNotSupportedException
,
412 create_sfc_port_pair
,
414 egress_ports
=egress_ports
,
418 vimconn
.VimConnNotSupportedException
,
420 create_sfc_port_pair
,
422 egress_ports
=egress_ports
,
425 @mock.patch
.object(vimconnector
, "get_sfi")
426 @mock.patch
.object(Client
, "create_sfc_port_pair_group")
427 def test_new_sf(self
, create_sfc_port_pair_group
, get_sfi
):
428 get_sfi
.return_value
= {"sfc_encap": True}
429 self
._test
_new
_sf
(create_sfc_port_pair_group
)
431 @mock.patch
.object(vimconnector
, "get_sfi")
432 @mock.patch
.object(Client
, "create_sfc_port_pair_group")
433 def test_new_sf_inconsistent_sfc_encap(self
, create_sfc_port_pair_group
, get_sfi
):
434 get_sfi
.return_value
= {"sfc_encap": "nsh"}
436 vimconn
.VimConnNotSupportedException
,
438 create_sfc_port_pair_group
,
441 @mock.patch
.object(Client
, "create_sfc_port_chain")
442 def test_new_sfp_with_sfc_encap(self
, create_sfc_port_chain
):
443 self
._test
_new
_sfp
(create_sfc_port_chain
, True, None)
445 @mock.patch
.object(Client
, "create_sfc_port_chain")
446 def test_new_sfp_without_sfc_encap(self
, create_sfc_port_chain
):
447 self
._test
_new
_sfp
(create_sfc_port_chain
, None, None)
448 self
._test
_new
_sfp
(create_sfc_port_chain
, None, 25)
450 @mock.patch
.object(Client
, "create_sfc_port_chain")
451 def test_new_sfp_default_sfc_encap(self
, create_sfc_port_chain
):
452 self
._test
_new
_sfp
(create_sfc_port_chain
, None, None)
454 @mock.patch
.object(Client
, "create_sfc_port_chain")
455 def test_new_sfp_with_sfc_encap_spi(self
, create_sfc_port_chain
):
456 self
._test
_new
_sfp
(create_sfc_port_chain
, True, 25)
458 @mock.patch
.object(Client
, "create_sfc_port_chain")
459 def test_new_sfp_default_sfc_encap_spi(self
, create_sfc_port_chain
):
460 self
._test
_new
_sfp
(create_sfc_port_chain
, None, 25)
462 @mock.patch
.object(Client
, "list_sfc_flow_classifiers")
463 def test_get_classification_list(self
, list_sfc_flow_classifiers
):
464 # what OpenStack is assumed to return to the VIM connector
465 list_sfc_flow_classifiers
.return_value
= {
466 "flow_classifiers": [
468 "source_port_range_min": 2000,
469 "destination_ip_prefix": "192.168.3.0/24",
474 "source_port_range_max": 2000,
475 "destination_port_range_min": 3000,
476 "source_ip_prefix": "192.168.2.0/24",
477 "logical_destination_port": None,
478 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
479 "destination_port_range_max": None,
480 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
481 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
482 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
488 # call the VIM connector
489 filter_dict
= {"protocol": "tcp", "ethertype": "IPv4"}
490 result
= self
.vimconn
.get_classification_list(filter_dict
.copy())
492 # assert that VIM connector called OpenStack with the expected filter
493 list_sfc_flow_classifiers
.assert_called_with(**filter_dict
)
494 # assert that the VIM connector successfully
495 # translated and returned the OpenStack result
500 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
503 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
504 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
505 "ctype": "legacy_flow_classifier",
507 "source_port_range_min": 2000,
508 "destination_ip_prefix": "192.168.3.0/24",
512 "source_port_range_max": 2000,
513 "destination_port_range_min": 3000,
514 "source_ip_prefix": "192.168.2.0/24",
515 "logical_destination_port": None,
516 "destination_port_range_max": None,
517 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
523 def _test_get_sfi_list(self
, list_port_pair
, correlation
, sfc_encap
):
524 # what OpenStack is assumed to return to the VIM connector
525 list_port_pair
.return_value
= {
528 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
530 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
531 "egress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
532 "service_function_parameters": {"correlation": correlation
},
533 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
534 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
540 # call the VIM connector
541 filter_dict
= {"name": "osm_sfi", "description": ""}
542 result
= self
.vimconn
.get_sfi_list(filter_dict
.copy())
544 # assert that VIM connector called OpenStack with the expected filter
545 list_port_pair
.assert_called_with(**filter_dict
)
546 # assert that the VIM connector successfully
547 # translated and returned the OpenStack result
552 "ingress_ports": ["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
554 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
555 "egress_ports": ["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
556 "sfc_encap": sfc_encap
,
557 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
558 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
564 @mock.patch
.object(Client
, "list_sfc_port_pairs")
565 def test_get_sfi_list_with_sfc_encap(self
, list_sfc_port_pairs
):
566 self
._test
_get
_sfi
_list
(list_sfc_port_pairs
, "nsh", True)
568 @mock.patch
.object(Client
, "list_sfc_port_pairs")
569 def test_get_sfi_list_without_sfc_encap(self
, list_sfc_port_pairs
):
570 self
._test
_get
_sfi
_list
(list_sfc_port_pairs
, None, False)
572 @mock.patch
.object(Client
, "list_sfc_port_pair_groups")
573 def test_get_sf_list(self
, list_sfc_port_pair_groups
):
574 # what OpenStack is assumed to return to the VIM connector
575 list_sfc_port_pair_groups
.return_value
= {
576 "port_pair_groups": [
579 "08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2",
580 "0d63799c-82d6-11e7-8deb-a746bb3ae9f5",
583 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
584 "port_pair_group_parameters": {},
585 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
586 "id": "f4a0bde8-82d5-11e7-90e1-a72b762fa27f",
592 # call the VIM connector
593 filter_dict
= {"name": "osm_sf", "description": ""}
594 result
= self
.vimconn
.get_sf_list(filter_dict
.copy())
596 # assert that VIM connector called OpenStack with the expected filter
597 list_sfc_port_pair_groups
.assert_called_with(**filter_dict
)
598 # assert that the VIM connector successfully
599 # translated and returned the OpenStack result
605 "08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2",
606 "0d63799c-82d6-11e7-8deb-a746bb3ae9f5",
609 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
610 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
611 "id": "f4a0bde8-82d5-11e7-90e1-a72b762fa27f",
617 def _test_get_sfp_list(self
, list_sfc_port_chains
, correlation
, sfc_encap
):
618 # what OpenStack is assumed to return to the VIM connector
619 list_sfc_port_chains
.return_value
= {
622 "port_pair_groups": [
623 "7d8e3bf8-82d6-11e7-a032-8ff028839d25",
624 "7dc9013e-82d6-11e7-a5a6-a3a8d78a5518",
626 "flow_classifiers": [
627 "1333c2f4-82d7-11e7-a5df-9327f33d104e",
628 "1387ab44-82d7-11e7-9bb0-476337183905",
631 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
632 "chain_parameters": {"correlation": correlation
},
634 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
635 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
641 # call the VIM connector
642 filter_dict
= {"name": "osm_sfp", "description": ""}
643 result
= self
.vimconn
.get_sfp_list(filter_dict
.copy())
645 # assert that VIM connector called OpenStack with the expected filter
646 list_sfc_port_chains
.assert_called_with(**filter_dict
)
647 # assert that the VIM connector successfully
648 # translated and returned the OpenStack result
653 "service_functions": [
654 "7d8e3bf8-82d6-11e7-a032-8ff028839d25",
655 "7dc9013e-82d6-11e7-a5a6-a3a8d78a5518",
658 "1333c2f4-82d7-11e7-a5df-9327f33d104e",
659 "1387ab44-82d7-11e7-9bb0-476337183905",
662 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
663 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
664 "sfc_encap": sfc_encap
,
666 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
672 @mock.patch
.object(Client
, "list_sfc_port_chains")
673 def test_get_sfp_list_with_sfc_encap(self
, list_sfc_port_chains
):
674 self
._test
_get
_sfp
_list
(list_sfc_port_chains
, "nsh", True)
676 @mock.patch
.object(Client
, "list_sfc_port_chains")
677 def test_get_sfp_list_without_sfc_encap(self
, list_sfc_port_chains
):
678 self
._test
_get
_sfp
_list
(list_sfc_port_chains
, None, False)
680 @mock.patch
.object(Client
, "list_sfc_flow_classifiers")
681 def test_get_classification(self
, list_sfc_flow_classifiers
):
682 # what OpenStack is assumed to return to the VIM connector
683 list_sfc_flow_classifiers
.return_value
= {
684 "flow_classifiers": [
686 "source_port_range_min": 2000,
687 "destination_ip_prefix": "192.168.3.0/24",
692 "source_port_range_max": 2000,
693 "destination_port_range_min": 3000,
694 "source_ip_prefix": "192.168.2.0/24",
695 "logical_destination_port": None,
696 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
697 "destination_port_range_max": None,
698 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
699 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
700 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
706 # call the VIM connector
707 result
= self
.vimconn
.get_classification("22198366-d4e8-4d6b-b4d2-637d5d6cbb7d")
709 # assert that VIM connector called OpenStack with the expected filter
710 list_sfc_flow_classifiers
.assert_called_with(
711 id="22198366-d4e8-4d6b-b4d2-637d5d6cbb7d"
713 # assert that VIM connector successfully returned the OpenStack result
717 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
720 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
721 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
722 "ctype": "legacy_flow_classifier",
724 "source_port_range_min": 2000,
725 "destination_ip_prefix": "192.168.3.0/24",
729 "source_port_range_max": 2000,
730 "destination_port_range_min": 3000,
731 "source_ip_prefix": "192.168.2.0/24",
732 "logical_destination_port": None,
733 "destination_port_range_max": None,
734 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
739 @mock.patch
.object(Client
, "list_sfc_flow_classifiers")
740 def test_get_classification_many_results(self
, list_sfc_flow_classifiers
):
741 # what OpenStack is assumed to return to the VIM connector
742 list_sfc_flow_classifiers
.return_value
= {
743 "flow_classifiers": [
745 "source_port_range_min": 2000,
746 "destination_ip_prefix": "192.168.3.0/24",
751 "source_port_range_max": 2000,
752 "destination_port_range_min": 3000,
753 "source_ip_prefix": "192.168.2.0/24",
754 "logical_destination_port": None,
755 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
756 "destination_port_range_max": None,
757 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
758 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
759 "id": "22198366-d4e8-4d6b-b4d2-637d5d6cbb7d",
763 "source_port_range_min": 1000,
764 "destination_ip_prefix": "192.168.3.0/24",
769 "source_port_range_max": 1000,
770 "destination_port_range_min": 3000,
771 "source_ip_prefix": "192.168.2.0/24",
772 "logical_destination_port": None,
773 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
774 "destination_port_range_max": None,
775 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
776 "logical_source_port": "aaab0ab0-1452-4636-bb3b-11dca833fa2b",
777 "id": "3196bafc-82dd-11e7-a205-9bf6c14b0721",
783 # call the VIM connector
785 vimconn
.VimConnConflictException
,
786 self
.vimconn
.get_classification
,
787 "3196bafc-82dd-11e7-a205-9bf6c14b0721",
790 # assert the VIM connector called OpenStack with the expected filter
791 list_sfc_flow_classifiers
.assert_called_with(
792 id="3196bafc-82dd-11e7-a205-9bf6c14b0721"
795 @mock.patch
.object(Client
, "list_sfc_flow_classifiers")
796 def test_get_classification_no_results(self
, list_sfc_flow_classifiers
):
797 # what OpenStack is assumed to return to the VIM connector
798 list_sfc_flow_classifiers
.return_value
= {"flow_classifiers": []}
800 # call the VIM connector
802 vimconn
.VimConnNotFoundException
,
803 self
.vimconn
.get_classification
,
804 "3196bafc-82dd-11e7-a205-9bf6c14b0721",
807 # assert the VIM connector called OpenStack with the expected filter
808 list_sfc_flow_classifiers
.assert_called_with(
809 id="3196bafc-82dd-11e7-a205-9bf6c14b0721"
812 @mock.patch
.object(Client
, "list_sfc_port_pairs")
813 def test_get_sfi(self
, list_sfc_port_pairs
):
814 # what OpenStack is assumed to return to the VIM connector
815 list_sfc_port_pairs
.return_value
= {
818 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
820 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
821 "egress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
822 "service_function_parameters": {"correlation": "nsh"},
823 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
824 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
830 # call the VIM connector
831 result
= self
.vimconn
.get_sfi("c121ebdd-7f2d-4213-b933-3325298a6966")
833 # assert the VIM connector called OpenStack with the expected filter
834 list_sfc_port_pairs
.assert_called_with(
835 id="c121ebdd-7f2d-4213-b933-3325298a6966"
837 # assert the VIM connector successfully returned the OpenStack result
841 "ingress_ports": ["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
842 "egress_ports": ["5311c75d-d718-4369-bbda-cdcc6da60fcc"],
845 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
846 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
847 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
852 @mock.patch
.object(Client
, "list_sfc_port_pairs")
853 def test_get_sfi_many_results(self
, list_sfc_port_pairs
):
854 # what OpenStack is assumed to return to the VIM connector
855 list_sfc_port_pairs
.return_value
= {
858 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
860 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
861 "egress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
862 "service_function_parameters": {"correlation": "nsh"},
863 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
864 "id": "c121ebdd-7f2d-4213-b933-3325298a6966",
868 "ingress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
870 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
871 "egress": "5311c75d-d718-4369-bbda-cdcc6da60fcc",
872 "service_function_parameters": {"correlation": "nsh"},
873 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
874 "id": "c0436d92-82db-11e7-8f9c-5fa535f1261f",
880 # call the VIM connector
882 vimconn
.VimConnConflictException
,
883 self
.vimconn
.get_sfi
,
884 "c0436d92-82db-11e7-8f9c-5fa535f1261f",
887 # assert that VIM connector called OpenStack with the expected filter
888 list_sfc_port_pairs
.assert_called_with(
889 id="c0436d92-82db-11e7-8f9c-5fa535f1261f"
892 @mock.patch
.object(Client
, "list_sfc_port_pairs")
893 def test_get_sfi_no_results(self
, list_sfc_port_pairs
):
894 # what OpenStack is assumed to return to the VIM connector
895 list_sfc_port_pairs
.return_value
= {"port_pairs": []}
897 # call the VIM connector
899 vimconn
.VimConnNotFoundException
,
900 self
.vimconn
.get_sfi
,
901 "b22892fc-82d9-11e7-ae85-0fea6a3b3757",
904 # assert that VIM connector called OpenStack with the expected filter
905 list_sfc_port_pairs
.assert_called_with(
906 id="b22892fc-82d9-11e7-ae85-0fea6a3b3757"
909 @mock.patch
.object(Client
, "list_sfc_port_pair_groups")
910 def test_get_sf(self
, list_sfc_port_pair_groups
):
911 # what OpenStack is assumed to return to the VIM connector
912 list_sfc_port_pair_groups
.return_value
= {
913 "port_pair_groups": [
915 "port_pairs": ["08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2"],
917 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
918 "port_pair_group_parameters": {},
919 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
920 "id": "aabba8a6-82d9-11e7-a18a-d3c7719b742d",
926 # call the VIM connector
927 result
= self
.vimconn
.get_sf("b22892fc-82d9-11e7-ae85-0fea6a3b3757")
929 # assert that VIM connector called OpenStack with the expected filter
930 list_sfc_port_pair_groups
.assert_called_with(
931 id="b22892fc-82d9-11e7-ae85-0fea6a3b3757"
933 # assert that VIM connector successfully returned the OpenStack result
938 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
939 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
940 "sfis": ["08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2"],
941 "id": "aabba8a6-82d9-11e7-a18a-d3c7719b742d",
946 @mock.patch
.object(Client
, "list_sfc_port_pair_groups")
947 def test_get_sf_many_results(self
, list_sfc_port_pair_groups
):
948 # what OpenStack is assumed to return to the VIM connector
949 list_sfc_port_pair_groups
.return_value
= {
950 "port_pair_groups": [
952 "port_pairs": ["08fbdbb0-82d6-11e7-ad95-9bb52fbec2f2"],
954 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
955 "port_pair_group_parameters": {},
956 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
957 "id": "aabba8a6-82d9-11e7-a18a-d3c7719b742d",
961 "port_pairs": ["0d63799c-82d6-11e7-8deb-a746bb3ae9f5"],
963 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
964 "port_pair_group_parameters": {},
965 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
966 "id": "b22892fc-82d9-11e7-ae85-0fea6a3b3757",
972 # call the VIM connector
974 vimconn
.VimConnConflictException
,
976 "b22892fc-82d9-11e7-ae85-0fea6a3b3757",
979 # assert that VIM connector called OpenStack with the expected filter
980 list_sfc_port_pair_groups
.assert_called_with(
981 id="b22892fc-82d9-11e7-ae85-0fea6a3b3757"
984 @mock.patch
.object(Client
, "list_sfc_port_pair_groups")
985 def test_get_sf_no_results(self
, list_sfc_port_pair_groups
):
986 # what OpenStack is assumed to return to the VIM connector
987 list_sfc_port_pair_groups
.return_value
= {"port_pair_groups": []}
989 # call the VIM connector
991 vimconn
.VimConnNotFoundException
,
993 "b22892fc-82d9-11e7-ae85-0fea6a3b3757",
996 # assert that VIM connector called OpenStack with the expected filter
997 list_sfc_port_pair_groups
.assert_called_with(
998 id="b22892fc-82d9-11e7-ae85-0fea6a3b3757"
1001 @mock.patch
.object(Client
, "list_sfc_port_chains")
1002 def test_get_sfp(self
, list_sfc_port_chains
):
1003 # what OpenStack is assumed to return to the VIM connector
1004 list_sfc_port_chains
.return_value
= {
1007 "port_pair_groups": ["7d8e3bf8-82d6-11e7-a032-8ff028839d25"],
1008 "flow_classifiers": ["1333c2f4-82d7-11e7-a5df-9327f33d104e"],
1010 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1011 "chain_parameters": {"correlation": "nsh"},
1013 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1014 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
1020 # call the VIM connector
1021 result
= self
.vimconn
.get_sfp("821bc9be-82d7-11e7-8ce3-23a08a27ab47")
1023 # assert that VIM connector called OpenStack with the expected filter
1024 list_sfc_port_chains
.assert_called_with(
1025 id="821bc9be-82d7-11e7-8ce3-23a08a27ab47"
1027 # assert that VIM connector successfully returned the OpenStack result
1031 "service_functions": ["7d8e3bf8-82d6-11e7-a032-8ff028839d25"],
1032 "classifications": ["1333c2f4-82d7-11e7-a5df-9327f33d104e"],
1034 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1035 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1038 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
1043 @mock.patch
.object(Client
, "list_sfc_port_chains")
1044 def test_get_sfp_many_results(self
, list_sfc_port_chains
):
1045 # what OpenStack is assumed to return to the VIM connector
1046 list_sfc_port_chains
.return_value
= {
1049 "port_pair_groups": ["7d8e3bf8-82d6-11e7-a032-8ff028839d25"],
1050 "flow_classifiers": ["1333c2f4-82d7-11e7-a5df-9327f33d104e"],
1052 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1053 "chain_parameters": {"correlation": "nsh"},
1055 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1056 "id": "821bc9be-82d7-11e7-8ce3-23a08a27ab47",
1060 "port_pair_groups": ["7d8e3bf8-82d6-11e7-a032-8ff028839d25"],
1061 "flow_classifiers": ["1333c2f4-82d7-11e7-a5df-9327f33d104e"],
1063 "tenant_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1064 "chain_parameters": {"correlation": "nsh"},
1066 "project_id": "8f3019ef06374fa880a0144ad4bc1d7b",
1067 "id": "5d002f38-82de-11e7-a770-f303f11ce66a",
1073 # call the VIM connector
1075 vimconn
.VimConnConflictException
,
1076 self
.vimconn
.get_sfp
,
1077 "5d002f38-82de-11e7-a770-f303f11ce66a",
1080 # assert that VIM connector called OpenStack with the expected filter
1081 list_sfc_port_chains
.assert_called_with(
1082 id="5d002f38-82de-11e7-a770-f303f11ce66a"
1085 @mock.patch
.object(Client
, "list_sfc_port_chains")
1086 def test_get_sfp_no_results(self
, list_sfc_port_chains
):
1087 # what OpenStack is assumed to return to the VIM connector
1088 list_sfc_port_chains
.return_value
= {"port_chains": []}
1090 # call the VIM connector
1092 vimconn
.VimConnNotFoundException
,
1093 self
.vimconn
.get_sfp
,
1094 "5d002f38-82de-11e7-a770-f303f11ce66a",
1097 # assert that VIM connector called OpenStack with the expected filter
1098 list_sfc_port_chains
.assert_called_with(
1099 id="5d002f38-82de-11e7-a770-f303f11ce66a"
1102 @mock.patch
.object(Client
, "delete_sfc_flow_classifier")
1103 def test_delete_classification(self
, delete_sfc_flow_classifier
):
1104 result
= self
.vimconn
.delete_classification(
1105 "638f957c-82df-11e7-b7c8-132706021464"
1107 delete_sfc_flow_classifier
.assert_called_with(
1108 "638f957c-82df-11e7-b7c8-132706021464"
1110 self
.assertEqual(result
, "638f957c-82df-11e7-b7c8-132706021464")
1112 @mock.patch
.object(Client
, "delete_sfc_port_pair")
1113 def test_delete_sfi(self
, delete_sfc_port_pair
):
1114 result
= self
.vimconn
.delete_sfi("638f957c-82df-11e7-b7c8-132706021464")
1115 delete_sfc_port_pair
.assert_called_with("638f957c-82df-11e7-b7c8-132706021464")
1116 self
.assertEqual(result
, "638f957c-82df-11e7-b7c8-132706021464")
1118 @mock.patch
.object(Client
, "delete_sfc_port_pair_group")
1119 def test_delete_sf(self
, delete_sfc_port_pair_group
):
1120 result
= self
.vimconn
.delete_sf("638f957c-82df-11e7-b7c8-132706021464")
1121 delete_sfc_port_pair_group
.assert_called_with(
1122 "638f957c-82df-11e7-b7c8-132706021464"
1124 self
.assertEqual(result
, "638f957c-82df-11e7-b7c8-132706021464")
1126 @mock.patch
.object(Client
, "delete_sfc_port_chain")
1127 def test_delete_sfp(self
, delete_sfc_port_chain
):
1128 result
= self
.vimconn
.delete_sfp("638f957c-82df-11e7-b7c8-132706021464")
1129 delete_sfc_port_chain
.assert_called_with("638f957c-82df-11e7-b7c8-132706021464")
1130 self
.assertEqual(result
, "638f957c-82df-11e7-b7c8-132706021464")
1133 def check_if_assert_not_called(mocks
: list):
1134 for mocking
in mocks
:
1135 mocking
.assert_not_called()
1139 def __init__(self
, s
):
1146 class CopyingMock(MagicMock
):
1147 def __call__(self
, *args
, **kwargs
):
1148 args
= deepcopy(args
)
1149 kwargs
= deepcopy(kwargs
)
1150 return super(CopyingMock
, self
).__call
__(*args
, **kwargs
)
1153 class TestNewVmInstance(unittest
.TestCase
):
1154 @patch("logging.getLogger", autospec
=True)
1155 def setUp(self
, mock_logger
):
1156 # Instantiate dummy VIM connector so we can test it
1157 # It throws exception because of dummy parameters,
1158 # We are disabling the logging of exception not to print them to console.
1159 mock_logger
= logging
.getLogger()
1160 mock_logger
.disabled
= True
1161 self
.vimconn
= vimconnector(
1171 self
.vimconn
.neutron
= CopyingMock()
1172 self
.vimconn
.nova
= CopyingMock()
1173 self
.vimconn
.cinder
= CopyingMock()
1174 self
.server
= MagicMock(object, autospec
=True)
1175 self
.server
.tenant_id
= "408b73-r9cc-5a6a-a270-82cc4811bd4a"
1176 self
.server
.id = "908b73-e9cc-5a6a-t270-82cc4811bd4a"
1177 self
.vimconn
.config
["security_groups"] = "default"
1178 self
.vimconn
.config
["keypair"] = "my_keypair"
1179 self
.vimconn
.security_groups_id
= "12345"
1180 self
.vimconn
.nova
.api_version
.get_string
.return_value
= "2.32"
1181 self
.vimconn
.logger
= CopyingMock()
1183 @patch.object(vimconnector
, "_get_ids_from_name")
1184 def test_prepare_port_dict_security_security_groups_exists_in_config(
1187 """In VIM config security_groups exists, net port_security is True
1188 no_port_security_extension does not exist.
1190 self
.vimconn
.config
= {"security_groups": "example_security_group"}
1191 net
= {"port_security": True}
1193 result_dict
= {"security_groups": "12345"}
1195 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1196 self
.assertDictEqual(result_dict
, port_dict
)
1197 mock_get_ids
.assert_not_called()
1199 @patch.object(vimconnector
, "_get_ids_from_name")
1200 def test_prepare_port_dict_security_security_groups_exists_in_config_no_security_groups_id(
1203 """In VIM config Security_groups exists, net port_security is True, vim security_groups_id does not exist,
1204 no_port_security_extension does not exist.
1206 self
.vimconn
.config
= {"security_groups": "example_security_group"}
1207 self
.vimconn
.security_groups_id
= None
1208 net
= {"port_security": True}
1210 result_dict
= {"security_groups": None}
1212 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1213 self
.assertDictEqual(result_dict
, port_dict
)
1214 mock_get_ids
.assert_called()
1216 @patch.object(vimconnector
, "_get_ids_from_name")
1217 def test_prepare_port_dict_security_security_groups_exists_security_extension_true_in_config(
1220 """In VIM config security_groups exists, net port_security is True, in VIM security_groups_id exists,
1221 no_port_security_extension set to True.
1223 self
.vimconn
.config
= {
1224 "security_groups": "example_security_group",
1225 "no_port_security_extension": True,
1227 net
= {"port_security": True}
1231 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1232 self
.assertDictEqual(result_dict
, port_dict
)
1233 mock_get_ids
.assert_not_called()
1235 @patch.object(vimconnector
, "_get_ids_from_name")
1236 def test_prepare_port_dict_security_no_security_groups_in_config(
1239 """In VIM config security_group does not exist, net port_security True, in VIM security_groups_id exists,
1240 no_port_security_extension does not exist."""
1241 self
.vimconn
.config
= {}
1242 net
= {"port_security": True}
1246 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1247 self
.assertDictEqual(result_dict
, port_dict
)
1248 mock_get_ids
.assert_not_called()
1250 @patch.object(vimconnector
, "_get_ids_from_name")
1251 def test_prepare_port_dict_security_no_security_groups_security_extension_true_in_config(
1254 """Security_group does not exist, net port_security is True, in VIM security_groups_id exists,
1255 no_port_security_extension set to True."""
1256 self
.vimconn
.config
= {"no_port_security_extension": True}
1257 net
= {"port_security": True}
1261 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1262 self
.assertDictEqual(result_dict
, port_dict
)
1263 mock_get_ids
.assert_not_called()
1265 @patch.object(vimconnector
, "_get_ids_from_name")
1266 def test_prepare_port_dict_security_security_groups_exists_net_port_security_false(
1269 """In VIM config security_group exists, net port_security False, security_groups_id exists,
1270 no_port_security_extension does not exist."""
1271 self
.vimconn
.config
= {"security_groups": "example_security_group"}
1272 net
= {"port_security": False}
1276 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1277 self
.assertDictEqual(result_dict
, port_dict
)
1278 mock_get_ids
.assert_not_called()
1280 @patch.object(vimconnector
, "_get_ids_from_name")
1281 def test_prepare_port_dict_security_net_port_security_false_port_security_extension_true(
1284 """In VIM config security_group exists, net port_security False, security_groups_id exists,
1285 no_port_security_extension set to True."""
1286 self
.vimconn
.config
= {
1287 "security_groups": "example_security_group",
1288 "no_port_security_extension": True,
1290 net
= {"port_security": False}
1294 self
.vimconn
._prepare
_port
_dict
_security
_groups
(net
, port_dict
)
1295 self
.assertDictEqual(result_dict
, port_dict
)
1296 mock_get_ids
.assert_not_called()
1298 def test_prepare_port_dict_binding_net_type_virtual(self
):
1299 """net type is virtual."""
1300 net
= {"type": "virtual"}
1303 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1304 self
.assertDictEqual(result_dict
, port_dict
)
1306 def test_prepare_port_dict_binding_net_type_vf(self
):
1307 """net type is VF, vim_type is not VIO."""
1308 net
= {"type": "VF"}
1309 self
.vimconn
.vim_type
= None
1311 result_dict
= {"binding:vnic_type": "direct"}
1312 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1313 self
.assertDictEqual(port_dict
, result_dict
)
1315 def test_prepare_port_dict_binding_net_type_sriov_vim_type_vio(self
):
1316 """net type is SR-IOV, vim_type is VIO."""
1317 net
= {"type": "SR-IOV"}
1318 self
.vimconn
.vim_type
= "VIO"
1321 "binding:vnic_type": "direct",
1322 "port_security_enabled": False,
1323 "provider_security_groups": [],
1324 "security_groups": [],
1326 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1327 self
.assertDictEqual(port_dict
, result_dict
)
1329 def test_prepare_port_dict_binding_net_type_passthrough(self
):
1330 """net type is pci-passthrough."""
1331 net
= {"type": "PCI-PASSTHROUGH"}
1334 "binding:vnic_type": "direct-physical",
1336 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1337 self
.assertDictEqual(port_dict
, result_dict
)
1339 def test_prepare_port_dict_binding_no_net_type(self
):
1340 """net type is missing."""
1343 with self
.assertRaises(VimConnException
) as err
:
1344 self
.vimconn
._prepare
_port
_dict
_binding
(net
, port_dict
)
1345 self
.assertEqual(str(err
.exception
), "Type is missing in the network details.")
1347 def test_set_fixed_ip(self
):
1348 """new_port has fixed ip."""
1352 "fixed_ips": [{"ip_address": "10.1.2.3"}, {"ip_address": "20.1.2.3"}]
1355 result
= {"ip": "10.1.2.3"}
1356 self
.vimconn
._set
_fixed
_ip
(new_port
, net
)
1357 self
.assertDictEqual(net
, result
)
1359 def test_set_fixed_ip_no_fixed_ip(self
):
1360 """new_port does not have fixed ip."""
1362 new_port
= {"port": {}}
1363 result
= {"ip": None}
1364 self
.vimconn
._set
_fixed
_ip
(new_port
, net
)
1365 self
.assertDictEqual(net
, result
)
1367 def test_set_fixed_ip_raise_exception(self
):
1368 """new_port does not have port details."""
1371 with self
.assertRaises(Exception) as err
:
1372 self
.vimconn
._set
_fixed
_ip
(new_port
, net
)
1373 self
.assertEqual(type(err
.exception
), KeyError)
1375 def test_prepare_port_dict_mac_ip_addr(self
):
1376 """mac address and ip address exist."""
1378 "mac_address": mac_address
,
1379 "ip_address": "10.0.1.5",
1383 "mac_address": mac_address
,
1384 "fixed_ips": [{"ip_address": "10.0.1.5"}],
1386 self
.vimconn
._prepare
_port
_dict
_mac
_ip
_addr
(net
, port_dict
)
1387 self
.assertDictEqual(port_dict
, result_dict
)
1389 def test_prepare_port_dict_mac_ip_addr_no_mac_and_ip(self
):
1390 """mac address and ip address does not exist."""
1394 self
.vimconn
._prepare
_port
_dict
_mac
_ip
_addr
(net
, port_dict
)
1395 self
.assertDictEqual(port_dict
, result_dict
)
1397 def test_create_new_port(self
):
1398 """new port has id and mac address."""
1402 "mac_address": mac_address
,
1405 self
.vimconn
.neutron
.create_port
.return_value
= new_port
1406 net
, port_dict
, created_items
= {}, {}, {}
1407 expected_result
= new_port
1409 "mac_adress": mac_address
,
1412 expected_created_items
= {f
"port:{port_id}": True}
1413 result
= self
.vimconn
._create
_new
_port
(port_dict
, created_items
, net
)
1414 self
.assertDictEqual(result
, expected_result
)
1415 self
.assertEqual(net
, expected_net
)
1416 self
.assertEqual(created_items
, expected_created_items
)
1417 self
.vimconn
.neutron
.create_port
.assert_called_once_with({"port": port_dict
})
1419 def test_create_new_port_without_mac_or_id(self
):
1420 """new port does not have mac address or ID."""
1422 self
.vimconn
.neutron
.create_port
.return_value
= new_port
1423 net
, port_dict
, created_items
= {}, {}, {}
1424 with self
.assertRaises(KeyError):
1425 self
.vimconn
._create
_new
_port
(port_dict
, created_items
, net
)
1426 self
.vimconn
.neutron
.create_port
.assert_called_once_with({"port": port_dict
})
1428 def test_create_new_port_neutron_create_port_raises_exception(self
):
1429 """Neutron create port raises exception."""
1430 self
.vimconn
.neutron
.create_port
.side_effect
= VimConnException(
1431 "New port is not created."
1433 net
, port_dict
, created_items
= {}, {}, {}
1434 with self
.assertRaises(VimConnException
):
1435 self
.vimconn
._create
_new
_port
(port_dict
, created_items
, net
)
1436 self
.vimconn
.neutron
.create_port
.assert_called_once_with({"port": port_dict
})
1438 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1439 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1440 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1441 @patch.object(vimconnector
, "_create_new_port")
1442 @patch.object(vimconnector
, "_set_fixed_ip")
1443 def test_create_port(
1446 mock_create_new_port
,
1447 mock_prepare_port_dict_mac_ip_addr
,
1448 mock_prepare_port_dict_binding
,
1449 mock_prepare_port_dict_security_groups
,
1451 """Net has name, type, net-id."""
1455 "name": "management",
1462 "mac_address": mac_address
,
1463 "name": "management",
1464 "fixed_ips": [{"ip_address": ip_addr1
}],
1467 mock_create_new_port
.return_value
= new_port
1470 "tag": "management",
1473 "network_id": net_id
,
1474 "name": "management",
1475 "admin_state_up": True,
1478 new_port_result
, port_result
= self
.vimconn
._create
_port
(
1479 net
, name
, created_items
1482 self
.assertDictEqual(new_port_result
, new_port
)
1483 self
.assertDictEqual(port_result
, expected_port
)
1485 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1486 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1487 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1488 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1489 mock_set_fixed_ip
.assert_called_once_with(new_port
, net
)
1491 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1492 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1493 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1494 @patch.object(vimconnector
, "_create_new_port")
1495 @patch.object(vimconnector
, "_set_fixed_ip")
1496 def test_create_port_no_port_name(
1499 mock_create_new_port
,
1500 mock_prepare_port_dict_mac_ip_addr
,
1501 mock_prepare_port_dict_binding
,
1502 mock_prepare_port_dict_security_groups
,
1504 """Net has no name."""
1513 "mac_address": mac_address
,
1515 "fixed_ips": [{"ip_address": ip_addr1
}],
1518 mock_create_new_port
.return_value
= new_port
1524 "network_id": net_id
,
1525 "admin_state_up": True,
1529 new_port_result
, port_result
= self
.vimconn
._create
_port
(
1530 net
, name
, created_items
1533 self
.assertDictEqual(new_port_result
, new_port
)
1534 self
.assertDictEqual(port_result
, expected_port
)
1536 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1537 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1538 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1539 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1540 mock_set_fixed_ip
.assert_called_once_with(new_port
, net
)
1542 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1543 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1544 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1545 @patch.object(vimconnector
, "_create_new_port")
1546 @patch.object(vimconnector
, "_set_fixed_ip")
1547 def test_create_port_nova_api_version_smaller_than_232(
1550 mock_create_new_port
,
1551 mock_prepare_port_dict_mac_ip_addr
,
1552 mock_prepare_port_dict_binding
,
1553 mock_prepare_port_dict_security_groups
,
1555 """Nova api version is smaller than 2.32."""
1556 self
.vimconn
.nova
.api_version
.get_string
.return_value
= "2.30"
1565 "mac_address": mac_address
,
1567 "fixed_ips": [{"ip_address": ip_addr1
}],
1570 mock_create_new_port
.return_value
= new_port
1575 "network_id": net_id
,
1576 "admin_state_up": True,
1580 new_port_result
, port_result
= self
.vimconn
._create
_port
(
1581 net
, name
, created_items
1584 self
.assertDictEqual(new_port_result
, new_port
)
1585 self
.assertDictEqual(port_result
, expected_port
)
1587 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1588 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1589 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1590 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1591 mock_set_fixed_ip
.assert_called_once_with(new_port
, net
)
1593 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1594 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1595 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1596 @patch.object(vimconnector
, "_create_new_port")
1597 @patch.object(vimconnector
, "_set_fixed_ip")
1598 def test_create_port_create_new_port_raise_exception(
1601 mock_create_new_port
,
1602 mock_prepare_port_dict_mac_ip_addr
,
1603 mock_prepare_port_dict_binding
,
1604 mock_prepare_port_dict_security_groups
,
1606 """_create_new_port method raises exception."""
1612 mock_create_new_port
.side_effect
= Exception
1614 "network_id": net_id
,
1615 "admin_state_up": True,
1619 with self
.assertRaises(Exception):
1620 self
.vimconn
._create
_port
(net
, name
, created_items
)
1622 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1623 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1624 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1625 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1626 mock_set_fixed_ip
.assert_not_called()
1628 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1629 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1630 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1631 @patch.object(vimconnector
, "_create_new_port")
1632 @patch.object(vimconnector
, "_set_fixed_ip")
1633 def test_create_port_create_sec_groups_raises_exception(
1636 mock_create_new_port
,
1637 mock_prepare_port_dict_mac_ip_addr
,
1638 mock_prepare_port_dict_binding
,
1639 mock_prepare_port_dict_security_groups
,
1641 """_prepare_port_dict_security_groups method raises exception."""
1647 mock_prepare_port_dict_security_groups
.side_effect
= Exception
1649 "network_id": net_id
,
1650 "admin_state_up": True,
1654 with self
.assertRaises(Exception):
1655 self
.vimconn
._create
_port
(net
, name
, created_items
)
1657 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1659 mock_prepare_port_dict_binding
.assert_not_called()
1660 mock_prepare_port_dict_mac_ip_addr
.assert_not_called()
1661 mock_create_new_port
.assert_not_called()
1662 mock_set_fixed_ip
.assert_not_called()
1664 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1665 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1666 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1667 @patch.object(vimconnector
, "_create_new_port")
1668 @patch.object(vimconnector
, "_set_fixed_ip")
1669 def test_create_port_create_port_dict_binding_raise_exception(
1672 mock_create_new_port
,
1673 mock_prepare_port_dict_mac_ip_addr
,
1674 mock_prepare_port_dict_binding
,
1675 mock_prepare_port_dict_security_groups
,
1677 """_prepare_port_dict_binding method raises exception."""
1684 mock_prepare_port_dict_binding
.side_effect
= Exception
1686 "network_id": net_id
,
1687 "admin_state_up": True,
1691 with self
.assertRaises(Exception):
1692 self
.vimconn
._create
_port
(net
, name
, created_items
)
1694 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1696 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1698 mock_prepare_port_dict_mac_ip_addr
.assert_not_called()
1699 mock_create_new_port
.assert_not_called()
1700 mock_set_fixed_ip
.assert_not_called()
1702 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1703 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1704 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1705 @patch.object(vimconnector
, "_create_new_port")
1706 @patch.object(vimconnector
, "_set_fixed_ip")
1707 def test_create_port_create_port_mac_ip_addr_raise_exception(
1710 mock_create_new_port
,
1711 mock_prepare_port_dict_mac_ip_addr
,
1712 mock_prepare_port_dict_binding
,
1713 mock_prepare_port_dict_security_groups
,
1715 """prepare_port_dict_mac_ip_addr method raises exception."""
1721 mock_prepare_port_dict_mac_ip_addr
.side_effect
= Exception
1723 "network_id": net_id
,
1724 "admin_state_up": True,
1728 with self
.assertRaises(Exception):
1729 self
.vimconn
._create
_port
(net
, name
, created_items
)
1731 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1732 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1733 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1735 mock_create_new_port
.assert_not_called()
1736 mock_set_fixed_ip
.assert_not_called()
1738 @patch.object(vimconnector
, "_prepare_port_dict_security_groups")
1739 @patch.object(vimconnector
, "_prepare_port_dict_binding")
1740 @patch.object(vimconnector
, "_prepare_port_dict_mac_ip_addr")
1741 @patch.object(vimconnector
, "_create_new_port")
1742 @patch.object(vimconnector
, "_set_fixed_ip")
1743 def test_create_port_create_port_set_fixed_ip_raise_exception(
1746 mock_create_new_port
,
1747 mock_prepare_port_dict_mac_ip_addr
,
1748 mock_prepare_port_dict_binding
,
1749 mock_prepare_port_dict_security_groups
,
1751 """_set_fixed_ip method raises exception."""
1757 mock_set_fixed_ip
.side_effect
= VimConnException(
1758 "Port detail is missing in new_port."
1761 "network_id": net_id
,
1762 "admin_state_up": True,
1768 "mac_address": mac_address
,
1770 "fixed_ips": [{"ip_address": ip_addr1
}],
1773 mock_create_new_port
.return_value
= new_port
1775 with self
.assertRaises(VimConnException
):
1776 self
.vimconn
._create
_port
(net
, name
, created_items
)
1778 mock_prepare_port_dict_security_groups
.assert_called_once_with(net
, port_dict
)
1779 mock_prepare_port_dict_binding
.assert_called_once_with(net
, port_dict
)
1780 mock_prepare_port_dict_mac_ip_addr
.assert_called_once_with(net
, port_dict
)
1781 mock_create_new_port
.assert_called_once_with(port_dict
, created_items
, net
)
1782 mock_set_fixed_ip
.assert_called_once_with(new_port
, net
)
1784 @patch.object(vimconnector
, "_reload_connection")
1785 @patch.object(vimconnector
, "_create_port")
1786 def test_prepare_network_for_vm_instance_no_net_id(
1787 self
, mock_create_port
, mock_reload_connection
1789 """Nets do not have net_id"""
1790 mock_reload_connection
.side_effect
= None
1795 "port_security": False,
1796 "exit_on_floating_ip_error": False,
1797 "port_security_disable_strategy": "full",
1800 "port_security": True,
1801 "exit_on_floating_ip_error": False,
1802 "floating_ip": True,
1806 external_network
, no_secured_ports
= [], []
1807 expected_external_network
, expected_no_secured_ports
= [], []
1808 expected_net_list_vim
= []
1810 self
.vimconn
._prepare
_network
_for
_vminstance
(
1818 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
1819 self
.assertEqual(external_network
, expected_external_network
)
1820 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
1822 mock_create_port
.assert_not_called()
1824 @patch.object(vimconnector
, "_reload_connection")
1825 @patch.object(vimconnector
, "_create_port")
1826 def test_prepare_network_for_vm_instance_empty_net_list(
1827 self
, mock_create_port
, mock_reload_connection
1829 """Net list is empty."""
1830 mock_reload_connection
.side_effect
= None
1833 external_network
, no_secured_ports
= [], []
1834 expected_external_network
, expected_no_secured_ports
= [], []
1835 expected_net_list_vim
= []
1837 self
.vimconn
._prepare
_network
_for
_vminstance
(
1845 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
1846 self
.assertEqual(external_network
, expected_external_network
)
1847 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
1849 mock_create_port
.assert_not_called()
1851 @patch.object(vimconnector
, "_reload_connection")
1852 @patch.object(vimconnector
, "_create_port")
1853 def test_prepare_network_for_vm_instance_use_floating_ip_false_mgmt_net(
1854 self
, mock_create_port
, mock_reload_connection
1856 """Nets have net-id, floating_ip False, mgmt network."""
1857 mock_reload_connection
.side_effect
= None
1862 "floating_ip": False,
1867 mock_create_port
.side_effect
= [
1872 "mac_address": mac_address
,
1876 {"port-dict": port2_id
},
1879 external_network
, no_secured_ports
= [], []
1880 expected_external_network
, expected_no_secured_ports
= [], []
1881 expected_net_list_vim
= [{"port-dict": port2_id
}]
1882 self
.vimconn
._prepare
_network
_for
_vminstance
(
1890 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
1891 self
.assertEqual(external_network
, expected_external_network
)
1892 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
1894 mock_create_port
.assert_called_once_with(
1897 "floating_ip": False,
1904 @patch.object(vimconnector
, "_reload_connection")
1905 def test_prepare_network_for_vm_instance_mgmt_net_net_port_security_and_floating_ip_true(
1906 self
, mock_reload_connection
1908 """Nets have net-id, use_floating_ip False in VIM config, mgmt network, net floating_ip is True."""
1909 self
.vimconn
.config
["use_floating_ip"] = False
1910 mock_create_port
= CopyingMock()
1911 mock_reload_connection
.side_effect
= None
1916 "floating_ip": True,
1921 mock_create_port
.side_effect
= [
1926 "mac_address": mac_address
,
1930 {"port-dict": port2_id
},
1933 external_network
, no_secured_ports
= [], []
1934 expected_external_network
= [
1937 "floating_ip": True,
1939 "exit_on_floating_ip_error": True,
1942 expected_no_secured_ports
= []
1943 expected_net_list_vim
= [{"port-dict": port2_id
}]
1944 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
1945 self
.vimconn
._prepare
_network
_for
_vminstance
(
1953 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
1954 self
.assertEqual(external_network
, expected_external_network
)
1955 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
1957 mock_create_port
.assert_called_once_with(
1960 "floating_ip": True,
1967 @patch.object(vimconnector
, "_reload_connection")
1968 def test_prepare_network_for_vm_instance_use_floating_ip_true_mgmt_net_port_security_false(
1969 self
, mock_reload_connection
1971 """Nets have net-id, use_floating_ip is True in VIM config, mgmt network, net port security is False."""
1972 mock_create_port
= CopyingMock()
1973 self
.vimconn
.config
["use_floating_ip"] = True
1974 self
.vimconn
.config
["no_port_security_extension"] = False
1975 mock_reload_connection
.side_effect
= None
1982 "port_security": False,
1983 "exit_on_floating_ip_error": False,
1984 "port_security_disable_strategy": "full",
1988 mock_create_port
.side_effect
= [
1993 "mac_address": mac_address
,
1997 {"port-dict": port2_id
},
2000 external_network
, no_secured_ports
= [], []
2001 expected_external_network
= [
2005 "port_security": False,
2006 "exit_on_floating_ip_error": False,
2007 "port_security_disable_strategy": "full",
2008 "floating_ip": True,
2011 expected_no_secured_ports
= [(port2_id
, "full")]
2012 expected_net_list_vim
= [{"port-dict": port2_id
}]
2013 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2014 self
.vimconn
._prepare
_network
_for
_vminstance
(
2023 mock_create_port
.assert_called_once_with(
2027 "port_security": False,
2028 "exit_on_floating_ip_error": False,
2029 "port_security_disable_strategy": "full",
2034 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2035 self
.assertEqual(external_network
, expected_external_network
)
2036 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2038 @patch.object(vimconnector
, "_reload_connection")
2039 def test_prepare_network_for_vm_instance_use_fip_true_non_mgmt_net_port_security_false(
2040 self
, mock_reload_connection
2042 """Nets have net-id, use_floating_ip True in VIM config, non-mgmt network, port security is False."""
2043 mock_create_port
= CopyingMock()
2044 self
.vimconn
.config
["use_floating_ip"] = True
2045 self
.vimconn
.config
["no_port_security_extension"] = False
2046 mock_reload_connection
.side_effect
= None
2053 "port_security": False,
2054 "port_security_disable_strategy": "full",
2058 mock_create_port
.side_effect
= [
2063 "mac_address": mac_address
,
2067 {"port-dict": port2_id
},
2070 external_network
, no_secured_ports
= [], []
2071 expected_external_network
= []
2072 expected_no_secured_ports
= [(port2_id
, "full")]
2073 expected_net_list_vim
= [{"port-dict": port2_id
}]
2074 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2075 self
.vimconn
._prepare
_network
_for
_vminstance
(
2084 mock_create_port
.assert_called_once_with(
2088 "port_security": False,
2089 "port_security_disable_strategy": "full",
2094 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2095 self
.assertEqual(external_network
, expected_external_network
)
2096 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2098 @patch.object(vimconnector
, "_reload_connection")
2099 def test_prepare_network_for_vm_instance_use_fip_true_non_mgmt_net_port_security_true(
2100 self
, mock_reload_connection
2102 """Nets have net-id, use_floating_ip is True in VIM config, non-mgmt network, net port security is True."""
2103 mock_create_port
= CopyingMock()
2104 self
.vimconn
.config
["use_floating_ip"] = True
2105 self
.vimconn
.config
["no_port_security_extension"] = True
2106 mock_reload_connection
.side_effect
= None
2113 "port_security": True,
2114 "port_security_disable_strategy": "full",
2118 mock_create_port
.side_effect
= [
2123 "mac_address": mac_address
,
2127 {"port-dict": port2_id
},
2130 external_network
, no_secured_ports
= [], []
2131 expected_external_network
= []
2132 expected_no_secured_ports
= []
2133 expected_net_list_vim
= [{"port-dict": port2_id
}]
2134 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2135 self
.vimconn
._prepare
_network
_for
_vminstance
(
2144 mock_create_port
.assert_called_once_with(
2148 "port_security": True,
2149 "port_security_disable_strategy": "full",
2154 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2155 self
.assertEqual(external_network
, expected_external_network
)
2156 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2158 @patch.object(vimconnector
, "_reload_connection")
2159 def test_prepare_network_for_vm_instance_create_port_raise_exception(
2160 self
, mock_reload_connection
2162 """_create_port method raise exception."""
2163 mock_create_port
= CopyingMock()
2164 self
.vimconn
.config
["use_floating_ip"] = True
2165 self
.vimconn
.config
["no_port_security_extension"] = True
2166 mock_reload_connection
.side_effect
= None
2173 "port_security": True,
2174 "port_security_disable_strategy": "full",
2178 mock_create_port
.side_effect
= KeyError
2179 external_network
, no_secured_ports
= [], []
2180 expected_external_network
= []
2181 expected_no_secured_ports
= []
2182 expected_net_list_vim
= []
2183 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2184 with self
.assertRaises(Exception) as err
:
2185 self
.vimconn
._prepare
_network
_for
_vminstance
(
2194 self
.assertEqual(type(err
.exception
), KeyError)
2196 mock_create_port
.assert_called_once_with(
2200 "port_security": True,
2201 "port_security_disable_strategy": "full",
2206 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2207 self
.assertEqual(external_network
, expected_external_network
)
2208 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2210 @patch.object(vimconnector
, "_reload_connection")
2211 def test_prepare_network_for_vm_instance_reload_connection_raise_exception(
2212 self
, mock_reload_connection
2214 """_reload_connection method raises exception."""
2215 mock_create_port
= CopyingMock()
2216 mock_reload_connection
.side_effect
= VimConnConnectionException(
2217 "Connection failed."
2219 self
.vimconn
.config
["use_floating_ip"] = True
2220 self
.vimconn
.config
["no_port_security_extension"] = True
2227 "port_security": True,
2228 "port_security_disable_strategy": "full",
2232 mock_create_port
.side_effect
= None
2233 external_network
, no_secured_ports
= [], []
2234 expected_external_network
= []
2235 expected_no_secured_ports
= []
2236 expected_net_list_vim
= []
2237 with patch
.object(vimconnector
, "_create_port", mock_create_port
):
2238 with self
.assertRaises(Exception) as err
:
2239 self
.vimconn
._prepare
_network
_for
_vminstance
(
2248 self
.assertEqual(type(err
.exception
), VimConnConnectionException
)
2249 self
.assertEqual(str(err
.exception
), "Connection failed.")
2250 mock_reload_connection
.assert_called_once()
2251 mock_create_port
.assert_not_called()
2252 self
.assertEqual(expected_net_list_vim
, net_list_vim
)
2253 self
.assertEqual(external_network
, expected_external_network
)
2254 self
.assertEqual(expected_no_secured_ports
, no_secured_ports
)
2256 def test_prepare_persistent_root_volumes_vim_using_volume_id(self
):
2257 """Existing persistent root volume with vim_volume_id."""
2258 vm_av_zone
= ["nova"]
2259 base_disk_index
= ord("a")
2260 disk
= {"vim_volume_id": volume_id
}
2261 block_device_mapping
= {}
2262 existing_vim_volumes
= []
2264 expected_boot_vol_id
= None
2265 expected_block_device_mapping
= {"vda": volume_id
}
2266 expected_existing_vim_volumes
= [{"id": volume_id
}]
2267 boot_volume_id
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2272 block_device_mapping
,
2273 existing_vim_volumes
,
2276 self
.assertEqual(boot_volume_id
, expected_boot_vol_id
)
2277 self
.assertDictEqual(block_device_mapping
, expected_block_device_mapping
)
2278 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2279 self
.vimconn
.cinder
.volumes
.create
.assert_not_called()
2281 @patch.object(vimconnector
, "update_block_device_mapping")
2282 def test_prepare_persistent_non_root_volumes_vim_using_volume_id(
2283 self
, mock_update_block_device_mapping
2285 """Existing persistent non root volume with vim_volume_id."""
2286 vm_av_zone
= ["nova"]
2287 base_disk_index
= ord("b")
2288 disk
= {"vim_volume_id": volume_id
}
2289 block_device_mapping
= {}
2290 existing_vim_volumes
= []
2292 expected_block_device_mapping
= {"vdb": volume_id
}
2293 expected_existing_vim_volumes
= [{"id": volume_id
}]
2294 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2298 block_device_mapping
,
2300 existing_vim_volumes
,
2303 self
.assertDictEqual(block_device_mapping
, expected_block_device_mapping
)
2304 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2305 self
.vimconn
.cinder
.volumes
.create
.assert_not_called()
2306 mock_update_block_device_mapping
.assert_not_called()
2308 @patch.object(vimconnector
, "update_block_device_mapping")
2309 def test_prepare_persistent_root_volumes_using_vim_id(
2310 self
, mock_update_block_device_mapping
2312 """Existing persistent root volume with vim_id."""
2313 vm_av_zone
= ["nova"]
2314 base_disk_index
= ord("a")
2315 disk
= {"vim_id": volume_id
}
2316 block_device_mapping
= {}
2317 existing_vim_volumes
= []
2319 expected_boot_vol_id
= None
2320 expected_block_device_mapping
= {"vda": volume_id
}
2321 expected_existing_vim_volumes
= [{"id": volume_id
}]
2322 boot_volume_id
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2327 block_device_mapping
,
2328 existing_vim_volumes
,
2331 self
.assertEqual(boot_volume_id
, expected_boot_vol_id
)
2332 self
.assertDictEqual(block_device_mapping
, expected_block_device_mapping
)
2333 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2334 self
.vimconn
.cinder
.volumes
.create
.assert_not_called()
2335 mock_update_block_device_mapping
.assert_not_called()
2337 @patch.object(vimconnector
, "update_block_device_mapping")
2338 def test_prepare_persistent_non_root_volumes_using_vim_id(
2339 self
, mock_update_block_device_mapping
2341 """Existing persistent root volume with vim_id."""
2342 vm_av_zone
= ["nova"]
2343 base_disk_index
= ord("b")
2344 disk
= {"vim_id": volume_id
}
2345 block_device_mapping
= {}
2346 existing_vim_volumes
= []
2349 expected_block_device_mapping
= {"vdb": volume_id
}
2350 expected_existing_vim_volumes
= [{"id": volume_id
}]
2351 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2355 block_device_mapping
,
2357 existing_vim_volumes
,
2361 self
.assertDictEqual(block_device_mapping
, expected_block_device_mapping
)
2362 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2363 self
.vimconn
.cinder
.volumes
.create
.assert_not_called()
2364 mock_update_block_device_mapping
.assert_not_called()
2366 @patch.object(vimconnector
, "update_block_device_mapping")
2367 def test_prepare_persistent_root_volumes_create(
2368 self
, mock_update_block_device_mapping
2370 """Create persistent root volume."""
2371 self
.vimconn
.cinder
.volumes
.create
.return_value
.id = volume_id2
2372 vm_av_zone
= ["nova"]
2373 base_disk_index
= ord("a")
2374 disk
= {"size": 10, "image_id": image_id
}
2375 block_device_mapping
= {}
2376 existing_vim_volumes
= []
2378 expected_boot_vol_id
= volume_id2
2379 boot_volume_id
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2384 block_device_mapping
,
2385 existing_vim_volumes
,
2388 self
.assertEqual(boot_volume_id
, expected_boot_vol_id
)
2389 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2393 availability_zone
=["nova"],
2395 mock_update_block_device_mapping
.assert_called_once()
2396 _call_mock_update_block_device_mapping
= (
2397 mock_update_block_device_mapping
.call_args_list
2400 _call_mock_update_block_device_mapping
[0].kwargs
["block_device_mapping"],
2401 block_device_mapping
,
2404 _call_mock_update_block_device_mapping
[0].kwargs
["base_disk_index"], 97
2406 self
.assertEqual(_call_mock_update_block_device_mapping
[0].kwargs
["disk"], disk
)
2408 _call_mock_update_block_device_mapping
[0].kwargs
["created_items"], {}
2411 @patch.object(vimconnector
, "update_block_device_mapping")
2412 def test_prepare_persistent_root_volumes_create_with_keep(
2413 self
, mock_update_block_device_mapping
2415 """Create persistent root volume, disk has keep parameter."""
2416 self
.vimconn
.cinder
.volumes
.create
.return_value
.id = volume_id2
2417 vm_av_zone
= ["nova"]
2418 base_disk_index
= ord("a")
2419 disk
= {"size": 10, "image_id": image_id
, "keep": True}
2420 block_device_mapping
= {}
2421 existing_vim_volumes
= []
2423 expected_boot_vol_id
= volume_id2
2424 expected_existing_vim_volumes
= []
2425 boot_volume_id
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2430 block_device_mapping
,
2431 existing_vim_volumes
,
2434 self
.assertEqual(boot_volume_id
, expected_boot_vol_id
)
2435 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2436 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2440 availability_zone
=["nova"],
2442 mock_update_block_device_mapping
.assert_called_once()
2443 _call_mock_update_block_device_mapping
= (
2444 mock_update_block_device_mapping
.call_args_list
2447 _call_mock_update_block_device_mapping
[0].kwargs
["block_device_mapping"],
2448 block_device_mapping
,
2451 _call_mock_update_block_device_mapping
[0].kwargs
["base_disk_index"], 97
2453 self
.assertEqual(_call_mock_update_block_device_mapping
[0].kwargs
["disk"], disk
)
2455 _call_mock_update_block_device_mapping
[0].kwargs
["created_items"], {}
2458 @patch.object(vimconnector
, "update_block_device_mapping")
2459 def test_prepare_persistent_non_root_volumes_create(
2460 self
, mock_update_block_device_mapping
2462 """Create persistent non-root volume."""
2463 self
.vimconn
.cinder
= CopyingMock()
2464 self
.vimconn
.cinder
.volumes
.create
.return_value
.id = volume_id2
2465 vm_av_zone
= ["nova"]
2466 base_disk_index
= ord("a")
2468 block_device_mapping
= {}
2469 existing_vim_volumes
= []
2471 expected_existing_vim_volumes
= []
2472 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2476 block_device_mapping
,
2478 existing_vim_volumes
,
2482 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2483 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2484 size
=10, name
="basicvmvda", availability_zone
=["nova"]
2486 mock_update_block_device_mapping
.assert_called_once()
2487 _call_mock_update_block_device_mapping
= (
2488 mock_update_block_device_mapping
.call_args_list
2491 _call_mock_update_block_device_mapping
[0].kwargs
["block_device_mapping"],
2492 block_device_mapping
,
2495 _call_mock_update_block_device_mapping
[0].kwargs
["base_disk_index"], 97
2497 self
.assertEqual(_call_mock_update_block_device_mapping
[0].kwargs
["disk"], disk
)
2499 _call_mock_update_block_device_mapping
[0].kwargs
["created_items"], {}
2502 @patch.object(vimconnector
, "update_block_device_mapping")
2503 def test_prepare_persistent_non_root_volumes_create_with_keep(
2504 self
, mock_update_block_device_mapping
2506 """Create persistent non-root volume."""
2507 self
.vimconn
.cinder
= CopyingMock()
2508 self
.vimconn
.cinder
.volumes
.create
.return_value
.id = volume_id2
2509 vm_av_zone
= ["nova"]
2510 base_disk_index
= ord("a")
2511 disk
= {"size": 10, "keep": True}
2512 block_device_mapping
= {}
2513 existing_vim_volumes
= []
2515 expected_existing_vim_volumes
= []
2516 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2520 block_device_mapping
,
2522 existing_vim_volumes
,
2526 self
.assertEqual(existing_vim_volumes
, expected_existing_vim_volumes
)
2527 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2528 size
=10, name
="basicvmvda", availability_zone
=["nova"]
2530 mock_update_block_device_mapping
.assert_called_once()
2531 _call_mock_update_block_device_mapping
= (
2532 mock_update_block_device_mapping
.call_args_list
2535 _call_mock_update_block_device_mapping
[0].kwargs
["block_device_mapping"],
2536 block_device_mapping
,
2539 _call_mock_update_block_device_mapping
[0].kwargs
["base_disk_index"], 97
2541 self
.assertEqual(_call_mock_update_block_device_mapping
[0].kwargs
["disk"], disk
)
2543 _call_mock_update_block_device_mapping
[0].kwargs
["created_items"], {}
2546 @patch.object(vimconnector
, "update_block_device_mapping")
2547 def test_prepare_persistent_root_volumes_create_raise_exception(
2548 self
, mock_update_block_device_mapping
2550 """Create persistent root volume raise exception."""
2551 self
.vimconn
.cinder
.volumes
.create
.side_effect
= Exception
2552 vm_av_zone
= ["nova"]
2553 base_disk_index
= ord("a")
2554 disk
= {"size": 10, "image_id": image_id
}
2555 block_device_mapping
= {}
2556 existing_vim_volumes
= []
2559 with self
.assertRaises(Exception):
2560 result
= self
.vimconn
._prepare
_persistent
_root
_volumes
(
2565 block_device_mapping
,
2566 existing_vim_volumes
,
2570 self
.assertEqual(result
, None)
2572 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2576 availability_zone
=["nova"],
2578 self
.assertEqual(existing_vim_volumes
, [])
2579 self
.assertEqual(block_device_mapping
, {})
2580 self
.assertEqual(created_items
, {})
2581 mock_update_block_device_mapping
.assert_not_called()
2583 @patch.object(vimconnector
, "update_block_device_mapping")
2584 def test_prepare_persistent_non_root_volumes_create_raise_exception(
2585 self
, mock_update_block_device_mapping
2587 """Create persistent non-root volume raise exception."""
2588 self
.vimconn
.cinder
.volumes
.create
.side_effect
= Exception
2589 vm_av_zone
= ["nova"]
2590 base_disk_index
= ord("b")
2592 block_device_mapping
= {}
2593 existing_vim_volumes
= []
2596 with self
.assertRaises(Exception):
2597 self
.vimconn
._prepare
_non
_root
_persistent
_volumes
(
2601 block_device_mapping
,
2603 existing_vim_volumes
,
2607 self
.vimconn
.cinder
.volumes
.create
.assert_called_once_with(
2608 size
=10, name
="basicvmvdb", availability_zone
=["nova"]
2610 self
.assertEqual(existing_vim_volumes
, [])
2611 self
.assertEqual(block_device_mapping
, {})
2612 self
.assertEqual(created_items
, {})
2613 mock_update_block_device_mapping
.assert_not_called()
2615 @patch("time.sleep")
2616 def test_wait_for_created_volumes_availability_volume_status_available(
2619 """Created volume status is available."""
2621 created_items
= {f
"volume:{volume_id2}": True}
2622 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
2624 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2625 elapsed_time
, created_items
2627 self
.assertEqual(result
, elapsed_time
)
2628 self
.vimconn
.cinder
.volumes
.get
.assert_called_with(volume_id2
)
2629 mock_sleep
.assert_not_called()
2631 @patch("time.sleep")
2632 def test_wait_for_existing_volumes_availability_volume_status_available(
2635 """Existing volume status is available."""
2637 existing_vim_volumes
= [{"id": volume_id2
}]
2638 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
2640 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2641 elapsed_time
, existing_vim_volumes
2643 self
.assertEqual(result
, elapsed_time
)
2644 self
.vimconn
.cinder
.volumes
.get
.assert_called_with(volume_id2
)
2645 mock_sleep
.assert_not_called()
2647 @patch("time.sleep")
2648 def test_wait_for_created_volumes_availability_status_processing_multiple_volumes(
2651 """Created volume status is processing."""
2654 f
"volume:{volume_id2}": True,
2655 f
"volume:{volume_id3}": True,
2657 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [
2658 Status("processing"),
2659 Status("available"),
2660 Status("available"),
2663 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2664 elapsed_time
, created_items
2666 self
.assertEqual(result
, 10)
2667 _call_mock_get_volumes
= self
.vimconn
.cinder
.volumes
.get
.call_args_list
2668 self
.assertEqual(_call_mock_get_volumes
[0][0], (volume_id2
,))
2669 self
.assertEqual(_call_mock_get_volumes
[1][0], (volume_id2
,))
2670 self
.assertEqual(_call_mock_get_volumes
[2][0], (volume_id3
,))
2671 mock_sleep
.assert_called_with(5)
2672 self
.assertEqual(1, mock_sleep
.call_count
)
2674 @patch("time.sleep")
2675 def test_wait_for_existing_volumes_availability_status_processing_multiple_volumes(
2678 """Existing volume status is processing."""
2680 existing_vim_volumes
= [
2682 {"id": "44e0e83-b9uu-4akk-t234-p9cc4811bd4a"},
2684 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [
2685 Status("processing"),
2686 Status("available"),
2687 Status("available"),
2690 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2691 elapsed_time
, existing_vim_volumes
2693 self
.assertEqual(result
, 10)
2694 _call_mock_get_volumes
= self
.vimconn
.cinder
.volumes
.get
.call_args_list
2695 self
.assertEqual(_call_mock_get_volumes
[0][0], (volume_id2
,))
2696 self
.assertEqual(_call_mock_get_volumes
[1][0], (volume_id2
,))
2698 _call_mock_get_volumes
[2][0], ("44e0e83-b9uu-4akk-t234-p9cc4811bd4a",)
2700 mock_sleep
.assert_called_with(5)
2701 self
.assertEqual(1, mock_sleep
.call_count
)
2703 @patch("time.sleep")
2704 def test_wait_for_created_volumes_availability_volume_status_processing_timeout(
2707 """Created volume status is processing, elapsed time greater than timeout (1800)."""
2709 created_items
= {f
"volume:{volume_id2}": True}
2710 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [
2711 Status("processing"),
2712 Status("processing"),
2714 with
patch("time.sleep", mock_sleep
):
2715 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2716 elapsed_time
, created_items
2718 self
.assertEqual(result
, 1805)
2719 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
2720 mock_sleep
.assert_not_called()
2722 @patch("time.sleep")
2723 def test_wait_for_existing_volumes_availability_volume_status_processing_timeout(
2726 """Exsiting volume status is processing, elapsed time greater than timeout (1800)."""
2728 existing_vim_volumes
= [{"id": volume_id2
}]
2729 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [
2730 Status("processing"),
2731 Status("processing"),
2734 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2735 elapsed_time
, existing_vim_volumes
2737 self
.assertEqual(result
, 1805)
2738 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
2739 mock_sleep
.assert_not_called()
2741 @patch("time.sleep")
2742 def test_wait_for_created_volumes_availability_cinder_raise_exception(
2745 """Cinder get volumes raises exception for created volumes."""
2747 created_items
= {f
"volume:{volume_id2}": True}
2748 self
.vimconn
.cinder
.volumes
.get
.side_effect
= Exception
2749 with self
.assertRaises(Exception):
2750 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2751 elapsed_time
, created_items
2753 self
.assertEqual(result
, 1000)
2754 self
.vimconn
.cinder
.volumes
.get
.assert_called_with(volume_id2
)
2755 mock_sleep
.assert_not_called()
2757 @patch("time.sleep")
2758 def test_wait_for_existing_volumes_availability_cinder_raise_exception(
2761 """Cinder get volumes raises exception for existing volumes."""
2763 existing_vim_volumes
= [{"id": volume_id2
}]
2764 self
.vimconn
.cinder
.volumes
.get
.side_effect
= Exception
2765 with self
.assertRaises(Exception):
2766 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2767 elapsed_time
, existing_vim_volumes
2769 self
.assertEqual(result
, 1000)
2770 self
.vimconn
.cinder
.volumes
.get
.assert_called_with(volume_id2
)
2771 mock_sleep
.assert_not_called()
2773 @patch("time.sleep")
2774 def test_wait_for_created_volumes_availability_no_volume_in_created_items(
2777 """Created_items dict does not have volume-id."""
2781 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [None]
2783 result
= self
.vimconn
._wait
_for
_created
_volumes
_availability
(
2784 elapsed_time
, created_items
2786 self
.assertEqual(result
, 10)
2787 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
2788 mock_sleep
.assert_not_called()
2790 @patch("time.sleep")
2791 def test_wait_for_existing_volumes_availability_no_volume_in_existing_vim_volumes(
2794 """Existing_vim_volumes list does not have volume."""
2796 existing_vim_volumes
= []
2798 self
.vimconn
.cinder
.volumes
.get
.side_effect
= [None]
2800 result
= self
.vimconn
._wait
_for
_existing
_volumes
_availability
(
2801 elapsed_time
, existing_vim_volumes
2803 self
.assertEqual(result
, 10)
2804 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
2805 mock_sleep
.assert_not_called()
2807 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2808 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2809 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2810 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2811 def test_prepare_disk_for_vm_instance(
2813 mock_existing_vol_availability
,
2814 mock_created_vol_availability
,
2815 mock_non_root_volumes
,
2818 """Prepare disks for VM instance successfully."""
2819 existing_vim_volumes
= []
2821 block_device_mapping
= {}
2822 vm_av_zone
= ["nova"]
2824 mock_root_volumes
.return_value
= root_vol_id
2825 mock_created_vol_availability
.return_value
= 10
2826 mock_existing_vol_availability
.return_value
= 15
2827 self
.vimconn
.cinder
= CopyingMock()
2828 self
.vimconn
._prepare
_disk
_for
_vminstance
(
2830 existing_vim_volumes
,
2833 block_device_mapping
,
2836 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_called_once_with(
2839 mock_created_vol_availability
.assert_called_once_with(0, created_items
)
2840 mock_existing_vol_availability
.assert_called_once_with(10, existing_vim_volumes
)
2841 self
.assertEqual(mock_root_volumes
.call_count
, 1)
2842 self
.assertEqual(mock_non_root_volumes
.call_count
, 1)
2843 mock_root_volumes
.assert_called_once_with(
2845 vm_av_zone
=["nova"],
2846 disk
={"size": 10, "image_id": image_id
},
2848 block_device_mapping
={},
2849 existing_vim_volumes
=[],
2852 mock_non_root_volumes
.assert_called_once_with(
2855 vm_av_zone
=["nova"],
2857 block_device_mapping
={},
2858 existing_vim_volumes
=[],
2862 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2863 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2864 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2865 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2866 def test_prepare_disk_for_vm_instance_timeout_exceeded(
2868 mock_existing_vol_availability
,
2869 mock_created_vol_availability
,
2870 mock_non_root_volumes
,
2873 """Timeout exceeded while waiting for disks."""
2874 existing_vim_volumes
= []
2876 vm_av_zone
= ["nova"]
2877 block_device_mapping
= {}
2879 mock_root_volumes
.return_value
= root_vol_id
2880 mock_created_vol_availability
.return_value
= 1700
2881 mock_existing_vol_availability
.return_value
= 1900
2883 with self
.assertRaises(VimConnException
) as err
:
2884 self
.vimconn
._prepare
_disk
_for
_vminstance
(
2886 existing_vim_volumes
,
2889 block_device_mapping
,
2893 str(err
.exception
), "Timeout creating volumes for instance basicvm"
2895 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_not_called()
2896 mock_created_vol_availability
.assert_called_once_with(0, created_items
)
2897 mock_existing_vol_availability
.assert_called_once_with(
2898 1700, existing_vim_volumes
2900 self
.assertEqual(mock_root_volumes
.call_count
, 1)
2901 self
.assertEqual(mock_non_root_volumes
.call_count
, 1)
2902 mock_root_volumes
.assert_called_once_with(
2904 vm_av_zone
=["nova"],
2905 disk
={"size": 10, "image_id": image_id
},
2907 block_device_mapping
={},
2908 existing_vim_volumes
=[],
2911 mock_non_root_volumes
.assert_called_once_with(
2914 vm_av_zone
=["nova"],
2916 block_device_mapping
={},
2917 existing_vim_volumes
=[],
2921 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2922 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2923 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2924 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2925 def test_prepare_disk_for_vm_instance_empty_disk_list(
2927 mock_existing_vol_availability
,
2928 mock_created_vol_availability
,
2929 mock_non_root_volumes
,
2932 """Disk list is empty."""
2933 existing_vim_volumes
= []
2935 block_device_mapping
= {}
2936 vm_av_zone
= ["nova"]
2937 mock_created_vol_availability
.return_value
= 2
2938 mock_existing_vol_availability
.return_value
= 3
2940 self
.vimconn
._prepare
_disk
_for
_vminstance
(
2942 existing_vim_volumes
,
2945 block_device_mapping
,
2948 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_not_called()
2949 mock_created_vol_availability
.assert_called_once_with(0, created_items
)
2950 mock_existing_vol_availability
.assert_called_once_with(2, existing_vim_volumes
)
2951 mock_root_volumes
.assert_not_called()
2952 mock_non_root_volumes
.assert_not_called()
2954 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2955 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
2956 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
2957 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
2958 def test_prepare_disk_for_vm_instance_persistent_root_volume_error(
2960 mock_existing_vol_availability
,
2961 mock_created_vol_availability
,
2962 mock_non_root_volumes
,
2965 """Persistent root volumes preparation raises error."""
2966 existing_vim_volumes
= []
2968 vm_av_zone
= ["nova"]
2969 block_device_mapping
= {}
2971 mock_root_volumes
.side_effect
= Exception()
2972 mock_created_vol_availability
.return_value
= 10
2973 mock_existing_vol_availability
.return_value
= 15
2975 with self
.assertRaises(Exception):
2976 self
.vimconn
._prepare
_disk
_for
_vminstance
(
2978 existing_vim_volumes
,
2981 block_device_mapping
,
2984 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_not_called()
2985 mock_created_vol_availability
.assert_not_called()
2986 mock_existing_vol_availability
.assert_not_called()
2987 mock_root_volumes
.assert_called_once_with(
2989 vm_av_zone
=["nova"],
2990 disk
={"size": 10, "image_id": image_id
},
2992 block_device_mapping
={},
2993 existing_vim_volumes
=[],
2996 mock_non_root_volumes
.assert_not_called()
2998 @patch.object(vimconnector
, "_prepare_persistent_root_volumes")
2999 @patch.object(vimconnector
, "_prepare_non_root_persistent_volumes")
3000 @patch.object(vimconnector
, "_wait_for_created_volumes_availability")
3001 @patch.object(vimconnector
, "_wait_for_existing_volumes_availability")
3002 def test_prepare_disk_for_vm_instance_non_root_volume_error(
3004 mock_existing_vol_availability
,
3005 mock_created_vol_availability
,
3006 mock_non_root_volumes
,
3009 """Non-root volumes preparation raises error."""
3010 existing_vim_volumes
= []
3012 vm_av_zone
= ["nova"]
3013 block_device_mapping
= {}
3015 mock_root_volumes
.return_value
= root_vol_id
3016 mock_non_root_volumes
.side_effect
= Exception
3018 with self
.assertRaises(Exception):
3019 self
.vimconn
._prepare
_disk
_for
_vminstance
(
3021 existing_vim_volumes
,
3024 block_device_mapping
,
3027 self
.vimconn
.cinder
.volumes
.set_bootable
.assert_not_called()
3028 mock_created_vol_availability
.assert_not_called()
3029 mock_existing_vol_availability
.assert_not_called()
3030 self
.assertEqual(mock_root_volumes
.call_count
, 1)
3031 self
.assertEqual(mock_non_root_volumes
.call_count
, 1)
3032 mock_root_volumes
.assert_called_once_with(
3034 vm_av_zone
=["nova"],
3035 disk
={"size": 10, "image_id": image_id
},
3037 block_device_mapping
={},
3038 existing_vim_volumes
=[],
3041 mock_non_root_volumes
.assert_called_once_with(
3044 vm_av_zone
=["nova"],
3046 block_device_mapping
={},
3047 existing_vim_volumes
=[],
3051 def test_find_external_network_for_floating_ip_no_external_network(self
):
3052 """External network could not be found."""
3053 self
.vimconn
.neutron
.list_networks
.return_value
= {
3055 {"id": "408b73-r9cc-5a6a-a270-82cc4811bd4a", "router:external": False}
3058 with self
.assertRaises(VimConnException
) as err
:
3059 self
.vimconn
._find
_the
_external
_network
_for
_floating
_ip
()
3062 "Cannot create floating_ip automatically since no external network is present",
3065 def test_find_external_network_for_floating_one_external_network(self
):
3066 """One external network has been found."""
3067 self
.vimconn
.neutron
.list_networks
.return_value
= {
3069 {"id": "408b73-r9cc-5a6a-a270-82cc4811bd4a", "router:external": True}
3072 expected_result
= "408b73-r9cc-5a6a-a270-82cc4811bd4a"
3073 result
= self
.vimconn
._find
_the
_external
_network
_for
_floating
_ip
()
3074 self
.assertEqual(result
, expected_result
)
3076 def test_find_external_network_for_floating_neutron_raises_exception(self
):
3077 """Neutron list networks raises exception."""
3078 self
.vimconn
.neutron
.list_networks
.side_effect
= Exception
3079 with self
.assertRaises(Exception):
3080 self
.vimconn
._find
_the
_external
_network
_for
_floating
_ip
()
3082 def test_find_external_network_for_floating_several_external_network(self
):
3083 """Several exernal networks has been found."""
3084 self
.vimconn
.neutron
.list_networks
.return_value
= {
3086 {"id": "408b73-r9cc-5a6a-a270-82cc4811bd4a", "router:external": True},
3087 {"id": "608b73-y9cc-5a6a-a270-12cc4811bd4a", "router:external": True},
3090 with self
.assertRaises(VimConnException
) as err
:
3091 self
.vimconn
._find
_the
_external
_network
_for
_floating
_ip
()
3094 "Cannot create floating_ip automatically since multiple external networks are present",
3097 def test_neutron_create_float_ip(self
):
3098 """Floating ip creation is successful."""
3099 param
= {"net_id": "408b73-r9cc-5a6a-a270-p2cc4811bd9a"}
3101 self
.vimconn
.neutron
.create_floatingip
.return_value
= {
3102 "floatingip": {"id": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3104 expected_created_items
= {
3105 "floating_ip:308b73-t9cc-1a6a-a270-12cc4811bd4a": True
3107 self
.vimconn
._neutron
_create
_float
_ip
(param
, created_items
)
3108 self
.assertEqual(created_items
, expected_created_items
)
3110 def test_neutron_create_float_ip_exception_occurred(self
):
3111 """Floating ip could not be created."""
3114 "floating_network_id": "408b73-r9cc-5a6a-a270-p2cc4811bd9a",
3115 "tenant_id": "308b73-19cc-8a6a-a270-02cc4811bd9a",
3119 self
.vimconn
.neutron
= CopyingMock()
3120 self
.vimconn
.neutron
.create_floatingip
.side_effect
= Exception(
3121 "Neutron floating ip create exception occurred."
3123 with self
.assertRaises(VimConnException
) as err
:
3124 self
.vimconn
._neutron
_create
_float
_ip
(param
, created_items
)
3125 self
.assertEqual(created_items
, {})
3128 "Exception: Cannot create new floating_ip Neutron floating ip create exception occurred.",
3131 @patch.object(vimconnector
, "_neutron_create_float_ip")
3132 @patch.object(vimconnector
, "_find_the_external_network_for_floating_ip")
3133 def test_create_floating_ip_pool_id_available(
3134 self
, mock_find_ext_network
, mock_create_float_ip
3136 """Floating ip creation, ip pool is available."""
3137 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3141 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3142 "tenant_id": "408b73-r9cc-5a6a-a270-82cc4811bd4a",
3145 self
.vimconn
._create
_floating
_ip
(floating_network
, self
.server
, created_items
)
3146 mock_find_ext_network
.assert_not_called()
3147 mock_create_float_ip
.assert_called_once_with(expected_param
, {})
3149 @patch.object(vimconnector
, "_neutron_create_float_ip")
3150 @patch.object(vimconnector
, "_find_the_external_network_for_floating_ip")
3151 def test_create_floating_ip_finding_pool_id(
3152 self
, mock_find_ext_network
, mock_create_float_ip
3154 """Floating ip creation, pool id need to be found."""
3155 floating_network
= {"floating_ip": True}
3157 mock_find_ext_network
.return_value
= "308b73-t9cc-1a6a-a270-12cc4811bd4a"
3160 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3161 "tenant_id": "408b73-r9cc-5a6a-a270-82cc4811bd4a",
3164 self
.vimconn
._create
_floating
_ip
(floating_network
, self
.server
, created_items
)
3165 mock_find_ext_network
.assert_called_once()
3166 mock_create_float_ip
.assert_called_once_with(expected_param
, {})
3168 @patch.object(vimconnector
, "_neutron_create_float_ip")
3169 @patch.object(vimconnector
, "_find_the_external_network_for_floating_ip")
3170 def test_create_floating_ip_neutron_create_floating_ip_exception(
3171 self
, mock_find_ext_network
, mock_create_float_ip
3173 """Neutron creat floating ip raises error."""
3174 floating_network
= {"floating_ip": True}
3176 mock_create_float_ip
.side_effect
= VimConnException(
3177 "Can not create floating ip."
3179 mock_find_ext_network
.return_value
= "308b73-t9cc-1a6a-a270-12cc4811bd4a"
3182 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3183 "tenant_id": "408b73-r9cc-5a6a-a270-82cc4811bd4a",
3187 with self
.assertRaises(VimConnException
) as err
:
3188 self
.vimconn
._create
_floating
_ip
(
3189 floating_network
, self
.server
, created_items
3191 self
.assertEqual(str(err
.exception
), "Can not create floating ip.")
3192 mock_find_ext_network
.assert_called_once()
3193 mock_create_float_ip
.assert_called_once_with(expected_param
, {})
3195 @patch.object(vimconnector
, "_neutron_create_float_ip")
3196 @patch.object(vimconnector
, "_find_the_external_network_for_floating_ip")
3197 def test_create_floating_ip_can_not_find_pool_id(
3198 self
, mock_find_ext_network
, mock_create_float_ip
3200 """Floating ip creation, pool id could not be found."""
3201 floating_network
= {"floating_ip": True}
3203 mock_find_ext_network
.side_effect
= VimConnException(
3204 "Cannot create floating_ip automatically since no external network is present"
3206 with self
.assertRaises(VimConnException
) as err
:
3207 self
.vimconn
._create
_floating
_ip
(
3208 floating_network
, self
.server
, created_items
3212 "Cannot create floating_ip automatically since no external network is present",
3214 mock_find_ext_network
.assert_called_once()
3215 mock_create_float_ip
.assert_not_called()
3217 def test_find_floating_ip_get_free_floating_ip(self
):
3218 """Get free floating ips successfully."""
3221 "tenant_id": "408b73-r9cc-5a6a-a270-82cc4811bd4a",
3222 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3223 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3226 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3227 expected_result
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3229 result
= self
.vimconn
._find
_floating
_ip
(
3230 self
.server
, floating_ips
, floating_network
3232 self
.assertEqual(result
, expected_result
)
3234 def test_find_floating_ip_different_floating_network_id(self
):
3235 """Floating network id is different with floating_ip of floating network."""
3238 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3239 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3242 floating_network
= {"floating_ip": "508b73-t9cc-1a6a-a270-12cc4811bd4a"}
3244 result
= self
.vimconn
._find
_floating
_ip
(
3245 self
.server
, floating_ips
, floating_network
3247 self
.assertEqual(result
, None)
3249 def test_find_floating_ip_different_fip_tenant(self
):
3250 """Items in floating_ips has port_id, tenant_is is not same with server tenant id."""
3253 "port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3254 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3255 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3256 "tenant_id": self
.server
.id,
3259 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3260 mock_create_floating_ip
= CopyingMock()
3261 with patch
.object(vimconnector
, "_create_floating_ip", mock_create_floating_ip
):
3262 result
= self
.vimconn
._find
_floating
_ip
(
3263 self
.server
, floating_ips
, floating_network
3265 self
.assertEqual(result
, None)
3267 @patch("time.sleep")
3268 def test_assign_floating_ip(self
, mock_sleep
):
3269 """Assign floating ip successfully."""
3270 free_floating_ip
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3271 floating_network
= {"vim_id": floating_network_vim_id
}
3273 "port_id": floating_network_vim_id
,
3274 "floating_network_id": "p08b73-e9cc-5a6a-t270-82cc4811bd4a",
3275 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3276 "tenant_id": "k08b73-e9cc-5a6a-t270-82cc4811bd4a",
3278 self
.vimconn
.neutron
.update_floatingip
.side_effect
= None
3279 self
.vimconn
.neutron
.show_floatingip
.return_value
= fip
3280 expected_result
= fip
3282 result
= self
.vimconn
._assign
_floating
_ip
(free_floating_ip
, floating_network
)
3283 self
.assertEqual(result
, expected_result
)
3284 self
.vimconn
.neutron
.update_floatingip
.assert_called_once_with(
3286 {"floatingip": {"port_id": floating_network_vim_id
}},
3288 mock_sleep
.assert_called_once_with(5)
3289 self
.vimconn
.neutron
.show_floatingip
.assert_called_once_with(free_floating_ip
)
3291 @patch("time.sleep")
3292 def test_assign_floating_ip_update_floating_ip_exception(self
, mock_sleep
):
3293 """Neutron update floating ip raises exception."""
3294 free_floating_ip
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3295 floating_network
= {"vim_id": floating_network_vim_id
}
3296 self
.vimconn
.neutron
= CopyingMock()
3297 self
.vimconn
.neutron
.update_floatingip
.side_effect
= Exception(
3298 "Floating ip is not updated."
3301 with self
.assertRaises(Exception) as err
:
3302 result
= self
.vimconn
._assign
_floating
_ip
(
3303 free_floating_ip
, floating_network
3305 self
.assertEqual(result
, None)
3306 self
.assertEqual(str(err
.exception
), "Floating ip is not updated.")
3308 self
.vimconn
.neutron
.update_floatingip
.assert_called_once_with(
3310 {"floatingip": {"port_id": floating_network_vim_id
}},
3312 mock_sleep
.assert_not_called()
3313 self
.vimconn
.neutron
.show_floatingip
.assert_not_called()
3315 @patch("time.sleep")
3316 def test_assign_floating_ip_show_floating_ip_exception(self
, mock_sleep
):
3317 """Neutron show floating ip raises exception."""
3318 free_floating_ip
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3319 floating_network
= {"vim_id": floating_network_vim_id
}
3320 self
.vimconn
.neutron
.update_floatingip
.side_effect
= None
3321 self
.vimconn
.neutron
.show_floatingip
.side_effect
= Exception(
3322 "Floating ip could not be shown."
3325 with self
.assertRaises(Exception) as err
:
3326 result
= self
.vimconn
._assign
_floating
_ip
(
3327 free_floating_ip
, floating_network
3329 self
.assertEqual(result
, None)
3330 self
.assertEqual(str(err
.exception
), "Floating ip could not be shown.")
3331 self
.vimconn
.neutron
.update_floatingip
.assert_called_once_with(
3333 {"floatingip": {"port_id": floating_network_vim_id
}},
3335 mock_sleep
.assert_called_once_with(5)
3336 self
.vimconn
.neutron
.show_floatingip
.assert_called_once_with(free_floating_ip
)
3338 @patch("random.shuffle")
3339 @patch.object(vimconnector
, "_find_floating_ip")
3340 def test_get_free_floating_ip(self
, mock_find_floating_ip
, mock_shuffle
):
3341 """Get free floating ip successfully."""
3342 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3345 "port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3346 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3347 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3348 "tenant_id": "208b73-e9cc-5a6a-t270-82cc4811bd4a",
3351 "port_id": "508b73-r9cc-5a6a-5270-o2cc4811bd4a",
3352 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3353 "id": "208b73-o9cc-5a6a-a270-52cc4811bd8",
3354 "tenant_id": "208b73-e9cc-5a6a-t270-82cc4811bd4a",
3357 self
.vimconn
.neutron
.list_floatingips
.return_value
= {
3358 "floatingips": floating_ips
3360 mock_find_floating_ip
.return_value
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3361 expected_result
= "508b73-o9cc-5a6a-a270-72cc4811bd8"
3363 result
= self
.vimconn
._get
_free
_floating
_ip
(self
.server
, floating_network
)
3364 self
.assertEqual(result
, expected_result
)
3365 mock_shuffle
.assert_called_once_with(floating_ips
)
3366 mock_find_floating_ip
.assert_called_once_with(
3367 self
.server
, floating_ips
, floating_network
3370 @patch("random.shuffle")
3371 @patch.object(vimconnector
, "_find_floating_ip")
3372 def test_get_free_floating_ip_list_floating_ip_exception(
3373 self
, mock_find_floating_ip
, mock_shuffle
3375 """Neutron list floating IPs raises exception."""
3376 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3377 self
.vimconn
.neutron
= CopyingMock()
3378 self
.vimconn
.neutron
.list_floatingips
.side_effect
= Exception(
3379 "Floating ips could not be listed."
3381 with self
.assertRaises(Exception) as err
:
3382 result
= self
.vimconn
._get
_free
_floating
_ip
(self
.server
, floating_network
)
3383 self
.assertEqual(result
, None)
3384 self
.assertEqual(str(err
.exception
), "Floating ips could not be listed.")
3385 mock_shuffle
.assert_not_called()
3386 mock_find_floating_ip
.assert_not_called()
3388 @patch("random.shuffle")
3389 @patch.object(vimconnector
, "_find_floating_ip")
3390 def test_get_free_floating_ip_find_floating_ip_exception(
3391 self
, mock_find_floating_ip
, mock_shuffle
3393 """_find_floating_ip method raises exception."""
3394 floating_network
= {"floating_ip": "308b73-t9cc-1a6a-a270-12cc4811bd4a"}
3397 "port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3398 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3399 "id": "508b73-o9cc-5a6a-a270-72cc4811bd8",
3400 "tenant_id": "208b73-e9cc-5a6a-t270-82cc4811bd4a",
3403 "port_id": "508b73-r9cc-5a6a-5270-o2cc4811bd4a",
3404 "floating_network_id": "308b73-t9cc-1a6a-a270-12cc4811bd4a",
3405 "id": "208b73-o9cc-5a6a-a270-52cc4811bd8",
3406 "tenant_id": "208b73-e9cc-5a6a-t270-82cc4811bd4a",
3409 self
.vimconn
.neutron
= CopyingMock()
3410 self
.vimconn
.neutron
.list_floatingips
.return_value
= {
3411 "floatingips": floating_ips
3413 mock_find_floating_ip
.side_effect
= Exception(
3414 "Free floating ip could not be found."
3417 with self
.assertRaises(Exception) as err
:
3418 result
= self
.vimconn
._get
_free
_floating
_ip
(self
.server
, floating_network
)
3419 self
.assertEqual(result
, None)
3420 self
.assertEqual(str(err
.exception
), "Free floating ip could not be found.")
3421 mock_shuffle
.assert_called_once_with(floating_ips
)
3422 mock_find_floating_ip
.assert_called_once_with(
3423 self
.server
, floating_ips
, floating_network
3426 @patch.object(vimconnector
, "_create_floating_ip")
3427 @patch.object(vimconnector
, "_get_free_floating_ip")
3428 @patch.object(vimconnector
, "_assign_floating_ip")
3429 def test_prepare_external_network_for_vm_instance(
3431 mock_assign_floating_ip
,
3432 mock_get_free_floating_ip
,
3433 mock_create_floating_ip
,
3435 """Prepare external network successfully."""
3436 external_network
= [
3438 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3439 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3443 vm_start_time
= time_return_value
3444 mock_get_free_floating_ip
.side_effect
= ["y08b73-o9cc-1a6a-a270-12cc4811bd4u"]
3445 mock_assign_floating_ip
.return_value
= {
3446 "floatingip": {"port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a"}
3448 self
.vimconn
.neutron
= CopyingMock()
3449 self
.vimconn
.nova
= CopyingMock()
3450 self
.vimconn
.neutron
.show_floatingip
.return_value
= {
3451 "floatingip": {"port_id": ""}
3454 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3455 external_network
, self
.server
, created_items
, vm_start_time
3458 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 1)
3459 mock_get_free_floating_ip
.assert_called_once_with(
3462 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3463 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3466 self
.vimconn
.neutron
.show_floatingip
.assert_called_once_with(
3467 "y08b73-o9cc-1a6a-a270-12cc4811bd4u"
3469 self
.vimconn
.nova
.servers
.get
.assert_not_called()
3470 mock_create_floating_ip
.assert_not_called()
3471 mock_assign_floating_ip
.assert_called_once_with(
3472 "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3474 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3475 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3480 @patch("time.sleep")
3481 @patch.object(vimconnector
, "_create_floating_ip")
3482 @patch.object(vimconnector
, "_get_free_floating_ip")
3483 @patch.object(vimconnector
, "_assign_floating_ip")
3484 def test_prepare_external_network_for_vm_instance_no_free_floating_ip(
3486 mock_assign_floating_ip
,
3487 mock_get_free_floating_ip
,
3488 mock_create_floating_ip
,
3492 """There is not any free floating ip."""
3493 floating_network
= {
3494 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3495 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3497 external_network
= [floating_network
]
3500 vm_start_time
= time_return_value
3501 mock_get_free_floating_ip
.return_value
= None
3502 mock_assign_floating_ip
.return_value
= {}
3503 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3504 self
.vimconn
.neutron
.show_floatingip
.return_value
= {}
3506 with self
.assertRaises(KeyError):
3507 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3508 external_network
, self
.server
, created_items
, vm_start_time
3511 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 4)
3512 mock_get_free_floating_ip
.assert_called_with(
3515 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3516 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3519 self
.vimconn
.neutron
.show_floatingip
.assert_called_with(None)
3520 mock_sleep
.assert_not_called()
3521 mock_time
.assert_not_called()
3522 self
.assertEqual(self
.vimconn
.nova
.servers
.get
.call_count
, 4)
3523 mock_create_floating_ip
.assert_called_with(
3524 floating_network
, self
.server
, created_items
3526 self
.assertEqual(mock_create_floating_ip
.call_count
, 4)
3527 mock_assign_floating_ip
.assert_not_called()
3528 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
3531 @patch("time.sleep")
3532 @patch.object(vimconnector
, "_create_floating_ip")
3533 @patch.object(vimconnector
, "_get_free_floating_ip")
3534 @patch.object(vimconnector
, "_assign_floating_ip")
3535 def test_prepare_external_network_for_vm_instance_no_free_fip_can_not_create_fip_exit_on_error_false(
3537 mock_assign_floating_ip
,
3538 mock_get_free_floating_ip
,
3539 mock_create_floating_ip
,
3543 """There is not any free floating ip, create_floating ip method raise exception
3544 exit_on_floating_ip_error set to False."""
3545 floating_network
= {
3546 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3547 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3548 "exit_on_floating_ip_error": False,
3550 external_network
= [floating_network
]
3553 vm_start_time
= time_return_value
3554 mock_get_free_floating_ip
.return_value
= None
3555 mock_assign_floating_ip
.return_value
= {}
3556 mock_create_floating_ip
.side_effect
= VimConnException(
3557 "Can not create floating ip."
3559 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3560 self
.vimconn
.neutron
.show_floatingip
.return_value
= {}
3562 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3563 external_network
, self
.server
, created_items
, vm_start_time
3565 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 1)
3566 mock_get_free_floating_ip
.assert_called_with(
3569 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3570 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3571 "exit_on_floating_ip_error": False,
3574 self
.vimconn
.neutron
.show_floatingip
.assert_not_called()
3575 mock_sleep
.assert_not_called()
3576 mock_time
.assert_not_called()
3577 self
.vimconn
.nova
.servers
.get
.assert_not_called()
3578 mock_create_floating_ip
.assert_called_with(
3579 floating_network
, self
.server
, created_items
3581 self
.assertEqual(mock_create_floating_ip
.call_count
, 1)
3582 mock_assign_floating_ip
.assert_not_called()
3585 @patch("time.sleep")
3586 @patch.object(vimconnector
, "_create_floating_ip")
3587 @patch.object(vimconnector
, "_get_free_floating_ip")
3588 @patch.object(vimconnector
, "_assign_floating_ip")
3589 def test_prepare_external_network_for_vm_instance_no_free_fip_can_not_create_fip_exit_on_error_true(
3591 mock_assign_floating_ip
,
3592 mock_get_free_floating_ip
,
3593 mock_create_floating_ip
,
3597 """There is not any free floating ip, create_floating ip method raise exception
3598 exit_on_floating_ip_error set to False."""
3599 floating_network
= {
3600 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3601 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3602 "exit_on_floating_ip_error": True,
3604 external_network
= [floating_network
]
3607 vm_start_time
= time_return_value
3608 mock_get_free_floating_ip
.return_value
= None
3609 mock_assign_floating_ip
.return_value
= {}
3610 mock_create_floating_ip
.side_effect
= VimConnException(
3611 "Can not create floating ip."
3613 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3614 self
.vimconn
.neutron
.show_floatingip
.return_value
= {}
3615 with self
.assertRaises(VimConnException
):
3616 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3617 external_network
, self
.server
, created_items
, vm_start_time
3619 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 1)
3620 mock_get_free_floating_ip
.assert_called_with(
3623 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3624 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3625 "exit_on_floating_ip_error": True,
3628 self
.vimconn
.neutron
.show_floatingip
.assert_not_called()
3629 mock_sleep
.assert_not_called()
3630 mock_time
.assert_not_called()
3631 self
.vimconn
.nova
.servers
.get
.assert_not_called()
3632 mock_create_floating_ip
.assert_called_with(
3633 floating_network
, self
.server
, created_items
3635 self
.assertEqual(mock_create_floating_ip
.call_count
, 1)
3636 mock_assign_floating_ip
.assert_not_called()
3638 @patch.object(vimconnector
, "_create_floating_ip")
3639 @patch.object(vimconnector
, "_get_free_floating_ip")
3640 @patch.object(vimconnector
, "_assign_floating_ip")
3641 def test_prepare_external_network_for_vm_instance_fip_has_port_id(
3643 mock_assign_floating_ip
,
3644 mock_get_free_floating_ip
,
3645 mock_create_floating_ip
,
3647 """Neutron show floating ip return the fip with port_id and floating network vim_id
3648 is different from port_id."""
3649 floating_network
= {
3650 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3651 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3653 external_network
= [floating_network
]
3656 mock_get_free_floating_ip
.side_effect
= [
3657 "t08b73-o9cc-1a6a-a270-12cc4811bd4u",
3658 "r08b73-o9cc-1a6a-a270-12cc4811bd4u",
3659 "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3661 mock_assign_floating_ip
.side_effect
= [
3662 {"floatingip": {"port_id": "k08b73-r9cc-5a6a-a270-82cc4811bd4a"}},
3663 {"floatingip": {"port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a"}},
3665 self
.vimconn
.neutron
= CopyingMock()
3666 self
.vimconn
.nova
= CopyingMock()
3667 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3668 {"floatingip": {"port_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a"}},
3669 {"floatingip": {"port_id": ""}},
3670 {"floatingip": {"port_id": ""}},
3672 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3673 external_network
, self
.server
, created_items
, vm_start_time
3675 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 3)
3676 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3678 _call_mock_get_free_floating_ip
[0][0],
3685 _call_mock_get_free_floating_ip
[1][0],
3692 _call_mock_get_free_floating_ip
[2][0],
3698 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 3)
3699 self
.vimconn
.nova
.servers
.get
.assert_not_called()
3700 mock_create_floating_ip
.assert_not_called()
3701 self
.assertEqual(mock_assign_floating_ip
.call_count
, 2)
3702 _call_mock_assign_floating_ip
= mock_assign_floating_ip
.call_args_list
3704 _call_mock_assign_floating_ip
[0][0],
3705 ("r08b73-o9cc-1a6a-a270-12cc4811bd4u", floating_network
),
3708 _call_mock_assign_floating_ip
[1][0],
3709 ("y08b73-o9cc-1a6a-a270-12cc4811bd4u", floating_network
),
3713 @patch("time.sleep")
3714 @patch.object(vimconnector
, "_create_floating_ip")
3715 @patch.object(vimconnector
, "_get_free_floating_ip")
3716 @patch.object(vimconnector
, "_assign_floating_ip")
3717 def test_prepare_external_network_for_vm_instance_neutron_show_fip_exception_vm_status_in_error(
3719 mock_assign_floating_ip
,
3720 mock_get_free_floating_ip
,
3721 mock_create_floating_ip
,
3725 """Neutron show floating ip gives exception, exit_on_floating_ip_error set to True,
3726 VM status is in error."""
3727 floating_network
= {
3728 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3729 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3730 "exit_on_floating_ip_error": True,
3732 external_network
= [floating_network
]
3734 vm_start_time
= time_return_value
3736 mock_time
.side_effect
= [156570150, 156570800, 156571200]
3738 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3739 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3740 Exception("Floating ip could not be shown.")
3742 with self
.assertRaises(Exception) as err
:
3743 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3744 external_network
, self
.server
, created_items
, vm_start_time
3748 "Cannot create floating_ip: Exception Floating ip could not be shown.",
3751 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 4)
3752 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3754 _call_mock_get_free_floating_ip
[0][0],
3761 _call_mock_get_free_floating_ip
[1][0],
3768 _call_mock_get_free_floating_ip
[2][0],
3775 _call_mock_get_free_floating_ip
[3][0],
3782 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 4)
3783 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
3784 mock_create_floating_ip
.assert_not_called()
3785 mock_assign_floating_ip
.assert_not_called()
3786 mock_time
.assert_not_called()
3787 mock_sleep
.assert_not_called()
3790 @patch("time.sleep")
3791 @patch.object(vimconnector
, "_create_floating_ip")
3792 @patch.object(vimconnector
, "_get_free_floating_ip")
3793 @patch.object(vimconnector
, "_assign_floating_ip")
3794 def test_prepare_external_network_for_vm_instance_neutron_show_fip_exception_vm_status_in_active(
3796 mock_assign_floating_ip
,
3797 mock_get_free_floating_ip
,
3798 mock_create_floating_ip
,
3802 """Neutron show floating ip gives exception, exit_on_floating_ip_error is set to False,
3803 VM status is in active."""
3804 floating_network
= {
3805 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3806 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3807 "exit_on_floating_ip_error": False,
3809 external_network
= [floating_network
]
3811 vm_start_time
= time_return_value
3813 mock_time
.side_effect
= [156570150, 156570800, 156571200]
3815 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ACTIVE"
3816 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3817 Exception("Floating ip could not be shown.")
3820 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3821 external_network
, self
.server
, created_items
, vm_start_time
3823 # self.assertEqual(str(err.exception), "Cannot create floating_ip")
3825 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 4)
3826 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3828 _call_mock_get_free_floating_ip
[0][0],
3835 _call_mock_get_free_floating_ip
[1][0],
3842 _call_mock_get_free_floating_ip
[2][0],
3849 _call_mock_get_free_floating_ip
[3][0],
3856 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 4)
3857 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
3858 mock_create_floating_ip
.assert_not_called()
3859 mock_assign_floating_ip
.assert_not_called()
3860 mock_time
.assert_not_called()
3861 mock_sleep
.assert_not_called()
3864 @patch("time.sleep")
3865 @patch.object(vimconnector
, "_create_floating_ip")
3866 @patch.object(vimconnector
, "_get_free_floating_ip")
3867 @patch.object(vimconnector
, "_assign_floating_ip")
3868 def test_prepare_external_network_for_vm_instance_neutron_show_fip_exception_exit_on_error(
3870 mock_assign_floating_ip
,
3871 mock_get_free_floating_ip
,
3872 mock_create_floating_ip
,
3876 """Neutron show floating ip gives exception, but exit_on_floating_ip_error is set to True.
3877 VM status is not ACTIVE or ERROR, server timeout happened."""
3878 floating_network
= {
3879 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3880 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3881 "exit_on_floating_ip_error": True,
3883 external_network
= [floating_network
]
3885 vm_start_time
= time_return_value
3886 mock_get_free_floating_ip
.side_effect
= None
3887 mock_time
.side_effect
= [156571790, 156571795, 156571800, 156571805]
3888 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "OTHER"
3889 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3890 Exception("Floating ip could not be shown.")
3893 with self
.assertRaises(VimConnException
) as err
:
3894 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3895 external_network
, self
.server
, created_items
, vm_start_time
3899 "Cannot create floating_ip: Exception Floating ip could not be shown.",
3902 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 3)
3903 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3905 _call_mock_get_free_floating_ip
[0][0],
3912 _call_mock_get_free_floating_ip
[1][0],
3919 _call_mock_get_free_floating_ip
[2][0],
3926 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 3)
3927 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
3928 mock_create_floating_ip
.assert_not_called()
3929 mock_assign_floating_ip
.assert_not_called()
3930 self
.assertEqual(mock_time
.call_count
, 3)
3931 self
.assertEqual(mock_sleep
.call_count
, 2)
3934 @patch("time.sleep")
3935 @patch.object(vimconnector
, "_create_floating_ip")
3936 @patch.object(vimconnector
, "_get_free_floating_ip")
3937 @patch.object(vimconnector
, "_assign_floating_ip")
3938 def test_prepare_external_network_for_vm_instance_assign_floating_ip_exception_exit_on_error(
3940 mock_assign_floating_ip
,
3941 mock_get_free_floating_ip
,
3942 mock_create_floating_ip
,
3946 """Assign floating ip method gives exception, exit_on_floating_ip_error is set to True.
3947 VM status is in ERROR."""
3948 floating_network
= {
3949 "floating_ip": "y08b73-o9cc-1a6a-a270-12cc4811bd4u",
3950 "vim_id": "608b73-r9cc-5a6a-a270-82cc4811bd4a",
3951 "exit_on_floating_ip_error": True,
3953 external_network
= [floating_network
]
3955 vm_start_time
= time_return_value
3957 mock_get_free_floating_ip
.side_effect
= [
3958 "y08b73-o9cc-1a6a-a270-12cc4811bd4u"
3961 mock_time
.side_effect
= [156571790, 156571795, 156571800, 156571805]
3963 mock_assign_floating_ip
.side_effect
= [
3964 Exception("Floating ip could not be assigned.")
3967 self
.vimconn
.nova
.servers
.get
.return_value
.status
= "ERROR"
3968 self
.vimconn
.neutron
.show_floatingip
.side_effect
= [
3969 {"floatingip": {"port_id": ""}}
3972 with self
.assertRaises(VimConnException
) as err
:
3973 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
3974 external_network
, self
.server
, created_items
, vm_start_time
3978 "Cannot create floating_ip: Exception Floating ip could not be assigned.",
3981 self
.assertEqual(mock_get_free_floating_ip
.call_count
, 4)
3982 _call_mock_get_free_floating_ip
= mock_get_free_floating_ip
.call_args_list
3984 _call_mock_get_free_floating_ip
[0][0],
3991 _call_mock_get_free_floating_ip
[1][0],
3998 _call_mock_get_free_floating_ip
[2][0],
4005 self
.assertEqual(self
.vimconn
.neutron
.show_floatingip
.call_count
, 4)
4006 self
.vimconn
.neutron
.show_floatingip
.assert_called_with(
4007 "y08b73-o9cc-1a6a-a270-12cc4811bd4u"
4009 self
.assertEqual(self
.vimconn
.nova
.servers
.get
.call_count
, 4)
4010 self
.vimconn
.nova
.servers
.get
.assert_called_with(self
.server
.id)
4011 mock_time
.assert_not_called()
4012 mock_sleep
.assert_not_called()
4013 mock_create_floating_ip
.assert_not_called()
4016 @patch("time.sleep")
4017 @patch.object(vimconnector
, "_create_floating_ip")
4018 @patch.object(vimconnector
, "_get_free_floating_ip")
4019 @patch.object(vimconnector
, "_assign_floating_ip")
4020 def test_prepare_external_network_for_vm_instance_empty_external_network_list(
4022 mock_assign_floating_ip
,
4023 mock_get_free_floating_ip
,
4024 mock_create_floating_ip
,
4028 """External network list is empty."""
4029 external_network
= []
4031 vm_start_time
= time_return_value
4033 self
.vimconn
._prepare
_external
_network
_for
_vminstance
(
4034 external_network
, self
.server
, created_items
, vm_start_time
4036 mock_create_floating_ip
.assert_not_called()
4037 mock_time
.assert_not_called()
4038 mock_sleep
.assert_not_called()
4039 mock_assign_floating_ip
.assert_not_called()
4040 mock_get_free_floating_ip
.assert_not_called()
4041 self
.vimconn
.neutron
.show
.show_floatingip
.assert_not_called()
4042 self
.vimconn
.nova
.servers
.get
.assert_not_called()
4044 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4045 def test_update_port_security_for_vm_instance(self
, mock_wait_for_vm
):
4046 """no_secured_ports has port and the port has allow-address-pairs."""
4047 no_secured_ports
= [(port2_id
, "allow-address-pairs")]
4049 self
.vimconn
._update
_port
_security
_for
_vminstance
(no_secured_ports
, self
.server
)
4051 mock_wait_for_vm
.assert_called_once_with(self
.server
.id, "ACTIVE")
4053 self
.vimconn
.neutron
.update_port
.assert_called_once_with(
4055 {"port": {"allowed_address_pairs": [{"ip_address": "0.0.0.0/0"}]}},
4058 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4059 def test_update_port_security_for_vm_instance_no_allowed_address_pairs(
4060 self
, mock_wait_for_vm
4062 """no_secured_ports has port and the port does not have allow-address-pairs."""
4063 no_secured_ports
= [(port2_id
, "something")]
4065 self
.vimconn
._update
_port
_security
_for
_vminstance
(no_secured_ports
, self
.server
)
4067 mock_wait_for_vm
.assert_called_once_with(self
.server
.id, "ACTIVE")
4069 self
.vimconn
.neutron
.update_port
.assert_called_once_with(
4071 {"port": {"port_security_enabled": False, "security_groups": None}},
4074 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4075 def test_update_port_security_for_vm_instance_wait_for_vm_raise_exception(
4076 self
, mock_wait_for_vm
4078 """__wait_for_vm raises timeout exception."""
4079 no_secured_ports
= [(port2_id
, "something")]
4081 mock_wait_for_vm
.side_effect
= VimConnException("Timeout waiting for instance.")
4083 with self
.assertRaises(VimConnException
) as err
:
4084 self
.vimconn
._update
_port
_security
_for
_vminstance
(
4085 no_secured_ports
, self
.server
4087 self
.assertEqual(str(err
.exception
), "Timeout waiting for instance.")
4089 mock_wait_for_vm
.assert_called_once_with(self
.server
.id, "ACTIVE")
4091 self
.vimconn
.neutron
.update_port
.assert_not_called()
4093 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4094 def test_update_port_security_for_vm_instance_neutron_update_port_raise_exception(
4095 self
, mock_wait_for_vm
4097 """neutron_update_port method raises exception."""
4098 no_secured_ports
= [(port2_id
, "something")]
4100 self
.vimconn
.neutron
.update_port
.side_effect
= Exception(
4101 "Port security could not be updated."
4104 with self
.assertRaises(VimConnException
) as err
:
4105 self
.vimconn
._update
_port
_security
_for
_vminstance
(
4106 no_secured_ports
, self
.server
4110 "It was not possible to disable port security for port 17472685-f67f-49fd-8722-eabb7692fc22",
4112 mock_wait_for_vm
.assert_called_once_with(self
.server
.id, "ACTIVE")
4114 self
.vimconn
.neutron
.update_port
.assert_called_once_with(
4116 {"port": {"port_security_enabled": False, "security_groups": None}},
4119 @patch.object(vimconnector
, "_vimconnector__wait_for_vm")
4120 def test_update_port_security_for_vm_instance_empty_port_list(
4121 self
, mock_wait_for_vm
4123 """no_secured_ports list does not have any ports."""
4124 no_secured_ports
= []
4126 self
.vimconn
._update
_port
_security
_for
_vminstance
(no_secured_ports
, self
.server
)
4128 mock_wait_for_vm
.assert_not_called()
4130 self
.vimconn
.neutron
.update_port
.assert_not_called()
4133 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4134 @patch.object(vimconnector
, "_reload_connection")
4135 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4136 @patch.object(vimconnector
, "_create_user_data")
4137 @patch.object(vimconnector
, "_get_vm_availability_zone")
4138 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4139 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4140 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4141 @patch.object(vimconnector
, "delete_vminstance")
4142 @patch.object(vimconnector
, "_format_exception")
4143 def test_new_vm_instance(
4145 mock_format_exception
,
4146 mock_delete_vm_instance
,
4147 mock_prepare_external_network
,
4148 mock_update_port_security
,
4149 mock_prepare_disk_for_vm_instance
,
4150 mock_get_vm_availability_zone
,
4151 mock_create_user_data
,
4152 mock_prepare_network_for_vm_instance
,
4153 mock_reload_connection
,
4154 mock_remove_keep_flag_from_persistent_volumes
,
4157 """New VM instance creation is successful."""
4159 mock_create_user_data
.return_value
= True, "userdata"
4161 mock_get_vm_availability_zone
.return_value
= "nova"
4163 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4165 mock_time
.return_value
= time_return_value
4167 expected_result
= self
.server
.id, {}
4169 result
= self
.vimconn
.new_vminstance(
4175 affinity_group_list
,
4179 availability_zone_index
,
4180 availability_zone_list
,
4182 self
.assertEqual(result
, expected_result
)
4184 mock_reload_connection
.assert_called_once()
4185 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4190 external_network
=[],
4191 no_secured_ports
=[],
4193 mock_create_user_data
.assert_called_once_with(cloud_config
)
4194 mock_get_vm_availability_zone
.assert_called_once_with(
4195 availability_zone_index
, availability_zone_list
4197 mock_prepare_disk_for_vm_instance
.assert_called_once_with(
4199 existing_vim_volumes
=[],
4202 block_device_mapping
={},
4203 disk_list
=disk_list2
,
4205 self
.vimconn
.nova
.servers
.create
.assert_called_once_with(
4210 security_groups
="default",
4211 availability_zone
="nova",
4212 key_name
="my_keypair",
4213 userdata
="userdata",
4215 block_device_mapping
={},
4218 mock_time
.assert_called_once()
4219 mock_update_port_security
.assert_called_once_with([], self
.server
)
4220 mock_prepare_external_network
.assert_called_once_with(
4221 external_network
=[],
4224 vm_start_time
=time_return_value
,
4226 mock_remove_keep_flag_from_persistent_volumes
.assert_not_called()
4227 mock_delete_vm_instance
.assert_not_called()
4228 mock_format_exception
.assert_not_called()
4231 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4232 @patch.object(vimconnector
, "_reload_connection")
4233 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4234 @patch.object(vimconnector
, "_create_user_data")
4235 @patch.object(vimconnector
, "_get_vm_availability_zone")
4236 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4237 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4238 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4239 @patch.object(vimconnector
, "delete_vminstance")
4240 @patch.object(vimconnector
, "_format_exception")
4241 def test_new_vm_instance_create_user_data_fails(
4243 mock_format_exception
,
4244 mock_delete_vm_instance
,
4245 mock_prepare_external_network
,
4246 mock_update_port_security
,
4247 mock_prepare_disk_for_vm_instance
,
4248 mock_get_vm_availability_zone
,
4249 mock_create_user_data
,
4250 mock_prepare_network_for_vm_instance
,
4251 mock_reload_connection
,
4252 mock_remove_keep_flag_from_persistent_volumes
,
4255 """New VM instance creation failed because of user data creation failure."""
4257 mock_create_user_data
.side_effect
= Exception(
4258 "User data could not be retrieved."
4261 mock_get_vm_availability_zone
.return_value
= "nova"
4263 mock_remove_keep_flag_from_persistent_volumes
.return_value
= {}
4265 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4267 mock_time
.return_value
= time_return_value
4269 self
.vimconn
.new_vminstance(
4275 affinity_group_list
,
4279 availability_zone_index
,
4280 availability_zone_list
,
4283 mock_reload_connection
.assert_called_once()
4284 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4289 external_network
=[],
4290 no_secured_ports
=[],
4292 mock_create_user_data
.assert_called_once_with(cloud_config
)
4293 mock_get_vm_availability_zone
.assert_not_called()
4294 mock_prepare_disk_for_vm_instance
.assert_not_called()
4295 self
.vimconn
.nova
.servers
.create
.assert_not_called()
4296 mock_time
.assert_not_called()
4297 mock_update_port_security
.assert_not_called()
4298 mock_prepare_external_network
.assert_not_called()
4299 mock_remove_keep_flag_from_persistent_volumes
.assert_called_once_with({})
4300 mock_delete_vm_instance
.assert_called_once_with(None, {})
4301 mock_format_exception
.assert_called_once()
4302 arg
= mock_format_exception
.call_args
[0][0]
4303 self
.assertEqual(str(arg
), "User data could not be retrieved.")
4306 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4307 @patch.object(vimconnector
, "_reload_connection")
4308 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4309 @patch.object(vimconnector
, "_create_user_data")
4310 @patch.object(vimconnector
, "_get_vm_availability_zone")
4311 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4312 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4313 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4314 @patch.object(vimconnector
, "delete_vminstance")
4315 @patch.object(vimconnector
, "_format_exception")
4316 def test_new_vm_instance_external_network_exception(
4318 mock_format_exception
,
4319 mock_delete_vm_instance
,
4320 mock_prepare_external_network
,
4321 mock_update_port_security
,
4322 mock_prepare_disk_for_vm_instance
,
4323 mock_get_vm_availability_zone
,
4324 mock_create_user_data
,
4325 mock_prepare_network_for_vm_instance
,
4326 mock_reload_connection
,
4327 mock_remove_keep_flag_from_persistent_volumes
,
4330 """New VM instance creation, external network connection has failed as floating
4331 ip could not be created."""
4333 mock_create_user_data
.return_value
= True, "userdata"
4335 mock_get_vm_availability_zone
.return_value
= "nova"
4337 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4339 mock_time
.return_value
= time_return_value
4341 mock_remove_keep_flag_from_persistent_volumes
.return_value
= {}
4343 mock_prepare_external_network
.side_effect
= VimConnException(
4344 "Can not create floating ip."
4347 self
.vimconn
.new_vminstance(
4353 affinity_group_list
,
4357 availability_zone_index
,
4358 availability_zone_list
,
4361 mock_reload_connection
.assert_called_once()
4362 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4367 external_network
=[],
4368 no_secured_ports
=[],
4370 mock_create_user_data
.assert_called_once_with(cloud_config
)
4371 mock_get_vm_availability_zone
.assert_called_once_with(
4372 availability_zone_index
, availability_zone_list
4374 mock_prepare_disk_for_vm_instance
.assert_called_once_with(
4376 existing_vim_volumes
=[],
4379 block_device_mapping
={},
4380 disk_list
=disk_list2
,
4382 self
.vimconn
.nova
.servers
.create
.assert_called_once_with(
4387 security_groups
="default",
4388 availability_zone
="nova",
4389 key_name
="my_keypair",
4390 userdata
="userdata",
4392 block_device_mapping
={},
4395 mock_time
.assert_called_once()
4396 mock_update_port_security
.assert_called_once_with([], self
.server
)
4397 mock_prepare_external_network
.assert_called_once_with(
4398 external_network
=[],
4401 vm_start_time
=time_return_value
,
4403 mock_remove_keep_flag_from_persistent_volumes
.assert_called_once_with({})
4404 mock_delete_vm_instance
.assert_called_once_with(self
.server
.id, {})
4405 mock_format_exception
.assert_called_once()
4406 arg
= mock_format_exception
.call_args
[0][0]
4407 self
.assertEqual(str(arg
), "Can not create floating ip.")
4410 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4411 @patch.object(vimconnector
, "_reload_connection")
4412 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4413 @patch.object(vimconnector
, "_create_user_data")
4414 @patch.object(vimconnector
, "_get_vm_availability_zone")
4415 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4416 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4417 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4418 @patch.object(vimconnector
, "delete_vminstance")
4419 @patch.object(vimconnector
, "_format_exception")
4420 def test_new_vm_instance_with_affinity_group(
4422 mock_format_exception
,
4423 mock_delete_vm_instance
,
4424 mock_prepare_external_network
,
4425 mock_update_port_security
,
4426 mock_prepare_disk_for_vm_instance
,
4427 mock_get_vm_availability_zone
,
4428 mock_create_user_data
,
4429 mock_prepare_network_for_vm_instance
,
4430 mock_reload_connection
,
4431 mock_remove_keep_flag_from_persistent_volumes
,
4434 """New VM creation with affinity group."""
4435 affinity_group_list
= [
4436 {"affinity_group_id": "38b73-e9cc-5a6a-t270-82cc4811bd4a"}
4438 mock_create_user_data
.return_value
= True, "userdata"
4439 mock_get_vm_availability_zone
.return_value
= "nova"
4440 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4441 mock_time
.return_value
= time_return_value
4442 expected_result
= self
.server
.id, {}
4444 result
= self
.vimconn
.new_vminstance(
4450 affinity_group_list
,
4454 availability_zone_index
,
4455 availability_zone_list
,
4457 self
.assertEqual(result
, expected_result
)
4459 mock_reload_connection
.assert_called_once()
4460 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4465 external_network
=[],
4466 no_secured_ports
=[],
4468 mock_create_user_data
.assert_called_once_with(cloud_config
)
4469 mock_get_vm_availability_zone
.assert_called_once_with(
4470 availability_zone_index
, availability_zone_list
4472 mock_prepare_disk_for_vm_instance
.assert_called_once_with(
4474 existing_vim_volumes
=[],
4477 block_device_mapping
={},
4478 disk_list
=disk_list2
,
4480 self
.vimconn
.nova
.servers
.create
.assert_called_once_with(
4485 security_groups
="default",
4486 availability_zone
="nova",
4487 key_name
="my_keypair",
4488 userdata
="userdata",
4490 block_device_mapping
={},
4491 scheduler_hints
={"group": "38b73-e9cc-5a6a-t270-82cc4811bd4a"},
4493 mock_time
.assert_called_once()
4494 mock_update_port_security
.assert_called_once_with([], self
.server
)
4495 mock_prepare_external_network
.assert_called_once_with(
4496 external_network
=[],
4499 vm_start_time
=time_return_value
,
4501 mock_remove_keep_flag_from_persistent_volumes
.assert_not_called()
4502 mock_delete_vm_instance
.assert_not_called()
4503 mock_format_exception
.assert_not_called()
4506 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4507 @patch.object(vimconnector
, "_reload_connection")
4508 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4509 @patch.object(vimconnector
, "_create_user_data")
4510 @patch.object(vimconnector
, "_get_vm_availability_zone")
4511 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4512 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4513 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4514 @patch.object(vimconnector
, "delete_vminstance")
4515 @patch.object(vimconnector
, "_format_exception")
4516 def test_new_vm_instance_nova_server_create_failed(
4518 mock_format_exception
,
4519 mock_delete_vm_instance
,
4520 mock_prepare_external_network
,
4521 mock_update_port_security
,
4522 mock_prepare_disk_for_vm_instance
,
4523 mock_get_vm_availability_zone
,
4524 mock_create_user_data
,
4525 mock_prepare_network_for_vm_instance
,
4526 mock_reload_connection
,
4527 mock_remove_keep_flag_from_persistent_volumes
,
4530 """New VM(server) creation failed."""
4532 mock_create_user_data
.return_value
= True, "userdata"
4534 mock_get_vm_availability_zone
.return_value
= "nova"
4536 self
.vimconn
.nova
.servers
.create
.side_effect
= Exception(
4537 "Server could not be created."
4540 mock_time
.return_value
= time_return_value
4542 mock_remove_keep_flag_from_persistent_volumes
.return_value
= {}
4544 self
.vimconn
.new_vminstance(
4550 affinity_group_list
,
4554 availability_zone_index
,
4555 availability_zone_list
,
4558 mock_reload_connection
.assert_called_once()
4559 mock_prepare_network_for_vm_instance
.assert_called_once_with(
4564 external_network
=[],
4565 no_secured_ports
=[],
4567 mock_create_user_data
.assert_called_once_with(cloud_config
)
4568 mock_get_vm_availability_zone
.assert_called_once_with(
4569 availability_zone_index
, availability_zone_list
4571 mock_prepare_disk_for_vm_instance
.assert_called_once_with(
4573 existing_vim_volumes
=[],
4576 block_device_mapping
={},
4577 disk_list
=disk_list2
,
4580 self
.vimconn
.nova
.servers
.create
.assert_called_once_with(
4585 security_groups
="default",
4586 availability_zone
="nova",
4587 key_name
="my_keypair",
4588 userdata
="userdata",
4590 block_device_mapping
={},
4593 mock_time
.assert_not_called()
4594 mock_update_port_security
.assert_not_called()
4595 mock_prepare_external_network
.assert_not_called()
4596 mock_remove_keep_flag_from_persistent_volumes
.assert_called_once_with({})
4597 mock_delete_vm_instance
.assert_called_once_with(None, {})
4598 mock_format_exception
.assert_called_once()
4599 arg
= mock_format_exception
.call_args
[0][0]
4600 self
.assertEqual(str(arg
), "Server could not be created.")
4603 @patch.object(vimconnector
, "remove_keep_tag_from_persistent_volumes")
4604 @patch.object(vimconnector
, "_reload_connection")
4605 @patch.object(vimconnector
, "_prepare_network_for_vminstance")
4606 @patch.object(vimconnector
, "_create_user_data")
4607 @patch.object(vimconnector
, "_get_vm_availability_zone")
4608 @patch.object(vimconnector
, "_prepare_disk_for_vminstance")
4609 @patch.object(vimconnector
, "_update_port_security_for_vminstance")
4610 @patch.object(vimconnector
, "_prepare_external_network_for_vminstance")
4611 @patch.object(vimconnector
, "delete_vminstance")
4612 @patch.object(vimconnector
, "_format_exception")
4613 def test_new_vm_instance_connection_exception(
4615 mock_format_exception
,
4616 mock_delete_vm_instance
,
4617 mock_prepare_external_network
,
4618 mock_update_port_security
,
4619 mock_prepare_disk_for_vm_instance
,
4620 mock_get_vm_availability_zone
,
4621 mock_create_user_data
,
4622 mock_prepare_network_for_vm_instance
,
4623 mock_reload_connection
,
4624 mock_remove_keep_flag_from_persistent_volumes
,
4627 """Connection to Cloud API has failed."""
4628 mock_reload_connection
.side_effect
= Exception("Can not connect to Cloud APIs.")
4629 mock_create_user_data
.return_value
= True, "userdata"
4630 mock_get_vm_availability_zone
.return_value
= "nova"
4631 self
.vimconn
.nova
.servers
.create
.return_value
= self
.server
4632 mock_time
.return_value
= time_return_value
4633 mock_remove_keep_flag_from_persistent_volumes
.return_value
= {}
4635 self
.vimconn
.new_vminstance(
4641 affinity_group_list
,
4645 availability_zone_index
,
4646 availability_zone_list
,
4648 mock_format_exception
.assert_called_once()
4649 arg
= mock_format_exception
.call_args
[0][0]
4650 self
.assertEqual(str(arg
), "Can not connect to Cloud APIs.")
4651 mock_reload_connection
.assert_called_once()
4652 mock_prepare_network_for_vm_instance
.assert_not_called()
4653 mock_create_user_data
.assert_not_called()
4654 mock_get_vm_availability_zone
.assert_not_called()
4655 mock_prepare_disk_for_vm_instance
.assert_not_called()
4656 self
.vimconn
.nova
.servers
.create
.assert_not_called()
4657 mock_time
.assert_not_called()
4658 mock_update_port_security
.assert_not_called()
4659 mock_prepare_external_network
.assert_not_called()
4660 mock_remove_keep_flag_from_persistent_volumes
.assert_called_once_with({})
4661 mock_delete_vm_instance
.assert_called_once_with(None, {})
4663 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4664 def test_delete_vm_ports_attached_to_network_empty_created_items(
4665 self
, mock_delete_ports_by_id_wth_neutron
4667 """Created_items is emtpty."""
4669 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4670 self
.vimconn
.neutron
.list_ports
.assert_not_called()
4671 self
.vimconn
.neutron
.delete_port
.assert_not_called()
4672 mock_delete_ports_by_id_wth_neutron
.assert_not_called()
4674 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4675 def test_delete_vm_ports_attached_to_network(
4676 self
, mock_delete_ports_by_id_wth_neutron
4679 "floating_ip:308b73-t9cc-1a6a-a270-12cc4811bd4a": True,
4680 f
"volume:{volume_id2}": True,
4681 f
"volume:{volume_id}": True,
4682 f
"port:{port_id}": True,
4684 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4685 mock_delete_ports_by_id_wth_neutron
.assert_called_once_with(f
"{port_id}")
4686 self
.vimconn
.logger
.error
.assert_not_called()
4688 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4689 def test_delete_vm_ports_attached_to_network_wthout_port(
4690 self
, mock_delete_ports_by_id_wth_neutron
4692 """Created_items does not have port."""
4694 f
"floating_ip:{floating_network_vim_id}": True,
4695 f
"volume:{volume_id2}": True,
4696 f
"volume:{volume_id}": True,
4698 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4699 mock_delete_ports_by_id_wth_neutron
.assert_not_called()
4700 self
.vimconn
.logger
.error
.assert_not_called()
4702 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4703 def test_delete_vm_ports_attached_to_network_delete_port_raise_vimconnexception(
4704 self
, mock_delete_ports_by_id_wth_neutron
4706 """_delete_ports_by_id_wth_neutron raises vimconnexception."""
4707 created_items
= deepcopy(created_items_all_true
)
4708 mock_delete_ports_by_id_wth_neutron
.side_effect
= VimConnException(
4709 "Can not delete port"
4711 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4712 mock_delete_ports_by_id_wth_neutron
.assert_called_once_with(f
"{port_id}")
4713 self
.vimconn
.logger
.error
.assert_called_once_with(
4714 "Error deleting port: VimConnException: Can not delete port"
4717 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4718 def test_delete_vm_ports_attached_to_network_delete_port_raise_nvexception(
4719 self
, mock_delete_ports_by_id_wth_neutron
4721 """_delete_ports_by_id_wth_neutron raises nvExceptions.ClientException."""
4722 created_items
= deepcopy(created_items_all_true
)
4723 mock_delete_ports_by_id_wth_neutron
.side_effect
= nvExceptions
.ClientException(
4724 "Connection aborted."
4726 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4727 mock_delete_ports_by_id_wth_neutron
.assert_called_once_with(f
"{port_id}")
4728 self
.vimconn
.logger
.error
.assert_called_once_with(
4729 "Error deleting port: ClientException: Unknown Error (HTTP Connection aborted.)"
4732 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4733 def test_delete_vm_ports_attached_to_network_delete_port_invalid_port_item(
4734 self
, mock_delete_ports_by_id_wth_neutron
4736 """port item is invalid."""
4738 f
"floating_ip:{floating_network_vim_id}": True,
4739 f
"volume:{volume_id2}": True,
4740 f
"volume:{volume_id}": True,
4741 f
"port:{port_id}:": True,
4743 mock_delete_ports_by_id_wth_neutron
.side_effect
= VimConnException(
4744 "Port is not valid."
4746 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4747 mock_delete_ports_by_id_wth_neutron
.assert_called_once_with(f
"{port_id}:")
4748 self
.vimconn
.logger
.error
.assert_called_once_with(
4749 "Error deleting port: VimConnException: Port is not valid."
4752 @patch.object(vimconnector
, "_delete_ports_by_id_wth_neutron")
4753 def test_delete_vm_ports_attached_to_network_delete_port_already_deleted(
4754 self
, mock_delete_ports_by_id_wth_neutron
4756 """port is already deleted."""
4758 f
"floating_ip:{floating_network_vim_id}": True,
4759 f
"volume:{volume_id2}": True,
4760 f
"volume:{volume_id}": None,
4761 f
"port:{port_id}": None,
4763 self
.vimconn
._delete
_vm
_ports
_attached
_to
_network
(created_items
)
4764 mock_delete_ports_by_id_wth_neutron
.assert_not_called()
4765 self
.vimconn
.logger
.error
.assert_not_called()
4767 def test_delete_floating_ip_by_id(self
):
4769 f
"floating_ip:{floating_network_vim_id}": True,
4770 f
"port:{port_id}": True,
4772 expected_created_items
= {
4773 f
"floating_ip:{floating_network_vim_id}": None,
4774 f
"port:{port_id}": True,
4776 k_id
= floating_network_vim_id
4777 k
= f
"floating_ip:{floating_network_vim_id}"
4778 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4779 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4780 self
.assertEqual(created_items
, expected_created_items
)
4782 def test_delete_floating_ip_by_id_floating_ip_already_deleted(self
):
4783 """floating ip is already deleted."""
4785 f
"floating_ip:{floating_network_vim_id}": None,
4786 f
"port:{port_id}": True,
4788 k_id
= floating_network_vim_id
4789 k
= f
"floating_ip:{floating_network_vim_id}"
4790 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4791 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4795 f
"floating_ip:{floating_network_vim_id}": None,
4796 f
"port:{port_id}": True,
4800 def test_delete_floating_ip_by_id_floating_ip_raises_nvexception(self
):
4801 """netron delete floating ip raises nvExceptions.ClientException."""
4803 f
"floating_ip:{floating_network_vim_id}": True,
4804 f
"port:{port_id}": True,
4806 k_id
= floating_network_vim_id
4807 k
= f
"floating_ip:{floating_network_vim_id}"
4808 self
.vimconn
.neutron
.delete_floatingip
.side_effect
= (
4809 nvExceptions
.ClientException("Client exception occurred.")
4811 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4812 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4816 f
"floating_ip:{floating_network_vim_id}": True,
4817 f
"port:{port_id}": True,
4820 self
.vimconn
.logger
.error
.assert_called_once_with(
4821 "Error deleting floating ip: ClientException: Unknown Error (HTTP Client exception occurred.)"
4824 def test_delete_floating_ip_by_id_floating_ip_raises_vimconnexception(self
):
4825 """netron delete floating ip raises VimConnNotFoundException."""
4827 f
"floating_ip:{floating_network_vim_id}": True,
4828 f
"port:{port_id}": True,
4830 k_id
= floating_network_vim_id
4831 k
= f
"floating_ip:{floating_network_vim_id}"
4832 self
.vimconn
.neutron
.delete_floatingip
.side_effect
= VimConnNotFoundException(
4833 "Port id could not found."
4835 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4836 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4840 f
"floating_ip:{floating_network_vim_id}": True,
4841 f
"port:{port_id}": True,
4844 self
.vimconn
.logger
.error
.assert_called_once_with(
4845 "Error deleting floating ip: VimConnNotFoundException: Port id could not found."
4848 def test_delete_floating_ip_by_id_floating_ip_invalid_k_item(self
):
4849 """invalid floating ip item."""
4851 f
"floating_ip:{floating_network_vim_id}": True,
4852 f
"port:{port_id}": True,
4854 expected_created_items
= {
4855 f
"floating_ip:{floating_network_vim_id}::": None,
4856 f
"floating_ip:{floating_network_vim_id}": True,
4857 f
"port:{port_id}": True,
4859 k_id
= floating_network_vim_id
4860 k
= f
"floating_ip:{floating_network_vim_id}::"
4861 self
.vimconn
._delete
_floating
_ip
_by
_id
(k
, k_id
, created_items
)
4862 self
.vimconn
.neutron
.delete_floatingip
.assert_called_once_with(k_id
)
4863 self
.assertEqual(created_items
, expected_created_items
)
4865 def test_delete_volumes_by_id_with_cinder_volume_status_available(self
):
4866 """volume status is available."""
4868 f
"floating_ip:{floating_network_vim_id}": True,
4869 f
"volume:{volume_id2}": True,
4870 f
"volume:{volume_id}": True,
4871 f
"port:{port_id}": None,
4873 expected_created_items
= {
4874 f
"floating_ip:{floating_network_vim_id}": True,
4875 f
"volume:{volume_id2}": True,
4876 f
"volume:{volume_id}": None,
4877 f
"port:{port_id}": None,
4879 volumes_to_hold
= []
4880 k
= f
"volume:{volume_id}"
4882 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
4883 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4884 k
, k_id
, volumes_to_hold
, created_items
4886 self
.assertEqual(result
, None)
4887 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
4888 self
.vimconn
.cinder
.volumes
.delete
.assert_called_once_with(k_id
)
4889 self
.vimconn
.logger
.error
.assert_not_called()
4890 self
.assertEqual(created_items
, expected_created_items
)
4892 def test_delete_volumes_by_id_with_cinder_volume_already_deleted(self
):
4893 """volume is already deleted."""
4895 f
"floating_ip:{floating_network_vim_id}": True,
4896 f
"volume:{volume_id2}": True,
4897 f
"volume:{volume_id}": None,
4898 f
"port:{port_id}": None,
4900 expected_created_items
= {
4901 f
"floating_ip:{floating_network_vim_id}": True,
4902 f
"volume:{volume_id2}": True,
4903 f
"volume:{volume_id}": None,
4904 f
"port:{port_id}": None,
4906 volumes_to_hold
= []
4907 k
= f
"volume:{volume_id}"
4909 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
4910 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4911 k
, k_id
, volumes_to_hold
, created_items
4913 self
.assertEqual(result
, None)
4914 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
4915 self
.vimconn
.cinder
.volumes
.delete
.assert_called_once_with(k_id
)
4916 self
.vimconn
.logger
.error
.assert_not_called()
4917 self
.assertEqual(created_items
, expected_created_items
)
4919 def test_delete_volumes_by_id_with_cinder_get_volume_raise_exception(self
):
4920 """cinder get volume raises exception."""
4922 f
"floating_ip:{floating_network_vim_id}": True,
4923 f
"volume:{volume_id2}": True,
4924 f
"volume:{volume_id}": True,
4925 f
"port:{port_id}": None,
4927 expected_created_items
= {
4928 f
"floating_ip:{floating_network_vim_id}": True,
4929 f
"volume:{volume_id2}": True,
4930 f
"volume:{volume_id}": True,
4931 f
"port:{port_id}": None,
4933 volumes_to_hold
= []
4934 k
= f
"volume:{volume_id}"
4936 self
.vimconn
.cinder
.volumes
.get
.side_effect
= Exception(
4937 "Can not get volume status."
4939 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4940 k
, k_id
, volumes_to_hold
, created_items
4942 self
.assertEqual(result
, None)
4943 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
4944 self
.vimconn
.cinder
.volumes
.delete
.assert_not_called()
4945 self
.vimconn
.logger
.error
.assert_called_once_with(
4946 "Error deleting volume: Exception: Can not get volume status."
4948 self
.assertEqual(created_items
, expected_created_items
)
4950 def test_delete_volumes_by_id_with_cinder_delete_volume_raise_exception(self
):
4951 """cinder delete volume raises exception."""
4953 f
"floating_ip:{floating_network_vim_id}": True,
4954 f
"volume:{volume_id2}": True,
4955 f
"volume:{volume_id}": True,
4956 f
"port:{port_id}": None,
4958 expected_created_items
= {
4959 f
"floating_ip:{floating_network_vim_id}": True,
4960 f
"volume:{volume_id2}": True,
4961 f
"volume:{volume_id}": True,
4962 f
"port:{port_id}": None,
4964 volumes_to_hold
= []
4965 k
= f
"volume:{volume_id}"
4967 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "available"
4968 self
.vimconn
.cinder
.volumes
.delete
.side_effect
= nvExceptions
.ClientException(
4969 "Connection aborted."
4971 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
4972 k
, k_id
, volumes_to_hold
, created_items
4974 self
.assertEqual(result
, None)
4975 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
4976 self
.vimconn
.cinder
.volumes
.delete
.assert_called_once_with(k_id
)
4977 self
.vimconn
.logger
.error
.assert_called_once_with(
4978 "Error deleting volume: ClientException: Unknown Error (HTTP Connection aborted.)"
4980 self
.assertEqual(created_items
, expected_created_items
)
4982 def test_delete_volumes_by_id_with_cinder_volume_to_be_hold(self
):
4983 """volume_to_hold has item."""
4985 f
"floating_ip:{floating_network_vim_id}": True,
4986 f
"volume:{volume_id2}": True,
4987 f
"volume:{volume_id}": True,
4988 f
"port:{port_id}": None,
4990 expected_created_items
= {
4991 f
"floating_ip:{floating_network_vim_id}": True,
4992 f
"volume:{volume_id2}": True,
4993 f
"volume:{volume_id}": True,
4994 f
"port:{port_id}": None,
4996 volumes_to_hold
= [volume_id
]
4997 k
= f
"volume:{volume_id}"
4999 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
5000 k
, k_id
, volumes_to_hold
, created_items
5002 self
.assertEqual(result
, None)
5003 self
.vimconn
.cinder
.volumes
.get
.assert_not_called()
5004 self
.vimconn
.cinder
.volumes
.delete
.assert_not_called()
5005 self
.vimconn
.logger
.error
.assert_not_called()
5006 self
.assertEqual(created_items
, expected_created_items
)
5008 def test_delete_volumes_by_id_with_cinder_volume_status_not_available(self
):
5009 """volume status is not available."""
5011 f
"floating_ip:{floating_network_vim_id}": True,
5012 f
"volume:{volume_id2}": True,
5013 f
"volume:{volume_id}": True,
5014 f
"port:{port_id}": None,
5016 expected_created_items
= {
5017 f
"floating_ip:{floating_network_vim_id}": True,
5018 f
"volume:{volume_id2}": True,
5019 f
"volume:{volume_id}": True,
5020 f
"port:{port_id}": None,
5022 volumes_to_hold
= []
5023 k
= f
"volume:{volume_id}"
5025 self
.vimconn
.cinder
.volumes
.get
.return_value
.status
= "unavailable"
5026 result
= self
.vimconn
._delete
_volumes
_by
_id
_wth
_cinder
(
5027 k
, k_id
, volumes_to_hold
, created_items
5029 self
.assertEqual(result
, True)
5030 self
.vimconn
.cinder
.volumes
.get
.assert_called_once_with(k_id
)
5031 self
.vimconn
.cinder
.volumes
.delete
.assert_not_called()
5032 self
.vimconn
.logger
.error
.assert_not_called()
5033 self
.assertEqual(created_items
, expected_created_items
)
5035 def test_delete_ports_by_id_by_neutron(self
):
5036 """neutron delete ports."""
5038 self
.vimconn
.neutron
.list_ports
.return_value
= {
5039 "ports": [{"id": port_id
}, {"id": port2_id
}]
5042 self
.vimconn
._delete
_ports
_by
_id
_wth
_neutron
(k_id
)
5043 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5044 self
.vimconn
.neutron
.delete_port
.assert_called_once_with(k_id
)
5045 self
.vimconn
.logger
.error
.assert_not_called()
5047 def test_delete_ports_by_id_by_neutron_id_not_in_port_list(self
):
5048 """port id not in the port list."""
5050 self
.vimconn
.neutron
.list_ports
.return_value
= {
5051 "ports": [{"id": port_id
}, {"id": port2_id
}]
5054 self
.vimconn
._delete
_ports
_by
_id
_wth
_neutron
(k_id
)
5055 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5056 self
.vimconn
.neutron
.delete_port
.assert_not_called()
5057 self
.vimconn
.logger
.error
.assert_not_called()
5059 def test_delete_ports_by_id_by_neutron_list_port_raise_exception(self
):
5060 """neutron list port raises exception."""
5062 self
.vimconn
.neutron
.list_ports
.side_effect
= nvExceptions
.ClientException(
5063 "Connection aborted."
5065 self
.vimconn
._delete
_ports
_by
_id
_wth
_neutron
(k_id
)
5066 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5067 self
.vimconn
.neutron
.delete_port
.assert_not_called()
5068 self
.vimconn
.logger
.error
.assert_called_once_with(
5069 "Error deleting port: ClientException: Unknown Error (HTTP Connection aborted.)"
5072 def test_delete_ports_by_id_by_neutron_delete_port_raise_exception(self
):
5073 """neutron delete port raises exception."""
5075 self
.vimconn
.neutron
.list_ports
.return_value
= {
5076 "ports": [{"id": port_id
}, {"id": port2_id
}]
5078 self
.vimconn
.neutron
.delete_port
.side_effect
= nvExceptions
.ClientException(
5079 "Connection aborted."
5081 self
.vimconn
._delete
_ports
_by
_id
_wth
_neutron
(k_id
)
5082 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5083 self
.vimconn
.neutron
.delete_port
.assert_called_once_with(k_id
)
5084 self
.vimconn
.logger
.error
.assert_called_once_with(
5085 "Error deleting port: ClientException: Unknown Error (HTTP Connection aborted.)"
5088 def test_get_item_name_id(self
):
5089 """Get name and id successfully."""
5090 k
= f
"some:{port_id}"
5091 result
= self
.vimconn
._get
_item
_name
_id
(k
)
5092 self
.assertEqual(result
, ("some", f
"{port_id}"))
5094 def test_get_item_name_id_wthout_semicolon(self
):
5095 """Does not have seperator."""
5096 k
= f
"some{port_id}"
5097 result
= self
.vimconn
._get
_item
_name
_id
(k
)
5098 self
.assertEqual(result
, (f
"some{port_id}", ""))
5100 def test_get_item_name_id_empty_string(self
):
5103 result
= self
.vimconn
._get
_item
_name
_id
(k
)
5104 self
.assertEqual(result
, ("", ""))
5106 def test_get_item_name_id_k_is_none(self
):
5109 with self
.assertRaises(AttributeError):
5110 self
.vimconn
._get
_item
_name
_id
(k
)
5112 @patch.object(vimconnector
, "_get_item_name_id")
5113 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5114 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5115 def test_delete_created_items(
5117 mock_delete_floating_ip_by_id
,
5118 mock_delete_volumes_by_id_wth_cinder
,
5119 mock_get_item_name_id
,
5121 """Created items has floating ip and volume."""
5123 f
"floating_ip:{floating_network_vim_id}": True,
5124 f
"volume:{volume_id}": True,
5125 f
"port:{port_id}": None,
5127 mock_get_item_name_id
.side_effect
= [
5128 ("floating_ip", f
"{floating_network_vim_id}"),
5129 ("volume", f
"{volume_id}"),
5131 mock_delete_volumes_by_id_wth_cinder
.return_value
= True
5132 volumes_to_hold
= []
5133 keep_waiting
= False
5134 result
= self
.vimconn
._delete
_created
_items
(
5135 created_items
, volumes_to_hold
, keep_waiting
5137 self
.assertEqual(result
, True)
5138 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5139 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5140 f
"volume:{volume_id}", f
"{volume_id}", [], created_items
5142 mock_delete_floating_ip_by_id
.assert_called_once_with(
5143 f
"floating_ip:{floating_network_vim_id}",
5144 f
"{floating_network_vim_id}",
5147 self
.vimconn
.logger
.error
.assert_not_called()
5149 @patch.object(vimconnector
, "_get_item_name_id")
5150 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5151 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5152 def test_delete_created_items_wth_volumes_to_hold(
5154 mock_delete_floating_ip_by_id
,
5155 mock_delete_volumes_by_id_wth_cinder
,
5156 mock_get_item_name_id
,
5158 """Created items has floating ip and volume and volumes_to_hold has items."""
5160 f
"floating_ip:{floating_network_vim_id}": True,
5161 f
"volume:{volume_id}": True,
5162 f
"port:{port_id}": None,
5164 mock_get_item_name_id
.side_effect
= [
5165 ("floating_ip", f
"{floating_network_vim_id}"),
5166 ("volume", f
"{volume_id}"),
5168 mock_delete_volumes_by_id_wth_cinder
.return_value
= True
5169 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5170 keep_waiting
= False
5171 result
= self
.vimconn
._delete
_created
_items
(
5172 created_items
, volumes_to_hold
, keep_waiting
5174 self
.assertEqual(result
, True)
5175 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5176 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5177 f
"volume:{volume_id}", f
"{volume_id}", volumes_to_hold
, created_items
5179 mock_delete_floating_ip_by_id
.assert_called_once_with(
5180 f
"floating_ip:{floating_network_vim_id}",
5181 f
"{floating_network_vim_id}",
5184 self
.vimconn
.logger
.error
.assert_not_called()
5186 @patch.object(vimconnector
, "_get_item_name_id")
5187 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5188 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5189 def test_delete_created_items_wth_keep_waiting_true(
5191 mock_delete_floating_ip_by_id
,
5192 mock_delete_volumes_by_id_wth_cinder
,
5193 mock_get_item_name_id
,
5195 """Keep waiting initial value is True."""
5197 f
"floating_ip:{floating_network_vim_id}": True,
5198 f
"volume:{volume_id}": True,
5199 f
"port:{port_id}": None,
5201 mock_get_item_name_id
.side_effect
= [
5202 ("floating_ip", f
"{floating_network_vim_id}"),
5203 ("volume", f
"{volume_id}"),
5205 mock_delete_volumes_by_id_wth_cinder
.return_value
= False
5206 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5208 result
= self
.vimconn
._delete
_created
_items
(
5209 created_items
, volumes_to_hold
, keep_waiting
5211 self
.assertEqual(result
, True)
5212 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5213 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5214 f
"volume:{volume_id}", f
"{volume_id}", volumes_to_hold
, created_items
5216 mock_delete_floating_ip_by_id
.assert_called_once_with(
5217 f
"floating_ip:{floating_network_vim_id}",
5218 f
"{floating_network_vim_id}",
5221 self
.vimconn
.logger
.error
.assert_not_called()
5223 @patch.object(vimconnector
, "_get_item_name_id")
5224 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5225 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5226 def test_delete_created_items_delete_vol_raises(
5228 mock_delete_floating_ip_by_id
,
5229 mock_delete_volumes_by_id_wth_cinder
,
5230 mock_get_item_name_id
,
5232 """Delete volume raises exception."""
5234 f
"floating_ip:{floating_network_vim_id}": True,
5235 f
"volume:{volume_id}": True,
5236 f
"port:{port_id}": None,
5238 mock_get_item_name_id
.side_effect
= [
5239 ("floating_ip", f
"{floating_network_vim_id}"),
5240 ("volume", f
"{volume_id}"),
5242 mock_delete_volumes_by_id_wth_cinder
.side_effect
= ConnectionError(
5243 "Connection failed."
5245 volumes_to_hold
= []
5246 keep_waiting
= False
5247 result
= self
.vimconn
._delete
_created
_items
(
5248 created_items
, volumes_to_hold
, keep_waiting
5250 self
.assertEqual(result
, False)
5251 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5252 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5253 f
"volume:{volume_id}", f
"{volume_id}", [], created_items
5255 mock_delete_floating_ip_by_id
.assert_called_once_with(
5256 f
"floating_ip:{floating_network_vim_id}",
5257 f
"{floating_network_vim_id}",
5260 self
.vimconn
.logger
.error
.assert_called_once_with(
5261 "Error deleting volume:ac408b73-b9cc-4a6a-a270-82cc4811bd4a: Connection failed."
5264 @patch.object(vimconnector
, "_get_item_name_id")
5265 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5266 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5267 def test_delete_created_items_delete_fip_raises(
5269 mock_delete_floating_ip_by_id
,
5270 mock_delete_volumes_by_id_wth_cinder
,
5271 mock_get_item_name_id
,
5273 """Delete floating ip raises exception."""
5275 f
"floating_ip:{floating_network_vim_id}": True,
5276 f
"volume:{volume_id}": True,
5277 f
"port:{port_id}": None,
5279 mock_get_item_name_id
.side_effect
= [
5280 ("floating_ip", f
"{floating_network_vim_id}"),
5281 ("volume", f
"{volume_id}"),
5283 mock_delete_volumes_by_id_wth_cinder
.return_value
= False
5284 mock_delete_floating_ip_by_id
.side_effect
= ConnectionError(
5285 "Connection failed."
5287 volumes_to_hold
= []
5289 result
= self
.vimconn
._delete
_created
_items
(
5290 created_items
, volumes_to_hold
, keep_waiting
5292 self
.assertEqual(result
, True)
5293 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5294 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5295 f
"volume:{volume_id}", f
"{volume_id}", [], created_items
5297 mock_delete_floating_ip_by_id
.assert_called_once_with(
5298 f
"floating_ip:{floating_network_vim_id}",
5299 f
"{floating_network_vim_id}",
5302 self
.vimconn
.logger
.error
.assert_called_once_with(
5303 "Error deleting floating_ip:108b73-e9cc-5a6a-t270-82cc4811bd4a: Connection failed."
5306 @patch.object(vimconnector
, "_get_item_name_id")
5307 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5308 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5309 def test_delete_created_items_get_item_name_raises(
5311 mock_delete_floating_ip_by_id
,
5312 mock_delete_volumes_by_id_wth_cinder
,
5313 mock_get_item_name_id
,
5315 """Get item, name raises exception."""
5318 f
"volume{volume_id}": True,
5319 f
"port:{port_id}": None,
5321 mock_get_item_name_id
.side_effect
= [
5322 TypeError("Invalid Type"),
5323 AttributeError("Invalid attribute"),
5325 volumes_to_hold
= []
5326 keep_waiting
= False
5327 result
= self
.vimconn
._delete
_created
_items
(
5328 created_items
, volumes_to_hold
, keep_waiting
5330 self
.assertEqual(result
, False)
5331 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5332 mock_delete_volumes_by_id_wth_cinder
.assert_not_called()
5333 mock_delete_floating_ip_by_id
.assert_not_called()
5334 _call_logger
= self
.vimconn
.logger
.error
.call_args_list
5335 self
.assertEqual(_call_logger
[0][0], ("Error deleting 3: Invalid Type",))
5338 (f
"Error deleting volume{volume_id}: Invalid attribute",),
5341 @patch.object(vimconnector
, "_get_item_name_id")
5342 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5343 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5344 def test_delete_created_items_no_fip_wth_port(
5346 mock_delete_floating_ip_by_id
,
5347 mock_delete_volumes_by_id_wth_cinder
,
5348 mock_get_item_name_id
,
5350 """Created items has port, does not have floating ip."""
5352 f
"volume:{volume_id}": True,
5353 f
"port:{port_id}": True,
5355 mock_get_item_name_id
.side_effect
= [
5356 ("volume", f
"{volume_id}"),
5357 ("port", f
"{port_id}"),
5359 mock_delete_volumes_by_id_wth_cinder
.return_value
= False
5360 volumes_to_hold
= []
5361 keep_waiting
= False
5362 result
= self
.vimconn
._delete
_created
_items
(
5363 created_items
, volumes_to_hold
, keep_waiting
5365 self
.assertEqual(result
, False)
5366 self
.assertEqual(mock_get_item_name_id
.call_count
, 2)
5367 mock_delete_volumes_by_id_wth_cinder
.assert_called_once_with(
5368 f
"volume:{volume_id}", f
"{volume_id}", [], created_items
5370 mock_delete_floating_ip_by_id
.assert_not_called()
5371 self
.vimconn
.logger
.error
.assert_not_called()
5373 @patch.object(vimconnector
, "_get_item_name_id")
5374 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5375 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5376 def test_delete_created_items_no_volume(
5378 mock_delete_floating_ip_by_id
,
5379 mock_delete_volumes_by_id_wth_cinder
,
5380 mock_get_item_name_id
,
5382 """Created items does not have volume."""
5384 f
"floating_ip:{floating_network_vim_id}": True,
5385 f
"port:{port_id}": None,
5387 mock_get_item_name_id
.side_effect
= [
5388 ("floating_ip", f
"{floating_network_vim_id}")
5390 volumes_to_hold
= []
5391 keep_waiting
= False
5392 result
= self
.vimconn
._delete
_created
_items
(
5393 created_items
, volumes_to_hold
, keep_waiting
5395 self
.assertEqual(result
, False)
5396 self
.assertEqual(mock_get_item_name_id
.call_count
, 1)
5397 mock_delete_volumes_by_id_wth_cinder
.assert_not_called()
5398 mock_delete_floating_ip_by_id
.assert_called_once_with(
5399 f
"floating_ip:{floating_network_vim_id}",
5400 f
"{floating_network_vim_id}",
5403 self
.vimconn
.logger
.error
.assert_not_called()
5405 @patch.object(vimconnector
, "_get_item_name_id")
5406 @patch.object(vimconnector
, "_delete_volumes_by_id_wth_cinder")
5407 @patch.object(vimconnector
, "_delete_floating_ip_by_id")
5408 def test_delete_created_items_already_deleted(
5410 mock_delete_floating_ip_by_id
,
5411 mock_delete_volumes_by_id_wth_cinder
,
5412 mock_get_item_name_id
,
5414 """All created items are alerady deleted."""
5416 f
"floating_ip:{floating_network_vim_id}": None,
5417 f
"volume:{volume_id}": None,
5418 f
"port:{port_id}": None,
5420 volumes_to_hold
= []
5421 keep_waiting
= False
5422 result
= self
.vimconn
._delete
_created
_items
(
5423 created_items
, volumes_to_hold
, keep_waiting
5425 self
.assertEqual(result
, False)
5426 mock_get_item_name_id
.assert_not_called()
5427 mock_delete_volumes_by_id_wth_cinder
.assert_not_called()
5428 mock_delete_floating_ip_by_id
.assert_not_called()
5429 self
.vimconn
.logger
.error
.assert_not_called()
5431 @patch("time.sleep")
5432 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5433 @patch.object(vimconnector
, "_format_exception")
5434 @patch.object(vimconnector
, "_reload_connection")
5435 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5436 @patch.object(vimconnector
, "_delete_created_items")
5437 def test_delete_vminstance_successfully(
5439 mock_delete_created_items
,
5440 mock_delete_vm_ports_attached_to_network
,
5441 mock_reload_connection
,
5442 mock_format_exception
,
5443 mock_extract_items_wth_keep_flag_from_created_items
,
5446 vm_id
= f
"{virtual_mac_id}"
5447 created_items
= deepcopy(created_items_all_true
)
5448 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5449 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5450 mock_delete_created_items
.return_value
= False
5451 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5452 mock_reload_connection
.assert_called_once()
5453 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5454 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5455 mock_delete_created_items
.assert_called_once_with(
5456 created_items
, volumes_to_hold
, False
5458 mock_sleep
.assert_not_called()
5459 mock_format_exception
.assert_not_called()
5460 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5464 @patch("time.sleep")
5465 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5466 @patch.object(vimconnector
, "_format_exception")
5467 @patch.object(vimconnector
, "_reload_connection")
5468 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5469 @patch.object(vimconnector
, "_delete_created_items")
5470 def test_delete_vminstance_created_items_has_keep_flag(
5472 mock_delete_created_items
,
5473 mock_delete_vm_ports_attached_to_network
,
5474 mock_reload_connection
,
5475 mock_format_exception
,
5476 mock_extract_items_wth_keep_flag_from_created_items
,
5479 """Created_items includes items which has keep flag."""
5480 vm_id
= f
"{virtual_mac_id}"
5481 initial_created_items
= {
5482 f
"port{port_id}": True,
5483 f
"floating_ip{floating_network_vim_id}": None,
5484 f
"volume{volume_id}keep": True,
5485 f
"volume{volume_id2}keep": True,
5488 f
"port{port_id}": True,
5489 f
"floating_ip{floating_network_vim_id}": None,
5491 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5492 volumes_to_hold
= []
5493 mock_delete_created_items
.return_value
= False
5494 self
.vimconn
.delete_vminstance(vm_id
, initial_created_items
, volumes_to_hold
)
5495 mock_reload_connection
.assert_called_once()
5496 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5497 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5498 mock_delete_created_items
.assert_called_once_with(
5499 created_items
, volumes_to_hold
, False
5501 mock_sleep
.assert_not_called()
5502 mock_format_exception
.assert_not_called()
5503 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5504 initial_created_items
5507 @patch("time.sleep")
5508 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5509 @patch.object(vimconnector
, "_format_exception")
5510 @patch.object(vimconnector
, "_reload_connection")
5511 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5512 @patch.object(vimconnector
, "_delete_created_items")
5513 def test_delete_vminstance_extract_items_wth_keep_raises(
5515 mock_delete_created_items
,
5516 mock_delete_vm_ports_attached_to_network
,
5517 mock_reload_connection
,
5518 mock_format_exception
,
5519 mock_extract_items_wth_keep_flag_from_created_items
,
5522 """extract_items_wth_keep_flag_from_created_items raises AttributeError."""
5523 vm_id
= f
"{virtual_mac_id}"
5524 initial_created_items
= {
5525 f
"port{port_id}": True,
5526 f
"floating_ip{floating_network_vim_id}": None,
5527 f
"volume{volume_id}keep": True,
5528 f
"volume{volume_id2}keep": True,
5531 mock_extract_items_wth_keep_flag_from_created_items
.side_effect
= AttributeError
5532 volumes_to_hold
= []
5533 mock_delete_created_items
.return_value
= False
5534 with self
.assertRaises(AttributeError):
5535 self
.vimconn
.delete_vminstance(
5536 vm_id
, initial_created_items
, volumes_to_hold
5538 mock_reload_connection
.assert_not_called()
5539 mock_delete_vm_ports_attached_to_network
.assert_not_called()
5540 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5541 mock_delete_created_items
.assert_not_called()
5542 mock_sleep
.assert_not_called()
5543 mock_format_exception
.assert_not_called()
5544 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5545 initial_created_items
5548 @patch("time.sleep")
5549 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5550 @patch.object(vimconnector
, "_format_exception")
5551 @patch.object(vimconnector
, "_reload_connection")
5552 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5553 @patch.object(vimconnector
, "_delete_created_items")
5554 def test_delete_vminstance_delete_created_items_raises(
5556 mock_delete_created_items
,
5557 mock_delete_vm_ports_attached_to_network
,
5558 mock_reload_connection
,
5559 mock_format_exception
,
5560 mock_extract_items_wth_keep_flag_from_created_items
,
5563 """Delete creted items raises exception."""
5564 vm_id
= f
"{virtual_mac_id}"
5565 created_items
= deepcopy(created_items_all_true
)
5566 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5567 mock_sleep
= MagicMock()
5568 volumes_to_hold
= []
5569 err
= ConnectionError("ClientException occurred.")
5570 mock_delete_created_items
.side_effect
= err
5571 with self
.assertRaises(ConnectionError
) as err
:
5572 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5573 self
.assertEqual(str(err
), "ClientException occurred.")
5574 mock_reload_connection
.assert_called_once()
5575 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5576 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5577 mock_delete_created_items
.assert_called_once()
5578 mock_sleep
.assert_not_called()
5579 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5583 @patch("time.sleep")
5584 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5585 @patch.object(vimconnector
, "_format_exception")
5586 @patch.object(vimconnector
, "_reload_connection")
5587 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5588 @patch.object(vimconnector
, "_delete_created_items")
5589 def test_delete_vminstance_delete_vm_ports_raises(
5591 mock_delete_created_items
,
5592 mock_delete_vm_ports_attached_to_network
,
5593 mock_reload_connection
,
5594 mock_format_exception
,
5595 mock_extract_items_wth_keep_flag_from_created_items
,
5598 """Delete vm ports raises exception."""
5599 vm_id
= f
"{virtual_mac_id}"
5600 created_items
= deepcopy(created_items_all_true
)
5601 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5602 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5603 err
= ConnectionError("ClientException occurred.")
5604 mock_delete_vm_ports_attached_to_network
.side_effect
= err
5605 mock_delete_created_items
.side_effect
= err
5606 with self
.assertRaises(ConnectionError
) as err
:
5607 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5608 self
.assertEqual(str(err
), "ClientException occurred.")
5609 mock_reload_connection
.assert_called_once()
5610 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5611 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5612 mock_delete_created_items
.assert_not_called()
5613 mock_sleep
.assert_not_called()
5614 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5618 @patch("time.sleep")
5619 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5620 @patch.object(vimconnector
, "_format_exception")
5621 @patch.object(vimconnector
, "_reload_connection")
5622 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5623 @patch.object(vimconnector
, "_delete_created_items")
5624 def test_delete_vminstance_nova_server_delete_raises(
5626 mock_delete_created_items
,
5627 mock_delete_vm_ports_attached_to_network
,
5628 mock_reload_connection
,
5629 mock_format_exception
,
5630 mock_extract_items_wth_keep_flag_from_created_items
,
5633 """Nova server delete raises exception."""
5634 vm_id
= f
"{virtual_mac_id}"
5635 created_items
= deepcopy(created_items_all_true
)
5636 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5637 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5638 err
= VimConnConnectionException("ClientException occurred.")
5639 self
.vimconn
.nova
.servers
.delete
.side_effect
= err
5640 mock_delete_created_items
.side_effect
= err
5641 with self
.assertRaises(VimConnConnectionException
) as err
:
5642 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5643 self
.assertEqual(str(err
), "ClientException occurred.")
5644 mock_reload_connection
.assert_called_once()
5645 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5646 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5647 mock_delete_created_items
.assert_not_called()
5648 mock_sleep
.assert_not_called()
5649 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5653 @patch("time.sleep")
5654 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5655 @patch.object(vimconnector
, "_format_exception")
5656 @patch.object(vimconnector
, "_reload_connection")
5657 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5658 @patch.object(vimconnector
, "_delete_created_items")
5659 def test_delete_vminstance_reload_connection_raises(
5661 mock_delete_created_items
,
5662 mock_delete_vm_ports_attached_to_network
,
5663 mock_reload_connection
,
5664 mock_format_exception
,
5665 mock_extract_items_wth_keep_flag_from_created_items
,
5668 """Reload connection raises exception."""
5669 vm_id
= f
"{virtual_mac_id}"
5670 created_items
= deepcopy(created_items_all_true
)
5671 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5672 mock_sleep
= MagicMock()
5673 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5674 err
= ConnectionError("ClientException occurred.")
5675 mock_delete_created_items
.return_value
= False
5676 mock_reload_connection
.side_effect
= err
5677 with self
.assertRaises(ConnectionError
) as err
:
5678 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5679 self
.assertEqual(str(err
), "ClientException occurred.")
5680 mock_reload_connection
.assert_called_once()
5681 mock_delete_vm_ports_attached_to_network
.assert_not_called()
5682 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5683 mock_delete_created_items
.assert_not_called()
5684 mock_sleep
.assert_not_called()
5685 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5689 @patch("time.sleep")
5690 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5691 @patch.object(vimconnector
, "_format_exception")
5692 @patch.object(vimconnector
, "_reload_connection")
5693 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5694 @patch.object(vimconnector
, "_delete_created_items")
5695 def test_delete_vminstance_created_item_vol_to_hold_are_none(
5697 mock_delete_created_items
,
5698 mock_delete_vm_ports_attached_to_network
,
5699 mock_reload_connection
,
5700 mock_format_exception
,
5701 mock_extract_items_wth_keep_flag_from_created_items
,
5704 """created_items and volumes_to_hold are None."""
5705 vm_id
= f
"{virtual_mac_id}"
5706 created_items
= None
5707 volumes_to_hold
= None
5708 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= {}
5709 mock_delete_created_items
.return_value
= False
5710 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5711 mock_reload_connection
.assert_called_once()
5712 mock_delete_vm_ports_attached_to_network
.assert_not_called()
5713 self
.vimconn
.nova
.servers
.delete
.assert_called_once_with(vm_id
)
5714 mock_delete_created_items
.assert_called_once_with({}, [], False)
5715 mock_sleep
.assert_not_called()
5716 mock_format_exception
.assert_not_called()
5717 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with({})
5719 @patch("time.sleep")
5720 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5721 @patch.object(vimconnector
, "_format_exception")
5722 @patch.object(vimconnector
, "_reload_connection")
5723 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5724 @patch.object(vimconnector
, "_delete_created_items")
5725 def test_delete_vminstance_vm_id_is_none(
5727 mock_delete_created_items
,
5728 mock_delete_vm_ports_attached_to_network
,
5729 mock_reload_connection
,
5730 mock_format_exception
,
5731 mock_extract_items_wth_keep_flag_from_created_items
,
5734 """vm_id is None."""
5736 created_items
= deepcopy(created_items_all_true
)
5737 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5738 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5739 mock_delete_created_items
.side_effect
= [True, True, False]
5740 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5741 mock_reload_connection
.assert_called_once()
5742 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5743 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5744 self
.assertEqual(mock_delete_created_items
.call_count
, 3)
5745 self
.assertEqual(mock_sleep
.call_count
, 2)
5746 mock_format_exception
.assert_not_called()
5747 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5751 @patch("time.sleep")
5752 @patch.object(vimconnector
, "_extract_items_wth_keep_flag_from_created_items")
5753 @patch.object(vimconnector
, "_format_exception")
5754 @patch.object(vimconnector
, "_reload_connection")
5755 @patch.object(vimconnector
, "_delete_vm_ports_attached_to_network")
5756 @patch.object(vimconnector
, "_delete_created_items")
5757 def test_delete_vminstance_delete_created_items_return_true(
5759 mock_delete_created_items
,
5760 mock_delete_vm_ports_attached_to_network
,
5761 mock_reload_connection
,
5762 mock_format_exception
,
5763 mock_extract_items_wth_keep_flag_from_created_items
,
5766 """Delete created items always return True."""
5768 created_items
= deepcopy(created_items_all_true
)
5769 mock_extract_items_wth_keep_flag_from_created_items
.return_value
= created_items
5770 volumes_to_hold
= [f
"{volume_id}", f
"{volume_id2}"]
5771 mock_delete_created_items
.side_effect
= [True] * 1800
5772 self
.vimconn
.delete_vminstance(vm_id
, created_items
, volumes_to_hold
)
5773 mock_reload_connection
.assert_called_once()
5774 mock_delete_vm_ports_attached_to_network
.assert_called_once_with(created_items
)
5775 self
.vimconn
.nova
.servers
.delete
.assert_not_called()
5776 self
.assertEqual(mock_delete_created_items
.call_count
, 1800)
5777 self
.assertEqual(mock_sleep
.call_count
, 1800)
5778 mock_format_exception
.assert_not_called()
5779 mock_extract_items_wth_keep_flag_from_created_items
.assert_called_once_with(
5783 def test_remove_keep_tag_from_persistent_volumes_keep_flag_exists(self
):
5784 """Keep flag exists in created items."""
5786 f
"port:{port_id}": True,
5787 f
"floating_ip:{floating_network_vim_id}": True,
5788 f
"volume:{volume_id}:keep": True,
5789 f
"volume:{volume_id2}:keep": True,
5792 f
"port:{port_id}": True,
5793 f
"floating_ip:{floating_network_vim_id}": True,
5794 f
"volume:{volume_id}": True,
5795 f
"volume:{volume_id2}": True,
5797 result
= self
.vimconn
.remove_keep_tag_from_persistent_volumes(created_items
)
5798 self
.assertDictEqual(result
, expected_result
)
5800 def test_remove_keep_tag_from_persistent_volumes_without_keep_flag(self
):
5801 """Keep flag does not exist in created items."""
5803 f
"port:{port_id}": True,
5804 f
"floating_ip:{floating_network_vim_id}": True,
5805 f
"volume:{volume_id}": True,
5806 f
"volume:{volume_id2}": True,
5808 result
= self
.vimconn
.remove_keep_tag_from_persistent_volumes(created_items
)
5809 self
.assertDictEqual(result
, created_items
)
5811 def test_update_block_device_mapping_empty_volume(self
):
5813 block_device_mapping
= {}
5814 base_disk_index
= 100
5817 with self
.assertRaises(VimConnException
) as err
:
5818 self
.vimconn
.update_block_device_mapping(
5819 volume
, block_device_mapping
, base_disk_index
, disk
, created_items
5821 self
.assertEqual(str(err
), "Volume is empty.")
5822 self
.assertEqual(block_device_mapping
, {})
5823 self
.assertEqual(created_items
, {})
5825 def test_update_block_device_mapping_invalid_volume(self
):
5827 block_device_mapping
= {}
5828 base_disk_index
= 100
5831 with self
.assertRaises(VimConnException
) as err
:
5832 self
.vimconn
.update_block_device_mapping(
5833 volume
, block_device_mapping
, base_disk_index
, disk
, created_items
5836 str(err
), "Created volume is not valid, does not have id attribute."
5838 self
.assertEqual(block_device_mapping
, {})
5839 self
.assertEqual(created_items
, {})
5841 def test_update_block_device_mapping(self
):
5842 volume
= MagicMock(autospec
=True)
5843 volume
.id = volume_id
5844 block_device_mapping
= {}
5845 base_disk_index
= 100
5848 self
.vimconn
.update_block_device_mapping(
5849 volume
, block_device_mapping
, base_disk_index
, disk
, created_items
5852 block_device_mapping
, {"vdd": "ac408b73-b9cc-4a6a-a270-82cc4811bd4a"}
5855 created_items
, {"volume:ac408b73-b9cc-4a6a-a270-82cc4811bd4a": True}
5858 def test_update_block_device_mapping_with_keep_flag(self
):
5859 volume
= MagicMock(autospec
=True)
5860 volume
.id = volume_id
5861 block_device_mapping
= {}
5862 base_disk_index
= 100
5863 disk
= {"size": 10, "keep": True}
5865 self
.vimconn
.update_block_device_mapping(
5866 volume
, block_device_mapping
, base_disk_index
, disk
, created_items
5869 block_device_mapping
, {"vdd": "ac408b73-b9cc-4a6a-a270-82cc4811bd4a"}
5872 created_items
, {"volume:ac408b73-b9cc-4a6a-a270-82cc4811bd4a:keep": True}
5875 def test_extract_items_with_keep_flag_item_has_keep_flag(self
):
5876 created_items
= deepcopy(created_items_all_true
)
5877 created_items
[f
"volume:{volume_id2}:keep"] = True
5878 result
= self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(
5881 self
.assertEqual(result
, deepcopy(created_items_all_true
))
5883 def test_extract_items_with_keep_flag_no_item_wth_keep_flag(self
):
5884 created_items
= deepcopy(created_items_all_true
)
5885 result
= self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(
5888 self
.assertEqual(result
, deepcopy(created_items_all_true
))
5890 def test_extract_items_with_keep_flag_all_items_are_already_deleted(self
):
5892 f
"port:{port_id}": None,
5893 f
"floating_ip:{floating_network_vim_id}": None,
5894 f
"volume:{volume_id}:keep": None,
5895 f
"volume:{volume_id2}:keep": None,
5898 f
"port:{port_id}": None,
5899 f
"floating_ip:{floating_network_vim_id}": None,
5901 result
= self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(
5904 self
.assertEqual(result
, expected_result
)
5906 def test_extract_items_with_keep_flag_without_semicolon(self
):
5908 f
"port{port_id}": True,
5909 f
"floating_ip{floating_network_vim_id}": None,
5910 f
"volume{volume_id}keep": True,
5911 f
"volume{volume_id2}keep": True,
5913 result
= self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(
5916 self
.assertEqual(result
, {})
5918 def test_extract_items_with_keep_flag_invalid_type_created_items(self
):
5919 created_items
= [{f
"port{port_id}": True}, {f
"volume{volume_id2}keep": True}]
5920 with self
.assertRaises(AttributeError):
5921 self
.vimconn
._extract
_items
_wth
_keep
_flag
_from
_created
_items
(created_items
)
5923 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
5924 def test_get_monitoring_data(self
, mock_reload_conection
):
5925 servers
= ["server1", "server2"]
5926 ports
= {"ports": ["port1", "port2"]}
5927 self
.vimconn
.nova
.servers
.list.return_value
= servers
5928 self
.vimconn
.neutron
.list_ports
.return_value
= ports
5929 result
= self
.vimconn
.get_monitoring_data()
5930 self
.assertTupleEqual(result
, (servers
, ports
))
5931 mock_reload_conection
.assert_called_once()
5932 self
.vimconn
.nova
.servers
.list.assert_called_once_with(detailed
=True)
5933 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5935 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
5936 def test_get_monitoring_data_reload_connection_raises(self
, mock_reload_conection
):
5937 mock_reload_conection
.side_effect
= VimConnNotFoundException(
5938 "Connection object not found."
5940 with self
.assertRaises(VimConnException
) as err
:
5941 result
= self
.vimconn
.get_monitoring_data()
5942 self
.assertTupleEqual(result
, None)
5944 str(err
.exception
.args
[0]),
5945 "Exception in monitoring while getting VMs and ports status: Connection object not found.",
5947 mock_reload_conection
.assert_called_once()
5948 check_if_assert_not_called(
5949 [self
.vimconn
.nova
.servers
.list, self
.vimconn
.neutron
.list_ports
]
5952 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
5953 def test_get_monitoring_data_server_list_raises(self
, mock_reload_conection
):
5954 self
.vimconn
.nova
.servers
.list.side_effect
= VimConnConnectionException(
5955 "Can not connect to Cloud API."
5957 with self
.assertRaises(VimConnException
) as err
:
5958 result
= self
.vimconn
.get_monitoring_data()
5959 self
.assertTupleEqual(result
, None)
5961 str(err
.exception
.args
[0]),
5962 "Exception in monitoring while getting VMs and ports status: Can not connect to Cloud API.",
5964 mock_reload_conection
.assert_called_once()
5965 self
.vimconn
.nova
.servers
.list.assert_called_once_with(detailed
=True)
5966 self
.vimconn
.neutron
.list_ports
.assert_not_called()
5968 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
5969 def test_get_monitoring_data_list_ports_raises(self
, mock_reload_conection
):
5970 self
.vimconn
.neutron
.list_ports
.side_effect
= VimConnConnectionException(
5971 "Can not connect to Cloud API."
5973 with self
.assertRaises(VimConnException
) as err
:
5974 result
= self
.vimconn
.get_monitoring_data()
5975 self
.assertTupleEqual(result
, None)
5977 str(err
.exception
.args
[0]),
5978 "Exception in monitoring while getting VMs and ports status: Can not connect to Cloud API.",
5980 mock_reload_conection
.assert_called_once()
5981 self
.vimconn
.nova
.servers
.list.assert_called_once_with(detailed
=True)
5982 self
.vimconn
.neutron
.list_ports
.assert_called_once()
5985 class TestNewFlavor(unittest
.TestCase
):
5986 @patch("logging.getLogger", autospec
=True)
5987 def setUp(self
, mock_logger
):
5988 # We are disabling the logging of exception not to print them to console.
5989 mock_logger
= logging
.getLogger()
5990 mock_logger
.disabled
= True
5991 self
.vimconn
= vimconnector(
6001 self
.vimconn
.nova
= CopyingMock(autospec
=True)
6002 self
.flavor1
= CopyingMock(autospec
=True, name
="sample-flavor")
6003 self
.flavor2
= CopyingMock(autospec
=True, name
="other-flavor")
6004 self
.new_flavor
= CopyingMock(autospec
=True, name
="new_flavor")
6005 self
.new_flavor
.id = "075d2482-5edb-43e3-91b3-234e65b6268a"
6006 self
.vimconn
.nova
.flavors
.create
.return_value
= self
.new_flavor
6008 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6009 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6010 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6013 "process_numa_paired_threads",
6014 new_callable
=CopyingMock(),
6016 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6017 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6018 def test_process_numa_parameters_of_flavor_id_memory_vcpu_in_numa_type_vio(
6020 mock_process_numa_threads
,
6021 mock_process_numa_cores
,
6022 mock_process_numa_paired_threads
,
6023 mock_process_numa_vcpu
,
6024 mock_process_numa_memory
,
6025 mock_process_vio_numa_nodes
,
6027 """Process numa parameters, id, memory, vcpu exist, vim type is VIO,
6028 paired-threads, cores, threads do not exist in numa.
6031 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6032 {"id": 1, "memory": 2, "vcpu": [2]},
6035 expected_extra_specs
= {
6036 "hw:numa_nodes": "2",
6037 "hw:cpu_sockets": "2",
6039 self
.vimconn
.vim_type
= "VIO"
6040 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6042 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6043 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6044 mock_process_vio_numa_nodes
.assert_called_once_with(2, {"hw:numa_nodes": "2"})
6045 _call_mock_process_numa_memory
= mock_process_numa_memory
.call_args_list
6047 _call_mock_process_numa_memory
[0].args
,
6049 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6052 "hw:numa_nodes": "2",
6057 _call_mock_process_numa_memory
[1].args
,
6059 {"id": 1, "memory": 2, "vcpu": [2]},
6062 "hw:cpu_sockets": "2",
6063 "hw:numa_nodes": "2",
6067 _call_mock_process_numa_vcpu
= mock_process_numa_vcpu
.call_args_list
6069 _call_mock_process_numa_vcpu
[0].args
,
6071 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6074 "hw:numa_nodes": "2",
6079 _call_mock_process_numa_vcpu
[1].args
,
6081 {"id": 1, "memory": 2, "vcpu": [2]},
6084 "hw:cpu_sockets": "2",
6085 "hw:numa_nodes": "2",
6089 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6090 check_if_assert_not_called(
6092 mock_process_numa_threads
,
6093 mock_process_numa_cores
,
6094 mock_process_numa_paired_threads
,
6098 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6099 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6100 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6103 "process_numa_paired_threads",
6104 new_callable
=CopyingMock(),
6106 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6107 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6108 def test_process_numa_parameters_of_flavor_id_memory_vcpu_in_numa_type_openstack(
6110 mock_process_numa_threads
,
6111 mock_process_numa_cores
,
6112 mock_process_numa_paired_threads
,
6113 mock_process_numa_vcpu
,
6114 mock_process_numa_memory
,
6115 mock_process_vio_numa_nodes
,
6117 """Process numa parameters, id, memory, vcpu exist, vim type is openstack,
6118 paired-threads, cores, threads do not exist in numa.
6121 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6122 {"id": 1, "memory": 2, "vcpu": [2]},
6125 expected_extra_specs
= {
6126 "hw:numa_nodes": "2",
6127 "hw:cpu_sockets": "2",
6129 self
.vimconn
.vim_type
= "openstack"
6130 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6132 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6133 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6134 _call_mock_process_numa_memory
= mock_process_numa_memory
.call_args_list
6136 _call_mock_process_numa_memory
[0].args
,
6138 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6140 {"hw:numa_nodes": "2"},
6144 _call_mock_process_numa_memory
[1].args
,
6146 {"id": 1, "memory": 2, "vcpu": [2]},
6148 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2"},
6151 _call_mock_process_numa_vcpu
= mock_process_numa_vcpu
.call_args_list
6153 _call_mock_process_numa_vcpu
[0].args
,
6155 {"id": 0, "memory": 1, "vcpu": [1, 3]},
6157 {"hw:numa_nodes": "2"},
6161 _call_mock_process_numa_vcpu
[1].args
,
6163 {"id": 1, "memory": 2, "vcpu": [2]},
6165 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2"},
6168 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6169 check_if_assert_not_called(
6171 mock_process_numa_threads
,
6172 mock_process_numa_cores
,
6173 mock_process_numa_paired_threads
,
6177 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6178 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6179 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6182 "process_numa_paired_threads",
6183 new_callable
=CopyingMock(),
6185 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6186 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6187 def test_process_numa_parameters_of_flavor_id_paired_threads_in_numa_type_openstack_extra_spec_not_empty(
6189 mock_process_numa_threads
,
6190 mock_process_numa_cores
,
6191 mock_process_numa_paired_threads
,
6192 mock_process_numa_vcpu
,
6193 mock_process_numa_memory
,
6194 mock_process_vio_numa_nodes
,
6196 """Process numa parameters, id, paired-threads exist, vim type is openstack.
6197 vcpus calculation according to paired-threads in numa, there is extra_spec.
6199 numas
= [{"id": 0, "paired-threads": 3}, {"id": 1, "paired-threads": 3}]
6200 extra_specs
= {"some-key": "some-value"}
6201 expected_extra_specs
= {
6202 "hw:cpu_sockets": "2",
6203 "hw:cpu_threads": "12",
6204 "hw:numa_nodes": "2",
6205 "some-key": "some-value",
6207 self
.vimconn
.vim_type
= "openstack"
6208 mock_process_numa_paired_threads
.side_effect
= [6, 6]
6209 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6211 check_if_assert_not_called([mock_process_numa_threads
, mock_process_numa_cores
])
6212 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6213 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6214 self
.assertEqual(mock_process_numa_paired_threads
.call_count
, 2)
6215 _call_mock_process_numa_paired_threads
= (
6216 mock_process_numa_paired_threads
.call_args_list
6219 _call_mock_process_numa_paired_threads
[0].args
,
6221 {"id": 0, "paired-threads": 3},
6222 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2", "some-key": "some-value"},
6226 _call_mock_process_numa_paired_threads
[1].args
,
6228 {"id": 1, "paired-threads": 3},
6229 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2", "some-key": "some-value"},
6232 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6234 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6235 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6236 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6239 "process_numa_paired_threads",
6240 new_callable
=CopyingMock(),
6242 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6243 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6244 def test_process_numa_parameters_of_flavor_id_paired_threads_in_numa_type_vio_extra_spec_not_empty(
6246 mock_process_numa_threads
,
6247 mock_process_numa_cores
,
6248 mock_process_numa_paired_threads
,
6249 mock_process_numa_vcpu
,
6250 mock_process_numa_memory
,
6251 mock_process_vio_numa_nodes
,
6253 """Process numa parameters, id, paired-threads exist, vim type is VIO.
6254 vcpus calculation according to paired-threads in numa, there is extra_spec.
6256 numas
= [{"id": 0, "paired-threads": 2}, {"id": 1, "paired-threads": 2}]
6257 extra_specs
= {"some-key": "some-value"}
6258 expected_extra_specs
= {
6259 "hw:numa_nodes": "2",
6260 "hw:cpu_sockets": "2",
6261 "hw:cpu_threads": "8",
6262 "some-key": "some-value",
6264 self
.vimconn
.vim_type
= "VIO"
6265 mock_process_numa_paired_threads
.side_effect
= [4, 4]
6266 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6267 check_if_assert_not_called([mock_process_numa_threads
, mock_process_numa_cores
])
6268 self
.assertEqual(mock_process_numa_paired_threads
.call_count
, 2)
6269 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6270 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6271 _call_mock_process_numa_paired_threads
= (
6272 mock_process_numa_paired_threads
.call_args_list
6274 mock_process_vio_numa_nodes
.assert_called_once_with(
6275 2, {"some-key": "some-value", "hw:numa_nodes": "2"}
6278 _call_mock_process_numa_paired_threads
[0].args
,
6280 {"id": 0, "paired-threads": 2},
6282 "hw:cpu_sockets": "2",
6283 "hw:numa_nodes": "2",
6284 "some-key": "some-value",
6289 _call_mock_process_numa_paired_threads
[1].args
,
6291 {"id": 1, "paired-threads": 2},
6293 "hw:cpu_sockets": "2",
6294 "hw:numa_nodes": "2",
6295 "some-key": "some-value",
6299 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6301 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6302 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6303 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6306 "process_numa_paired_threads",
6307 new_callable
=CopyingMock(),
6309 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6310 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6311 def test_process_numa_parameters_of_flavor_id_cores_in_numa_type_openstack(
6313 mock_process_numa_threads
,
6314 mock_process_numa_cores
,
6315 mock_process_numa_paired_threads
,
6316 mock_process_numa_vcpu
,
6317 mock_process_numa_memory
,
6318 mock_process_vio_numa_nodes
,
6320 """Process numa parameters, id, cores exist, vim type is openstack.
6321 vcpus calculation according to cores in numa.
6323 numas
= [{"id": 0, "cores": 1}, {"id": 1, "cores": 2}]
6325 updated_extra_specs
= {"hw:numa_nodes": "2", "hw:cpu_sockets": "2"}
6326 expected_extra_specs
= {
6327 "hw:numa_nodes": "2",
6328 "hw:cpu_sockets": "2",
6329 "hw:cpu_cores": "3",
6331 self
.vimconn
.vim_type
= "openstack"
6332 mock_process_numa_cores
.side_effect
= [1, 2]
6333 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6335 check_if_assert_not_called(
6336 [mock_process_numa_threads
, mock_process_numa_paired_threads
]
6338 self
.assertEqual(mock_process_numa_cores
.call_count
, 2)
6339 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6340 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6341 _call_mock_process_numa_cores
= mock_process_numa_cores
.call_args_list
6343 _call_mock_process_numa_cores
[0].args
,
6344 ({"id": 0, "cores": 1}, updated_extra_specs
),
6347 _call_mock_process_numa_cores
[1].args
,
6348 ({"id": 1, "cores": 2}, updated_extra_specs
),
6350 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6352 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6353 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6354 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6357 "process_numa_paired_threads",
6358 new_callable
=CopyingMock(),
6360 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6361 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6362 def test_process_numa_parameters_of_flavor_id_cores_in_numa_type_vio(
6364 mock_process_numa_threads
,
6365 mock_process_numa_cores
,
6366 mock_process_numa_paired_threads
,
6367 mock_process_numa_vcpu
,
6368 mock_process_numa_memory
,
6369 mock_process_vio_numa_nodes
,
6371 """Process numa parameters, id, cores exist, vim type is VIO.
6372 vcpus calculation according to cores in numa.
6374 numas
= [{"id": 0, "cores": 1}, {"id": 1, "cores": 2}]
6376 expected_extra_specs
= {
6377 "hw:cpu_cores": "3",
6378 "hw:cpu_sockets": "2",
6379 "hw:numa_nodes": "2",
6381 self
.vimconn
.vim_type
= "VIO"
6382 mock_process_numa_cores
.side_effect
= [1, 2]
6383 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6384 check_if_assert_not_called(
6385 [mock_process_numa_threads
, mock_process_numa_paired_threads
]
6387 self
.assertEqual(mock_process_numa_memory
.call_count
, 2)
6388 self
.assertEqual(mock_process_numa_vcpu
.call_count
, 2)
6389 self
.assertEqual(mock_process_numa_cores
.call_count
, 2)
6390 mock_process_vio_numa_nodes
.assert_called_once_with(2, {"hw:numa_nodes": "2"})
6391 _call_mock_process_numa_cores
= mock_process_numa_cores
.call_args_list
6393 _call_mock_process_numa_cores
[0].args
,
6395 {"id": 0, "cores": 1},
6397 "hw:cpu_sockets": "2",
6398 "hw:numa_nodes": "2",
6403 _call_mock_process_numa_cores
[1].args
,
6405 {"id": 1, "cores": 2},
6407 "hw:cpu_sockets": "2",
6408 "hw:numa_nodes": "2",
6412 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6414 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6415 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6416 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6419 "process_numa_paired_threads",
6420 new_callable
=CopyingMock(),
6422 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6423 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6424 def test_process_numa_parameters_of_flavor_without_numa_id_with_threads_type_vio(
6426 mock_process_numa_threads
,
6427 mock_process_numa_cores
,
6428 mock_process_numa_paired_threads
,
6429 mock_process_numa_vcpu
,
6430 mock_process_numa_memory
,
6431 mock_process_vio_numa_nodes
,
6433 """Process numa parameters, memory, vcpu, thread exist, vim type is VIO,
6434 vcpus calculation according threads in numa, there are not numa ids.
6437 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6438 {"memory": 2, "vcpu": [2]},
6441 expected_extra_specs
= {
6442 "hw:numa_nodes": "2",
6443 "hw:cpu_sockets": "2",
6444 "hw:cpu_threads": "3",
6446 self
.vimconn
.vim_type
= "VIO"
6447 mock_process_numa_threads
.return_value
= 3
6448 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6449 check_if_assert_not_called(
6451 mock_process_numa_memory
,
6452 mock_process_numa_vcpu
,
6453 mock_process_numa_cores
,
6454 mock_process_numa_paired_threads
,
6457 mock_process_vio_numa_nodes
.assert_called_once_with(2, {"hw:numa_nodes": "2"})
6458 self
.assertEqual(mock_process_numa_threads
.call_count
, 1)
6459 _call_mock_process_numa_threads
= mock_process_numa_threads
.call_args_list
6461 _call_mock_process_numa_threads
[0].args
,
6463 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6465 "hw:cpu_sockets": "2",
6466 "hw:numa_nodes": "2",
6470 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6472 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6473 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6474 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6477 "process_numa_paired_threads",
6478 new_callable
=CopyingMock(autospec
=True),
6480 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6481 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6482 def test_process_numa_parameters_of_flavor_without_numa_id_with_threads_type_openstack(
6484 mock_process_numa_threads
,
6485 mock_process_numa_cores
,
6486 mock_process_numa_paired_threads
,
6487 mock_process_numa_vcpu
,
6488 mock_process_numa_memory
,
6489 mock_process_vio_numa_nodes
,
6491 """Process numa parameters, memory, vcpu, thread exist, vim type is openstack,
6492 vcpus calculation according threads in numa, there are not numa ids.
6495 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6496 {"memory": 2, "vcpu": [2]},
6499 expected_extra_specs
= {
6500 "hw:numa_nodes": "2",
6501 "hw:cpu_sockets": "2",
6502 "hw:cpu_threads": "3",
6504 self
.vimconn
.vim_type
= "openstack"
6505 mock_process_numa_threads
.return_value
= 3
6506 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6508 check_if_assert_not_called(
6510 mock_process_numa_memory
,
6511 mock_process_numa_vcpu
,
6512 mock_process_numa_cores
,
6513 mock_process_numa_paired_threads
,
6514 mock_process_vio_numa_nodes
,
6517 self
.assertEqual(mock_process_numa_threads
.call_count
, 1)
6518 _call_mock_process_numa_threads
= mock_process_numa_threads
.call_args_list
6520 _call_mock_process_numa_threads
[0].args
,
6522 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6523 {"hw:cpu_sockets": "2", "hw:numa_nodes": "2"},
6526 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6528 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6529 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6530 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6533 "process_numa_paired_threads",
6534 new_callable
=CopyingMock(),
6536 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6537 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6538 def test_process_numa_parameters_of_flavor_empty_numas_list_type_vio(
6540 mock_process_numa_threads
,
6541 mock_process_numa_cores
,
6542 mock_process_numa_paired_threads
,
6543 mock_process_numa_vcpu
,
6544 mock_process_numa_memory
,
6545 mock_process_vio_numa_nodes
,
6547 """Numa list is empty, vim type is VIO."""
6550 expected_extra_specs
= {"hw:numa_nodes": "0"}
6551 self
.vimconn
.vim_type
= "VIO"
6552 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6553 check_if_assert_not_called(
6555 mock_process_numa_memory
,
6556 mock_process_numa_vcpu
,
6557 mock_process_numa_cores
,
6558 mock_process_numa_paired_threads
,
6559 mock_process_numa_threads
,
6562 mock_process_vio_numa_nodes
.assert_called_once_with(0, {"hw:numa_nodes": "0"})
6563 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6565 @patch.object(vimconnector
, "process_vio_numa_nodes", new_callable
=CopyingMock())
6566 @patch.object(vimconnector
, "process_numa_memory", new_callable
=CopyingMock())
6567 @patch.object(vimconnector
, "process_numa_vcpu", new_callable
=CopyingMock())
6570 "process_numa_paired_threads",
6571 new_callable
=CopyingMock(),
6573 @patch.object(vimconnector
, "process_numa_cores", new_callable
=CopyingMock())
6574 @patch.object(vimconnector
, "process_numa_threads", new_callable
=CopyingMock())
6575 def test_process_numa_parameters_of_flavor_empty_numas_list_type_openstack(
6577 mock_process_numa_threads
,
6578 mock_process_numa_cores
,
6579 mock_process_numa_paired_threads
,
6580 mock_process_numa_vcpu
,
6581 mock_process_numa_memory
,
6582 mock_process_vio_numa_nodes
,
6584 """Numa list is empty, vim type is openstack."""
6587 expected_extra_specs
= {"hw:numa_nodes": "0"}
6588 self
.vimconn
.vim_type
= "openstack"
6589 mock_process_numa_threads
.return_value
= None
6590 self
.vimconn
._process
_numa
_parameters
_of
_flavor
(numas
, extra_specs
)
6592 check_if_assert_not_called(
6594 mock_process_numa_memory
,
6595 mock_process_numa_vcpu
,
6596 mock_process_numa_cores
,
6597 mock_process_numa_paired_threads
,
6598 mock_process_numa_threads
,
6599 mock_process_vio_numa_nodes
,
6602 self
.assertDictEqual(extra_specs
, expected_extra_specs
)
6604 def test_process_numa_memory_empty_extra_spec(self
):
6605 numa
= {"memory": 2, "vcpu": [2]}
6608 expected_extra_spec
= {"hw:numa_mem.2": 2048}
6609 self
.vimconn
.process_numa_memory(numa
, node_id
, extra_specs
)
6610 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6612 def test_process_numa_memory_not_exist(self
):
6613 numa
= {"vcpu": [2]}
6615 extra_specs
= {"vmware:latency_sensitivity_level": "high"}
6616 self
.vimconn
.process_numa_memory(numa
, node_id
, extra_specs
)
6617 self
.assertDictEqual(extra_specs
, {"vmware:latency_sensitivity_level": "high"})
6619 def test_process_numa_memory_node_id_is_none(self
):
6620 numa
= {"memory": 2, "vcpu": [2]}
6623 expected_extra_spec
= {"hw:numa_mem.None": 2048}
6624 self
.vimconn
.process_numa_memory(numa
, node_id
, extra_specs
)
6625 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6627 def test_process_numa_vcpu_empty_extra_spec(self
):
6628 numa
= {"vcpu": [2]}
6631 expected_extra_spec
= {"hw:numa_cpus.0": "2"}
6632 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6633 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6635 def test_process_numa_vcpu_not_exist(self
):
6636 numa
= {"memory": 2}
6638 extra_specs
= {"vmware:latency_sensitivity_level": "high"}
6639 expected_extra_spec
= {"vmware:latency_sensitivity_level": "high"}
6640 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6641 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6643 def test_process_numa_vcpu_empty_node_id(self
):
6644 numa
= {"vcpu": [2]}
6647 expected_extra_spec
= {"hw:numa_cpus.": "2"}
6648 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6649 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6651 def test_process_numa_vcpu_empty_numa_dict(self
):
6655 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6656 self
.assertDictEqual(extra_specs
, {})
6658 def test_process_numa_vcpu_str_node_id(self
):
6659 numa
= {"vcpu": [2]}
6662 expected_extra_spec
= {"hw:numa_cpus.12": "2"}
6663 self
.vimconn
.process_numa_vcpu(numa
, node_id
, extra_specs
)
6664 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6666 def test_process_numa_paired_threads_empty_extra_spec(self
):
6667 numa
= {"id": 0, "paired-threads": 3}
6669 expected_extra_spec
= {
6670 "hw:cpu_thread_policy": "require",
6671 "hw:cpu_policy": "dedicated",
6673 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6674 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6675 self
.assertEqual(result
, 6)
6677 def test_process_numa_paired_threads_empty_numa(self
):
6680 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6681 self
.assertDictEqual(extra_specs
, {})
6682 self
.assertEqual(result
, None)
6684 def test_process_numa_paired_threads_not_exist(self
):
6685 numa
= {"vcpu": [2]}
6687 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6688 self
.assertDictEqual(extra_specs
, {})
6689 self
.assertEqual(result
, None)
6691 def test_process_numa_paired_threads_str_thread_num(self
):
6692 numa
= {"id": 0, "paired-threads": "3"}
6694 expected_extra_spec
= {
6695 "hw:cpu_thread_policy": "require",
6696 "hw:cpu_policy": "dedicated",
6698 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6699 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6700 self
.assertEqual(result
, "33")
6702 def test_process_numa_paired_threads_none_thread_num(self
):
6703 numa
= {"id": 0, "paired-threads": None}
6705 result
= self
.vimconn
.process_numa_paired_threads(numa
, extra_specs
)
6706 self
.assertDictEqual(extra_specs
, {})
6707 self
.assertEqual(result
, None)
6709 def test_process_numa_cores_empty_extra_spec(self
):
6710 numa
= {"id": 0, "cores": 1}
6712 expected_extra_spec
= {
6713 "hw:cpu_policy": "dedicated",
6714 "hw:cpu_thread_policy": "isolate",
6716 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6717 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6718 self
.assertEqual(result
, 1)
6720 def test_process_numa_cores_not_exist(self
):
6721 numa
= {"id": 0, "paired-threads": 3}
6723 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6724 self
.assertDictEqual(extra_specs
, {})
6725 self
.assertEqual(result
, None)
6727 def test_process_numa_cores_empty_numa(self
):
6729 extra_specs
= expected_extra_spec
= {"some-key": "some-val"}
6730 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6731 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6732 self
.assertEqual(result
, None)
6734 def test_process_numa_cores_none_core_num(self
):
6735 numa
= {"memory": 1, "cores": None}
6737 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6738 self
.assertDictEqual(extra_specs
, {})
6739 self
.assertEqual(result
, None)
6741 def test_process_numa_cores_string_core_num(self
):
6742 numa
= {"id": 0, "cores": "1"}
6743 extra_specs
= {"some-key": "some-val"}
6744 expected_extra_spec
= {
6745 "hw:cpu_policy": "dedicated",
6746 "hw:cpu_thread_policy": "isolate",
6747 "some-key": "some-val",
6749 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6750 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6751 self
.assertEqual(result
, "1")
6753 def test_process_numa_cores_float_core_num(self
):
6754 numa
= {"memory": 2, "cores": 10.03}
6755 extra_specs
= {"some-key": "some-val"}
6756 expected_extra_spec
= {
6757 "hw:cpu_policy": "dedicated",
6758 "hw:cpu_thread_policy": "isolate",
6759 "some-key": "some-val",
6761 result
= self
.vimconn
.process_numa_cores(numa
, extra_specs
)
6762 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6763 self
.assertEqual(result
, 10.03)
6765 def test_process_numa_threads_empty_extra_spec_int_thread_num(self
):
6766 numa
= {"memory": 1, "vcpu": [1, 3], "threads": 3}
6768 expected_extra_spec
= {
6769 "hw:cpu_policy": "dedicated",
6770 "hw:cpu_thread_policy": "prefer",
6772 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6773 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6774 self
.assertEqual(result
, 3)
6776 def test_process_numa_threads_empty_numa(self
):
6778 extra_specs
= {"some-key": "some-val"}
6779 expected_extra_spec
= {"some-key": "some-val"}
6780 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6781 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6782 self
.assertEqual(result
, None)
6784 def test_process_numa_threads_not_exist(self
):
6785 numa
= {"memory": 1}
6786 extra_specs
= expected_extra_spec
= {"some-key": "some-val"}
6787 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6788 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6789 self
.assertEqual(result
, None)
6791 def test_process_numa_threads_str_thread_num(self
):
6792 numa
= {"vcpu": [1, 3], "threads": "3"}
6794 expected_extra_spec
= {
6795 "hw:cpu_policy": "dedicated",
6796 "hw:cpu_thread_policy": "prefer",
6798 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6799 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6800 self
.assertEqual(result
, "3")
6802 def test_process_numa_threads_none_thread_num(self
):
6803 numa
= {"vcpu": [1, 3], "threads": None}
6805 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6806 self
.assertDictEqual(extra_specs
, {})
6807 self
.assertEqual(result
, None)
6809 def test_process_numa_threads_float_thread_num(self
):
6810 numa
= {"memory": 1, "vcpu": [1, 3], "threads": 3.3}
6811 extra_specs
= {"some-key": "some-val"}
6812 expected_extra_spec
= {
6813 "hw:cpu_policy": "dedicated",
6814 "hw:cpu_thread_policy": "prefer",
6815 "some-key": "some-val",
6817 result
= self
.vimconn
.process_numa_threads(numa
, extra_specs
)
6818 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
6819 self
.assertEqual(result
, 3.3)
6821 def test_change_the_flavor_name_not_existing_name(self
):
6822 """Flavor name does not exist in Openstack flavor list."""
6823 self
.flavor1
.name
= "sample-flavor-3"
6824 self
.flavor2
.name
= "other-flavor-4"
6825 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6826 name
= "other-flavor-3"
6828 flavor_data
= {"name": "other-flavor"}
6829 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6830 self
.assertEqual(result
, name
)
6831 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6832 # Checking whether name_suffix changed or not.
6833 self
.assertEqual(name_suffix
, 3)
6835 def test_change_the_flavor_name_existing_name(self
):
6836 """Flavor name exists in Openstack flavor list."""
6837 self
.flavor1
.name
= "other-flavor-6"
6838 self
.flavor2
.name
= "other-flavor-3"
6839 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6840 name
= "other-flavor-3"
6842 flavor_data
= {"name": "other-flavor"}
6843 expected_result
= "other-flavor-7"
6844 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6845 self
.assertEqual(result
, expected_result
)
6846 # Checking whether name_suffix changed or not.
6847 self
.assertEqual(name_suffix
, 5)
6848 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6850 def test_change_the_flavor_name_flavor_data_does_not_have_name(self
):
6851 """Flavor data does not have name."""
6852 self
.flavor1
.name
= "other-flavor-6"
6853 self
.flavor2
.name
= "other-flavor-3"
6854 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6855 name
= "other-flavor-3"
6858 with self
.assertRaises(KeyError):
6859 self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6860 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6861 # Checking whether name_suffix changed or not.
6862 self
.assertEqual(name_suffix
, 5)
6864 def test_change_the_flavor_name_invalid_name_suffix(self
):
6865 """Name suffix is invalid."""
6866 self
.flavor1
.name
= "other-flavor-6"
6867 self
.flavor2
.name
= "other-flavor-3"
6868 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6869 name
= "other-flavor-3"
6871 flavor_data
= {"name": "other-flavor"}
6872 with self
.assertRaises(TypeError):
6873 self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6874 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6875 # Checking whether name_suffix changed or not.
6876 self
.assertEqual(name_suffix
, "a")
6878 def test_change_the_flavor_name_given_name_is_empty(self
):
6879 """Given name is empty string."""
6880 self
.flavor1
.name
= "other-flavor-6"
6881 self
.flavor2
.name
= "other-flavor-3"
6882 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6885 flavor_data
= {"name": "other-flavor"}
6886 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6887 self
.assertEqual(result
, "")
6888 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6889 # Checking whether name_suffix increased or not.
6890 self
.assertEqual(name_suffix
, 3)
6892 def test_change_the_flavor_name_given_name_is_none(self
):
6893 """Given name is None."""
6894 self
.flavor1
.name
= "other-flavor-6"
6895 self
.flavor2
.name
= "other-flavor-3"
6896 self
.vimconn
.nova
.flavors
.list.return_value
= [self
.flavor1
, self
.flavor2
]
6899 flavor_data
= {"name": "other-flavor"}
6900 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6901 self
.assertEqual(result
, None)
6902 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6903 # Checking whether name_suffix increased or not.
6904 self
.assertEqual(name_suffix
, 6)
6906 def test_change_the_flavor_name_empty_nova_flavor_list(self
):
6907 """Nova flavor list is empty."""
6908 self
.vimconn
.nova
.flavors
.list.return_value
= []
6909 name
= "other-flavor-3"
6911 flavor_data
= {"name": "other-flavor"}
6912 result
= self
.vimconn
._change
_flavor
_name
(name
, name_suffix
, flavor_data
)
6913 self
.vimconn
.nova
.flavors
.list.assert_called_once()
6914 self
.assertEqual(result
, name
)
6915 # Checking whether name_suffix increased or not.
6916 self
.assertEqual(name_suffix
, 5)
6920 "_process_numa_parameters_of_flavor",
6921 new_callable
=CopyingMock(),
6923 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
6924 def test_process_extended_config_of_flavor_with_numa_cpu_mem_vif_disk_quota(
6925 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
6927 """Process extended config, extended has numas, cpu, mem, vif and disk-io quota."""
6929 {"memory": 1, "vcpu": [1, 3], "threads": 3},
6930 {"memory": 2, "vcpu": [2]},
6934 "cpu-quota": {"limit": 3},
6935 "mem-quota": {"limit": 1},
6936 "vif-quota": {"limit": 10},
6937 "disk-io-quota": {"limit": 50},
6938 "mempage-size": "LARGE",
6941 expected_extra_specs
= {
6942 "hw:mem_page_size": "large",
6944 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
6946 self
.assertEqual(mock_process_resource_quota
.call_count
, 4)
6947 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
6948 self
.assertEqual(extra_specs
, expected_extra_specs
)
6952 "_process_numa_parameters_of_flavor",
6953 new_callable
=CopyingMock(),
6955 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
6956 def test_process_extended_config_of_flavor_with_numa_wrong_disk_quota(
6957 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
6959 """Process extended config, extended has wrong disk quota key."""
6961 {"memory": 1, "threads": 3},
6962 {"memory": 2, "vcpu": [2]},
6966 "disk-quota": {"limit": 50},
6967 "mempage-size": "PREFER_LARGE",
6970 expected_extra_specs
= {
6971 "hw:mem_page_size": "any",
6973 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
6974 mock_process_resource_quota
.assert_not_called()
6975 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
6976 self
.assertEqual(extra_specs
, expected_extra_specs
)
6980 "_process_numa_parameters_of_flavor",
6981 new_callable
=CopyingMock(),
6983 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
6984 def test_process_extended_config_of_flavor_without_numa_cpu_mem_vif_disk_quota(
6985 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
6987 """Process extended config, extended has cpu, mem, vif and disk-io quota but not numas."""
6989 "cpu-quota": {"limit": 3},
6990 "mem-quota": {"limit": 1},
6991 "vif-quota": {"limit": 10},
6992 "disk-io-quota": {"limit": 50},
6993 "mempage-size": "SMALL",
6996 expected_extra_specs
= {
6997 "hw:mem_page_size": "small",
6999 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7000 self
.assertEqual(mock_process_resource_quota
.call_count
, 4)
7001 mock_process_numa_parameters_of_flavor
.assert_not_called()
7002 self
.assertEqual(extra_specs
, expected_extra_specs
)
7006 "_process_numa_parameters_of_flavor",
7007 new_callable
=CopyingMock(),
7009 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7010 def test_process_extended_config_of_flavor_with_numa_with_cpu_pinning_mem_policy(
7011 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7013 """Process extended config, extended has cpu, mem quota, cpu-pinning and mem-policy."""
7016 {"memory": 2, "vcpu": [2]},
7020 "cpu-quota": {"limit": 3},
7021 "mem-quota": {"limit": 1},
7022 "mempage-size": "LARGE",
7023 "cpu-pinning-policy": "DEDICATED",
7024 "mem-policy": "STRICT",
7027 expected_extra_specs
= {
7028 "hw:mem_page_size": "large",
7029 "hw:cpu_policy": "dedicated",
7030 "hw:numa_mempolicy": "strict",
7032 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7033 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7034 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
7035 self
.assertEqual(extra_specs
, expected_extra_specs
)
7039 "_process_numa_parameters_of_flavor",
7040 new_callable
=CopyingMock(),
7042 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7043 def test_process_extended_config_of_flavor_without_numa_with_cpu_pinning_mem_policy(
7044 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7046 """Process extended config, extended has cpu, mem quota, cpu-pinning and mem-policy but not numas."""
7048 "cpu-quota": {"limit": 3},
7049 "mem-quota": {"limit": 1},
7050 "mempage-size": "LARGE",
7051 "cpu-pinning-policy": "DEDICATED",
7052 "mem-policy": "STRICT",
7055 expected_extra_specs
= {
7056 "hw:mem_page_size": "large",
7057 "hw:cpu_policy": "dedicated",
7058 "hw:numa_mempolicy": "strict",
7060 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7061 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7062 mock_process_numa_parameters_of_flavor
.assert_not_called()
7063 self
.assertEqual(extra_specs
, expected_extra_specs
)
7067 "_process_numa_parameters_of_flavor",
7068 new_callable
=CopyingMock(),
7070 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7071 def test_process_extended_config_of_flavor_without_numa_with_wrong_mempage_size(
7072 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7074 """Process extended config, extended has wrong mempage-size without numas."""
7076 "cpu-quota": {"limit": 3},
7077 "mem-quota": {"limit": 1},
7078 "mempage-size": "SIZE_2GB",
7079 "cpu-pinning-policy": "DEDICATED",
7080 "mem-policy": "STRICT",
7084 expected_extra_specs
= {
7085 "hw:cpu_policy": "dedicated",
7086 "hw:numa_mempolicy": "strict",
7088 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7089 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7090 mock_process_numa_parameters_of_flavor
.assert_not_called()
7091 self
.assertEqual(extra_specs
, expected_extra_specs
)
7095 "_process_numa_parameters_of_flavor",
7096 new_callable
=CopyingMock(),
7098 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7099 def test_process_extended_config_of_flavor_with_numa_with_wrong_mempage_size(
7100 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7102 """Process extended config, extended has wrong mempage-size with numas."""
7105 {"memory": 2, "vcpu": [2]},
7109 "cpu-quota": {"limit": 3},
7110 "mem-quota": {"limit": 1},
7111 "mempage-size": "SIZE_2GB",
7112 "cpu-pinning-policy": "DEDICATED",
7113 "mem-policy": "STRICT",
7116 expected_extra_specs
= {
7117 "hw:cpu_policy": "dedicated",
7118 "hw:numa_mempolicy": "strict",
7120 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7121 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7122 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
7123 self
.assertEqual(extra_specs
, expected_extra_specs
)
7127 "_process_numa_parameters_of_flavor",
7128 new_callable
=CopyingMock(),
7130 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7131 def test_process_extended_config_of_flavor_none_vcpus(
7132 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7134 """Process extended config, extended has cpu, mem quota, cpu-pinning and mem-policy, vcpus is None."""
7137 {"memory": 2, "vcpu": [2]},
7141 "cpu-quota": {"limit": 3},
7142 "mem-quota": {"limit": 1},
7143 "mempage-size": "SIZE_2GB",
7144 "cpu-pinning-policy": "DEDICATED",
7145 "mem-policy": "STRICT",
7148 expected_extra_specs
= {
7149 "hw:cpu_policy": "dedicated",
7150 "hw:numa_mempolicy": "strict",
7152 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7153 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7154 mock_process_numa_parameters_of_flavor
.assert_called_once_with(numas
, {})
7155 self
.assertEqual(extra_specs
, expected_extra_specs
)
7159 "_process_numa_parameters_of_flavor",
7160 new_callable
=CopyingMock(),
7162 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7163 def test_process_extended_config_of_flavor_none_vcpus_without_numas(
7164 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7166 """Process extended config, extended has cpu, mem quota, cpu-pinning and mem-policy, vcpus is None."""
7168 "cpu-quota": {"limit": 3},
7169 "mem-quota": {"limit": 1},
7170 "mempage-size": "SIZE_2GB",
7171 "cpu-pinning-policy": "DEDICATED",
7172 "mem-policy": "STRICT",
7174 extra_specs
= {"some-key": "some-val"}
7175 expected_extra_specs
= {
7176 "hw:cpu_policy": "dedicated",
7177 "hw:numa_mempolicy": "strict",
7178 "some-key": "some-val",
7180 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7181 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7182 mock_process_numa_parameters_of_flavor
.assert_not_called()
7183 self
.assertEqual(extra_specs
, expected_extra_specs
)
7187 "_process_numa_parameters_of_flavor",
7188 new_callable
=CopyingMock(),
7190 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7191 def test_process_extended_config_of_flavor_wrong_cpu_pinning_mem_policy_empty_vcpus(
7192 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7194 """Process extended config, extended has wrong cpu-pinning and mem-policy keys."""
7197 {"memory": 2, "vcpu": [2]},
7201 "cpu-quota": {"limit": 3},
7202 "mem-quota": {"limit": 1},
7203 "mempage-size": "SIZE_2GB",
7204 "cpu-pinning-pol": "DEDICATED",
7205 "mem-pol": "STRICT",
7208 expected_extra_specs
= {}
7209 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7210 self
.assertEqual(mock_process_resource_quota
.call_count
, 2)
7211 mock_process_numa_parameters_of_flavor
.assert_called_once_with(
7214 self
.assertEqual(extra_specs
, expected_extra_specs
)
7218 "_process_numa_parameters_of_flavor",
7219 new_callable
=CopyingMock(),
7221 @patch.object(vimconnector
, "process_resource_quota", new_callable
=CopyingMock())
7222 def test_process_extended_config_of_flavor_empty_extended(
7223 self
, mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
7225 """Process extended config, extended is empty."""
7228 self
.vimconn
._process
_extended
_config
_of
_flavor
(extended
, extra_specs
)
7229 check_if_assert_not_called(
7230 [mock_process_resource_quota
, mock_process_numa_parameters_of_flavor
]
7232 self
.assertEqual(extra_specs
, {})
7234 def test_get_flavor_details_empty_flavor_data(self
):
7236 expected_result
= (64, 1, {}, None)
7237 result
= self
.vimconn
._get
_flavor
_details
(flavor_data
)
7238 self
.assertEqual(result
, expected_result
)
7240 def test_get_flavor_details_flavor_data_has_ram_vcpus_extended(self
):
7245 "some-key": "some-val",
7248 expected_result
= (32, 3, {}, {"some-key": "some-val"})
7249 result
= self
.vimconn
._get
_flavor
_details
(flavor_data
)
7250 self
.assertEqual(result
, expected_result
)
7252 def test_get_flavor_details_flavor_data_is_none(self
):
7254 with self
.assertRaises(AttributeError):
7255 self
.vimconn
._get
_flavor
_details
(flavor_data
)
7257 def test_get_flavor_details_flavor_data_has_only_extended(self
):
7260 "some-key": "some-val",
7263 expected_result
= (64, 1, {}, {"some-key": "some-val"})
7264 result
= self
.vimconn
._get
_flavor
_details
(flavor_data
)
7265 self
.assertEqual(result
, expected_result
)
7267 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7270 "_process_extended_config_of_flavor",
7271 new_callable
=CopyingMock(),
7273 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7274 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7275 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7276 def test_new_flavor_with_extended_with_extra_specs(
7278 mock_format_exception
,
7279 mock_reload_connection
,
7280 mock_change_flavor_name
,
7281 mock_extended_config_of_flavor
,
7282 mock_get_flavor_details
,
7284 """Create new flavor with using extended parameters and extra specs."""
7287 mock_change_flavor_name
.return_value
= name1
7288 mock_get_flavor_details
.return_value
= (
7291 {"some-key": "some-value"},
7294 expected_result
= self
.new_flavor
.id
7295 result
= self
.vimconn
.new_flavor(flavor_data
)
7296 self
.assertEqual(result
, expected_result
)
7297 mock_reload_connection
.assert_called_once()
7298 self
.new_flavor
.set_keys
.assert_called_once()
7299 mock_get_flavor_details
.assert_called_once_with(flavor_data
)
7300 mock_change_flavor_name
.assert_called_once_with(name1
, name_suffix
, flavor_data
)
7301 mock_extended_config_of_flavor
.assert_called_once_with(
7302 extended
, {"some-key": "some-value"}
7304 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7305 name
=name1
, ram
=3, vcpus
=8, disk
=50, ephemeral
=0, swap
=0, is_public
=True
7307 mock_format_exception
.assert_not_called()
7309 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7312 "_process_extended_config_of_flavor",
7313 new_callable
=CopyingMock(),
7315 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7316 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7317 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7318 def test_new_flavor_with_extended_without_extra_specs(
7320 mock_format_exception
,
7321 mock_reload_connection
,
7322 mock_change_flavor_name
,
7323 mock_extended_config_of_flavor
,
7324 mock_get_flavor_details
,
7326 """Create new flavor with using extended parameters without extra specs."""
7329 mock_change_flavor_name
.return_value
= name1
7330 mock_get_flavor_details
.return_value
= (3, vcpus
, {}, extended
)
7331 expected_result
= self
.new_flavor
.id
7332 result
= self
.vimconn
.new_flavor(flavor_data
)
7333 self
.assertEqual(result
, expected_result
)
7334 mock_reload_connection
.assert_called_once()
7335 mock_get_flavor_details
.assert_called_once_with(flavor_data
)
7336 mock_change_flavor_name
.assert_called_once_with(name1
, name_suffix
, flavor_data
)
7337 mock_extended_config_of_flavor
.assert_called_once_with(extended
, {})
7338 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7339 name
=name1
, ram
=3, vcpus
=vcpus
, disk
=50, ephemeral
=0, swap
=0, is_public
=True
7341 check_if_assert_not_called([self
.new_flavor
.set_keys
, mock_format_exception
])
7343 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7346 "_process_extended_config_of_flavor",
7347 new_callable
=CopyingMock(),
7349 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7350 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7351 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7352 def test_new_flavor_change_name_if_used_false_with_extended(
7354 mock_format_exception
,
7355 mock_reload_connection
,
7356 mock_change_flavor_name
,
7357 mock_extended_config_of_flavor
,
7358 mock_get_flavor_details
,
7360 """Create new flavor, change_name_if_used_false, there is extended."""
7362 mock_get_flavor_details
.return_value
= (3, vcpus
, {}, extended
)
7363 expected_result
= self
.new_flavor
.id
7364 result
= self
.vimconn
.new_flavor(flavor_data
, False)
7365 self
.assertEqual(result
, expected_result
)
7366 mock_reload_connection
.assert_called_once()
7367 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7368 mock_extended_config_of_flavor
.assert_called_once_with(extended
, {})
7369 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7370 name
=name1
, ram
=3, vcpus
=8, disk
=50, ephemeral
=0, swap
=0, is_public
=True
7372 check_if_assert_not_called(
7373 [mock_change_flavor_name
, mock_format_exception
, self
.new_flavor
.set_keys
]
7376 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7379 "_process_extended_config_of_flavor",
7380 new_callable
=CopyingMock(),
7382 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7383 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7384 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7385 def test_new_flavor_change_name_if_used_true_without_extended(
7387 mock_format_exception
,
7388 mock_reload_connection
,
7389 mock_change_flavor_name
,
7390 mock_extended_config_of_flavor
,
7391 mock_get_flavor_details
,
7393 """Create new flavor without extended parameters."""
7395 mock_change_flavor_name
.return_value
= name1
7396 expected_result
= self
.new_flavor
.id
7397 mock_get_flavor_details
.return_value
= (3, 8, {}, None)
7398 result
= self
.vimconn
.new_flavor(flavor_data2
)
7399 self
.assertEqual(result
, expected_result
)
7400 mock_reload_connection
.assert_called_once()
7401 mock_change_flavor_name
.assert_called_once_with(
7402 name1
, name_suffix
, flavor_data2
7404 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7405 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7406 name
=name1
, ram
=3, vcpus
=8, disk
=50, ephemeral
=0, swap
=0, is_public
=True
7408 check_if_assert_not_called(
7410 self
.new_flavor
.set_keys
,
7411 mock_extended_config_of_flavor
,
7412 mock_format_exception
,
7416 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7419 "_process_extended_config_of_flavor",
7420 new_callable
=CopyingMock(),
7422 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7423 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7424 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7425 def test_new_flavor_reload_connection_exception(
7427 mock_format_exception
,
7428 mock_reload_connection
,
7429 mock_change_flavor_name
,
7430 mock_extended_config_of_flavor
,
7431 mock_get_flavor_details
,
7433 """Create new flavor, reload connection exception occurred."""
7434 error_msg
= "Can not connect to client APIs."
7435 error
= nvExceptions
.ClientException(error_msg
)
7436 mock_change_flavor_name
.return_value
= name1
7437 mock_reload_connection
.side_effect
= error
7438 with self
.assertRaises(Exception) as err
:
7439 self
.vimconn
.new_flavor(flavor_data2
)
7440 self
.assertEqual(str(err
.exception
), "Can not connect to client APIs.")
7441 self
.assertEqual(mock_reload_connection
.call_count
, 1)
7442 call_mock_format_exception
= mock_format_exception
.call_args
7444 str(call_mock_format_exception
[0][0]), str(ClientException(error_msg
))
7446 check_if_assert_not_called(
7448 mock_change_flavor_name
,
7449 mock_get_flavor_details
,
7450 mock_extended_config_of_flavor
,
7451 self
.vimconn
.nova
.flavors
.create
,
7455 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7458 "_process_extended_config_of_flavor",
7459 new_callable
=CopyingMock(autospec
=True),
7461 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7462 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7463 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7464 def test_new_flavor_flavor_data_without_name(
7466 mock_format_exception
,
7467 mock_reload_connection
,
7468 mock_change_flavor_name
,
7469 mock_extended_config_of_flavor
,
7470 mock_get_flavor_details
,
7472 """Create new flavor, flavor data does not have name."""
7479 self
.vimconn
.new_flavor(flavor_data3
)
7480 mock_format_exception
.assert_called_once()
7481 call_mock_format_exception
= mock_format_exception
.call_args
7483 str(call_mock_format_exception
[0][0]), str(KeyError(error_msg
))
7485 check_if_assert_not_called(
7487 mock_reload_connection
,
7488 mock_change_flavor_name
,
7489 mock_get_flavor_details
,
7490 mock_extended_config_of_flavor
,
7491 self
.vimconn
.nova
.flavors
.create
,
7495 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7498 "_process_extended_config_of_flavor",
7499 new_callable
=CopyingMock(),
7501 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7502 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7503 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7504 def test_new_flavor_change_flavor_name_has_extended_conflict_exception_recovered_in_retry(
7506 mock_format_exception
,
7507 mock_reload_connection
,
7508 mock_change_flavor_name
,
7509 mock_extended_config_of_flavor
,
7510 mock_get_flavor_details
,
7512 """Create new flavor, nvExceptions.Conflict occurred and recovered, there is extended config."""
7514 error_msg
= "Conflict has occurred while creating flavor name."
7515 error2
= nvExceptions
.Conflict(error_msg
)
7516 mock_change_flavor_name
.side_effect
= [error2
, "sample-flavor-3"]
7517 expected_result
= self
.new_flavor
.id
7518 mock_get_flavor_details
.return_value
= (3, 8, {}, extended
)
7519 result
= self
.vimconn
.new_flavor(flavor_data2
)
7520 self
.assertEqual(result
, expected_result
)
7521 self
.assertEqual(mock_reload_connection
.call_count
, 2)
7522 mock_change_flavor_name
.assert_called_with(name1
, name_suffix
, flavor_data2
)
7523 self
.assertEqual(mock_change_flavor_name
.call_count
, 2)
7524 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7525 self
.assertEqual(mock_extended_config_of_flavor
.call_count
, 1)
7526 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7527 name
="sample-flavor-3",
7535 check_if_assert_not_called([self
.new_flavor
.set_keys
, mock_format_exception
])
7537 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7540 "_process_extended_config_of_flavor",
7541 new_callable
=CopyingMock(),
7543 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7544 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7545 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7546 def test_new_flavor_change_flavor_name_without_extended_conflict_exception_recovered_in_retry(
7548 mock_format_exception
,
7549 mock_reload_connection
,
7550 mock_change_flavor_name
,
7551 mock_extended_config_of_flavor
,
7552 mock_get_flavor_details
,
7554 """Create new flavor, nvExceptions.Conflict occurred and recovered, there is not extended config."""
7556 error2
= nvExceptions
.Conflict(
7557 "Conflict has occurred while creating flavor name."
7559 mock_change_flavor_name
.side_effect
= [error2
, "sample-flavor-3"]
7560 expected_result
= self
.new_flavor
.id
7561 mock_get_flavor_details
.return_value
= (3, 8, {}, None)
7562 result
= self
.vimconn
.new_flavor(flavor_data2
)
7563 self
.assertEqual(result
, expected_result
)
7564 self
.assertEqual(mock_reload_connection
.call_count
, 2)
7565 mock_change_flavor_name
.assert_called_with(name1
, name_suffix
, flavor_data2
)
7566 self
.assertEqual(mock_change_flavor_name
.call_count
, 2)
7567 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7568 self
.vimconn
.nova
.flavors
.create
.assert_called_once_with(
7569 name
="sample-flavor-3",
7577 check_if_assert_not_called(
7579 self
.new_flavor
.set_keys
,
7580 mock_extended_config_of_flavor
,
7581 mock_format_exception
,
7585 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7588 "_process_extended_config_of_flavor",
7589 new_callable
=CopyingMock(),
7591 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7592 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7593 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7594 def test_new_flavor_change_flavor_name_conflict_exception_change_name_if_used_false(
7596 mock_format_exception
,
7597 mock_reload_connection
,
7598 mock_change_flavor_name
,
7599 mock_extended_config_of_flavor
,
7600 mock_get_flavor_details
,
7602 """Create new flavor, nvExceptions.Conflict occurred,
7603 change_name_if_used is false."""
7604 change_name_if_used
= False
7605 error_msg
= "Conflict has occurred while creating flavor name."
7606 error2
= nvExceptions
.Conflict(error_msg
)
7607 mock_get_flavor_details
.return_value
= (4, 8, {}, None)
7608 self
.vimconn
.nova
.flavors
.create
.side_effect
= error2
7609 with self
.assertRaises(Exception) as err
:
7610 self
.vimconn
.new_flavor(flavor_data2
, change_name_if_used
)
7611 self
.assertEqual(str(err
.exception
), error_msg
)
7612 self
.assertEqual(type(err
.exception
), nvExceptions
.Conflict
)
7613 self
.vimconn
.nova
.flavors
.create
.assert_called_with(
7614 name
="sample-flavor",
7622 self
.assertEqual(mock_get_flavor_details
.call_count
, 3)
7623 self
.assertEqual(self
.vimconn
.nova
.flavors
.create
.call_count
, 3)
7624 self
.assertEqual(mock_reload_connection
.call_count
, 3)
7625 check_if_assert_not_called(
7626 [mock_change_flavor_name
, mock_extended_config_of_flavor
]
7628 _call_mock_format_exception
= mock_format_exception
.call_args
7630 str(_call_mock_format_exception
[0][0]), str(Conflict(error_msg
))
7632 self
.assertEqual(mock_format_exception
.call_count
, 3)
7634 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7637 "_process_extended_config_of_flavor",
7638 new_callable
=CopyingMock(),
7640 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7641 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7642 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7643 def test_new_flavor_client_exception_occurred_change_name_if_used_true(
7645 mock_format_exception
,
7646 mock_reload_connection
,
7647 mock_change_flavor_name
,
7648 mock_extended_config_of_flavor
,
7649 mock_get_flavor_details
,
7651 """Create new flavor, nvExceptions.ClientException occurred,
7652 change_name_if_used is true."""
7653 error_msg
= "Connection failed."
7654 error2
= nvExceptions
.ClientException(error_msg
)
7655 mock_change_flavor_name
.side_effect
= [
7660 mock_get_flavor_details
.return_value
= (3, 8, {}, None)
7661 self
.vimconn
.nova
.flavors
.create
.side_effect
= error2
7662 with self
.assertRaises(Exception) as err
:
7663 self
.vimconn
.new_flavor(flavor_data2
)
7665 str(err
.exception
), "Conflict has occurred while creating flavor name."
7667 self
.assertEqual(type(err
.exception
), nvExceptions
.Conflict
)
7668 self
.assertEqual(self
.vimconn
.nova
.flavors
.create
.call_count
, 1)
7669 _call_mock_nova_create_flavor
= self
.vimconn
.nova
.flavors
.create
.call_args_list
7671 _call_mock_nova_create_flavor
[0][1],
7674 "name": "sample-flavor-3",
7685 self
.assertEqual(mock_reload_connection
.call_count
, 1)
7686 self
.assertEqual(mock_get_flavor_details
.call_count
, 1)
7687 _call_mock_change_flavor
= mock_change_flavor_name
.call_args_list
7689 _call_mock_change_flavor
[0][0],
7693 {"name": "sample-flavor", "ram": 3, "vcpus": 8, "disk": 50},
7696 self
.assertEqual(mock_change_flavor_name
.call_count
, 1)
7697 mock_extended_config_of_flavor
.assert_not_called()
7698 call_mock_format_exception
= mock_format_exception
.call_args
7700 str(call_mock_format_exception
[0][0]), str(ClientException(error_msg
))
7702 self
.assertEqual(mock_format_exception
.call_count
, 1)
7704 @patch.object(vimconnector
, "_get_flavor_details", new_callable
=CopyingMock())
7707 "_process_extended_config_of_flavor",
7708 new_callable
=CopyingMock(),
7710 @patch.object(vimconnector
, "_change_flavor_name", new_callable
=CopyingMock())
7711 @patch.object(vimconnector
, "_reload_connection", new_callable
=CopyingMock())
7712 @patch.object(vimconnector
, "_format_exception", new_callable
=CopyingMock())
7713 def test_new_flavor_change_flavor_name_conflict_exception_occurred_change_name_if_used_true(
7715 mock_format_exception
,
7716 mock_reload_connection
,
7717 mock_change_flavor_name
,
7718 mock_extended_config_of_flavor
,
7719 mock_get_flavor_details
,
7721 """Create new flavor, nvExceptions.Conflict occurred,
7722 change_name_if_used is true."""
7723 error_msg
= "Conflict has occurred while creating flavor name."
7724 error2
= nvExceptions
.Conflict(error_msg
)
7725 mock_change_flavor_name
.side_effect
= [
7730 mock_get_flavor_details
.return_value
= (3, 8, {}, None)
7731 self
.vimconn
.nova
.flavors
.create
.side_effect
= error2
7732 with self
.assertRaises(Exception) as err
:
7733 self
.vimconn
.new_flavor(flavor_data2
)
7734 self
.assertEqual(str(err
.exception
), error_msg
)
7735 self
.assertEqual(type(err
.exception
), nvExceptions
.Conflict
)
7736 self
.assertEqual(self
.vimconn
.nova
.flavors
.create
.call_count
, 3)
7737 _call_mock_nova_create_flavor
= self
.vimconn
.nova
.flavors
.create
.call_args_list
7739 _call_mock_nova_create_flavor
[0][1],
7742 "name": "sample-flavor-3",
7753 _call_mock_nova_create_flavor
[1][1],
7756 "name": "sample-flavor-4",
7767 _call_mock_nova_create_flavor
[2][1],
7770 "name": "sample-flavor-5",
7780 self
.assertEqual(mock_reload_connection
.call_count
, 3)
7781 _call_mock_change_flavor
= mock_change_flavor_name
.call_args_list
7783 _call_mock_change_flavor
[0][0],
7787 {"name": "sample-flavor", "ram": 3, "vcpus": 8, "disk": 50},
7791 _call_mock_change_flavor
[1][0],
7795 {"name": "sample-flavor", "ram": 3, "vcpus": 8, "disk": 50},
7799 _call_mock_change_flavor
[2][0],
7803 {"name": "sample-flavor", "ram": 3, "vcpus": 8, "disk": 50},
7806 self
.assertEqual(mock_change_flavor_name
.call_count
, 3)
7807 mock_extended_config_of_flavor
.assert_not_called()
7808 call_mock_format_exception
= mock_format_exception
.call_args
7810 str(call_mock_format_exception
[0][0]), str(Conflict(error_msg
))
7812 self
.assertEqual(mock_format_exception
.call_count
, 1)
7814 def test_process_process_vio_numa_nodes_without_numa_with_extra_spec(self
):
7816 extra_specs
= {"hw:numa_nodes": "0"}
7817 expected_extra_spec
= {
7818 "vmware:latency_sensitivity_level": "high",
7819 "hw:numa_nodes": "0",
7821 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7822 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
7824 def test_process_process_vio_numa_nodes_list_type_numa_nodes_empty_extra_spec(self
):
7825 numa_nodes
= [7, 9, 4]
7827 expected_extra_spec
= {
7828 "vmware:latency_sensitivity_level": "high",
7830 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7831 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
7833 def test_process_process_vio_numa_nodes_with_numa_with_extra_spec(self
):
7835 extra_specs
= {"hw:numa_nodes": "5"}
7836 expected_extra_spec
= {
7837 "vmware:latency_sensitivity_level": "high",
7838 "hw:numa_nodes": "5",
7840 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7841 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
7843 def test_process_process_vio_numa_nodes_none_numa_nodes(self
):
7845 extra_specs
= {"hw:numa_nodes": "None"}
7846 expected_extra_spec
= {
7847 "vmware:latency_sensitivity_level": "high",
7848 "hw:numa_nodes": "None",
7850 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7851 self
.assertDictEqual(extra_specs
, expected_extra_spec
)
7853 def test_process_process_vio_numa_nodes_invalid_type_extra_specs(self
):
7856 with self
.assertRaises(TypeError):
7857 self
.vimconn
.process_vio_numa_nodes(numa_nodes
, extra_specs
)
7860 if __name__
== "__main__":