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