1""" 2 :codeauthor: :email:`Alexandru Bleotu <alexandru.bleotu@morganstanley.com>` 3 4 Tests functions in salt.utils.vsan 5""" 6 7 8import logging 9 10from salt.exceptions import ( 11 VMwareApiError, 12 VMwareObjectRetrievalError, 13 VMwareRuntimeError, 14) 15from salt.utils import vsan 16from tests.support.mixins import LoaderModuleMockMixin 17from tests.support.mock import MagicMock, PropertyMock, patch 18from tests.support.unit import TestCase, skipIf 19 20try: 21 from pyVmomi import vim, vmodl # pylint: disable=no-name-in-module 22 23 HAS_PYVMOMI = True 24except ImportError: 25 HAS_PYVMOMI = False 26HAS_PYVSAN = vsan.HAS_PYVSAN 27 28 29log = logging.getLogger(__name__) 30 31 32@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 33@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 34class VsanSupportedTestCase(TestCase): 35 """Tests for salt.utils.vsan.vsan_supported""" 36 37 def test_supported_api_version(self): 38 mock_si = MagicMock(content=MagicMock(about=MagicMock())) 39 type(mock_si.content.about).apiVersion = PropertyMock(return_value="6.0") 40 self.assertTrue(vsan.vsan_supported(mock_si)) 41 42 def test_unsupported_api_version(self): 43 mock_si = MagicMock(content=MagicMock(about=MagicMock())) 44 type(mock_si.content.about).apiVersion = PropertyMock(return_value="5.0") 45 self.assertFalse(vsan.vsan_supported(mock_si)) 46 47 def test_api_version_raises_no_permission(self): 48 exc = vim.fault.NoPermission() 49 exc.privilegeId = "Fake privilege" 50 mock_si = MagicMock(content=MagicMock(about=MagicMock())) 51 type(mock_si.content.about).apiVersion = PropertyMock(side_effect=exc) 52 with self.assertRaises(VMwareApiError) as excinfo: 53 vsan.vsan_supported(mock_si) 54 self.assertEqual( 55 excinfo.exception.strerror, 56 "Not enough permissions. Required privilege: Fake privilege", 57 ) 58 59 def test_api_version_raises_vim_fault(self): 60 exc = vim.fault.VimFault() 61 exc.msg = "VimFault msg" 62 mock_si = MagicMock(content=MagicMock(about=MagicMock())) 63 type(mock_si.content.about).apiVersion = PropertyMock(side_effect=exc) 64 with self.assertRaises(VMwareApiError) as excinfo: 65 vsan.vsan_supported(mock_si) 66 self.assertEqual(excinfo.exception.strerror, "VimFault msg") 67 68 def test_api_version_raises_runtime_fault(self): 69 exc = vmodl.RuntimeFault() 70 exc.msg = "RuntimeFault msg" 71 mock_si = MagicMock(content=MagicMock(about=MagicMock())) 72 type(mock_si.content.about).apiVersion = PropertyMock(side_effect=exc) 73 with self.assertRaises(VMwareRuntimeError) as excinfo: 74 vsan.vsan_supported(mock_si) 75 self.assertEqual(excinfo.exception.strerror, "RuntimeFault msg") 76 77 78@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 79@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 80class GetVsanClusterConfigSystemTestCase(TestCase, LoaderModuleMockMixin): 81 """Tests for salt.utils.vsan.get_vsan_cluster_config_system""" 82 83 def setup_loader_modules(self): 84 return {vsan: {"sys": MagicMock(), "ssl": MagicMock()}} 85 86 def setUp(self): 87 self.mock_si = MagicMock() 88 self.mock_ret = MagicMock() 89 patches = ( 90 ( 91 "salt.utils.vsan.vsanapiutils.GetVsanVcMos", 92 MagicMock(return_value={"vsan-cluster-config-system": self.mock_ret}), 93 ), 94 ) 95 for mod, mock in patches: 96 patcher = patch(mod, mock) 97 patcher.start() 98 self.addCleanup(patcher.stop) 99 100 type(vsan.sys).version_info = PropertyMock(return_value=(2, 7, 9)) 101 self.mock_context = MagicMock() 102 self.mock_create_default_context = MagicMock(return_value=self.mock_context) 103 vsan.ssl.create_default_context = self.mock_create_default_context 104 105 def tearDown(self): 106 for attr in ( 107 "mock_si", 108 "mock_ret", 109 "mock_context", 110 "mock_create_default_context", 111 ): 112 delattr(self, attr) 113 114 def test_ssl_default_context_loaded(self): 115 vsan.get_vsan_cluster_config_system(self.mock_si) 116 self.mock_create_default_context.assert_called_once_with() 117 self.assertFalse(self.mock_context.check_hostname) 118 self.assertEqual(self.mock_context.verify_mode, vsan.ssl.CERT_NONE) 119 120 def test_ssl_default_context_not_loaded(self): 121 type(vsan.sys).version_info = PropertyMock(return_value=(2, 7, 8)) 122 vsan.get_vsan_cluster_config_system(self.mock_si) 123 self.assertEqual(self.mock_create_default_context.call_count, 0) 124 125 def test_GetVsanVcMos_call(self): 126 mock_get_vsan_vc_mos = MagicMock() 127 with patch("salt.utils.vsan.vsanapiutils.GetVsanVcMos", mock_get_vsan_vc_mos): 128 vsan.get_vsan_cluster_config_system(self.mock_si) 129 mock_get_vsan_vc_mos.assert_called_once_with( 130 self.mock_si._stub, context=self.mock_context 131 ) 132 133 def test_return(self): 134 ret = vsan.get_vsan_cluster_config_system(self.mock_si) 135 self.assertEqual(ret, self.mock_ret) 136 137 138@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 139@skipIf(not HAS_PYVSAN, "The 'pyvsan' bindings are missing") 140class GetVsanDiskManagementSystemTestCase(TestCase, LoaderModuleMockMixin): 141 """Tests for salt.utils.vsan.get_vsan_disk_management_system""" 142 143 def setup_loader_modules(self): 144 return {vsan: {"sys": MagicMock(), "ssl": MagicMock()}} 145 146 def setUp(self): 147 self.mock_si = MagicMock() 148 self.mock_ret = MagicMock() 149 patches = ( 150 ( 151 "salt.utils.vsan.vsanapiutils.GetVsanVcMos", 152 MagicMock(return_value={"vsan-disk-management-system": self.mock_ret}), 153 ), 154 ) 155 for mod, mock in patches: 156 patcher = patch(mod, mock) 157 patcher.start() 158 self.addCleanup(patcher.stop) 159 160 type(vsan.sys).version_info = PropertyMock(return_value=(2, 7, 9)) 161 self.mock_context = MagicMock() 162 self.mock_create_default_context = MagicMock(return_value=self.mock_context) 163 vsan.ssl.create_default_context = self.mock_create_default_context 164 165 def tearDown(self): 166 for attr in ( 167 "mock_si", 168 "mock_ret", 169 "mock_context", 170 "mock_create_default_context", 171 ): 172 delattr(self, attr) 173 174 def test_ssl_default_context_loaded(self): 175 vsan.get_vsan_disk_management_system(self.mock_si) 176 self.mock_create_default_context.assert_called_once_with() 177 self.assertFalse(self.mock_context.check_hostname) 178 self.assertEqual(self.mock_context.verify_mode, vsan.ssl.CERT_NONE) 179 180 def test_ssl_default_context_not_loaded(self): 181 type(vsan.sys).version_info = PropertyMock(return_value=(2, 7, 8)) 182 vsan.get_vsan_disk_management_system(self.mock_si) 183 self.assertEqual(self.mock_create_default_context.call_count, 0) 184 185 def test_GetVsanVcMos_call(self): 186 mock_get_vsan_vc_mos = MagicMock() 187 with patch("salt.utils.vsan.vsanapiutils.GetVsanVcMos", mock_get_vsan_vc_mos): 188 vsan.get_vsan_disk_management_system(self.mock_si) 189 mock_get_vsan_vc_mos.assert_called_once_with( 190 self.mock_si._stub, context=self.mock_context 191 ) 192 193 def test_return(self): 194 ret = vsan.get_vsan_disk_management_system(self.mock_si) 195 self.assertEqual(ret, self.mock_ret) 196 197 198@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 199@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 200class GetHostVsanSystemTestCase(TestCase): 201 """Tests for salt.utils.vsan.get_host_vsan_system""" 202 203 def setUp(self): 204 self.mock_host_ref = MagicMock() 205 self.mock_si = MagicMock() 206 self.mock_traversal_spec = MagicMock() 207 self.mock_vsan_system = MagicMock() 208 patches = ( 209 ( 210 "salt.utils.vmware.get_managed_object_name", 211 MagicMock(return_value="fake_hostname"), 212 ), 213 ( 214 "salt.utils.vsan.vmodl.query.PropertyCollector.TraversalSpec", 215 MagicMock(return_value=self.mock_traversal_spec), 216 ), 217 ( 218 "salt.utils.vmware.get_mors_with_properties", 219 MagicMock(return_value=self.mock_traversal_spec), 220 ), 221 ( 222 "salt.utils.vmware.get_mors_with_properties", 223 MagicMock(return_value=[{"object": self.mock_vsan_system}]), 224 ), 225 ) 226 for mod, mock in patches: 227 patcher = patch(mod, mock) 228 patcher.start() 229 self.addCleanup(patcher.stop) 230 231 def test_get_hostname(self): 232 mock_get_managed_object_name = MagicMock(return_value="fake_hostname") 233 with patch( 234 "salt.utils.vmware.get_managed_object_name", mock_get_managed_object_name 235 ): 236 vsan.get_host_vsan_system(self.mock_si, self.mock_host_ref) 237 mock_get_managed_object_name.assert_called_once_with(self.mock_host_ref) 238 239 def test_hostname_argument(self): 240 mock_get_managed_object_name = MagicMock(return_value="fake_hostname") 241 with patch( 242 "salt.utils.vmware.get_managed_object_name", 243 MagicMock(return_value="fake_hostname"), 244 ): 245 vsan.get_host_vsan_system( 246 self.mock_si, self.mock_host_ref, hostname="passedin_hostname" 247 ) 248 self.assertEqual(mock_get_managed_object_name.call_count, 0) 249 250 def test_traversal_spec(self): 251 mock_traversal_spec = MagicMock(return_value=self.mock_traversal_spec) 252 with patch( 253 "salt.utils.vmware.vmodl.query.PropertyCollector.TraversalSpec", 254 mock_traversal_spec, 255 ): 256 257 vsan.get_host_vsan_system(self.mock_si, self.mock_host_ref) 258 mock_traversal_spec.assert_called_once_with( 259 path="configManager.vsanSystem", type=vim.HostSystem, skip=False 260 ) 261 262 def test_get_mors_with_properties(self): 263 mock_get_mors = MagicMock(return_value=[{"object": self.mock_vsan_system}]) 264 with patch("salt.utils.vmware.get_mors_with_properties", mock_get_mors): 265 vsan.get_host_vsan_system(self.mock_si, self.mock_host_ref) 266 mock_get_mors.assert_called_once_with( 267 self.mock_si, 268 vim.HostVsanSystem, 269 property_list=["config.enabled"], 270 container_ref=self.mock_host_ref, 271 traversal_spec=self.mock_traversal_spec, 272 ) 273 274 def test_empty_mors_result(self): 275 mock_get_mors = MagicMock(return_value=None) 276 with patch("salt.utils.vmware.get_mors_with_properties", mock_get_mors): 277 278 with self.assertRaises(VMwareObjectRetrievalError) as excinfo: 279 vsan.get_host_vsan_system(self.mock_si, self.mock_host_ref) 280 self.assertEqual( 281 excinfo.exception.strerror, 282 "Host's 'fake_hostname' VSAN system was not retrieved", 283 ) 284 285 def test_valid_mors_result(self): 286 res = vsan.get_host_vsan_system(self.mock_si, self.mock_host_ref) 287 self.assertEqual(res, self.mock_vsan_system) 288 289 290@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 291@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 292class CreateDiskgroupTestCase(TestCase): 293 """Tests for salt.utils.vsan.create_diskgroup""" 294 295 def setUp(self): 296 self.mock_si = MagicMock() 297 self.mock_task = MagicMock() 298 self.mock_initialise_disk_mapping = MagicMock(return_value=self.mock_task) 299 self.mock_vsan_disk_mgmt_system = MagicMock( 300 InitializeDiskMappings=self.mock_initialise_disk_mapping 301 ) 302 self.mock_host_ref = MagicMock() 303 self.mock_cache_disk = MagicMock() 304 self.mock_cap_disk1 = MagicMock() 305 self.mock_cap_disk2 = MagicMock() 306 self.mock_spec = MagicMock() 307 patches = ( 308 ( 309 "salt.utils.vmware.get_managed_object_name", 310 MagicMock(return_value="fake_hostname"), 311 ), 312 ( 313 "salt.utils.vsan.vim.VimVsanHostDiskMappingCreationSpec", 314 MagicMock(return_value=self.mock_spec), 315 ), 316 ("salt.utils.vsan._wait_for_tasks", MagicMock()), 317 ) 318 for mod, mock in patches: 319 patcher = patch(mod, mock) 320 patcher.start() 321 self.addCleanup(patcher.stop) 322 323 def test_get_hostname(self): 324 mock_get_managed_object_name = MagicMock(return_value="fake_hostname") 325 with patch( 326 "salt.utils.vmware.get_managed_object_name", mock_get_managed_object_name 327 ): 328 vsan.create_diskgroup( 329 self.mock_si, 330 self.mock_vsan_disk_mgmt_system, 331 self.mock_host_ref, 332 self.mock_cache_disk, 333 [self.mock_cap_disk1, self.mock_cap_disk2], 334 ) 335 mock_get_managed_object_name.assert_called_once_with(self.mock_host_ref) 336 337 def test_vsan_spec_all_flash(self): 338 self.mock_cap_disk1.ssd = True 339 vsan.create_diskgroup( 340 self.mock_si, 341 self.mock_vsan_disk_mgmt_system, 342 self.mock_host_ref, 343 self.mock_cache_disk, 344 [self.mock_cap_disk1, self.mock_cap_disk2], 345 ) 346 self.assertEqual( 347 self.mock_spec.capacityDisks, [self.mock_cap_disk1, self.mock_cap_disk2] 348 ) 349 self.assertEqual(self.mock_spec.cacheDisks, [self.mock_cache_disk]) 350 self.assertEqual(self.mock_spec.creationType, "allFlash") 351 self.assertEqual(self.mock_spec.host, self.mock_host_ref) 352 353 def test_vsan_spec_hybrid(self): 354 self.mock_cap_disk1.ssd = False 355 vsan.create_diskgroup( 356 self.mock_si, 357 self.mock_vsan_disk_mgmt_system, 358 self.mock_host_ref, 359 self.mock_cache_disk, 360 [self.mock_cap_disk1, self.mock_cap_disk2], 361 ) 362 self.mock_cap_disk1.ssd = False 363 self.assertEqual(self.mock_spec.creationType, "hybrid") 364 365 def test_initialize_disk_mapping(self): 366 vsan.create_diskgroup( 367 self.mock_si, 368 self.mock_vsan_disk_mgmt_system, 369 self.mock_host_ref, 370 self.mock_cache_disk, 371 [self.mock_cap_disk1, self.mock_cap_disk2], 372 ) 373 self.mock_initialise_disk_mapping.assert_called_once_with(self.mock_spec) 374 375 def test_initialize_disk_mapping_raise_no_permission(self): 376 err = vim.fault.NoPermission() 377 err.privilegeId = "Fake privilege" 378 self.mock_vsan_disk_mgmt_system.InitializeDiskMappings = MagicMock( 379 side_effect=err 380 ) 381 with self.assertRaises(VMwareApiError) as excinfo: 382 vsan.create_diskgroup( 383 self.mock_si, 384 self.mock_vsan_disk_mgmt_system, 385 self.mock_host_ref, 386 self.mock_cache_disk, 387 [self.mock_cap_disk1, self.mock_cap_disk2], 388 ) 389 self.assertEqual( 390 excinfo.exception.strerror, 391 "Not enough permissions. Required privilege: Fake privilege", 392 ) 393 394 def test_initialize_disk_mapping_raise_vim_fault(self): 395 err = vim.fault.VimFault() 396 err.msg = "vim_fault" 397 self.mock_vsan_disk_mgmt_system.InitializeDiskMappings = MagicMock( 398 side_effect=err 399 ) 400 with self.assertRaises(VMwareApiError) as excinfo: 401 vsan.create_diskgroup( 402 self.mock_si, 403 self.mock_vsan_disk_mgmt_system, 404 self.mock_host_ref, 405 self.mock_cache_disk, 406 [self.mock_cap_disk1, self.mock_cap_disk2], 407 ) 408 self.assertEqual(excinfo.exception.strerror, "vim_fault") 409 410 def test_initialize_disk_mapping_raise_method_not_found(self): 411 err = vmodl.fault.MethodNotFound() 412 err.method = "fake_method" 413 self.mock_vsan_disk_mgmt_system.InitializeDiskMappings = MagicMock( 414 side_effect=err 415 ) 416 with self.assertRaises(VMwareRuntimeError) as excinfo: 417 vsan.create_diskgroup( 418 self.mock_si, 419 self.mock_vsan_disk_mgmt_system, 420 self.mock_host_ref, 421 self.mock_cache_disk, 422 [self.mock_cap_disk1, self.mock_cap_disk2], 423 ) 424 self.assertEqual(excinfo.exception.strerror, "Method 'fake_method' not found") 425 426 def test_initialize_disk_mapping_raise_runtime_fault(self): 427 err = vmodl.RuntimeFault() 428 err.msg = "runtime_fault" 429 self.mock_vsan_disk_mgmt_system.InitializeDiskMappings = MagicMock( 430 side_effect=err 431 ) 432 with self.assertRaises(VMwareRuntimeError) as excinfo: 433 vsan.create_diskgroup( 434 self.mock_si, 435 self.mock_vsan_disk_mgmt_system, 436 self.mock_host_ref, 437 self.mock_cache_disk, 438 [self.mock_cap_disk1, self.mock_cap_disk2], 439 ) 440 self.assertEqual(excinfo.exception.strerror, "runtime_fault") 441 442 def test__wait_for_tasks(self): 443 mock___wait_for_tasks = MagicMock() 444 with patch("salt.utils.vsan._wait_for_tasks", mock___wait_for_tasks): 445 vsan.create_diskgroup( 446 self.mock_si, 447 self.mock_vsan_disk_mgmt_system, 448 self.mock_host_ref, 449 self.mock_cache_disk, 450 [self.mock_cap_disk1, self.mock_cap_disk2], 451 ) 452 mock___wait_for_tasks.assert_called_once_with([self.mock_task], self.mock_si) 453 454 def test_result(self): 455 res = vsan.create_diskgroup( 456 self.mock_si, 457 self.mock_vsan_disk_mgmt_system, 458 self.mock_host_ref, 459 self.mock_cache_disk, 460 [self.mock_cap_disk1, self.mock_cap_disk2], 461 ) 462 self.assertTrue(res) 463 464 465@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 466@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 467class AddCapacityToDiskGroupTestCase(TestCase): 468 """Tests for salt.utils.vsan.add_capacity_to_diskgroup""" 469 470 def setUp(self): 471 self.mock_si = MagicMock() 472 self.mock_task = MagicMock() 473 self.mock_initialise_disk_mapping = MagicMock(return_value=self.mock_task) 474 self.mock_vsan_disk_mgmt_system = MagicMock( 475 InitializeDiskMappings=self.mock_initialise_disk_mapping 476 ) 477 self.mock_host_ref = MagicMock() 478 self.mock_cache_disk = MagicMock() 479 self.mock_diskgroup = MagicMock(ssd=self.mock_cache_disk) 480 self.mock_cap_disk1 = MagicMock() 481 self.mock_cap_disk2 = MagicMock() 482 self.mock_spec = MagicMock() 483 patches = ( 484 ( 485 "salt.utils.vmware.get_managed_object_name", 486 MagicMock(return_value="fake_hostname"), 487 ), 488 ( 489 "salt.utils.vsan.vim.VimVsanHostDiskMappingCreationSpec", 490 MagicMock(return_value=self.mock_spec), 491 ), 492 ("salt.utils.vsan._wait_for_tasks", MagicMock()), 493 ) 494 for mod, mock in patches: 495 patcher = patch(mod, mock) 496 patcher.start() 497 self.addCleanup(patcher.stop) 498 499 def test_get_hostname(self): 500 mock_get_managed_object_name = MagicMock(return_value="fake_hostname") 501 with patch( 502 "salt.utils.vmware.get_managed_object_name", mock_get_managed_object_name 503 ): 504 vsan.add_capacity_to_diskgroup( 505 self.mock_si, 506 self.mock_vsan_disk_mgmt_system, 507 self.mock_host_ref, 508 self.mock_diskgroup, 509 [self.mock_cap_disk1, self.mock_cap_disk2], 510 ) 511 mock_get_managed_object_name.assert_called_once_with(self.mock_host_ref) 512 513 def test_vsan_spec_all_flash(self): 514 self.mock_cap_disk1.ssd = True 515 vsan.add_capacity_to_diskgroup( 516 self.mock_si, 517 self.mock_vsan_disk_mgmt_system, 518 self.mock_host_ref, 519 self.mock_diskgroup, 520 [self.mock_cap_disk1, self.mock_cap_disk2], 521 ) 522 self.assertEqual( 523 self.mock_spec.capacityDisks, [self.mock_cap_disk1, self.mock_cap_disk2] 524 ) 525 self.assertEqual(self.mock_spec.cacheDisks, [self.mock_cache_disk]) 526 self.assertEqual(self.mock_spec.creationType, "allFlash") 527 self.assertEqual(self.mock_spec.host, self.mock_host_ref) 528 529 def test_vsan_spec_hybrid(self): 530 self.mock_cap_disk1.ssd = False 531 vsan.add_capacity_to_diskgroup( 532 self.mock_si, 533 self.mock_vsan_disk_mgmt_system, 534 self.mock_host_ref, 535 self.mock_diskgroup, 536 [self.mock_cap_disk1, self.mock_cap_disk2], 537 ) 538 self.mock_cap_disk1.ssd = False 539 self.assertEqual(self.mock_spec.creationType, "hybrid") 540 541 def test_initialize_disk_mapping(self): 542 vsan.add_capacity_to_diskgroup( 543 self.mock_si, 544 self.mock_vsan_disk_mgmt_system, 545 self.mock_host_ref, 546 self.mock_diskgroup, 547 [self.mock_cap_disk1, self.mock_cap_disk2], 548 ) 549 self.mock_initialise_disk_mapping.assert_called_once_with(self.mock_spec) 550 551 def test_initialize_disk_mapping_raise_no_permission(self): 552 err = vim.fault.NoPermission() 553 err.privilegeId = "Fake privilege" 554 self.mock_vsan_disk_mgmt_system.InitializeDiskMappings = MagicMock( 555 side_effect=err 556 ) 557 with self.assertRaises(VMwareApiError) as excinfo: 558 vsan.add_capacity_to_diskgroup( 559 self.mock_si, 560 self.mock_vsan_disk_mgmt_system, 561 self.mock_host_ref, 562 self.mock_diskgroup, 563 [self.mock_cap_disk1, self.mock_cap_disk2], 564 ) 565 self.assertEqual( 566 excinfo.exception.strerror, 567 "Not enough permissions. Required privilege: Fake privilege", 568 ) 569 570 def test_initialize_disk_mapping_raise_vim_fault(self): 571 err = vim.fault.VimFault() 572 err.msg = "vim_fault" 573 self.mock_vsan_disk_mgmt_system.InitializeDiskMappings = MagicMock( 574 side_effect=err 575 ) 576 with self.assertRaises(VMwareApiError) as excinfo: 577 vsan.add_capacity_to_diskgroup( 578 self.mock_si, 579 self.mock_vsan_disk_mgmt_system, 580 self.mock_host_ref, 581 self.mock_diskgroup, 582 [self.mock_cap_disk1, self.mock_cap_disk2], 583 ) 584 self.assertEqual(excinfo.exception.strerror, "vim_fault") 585 586 def test_initialize_disk_mapping_raise_method_not_found(self): 587 err = vmodl.fault.MethodNotFound() 588 err.method = "fake_method" 589 self.mock_vsan_disk_mgmt_system.InitializeDiskMappings = MagicMock( 590 side_effect=err 591 ) 592 with self.assertRaises(VMwareRuntimeError) as excinfo: 593 vsan.add_capacity_to_diskgroup( 594 self.mock_si, 595 self.mock_vsan_disk_mgmt_system, 596 self.mock_host_ref, 597 self.mock_diskgroup, 598 [self.mock_cap_disk1, self.mock_cap_disk2], 599 ) 600 self.assertEqual(excinfo.exception.strerror, "Method 'fake_method' not found") 601 602 def test_initialize_disk_mapping_raise_runtime_fault(self): 603 err = vmodl.RuntimeFault() 604 err.msg = "runtime_fault" 605 self.mock_vsan_disk_mgmt_system.InitializeDiskMappings = MagicMock( 606 side_effect=err 607 ) 608 with self.assertRaises(VMwareRuntimeError) as excinfo: 609 vsan.add_capacity_to_diskgroup( 610 self.mock_si, 611 self.mock_vsan_disk_mgmt_system, 612 self.mock_host_ref, 613 self.mock_diskgroup, 614 [self.mock_cap_disk1, self.mock_cap_disk2], 615 ) 616 self.assertEqual(excinfo.exception.strerror, "runtime_fault") 617 618 def test__wait_for_tasks(self): 619 mock___wait_for_tasks = MagicMock() 620 with patch("salt.utils.vsan._wait_for_tasks", mock___wait_for_tasks): 621 vsan.add_capacity_to_diskgroup( 622 self.mock_si, 623 self.mock_vsan_disk_mgmt_system, 624 self.mock_host_ref, 625 self.mock_diskgroup, 626 [self.mock_cap_disk1, self.mock_cap_disk2], 627 ) 628 mock___wait_for_tasks.assert_called_once_with([self.mock_task], self.mock_si) 629 630 def test_result(self): 631 res = vsan.add_capacity_to_diskgroup( 632 self.mock_si, 633 self.mock_vsan_disk_mgmt_system, 634 self.mock_host_ref, 635 self.mock_diskgroup, 636 [self.mock_cap_disk1, self.mock_cap_disk2], 637 ) 638 self.assertTrue(res) 639 640 641@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 642@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 643class RemoveCapacityFromDiskGroup(TestCase): 644 """Tests for salt.utils.vsan.remove_capacity_from_diskgroup""" 645 646 def setUp(self): 647 self.mock_si = MagicMock() 648 self.mock_task = MagicMock() 649 self.mock_remove_disk = MagicMock(return_value=self.mock_task) 650 self.mock_host_vsan_system = MagicMock(RemoveDisk_Task=self.mock_remove_disk) 651 self.mock_host_ref = MagicMock() 652 self.mock_cache_disk = MagicMock() 653 self.mock_diskgroup = MagicMock(ssd=self.mock_cache_disk) 654 self.mock_cap_disk1 = MagicMock() 655 self.mock_cap_disk2 = MagicMock() 656 self.mock_spec = MagicMock() 657 patches = ( 658 ( 659 "salt.utils.vmware.get_managed_object_name", 660 MagicMock(return_value="fake_hostname"), 661 ), 662 ( 663 "salt.utils.vsan.get_host_vsan_system", 664 MagicMock(return_value=self.mock_host_vsan_system), 665 ), 666 ( 667 "salt.utils.vsan.vim.HostMaintenanceSpec", 668 MagicMock(return_value=self.mock_spec), 669 ), 670 ("salt.utils.vsan.vim.VsanHostDecommissionMode", MagicMock()), 671 ("salt.utils.vmware.wait_for_task", MagicMock()), 672 ) 673 for mod, mock in patches: 674 patcher = patch(mod, mock) 675 patcher.start() 676 self.addCleanup(patcher.stop) 677 678 def test_get_hostname(self): 679 mock_get_managed_object_name = MagicMock(return_value="fake_hostname") 680 with patch( 681 "salt.utils.vmware.get_managed_object_name", mock_get_managed_object_name 682 ): 683 vsan.remove_capacity_from_diskgroup( 684 self.mock_si, 685 self.mock_host_ref, 686 self.mock_diskgroup, 687 [self.mock_cap_disk1, self.mock_cap_disk2], 688 ) 689 mock_get_managed_object_name.assert_called_once_with(self.mock_host_ref) 690 691 def test_maintenance_mode_evacuate_all_data(self): 692 vsan.remove_capacity_from_diskgroup( 693 self.mock_si, 694 self.mock_host_ref, 695 self.mock_diskgroup, 696 [self.mock_cap_disk1, self.mock_cap_disk2], 697 ) 698 self.assertEqual( 699 self.mock_spec.vsanMode.objectAction, 700 vim.VsanHostDecommissionModeObjectAction.evacuateAllData, 701 ) 702 703 def test_maintenance_mode_no_action(self): 704 vsan.remove_capacity_from_diskgroup( 705 self.mock_si, 706 self.mock_host_ref, 707 self.mock_diskgroup, 708 [self.mock_cap_disk1, self.mock_cap_disk2], 709 data_evacuation=False, 710 ) 711 self.assertEqual( 712 self.mock_spec.vsanMode.objectAction, 713 vim.VsanHostDecommissionModeObjectAction.noAction, 714 ) 715 716 def test_remove_disk(self): 717 vsan.remove_capacity_from_diskgroup( 718 self.mock_si, 719 self.mock_host_ref, 720 self.mock_diskgroup, 721 [self.mock_cap_disk1, self.mock_cap_disk2], 722 ) 723 self.mock_remove_disk.assert_called_once_with( 724 disk=[self.mock_cap_disk1, self.mock_cap_disk2], 725 maintenanceSpec=self.mock_spec, 726 ) 727 728 def test_remove_disk_raise_no_permission(self): 729 err = vim.fault.NoPermission() 730 err.privilegeId = "Fake privilege" 731 self.mock_host_vsan_system.RemoveDisk_Task = MagicMock(side_effect=err) 732 with self.assertRaises(VMwareApiError) as excinfo: 733 vsan.remove_capacity_from_diskgroup( 734 self.mock_si, 735 self.mock_host_ref, 736 self.mock_diskgroup, 737 [self.mock_cap_disk1, self.mock_cap_disk2], 738 ) 739 self.assertEqual( 740 excinfo.exception.strerror, 741 "Not enough permissions. Required privilege: Fake privilege", 742 ) 743 744 def test_remove_disk_raise_vim_fault(self): 745 err = vim.fault.VimFault() 746 err.msg = "vim_fault" 747 self.mock_host_vsan_system.RemoveDisk_Task = MagicMock(side_effect=err) 748 with self.assertRaises(VMwareApiError) as excinfo: 749 vsan.remove_capacity_from_diskgroup( 750 self.mock_si, 751 self.mock_host_ref, 752 self.mock_diskgroup, 753 [self.mock_cap_disk1, self.mock_cap_disk2], 754 ) 755 self.assertEqual(excinfo.exception.strerror, "vim_fault") 756 757 def test_remove_disk_raise_runtime_fault(self): 758 err = vmodl.RuntimeFault() 759 err.msg = "runtime_fault" 760 self.mock_host_vsan_system.RemoveDisk_Task = MagicMock(side_effect=err) 761 with self.assertRaises(VMwareRuntimeError) as excinfo: 762 vsan.remove_capacity_from_diskgroup( 763 self.mock_si, 764 self.mock_host_ref, 765 self.mock_diskgroup, 766 [self.mock_cap_disk1, self.mock_cap_disk2], 767 ) 768 self.assertEqual(excinfo.exception.strerror, "runtime_fault") 769 770 def test_wait_for_tasks(self): 771 mock_wait_for_task = MagicMock() 772 with patch("salt.utils.vmware.wait_for_task", mock_wait_for_task): 773 vsan.remove_capacity_from_diskgroup( 774 self.mock_si, 775 self.mock_host_ref, 776 self.mock_diskgroup, 777 [self.mock_cap_disk1, self.mock_cap_disk2], 778 ) 779 mock_wait_for_task.assert_called_once_with( 780 self.mock_task, "fake_hostname", "remove_capacity" 781 ) 782 783 def test_result(self): 784 res = vsan.remove_capacity_from_diskgroup( 785 self.mock_si, 786 self.mock_host_ref, 787 self.mock_diskgroup, 788 [self.mock_cap_disk1, self.mock_cap_disk2], 789 ) 790 self.assertTrue(res) 791 792 793@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 794@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 795class RemoveDiskgroup(TestCase): 796 """Tests for salt.utils.vsan.remove_diskgroup""" 797 798 def setUp(self): 799 self.mock_si = MagicMock() 800 self.mock_task = MagicMock() 801 self.mock_remove_disk_mapping = MagicMock(return_value=self.mock_task) 802 self.mock_host_vsan_system = MagicMock( 803 RemoveDiskMapping_Task=self.mock_remove_disk_mapping 804 ) 805 self.mock_host_ref = MagicMock() 806 self.mock_cache_disk = MagicMock() 807 self.mock_diskgroup = MagicMock(ssd=self.mock_cache_disk) 808 self.mock_cap_disk1 = MagicMock() 809 self.mock_cap_disk2 = MagicMock() 810 self.mock_spec = MagicMock() 811 patches = ( 812 ( 813 "salt.utils.vmware.get_managed_object_name", 814 MagicMock(return_value="fake_hostname"), 815 ), 816 ( 817 "salt.utils.vsan.get_host_vsan_system", 818 MagicMock(return_value=self.mock_host_vsan_system), 819 ), 820 ( 821 "salt.utils.vsan.vim.HostMaintenanceSpec", 822 MagicMock(return_value=self.mock_spec), 823 ), 824 ("salt.utils.vsan.vim.VsanHostDecommissionMode", MagicMock()), 825 ("salt.utils.vmware.wait_for_task", MagicMock()), 826 ) 827 for mod, mock in patches: 828 patcher = patch(mod, mock) 829 patcher.start() 830 self.addCleanup(patcher.stop) 831 832 def test_get_hostname(self): 833 mock_get_managed_object_name = MagicMock(return_value="fake_hostname") 834 with patch( 835 "salt.utils.vmware.get_managed_object_name", mock_get_managed_object_name 836 ): 837 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 838 mock_get_managed_object_name.assert_called_once_with(self.mock_host_ref) 839 840 def test_maintenance_mode_evacuate_all_data(self): 841 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 842 vsan.remove_capacity_from_diskgroup( 843 self.mock_si, 844 self.mock_host_ref, 845 self.mock_diskgroup, 846 [self.mock_cap_disk1, self.mock_cap_disk2], 847 ) 848 self.assertEqual( 849 self.mock_spec.vsanMode.objectAction, 850 vim.VsanHostDecommissionModeObjectAction.evacuateAllData, 851 ) 852 853 def test_maintenance_mode_no_action(self): 854 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 855 vsan.remove_capacity_from_diskgroup( 856 self.mock_si, 857 self.mock_host_ref, 858 self.mock_diskgroup, 859 [self.mock_cap_disk1, self.mock_cap_disk2], 860 data_evacuation=False, 861 ) 862 self.assertEqual( 863 self.mock_spec.vsanMode.objectAction, 864 vim.VsanHostDecommissionModeObjectAction.noAction, 865 ) 866 867 def test_remove_disk_mapping(self): 868 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 869 vsan.remove_capacity_from_diskgroup( 870 self.mock_si, 871 self.mock_host_ref, 872 self.mock_diskgroup, 873 [self.mock_cap_disk1, self.mock_cap_disk2], 874 ) 875 self.mock_remove_disk_mapping.assert_called_once_with( 876 mapping=[self.mock_diskgroup], maintenanceSpec=self.mock_spec 877 ) 878 879 def test_remove_disk_mapping_raise_no_permission(self): 880 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 881 err = vim.fault.NoPermission() 882 err.privilegeId = "Fake privilege" 883 self.mock_host_vsan_system.RemoveDiskMapping_Task = MagicMock(side_effect=err) 884 with self.assertRaises(VMwareApiError) as excinfo: 885 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 886 self.assertEqual( 887 excinfo.exception.strerror, 888 "Not enough permissions. Required privilege: Fake privilege", 889 ) 890 891 def test_remove_disk_mapping_raise_vim_fault(self): 892 err = vim.fault.VimFault() 893 err.msg = "vim_fault" 894 self.mock_host_vsan_system.RemoveDiskMapping_Task = MagicMock(side_effect=err) 895 with self.assertRaises(VMwareApiError) as excinfo: 896 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 897 self.assertEqual(excinfo.exception.strerror, "vim_fault") 898 899 def test_remove_disk_mapping_raise_runtime_fault(self): 900 err = vmodl.RuntimeFault() 901 err.msg = "runtime_fault" 902 self.mock_host_vsan_system.RemoveDiskMapping_Task = MagicMock(side_effect=err) 903 with self.assertRaises(VMwareRuntimeError) as excinfo: 904 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 905 self.assertEqual(excinfo.exception.strerror, "runtime_fault") 906 907 def test_wait_for_tasks(self): 908 mock_wait_for_task = MagicMock() 909 with patch("salt.utils.vmware.wait_for_task", mock_wait_for_task): 910 vsan.remove_diskgroup(self.mock_si, self.mock_host_ref, self.mock_diskgroup) 911 mock_wait_for_task.assert_called_once_with( 912 self.mock_task, "fake_hostname", "remove_diskgroup" 913 ) 914 915 def test_result(self): 916 res = vsan.remove_diskgroup( 917 self.mock_si, self.mock_host_ref, self.mock_diskgroup 918 ) 919 self.assertTrue(res) 920 921 922@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 923@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 924class GetClusterVsanInfoTestCase(TestCase, LoaderModuleMockMixin): 925 """Tests for salt.utils.vsan.get_cluster_vsan_info""" 926 927 def setup_loader_modules(self): 928 return {vsan: {}} 929 930 def setUp(self): 931 self.mock_cl_ref = MagicMock() 932 self.mock_si = MagicMock() 933 patches = ( 934 ("salt.utils.vmware.get_managed_object_name", MagicMock()), 935 ( 936 "salt.utils.vmware.get_service_instance_from_managed_object", 937 MagicMock(return_value=self.mock_si), 938 ), 939 ("salt.utils.vsan.get_vsan_cluster_config_system", MagicMock()), 940 ) 941 for mod, mock in patches: 942 patcher = patch(mod, mock) 943 patcher.start() 944 self.addCleanup(patcher.stop) 945 946 def tearDown(self): 947 for attr in ("mock_si", "mock_cl_ref"): 948 delattr(self, attr) 949 950 def test_get_managed_object_name_call(self): 951 mock_get_managed_object_name = MagicMock() 952 with patch( 953 "salt.utils.vmware.get_managed_object_name", mock_get_managed_object_name 954 ): 955 vsan.get_cluster_vsan_info(self.mock_cl_ref) 956 mock_get_managed_object_name.assert_called_once_with(self.mock_cl_ref) 957 958 def test_get_vsan_cluster_config_system_call(self): 959 mock_get_vsan_cl_syst = MagicMock() 960 with patch( 961 "salt.utils.vsan.get_vsan_cluster_config_system", mock_get_vsan_cl_syst 962 ): 963 vsan.get_cluster_vsan_info(self.mock_cl_ref) 964 mock_get_vsan_cl_syst.assert_called_once_with(self.mock_si) 965 966 def test_VsanClusterGetConfig_call(self): 967 mock_vsan_sys = MagicMock() 968 with patch( 969 "salt.utils.vsan.get_vsan_cluster_config_system", 970 MagicMock(return_value=mock_vsan_sys), 971 ): 972 vsan.get_cluster_vsan_info(self.mock_cl_ref) 973 mock_vsan_sys.VsanClusterGetConfig.assert_called_once_with(self.mock_cl_ref) 974 975 def test_VsanClusterGetConfig_raises_no_permission(self): 976 exc = vim.fault.NoPermission() 977 exc.privilegeId = "Fake privilege" 978 with patch( 979 "salt.utils.vsan.get_vsan_cluster_config_system", 980 MagicMock( 981 return_value=MagicMock(VsanClusterGetConfig=MagicMock(side_effect=exc)) 982 ), 983 ): 984 with self.assertRaises(VMwareApiError) as excinfo: 985 vsan.get_cluster_vsan_info(self.mock_cl_ref) 986 self.assertEqual( 987 excinfo.exception.strerror, 988 "Not enough permissions. Required privilege: Fake privilege", 989 ) 990 991 def test_VsanClusterGetConfig_raises_vim_fault(self): 992 exc = vim.fault.VimFault() 993 exc.msg = "VimFault msg" 994 with patch( 995 "salt.utils.vsan.get_vsan_cluster_config_system", 996 MagicMock( 997 return_value=MagicMock(VsanClusterGetConfig=MagicMock(side_effect=exc)) 998 ), 999 ): 1000 with self.assertRaises(VMwareApiError) as excinfo: 1001 vsan.get_cluster_vsan_info(self.mock_cl_ref) 1002 self.assertEqual(excinfo.exception.strerror, "VimFault msg") 1003 1004 def test_VsanClusterGetConfig_raises_runtime_fault(self): 1005 exc = vmodl.RuntimeFault() 1006 exc.msg = "RuntimeFault msg" 1007 with patch( 1008 "salt.utils.vsan.get_vsan_cluster_config_system", 1009 MagicMock( 1010 return_value=MagicMock(VsanClusterGetConfig=MagicMock(side_effect=exc)) 1011 ), 1012 ): 1013 with self.assertRaises(VMwareRuntimeError) as excinfo: 1014 vsan.get_cluster_vsan_info(self.mock_cl_ref) 1015 self.assertEqual(excinfo.exception.strerror, "RuntimeFault msg") 1016 1017 1018@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 1019@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 1020class ReconfigureClusterVsanTestCase(TestCase): 1021 """Tests for salt.utils.vsan.reconfigure_cluster_vsan""" 1022 1023 def setUp(self): 1024 self.mock_si = MagicMock() 1025 self.mock_task = MagicMock() 1026 self.mock_cl_reconf = MagicMock(return_value=self.mock_task) 1027 self.mock_get_vsan_conf_sys = MagicMock( 1028 return_value=MagicMock(VsanClusterReconfig=self.mock_cl_reconf) 1029 ) 1030 self.mock_cl_ref = MagicMock() 1031 self.mock_cl_vsan_spec = MagicMock() 1032 patches = ( 1033 ("salt.utils.vmware.get_managed_object_name", MagicMock()), 1034 ( 1035 "salt.utils.vmware.get_service_instance_from_managed_object", 1036 MagicMock(return_value=self.mock_si), 1037 ), 1038 ( 1039 "salt.utils.vsan.get_vsan_cluster_config_system", 1040 self.mock_get_vsan_conf_sys, 1041 ), 1042 ("salt.utils.vsan._wait_for_tasks", MagicMock()), 1043 ) 1044 for mod, mock in patches: 1045 patcher = patch(mod, mock) 1046 patcher.start() 1047 self.addCleanup(patcher.stop) 1048 1049 def tearDown(self): 1050 for attr in ( 1051 "mock_si", 1052 "mock_cl_reconf", 1053 "mock_get_vsan_conf_sys", 1054 "mock_cl_ref", 1055 "mock_cl_vsan_spec", 1056 "mock_task", 1057 ): 1058 delattr(self, attr) 1059 1060 def test_get_cluster_name_call(self): 1061 get_managed_object_name_mock = MagicMock() 1062 with patch( 1063 "salt.utils.vmware.get_managed_object_name", get_managed_object_name_mock 1064 ): 1065 1066 vsan.reconfigure_cluster_vsan(self.mock_cl_ref, self.mock_cl_vsan_spec) 1067 get_managed_object_name_mock.assert_called_once_with(self.mock_cl_ref) 1068 1069 def test_get_service_instance_call(self): 1070 get_service_instance_from_managed_object_mock = MagicMock() 1071 with patch( 1072 "salt.utils.vmware.get_service_instance_from_managed_object", 1073 get_service_instance_from_managed_object_mock, 1074 ): 1075 1076 vsan.reconfigure_cluster_vsan(self.mock_cl_ref, self.mock_cl_vsan_spec) 1077 get_service_instance_from_managed_object_mock.assert_called_once_with( 1078 self.mock_cl_ref 1079 ) 1080 1081 def test_get_vsan_cluster_config_system_call(self): 1082 vsan.reconfigure_cluster_vsan(self.mock_cl_ref, self.mock_cl_vsan_spec) 1083 self.mock_get_vsan_conf_sys.assert_called_once_with(self.mock_si) 1084 1085 def test_cluster_reconfig_call(self): 1086 vsan.reconfigure_cluster_vsan(self.mock_cl_ref, self.mock_cl_vsan_spec) 1087 self.mock_cl_reconf.assert_called_once_with( 1088 self.mock_cl_ref, self.mock_cl_vsan_spec 1089 ) 1090 1091 def test_cluster_reconfig_raises_no_permission(self): 1092 exc = vim.fault.NoPermission() 1093 exc.privilegeId = "Fake privilege" 1094 with patch( 1095 "salt.utils.vsan.get_vsan_cluster_config_system", 1096 MagicMock( 1097 return_value=MagicMock(VsanClusterReconfig=MagicMock(side_effect=exc)) 1098 ), 1099 ): 1100 with self.assertRaises(VMwareApiError) as excinfo: 1101 vsan.reconfigure_cluster_vsan(self.mock_cl_ref, self.mock_cl_vsan_spec) 1102 self.assertEqual( 1103 excinfo.exception.strerror, 1104 "Not enough permissions. Required privilege: Fake privilege", 1105 ) 1106 1107 def test_cluster_reconfig_raises_vim_fault(self): 1108 exc = vim.fault.VimFault() 1109 exc.msg = "VimFault msg" 1110 with patch( 1111 "salt.utils.vsan.get_vsan_cluster_config_system", 1112 MagicMock( 1113 return_value=MagicMock(VsanClusterReconfig=MagicMock(side_effect=exc)) 1114 ), 1115 ): 1116 with self.assertRaises(VMwareApiError) as excinfo: 1117 vsan.reconfigure_cluster_vsan(self.mock_cl_ref, self.mock_cl_vsan_spec) 1118 self.assertEqual(excinfo.exception.strerror, "VimFault msg") 1119 1120 def test_cluster_reconfig_raises_vmodl_runtime_error(self): 1121 exc = vmodl.RuntimeFault() 1122 exc.msg = "VimRuntime msg" 1123 with patch( 1124 "salt.utils.vsan.get_vsan_cluster_config_system", 1125 MagicMock( 1126 return_value=MagicMock(VsanClusterReconfig=MagicMock(side_effect=exc)) 1127 ), 1128 ): 1129 with self.assertRaises(VMwareRuntimeError) as excinfo: 1130 vsan.reconfigure_cluster_vsan(self.mock_cl_ref, self.mock_cl_vsan_spec) 1131 self.assertEqual(excinfo.exception.strerror, "VimRuntime msg") 1132 1133 def test__wait_for_tasks_call(self): 1134 mock_wait_for_tasks = MagicMock() 1135 with patch("salt.utils.vsan._wait_for_tasks", mock_wait_for_tasks): 1136 vsan.reconfigure_cluster_vsan(self.mock_cl_ref, self.mock_cl_vsan_spec) 1137 mock_wait_for_tasks.assert_called_once_with([self.mock_task], self.mock_si) 1138 1139 1140@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing") 1141@skipIf(not HAS_PYVSAN, "The 'vsan' ext library is missing") 1142class _WaitForTasks(TestCase, LoaderModuleMockMixin): 1143 """Tests for salt.utils.vsan._wait_for_tasks""" 1144 1145 def setup_loader_modules(self): 1146 return {vsan: {}} 1147 1148 def setUp(self): 1149 self.mock_si = MagicMock() 1150 self.mock_tasks = MagicMock() 1151 patches = (("salt.utils.vsan.vsanapiutils.WaitForTasks", MagicMock()),) 1152 for mod, mock in patches: 1153 patcher = patch(mod, mock) 1154 patcher.start() 1155 self.addCleanup(patcher.stop) 1156 1157 def tearDown(self): 1158 for attr in ("mock_si", "mock_tasks"): 1159 delattr(self, attr) 1160 1161 def test_wait_for_tasks_call(self): 1162 mock_wait_for_tasks = MagicMock() 1163 with patch("salt.utils.vsan.vsanapiutils.WaitForTasks", mock_wait_for_tasks): 1164 vsan._wait_for_tasks(self.mock_tasks, self.mock_si) 1165 mock_wait_for_tasks.assert_called_once_with(self.mock_tasks, self.mock_si) 1166 1167 def test_wait_for_tasks_raises_no_permission(self): 1168 exc = vim.fault.NoPermission() 1169 exc.privilegeId = "Fake privilege" 1170 with patch( 1171 "salt.utils.vsan.vsanapiutils.WaitForTasks", MagicMock(side_effect=exc) 1172 ): 1173 with self.assertRaises(VMwareApiError) as excinfo: 1174 vsan._wait_for_tasks(self.mock_tasks, self.mock_si) 1175 self.assertEqual( 1176 excinfo.exception.strerror, 1177 "Not enough permissions. Required privilege: Fake privilege", 1178 ) 1179 1180 def test_wait_for_tasks_raises_vim_fault(self): 1181 exc = vim.fault.VimFault() 1182 exc.msg = "VimFault msg" 1183 with patch( 1184 "salt.utils.vsan.vsanapiutils.WaitForTasks", MagicMock(side_effect=exc) 1185 ): 1186 with self.assertRaises(VMwareApiError) as excinfo: 1187 vsan._wait_for_tasks(self.mock_tasks, self.mock_si) 1188 self.assertEqual(excinfo.exception.strerror, "VimFault msg") 1189 1190 def test_wait_for_tasks_raises_vmodl_runtime_error(self): 1191 exc = vmodl.RuntimeFault() 1192 exc.msg = "VimRuntime msg" 1193 with patch( 1194 "salt.utils.vsan.vsanapiutils.WaitForTasks", MagicMock(side_effect=exc) 1195 ): 1196 with self.assertRaises(VMwareRuntimeError) as excinfo: 1197 vsan._wait_for_tasks(self.mock_tasks, self.mock_si) 1198 self.assertEqual(excinfo.exception.strerror, "VimRuntime msg") 1199