Coverage for manila/tests/share/drivers/dell_emc/plugins/powermax/test_object_manager.py: 100%
1497 statements
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
1# Copyright (c) 2016 Dell Inc. or its subsidiaries.
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
16import copy
17from unittest import mock
19import ddt
20from lxml import builder
21from oslo_concurrency import processutils
23from manila import exception
25from manila.common import constants as const
26from manila.share.drivers.dell_emc.common.enas import connector
27from manila.share.drivers.dell_emc.common.enas import constants
28from manila.share.drivers.dell_emc.common.enas import xml_api_parser as parser
29from manila.share.drivers.dell_emc.plugins.powermax import (
30 object_manager as manager)
31from manila import test
32from manila.tests.share.drivers.dell_emc.common.enas import fakes
33from manila.tests.share.drivers.dell_emc.common.enas import utils
36class StorageObjectManagerTestCase(test.TestCase):
37 @mock.patch.object(connector, "XMLAPIConnector", mock.Mock())
38 @mock.patch.object(connector, "SSHConnector", mock.Mock())
39 def setUp(self):
40 super(StorageObjectManagerTestCase, self).setUp()
42 emd_share_driver = fakes.FakeEMCShareDriver('powermax')
44 self.manager = manager.StorageObjectManager(
45 emd_share_driver.configuration)
47 def test_get_storage_context(self):
48 type_map = {
49 'FileSystem': manager.FileSystem,
50 'StoragePool': manager.StoragePool,
51 'MountPoint': manager.MountPoint,
52 'Mover': manager.Mover,
53 'VDM': manager.VDM,
54 'Snapshot': manager.Snapshot,
55 'MoverInterface': manager.MoverInterface,
56 'DNSDomain': manager.DNSDomain,
57 'CIFSServer': manager.CIFSServer,
58 'CIFSShare': manager.CIFSShare,
59 'NFSShare': manager.NFSShare,
60 }
62 for key, value in type_map.items():
63 self.assertTrue(
64 isinstance(self.manager.getStorageContext(key), value))
66 for key in self.manager.context.keys():
67 self.assertIn(key, type_map)
69 def test_get_storage_context_invalid_type(self):
71 fake_type = 'fake_type'
73 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
74 self.manager.getStorageContext,
75 fake_type)
78class StorageObjectTestCaseBase(test.TestCase):
79 @mock.patch.object(connector, "XMLAPIConnector", mock.Mock())
80 @mock.patch.object(connector, "SSHConnector", mock.Mock())
81 def setUp(self):
82 super(StorageObjectTestCaseBase, self).setUp()
84 emd_share_driver = fakes.FakeEMCShareDriver('powermax')
86 self.manager = manager.StorageObjectManager(
87 emd_share_driver.configuration)
88 self.base = fakes.StorageObjectTestData()
89 self.pool = fakes.PoolTestData()
90 self.vdm = fakes.VDMTestData()
91 self.mover = fakes.MoverTestData()
92 self.fs = fakes.FileSystemTestData()
93 self.mount = fakes.MountPointTestData()
94 self.snap = fakes.SnapshotTestData()
95 self.cifs_share = fakes.CIFSShareTestData()
96 self.nfs_share = fakes.NFSShareTestData()
97 self.cifs_server = fakes.CIFSServerTestData()
98 self.dns = fakes.DNSDomainTestData()
101class StorageObjectTestCase(StorageObjectTestCaseBase):
102 def test_xml_api_retry(self):
103 hook = utils.RequestSideEffect()
104 hook.append(self.base.resp_need_retry())
105 hook.append(self.base.resp_task_succeed())
106 elt_maker = builder.ElementMaker(nsmap={None: constants.XML_NAMESPACE})
107 xml_parser = parser.XMLAPIParser()
108 storage_object = manager.StorageObject(self.manager.connectors,
109 elt_maker, xml_parser,
110 self.manager)
111 storage_object.conn['XML'].request = utils.EMCMock(side_effect=hook)
112 fake_req = storage_object._build_task_package(
113 elt_maker.StartFake(name='foo')
114 )
115 resp = storage_object._send_request(fake_req)
116 self.assertEqual('ok', resp['maxSeverity'])
118 expected_calls = [
119 mock.call(self.base.req_fake_start_task()),
120 mock.call(self.base.req_fake_start_task())
121 ]
122 storage_object.conn['XML'].request.assert_has_calls(expected_calls)
125class FileSystemTestCase(StorageObjectTestCaseBase):
126 def setUp(self):
127 super(FileSystemTestCase, self).setUp()
128 self.hook = utils.RequestSideEffect()
129 self.ssh_hook = utils.SSHSideEffect()
131 def test_create_file_system_on_vdm(self):
132 self.hook.append(self.pool.resp_get_succeed())
133 self.hook.append(self.vdm.resp_get_succeed())
134 self.hook.append(self.fs.resp_task_succeed())
136 context = self.manager.getStorageContext('FileSystem')
137 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
139 context.create(name=self.fs.filesystem_name,
140 size=self.fs.filesystem_size,
141 pool_name=self.pool.pool_name,
142 mover_name=self.vdm.vdm_name,
143 is_vdm=True)
145 expected_calls = [
146 mock.call(self.pool.req_get()),
147 mock.call(self.vdm.req_get()),
148 mock.call(self.fs.req_create_on_vdm()),
149 ]
150 context.conn['XML'].request.assert_has_calls(expected_calls)
152 def test_create_file_system_on_mover(self):
153 self.hook.append(self.pool.resp_get_succeed())
154 self.hook.append(self.mover.resp_get_ref_succeed())
155 self.hook.append(self.fs.resp_task_succeed())
157 context = self.manager.getStorageContext('FileSystem')
158 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
160 context.create(name=self.fs.filesystem_name,
161 size=self.fs.filesystem_size,
162 pool_name=self.pool.pool_name,
163 mover_name=self.mover.mover_name,
164 is_vdm=False)
166 expected_calls = [
167 mock.call(self.pool.req_get()),
168 mock.call(self.mover.req_get_ref()),
169 mock.call(self.fs.req_create_on_mover()),
170 ]
171 context.conn['XML'].request.assert_has_calls(expected_calls)
173 def test_create_file_system_but_already_exist(self):
174 self.hook.append(self.pool.resp_get_succeed())
175 self.hook.append(self.vdm.resp_get_succeed())
176 self.hook.append(self.fs.resp_create_but_already_exist())
178 context = self.manager.getStorageContext('FileSystem')
179 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
181 context.create(name=self.fs.filesystem_name,
182 size=self.fs.filesystem_size,
183 pool_name=self.pool.pool_name,
184 mover_name=self.vdm.vdm_name,
185 is_vdm=True)
187 expected_calls = [
188 mock.call(self.pool.req_get()),
189 mock.call(self.vdm.req_get()),
190 mock.call(self.fs.req_create_on_vdm()),
191 ]
192 context.conn['XML'].request.assert_has_calls(expected_calls)
194 @mock.patch('time.sleep')
195 def test_create_file_system_invalid_mover_id(self, sleep_mock):
196 self.hook.append(self.pool.resp_get_succeed())
197 self.hook.append(self.mover.resp_get_ref_succeed())
198 self.hook.append(self.fs.resp_invalid_mover_id())
199 self.hook.append(self.mover.resp_get_ref_succeed())
200 self.hook.append(self.fs.resp_task_succeed())
202 context = self.manager.getStorageContext('FileSystem')
203 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
205 context.create(name=self.fs.filesystem_name,
206 size=self.fs.filesystem_size,
207 pool_name=self.pool.pool_name,
208 mover_name=self.mover.mover_name,
209 is_vdm=False)
211 expected_calls = [
212 mock.call(self.pool.req_get()),
213 mock.call(self.mover.req_get_ref()),
214 mock.call(self.fs.req_create_on_mover()),
215 mock.call(self.mover.req_get_ref()),
216 mock.call(self.fs.req_create_on_mover()),
217 ]
218 context.conn['XML'].request.assert_has_calls(expected_calls)
220 self.assertTrue(sleep_mock.called)
222 def test_create_file_system_with_error(self):
223 self.hook.append(self.pool.resp_get_succeed())
224 self.hook.append(self.vdm.resp_get_succeed())
225 self.hook.append(self.fs.resp_task_error())
227 context = self.manager.getStorageContext('FileSystem')
228 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
230 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
231 context.create,
232 name=self.fs.filesystem_name,
233 size=self.fs.filesystem_size,
234 pool_name=self.pool.pool_name,
235 mover_name=self.vdm.vdm_name,
236 is_vdm=True)
238 expected_calls = [
239 mock.call(self.pool.req_get()),
240 mock.call(self.vdm.req_get()),
241 mock.call(self.fs.req_create_on_vdm()),
242 ]
243 context.conn['XML'].request.assert_has_calls(expected_calls)
245 def test_get_file_system(self):
246 self.hook.append(self.fs.resp_get_succeed())
248 context = self.manager.getStorageContext('FileSystem')
249 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
251 status, out = context.get(self.fs.filesystem_name)
252 self.assertEqual(constants.STATUS_OK, status)
253 self.assertIn(self.fs.filesystem_name, context.filesystem_map)
254 property_map = [
255 'name',
256 'pools_id',
257 'volume_id',
258 'size',
259 'id',
260 'type',
261 'dataServicePolicies',
262 ]
263 for prop in property_map:
264 self.assertIn(prop, out)
266 id = context.get_id(self.fs.filesystem_name)
267 self.assertEqual(self.fs.filesystem_id, id)
269 expected_calls = [mock.call(self.fs.req_get())]
270 context.conn['XML'].request.assert_has_calls(expected_calls)
272 def test_get_file_system_but_not_found(self):
273 self.hook.append(self.fs.resp_get_but_not_found())
274 self.hook.append(self.fs.resp_get_without_value())
275 self.hook.append(self.fs.resp_get_error())
276 self.hook.append(self.fs.resp_get_but_not_found())
278 context = self.manager.getStorageContext('FileSystem')
279 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
281 status, out = context.get(self.fs.filesystem_name)
282 self.assertEqual(constants.STATUS_NOT_FOUND, status)
284 status, out = context.get(self.fs.filesystem_name)
285 self.assertEqual(constants.STATUS_NOT_FOUND, status)
287 status, out = context.get(self.fs.filesystem_name)
288 self.assertEqual(constants.STATUS_ERROR, status)
290 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
291 context.get_id,
292 self.fs.filesystem_name)
294 expected_calls = [
295 mock.call(self.fs.req_get()),
296 mock.call(self.fs.req_get()),
297 mock.call(self.fs.req_get()),
298 mock.call(self.fs.req_get()),
299 ]
300 context.conn['XML'].request.assert_has_calls(expected_calls)
302 def test_get_file_system_but_miss_property(self):
303 self.hook.append(self.fs.resp_get_but_miss_property())
305 context = self.manager.getStorageContext('FileSystem')
306 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
308 status, out = context.get(self.fs.filesystem_name)
309 self.assertEqual(constants.STATUS_OK, status)
310 self.assertIn(self.fs.filesystem_name, context.filesystem_map)
311 property_map = [
312 'name',
313 'pools_id',
314 'volume_id',
315 'size',
316 'id',
317 'type',
318 'dataServicePolicies',
319 ]
320 for prop in property_map:
321 self.assertIn(prop, out)
323 self.assertIsNone(out['dataServicePolicies'])
325 id = context.get_id(self.fs.filesystem_name)
326 self.assertEqual(self.fs.filesystem_id, id)
328 expected_calls = [mock.call(self.fs.req_get())]
329 context.conn['XML'].request.assert_has_calls(expected_calls)
331 def test_delete_file_system(self):
332 self.hook.append(self.fs.resp_get_succeed())
333 self.hook.append(self.fs.resp_task_succeed())
335 context = self.manager.getStorageContext('FileSystem')
336 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
338 context.delete(self.fs.filesystem_name)
339 self.assertNotIn(self.fs.filesystem_name, context.filesystem_map)
341 expected_calls = [
342 mock.call(self.fs.req_get()),
343 mock.call(self.fs.req_delete()),
344 ]
345 context.conn['XML'].request.assert_has_calls(expected_calls)
347 self.assertNotIn(self.fs.filesystem_name, context.filesystem_map)
349 def test_delete_file_system_but_not_found(self):
350 self.hook.append(self.fs.resp_get_but_not_found())
352 context = self.manager.getStorageContext('FileSystem')
353 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
355 context.delete(self.fs.filesystem_name)
357 expected_calls = [mock.call(self.fs.req_get())]
358 context.conn['XML'].request.assert_has_calls(expected_calls)
360 def test_delete_file_system_but_get_file_system_error(self):
361 self.hook.append(self.fs.resp_get_error())
363 context = self.manager.getStorageContext('FileSystem')
364 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
366 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
367 context.delete,
368 self.fs.filesystem_name)
370 expected_calls = [mock.call(self.fs.req_get())]
371 context.conn['XML'].request.assert_has_calls(expected_calls)
373 def test_delete_file_system_with_error(self):
374 self.hook.append(self.fs.resp_get_succeed())
375 self.hook.append(self.fs.resp_delete_but_failed())
377 context = self.manager.getStorageContext('FileSystem')
378 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
380 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
381 context.delete,
382 self.fs.filesystem_name)
384 expected_calls = [
385 mock.call(self.fs.req_get()),
386 mock.call(self.fs.req_delete()),
387 ]
388 context.conn['XML'].request.assert_has_calls(expected_calls)
390 self.assertIn(self.fs.filesystem_name, context.filesystem_map)
392 def test_extend_file_system(self):
393 self.hook.append(self.fs.resp_get_succeed())
394 self.hook.append(self.pool.resp_get_succeed())
395 self.hook.append(self.fs.resp_task_succeed())
397 context = self.manager.getStorageContext('FileSystem')
398 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
400 context.extend(name=self.fs.filesystem_name,
401 pool_name=self.pool.pool_name,
402 new_size=self.fs.filesystem_new_size)
404 expected_calls = [
405 mock.call(self.fs.req_get()),
406 mock.call(self.pool.req_get()),
407 mock.call(self.fs.req_extend()),
408 ]
409 context.conn['XML'].request.assert_has_calls(expected_calls)
411 def test_extend_file_system_but_not_found(self):
412 self.hook.append(self.fs.resp_get_but_not_found())
414 context = self.manager.getStorageContext('FileSystem')
415 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
417 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
418 context.extend,
419 name=self.fs.filesystem_name,
420 pool_name=self.fs.pool_name,
421 new_size=self.fs.filesystem_new_size)
423 expected_calls = [mock.call(self.fs.req_get())]
424 context.conn['XML'].request.assert_has_calls(expected_calls)
426 def test_extend_file_system_with_small_size(self):
427 self.hook.append(self.fs.resp_get_succeed())
429 context = self.manager.getStorageContext('FileSystem')
430 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
432 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
433 context.extend,
434 name=self.fs.filesystem_name,
435 pool_name=self.pool.pool_name,
436 new_size=1)
438 expected_calls = [mock.call(self.fs.req_get())]
439 context.conn['XML'].request.assert_has_calls(expected_calls)
441 def test_extend_file_system_with_same_size(self):
442 self.hook.append(self.fs.resp_get_succeed())
444 context = self.manager.getStorageContext('FileSystem')
445 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
447 context.extend(name=self.fs.filesystem_name,
448 pool_name=self.pool.pool_name,
449 new_size=self.fs.filesystem_size)
451 expected_calls = [mock.call(self.fs.req_get())]
452 context.conn['XML'].request.assert_has_calls(expected_calls)
454 def test_extend_file_system_with_error(self):
455 self.hook.append(self.fs.resp_get_succeed())
456 self.hook.append(self.pool.resp_get_succeed())
457 self.hook.append(self.fs.resp_extend_but_error())
459 context = self.manager.getStorageContext('FileSystem')
460 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
462 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
463 context.extend,
464 name=self.fs.filesystem_name,
465 pool_name=self.pool.pool_name,
466 new_size=self.fs.filesystem_new_size)
468 expected_calls = [
469 mock.call(self.fs.req_get()),
470 mock.call(self.pool.req_get()),
471 mock.call(self.fs.req_extend()),
472 ]
473 context.conn['XML'].request.assert_has_calls(expected_calls)
475 def test_create_filesystem_from_snapshot(self):
476 self.ssh_hook.append()
477 self.ssh_hook.append()
478 self.ssh_hook.append(self.fs.output_copy_ckpt)
479 self.ssh_hook.append(self.fs.output_info())
480 self.ssh_hook.append()
481 self.ssh_hook.append()
482 self.ssh_hook.append()
484 context = self.manager.getStorageContext('FileSystem')
485 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
487 context.create_from_snapshot(self.fs.filesystem_name,
488 self.snap.src_snap_name,
489 self.fs.src_fileystems_name,
490 self.pool.pool_name,
491 self.vdm.vdm_name,
492 self.mover.interconnect_id)
494 ssh_calls = [
495 mock.call(self.fs.cmd_create_from_ckpt(), False),
496 mock.call(self.mount.cmd_server_mount('ro'), False),
497 mock.call(self.fs.cmd_copy_ckpt(), True),
498 mock.call(self.fs.cmd_nas_fs_info(), False),
499 mock.call(self.mount.cmd_server_umount(), False),
500 mock.call(self.fs.cmd_delete(), False),
501 mock.call(self.mount.cmd_server_mount('rw'), False),
502 ]
503 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
505 def test_create_filesystem_from_snapshot_with_error(self):
506 self.ssh_hook.append()
507 self.ssh_hook.append()
508 self.ssh_hook.append(ex=processutils.ProcessExecutionError(
509 stdout=self.fs.fake_output, stderr=None))
510 self.ssh_hook.append(self.fs.output_info())
511 self.ssh_hook.append()
512 self.ssh_hook.append()
513 self.ssh_hook.append()
515 context = self.manager.getStorageContext('FileSystem')
516 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
518 context.create_from_snapshot(
519 self.fs.filesystem_name,
520 self.snap.src_snap_name,
521 self.fs.src_fileystems_name,
522 self.pool.pool_name,
523 self.vdm.vdm_name,
524 self.mover.interconnect_id, )
526 ssh_calls = [
527 mock.call(self.fs.cmd_create_from_ckpt(), False),
528 mock.call(self.mount.cmd_server_mount('ro'), False),
529 mock.call(self.fs.cmd_copy_ckpt(), True),
530 mock.call(self.fs.cmd_nas_fs_info(), False),
531 mock.call(self.mount.cmd_server_umount(), False),
532 mock.call(self.fs.cmd_delete(), False),
533 mock.call(self.mount.cmd_server_mount('rw'), False),
534 ]
535 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
538class MountPointTestCase(StorageObjectTestCaseBase):
539 def setUp(self):
540 super(MountPointTestCase, self).setUp()
541 self.hook = utils.RequestSideEffect()
543 def test_create_mount_point_on_vdm(self):
544 self.hook.append(self.fs.resp_get_succeed())
545 self.hook.append(self.vdm.resp_get_succeed())
546 self.hook.append(self.mount.resp_task_succeed())
548 context = self.manager.getStorageContext('MountPoint')
549 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
551 context.create(mount_path=self.mount.path,
552 fs_name=self.fs.filesystem_name,
553 mover_name=self.vdm.vdm_name,
554 is_vdm=True)
556 expected_calls = [
557 mock.call(self.fs.req_get()),
558 mock.call(self.vdm.req_get()),
559 mock.call(self.mount.req_create(self.vdm.vdm_id, True)),
560 ]
561 context.conn['XML'].request.assert_has_calls(expected_calls)
563 def test_create_mount_point_on_mover(self):
564 self.hook.append(self.fs.resp_get_succeed())
565 self.hook.append(self.mover.resp_get_ref_succeed())
566 self.hook.append(self.mount.resp_task_succeed())
568 context = self.manager.getStorageContext('MountPoint')
569 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
571 context.create(mount_path=self.mount.path,
572 fs_name=self.fs.filesystem_name,
573 mover_name=self.mover.mover_name,
574 is_vdm=False)
576 expected_calls = [
577 mock.call(self.fs.req_get()),
578 mock.call(self.mover.req_get_ref()),
579 mock.call(self.mount.req_create(self.mover.mover_id, False)),
580 ]
581 context.conn['XML'].request.assert_has_calls(expected_calls)
583 def test_create_mount_point_but_already_exist(self):
584 self.hook.append(self.fs.resp_get_succeed())
585 self.hook.append(self.vdm.resp_get_succeed())
586 self.hook.append(self.mount.resp_create_but_already_exist())
588 context = self.manager.getStorageContext('MountPoint')
589 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
591 context.create(mount_path=self.mount.path,
592 fs_name=self.fs.filesystem_name,
593 mover_name=self.vdm.vdm_name,
594 is_vdm=True)
596 expected_calls = [
597 mock.call(self.fs.req_get()),
598 mock.call(self.vdm.req_get()),
599 mock.call(self.mount.req_create(self.vdm.vdm_id)),
600 ]
601 context.conn['XML'].request.assert_has_calls(expected_calls)
603 @mock.patch('time.sleep')
604 def test_create_mount_point_invalid_mover_id(self, sleep_mock):
605 self.hook.append(self.fs.resp_get_succeed())
606 self.hook.append(self.mover.resp_get_ref_succeed())
607 self.hook.append(self.mount.resp_invalid_mover_id())
608 self.hook.append(self.mover.resp_get_ref_succeed())
609 self.hook.append(self.mount.resp_task_succeed())
611 context = self.manager.getStorageContext('MountPoint')
612 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
614 context.create(mount_path=self.mount.path,
615 fs_name=self.fs.filesystem_name,
616 mover_name=self.mover.mover_name,
617 is_vdm=False)
619 expected_calls = [
620 mock.call(self.fs.req_get()),
621 mock.call(self.mover.req_get_ref()),
622 mock.call(self.mount.req_create(self.mover.mover_id, False)),
623 mock.call(self.mover.req_get_ref()),
624 mock.call(self.mount.req_create(self.mover.mover_id, False)),
625 ]
626 context.conn['XML'].request.assert_has_calls(expected_calls)
628 self.assertTrue(sleep_mock.called)
630 def test_create_mount_point_with_error(self):
631 self.hook.append(self.fs.resp_get_succeed())
632 self.hook.append(self.vdm.resp_get_succeed())
633 self.hook.append(self.mount.resp_task_error())
635 context = self.manager.getStorageContext('MountPoint')
636 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
638 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
639 context.create,
640 mount_path=self.mount.path,
641 fs_name=self.fs.filesystem_name,
642 mover_name=self.vdm.vdm_name,
643 is_vdm=True)
645 expected_calls = [
646 mock.call(self.fs.req_get()),
647 mock.call(self.vdm.req_get()),
648 mock.call(self.mount.req_create(self.vdm.vdm_id)),
649 ]
650 context.conn['XML'].request.assert_has_calls(expected_calls)
652 def test_delete_mount_point_on_vdm(self):
653 self.hook.append(self.vdm.resp_get_succeed())
654 self.hook.append(self.mount.resp_task_succeed())
656 context = self.manager.getStorageContext('MountPoint')
657 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
659 context.delete(mount_path=self.mount.path,
660 mover_name=self.vdm.vdm_name,
661 is_vdm=True)
663 expected_calls = [
664 mock.call(self.vdm.req_get()),
665 mock.call(self.mount.req_delete(self.vdm.vdm_id)),
666 ]
667 context.conn['XML'].request.assert_has_calls(expected_calls)
669 def test_delete_mount_point_on_mover(self):
670 self.hook.append(self.mover.resp_get_ref_succeed())
671 self.hook.append(self.mount.resp_task_succeed())
673 context = self.manager.getStorageContext('MountPoint')
674 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
676 context.delete(mount_path=self.mount.path,
677 mover_name=self.mover.mover_name,
678 is_vdm=False)
680 expected_calls = [
681 mock.call(self.mover.req_get_ref()),
682 mock.call(self.mount.req_delete(self.mover.mover_id, False)),
683 ]
684 context.conn['XML'].request.assert_has_calls(expected_calls)
686 def test_delete_mount_point_but_nonexistent(self):
687 self.hook.append(self.vdm.resp_get_succeed())
688 self.hook.append(self.mount.resp_delete_but_nonexistent())
690 context = self.manager.getStorageContext('MountPoint')
691 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
693 context.delete(mount_path=self.mount.path,
694 mover_name=self.vdm.vdm_name,
695 is_vdm=True)
697 expected_calls = [
698 mock.call(self.vdm.req_get()),
699 mock.call(self.mount.req_delete(self.vdm.vdm_id)),
700 ]
701 context.conn['XML'].request.assert_has_calls(expected_calls)
703 @mock.patch('time.sleep')
704 def test_delete_mount_point_invalid_mover_id(self, sleep_mock):
705 self.hook.append(self.mover.resp_get_ref_succeed())
706 self.hook.append(self.mount.resp_invalid_mover_id())
707 self.hook.append(self.mover.resp_get_ref_succeed())
708 self.hook.append(self.mount.resp_task_succeed())
710 context = self.manager.getStorageContext('MountPoint')
711 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
713 context.delete(mount_path=self.mount.path,
714 mover_name=self.mover.mover_name,
715 is_vdm=False)
717 expected_calls = [
718 mock.call(self.mover.req_get_ref()),
719 mock.call(self.mount.req_delete(self.mover.mover_id, False)),
720 mock.call(self.mover.req_get_ref()),
721 mock.call(self.mount.req_delete(self.mover.mover_id, False)),
722 ]
723 context.conn['XML'].request.assert_has_calls(expected_calls)
725 self.assertTrue(sleep_mock.called)
727 def test_delete_mount_point_with_error(self):
728 self.hook.append(self.vdm.resp_get_succeed())
729 self.hook.append(self.mount.resp_task_error())
731 context = self.manager.getStorageContext('MountPoint')
732 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
734 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
735 context.delete,
736 mount_path=self.mount.path,
737 mover_name=self.vdm.vdm_name,
738 is_vdm=True)
740 expected_calls = [
741 mock.call(self.vdm.req_get()),
742 mock.call(self.mount.req_delete(self.vdm.vdm_id)),
743 ]
744 context.conn['XML'].request.assert_has_calls(expected_calls)
746 def test_get_mount_points(self):
747 self.hook.append(self.vdm.resp_get_succeed())
748 self.hook.append(self.mount.resp_get_succeed(self.vdm.vdm_id))
749 self.hook.append(self.mover.resp_get_ref_succeed())
750 self.hook.append(self.mount.resp_get_succeed(self.mover.mover_id,
751 False))
753 context = self.manager.getStorageContext('MountPoint')
754 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
756 status, out = context.get(self.vdm.vdm_name)
757 self.assertEqual(constants.STATUS_OK, status)
758 property_map = [
759 'path',
760 'mover',
761 'moverIdIsVdm',
762 'fileSystem',
763 ]
764 for item in out:
765 for prop in property_map:
766 self.assertIn(prop, item)
768 status, out = context.get(self.mover.mover_name, False)
769 self.assertEqual(constants.STATUS_OK, status)
770 property_map = [
771 'path',
772 'mover',
773 'moverIdIsVdm',
774 'fileSystem',
775 ]
776 for item in out:
777 for prop in property_map:
778 self.assertIn(prop, item)
780 expected_calls = [
781 mock.call(self.vdm.req_get()),
782 mock.call(self.mount.req_get(self.vdm.vdm_id)),
783 mock.call(self.mover.req_get_ref()),
784 mock.call(self.mount.req_get(self.mover.mover_id, False)),
785 ]
786 context.conn['XML'].request.assert_has_calls(expected_calls)
788 def test_get_mount_points_but_not_found(self):
789 self.hook.append(self.mover.resp_get_ref_succeed())
790 self.hook.append(self.mount.resp_get_without_value())
792 context = self.manager.getStorageContext('MountPoint')
793 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
795 status, out = context.get(self.mover.mover_name, False)
796 self.assertEqual(constants.STATUS_NOT_FOUND, status)
798 expected_calls = [
799 mock.call(self.mover.req_get_ref()),
800 mock.call(self.mount.req_get(self.mover.mover_id, False)),
801 ]
802 context.conn['XML'].request.assert_has_calls(expected_calls)
804 @mock.patch('time.sleep')
805 def test_get_mount_points_invalid_mover_id(self, sleep_mock):
806 self.hook.append(self.mover.resp_get_ref_succeed())
807 self.hook.append(self.mount.resp_invalid_mover_id())
808 self.hook.append(self.mover.resp_get_ref_succeed())
809 self.hook.append(self.mount.resp_get_succeed(self.mover.mover_id,
810 False))
812 context = self.manager.getStorageContext('MountPoint')
813 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
815 status, out = context.get(self.mover.mover_name, False)
816 self.assertEqual(constants.STATUS_OK, status)
818 property_map = [
819 'path',
820 'mover',
821 'moverIdIsVdm',
822 'fileSystem',
823 ]
824 for item in out:
825 for prop in property_map:
826 self.assertIn(prop, item)
828 expected_calls = [
829 mock.call(self.mover.req_get_ref()),
830 mock.call(self.mount.req_get(self.mover.mover_id, False)),
831 mock.call(self.mover.req_get_ref()),
832 mock.call(self.mount.req_get(self.mover.mover_id, False)),
833 ]
834 context.conn['XML'].request.assert_has_calls(expected_calls)
836 self.assertTrue(sleep_mock.called)
838 def test_get_mount_points_with_error(self):
839 self.hook.append(self.mover.resp_get_ref_succeed())
840 self.hook.append(self.mount.resp_get_error())
842 context = self.manager.getStorageContext('MountPoint')
843 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
845 status, out = context.get(self.mover.mover_name, False)
846 self.assertEqual(constants.STATUS_ERROR, status)
848 expected_calls = [
849 mock.call(self.mover.req_get_ref()),
850 mock.call(self.mount.req_get(self.mover.mover_id, False)),
851 ]
852 context.conn['XML'].request.assert_has_calls(expected_calls)
855class VDMTestCase(StorageObjectTestCaseBase):
856 def setUp(self):
857 super(VDMTestCase, self).setUp()
858 self.hook = utils.RequestSideEffect()
859 self.ssh_hook = utils.SSHSideEffect()
861 def test_create_vdm(self):
862 self.hook.append(self.mover.resp_get_ref_succeed())
863 self.hook.append(self.vdm.resp_task_succeed())
865 context = self.manager.getStorageContext('VDM')
866 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
868 context.create(self.vdm.vdm_name, self.mover.mover_name)
870 expected_calls = [
871 mock.call(self.mover.req_get_ref()),
872 mock.call(self.vdm.req_create()),
873 ]
874 context.conn['XML'].request.assert_has_calls(expected_calls)
876 def test_create_vdm_but_already_exist(self):
877 self.hook.append(self.mover.resp_get_ref_succeed())
878 self.hook.append(self.vdm.resp_create_but_already_exist())
880 context = self.manager.getStorageContext('VDM')
881 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
883 # Create VDM which already exists.
884 context.create(self.vdm.vdm_name, self.mover.mover_name)
886 expected_calls = [
887 mock.call(self.mover.req_get_ref()),
888 mock.call(self.vdm.req_create()),
889 ]
890 context.conn['XML'].request.assert_has_calls(expected_calls)
892 @mock.patch('time.sleep')
893 def test_create_vdm_invalid_mover_id(self, sleep_mock):
894 self.hook.append(self.mover.resp_get_ref_succeed())
895 self.hook.append(self.vdm.resp_invalid_mover_id())
896 self.hook.append(self.mover.resp_get_ref_succeed())
897 self.hook.append(self.vdm.resp_task_succeed())
899 context = self.manager.getStorageContext('VDM')
900 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
902 # Create VDM with invalid mover ID
903 context.create(self.vdm.vdm_name, self.mover.mover_name)
905 expected_calls = [
906 mock.call(self.mover.req_get_ref()),
907 mock.call(self.vdm.req_create()),
908 mock.call(self.mover.req_get_ref()),
909 mock.call(self.vdm.req_create()),
910 ]
911 context.conn['XML'].request.assert_has_calls(expected_calls)
913 self.assertTrue(sleep_mock.called)
915 def test_create_vdm_with_error(self):
916 self.hook.append(self.mover.resp_get_ref_succeed())
917 self.hook.append(self.vdm.resp_task_error())
919 context = self.manager.getStorageContext('VDM')
920 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
922 # Create VDM with invalid mover ID
923 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
924 context.create,
925 name=self.vdm.vdm_name,
926 mover_name=self.mover.mover_name)
928 expected_calls = [
929 mock.call(self.mover.req_get_ref()),
930 mock.call(self.vdm.req_create()),
931 ]
932 context.conn['XML'].request.assert_has_calls(expected_calls)
934 def test_get_vdm(self):
935 self.hook.append(self.vdm.resp_get_succeed())
937 context = self.manager.getStorageContext('VDM')
938 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
940 status, out = context.get(self.vdm.vdm_name)
941 self.assertEqual(constants.STATUS_OK, status)
942 self.assertIn(self.vdm.vdm_name, context.vdm_map)
943 property_map = [
944 'name',
945 'id',
946 'state',
947 'host_mover_id',
948 'interfaces',
949 ]
950 for prop in property_map:
951 self.assertIn(prop, out)
953 expected_calls = [mock.call(self.vdm.req_get())]
954 context.conn['XML'].request.assert_has_calls(expected_calls)
956 def test_get_vdm_with_error(self):
957 self.hook.append(self.vdm.resp_get_error())
959 context = self.manager.getStorageContext('VDM')
960 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
962 # Get VDM with error
963 status, out = context.get(self.vdm.vdm_name)
964 self.assertEqual(constants.STATUS_ERROR, status)
966 expected_calls = [mock.call(self.vdm.req_get())]
967 context.conn['XML'].request.assert_has_calls(expected_calls)
969 def test_get_vdm_but_not_found(self):
970 self.hook.append(self.vdm.resp_get_without_value())
971 self.hook.append(self.vdm.resp_get_succeed('fake'))
973 context = self.manager.getStorageContext('VDM')
974 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
976 # Get VDM which does not exist
977 status, out = context.get(self.vdm.vdm_name)
978 self.assertEqual(constants.STATUS_NOT_FOUND, status)
980 status, out = context.get(self.vdm.vdm_name)
981 self.assertEqual(constants.STATUS_NOT_FOUND, status)
983 expected_calls = [
984 mock.call(self.vdm.req_get()),
985 mock.call(self.vdm.req_get()),
986 ]
987 context.conn['XML'].request.assert_has_calls(expected_calls)
989 def test_get_vdm_id_with_error(self):
990 self.hook.append(self.vdm.resp_get_error())
992 context = self.manager.getStorageContext('VDM')
993 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
995 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
996 context.get_id,
997 self.vdm.vdm_name)
999 expected_calls = [mock.call(self.vdm.req_get())]
1000 context.conn['XML'].request.assert_has_calls(expected_calls)
1002 def test_delete_vdm(self):
1003 self.hook.append(self.vdm.resp_get_succeed())
1004 self.hook.append(self.vdm.resp_task_succeed())
1006 context = self.manager.getStorageContext('VDM')
1007 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1009 context.delete(self.vdm.vdm_name)
1011 expected_calls = [
1012 mock.call(self.vdm.req_get()),
1013 mock.call(self.vdm.req_delete()),
1014 ]
1015 context.conn['XML'].request.assert_has_calls(expected_calls)
1017 def test_delete_vdm_but_not_found(self):
1018 self.hook.append(self.vdm.resp_get_but_not_found())
1020 context = self.manager.getStorageContext('VDM')
1021 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1023 context.delete(self.vdm.vdm_name)
1025 expected_calls = [mock.call(self.vdm.req_get())]
1026 context.conn['XML'].request.assert_has_calls(expected_calls)
1028 def test_delete_vdm_but_failed_to_get_vdm(self):
1029 self.hook.append(self.vdm.resp_get_error())
1031 context = self.manager.getStorageContext('VDM')
1032 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1034 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1035 context.delete,
1036 self.vdm.vdm_name)
1038 expected_calls = [mock.call(self.vdm.req_get())]
1039 context.conn['XML'].request.assert_has_calls(expected_calls)
1041 def test_delete_vdm_with_error(self):
1042 self.hook.append(self.vdm.resp_get_succeed())
1043 self.hook.append(self.vdm.resp_task_error())
1045 context = self.manager.getStorageContext('VDM')
1046 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1048 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1049 context.delete,
1050 self.vdm.vdm_name)
1052 expected_calls = [
1053 mock.call(self.vdm.req_get()),
1054 mock.call(self.vdm.req_delete()),
1055 ]
1056 context.conn['XML'].request.assert_has_calls(expected_calls)
1058 def test_attach_detach_nfs_interface(self):
1059 self.ssh_hook.append()
1060 self.ssh_hook.append()
1062 context = self.manager.getStorageContext('VDM')
1063 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
1065 context.attach_nfs_interface(self.vdm.vdm_name,
1066 self.mover.interface_name2)
1067 context.detach_nfs_interface(self.vdm.vdm_name,
1068 self.mover.interface_name2)
1070 ssh_calls = [
1071 mock.call(self.vdm.cmd_attach_nfs_interface(), False),
1072 mock.call(self.vdm.cmd_detach_nfs_interface(), True),
1073 ]
1074 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
1076 def test_detach_nfs_interface_with_error(self):
1077 self.ssh_hook.append(ex=processutils.ProcessExecutionError(
1078 stdout=self.vdm.fake_output))
1079 self.ssh_hook.append(self.vdm.output_get_interfaces_vdm(
1080 self.mover.interface_name2))
1081 self.ssh_hook.append(ex=processutils.ProcessExecutionError(
1082 stdout=self.vdm.fake_output))
1083 self.ssh_hook.append(self.vdm.output_get_interfaces_vdm(
1084 nfs_interface=fakes.FakeData.interface_name1))
1086 context = self.manager.getStorageContext('VDM')
1087 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
1089 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1090 context.detach_nfs_interface,
1091 self.vdm.vdm_name,
1092 self.mover.interface_name2)
1094 context.detach_nfs_interface(self.vdm.vdm_name,
1095 self.mover.interface_name2)
1097 ssh_calls = [
1098 mock.call(self.vdm.cmd_detach_nfs_interface(), True),
1099 mock.call(self.vdm.cmd_get_interfaces(), False),
1100 mock.call(self.vdm.cmd_detach_nfs_interface(), True),
1101 mock.call(self.vdm.cmd_get_interfaces(), False),
1102 ]
1103 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
1105 def test_get_cifs_nfs_interface(self):
1106 self.ssh_hook.append(self.vdm.output_get_interfaces_vdm())
1108 context = self.manager.getStorageContext('VDM')
1109 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
1111 interfaces = context.get_interfaces(self.vdm.vdm_name)
1112 self.assertIsNotNone(interfaces['cifs'])
1113 self.assertIsNotNone(interfaces['nfs'])
1115 ssh_calls = [mock.call(self.vdm.cmd_get_interfaces(), False)]
1116 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
1119class StoragePoolTestCase(StorageObjectTestCaseBase):
1120 def setUp(self):
1121 super(StoragePoolTestCase, self).setUp()
1122 self.hook = utils.RequestSideEffect()
1124 def test_get_pool(self):
1125 self.hook.append(self.pool.resp_get_succeed())
1127 context = self.manager.getStorageContext('StoragePool')
1128 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1130 status, out = context.get(self.pool.pool_name)
1131 self.assertEqual(constants.STATUS_OK, status)
1132 self.assertIn(self.pool.pool_name, context.pool_map)
1133 property_map = [
1134 'name',
1135 'movers_id',
1136 'total_size',
1137 'used_size',
1138 'diskType',
1139 'dataServicePolicies',
1140 'id',
1141 ]
1142 for prop in property_map:
1143 self.assertIn(prop, out)
1145 expected_calls = [mock.call(self.pool.req_get())]
1146 context.conn['XML'].request.assert_has_calls(expected_calls)
1148 def test_get_pool_with_error(self):
1149 self.hook.append(self.pool.resp_get_error())
1150 self.hook.append(self.pool.resp_get_without_value())
1151 self.hook.append(self.pool.resp_get_succeed(name='other'))
1153 context = self.manager.getStorageContext('StoragePool')
1154 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1156 status, out = context.get(self.pool.pool_name)
1157 self.assertEqual(constants.STATUS_ERROR, status)
1159 status, out = context.get(self.pool.pool_name)
1160 self.assertEqual(constants.STATUS_NOT_FOUND, status)
1162 status, out = context.get(self.pool.pool_name)
1163 self.assertEqual(constants.STATUS_NOT_FOUND, status)
1165 expected_calls = [
1166 mock.call(self.pool.req_get()),
1167 mock.call(self.pool.req_get()),
1168 mock.call(self.pool.req_get()),
1169 ]
1170 context.conn['XML'].request.assert_has_calls(expected_calls)
1172 def test_get_pool_id_with_error(self):
1173 self.hook.append(self.pool.resp_get_error())
1175 context = self.manager.getStorageContext('StoragePool')
1176 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1178 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1179 context.get_id,
1180 self.pool.pool_name)
1182 expected_calls = [mock.call(self.pool.req_get())]
1183 context.conn['XML'].request.assert_has_calls(expected_calls)
1186class MoverTestCase(StorageObjectTestCaseBase):
1187 def setUp(self):
1188 super(MoverTestCase, self).setUp()
1189 self.hook = utils.RequestSideEffect()
1190 self.ssh_hook = utils.SSHSideEffect()
1192 def test_get_mover(self):
1193 self.hook.append(self.mover.resp_get_ref_succeed())
1194 self.hook.append(self.mover.resp_get_succeed())
1195 self.hook.append(self.mover.resp_get_ref_succeed())
1196 self.hook.append(self.mover.resp_get_succeed())
1198 context = self.manager.getStorageContext('Mover')
1199 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1201 status, out = context.get(self.mover.mover_name)
1202 self.assertEqual(constants.STATUS_OK, status)
1203 self.assertIn(self.mover.mover_name, context.mover_map)
1204 property_map = [
1205 'name',
1206 'id',
1207 'Status',
1208 'version',
1209 'uptime',
1210 'role',
1211 'interfaces',
1212 'devices',
1213 'dns_domain',
1214 ]
1215 for prop in property_map:
1216 self.assertIn(prop, out)
1218 status, out = context.get(self.mover.mover_name)
1219 self.assertEqual(constants.STATUS_OK, status)
1221 status, out = context.get(self.mover.mover_name, True)
1222 self.assertEqual(constants.STATUS_OK, status)
1224 expected_calls = [
1225 mock.call(self.mover.req_get_ref()),
1226 mock.call(self.mover.req_get()),
1227 mock.call(self.mover.req_get_ref()),
1228 mock.call(self.mover.req_get()),
1229 ]
1230 context.conn['XML'].request.assert_has_calls(expected_calls)
1232 def test_get_mover_ref_not_found(self):
1233 self.hook.append(self.mover.resp_get_ref_succeed(name='other'))
1235 context = self.manager.getStorageContext('Mover')
1236 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1238 status, out = context.get_ref(self.mover.mover_name)
1239 self.assertEqual(constants.STATUS_NOT_FOUND, status)
1241 expected_calls = [mock.call(self.mover.req_get_ref())]
1242 context.conn['XML'].request.assert_has_calls(expected_calls)
1244 def test_get_mover_ref_with_error(self):
1245 self.hook.append(self.mover.resp_get_error())
1247 context = self.manager.getStorageContext('Mover')
1248 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1250 status, out = context.get_ref(self.mover.mover_name)
1251 self.assertEqual(constants.STATUS_ERROR, status)
1253 expected_calls = [mock.call(self.mover.req_get_ref())]
1254 context.conn['XML'].request.assert_has_calls(expected_calls)
1256 def test_get_mover_ref_and_mover(self):
1257 self.hook.append(self.mover.resp_get_ref_succeed())
1258 self.hook.append(self.mover.resp_get_succeed())
1260 context = self.manager.getStorageContext('Mover')
1261 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1263 status, out = context.get_ref(self.mover.mover_name)
1264 self.assertEqual(constants.STATUS_OK, status)
1265 property_map = ['name', 'id']
1266 for prop in property_map:
1267 self.assertIn(prop, out)
1269 status, out = context.get(self.mover.mover_name)
1270 self.assertEqual(constants.STATUS_OK, status)
1271 self.assertIn(self.mover.mover_name, context.mover_map)
1272 property_map = [
1273 'name',
1274 'id',
1275 'Status',
1276 'version',
1277 'uptime',
1278 'role',
1279 'interfaces',
1280 'devices',
1281 'dns_domain',
1282 ]
1283 for prop in property_map:
1284 self.assertIn(prop, out)
1286 expected_calls = [
1287 mock.call(self.mover.req_get_ref()),
1288 mock.call(self.mover.req_get()),
1289 ]
1290 context.conn['XML'].request.assert_has_calls(expected_calls)
1292 def test_get_mover_failed_to_get_mover_ref(self):
1293 self.hook.append(self.mover.resp_get_error())
1295 context = self.manager.getStorageContext('Mover')
1296 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1298 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1299 context.get,
1300 self.mover.mover_name)
1302 expected_calls = [mock.call(self.mover.req_get_ref())]
1303 context.conn['XML'].request.assert_has_calls(expected_calls)
1305 def test_get_mover_but_not_found(self):
1306 self.hook.append(self.mover.resp_get_ref_succeed())
1307 self.hook.append(self.mover.resp_get_without_value())
1309 context = self.manager.getStorageContext('Mover')
1310 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1312 status, out = context.get(name=self.mover.mover_name, force=True)
1313 self.assertEqual(constants.STATUS_NOT_FOUND, status)
1315 expected_calls = [
1316 mock.call(self.mover.req_get_ref()),
1317 mock.call(self.mover.req_get()),
1318 ]
1319 context.conn['XML'].request.assert_has_calls(expected_calls)
1321 def test_get_mover_with_error(self):
1322 self.hook.append(self.mover.resp_get_ref_succeed())
1323 self.hook.append(self.mover.resp_get_error())
1325 context = self.manager.getStorageContext('Mover')
1326 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1328 status, out = context.get(self.mover.mover_name)
1329 self.assertEqual(constants.STATUS_ERROR, status)
1331 expected_calls = [
1332 mock.call(self.mover.req_get_ref()),
1333 mock.call(self.mover.req_get()),
1334 ]
1335 context.conn['XML'].request.assert_has_calls(expected_calls)
1337 def test_get_interconnect_id(self):
1338 self.ssh_hook.append(self.mover.output_get_interconnect_id())
1340 context = self.manager.getStorageContext('Mover')
1341 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
1343 conn_id = context.get_interconnect_id(self.mover.mover_name,
1344 self.mover.mover_name)
1345 self.assertEqual(self.mover.interconnect_id, conn_id)
1347 ssh_calls = [mock.call(self.mover.cmd_get_interconnect_id(), False)]
1348 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
1350 def test_get_physical_devices(self):
1351 self.ssh_hook.append(self.mover.output_get_physical_devices())
1353 context = self.manager.getStorageContext('Mover')
1354 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
1356 devices = context.get_physical_devices(self.mover.mover_name)
1357 self.assertIn(self.mover.device_name, devices)
1359 ssh_calls = [mock.call(self.mover.cmd_get_physical_devices(), False)]
1360 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
1363class SnapshotTestCase(StorageObjectTestCaseBase):
1364 def setUp(self):
1365 super(SnapshotTestCase, self).setUp()
1366 self.hook = utils.RequestSideEffect()
1368 def test_create_snapshot(self):
1369 self.hook.append(self.fs.resp_get_succeed())
1370 self.hook.append(self.snap.resp_task_succeed())
1372 context = self.manager.getStorageContext('Snapshot')
1373 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1375 context.create(name=self.snap.snapshot_name,
1376 fs_name=self.fs.filesystem_name,
1377 pool_id=self.pool.pool_id)
1379 expected_calls = [
1380 mock.call(self.fs.req_get()),
1381 mock.call(self.snap.req_create()),
1382 ]
1383 context.conn['XML'].request.assert_has_calls(expected_calls)
1385 def test_create_snapshot_but_already_exist(self):
1386 self.hook.append(self.fs.resp_get_succeed())
1387 self.hook.append(self.snap.resp_create_but_already_exist())
1389 context = self.manager.getStorageContext('Snapshot')
1390 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1392 context.create(name=self.snap.snapshot_name,
1393 fs_name=self.fs.filesystem_name,
1394 pool_id=self.pool.pool_id,
1395 ckpt_size=self.snap.snapshot_size)
1397 expected_calls = [
1398 mock.call(self.fs.req_get()),
1399 mock.call(self.snap.req_create_with_size()),
1400 ]
1401 context.conn['XML'].request.assert_has_calls(expected_calls)
1403 def test_create_snapshot_with_error(self):
1404 self.hook.append(self.fs.resp_get_succeed())
1405 self.hook.append(self.snap.resp_task_error())
1407 context = self.manager.getStorageContext('Snapshot')
1408 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1410 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1411 context.create,
1412 name=self.snap.snapshot_name,
1413 fs_name=self.fs.filesystem_name,
1414 pool_id=self.pool.pool_id,
1415 ckpt_size=self.snap.snapshot_size)
1417 expected_calls = [
1418 mock.call(self.fs.req_get()),
1419 mock.call(self.snap.req_create_with_size()),
1420 ]
1421 context.conn['XML'].request.assert_has_calls(expected_calls)
1423 def test_get_snapshot(self):
1424 self.hook.append(self.snap.resp_get_succeed())
1426 context = self.manager.getStorageContext('Snapshot')
1427 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1429 status, out = context.get(self.snap.snapshot_name)
1430 self.assertEqual(constants.STATUS_OK, status)
1431 self.assertIn(self.snap.snapshot_name, context.snap_map)
1432 property_map = [
1433 'name',
1434 'id',
1435 'checkpointOf',
1436 'state',
1437 ]
1438 for prop in property_map:
1439 self.assertIn(prop, out)
1441 expected_calls = [mock.call(self.snap.req_get())]
1442 context.conn['XML'].request.assert_has_calls(expected_calls)
1444 def test_get_snapshot_but_not_found(self):
1445 self.hook.append(self.snap.resp_get_without_value())
1447 context = self.manager.getStorageContext('Snapshot')
1448 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1450 status, out = context.get(self.snap.snapshot_name)
1451 self.assertEqual(constants.STATUS_NOT_FOUND, status)
1453 expected_calls = [mock.call(self.snap.req_get())]
1454 context.conn['XML'].request.assert_has_calls(expected_calls)
1456 def test_get_snapshot_with_error(self):
1457 self.hook.append(self.snap.resp_get_error())
1459 context = self.manager.getStorageContext('Snapshot')
1460 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1462 status, out = context.get(self.snap.snapshot_name)
1463 self.assertEqual(constants.STATUS_ERROR, status)
1465 expected_calls = [mock.call(self.snap.req_get())]
1466 context.conn['XML'].request.assert_has_calls(expected_calls)
1468 def test_delete_snapshot(self):
1469 self.hook.append(self.snap.resp_get_succeed())
1470 self.hook.append(self.snap.resp_task_succeed())
1472 context = self.manager.getStorageContext('Snapshot')
1473 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1475 context.delete(self.snap.snapshot_name)
1476 self.assertNotIn(self.snap.snapshot_name, context.snap_map)
1478 expected_calls = [
1479 mock.call(self.snap.req_get()),
1480 mock.call(self.snap.req_delete()),
1481 ]
1482 context.conn['XML'].request.assert_has_calls(expected_calls)
1484 def test_delete_snapshot_failed_to_get_snapshot(self):
1485 self.hook.append(self.snap.resp_get_error())
1487 context = self.manager.getStorageContext('Snapshot')
1488 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1490 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1491 context.delete,
1492 self.snap.snapshot_name)
1494 expected_calls = [mock.call(self.snap.req_get())]
1495 context.conn['XML'].request.assert_has_calls(expected_calls)
1497 def test_delete_snapshot_but_not_found(self):
1498 self.hook.append(self.snap.resp_get_without_value())
1500 context = self.manager.getStorageContext('Snapshot')
1501 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1503 context.delete(self.snap.snapshot_name)
1504 self.assertNotIn(self.snap.snapshot_name, context.snap_map)
1506 expected_calls = [mock.call(self.snap.req_get())]
1507 context.conn['XML'].request.assert_has_calls(expected_calls)
1509 def test_delete_snapshot_with_error(self):
1510 self.hook.append(self.snap.resp_get_succeed())
1511 self.hook.append(self.snap.resp_task_error())
1513 context = self.manager.getStorageContext('Snapshot')
1514 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1516 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1517 context.delete,
1518 self.snap.snapshot_name)
1520 expected_calls = [
1521 mock.call(self.snap.req_get()),
1522 mock.call(self.snap.req_delete()),
1523 ]
1524 context.conn['XML'].request.assert_has_calls(expected_calls)
1526 def test_get_snapshot_id(self):
1527 self.hook.append(self.snap.resp_get_succeed())
1529 context = self.manager.getStorageContext('Snapshot')
1530 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1532 id = context.get_id(self.snap.snapshot_name)
1533 self.assertEqual(self.snap.snapshot_id, id)
1535 expected_calls = [mock.call(self.snap.req_get())]
1536 context.conn['XML'].request.assert_has_calls(expected_calls)
1538 def test_get_snapshot_id_with_error(self):
1539 self.hook.append(self.snap.resp_get_error())
1541 context = self.manager.getStorageContext('Snapshot')
1542 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1544 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1545 context.get_id,
1546 self.snap.snapshot_name)
1548 expected_calls = [mock.call(self.snap.req_get())]
1549 context.conn['XML'].request.assert_has_calls(expected_calls)
1552@ddt.ddt
1553class MoverInterfaceTestCase(StorageObjectTestCaseBase):
1554 def setUp(self):
1555 super(MoverInterfaceTestCase, self).setUp()
1556 self.hook = utils.RequestSideEffect()
1558 def test_create_mover_interface(self):
1559 self.hook.append(self.mover.resp_get_ref_succeed())
1560 self.hook.append(self.mover.resp_task_succeed())
1561 self.hook.append(self.mover.resp_task_succeed())
1563 context = self.manager.getStorageContext('MoverInterface')
1564 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1566 interface = {
1567 'name': self.mover.interface_name1,
1568 'device_name': self.mover.device_name,
1569 'ip': self.mover.ip_address1,
1570 'mover_name': self.mover.mover_name,
1571 'net_mask': self.mover.net_mask,
1572 'vlan_id': self.mover.vlan_id,
1573 }
1574 context.create(interface)
1576 interface['name'] = self.mover.long_interface_name
1577 context.create(interface)
1579 expected_calls = [
1580 mock.call(self.mover.req_get_ref()),
1581 mock.call(self.mover.req_create_interface()),
1582 mock.call(self.mover.req_create_interface(
1583 self.mover.long_interface_name[:31])),
1584 ]
1585 context.conn['XML'].request.assert_has_calls(expected_calls)
1587 def test_create_mover_interface_name_already_exist(self):
1588 self.hook.append(self.mover.resp_get_ref_succeed())
1589 self.hook.append(
1590 self.mover.resp_create_interface_but_name_already_exist())
1592 context = self.manager.getStorageContext('MoverInterface')
1593 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1595 interface = {
1596 'name': self.mover.interface_name1,
1597 'device_name': self.mover.device_name,
1598 'ip': self.mover.ip_address1,
1599 'mover_name': self.mover.mover_name,
1600 'net_mask': self.mover.net_mask,
1601 'vlan_id': self.mover.vlan_id,
1602 }
1603 context.create(interface)
1605 expected_calls = [
1606 mock.call(self.mover.req_get_ref()),
1607 mock.call(self.mover.req_create_interface()),
1608 ]
1609 context.conn['XML'].request.assert_has_calls(expected_calls)
1611 def test_create_mover_interface_ip_already_exist(self):
1612 self.hook.append(self.mover.resp_get_ref_succeed())
1613 self.hook.append(
1614 self.mover.resp_create_interface_but_ip_already_exist())
1616 context = self.manager.getStorageContext('MoverInterface')
1617 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1619 interface = {
1620 'name': self.mover.interface_name1,
1621 'device_name': self.mover.device_name,
1622 'ip': self.mover.ip_address1,
1623 'mover_name': self.mover.mover_name,
1624 'net_mask': self.mover.net_mask,
1625 'vlan_id': self.mover.vlan_id,
1626 }
1627 context.create(interface)
1629 expected_calls = [
1630 mock.call(self.mover.req_get_ref()),
1631 mock.call(self.mover.req_create_interface()),
1632 ]
1633 context.conn['XML'].request.assert_has_calls(expected_calls)
1635 @ddt.data(fakes.MoverTestData().resp_task_succeed(),
1636 fakes.MoverTestData().resp_task_error())
1637 def test_create_mover_interface_with_conflict_vlan_id(self, xml_resp):
1638 self.hook.append(self.mover.resp_get_ref_succeed())
1639 self.hook.append(
1640 self.mover.resp_create_interface_with_conflicted_vlan_id())
1641 self.hook.append(xml_resp)
1643 context = self.manager.getStorageContext('MoverInterface')
1644 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1646 interface = {
1647 'name': self.mover.interface_name1,
1648 'device_name': self.mover.device_name,
1649 'ip': self.mover.ip_address1,
1650 'mover_name': self.mover.mover_name,
1651 'net_mask': self.mover.net_mask,
1652 'vlan_id': self.mover.vlan_id,
1653 }
1654 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1655 context.create,
1656 interface)
1658 expected_calls = [
1659 mock.call(self.mover.req_get_ref()),
1660 mock.call(self.mover.req_create_interface()),
1661 mock.call(self.mover.req_delete_interface()),
1662 ]
1663 context.conn['XML'].request.assert_has_calls(expected_calls)
1665 @mock.patch('time.sleep')
1666 def test_create_mover_interface_invalid_mover_id(self, sleep_mock):
1667 self.hook.append(self.mover.resp_get_ref_succeed())
1668 self.hook.append(self.mover.resp_invalid_mover_id())
1669 self.hook.append(self.mover.resp_get_ref_succeed())
1670 self.hook.append(self.mover.resp_task_succeed())
1672 context = self.manager.getStorageContext('MoverInterface')
1673 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1675 interface = {
1676 'name': self.mover.interface_name1,
1677 'device_name': self.mover.device_name,
1678 'ip': self.mover.ip_address1,
1679 'mover_name': self.mover.mover_name,
1680 'net_mask': self.mover.net_mask,
1681 'vlan_id': self.mover.vlan_id,
1682 }
1683 context.create(interface)
1685 expected_calls = [
1686 mock.call(self.mover.req_get_ref()),
1687 mock.call(self.mover.req_create_interface()),
1688 mock.call(self.mover.req_get_ref()),
1689 mock.call(self.mover.req_create_interface()),
1690 ]
1691 context.conn['XML'].request.assert_has_calls(expected_calls)
1693 self.assertTrue(sleep_mock.called)
1695 def test_create_mover_interface_with_error(self):
1696 self.hook.append(self.mover.resp_get_ref_succeed())
1697 self.hook.append(self.mover.resp_task_error())
1699 context = self.manager.getStorageContext('MoverInterface')
1700 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1702 interface = {
1703 'name': self.mover.interface_name1,
1704 'device_name': self.mover.device_name,
1705 'ip': self.mover.ip_address1,
1706 'mover_name': self.mover.mover_name,
1707 'net_mask': self.mover.net_mask,
1708 'vlan_id': self.mover.vlan_id,
1709 }
1710 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1711 context.create,
1712 interface)
1714 expected_calls = [
1715 mock.call(self.mover.req_get_ref()),
1716 mock.call(self.mover.req_create_interface()),
1717 ]
1718 context.conn['XML'].request.assert_has_calls(expected_calls)
1720 def test_get_mover_interface(self):
1721 self.hook.append(self.mover.resp_get_ref_succeed())
1722 self.hook.append(self.mover.resp_get_succeed())
1723 self.hook.append(self.mover.resp_get_ref_succeed())
1724 self.hook.append(self.mover.resp_get_succeed())
1726 context = self.manager.getStorageContext('MoverInterface')
1727 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1729 status, out = context.get(name=self.mover.interface_name1,
1730 mover_name=self.mover.mover_name)
1731 self.assertEqual(constants.STATUS_OK, status)
1732 property_map = [
1733 'name',
1734 'device',
1735 'up',
1736 'ipVersion',
1737 'netMask',
1738 'ipAddress',
1739 'vlanid',
1740 ]
1741 for prop in property_map:
1742 self.assertIn(prop, out)
1744 context.get(name=self.mover.long_interface_name,
1745 mover_name=self.mover.mover_name)
1747 expected_calls = [
1748 mock.call(self.mover.req_get_ref()),
1749 mock.call(self.mover.req_get()),
1750 mock.call(self.mover.req_get_ref()),
1751 mock.call(self.mover.req_get()),
1752 ]
1753 context.conn['XML'].request.assert_has_calls(expected_calls)
1755 def test_get_mover_interface_not_found(self):
1756 self.hook.append(self.mover.resp_get_ref_succeed())
1757 self.hook.append(self.mover.resp_get_without_value())
1759 context = self.manager.getStorageContext('MoverInterface')
1760 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1762 status, out = context.get(name=self.mover.interface_name1,
1763 mover_name=self.mover.mover_name)
1764 self.assertEqual(constants.STATUS_NOT_FOUND, status)
1766 expected_calls = [
1767 mock.call(self.mover.req_get_ref()),
1768 mock.call(self.mover.req_get()),
1769 ]
1770 context.conn['XML'].request.assert_has_calls(expected_calls)
1772 def test_delete_mover_interface(self):
1773 self.hook.append(self.mover.resp_get_ref_succeed())
1774 self.hook.append(self.mover.resp_task_succeed())
1776 context = self.manager.getStorageContext('MoverInterface')
1777 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1779 context.delete(ip_addr=self.mover.ip_address1,
1780 mover_name=self.mover.mover_name)
1782 expected_calls = [
1783 mock.call(self.mover.req_get_ref()),
1784 mock.call(self.mover.req_delete_interface()),
1785 ]
1786 context.conn['XML'].request.assert_has_calls(expected_calls)
1788 def test_delete_mover_interface_but_nonexistent(self):
1789 self.hook.append(self.mover.resp_get_ref_succeed())
1790 self.hook.append(self.mover.resp_delete_interface_but_nonexistent())
1792 context = self.manager.getStorageContext('MoverInterface')
1793 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1795 context.delete(ip_addr=self.mover.ip_address1,
1796 mover_name=self.mover.mover_name)
1798 expected_calls = [
1799 mock.call(self.mover.req_get_ref()),
1800 mock.call(self.mover.req_delete_interface()),
1801 ]
1802 context.conn['XML'].request.assert_has_calls(expected_calls)
1804 @mock.patch('time.sleep')
1805 def test_delete_mover_interface_invalid_mover_id(self, sleep_mock):
1806 self.hook.append(self.mover.resp_get_ref_succeed())
1807 self.hook.append(self.mover.resp_invalid_mover_id())
1808 self.hook.append(self.mover.resp_get_ref_succeed())
1809 self.hook.append(self.mover.resp_task_succeed())
1811 context = self.manager.getStorageContext('MoverInterface')
1812 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1814 context.delete(ip_addr=self.mover.ip_address1,
1815 mover_name=self.mover.mover_name)
1817 expected_calls = [
1818 mock.call(self.mover.req_get_ref()),
1819 mock.call(self.mover.req_delete_interface()),
1820 mock.call(self.mover.req_get_ref()),
1821 mock.call(self.mover.req_delete_interface()),
1822 ]
1823 context.conn['XML'].request.assert_has_calls(expected_calls)
1825 self.assertTrue(sleep_mock.called)
1827 def test_delete_mover_interface_with_error(self):
1828 self.hook.append(self.mover.resp_get_ref_succeed())
1829 self.hook.append(self.mover.resp_task_error())
1831 context = self.manager.getStorageContext('MoverInterface')
1832 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1834 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1835 context.delete,
1836 ip_addr=self.mover.ip_address1,
1837 mover_name=self.mover.mover_name)
1839 expected_calls = [
1840 mock.call(self.mover.req_get_ref()),
1841 mock.call(self.mover.req_delete_interface()),
1842 ]
1843 context.conn['XML'].request.assert_has_calls(expected_calls)
1846class DNSDomainTestCase(StorageObjectTestCaseBase):
1847 def setUp(self):
1848 super(DNSDomainTestCase, self).setUp()
1849 self.hook = utils.RequestSideEffect()
1851 def test_create_dns_domain(self):
1852 self.hook.append(self.mover.resp_get_ref_succeed())
1853 self.hook.append(self.dns.resp_task_succeed())
1855 context = self.manager.getStorageContext('DNSDomain')
1856 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1858 context.create(mover_name=self.mover.mover_name,
1859 name=self.dns.domain_name,
1860 servers=self.dns.dns_ip_address)
1862 expected_calls = [
1863 mock.call(self.mover.req_get_ref()),
1864 mock.call(self.dns.req_create()),
1865 ]
1866 context.conn['XML'].request.assert_has_calls(expected_calls)
1868 @mock.patch('time.sleep')
1869 def test_create_dns_domain_invalid_mover_id(self, sleep_mock):
1870 self.hook.append(self.mover.resp_get_ref_succeed())
1871 self.hook.append(self.dns.resp_invalid_mover_id())
1872 self.hook.append(self.mover.resp_get_ref_succeed())
1873 self.hook.append(self.dns.resp_task_succeed())
1875 context = self.manager.getStorageContext('DNSDomain')
1876 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1878 context.create(mover_name=self.mover.mover_name,
1879 name=self.dns.domain_name,
1880 servers=self.dns.dns_ip_address)
1882 expected_calls = [
1883 mock.call(self.mover.req_get_ref()),
1884 mock.call(self.dns.req_create()),
1885 mock.call(self.mover.req_get_ref()),
1886 mock.call(self.dns.req_create()),
1887 ]
1888 context.conn['XML'].request.assert_has_calls(expected_calls)
1890 self.assertTrue(sleep_mock.called)
1892 def test_create_dns_domain_with_error(self):
1893 self.hook.append(self.mover.resp_get_ref_succeed())
1894 self.hook.append(self.dns.resp_task_error())
1896 context = self.manager.getStorageContext('DNSDomain')
1897 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1899 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
1900 context.create,
1901 mover_name=self.mover.mover_name,
1902 name=self.mover.domain_name,
1903 servers=self.dns.dns_ip_address)
1905 expected_calls = [
1906 mock.call(self.mover.req_get_ref()),
1907 mock.call(self.dns.req_create()),
1908 ]
1909 context.conn['XML'].request.assert_has_calls(expected_calls)
1911 def test_delete_dns_domain(self):
1912 self.hook.append(self.mover.resp_get_ref_succeed())
1913 self.hook.append(self.dns.resp_task_succeed())
1914 self.hook.append(self.dns.resp_task_error())
1916 context = self.manager.getStorageContext('DNSDomain')
1917 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1919 context.delete(mover_name=self.mover.mover_name,
1920 name=self.mover.domain_name)
1922 context.delete(mover_name=self.mover.mover_name,
1923 name=self.mover.domain_name)
1925 expected_calls = [
1926 mock.call(self.mover.req_get_ref()),
1927 mock.call(self.dns.req_delete()),
1928 mock.call(self.dns.req_delete()),
1929 ]
1930 context.conn['XML'].request.assert_has_calls(expected_calls)
1932 @mock.patch('time.sleep')
1933 def test_delete_dns_domain_invalid_mover_id(self, sleep_mock):
1934 self.hook.append(self.mover.resp_get_ref_succeed())
1935 self.hook.append(self.dns.resp_invalid_mover_id())
1936 self.hook.append(self.mover.resp_get_ref_succeed())
1937 self.hook.append(self.dns.resp_task_succeed())
1939 context = self.manager.getStorageContext('DNSDomain')
1940 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1942 context.delete(mover_name=self.mover.mover_name,
1943 name=self.mover.domain_name)
1945 expected_calls = [
1946 mock.call(self.mover.req_get_ref()),
1947 mock.call(self.dns.req_delete()),
1948 mock.call(self.mover.req_get_ref()),
1949 mock.call(self.dns.req_delete()),
1950 ]
1951 context.conn['XML'].request.assert_has_calls(expected_calls)
1953 self.assertTrue(sleep_mock.called)
1956class CIFSServerTestCase(StorageObjectTestCaseBase):
1957 def setUp(self):
1958 super(CIFSServerTestCase, self).setUp()
1959 self.hook = utils.RequestSideEffect()
1961 def test_create_cifs_server(self):
1962 self.hook.append(self.mover.resp_get_ref_succeed())
1963 self.hook.append(self.cifs_server.resp_task_succeed())
1964 self.hook.append(self.vdm.resp_get_succeed())
1965 self.hook.append(self.cifs_server.resp_task_succeed())
1966 self.hook.append(self.cifs_server.resp_task_error())
1967 self.hook.append(self.cifs_server.resp_get_succeed(
1968 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=True))
1970 context = self.manager.getStorageContext('CIFSServer')
1971 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
1973 # Create CIFS server on mover
1974 cifs_server_args = {
1975 'name': self.cifs_server.cifs_server_name,
1976 'interface_ip': self.cifs_server.ip_address1,
1977 'domain_name': self.cifs_server.domain_name,
1978 'user_name': self.cifs_server.domain_user,
1979 'password': self.cifs_server.domain_password,
1980 'mover_name': self.mover.mover_name,
1981 'is_vdm': False,
1982 }
1983 context.create(cifs_server_args)
1985 # Create CIFS server on VDM
1986 cifs_server_args = {
1987 'name': self.cifs_server.cifs_server_name,
1988 'interface_ip': self.cifs_server.ip_address1,
1989 'domain_name': self.cifs_server.domain_name,
1990 'user_name': self.cifs_server.domain_user,
1991 'password': self.cifs_server.domain_password,
1992 'mover_name': self.vdm.vdm_name,
1993 'is_vdm': True,
1994 }
1995 context.create(cifs_server_args)
1997 # Create CIFS server on VDM
1998 cifs_server_args = {
1999 'name': self.cifs_server.cifs_server_name,
2000 'interface_ip': self.cifs_server.ip_address1,
2001 'domain_name': self.cifs_server.domain_name,
2002 'user_name': self.cifs_server.domain_user,
2003 'password': self.cifs_server.domain_password,
2004 'mover_name': self.vdm.vdm_name,
2005 'is_vdm': True,
2006 }
2007 context.create(cifs_server_args)
2009 expected_calls = [
2010 mock.call(self.mover.req_get_ref()),
2011 mock.call(self.cifs_server.req_create(self.mover.mover_id, False)),
2012 mock.call(self.vdm.req_get()),
2013 mock.call(self.cifs_server.req_create(self.vdm.vdm_id)),
2014 mock.call(self.cifs_server.req_create(self.vdm.vdm_id)),
2015 mock.call(self.cifs_server.req_get(self.vdm.vdm_id)),
2016 ]
2017 context.conn['XML'].request.assert_has_calls(expected_calls)
2019 def test_create_cifs_server_already_exist(self):
2020 self.hook.append(self.vdm.resp_get_succeed())
2021 self.hook.append(self.cifs_server.resp_task_error())
2022 self.hook.append(self.cifs_server.resp_get_succeed(
2023 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=True))
2025 context = self.manager.getStorageContext('CIFSServer')
2026 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2028 @mock.patch('time.sleep')
2029 def test_create_cifs_server_invalid_mover_id(self, sleep_mock):
2030 self.hook.append(self.mover.resp_get_ref_succeed())
2031 self.hook.append(self.cifs_server.resp_invalid_mover_id())
2032 self.hook.append(self.mover.resp_get_ref_succeed())
2033 self.hook.append(self.cifs_server.resp_task_succeed())
2035 context = self.manager.getStorageContext('CIFSServer')
2036 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2038 # Create CIFS server on mover
2039 cifs_server_args = {
2040 'name': self.cifs_server.cifs_server_name,
2041 'interface_ip': self.cifs_server.ip_address1,
2042 'domain_name': self.cifs_server.domain_name,
2043 'user_name': self.cifs_server.domain_user,
2044 'password': self.cifs_server.domain_password,
2045 'mover_name': self.mover.mover_name,
2046 'is_vdm': False,
2047 }
2048 context.create(cifs_server_args)
2050 expected_calls = [
2051 mock.call(self.mover.req_get_ref()),
2052 mock.call(self.cifs_server.req_create(self.mover.mover_id, False)),
2053 mock.call(self.mover.req_get_ref()),
2054 mock.call(self.cifs_server.req_create(self.mover.mover_id, False)),
2055 ]
2056 context.conn['XML'].request.assert_has_calls(expected_calls)
2058 self.assertTrue(sleep_mock.called)
2060 def test_create_cifs_server_with_error(self):
2061 self.hook.append(self.vdm.resp_get_succeed())
2062 self.hook.append(self.cifs_server.resp_task_error())
2063 self.hook.append(self.cifs_server.resp_get_error())
2065 context = self.manager.getStorageContext('CIFSServer')
2066 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2068 # Create CIFS server on VDM
2069 cifs_server_args = {
2070 'name': self.cifs_server.cifs_server_name,
2071 'interface_ip': self.cifs_server.ip_address1,
2072 'domain_name': self.cifs_server.domain_name,
2073 'user_name': self.cifs_server.domain_user,
2074 'password': self.cifs_server.domain_password,
2075 'mover_name': self.vdm.vdm_name,
2076 'is_vdm': True,
2077 }
2078 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2079 context.create,
2080 cifs_server_args)
2082 expected_calls = [
2083 mock.call(self.vdm.req_get()),
2084 mock.call(self.cifs_server.req_create(self.vdm.vdm_id)),
2085 mock.call(self.cifs_server.req_get(self.vdm.vdm_id)),
2086 ]
2087 context.conn['XML'].request.assert_has_calls(expected_calls)
2089 def test_get_all_cifs_server(self):
2090 self.hook.append(self.vdm.resp_get_succeed())
2091 self.hook.append(self.cifs_server.resp_get_succeed(
2092 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=True))
2093 self.hook.append(self.cifs_server.resp_get_succeed(
2094 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=True))
2096 context = self.manager.getStorageContext('CIFSServer')
2097 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2099 status, out = context.get_all(self.vdm.vdm_name)
2100 self.assertEqual(constants.STATUS_OK, status)
2101 self.assertIn(self.vdm.vdm_name, context.cifs_server_map)
2103 # Get CIFS server from the cache
2104 status, out = context.get_all(self.vdm.vdm_name)
2105 self.assertEqual(constants.STATUS_OK, status)
2106 self.assertIn(self.vdm.vdm_name, context.cifs_server_map)
2108 expected_calls = [
2109 mock.call(self.vdm.req_get()),
2110 mock.call(self.cifs_server.req_get(self.vdm.vdm_id)),
2111 mock.call(self.cifs_server.req_get(self.vdm.vdm_id)),
2112 ]
2113 context.conn['XML'].request.assert_has_calls(expected_calls)
2115 @mock.patch('time.sleep')
2116 def test_get_all_cifs_server_invalid_mover_id(self, sleep_mock):
2117 self.hook.append(self.mover.resp_get_ref_succeed())
2118 self.hook.append(self.cifs_server.resp_invalid_mover_id())
2119 self.hook.append(self.mover.resp_get_ref_succeed())
2120 self.hook.append(self.cifs_server.resp_get_succeed(
2121 mover_id=self.mover.mover_id, is_vdm=False, join_domain=True))
2123 context = self.manager.getStorageContext('CIFSServer')
2124 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2126 status, out = context.get_all(self.mover.mover_name, False)
2127 self.assertEqual(constants.STATUS_OK, status)
2128 self.assertIn(self.mover.mover_name, context.cifs_server_map)
2130 expected_calls = [
2131 mock.call(self.mover.req_get_ref()),
2132 mock.call(self.cifs_server.req_get(self.mover.mover_id, False)),
2133 mock.call(self.mover.req_get_ref()),
2134 mock.call(self.cifs_server.req_get(self.mover.mover_id, False)),
2135 ]
2136 context.conn['XML'].request.assert_has_calls(expected_calls)
2138 self.assertTrue(sleep_mock.called)
2140 def test_get_cifs_server(self):
2141 self.hook.append(self.vdm.resp_get_succeed())
2142 self.hook.append(self.cifs_server.resp_get_succeed(
2143 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=True))
2145 context = self.manager.getStorageContext('CIFSServer')
2146 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2148 status, out = context.get(name=self.cifs_server.cifs_server_name,
2149 mover_name=self.vdm.vdm_name)
2150 self.assertEqual(constants.STATUS_OK, status)
2151 property_map = {
2152 'name',
2153 'compName',
2154 'Aliases',
2155 'type',
2156 'interfaces',
2157 'domain',
2158 'domainJoined',
2159 'mover',
2160 'moverIdIsVdm',
2161 }
2162 for prop in property_map:
2163 self.assertIn(prop, out)
2165 context.get(name=self.cifs_server.cifs_server_name,
2166 mover_name=self.vdm.vdm_name)
2168 expected_calls = [
2169 mock.call(self.vdm.req_get()),
2170 mock.call(self.cifs_server.req_get(self.vdm.vdm_id)),
2171 ]
2172 context.conn['XML'].request.assert_has_calls(expected_calls)
2174 def test_modify_cifs_server(self):
2175 self.hook.append(self.mover.resp_get_ref_succeed())
2176 self.hook.append(self.cifs_server.resp_task_succeed())
2177 self.hook.append(self.vdm.resp_get_succeed())
2178 self.hook.append(self.cifs_server.resp_task_succeed())
2180 context = self.manager.getStorageContext('CIFSServer')
2181 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2183 cifs_server_args = {
2184 'name': self.cifs_server.cifs_server_name[-14:],
2185 'join_domain': True,
2186 'user_name': self.cifs_server.domain_user,
2187 'password': self.cifs_server.domain_password,
2188 'mover_name': self.mover.mover_name,
2189 'is_vdm': False,
2190 }
2191 context.modify(cifs_server_args)
2193 cifs_server_args = {
2194 'name': self.cifs_server.cifs_server_name[-14:],
2195 'join_domain': False,
2196 'user_name': self.cifs_server.domain_user,
2197 'password': self.cifs_server.domain_password,
2198 'mover_name': self.vdm.vdm_name,
2199 }
2200 context.modify(cifs_server_args)
2202 expected_calls = [
2203 mock.call(self.mover.req_get_ref()),
2204 mock.call(self.cifs_server.req_modify(
2205 mover_id=self.mover.mover_id, is_vdm=False, join_domain=True)),
2206 mock.call(self.vdm.req_get()),
2207 mock.call(self.cifs_server.req_modify(
2208 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=False)),
2209 ]
2210 context.conn['XML'].request.assert_has_calls(expected_calls)
2212 def test_modify_cifs_server_but_unjoin_domain(self):
2213 self.hook.append(self.vdm.resp_get_succeed())
2214 self.hook.append(self.cifs_server.resp_modify_but_unjoin_domain())
2216 context = self.manager.getStorageContext('CIFSServer')
2217 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2219 cifs_server_args = {
2220 'name': self.cifs_server.cifs_server_name[-14:],
2221 'join_domain': False,
2222 'user_name': self.cifs_server.domain_user,
2223 'password': self.cifs_server.domain_password,
2224 'mover_name': self.vdm.vdm_name,
2225 }
2227 context.modify(cifs_server_args)
2229 expected_calls = [
2230 mock.call(self.vdm.req_get()),
2231 mock.call(self.cifs_server.req_modify(
2232 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=False)),
2233 ]
2234 context.conn['XML'].request.assert_has_calls(expected_calls)
2236 def test_modify_cifs_server_but_already_join_domain(self):
2237 self.hook.append(self.vdm.resp_get_succeed())
2238 self.hook.append(
2239 self.cifs_server.resp_modify_but_already_join_domain())
2241 context = self.manager.getStorageContext('CIFSServer')
2242 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2244 cifs_server_args = {
2245 'name': self.cifs_server.cifs_server_name[-14:],
2246 'join_domain': True,
2247 'user_name': self.cifs_server.domain_user,
2248 'password': self.cifs_server.domain_password,
2249 'mover_name': self.vdm.vdm_name,
2250 }
2252 context.modify(cifs_server_args)
2254 expected_calls = [
2255 mock.call(self.vdm.req_get()),
2256 mock.call(self.cifs_server.req_modify(
2257 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=True)),
2258 ]
2259 context.conn['XML'].request.assert_has_calls(expected_calls)
2261 @mock.patch('time.sleep')
2262 def test_modify_cifs_server_invalid_mover_id(self, sleep_mock):
2263 self.hook.append(self.mover.resp_get_ref_succeed())
2264 self.hook.append(self.cifs_server.resp_invalid_mover_id())
2265 self.hook.append(self.mover.resp_get_ref_succeed())
2266 self.hook.append(self.cifs_server.resp_task_succeed())
2268 context = self.manager.getStorageContext('CIFSServer')
2269 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2271 cifs_server_args = {
2272 'name': self.cifs_server.cifs_server_name[-14:],
2273 'join_domain': True,
2274 'user_name': self.cifs_server.domain_user,
2275 'password': self.cifs_server.domain_password,
2276 'mover_name': self.mover.mover_name,
2277 'is_vdm': False,
2278 }
2279 context.modify(cifs_server_args)
2281 expected_calls = [
2282 mock.call(self.mover.req_get_ref()),
2283 mock.call(self.cifs_server.req_modify(
2284 mover_id=self.mover.mover_id, is_vdm=False, join_domain=True)),
2285 mock.call(self.mover.req_get_ref()),
2286 mock.call(self.cifs_server.req_modify(
2287 mover_id=self.mover.mover_id, is_vdm=False, join_domain=True)),
2288 ]
2289 context.conn['XML'].request.assert_has_calls(expected_calls)
2291 self.assertTrue(sleep_mock.called)
2293 def test_modify_cifs_server_with_error(self):
2294 self.hook.append(self.vdm.resp_get_succeed())
2295 self.hook.append(self.cifs_server.resp_task_error())
2297 context = self.manager.getStorageContext('CIFSServer')
2298 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2300 cifs_server_args = {
2301 'name': self.cifs_server.cifs_server_name[-14:],
2302 'join_domain': False,
2303 'user_name': self.cifs_server.domain_user,
2304 'password': self.cifs_server.domain_password,
2305 'mover_name': self.vdm.vdm_name,
2306 }
2307 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2308 context.modify,
2309 cifs_server_args)
2311 expected_calls = [
2312 mock.call(self.vdm.req_get()),
2313 mock.call(self.cifs_server.req_modify(
2314 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=False)),
2315 ]
2316 context.conn['XML'].request.assert_has_calls(expected_calls)
2318 def test_delete_cifs_server(self):
2319 self.hook.append(self.mover.resp_get_ref_succeed())
2320 self.hook.append(self.cifs_server.resp_get_succeed(
2321 mover_id=self.mover.mover_id, is_vdm=False, join_domain=True))
2322 self.hook.append(self.cifs_server.resp_task_succeed())
2323 self.hook.append(self.vdm.resp_get_succeed())
2324 self.hook.append(self.cifs_server.resp_get_succeed(
2325 mover_id=self.vdm.vdm_id, is_vdm=True, join_domain=False))
2326 self.hook.append(self.cifs_server.resp_task_succeed())
2328 context = self.manager.getStorageContext('CIFSServer')
2329 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2331 context.delete(computer_name=self.cifs_server.cifs_server_name,
2332 mover_name=self.mover.mover_name,
2333 is_vdm=False)
2335 context.delete(computer_name=self.cifs_server.cifs_server_name,
2336 mover_name=self.vdm.vdm_name)
2338 expected_calls = [
2339 mock.call(self.mover.req_get_ref()),
2340 mock.call(self.cifs_server.req_get(self.mover.mover_id, False)),
2341 mock.call(self.cifs_server.req_delete(self.mover.mover_id, False)),
2342 mock.call(self.vdm.req_get()),
2343 mock.call(self.cifs_server.req_get(self.vdm.vdm_id)),
2344 mock.call(self.cifs_server.req_delete(self.vdm.vdm_id)),
2345 ]
2346 context.conn['XML'].request.assert_has_calls(expected_calls)
2348 def test_delete_cifs_server_but_not_found(self):
2349 self.hook.append(self.mover.resp_get_without_value())
2350 self.hook.append(self.mover.resp_get_ref_succeed())
2351 self.hook.append(self.cifs_server.resp_get_without_value())
2353 context = self.manager.getStorageContext('CIFSServer')
2354 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2356 context.delete(computer_name=self.cifs_server.cifs_server_name,
2357 mover_name=self.mover.mover_name,
2358 is_vdm=False)
2360 context.delete(computer_name=self.cifs_server.cifs_server_name,
2361 mover_name=self.mover.mover_name,
2362 is_vdm=False)
2364 expected_calls = [
2365 mock.call(self.mover.req_get_ref()),
2366 mock.call(self.mover.req_get_ref()),
2367 mock.call(self.cifs_server.req_get(self.mover.mover_id, False)),
2368 ]
2369 context.conn['XML'].request.assert_has_calls(expected_calls)
2371 def test_delete_cifs_server_with_error(self):
2372 self.hook.append(self.mover.resp_get_ref_succeed())
2373 self.hook.append(self.cifs_server.resp_get_succeed(
2374 mover_id=self.mover.mover_id, is_vdm=False, join_domain=True))
2375 self.hook.append(self.cifs_server.resp_task_error())
2377 context = self.manager.getStorageContext('CIFSServer')
2378 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2380 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2381 context.delete,
2382 computer_name=self.cifs_server.cifs_server_name,
2383 mover_name=self.mover.mover_name,
2384 is_vdm=False)
2386 expected_calls = [
2387 mock.call(self.mover.req_get_ref()),
2388 mock.call(self.cifs_server.req_get(self.mover.mover_id, False)),
2389 mock.call(self.cifs_server.req_delete(self.mover.mover_id, False)),
2390 ]
2391 context.conn['XML'].request.assert_has_calls(expected_calls)
2394class CIFSShareTestCase(StorageObjectTestCaseBase):
2395 def setUp(self):
2396 super(CIFSShareTestCase, self).setUp()
2397 self.hook = utils.RequestSideEffect()
2398 self.ssh_hook = utils.SSHSideEffect()
2400 def test_create_cifs_share(self):
2401 self.hook.append(self.vdm.resp_get_succeed())
2402 self.hook.append(self.cifs_share.resp_task_succeed())
2403 self.hook.append(self.mover.resp_get_ref_succeed())
2404 self.hook.append(self.cifs_share.resp_task_succeed())
2406 context = self.manager.getStorageContext('CIFSShare')
2407 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2409 context.create(name=self.cifs_share.share_name,
2410 server_name=self.cifs_share.cifs_server_name[-14:],
2411 mover_name=self.vdm.vdm_name,
2412 is_vdm=True)
2414 context.create(name=self.cifs_share.share_name,
2415 server_name=self.cifs_share.cifs_server_name[-14:],
2416 mover_name=self.mover.mover_name,
2417 is_vdm=False)
2419 expected_calls = [
2420 mock.call(self.vdm.req_get()),
2421 mock.call(self.cifs_share.req_create(self.vdm.vdm_id)),
2422 mock.call(self.mover.req_get_ref()),
2423 mock.call(self.cifs_share.req_create(self.mover.mover_id, False)),
2424 ]
2425 context.conn['XML'].request.assert_has_calls(expected_calls)
2427 @mock.patch('time.sleep')
2428 def test_create_cifs_share_invalid_mover_id(self, sleep_mock):
2429 self.hook.append(self.mover.resp_get_ref_succeed())
2430 self.hook.append(self.cifs_share.resp_invalid_mover_id())
2431 self.hook.append(self.mover.resp_get_ref_succeed())
2432 self.hook.append(self.cifs_share.resp_task_succeed())
2434 context = self.manager.getStorageContext('CIFSShare')
2435 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2437 context.create(name=self.cifs_share.share_name,
2438 server_name=self.cifs_share.cifs_server_name[-14:],
2439 mover_name=self.mover.mover_name,
2440 is_vdm=False)
2442 expected_calls = [
2443 mock.call(self.mover.req_get_ref()),
2444 mock.call(self.cifs_share.req_create(self.mover.mover_id, False)),
2445 mock.call(self.mover.req_get_ref()),
2446 mock.call(self.cifs_share.req_create(self.mover.mover_id, False)),
2447 ]
2448 context.conn['XML'].request.assert_has_calls(expected_calls)
2450 self.assertTrue(sleep_mock.called)
2452 def test_create_cifs_share_with_error(self):
2453 self.hook.append(self.vdm.resp_get_succeed())
2454 self.hook.append(self.cifs_share.resp_task_error())
2456 context = self.manager.getStorageContext('CIFSShare')
2457 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2459 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2460 context.create,
2461 name=self.cifs_share.share_name,
2462 server_name=self.cifs_share.cifs_server_name[-14:],
2463 mover_name=self.vdm.vdm_name,
2464 is_vdm=True)
2466 expected_calls = [
2467 mock.call(self.vdm.req_get()),
2468 mock.call(self.cifs_share.req_create(self.vdm.vdm_id)),
2469 ]
2470 context.conn['XML'].request.assert_has_calls(expected_calls)
2472 def test_delete_cifs_share(self):
2473 self.hook.append(self.cifs_share.resp_get_succeed(self.vdm.vdm_id))
2474 self.hook.append(self.vdm.resp_get_succeed())
2475 self.hook.append(self.cifs_share.resp_task_succeed())
2476 self.hook.append(self.cifs_share.resp_get_succeed(self.mover.mover_id,
2477 False))
2478 self.hook.append(self.mover.resp_get_ref_succeed())
2479 self.hook.append(self.cifs_share.resp_task_succeed())
2481 context = self.manager.getStorageContext('CIFSShare')
2482 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2484 context.delete(name=self.cifs_share.share_name,
2485 mover_name=self.vdm.vdm_name,
2486 is_vdm=True)
2488 context.delete(name=self.cifs_share.share_name,
2489 mover_name=self.mover.mover_name,
2490 is_vdm=False)
2492 expected_calls = [
2493 mock.call(self.cifs_share.req_get()),
2494 mock.call(self.vdm.req_get()),
2495 mock.call(self.cifs_share.req_delete(self.vdm.vdm_id)),
2496 mock.call(self.cifs_share.req_get()),
2497 mock.call(self.mover.req_get_ref()),
2498 mock.call(self.cifs_share.req_delete(self.mover.mover_id, False)),
2499 ]
2500 context.conn['XML'].request.assert_has_calls(expected_calls)
2502 def test_delete_cifs_share_not_found(self):
2503 self.hook.append(self.cifs_share.resp_get_error())
2504 self.hook.append(self.cifs_share.resp_get_without_value())
2506 context = self.manager.getStorageContext('CIFSShare')
2507 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2509 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2510 context.delete,
2511 name=self.cifs_share.share_name,
2512 mover_name=self.vdm.vdm_name,
2513 is_vdm=True)
2515 context.delete(name=self.cifs_share.share_name,
2516 mover_name=self.vdm.vdm_name,
2517 is_vdm=True)
2519 expected_calls = [
2520 mock.call(self.cifs_share.req_get()),
2521 mock.call(self.cifs_share.req_get()),
2522 ]
2523 context.conn['XML'].request.assert_has_calls(expected_calls)
2525 @mock.patch('time.sleep')
2526 def test_delete_cifs_share_invalid_mover_id(self, sleep_mock):
2527 self.hook.append(self.cifs_share.resp_get_succeed(self.mover.mover_id,
2528 False))
2529 self.hook.append(self.mover.resp_get_ref_succeed())
2530 self.hook.append(self.cifs_share.resp_invalid_mover_id())
2531 self.hook.append(self.mover.resp_get_ref_succeed())
2532 self.hook.append(self.cifs_share.resp_task_succeed())
2534 context = self.manager.getStorageContext('CIFSShare')
2535 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2537 context.delete(name=self.cifs_share.share_name,
2538 mover_name=self.mover.mover_name,
2539 is_vdm=False)
2541 expected_calls = [
2542 mock.call(self.cifs_share.req_get()),
2543 mock.call(self.mover.req_get_ref()),
2544 mock.call(self.cifs_share.req_delete(self.mover.mover_id, False)),
2545 mock.call(self.mover.req_get_ref()),
2546 mock.call(self.cifs_share.req_delete(self.mover.mover_id, False)),
2547 ]
2548 context.conn['XML'].request.assert_has_calls(expected_calls)
2550 self.assertTrue(sleep_mock.called)
2552 def test_delete_cifs_share_with_error(self):
2553 self.hook.append(self.cifs_share.resp_get_succeed(self.vdm.vdm_id))
2554 self.hook.append(self.vdm.resp_get_succeed())
2555 self.hook.append(self.cifs_share.resp_task_error())
2557 context = self.manager.getStorageContext('CIFSShare')
2558 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2560 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2561 context.delete,
2562 name=self.cifs_share.share_name,
2563 mover_name=self.vdm.vdm_name,
2564 is_vdm=True)
2566 expected_calls = [
2567 mock.call(self.cifs_share.req_get()),
2568 mock.call(self.vdm.req_get()),
2569 mock.call(self.cifs_share.req_delete(self.vdm.vdm_id)),
2570 ]
2571 context.conn['XML'].request.assert_has_calls(expected_calls)
2573 def test_get_cifs_share(self):
2574 self.hook.append(self.cifs_share.resp_get_succeed(self.vdm.vdm_id))
2576 context = self.manager.getStorageContext('CIFSShare')
2577 context.conn['XML'].request = utils.EMCMock(side_effect=self.hook)
2579 context.get(self.cifs_share.share_name)
2581 expected_calls = [mock.call(self.cifs_share.req_get())]
2582 context.conn['XML'].request.assert_has_calls(expected_calls)
2584 def test_disable_share_access(self):
2585 self.ssh_hook.append('Command succeeded')
2587 context = self.manager.getStorageContext('CIFSShare')
2588 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2590 context.disable_share_access(share_name=self.cifs_share.share_name,
2591 mover_name=self.vdm.vdm_name)
2593 ssh_calls = [mock.call(self.cifs_share.cmd_disable_access(), True)]
2594 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2596 def test_disable_share_access_with_error(self):
2597 self.ssh_hook.append(ex=processutils.ProcessExecutionError(
2598 stdout=self.cifs_share.fake_output))
2600 context = self.manager.getStorageContext('CIFSShare')
2601 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2603 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2604 context.disable_share_access,
2605 share_name=self.cifs_share.share_name,
2606 mover_name=self.vdm.vdm_name)
2608 ssh_calls = [mock.call(self.cifs_share.cmd_disable_access(), True)]
2609 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2611 def test_allow_share_access(self):
2612 self.ssh_hook.append(self.cifs_share.output_allow_access())
2614 context = self.manager.getStorageContext('CIFSShare')
2615 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2617 context.allow_share_access(mover_name=self.vdm.vdm_name,
2618 share_name=self.cifs_share.share_name,
2619 user_name=self.cifs_server.domain_user,
2620 domain=self.cifs_server.domain_name,
2621 access=constants.CIFS_ACL_FULLCONTROL)
2623 ssh_calls = [mock.call(self.cifs_share.cmd_change_access(), True)]
2624 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2626 def test_allow_share_access_duplicate_ACE(self):
2627 expt_dup_ace = processutils.ProcessExecutionError(
2628 stdout=self.cifs_share.output_allow_access_but_duplicate_ace())
2629 self.ssh_hook.append(ex=expt_dup_ace)
2631 context = self.manager.getStorageContext('CIFSShare')
2632 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2634 context.allow_share_access(mover_name=self.vdm.vdm_name,
2635 share_name=self.cifs_share.share_name,
2636 user_name=self.cifs_server.domain_user,
2637 domain=self.cifs_server.domain_name,
2638 access=constants.CIFS_ACL_FULLCONTROL)
2640 ssh_calls = [mock.call(self.cifs_share.cmd_change_access(), True)]
2641 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2643 def test_allow_share_access_with_error(self):
2644 expt_err = processutils.ProcessExecutionError(
2645 self.cifs_share.fake_output)
2646 self.ssh_hook.append(ex=expt_err)
2648 context = self.manager.getStorageContext('CIFSShare')
2649 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2651 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2652 context.allow_share_access,
2653 mover_name=self.vdm.vdm_name,
2654 share_name=self.cifs_share.share_name,
2655 user_name=self.cifs_server.domain_user,
2656 domain=self.cifs_server.domain_name,
2657 access=constants.CIFS_ACL_FULLCONTROL)
2659 ssh_calls = [mock.call(self.cifs_share.cmd_change_access(), True)]
2660 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2662 def test_deny_share_access(self):
2663 self.ssh_hook.append('Command succeeded')
2665 context = self.manager.getStorageContext('CIFSShare')
2666 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2668 context.deny_share_access(mover_name=self.vdm.vdm_name,
2669 share_name=self.cifs_share.share_name,
2670 user_name=self.cifs_server.domain_user,
2671 domain=self.cifs_server.domain_name,
2672 access=constants.CIFS_ACL_FULLCONTROL)
2674 ssh_calls = [
2675 mock.call(self.cifs_share.cmd_change_access(action='revoke'),
2676 True),
2677 ]
2678 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2680 def test_deny_share_access_no_ace(self):
2681 expt_no_ace = processutils.ProcessExecutionError(
2682 stdout=self.cifs_share.output_deny_access_but_no_ace())
2683 self.ssh_hook.append(ex=expt_no_ace)
2685 context = self.manager.getStorageContext('CIFSShare')
2686 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2688 context.deny_share_access(mover_name=self.vdm.vdm_name,
2689 share_name=self.cifs_share.share_name,
2690 user_name=self.cifs_server.domain_user,
2691 domain=self.cifs_server.domain_name,
2692 access=constants.CIFS_ACL_FULLCONTROL)
2694 ssh_calls = [
2695 mock.call(self.cifs_share.cmd_change_access(action='revoke'),
2696 True),
2697 ]
2698 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2700 def test_deny_share_access_but_no_user_found(self):
2701 expt_no_user = processutils.ProcessExecutionError(
2702 stdout=self.cifs_share.output_deny_access_but_no_user_found())
2703 self.ssh_hook.append(ex=expt_no_user)
2705 context = self.manager.getStorageContext('CIFSShare')
2706 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2708 context.deny_share_access(mover_name=self.vdm.vdm_name,
2709 share_name=self.cifs_share.share_name,
2710 user_name=self.cifs_server.domain_user,
2711 domain=self.cifs_server.domain_name,
2712 access=constants.CIFS_ACL_FULLCONTROL)
2714 ssh_calls = [
2715 mock.call(self.cifs_share.cmd_change_access(action='revoke'),
2716 True),
2717 ]
2718 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2720 def test_deny_share_access_with_error(self):
2721 expt_err = processutils.ProcessExecutionError(
2722 self.cifs_share.fake_output)
2723 self.ssh_hook.append(ex=expt_err)
2725 context = self.manager.getStorageContext('CIFSShare')
2726 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2728 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2729 context.deny_share_access,
2730 mover_name=self.vdm.vdm_name,
2731 share_name=self.cifs_share.share_name,
2732 user_name=self.cifs_server.domain_user,
2733 domain=self.cifs_server.domain_name,
2734 access=constants.CIFS_ACL_FULLCONTROL)
2736 ssh_calls = [
2737 mock.call(self.cifs_share.cmd_change_access(action='revoke'),
2738 True),
2739 ]
2740 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2742 def test_get_share_access(self):
2743 self.ssh_hook.append(fakes.FakeData.cifs_access)
2745 context = self.manager.getStorageContext('CIFSShare')
2746 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2748 ret = context.get_share_access(
2749 mover_name=self.vdm.vdm_name,
2750 share_name=self.cifs_share.share_name)
2752 ssh_calls = [
2753 mock.call(self.cifs_share.cmd_get_access(), True),
2754 ]
2755 self.assertEqual(2, len(ret))
2756 self.assertEqual(constants.CIFS_ACL_FULLCONTROL, ret['administrator'])
2757 self.assertEqual(constants.CIFS_ACL_FULLCONTROL, ret['guest'])
2758 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2760 def test_get_share_access_failed(self):
2761 expt_err = processutils.ProcessExecutionError(
2762 stdout=self.nfs_share.fake_output)
2763 self.ssh_hook.append(ex=expt_err)
2765 context = self.manager.getStorageContext('CIFSShare')
2766 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2768 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2769 context.get_share_access,
2770 mover_name=self.vdm.vdm_name,
2771 share_name=self.cifs_share.share_name)
2773 ssh_calls = [
2774 mock.call(self.cifs_share.cmd_get_access(), True),
2775 ]
2776 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2778 def test_clear_share_access_has_white_list(self):
2779 self.ssh_hook.append(fakes.FakeData.cifs_access)
2780 self.ssh_hook.append('Command succeeded')
2782 context = self.manager.getStorageContext('CIFSShare')
2783 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2785 to_remove = context.clear_share_access(
2786 mover_name=self.vdm.vdm_name,
2787 share_name=self.cifs_share.share_name,
2788 domain=self.cifs_server.domain_name,
2789 white_list_users=['guest'])
2791 ssh_calls = [
2792 mock.call(self.cifs_share.cmd_get_access(), True),
2793 mock.call(self.cifs_share.cmd_change_access(action='revoke'),
2794 True),
2795 ]
2796 self.assertEqual({'administrator'}, to_remove)
2797 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2800class NFSShareTestCase(StorageObjectTestCaseBase):
2801 def setUp(self):
2802 super(NFSShareTestCase, self).setUp()
2803 self.ssh_hook = utils.SSHSideEffect()
2805 def test_create_nfs_share(self):
2806 self.ssh_hook.append(self.nfs_share.output_create())
2808 context = self.manager.getStorageContext('NFSShare')
2809 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2811 context.create(name=self.nfs_share.share_name,
2812 mover_name=self.vdm.vdm_name)
2814 ssh_calls = [mock.call(self.nfs_share.cmd_create(), True)]
2815 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2817 def test_create_nfs_share_with_error(self):
2818 expt_err = processutils.ProcessExecutionError(
2819 stdout=self.nfs_share.fake_output)
2820 self.ssh_hook.append(ex=expt_err)
2822 context = self.manager.getStorageContext('NFSShare')
2823 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2825 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2826 context.create,
2827 name=self.nfs_share.share_name,
2828 mover_name=self.vdm.vdm_name)
2830 ssh_calls = [mock.call(self.nfs_share.cmd_create(), True)]
2831 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2833 def test_delete_nfs_share(self):
2834 self.ssh_hook.append(self.nfs_share.output_get_succeed(
2835 rw_hosts=self.nfs_share.rw_hosts,
2836 ro_hosts=self.nfs_share.ro_hosts))
2837 self.ssh_hook.append(self.nfs_share.output_delete_succeed())
2839 context = self.manager.getStorageContext('NFSShare')
2840 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2842 context.delete(name=self.nfs_share.share_name,
2843 mover_name=self.vdm.vdm_name)
2845 ssh_calls = [
2846 mock.call(self.nfs_share.cmd_get(), False),
2847 mock.call(self.nfs_share.cmd_delete(), True),
2848 ]
2849 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2851 def test_delete_nfs_share_not_found(self):
2852 expt_not_found = processutils.ProcessExecutionError(
2853 stdout=self.nfs_share.output_get_but_not_found())
2854 self.ssh_hook.append(ex=expt_not_found)
2856 context = self.manager.getStorageContext('NFSShare')
2857 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2859 context.delete(name=self.nfs_share.share_name,
2860 mover_name=self.vdm.vdm_name)
2862 ssh_calls = [mock.call(self.nfs_share.cmd_get(), False)]
2863 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2865 @mock.patch('time.sleep')
2866 def test_delete_nfs_share_locked(self, sleep_mock):
2867 self.ssh_hook.append(self.nfs_share.output_get_succeed(
2868 rw_hosts=self.nfs_share.rw_hosts,
2869 ro_hosts=self.nfs_share.ro_hosts))
2870 expt_locked = processutils.ProcessExecutionError(
2871 stdout=self.nfs_share.output_delete_but_locked())
2872 self.ssh_hook.append(ex=expt_locked)
2873 self.ssh_hook.append(self.nfs_share.output_delete_succeed())
2875 context = self.manager.getStorageContext('NFSShare')
2876 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2878 context.delete(name=self.nfs_share.share_name,
2879 mover_name=self.vdm.vdm_name)
2881 ssh_calls = [
2882 mock.call(self.nfs_share.cmd_get(), False),
2883 mock.call(self.nfs_share.cmd_delete(), True),
2884 mock.call(self.nfs_share.cmd_delete(), True),
2885 ]
2886 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2888 self.assertTrue(sleep_mock.called)
2890 def test_delete_nfs_share_with_error(self):
2891 self.ssh_hook.append(self.nfs_share.output_get_succeed(
2892 rw_hosts=self.nfs_share.rw_hosts,
2893 ro_hosts=self.nfs_share.ro_hosts))
2894 expt_err = processutils.ProcessExecutionError(
2895 stdout=self.nfs_share.fake_output)
2896 self.ssh_hook.append(ex=expt_err)
2898 context = self.manager.getStorageContext('NFSShare')
2899 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2901 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2902 context.delete,
2903 name=self.nfs_share.share_name,
2904 mover_name=self.vdm.vdm_name)
2906 ssh_calls = [
2907 mock.call(self.nfs_share.cmd_get(), False),
2908 mock.call(self.nfs_share.cmd_delete(), True),
2909 ]
2910 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2912 def test_get_nfs_share(self):
2913 self.ssh_hook.append(self.nfs_share.output_get_succeed(
2914 rw_hosts=self.nfs_share.rw_hosts,
2915 ro_hosts=self.nfs_share.ro_hosts))
2917 context = self.manager.getStorageContext('NFSShare')
2918 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2920 context.get(name=self.nfs_share.share_name,
2921 mover_name=self.vdm.vdm_name)
2923 # Get NFS share from cache
2924 context.get(name=self.nfs_share.share_name,
2925 mover_name=self.vdm.vdm_name)
2927 ssh_calls = [mock.call(self.nfs_share.cmd_get(), False)]
2928 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2930 def test_get_nfs_share_not_found(self):
2931 expt_not_found = processutils.ProcessExecutionError(
2932 stdout=self.nfs_share.output_get_but_not_found())
2933 self.ssh_hook.append(ex=expt_not_found)
2934 self.ssh_hook.append(self.nfs_share.output_get_but_not_found())
2936 context = self.manager.getStorageContext('NFSShare')
2937 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2939 context.get(name=self.nfs_share.share_name,
2940 mover_name=self.vdm.vdm_name)
2942 context.get(name=self.nfs_share.share_name,
2943 mover_name=self.vdm.vdm_name)
2945 ssh_calls = [
2946 mock.call(self.nfs_share.cmd_get(), False),
2947 mock.call(self.nfs_share.cmd_get(), False),
2948 ]
2949 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2951 def test_get_nfs_share_with_error(self):
2952 expt_err = processutils.ProcessExecutionError(
2953 stdout=self.nfs_share.fake_output)
2954 self.ssh_hook.append(ex=expt_err)
2956 context = self.manager.getStorageContext('NFSShare')
2957 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
2959 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
2960 context.get,
2961 name=self.nfs_share.share_name,
2962 mover_name=self.vdm.vdm_name)
2964 ssh_calls = [mock.call(self.nfs_share.cmd_get(), False)]
2965 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
2967 def test_allow_share_access(self):
2968 rw_hosts = copy.deepcopy(self.nfs_share.rw_hosts)
2969 rw_hosts.append(self.nfs_share.nfs_host_ip)
2971 ro_hosts = copy.deepcopy(self.nfs_share.ro_hosts)
2972 ro_hosts.append(self.nfs_share.nfs_host_ip)
2974 self.ssh_hook.append(self.nfs_share.output_get_succeed(
2975 rw_hosts=self.nfs_share.rw_hosts,
2976 ro_hosts=self.nfs_share.ro_hosts))
2977 self.ssh_hook.append(self.nfs_share.output_set_access_success())
2978 self.ssh_hook.append(self.nfs_share.output_get_succeed(
2979 rw_hosts=rw_hosts, ro_hosts=self.nfs_share.ro_hosts))
2980 self.ssh_hook.append(self.nfs_share.output_set_access_success())
2981 self.ssh_hook.append(self.nfs_share.output_get_succeed(
2982 rw_hosts=self.nfs_share.rw_hosts, ro_hosts=ro_hosts))
2983 self.ssh_hook.append(self.nfs_share.output_set_access_success())
2984 self.ssh_hook.append(self.nfs_share.output_get_succeed(
2985 rw_hosts=rw_hosts, ro_hosts=self.nfs_share.ro_hosts))
2987 context = self.manager.getStorageContext('NFSShare')
2988 context.conn['SSH'].run_ssh = utils.EMCNFSShareMock(
2989 side_effect=self.ssh_hook)
2991 context.allow_share_access(share_name=self.nfs_share.share_name,
2992 host_ip=self.nfs_share.nfs_host_ip,
2993 mover_name=self.vdm.vdm_name,
2994 access_level=const.ACCESS_LEVEL_RW)
2996 context.allow_share_access(share_name=self.nfs_share.share_name,
2997 host_ip=self.nfs_share.nfs_host_ip,
2998 mover_name=self.vdm.vdm_name,
2999 access_level=const.ACCESS_LEVEL_RO)
3001 context.allow_share_access(share_name=self.nfs_share.share_name,
3002 host_ip=self.nfs_share.nfs_host_ip,
3003 mover_name=self.vdm.vdm_name,
3004 access_level=const.ACCESS_LEVEL_RW)
3006 context.allow_share_access(share_name=self.nfs_share.share_name,
3007 host_ip=self.nfs_share.nfs_host_ip,
3008 mover_name=self.vdm.vdm_name,
3009 access_level=const.ACCESS_LEVEL_RW)
3011 ssh_calls = [
3012 mock.call(self.nfs_share.cmd_get()),
3013 mock.call(self.nfs_share.cmd_set_access(
3014 rw_hosts=rw_hosts, ro_hosts=self.nfs_share.ro_hosts)),
3015 mock.call(self.nfs_share.cmd_get()),
3016 mock.call(self.nfs_share.cmd_set_access(
3017 rw_hosts=self.nfs_share.rw_hosts, ro_hosts=ro_hosts)),
3018 mock.call(self.nfs_share.cmd_get()),
3019 mock.call(self.nfs_share.cmd_set_access(
3020 rw_hosts=rw_hosts, ro_hosts=self.nfs_share.ro_hosts)),
3021 mock.call(self.nfs_share.cmd_get()),
3022 ]
3023 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
3025 def test_allow_share_access_not_found(self):
3026 expt_not_found = processutils.ProcessExecutionError(
3027 stdout=self.nfs_share.output_get_but_not_found())
3028 self.ssh_hook.append(ex=expt_not_found)
3030 context = self.manager.getStorageContext('NFSShare')
3031 context.conn['SSH'].run_ssh = utils.EMCNFSShareMock(
3032 side_effect=self.ssh_hook)
3034 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
3035 context.allow_share_access,
3036 share_name=self.nfs_share.share_name,
3037 host_ip=self.nfs_share.nfs_host_ip,
3038 mover_name=self.vdm.vdm_name,
3039 access_level=const.ACCESS_LEVEL_RW)
3041 ssh_calls = [mock.call(self.nfs_share.cmd_get())]
3042 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
3044 def test_deny_rw_share_access(self):
3045 rw_hosts = copy.deepcopy(self.nfs_share.rw_hosts)
3046 rw_hosts.append(self.nfs_share.nfs_host_ip)
3048 self.ssh_hook.append(self.nfs_share.output_get_succeed(
3049 rw_hosts=rw_hosts, ro_hosts=self.nfs_share.ro_hosts))
3050 self.ssh_hook.append(self.nfs_share.output_set_access_success())
3051 self.ssh_hook.append(self.nfs_share.output_get_succeed(
3052 rw_hosts=self.nfs_share.rw_hosts,
3053 ro_hosts=self.nfs_share.ro_hosts))
3055 context = self.manager.getStorageContext('NFSShare')
3056 context.conn['SSH'].run_ssh = utils.EMCNFSShareMock(
3057 side_effect=self.ssh_hook)
3059 context.deny_share_access(share_name=self.nfs_share.share_name,
3060 host_ip=self.nfs_share.nfs_host_ip,
3061 mover_name=self.vdm.vdm_name)
3063 ssh_calls = [
3064 mock.call(self.nfs_share.cmd_get()),
3065 mock.call(self.nfs_share.cmd_set_access(self.nfs_share.rw_hosts,
3066 self.nfs_share.ro_hosts)),
3067 mock.call(self.nfs_share.cmd_get()),
3068 ]
3069 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
3071 def test_clear_share_access(self):
3072 hosts = ['192.168.1.1', '192.168.1.3']
3074 self.ssh_hook.append(self.nfs_share.output_get_succeed(
3075 rw_hosts=self.nfs_share.rw_hosts,
3076 ro_hosts=self.nfs_share.ro_hosts))
3077 self.ssh_hook.append(self.nfs_share.output_set_access_success())
3078 self.ssh_hook.append(self.nfs_share.output_get_succeed(
3079 rw_hosts=[hosts[0]], ro_hosts=[hosts[1]]))
3081 context = self.manager.getStorageContext('NFSShare')
3082 context.conn['SSH'].run_ssh = utils.EMCNFSShareMock(
3083 side_effect=self.ssh_hook)
3085 context.clear_share_access(share_name=self.nfs_share.share_name,
3086 mover_name=self.vdm.vdm_name,
3087 white_list_hosts=hosts)
3089 ssh_calls = [
3090 mock.call(self.nfs_share.cmd_get()),
3091 mock.call(self.nfs_share.cmd_set_access(
3092 rw_hosts=[hosts[0]], ro_hosts=[hosts[1]])),
3093 mock.call(self.nfs_share.cmd_get()),
3094 ]
3095 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
3097 def test_deny_ro_share_access(self):
3098 ro_hosts = copy.deepcopy(self.nfs_share.ro_hosts)
3099 ro_hosts.append(self.nfs_share.nfs_host_ip)
3101 self.ssh_hook.append(self.nfs_share.output_get_succeed(
3102 rw_hosts=self.nfs_share.rw_hosts, ro_hosts=ro_hosts))
3103 self.ssh_hook.append(self.nfs_share.output_set_access_success())
3104 self.ssh_hook.append(self.nfs_share.output_get_succeed(
3105 rw_hosts=self.nfs_share.rw_hosts,
3106 ro_hosts=self.nfs_share.ro_hosts))
3108 context = self.manager.getStorageContext('NFSShare')
3109 context.conn['SSH'].run_ssh = utils.EMCNFSShareMock(
3110 side_effect=self.ssh_hook)
3112 context.deny_share_access(share_name=self.nfs_share.share_name,
3113 host_ip=self.nfs_share.nfs_host_ip,
3114 mover_name=self.vdm.vdm_name)
3116 context.deny_share_access(share_name=self.nfs_share.share_name,
3117 host_ip=self.nfs_share.nfs_host_ip,
3118 mover_name=self.vdm.vdm_name)
3120 ssh_calls = [
3121 mock.call(self.nfs_share.cmd_get()),
3122 mock.call(self.nfs_share.cmd_set_access(self.nfs_share.rw_hosts,
3123 self.nfs_share.ro_hosts)),
3124 mock.call(self.nfs_share.cmd_get()),
3125 ]
3126 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
3128 def test_deny_share_not_found(self):
3129 expt_not_found = processutils.ProcessExecutionError(
3130 stdout=self.nfs_share.output_get_but_not_found())
3131 self.ssh_hook.append(ex=expt_not_found)
3133 context = self.manager.getStorageContext('NFSShare')
3134 context.conn['SSH'].run_ssh = utils.EMCNFSShareMock(
3135 side_effect=self.ssh_hook)
3137 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
3138 context.deny_share_access,
3139 share_name=self.nfs_share.share_name,
3140 host_ip=self.nfs_share.nfs_host_ip,
3141 mover_name=self.vdm.vdm_name)
3143 ssh_calls = [mock.call(self.nfs_share.cmd_get())]
3144 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
3146 def test_deny_rw_share_with_error(self):
3147 rw_hosts = copy.deepcopy(self.nfs_share.rw_hosts)
3148 rw_hosts.append(self.nfs_share.nfs_host_ip)
3150 self.ssh_hook.append(self.nfs_share.output_get_succeed(
3151 rw_hosts=rw_hosts, ro_hosts=self.nfs_share.ro_hosts))
3152 expt_not_found = processutils.ProcessExecutionError(
3153 stdout=self.nfs_share.output_get_but_not_found())
3154 self.ssh_hook.append(ex=expt_not_found)
3156 context = self.manager.getStorageContext('NFSShare')
3157 context.conn['SSH'].run_ssh = utils.EMCNFSShareMock(
3158 side_effect=self.ssh_hook)
3160 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
3161 context.deny_share_access,
3162 share_name=self.nfs_share.share_name,
3163 host_ip=self.nfs_share.nfs_host_ip,
3164 mover_name=self.vdm.vdm_name)
3166 ssh_calls = [
3167 mock.call(self.nfs_share.cmd_get()),
3168 mock.call(self.nfs_share.cmd_set_access(self.nfs_share.rw_hosts,
3169 self.nfs_share.ro_hosts)),
3170 ]
3171 context.conn['SSH'].run_ssh.assert_has_calls(ssh_calls)
3173 def test_clear_share_access_failed_to_get_share(self):
3174 self.ssh_hook.append("no output.")
3176 context = self.manager.getStorageContext('NFSShare')
3177 context.conn['SSH'].run_ssh = mock.Mock(side_effect=self.ssh_hook)
3179 self.assertRaises(exception.EMCPowerMaxXMLAPIError,
3180 context.clear_share_access,
3181 share_name=self.nfs_share.share_name,
3182 mover_name=self.vdm.vdm_name,
3183 white_list_hosts=None)
3185 context.conn['SSH'].run_ssh.assert_called_once_with(
3186 self.nfs_share.cmd_get(), False)