Skip to content

Commit b0aaeba

Browse files
alexbleotuNicole Thomas
authored andcommitted
Update cluster gh (saltstack#37347)
* Added utils.vmware.update_cluster - updates an existing cluster based on a configuration spec * Added tests for utils.vmware.update_cluster
1 parent 547ddcc commit b0aaeba

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

salt/utils/vmware.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,29 @@ def create_datacenter(service_instance, datacenter_name):
912912
return dc_obj
913913

914914

915+
def update_cluster(cluster_ref, cluster_spec):
916+
'''
917+
Updates a cluster in a datacenter.
918+
919+
cluster_ref
920+
The cluster reference.
921+
922+
cluster_spec
923+
The cluster spec (vim.ClusterConfigSpecEx).
924+
Defaults to None.
925+
'''
926+
cluster_name = get_managed_object_name(cluster_ref)
927+
log.trace('Updating cluster \'{0}\''.format(cluster_name))
928+
try:
929+
task = cluster_ref.ReconfigureComputeResource_Task(cluster_spec,
930+
modify=True)
931+
except vim.fault.VimFault as exc:
932+
raise salt.exceptions.VMwareApiError(exc.msg)
933+
except vmodl.RuntimeFault as exc:
934+
raise salt.exceptions.VMwareRuntimeError(exc.msg)
935+
wait_for_task(task, cluster_name, 'ClusterUpdateTask')
936+
937+
915938
def list_clusters(service_instance):
916939
'''
917940
Returns a list of clusters associated with a given service instance.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# -*- coding: utf-8 -*-
2+
'''
3+
:codeauthor: :email:`Alexandru Bleotu <alexandru.bleotu@morganstanley.com>`
4+
5+
Tests for cluster related functions in salt.utils.vmware
6+
'''
7+
8+
# Import python libraries
9+
from __future__ import absolute_import
10+
import logging
11+
# Import Salt testing libraries
12+
from salttesting import TestCase, skipIf
13+
from salttesting.mock import NO_MOCK, NO_MOCK_REASON, patch, MagicMock
14+
# Import Salt libraries
15+
from salt.exceptions import VMwareApiError, VMwareRuntimeError
16+
import salt.utils.vmware as vmware
17+
# Import Third Party Libs
18+
try:
19+
from pyVmomi import vim, vmodl
20+
HAS_PYVMOMI = True
21+
except ImportError:
22+
HAS_PYVMOMI = False
23+
24+
# Get Logging Started
25+
log = logging.getLogger(__name__)
26+
27+
28+
@skipIf(NO_MOCK, NO_MOCK_REASON)
29+
@skipIf(not HAS_PYVMOMI, 'The \'pyvmomi\' library is missing')
30+
@patch('salt.utils.vmware.get_managed_object_name', MagicMock())
31+
@patch('salt.utils.vmware.wait_for_task', MagicMock())
32+
class UpdateClusterTestCase(TestCase):
33+
'''Tests for salt.utils.vmware.update_cluster'''
34+
35+
def setUp(self):
36+
self.mock_task = MagicMock()
37+
self.mock_reconfigure_compute_resource_task = \
38+
MagicMock(return_value=self.mock_task)
39+
self.mock_cluster = MagicMock(ReconfigureComputeResource_Task=
40+
self.mock_reconfigure_compute_resource_task)
41+
self.mock_cluster_spec = MagicMock()
42+
43+
def test_get_managed_object_name(self):
44+
mock_get_managed_object_name = MagicMock()
45+
with patch('salt.utils.vmware.get_managed_object_name',
46+
mock_get_managed_object_name):
47+
vmware.update_cluster(self.mock_cluster, self.mock_cluster_spec)
48+
mock_get_managed_object_name.assert_called_once_with(self.mock_cluster)
49+
50+
def test_reconfigure_compute_resource_task_call(self):
51+
vmware.update_cluster(self.mock_cluster, self.mock_cluster_spec)
52+
self.mock_reconfigure_compute_resource_task.assert_called_once_with(
53+
self.mock_cluster_spec, modify=True)
54+
55+
def test_create_cluster_raise_vim_fault(self):
56+
exc = vim.fault.VimFault()
57+
exc.msg = 'VimFault msg'
58+
self.mock_cluster.ReconfigureComputeResource_Task = \
59+
MagicMock(side_effect=exc)
60+
with self.assertRaises(VMwareApiError) as excinfo:
61+
vmware.update_cluster(self.mock_cluster, self.mock_cluster_spec)
62+
self.assertEqual(excinfo.exception.strerror, 'VimFault msg')
63+
64+
def test_create_cluster_raise_runtime_fault(self):
65+
exc = vmodl.RuntimeFault()
66+
exc.msg = 'RuntimeFault msg'
67+
self.mock_cluster.ReconfigureComputeResource_Task = \
68+
MagicMock(side_effect=exc)
69+
with self.assertRaises(VMwareRuntimeError) as excinfo:
70+
vmware.update_cluster(self.mock_cluster, self.mock_cluster_spec)
71+
self.assertEqual(excinfo.exception.strerror, 'RuntimeFault msg')
72+
73+
def test_wait_for_task_call(self):
74+
mock_wait_for_task = MagicMock()
75+
with patch('salt.utils.vmware.get_managed_object_name',
76+
MagicMock(return_value='fake_cluster')):
77+
with patch('salt.utils.vmware.wait_for_task', mock_wait_for_task):
78+
vmware.update_cluster(self.mock_cluster,
79+
self.mock_cluster_spec)
80+
mock_wait_for_task.assert_called_once_with(
81+
self.mock_task, 'fake_cluster', 'ClusterUpdateTask')
82+
83+
84+
if __name__ == '__main__':
85+
from integration import run_tests
86+
run_tests(UpdateClusterTestCase, needs_daemon=False)

0 commit comments

Comments
 (0)