]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/tests/test_iscsi.py
import ceph nautilus 14.2.2
[ceph.git] / ceph / src / pybind / mgr / dashboard / tests / test_iscsi.py
1 # pylint: disable=too-many-public-methods
2
3 import copy
4 import errno
5 import json
6 import mock
7
8 from . import CmdException, ControllerTestCase, CLICommandTestMixin
9 from .. import mgr
10 from ..controllers.iscsi import Iscsi, IscsiTarget
11 from ..services.iscsi_client import IscsiClient
12 from ..services.orchestrator import OrchClient
13 from ..rest_client import RequestException
14
15
16 class IscsiTest(ControllerTestCase, CLICommandTestMixin):
17
18 @classmethod
19 def setup_server(cls):
20 OrchClient().available = lambda: False
21 mgr.rados.side_effect = None
22 # pylint: disable=protected-access
23 Iscsi._cp_config['tools.authenticate.on'] = False
24 IscsiTarget._cp_config['tools.authenticate.on'] = False
25 cls.setup_controllers([Iscsi, IscsiTarget])
26
27 def setUp(self):
28 self.mock_kv_store()
29 # pylint: disable=protected-access
30 IscsiClientMock._instance = IscsiClientMock()
31 IscsiClient.instance = IscsiClientMock.instance
32
33 def test_cli_add_gateway_invalid_url(self):
34 with self.assertRaises(CmdException) as ctx:
35 self.exec_cmd('iscsi-gateway-add', name='node1',
36 service_url='http:/hello.com')
37
38 self.assertEqual(ctx.exception.retcode, -errno.EINVAL)
39 self.assertEqual(str(ctx.exception),
40 "Invalid service URL 'http:/hello.com'. Valid format: "
41 "'<scheme>://<username>:<password>@<host>[:port]'.")
42
43 def test_cli_add_gateway(self):
44 self.exec_cmd('iscsi-gateway-add', name='node1',
45 service_url='https://admin:admin@10.17.5.1:5001')
46 self.exec_cmd('iscsi-gateway-add', name='node2',
47 service_url='https://admin:admin@10.17.5.2:5001')
48 iscsi_config = json.loads(self.get_key("_iscsi_config"))
49 self.assertEqual(iscsi_config['gateways'], {
50 'node1': {
51 'service_url': 'https://admin:admin@10.17.5.1:5001'
52 },
53 'node2': {
54 'service_url': 'https://admin:admin@10.17.5.2:5001'
55 }
56 })
57
58 def test_cli_remove_gateway(self):
59 self.test_cli_add_gateway()
60 self.exec_cmd('iscsi-gateway-rm', name='node1')
61 iscsi_config = json.loads(self.get_key("_iscsi_config"))
62 self.assertEqual(iscsi_config['gateways'], {
63 'node2': {
64 'service_url': 'https://admin:admin@10.17.5.2:5001'
65 }
66 })
67
68 def test_enable_discoveryauth(self):
69 discoveryauth = {
70 'user': 'myiscsiusername',
71 'password': 'myiscsipassword',
72 'mutual_user': 'myiscsiusername2',
73 'mutual_password': 'myiscsipassword2'
74 }
75 self._put('/api/iscsi/discoveryauth', discoveryauth)
76 self.assertStatus(200)
77 self.assertJsonBody(discoveryauth)
78 self._get('/api/iscsi/discoveryauth')
79 self.assertStatus(200)
80 self.assertJsonBody(discoveryauth)
81
82 def test_disable_discoveryauth(self):
83 discoveryauth = {
84 'user': '',
85 'password': '',
86 'mutual_user': '',
87 'mutual_password': ''
88 }
89 self._put('/api/iscsi/discoveryauth', discoveryauth)
90 self.assertStatus(200)
91 self.assertJsonBody(discoveryauth)
92 self._get('/api/iscsi/discoveryauth')
93 self.assertStatus(200)
94 self.assertJsonBody(discoveryauth)
95
96 def test_list_empty(self):
97 self._get('/api/iscsi/target')
98 self.assertStatus(200)
99 self.assertJsonBody([])
100
101 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
102 def test_list(self, _validate_image_mock):
103 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw1"
104 request = copy.deepcopy(iscsi_target_request)
105 request['target_iqn'] = target_iqn
106 self._post('/api/iscsi/target', request)
107 self.assertStatus(201)
108 self._get('/api/iscsi/target')
109 self.assertStatus(200)
110 response = copy.deepcopy(iscsi_target_response)
111 response['target_iqn'] = target_iqn
112 self.assertJsonBody([response])
113
114 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
115 def test_create(self, _validate_image_mock):
116 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw2"
117 request = copy.deepcopy(iscsi_target_request)
118 request['target_iqn'] = target_iqn
119 self._post('/api/iscsi/target', request)
120 self.assertStatus(201)
121 self._get('/api/iscsi/target/{}'.format(request['target_iqn']))
122 self.assertStatus(200)
123 response = copy.deepcopy(iscsi_target_response)
124 response['target_iqn'] = target_iqn
125 self.assertJsonBody(response)
126
127 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
128 def test_delete(self, _validate_image_mock):
129 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw3"
130 request = copy.deepcopy(iscsi_target_request)
131 request['target_iqn'] = target_iqn
132 self._post('/api/iscsi/target', request)
133 self.assertStatus(201)
134 self._delete('/api/iscsi/target/{}'.format(request['target_iqn']))
135 self.assertStatus(204)
136 self._get('/api/iscsi/target')
137 self.assertStatus(200)
138 self.assertJsonBody([])
139
140 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
141 def test_add_client(self, _validate_image_mock):
142 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw4"
143 create_request = copy.deepcopy(iscsi_target_request)
144 create_request['target_iqn'] = target_iqn
145 update_request = copy.deepcopy(create_request)
146 update_request['new_target_iqn'] = target_iqn
147 update_request['clients'].append(
148 {
149 "luns": [{"image": "lun1", "pool": "rbd"}],
150 "client_iqn": "iqn.1994-05.com.redhat:rh7-client3",
151 "auth": {
152 "password": "myiscsipassword5",
153 "user": "myiscsiusername5",
154 "mutual_password": "myiscsipassword6",
155 "mutual_user": "myiscsiusername6"}
156 })
157 response = copy.deepcopy(iscsi_target_response)
158 response['target_iqn'] = target_iqn
159 response['clients'].append(
160 {
161 "luns": [{"image": "lun1", "pool": "rbd"}],
162 "client_iqn": "iqn.1994-05.com.redhat:rh7-client3",
163 "auth": {
164 "password": "myiscsipassword5",
165 "user": "myiscsiusername5",
166 "mutual_password": "myiscsipassword6",
167 "mutual_user": "myiscsiusername6"}
168 })
169 self._update_iscsi_target(create_request, update_request, response)
170
171 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
172 def test_change_client_password(self, _validate_image_mock):
173 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw5"
174 create_request = copy.deepcopy(iscsi_target_request)
175 create_request['target_iqn'] = target_iqn
176 update_request = copy.deepcopy(create_request)
177 update_request['new_target_iqn'] = target_iqn
178 update_request['clients'][0]['auth']['password'] = 'mynewiscsipassword'
179 response = copy.deepcopy(iscsi_target_response)
180 response['target_iqn'] = target_iqn
181 response['clients'][0]['auth']['password'] = 'mynewiscsipassword'
182 self._update_iscsi_target(create_request, update_request, response)
183
184 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
185 def test_rename_client(self, _validate_image_mock):
186 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw6"
187 create_request = copy.deepcopy(iscsi_target_request)
188 create_request['target_iqn'] = target_iqn
189 update_request = copy.deepcopy(create_request)
190 update_request['new_target_iqn'] = target_iqn
191 update_request['clients'][0]['client_iqn'] = 'iqn.1994-05.com.redhat:rh7-client0'
192 response = copy.deepcopy(iscsi_target_response)
193 response['target_iqn'] = target_iqn
194 response['clients'][0]['client_iqn'] = 'iqn.1994-05.com.redhat:rh7-client0'
195 self._update_iscsi_target(create_request, update_request, response)
196
197 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
198 def test_add_disk(self, _validate_image_mock):
199 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw7"
200 create_request = copy.deepcopy(iscsi_target_request)
201 create_request['target_iqn'] = target_iqn
202 update_request = copy.deepcopy(create_request)
203 update_request['new_target_iqn'] = target_iqn
204 update_request['disks'].append(
205 {
206 "image": "lun3",
207 "pool": "rbd",
208 "controls": {},
209 "backstore": "user:rbd"
210 })
211 update_request['clients'][0]['luns'].append({"image": "lun3", "pool": "rbd"})
212 response = copy.deepcopy(iscsi_target_response)
213 response['target_iqn'] = target_iqn
214 response['disks'].append(
215 {
216 "image": "lun3",
217 "pool": "rbd",
218 "controls": {},
219 "backstore": "user:rbd"
220 })
221 response['clients'][0]['luns'].append({"image": "lun3", "pool": "rbd"})
222 self._update_iscsi_target(create_request, update_request, response)
223
224 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
225 def test_change_disk_image(self, _validate_image_mock):
226 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw8"
227 create_request = copy.deepcopy(iscsi_target_request)
228 create_request['target_iqn'] = target_iqn
229 update_request = copy.deepcopy(create_request)
230 update_request['new_target_iqn'] = target_iqn
231 update_request['disks'][0]['image'] = 'lun0'
232 update_request['clients'][0]['luns'][0]['image'] = 'lun0'
233 response = copy.deepcopy(iscsi_target_response)
234 response['target_iqn'] = target_iqn
235 response['disks'][0]['image'] = 'lun0'
236 response['clients'][0]['luns'][0]['image'] = 'lun0'
237 self._update_iscsi_target(create_request, update_request, response)
238
239 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
240 def test_change_disk_controls(self, _validate_image_mock):
241 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw9"
242 create_request = copy.deepcopy(iscsi_target_request)
243 create_request['target_iqn'] = target_iqn
244 update_request = copy.deepcopy(create_request)
245 update_request['new_target_iqn'] = target_iqn
246 update_request['disks'][0]['controls'] = {"qfull_timeout": 15}
247 response = copy.deepcopy(iscsi_target_response)
248 response['target_iqn'] = target_iqn
249 response['disks'][0]['controls'] = {"qfull_timeout": 15}
250 self._update_iscsi_target(create_request, update_request, response)
251
252 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
253 def test_rename_target(self, _validate_image_mock):
254 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw10"
255 new_target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw11"
256 create_request = copy.deepcopy(iscsi_target_request)
257 create_request['target_iqn'] = target_iqn
258 update_request = copy.deepcopy(create_request)
259 update_request['new_target_iqn'] = new_target_iqn
260 response = copy.deepcopy(iscsi_target_response)
261 response['target_iqn'] = new_target_iqn
262 self._update_iscsi_target(create_request, update_request, response)
263
264 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
265 def test_rename_group(self, _validate_image_mock):
266 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw12"
267 create_request = copy.deepcopy(iscsi_target_request)
268 create_request['target_iqn'] = target_iqn
269 update_request = copy.deepcopy(create_request)
270 update_request['new_target_iqn'] = target_iqn
271 update_request['groups'][0]['group_id'] = 'mygroup0'
272 response = copy.deepcopy(iscsi_target_response)
273 response['target_iqn'] = target_iqn
274 response['groups'][0]['group_id'] = 'mygroup0'
275 self._update_iscsi_target(create_request, update_request, response)
276
277 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
278 def test_add_client_to_group(self, _validate_image_mock):
279 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw13"
280 create_request = copy.deepcopy(iscsi_target_request)
281 create_request['target_iqn'] = target_iqn
282 update_request = copy.deepcopy(create_request)
283 update_request['new_target_iqn'] = target_iqn
284 update_request['clients'].append(
285 {
286 "luns": [],
287 "client_iqn": "iqn.1994-05.com.redhat:rh7-client3",
288 "auth": {
289 "password": None,
290 "user": None,
291 "mutual_password": None,
292 "mutual_user": None}
293 })
294 update_request['groups'][0]['members'].append('iqn.1994-05.com.redhat:rh7-client3')
295 response = copy.deepcopy(iscsi_target_response)
296 response['target_iqn'] = target_iqn
297 response['clients'].append(
298 {
299 "luns": [],
300 "client_iqn": "iqn.1994-05.com.redhat:rh7-client3",
301 "auth": {
302 "password": None,
303 "user": None,
304 "mutual_password": None,
305 "mutual_user": None}
306 })
307 response['groups'][0]['members'].append('iqn.1994-05.com.redhat:rh7-client3')
308 self._update_iscsi_target(create_request, update_request, response)
309
310 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
311 def test_remove_client_from_group(self, _validate_image_mock):
312 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw14"
313 create_request = copy.deepcopy(iscsi_target_request)
314 create_request['target_iqn'] = target_iqn
315 update_request = copy.deepcopy(create_request)
316 update_request['new_target_iqn'] = target_iqn
317 update_request['groups'][0]['members'].remove('iqn.1994-05.com.redhat:rh7-client2')
318 response = copy.deepcopy(iscsi_target_response)
319 response['target_iqn'] = target_iqn
320 response['groups'][0]['members'].remove('iqn.1994-05.com.redhat:rh7-client2')
321 self._update_iscsi_target(create_request, update_request, response)
322
323 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
324 def test_remove_groups(self, _validate_image_mock):
325 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw15"
326 create_request = copy.deepcopy(iscsi_target_request)
327 create_request['target_iqn'] = target_iqn
328 update_request = copy.deepcopy(create_request)
329 update_request['new_target_iqn'] = target_iqn
330 update_request['groups'] = []
331 response = copy.deepcopy(iscsi_target_response)
332 response['target_iqn'] = target_iqn
333 response['groups'] = []
334 self._update_iscsi_target(create_request, update_request, response)
335
336 @mock.patch('dashboard.controllers.iscsi.IscsiTarget._validate_image')
337 def test_add_client_to_multiple_groups(self, _validate_image_mock):
338 target_iqn = "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw16"
339 create_request = copy.deepcopy(iscsi_target_request)
340 create_request['target_iqn'] = target_iqn
341 create_request['groups'].append(copy.deepcopy(create_request['groups'][0]))
342 create_request['groups'][1]['group_id'] = 'mygroup2'
343 self._post('/api/iscsi/target', create_request)
344 self.assertStatus(400)
345 self.assertJsonBody({
346 'detail': 'Each initiator can only be part of 1 group at a time',
347 'code': 'initiator_in_multiple_groups',
348 'component': 'iscsi'
349 })
350
351 def _update_iscsi_target(self, create_request, update_request, response):
352 self._post('/api/iscsi/target', create_request)
353 self.assertStatus(201)
354 self._put('/api/iscsi/target/{}'.format(create_request['target_iqn']), update_request)
355 self.assertStatus(200)
356 self._get('/api/iscsi/target/{}'.format(update_request['new_target_iqn']))
357 self.assertStatus(200)
358 self.assertJsonBody(response)
359
360
361 iscsi_target_request = {
362 "target_iqn": "iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw",
363 "portals": [
364 {"ip": "192.168.100.202", "host": "node2"},
365 {"ip": "10.0.2.15", "host": "node2"},
366 {"ip": "192.168.100.203", "host": "node3"}
367 ],
368 "disks": [
369 {"image": "lun1", "pool": "rbd", "backstore": "user:rbd",
370 "controls": {"max_data_area_mb": 128}},
371 {"image": "lun2", "pool": "rbd", "backstore": "user:rbd",
372 "controls": {"max_data_area_mb": 128}}
373 ],
374 "clients": [
375 {
376 "luns": [{"image": "lun1", "pool": "rbd"}],
377 "client_iqn": "iqn.1994-05.com.redhat:rh7-client",
378 "auth": {
379 "password": "myiscsipassword1",
380 "user": "myiscsiusername1",
381 "mutual_password": "myiscsipassword2",
382 "mutual_user": "myiscsiusername2"}
383 },
384 {
385 "luns": [],
386 "client_iqn": "iqn.1994-05.com.redhat:rh7-client2",
387 "auth": {
388 "password": "myiscsipassword3",
389 "user": "myiscsiusername3",
390 "mutual_password": "myiscsipassword4",
391 "mutual_user": "myiscsiusername4"
392 }
393 }
394 ],
395 "acl_enabled": True,
396 "target_controls": {},
397 "groups": [
398 {
399 "group_id": "mygroup",
400 "disks": [{"pool": "rbd", "image": "lun2"}],
401 "members": ["iqn.1994-05.com.redhat:rh7-client2"]
402 }
403 ]
404 }
405
406 iscsi_target_response = {
407 'target_iqn': 'iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw',
408 'portals': [
409 {'host': 'node2', 'ip': '10.0.2.15'},
410 {'host': 'node2', 'ip': '192.168.100.202'},
411 {'host': 'node3', 'ip': '192.168.100.203'}
412 ],
413 'disks': [
414 {'pool': 'rbd', 'image': 'lun1', 'backstore': 'user:rbd',
415 'controls': {'max_data_area_mb': 128}},
416 {'pool': 'rbd', 'image': 'lun2', 'backstore': 'user:rbd',
417 'controls': {'max_data_area_mb': 128}}
418 ],
419 'clients': [
420 {
421 'client_iqn': 'iqn.1994-05.com.redhat:rh7-client',
422 'luns': [{'pool': 'rbd', 'image': 'lun1'}],
423 'auth': {
424 'user': 'myiscsiusername1',
425 'password': 'myiscsipassword1',
426 'mutual_password': 'myiscsipassword2',
427 'mutual_user': 'myiscsiusername2'
428 }
429 },
430 {
431 'client_iqn': 'iqn.1994-05.com.redhat:rh7-client2',
432 'luns': [],
433 'auth': {
434 'user': 'myiscsiusername3',
435 'password': 'myiscsipassword3',
436 'mutual_password': 'myiscsipassword4',
437 'mutual_user': 'myiscsiusername4'
438 }
439 }
440 ],
441 "acl_enabled": True,
442 'groups': [
443 {
444 'group_id': 'mygroup',
445 'disks': [{'pool': 'rbd', 'image': 'lun2'}],
446 'members': ['iqn.1994-05.com.redhat:rh7-client2']
447 }
448 ],
449 'target_controls': {},
450 'info': {
451 'num_sessions': 0
452 }
453 }
454
455
456 class IscsiClientMock(object):
457
458 _instance = None
459
460 def __init__(self):
461 self.gateway_name = None
462 self.service_url = None
463 self.config = {
464 "created": "2019/01/17 08:57:16",
465 "discovery_auth": {
466 "username": "",
467 "password": "",
468 "password_encryption_enabled": False,
469 "mutual_username": "",
470 "mutual_password": "",
471 "mutual_password_encryption_enabled": False
472 },
473 "disks": {},
474 "epoch": 0,
475 "gateways": {},
476 "targets": {},
477 "updated": "",
478 "version": 5
479 }
480
481 @classmethod
482 def instance(cls, gateway_name=None, service_url=None):
483 cls._instance.gateway_name = gateway_name
484 cls._instance.service_url = service_url
485 # pylint: disable=unused-argument
486 return cls._instance
487
488 def ping(self):
489 return {
490 "message": "pong"
491 }
492
493 def get_settings(self):
494 return {
495 "backstores": [
496 "user:rbd"
497 ],
498 "config": {
499 "minimum_gateways": 2
500 },
501 "default_backstore": "user:rbd",
502 "required_rbd_features": {
503 "rbd": 0,
504 "user:rbd": 4,
505 },
506 "unsupported_rbd_features": {
507 "rbd": 88,
508 "user:rbd": 0,
509 },
510 "disk_default_controls": {
511 "user:rbd": {
512 "hw_max_sectors": 1024,
513 "max_data_area_mb": 8,
514 "osd_op_timeout": 30,
515 "qfull_timeout": 5
516 }
517 },
518 "target_default_controls": {
519 "cmdsn_depth": 128,
520 "dataout_timeout": 20,
521 "first_burst_length": 262144,
522 "immediate_data": "Yes",
523 "initial_r2t": "Yes",
524 "max_burst_length": 524288,
525 "max_outstanding_r2t": 1,
526 "max_recv_data_segment_length": 262144,
527 "max_xmit_data_segment_length": 262144,
528 "nopin_response_timeout": 5,
529 "nopin_timeout": 5
530 }
531 }
532
533 def get_config(self):
534 return self.config
535
536 def create_target(self, target_iqn, target_controls):
537 self.config['targets'][target_iqn] = {
538 "clients": {},
539 "acl_enabled": True,
540 "controls": target_controls,
541 "created": "2019/01/17 09:22:34",
542 "disks": [],
543 "groups": {},
544 "portals": {}
545 }
546
547 def create_gateway(self, target_iqn, gateway_name, ip_address):
548 target_config = self.config['targets'][target_iqn]
549 if 'ip_list' not in target_config:
550 target_config['ip_list'] = []
551 target_config['ip_list'] += ip_address
552 target_config['portals'][gateway_name] = {
553 "portal_ip_address": ip_address[0]
554 }
555
556 def create_disk(self, pool, image, backstore):
557 image_id = '{}/{}'.format(pool, image)
558 self.config['disks'][image_id] = {
559 "pool": pool,
560 "image": image,
561 "backstore": backstore,
562 "controls": {}
563 }
564
565 def create_target_lun(self, target_iqn, image_id):
566 target_config = self.config['targets'][target_iqn]
567 target_config['disks'].append(image_id)
568 self.config['disks'][image_id]['owner'] = list(target_config['portals'].keys())[0]
569
570 def reconfigure_disk(self, pool, image, controls):
571 image_id = '{}/{}'.format(pool, image)
572 self.config['disks'][image_id]['controls'] = controls
573
574 def create_client(self, target_iqn, client_iqn):
575 target_config = self.config['targets'][target_iqn]
576 target_config['clients'][client_iqn] = {
577 "auth": {
578 "username": "",
579 "password": "",
580 "password_encryption_enabled": False,
581 "mutual_username": "",
582 "mutual_password": "",
583 "mutual_password_encryption_enabled": False
584 },
585 "group_name": "",
586 "luns": {}
587 }
588
589 def create_client_lun(self, target_iqn, client_iqn, image_id):
590 target_config = self.config['targets'][target_iqn]
591 target_config['clients'][client_iqn]['luns'][image_id] = {}
592
593 def create_client_auth(self, target_iqn, client_iqn, user, password, m_user, m_password):
594 target_config = self.config['targets'][target_iqn]
595 target_config['clients'][client_iqn]['auth']['username'] = user
596 target_config['clients'][client_iqn]['auth']['password'] = password
597 target_config['clients'][client_iqn]['auth']['mutual_username'] = m_user
598 target_config['clients'][client_iqn]['auth']['mutual_password'] = m_password
599
600 def create_group(self, target_iqn, group_name, members, image_ids):
601 target_config = self.config['targets'][target_iqn]
602 target_config['groups'][group_name] = {
603 "disks": {},
604 "members": []
605 }
606 for image_id in image_ids:
607 target_config['groups'][group_name]['disks'][image_id] = {}
608 target_config['groups'][group_name]['members'] = members
609
610 def delete_group(self, target_iqn, group_name):
611 target_config = self.config['targets'][target_iqn]
612 del target_config['groups'][group_name]
613
614 def delete_client(self, target_iqn, client_iqn):
615 target_config = self.config['targets'][target_iqn]
616 del target_config['clients'][client_iqn]
617
618 def delete_target_lun(self, target_iqn, image_id):
619 target_config = self.config['targets'][target_iqn]
620 target_config['disks'].remove(image_id)
621 del self.config['disks'][image_id]['owner']
622
623 def delete_disk(self, pool, image):
624 image_id = '{}/{}'.format(pool, image)
625 del self.config['disks'][image_id]
626
627 def delete_target(self, target_iqn):
628 del self.config['targets'][target_iqn]
629
630 def get_ip_addresses(self):
631 ips = {
632 'node1': ['192.168.100.201'],
633 'node2': ['192.168.100.202', '10.0.2.15'],
634 'node3': ['192.168.100.203']
635 }
636 return {'data': ips[self.gateway_name]}
637
638 def get_hostname(self):
639 hostnames = {
640 'https://admin:admin@10.17.5.1:5001': 'node1',
641 'https://admin:admin@10.17.5.2:5001': 'node2',
642 'https://admin:admin@10.17.5.3:5001': 'node3'
643 }
644 if self.service_url not in hostnames:
645 raise RequestException('No route to host')
646 return {'data': hostnames[self.service_url]}
647
648 def update_discoveryauth(self, user, password, mutual_user, mutual_password):
649 self.config['discovery_auth']['username'] = user
650 self.config['discovery_auth']['password'] = password
651 self.config['discovery_auth']['mutual_username'] = mutual_user
652 self.config['discovery_auth']['mutual_password'] = mutual_password
653
654 def update_targetauth(self, target_iqn, action):
655 self.config['targets'][target_iqn]['acl_enabled'] = (action == 'enable_acl')
656
657 def get_targetinfo(self, _):
658 return {
659 'num_sessions': 0
660 }