xref: /spdk/python/spdk/rpc/bdev.py (revision 497132086b6d5fd8a91588d307ac905710a9d2d8)
1def bdev_set_options(client, bdev_io_pool_size=None, bdev_io_cache_size=None, bdev_auto_examine=None,
2                     small_buf_pool_size=None, large_buf_pool_size=None):
3    """Set parameters for the bdev subsystem.
4
5    Args:
6        bdev_io_pool_size: number of bdev_io structures in shared buffer pool (optional)
7        bdev_io_cache_size: maximum number of bdev_io structures cached per thread (optional)
8        bdev_auto_examine: if set to false, the bdev layer will not examine every disks automatically (optional)
9        small_buf_pool_size: maximum number of small buffer (8KB buffer) pool size (optional)
10        large_buf_pool_size: maximum number of large buffer (64KB buffer) pool size (optional)
11    """
12    params = {}
13
14    if bdev_io_pool_size:
15        params['bdev_io_pool_size'] = bdev_io_pool_size
16    if bdev_io_cache_size:
17        params['bdev_io_cache_size'] = bdev_io_cache_size
18    if bdev_auto_examine is not None:
19        params["bdev_auto_examine"] = bdev_auto_examine
20    if small_buf_pool_size:
21        params['small_buf_pool_size'] = small_buf_pool_size
22    if large_buf_pool_size:
23        params['large_buf_pool_size'] = large_buf_pool_size
24    return client.call('bdev_set_options', params)
25
26
27def bdev_examine(client, name):
28    """Examine a bdev manually. If the bdev does not exist yet when this RPC is called,
29    it will be examined when it is created
30
31    Args:
32        name: name of the bdev
33    """
34    params = {
35        'name': name
36    }
37    return client.call('bdev_examine', params)
38
39
40def bdev_wait_for_examine(client):
41    """Report when all bdevs have been examined
42    """
43    return client.call('bdev_wait_for_examine')
44
45
46def bdev_compress_create(client, base_bdev_name, pm_path, lb_size):
47    """Construct a compress virtual block device.
48
49    Args:
50        base_bdev_name: name of the underlying base bdev
51        pm_path: path to persistent memory
52        lb_size: logical block size for the compressed vol in bytes.  Must be 4K or 512.
53
54    Returns:
55        Name of created virtual block device.
56    """
57    params = {'base_bdev_name': base_bdev_name, 'pm_path': pm_path}
58
59    if lb_size:
60        params['lb_size'] = lb_size
61
62    return client.call('bdev_compress_create', params)
63
64
65def bdev_compress_delete(client, name):
66    """Delete compress virtual block device.
67
68    Args:
69        name: name of compress vbdev to delete
70    """
71    params = {'name': name}
72    return client.call('bdev_compress_delete', params)
73
74
75def bdev_compress_set_pmd(client, pmd):
76    """Set pmd options for the bdev compress.
77
78    Args:
79        pmd: 0 = auto-select, 1 = QAT, 2 = ISAL, 3 = mlx5_pci
80    """
81    params = {'pmd': pmd}
82
83    return client.call('bdev_compress_set_pmd', params)
84
85
86def bdev_compress_get_orphans(client, name=None):
87    """Get a list of comp bdevs that do not have a pmem file (aka orphaned).
88
89    Args:
90        name: comp bdev name to query (optional; if omitted, query all comp bdevs)
91
92    Returns:
93        List of comp bdev names.
94    """
95    params = {}
96    if name:
97        params['name'] = name
98    return client.call('bdev_compress_get_orphans', params)
99
100
101def bdev_crypto_create(client, base_bdev_name, name, crypto_pmd, key, cipher=None, key2=None):
102    """Construct a crypto virtual block device.
103
104    Args:
105        base_bdev_name: name of the underlying base bdev
106        name: name for the crypto vbdev
107        crypto_pmd: name of of the DPDK crypto driver to use
108        key: key
109
110    Returns:
111        Name of created virtual block device.
112    """
113    params = {'base_bdev_name': base_bdev_name, 'name': name, 'crypto_pmd': crypto_pmd, 'key': key}
114    if cipher:
115        params['cipher'] = cipher
116    if key2:
117        params['key2'] = key2
118    return client.call('bdev_crypto_create', params)
119
120
121def bdev_crypto_delete(client, name):
122    """Delete crypto virtual block device.
123
124    Args:
125        name: name of crypto vbdev to delete
126    """
127    params = {'name': name}
128    return client.call('bdev_crypto_delete', params)
129
130
131def bdev_ocf_create(client, name, mode, cache_line_size, cache_bdev_name, core_bdev_name):
132    """Add an OCF block device
133
134    Args:
135        name: name of constructed OCF bdev
136        mode: OCF cache mode: {'wb', 'wt', 'pt', 'wa', 'wi', 'wo'}
137        cache_line_size: OCF cache line size. The unit is KiB: {4, 8, 16, 32, 64}
138        cache_bdev_name: name of underlying cache bdev
139        core_bdev_name: name of underlying core bdev
140
141    Returns:
142        Name of created block device
143    """
144    params = {
145        'name': name,
146        'mode': mode,
147        'cache_bdev_name': cache_bdev_name,
148        'core_bdev_name': core_bdev_name,
149    }
150
151    if cache_line_size:
152        params['cache_line_size'] = cache_line_size
153
154    return client.call('bdev_ocf_create', params)
155
156
157def bdev_ocf_delete(client, name):
158    """Delete an OCF device
159
160    Args:
161        name: name of OCF bdev
162
163    """
164    params = {'name': name}
165
166    return client.call('bdev_ocf_delete', params)
167
168
169def bdev_ocf_get_stats(client, name):
170    """Get statistics of chosen OCF block device
171
172    Args:
173        name: name of OCF bdev
174
175    Returns:
176        Statistics as json object
177    """
178    params = {'name': name}
179
180    return client.call('bdev_ocf_get_stats', params)
181
182
183def bdev_ocf_get_bdevs(client, name=None):
184    """Get list of OCF devices including unregistered ones
185
186    Args:
187        name: name of OCF vbdev or name of cache device or name of core device (optional)
188
189    Returns:
190        Array of OCF devices with their current status
191    """
192    params = None
193    if name:
194        params = {'name': name}
195    return client.call('bdev_ocf_get_bdevs', params)
196
197
198def bdev_ocf_set_cache_mode(client, name, mode):
199    """Set cache mode of OCF block device
200
201    Args:
202        name: name of OCF bdev
203        mode: OCF cache mode: {'wb', 'wt', 'pt', 'wa', 'wi', 'wo'}
204
205    Returns:
206        New cache mode name
207    """
208    params = {
209        'name': name,
210        'mode': mode,
211    }
212
213    return client.call('bdev_ocf_set_cache_mode', params)
214
215
216def bdev_ocf_set_seqcutoff(client, name, policy, threshold, promotion_count):
217    """Set sequential cutoff parameters on all cores for the given OCF cache device
218
219    Args:
220        name: Name of OCF cache bdev
221        policy: Sequential cutoff policy
222        threshold: Activation threshold [KiB] (optional)
223        promotion_count: Promotion request count (optional)
224    """
225    params = {
226        'name': name,
227        'policy': policy,
228    }
229    if threshold:
230        params['threshold'] = threshold
231    if promotion_count:
232        params['promotion_count'] = promotion_count
233
234    return client.call('bdev_ocf_set_seqcutoff', params)
235
236
237def bdev_malloc_create(client, num_blocks, block_size, name=None, uuid=None, optimal_io_boundary=None):
238    """Construct a malloc block device.
239
240    Args:
241        num_blocks: size of block device in blocks
242        block_size: block size of device; must be a power of 2 and at least 512
243        name: name of block device (optional)
244        uuid: UUID of block device (optional)
245        optimal_io_boundary: Split on optimal IO boundary, in number of blocks, default 0 (disabled, optional)
246
247    Returns:
248        Name of created block device.
249    """
250    params = {'num_blocks': num_blocks, 'block_size': block_size}
251    if name:
252        params['name'] = name
253    if uuid:
254        params['uuid'] = uuid
255    if optimal_io_boundary:
256        params['optimal_io_boundary'] = optimal_io_boundary
257    return client.call('bdev_malloc_create', params)
258
259
260def bdev_malloc_delete(client, name):
261    """Delete malloc block device.
262
263    Args:
264        bdev_name: name of malloc bdev to delete
265    """
266    params = {'name': name}
267    return client.call('bdev_malloc_delete', params)
268
269
270def bdev_null_create(client, num_blocks, block_size, name, uuid=None, md_size=None,
271                     dif_type=None, dif_is_head_of_md=None):
272    """Construct a null block device.
273
274    Args:
275        num_blocks: size of block device in blocks
276        block_size: block size of device; data part size must be a power of 2 and at least 512
277        name: name of block device
278        uuid: UUID of block device (optional)
279        md_size: metadata size of device (optional)
280        dif_type: protection information type (optional)
281        dif_is_head_of_md: protection information is in the first 8 bytes of metadata (optional)
282
283    Returns:
284        Name of created block device.
285    """
286    params = {'name': name, 'num_blocks': num_blocks,
287              'block_size': block_size}
288    if uuid:
289        params['uuid'] = uuid
290    if md_size:
291        params['md_size'] = md_size
292    if dif_type:
293        params['dif_type'] = dif_type
294    if dif_is_head_of_md:
295        params['dif_is_head_of_md'] = dif_is_head_of_md
296    return client.call('bdev_null_create', params)
297
298
299def bdev_null_delete(client, name):
300    """Remove null bdev from the system.
301
302    Args:
303        name: name of null bdev to delete
304    """
305    params = {'name': name}
306    return client.call('bdev_null_delete', params)
307
308
309def bdev_null_resize(client, name, new_size):
310    """Resize null bdev in the system.
311
312    Args:
313        name: name of null bdev to resize
314        new_size: new bdev size of resize operation. The unit is MiB
315    """
316    params = {
317            'name': name,
318            'new_size': new_size,
319            }
320    return client.call('bdev_null_resize', params)
321
322
323def bdev_raid_get_bdevs(client, category):
324    """Get list of raid bdevs based on category
325
326    Args:
327        category: any one of all or online or configuring or offline
328
329    Returns:
330        List of raid bdev names
331    """
332    params = {'category': category}
333    return client.call('bdev_raid_get_bdevs', params)
334
335
336def bdev_raid_create(client, name, raid_level, base_bdevs, strip_size=None, strip_size_kb=None):
337    """Create raid bdev. Either strip size arg will work but one is required.
338
339    Args:
340        name: user defined raid bdev name
341        strip_size (deprecated): strip size of raid bdev in KB, supported values like 8, 16, 32, 64, 128, 256, etc
342        strip_size_kb: strip size of raid bdev in KB, supported values like 8, 16, 32, 64, 128, 256, etc
343        raid_level: raid level of raid bdev, supported values 0
344        base_bdevs: Space separated names of Nvme bdevs in double quotes, like "Nvme0n1 Nvme1n1 Nvme2n1"
345
346    Returns:
347        None
348    """
349    params = {'name': name, 'raid_level': raid_level, 'base_bdevs': base_bdevs}
350
351    if strip_size:
352        params['strip_size'] = strip_size
353
354    if strip_size_kb:
355        params['strip_size_kb'] = strip_size_kb
356
357    return client.call('bdev_raid_create', params)
358
359
360def bdev_raid_delete(client, name):
361    """Delete raid bdev
362
363    Args:
364        name: raid bdev name
365
366    Returns:
367        None
368    """
369    params = {'name': name}
370    return client.call('bdev_raid_delete', params)
371
372
373def bdev_aio_create(client, filename, name, block_size=None, readonly=False):
374    """Construct a Linux AIO block device.
375
376    Args:
377        filename: path to device or file (ex: /dev/sda)
378        name: name of block device
379        block_size: block size of device (optional; autodetected if omitted)
380        readonly: set aio bdev as read-only
381
382    Returns:
383        Name of created block device.
384    """
385    params = {'name': name,
386              'filename': filename}
387
388    if block_size:
389        params['block_size'] = block_size
390
391    if readonly:
392        params['readonly'] = readonly
393
394    return client.call('bdev_aio_create', params)
395
396
397def bdev_aio_rescan(client, name):
398    """Rescan a Linux AIO block device.
399
400    Args:
401        bdev_name: name of aio bdev to delete
402    """
403    params = {'name': name}
404    return client.call('bdev_aio_rescan', params)
405
406
407def bdev_aio_delete(client, name):
408    """Remove aio bdev from the system.
409
410    Args:
411        bdev_name: name of aio bdev to delete
412    """
413    params = {'name': name}
414    return client.call('bdev_aio_delete', params)
415
416
417def bdev_uring_create(client, filename, name, block_size=None):
418    """Create a bdev with Linux io_uring backend.
419
420    Args:
421        filename: path to device or file (ex: /dev/nvme0n1)
422        name: name of bdev
423        block_size: block size of device (optional; autodetected if omitted)
424
425    Returns:
426        Name of created bdev.
427    """
428    params = {'name': name,
429              'filename': filename}
430
431    if block_size:
432        params['block_size'] = block_size
433
434    return client.call('bdev_uring_create', params)
435
436
437def bdev_uring_delete(client, name):
438    """Delete a uring bdev.
439
440    Args:
441        name: name of uring bdev to delete
442    """
443    params = {'name': name}
444    return client.call('bdev_uring_delete', params)
445
446
447def bdev_xnvme_create(client, filename, name, io_mechanism):
448    """Create a bdev with xNVMe backend.
449
450    Args:
451        filename: path to device or file (ex: /dev/nvme0n1)
452        name: name of xNVMe bdev to create
453        io_mechanism: I/O mechanism to use (ex: io_uring, io_uring_cmd, etc.)
454
455    Returns:
456        Name of created bdev.
457    """
458    params = {'name': name,
459              'filename': filename,
460              'io_mechanism': io_mechanism}
461
462    return client.call('bdev_xnvme_create', params)
463
464
465def bdev_xnvme_delete(client, name):
466    """Delete a xNVMe bdev.
467
468    Args:
469        name: name of xNVMe bdev to delete
470    """
471    params = {'name': name}
472    return client.call('bdev_xnvme_delete', params)
473
474
475def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, timeout_admin_us=None,
476                          keep_alive_timeout_ms=None, retry_count=None, arbitration_burst=None,
477                          low_priority_weight=None, medium_priority_weight=None, high_priority_weight=None,
478                          nvme_adminq_poll_period_us=None, nvme_ioq_poll_period_us=None, io_queue_requests=None,
479                          delay_cmd_submit=None, transport_retry_count=None, bdev_retry_count=None,
480                          transport_ack_timeout=None, ctrlr_loss_timeout_sec=None, reconnect_delay_sec=None,
481                          fast_io_fail_timeout_sec=None, disable_auto_failback=None):
482    """Set options for the bdev nvme. This is startup command.
483
484    Args:
485        action_on_timeout:  action to take on command time out. Valid values are: none, reset, abort (optional)
486        timeout_us: Timeout for each command, in microseconds. If 0, don't track timeouts (optional)
487        timeout_admin_us: Timeout for each admin command, in microseconds. If 0, treat same as io timeouts (optional)
488        keep_alive_timeout_ms: Keep alive timeout period in millisecond, default is 10s (optional)
489        retry_count: The number of attempts per I/O when an I/O fails (deprecated) (optional)
490        arbitration_burst: The value is expressed as a power of two (optional)
491        low_priority_weight: The number of commands that may be executed from the low priority queue at one time (optional)
492        medium_priority_weight: The number of commands that may be executed from the medium priority queue at one time (optional)
493        high_priority_weight: The number of commands that may be executed from the high priority queue at one time (optional)
494        nvme_adminq_poll_period_us: How often the admin queue is polled for asynchronous events in microseconds (optional)
495        nvme_ioq_poll_period_us: How often to poll I/O queues for completions in microseconds (optional)
496        io_queue_requests: The number of requests allocated for each NVMe I/O queue. Default: 512 (optional)
497        delay_cmd_submit: Enable delayed NVMe command submission to allow batching of multiple commands (optional)
498        transport_retry_count: The number of attempts per I/O in the transport layer when an I/O fails (optional)
499        bdev_retry_count: The number of attempts per I/O in the bdev layer when an I/O fails. -1 means infinite retries. (optional)
500        transport_ack_timeout: Time to wait ack until packet retransmission for RDMA or until closes connection for TCP.
501        Range 0-31 where 0 is driver-specific default value (optional)
502        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
503        -1 means infinite reconnect retries. 0 means no reconnect retry.
504        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
505        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
506        This can be overridden by bdev_nvme_attach_controller. (optional)
507        reconnect_delay_sec: Time to delay a reconnect retry.
508        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
509        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
510        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
511        This can be overridden by bdev_nvme_attach_controller. (optional)
512        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
513        0 means no such timeout.
514        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
515        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1.
516        This can be overridden by bdev_nvme_attach_controller. (optional)
517        disable_auto_failback: Disable automatic failback. bdev_nvme_set_preferred_path can be used to do manual failback.
518        By default, immediately failback to the preferred I/O path if it is restored. (optional)
519
520    """
521    params = {}
522
523    if action_on_timeout:
524        params['action_on_timeout'] = action_on_timeout
525
526    if timeout_us is not None:
527        params['timeout_us'] = timeout_us
528
529    if timeout_admin_us is not None:
530        params['timeout_admin_us'] = timeout_admin_us
531
532    if keep_alive_timeout_ms is not None:
533        params['keep_alive_timeout_ms'] = keep_alive_timeout_ms
534
535    if retry_count is not None:
536        print("WARNING: retry_count is deprecated, please use transport_retry_count.")
537        params['retry_count'] = retry_count
538
539    if arbitration_burst is not None:
540        params['arbitration_burst'] = arbitration_burst
541
542    if low_priority_weight is not None:
543        params['low_priority_weight'] = low_priority_weight
544
545    if medium_priority_weight is not None:
546        params['medium_priority_weight'] = medium_priority_weight
547
548    if high_priority_weight is not None:
549        params['high_priority_weight'] = high_priority_weight
550
551    if nvme_adminq_poll_period_us:
552        params['nvme_adminq_poll_period_us'] = nvme_adminq_poll_period_us
553
554    if nvme_ioq_poll_period_us is not None:
555        params['nvme_ioq_poll_period_us'] = nvme_ioq_poll_period_us
556
557    if io_queue_requests is not None:
558        params['io_queue_requests'] = io_queue_requests
559
560    if delay_cmd_submit is not None:
561        params['delay_cmd_submit'] = delay_cmd_submit
562
563    if transport_retry_count is not None:
564        params['transport_retry_count'] = transport_retry_count
565
566    if bdev_retry_count is not None:
567        params['bdev_retry_count'] = bdev_retry_count
568
569    if transport_ack_timeout is not None:
570        params['transport_ack_timeout'] = transport_ack_timeout
571
572    if ctrlr_loss_timeout_sec is not None:
573        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
574
575    if reconnect_delay_sec is not None:
576        params['reconnect_delay_sec'] = reconnect_delay_sec
577
578    if fast_io_fail_timeout_sec is not None:
579        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
580
581    if disable_auto_failback is not None:
582        params['disable_auto_failback'] = disable_auto_failback
583
584    return client.call('bdev_nvme_set_options', params)
585
586
587def bdev_nvme_set_hotplug(client, enable, period_us=None):
588    """Set options for the bdev nvme. This is startup command.
589
590    Args:
591       enable: True to enable hotplug, False to disable.
592       period_us: how often the hotplug is processed for insert and remove events. Set 0 to reset to default. (optional)
593    """
594    params = {'enable': enable}
595
596    if period_us:
597        params['period_us'] = period_us
598
599    return client.call('bdev_nvme_set_hotplug', params)
600
601
602def bdev_nvme_attach_controller(client, name, trtype, traddr, adrfam=None, trsvcid=None,
603                                priority=None, subnqn=None, hostnqn=None, hostaddr=None,
604                                hostsvcid=None, prchk_reftag=None, prchk_guard=None,
605                                hdgst=None, ddgst=None, fabrics_timeout=None, multipath=None, num_io_queues=None,
606                                ctrlr_loss_timeout_sec=None, reconnect_delay_sec=None,
607                                fast_io_fail_timeout_sec=None, psk=None):
608    """Construct block device for each NVMe namespace in the attached controller.
609
610    Args:
611        name: bdev name prefix; "n" + namespace ID will be appended to create unique names
612        trtype: transport type ("PCIe", "RDMA", "FC", "TCP")
613        traddr: transport address (PCI BDF or IP address)
614        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
615        trsvcid: transport service ID (port number for IP-based addresses)
616        priority: transport connection priority (Sock priority for TCP-based transports; optional)
617        subnqn: subsystem NQN to connect to (optional)
618        hostnqn: NQN to connect from (optional)
619        hostaddr: host transport address (IP address for IP-based transports, NULL for PCIe or FC; optional)
620        hostsvcid: host transport service ID (port number for IP-based transports, NULL for PCIe or FC; optional)
621        prchk_reftag: Enable checking of PI reference tag for I/O processing (optional)
622        prchk_guard: Enable checking of PI guard for I/O processing (optional)
623        hdgst: Enable TCP header digest (optional)
624        ddgst: Enable TCP data digest (optional)
625        fabrics_timeout: Fabrics connect timeout in us (optional)
626        multipath: The behavior when multiple paths are created ("disable", "failover", or "multipath"; failover if not specified)
627        num_io_queues: The number of IO queues to request during initialization. (optional)
628        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
629        -1 means infinite reconnect retries. 0 means no reconnect retry.
630        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
631        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
632        (optional)
633        reconnect_delay_sec: Time to delay a reconnect retry.
634        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
635        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
636        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
637        (optional)
638        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
639        0 means no such timeout.
640        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
641        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional)
642        psk: Set PSK and enable TCP SSL socket implementation (optional)
643
644    Returns:
645        Names of created block devices.
646    """
647    params = {'name': name,
648              'trtype': trtype,
649              'traddr': traddr}
650
651    if hostnqn:
652        params['hostnqn'] = hostnqn
653
654    if hostaddr:
655        params['hostaddr'] = hostaddr
656
657    if hostsvcid:
658        params['hostsvcid'] = hostsvcid
659
660    if adrfam:
661        params['adrfam'] = adrfam
662
663    if trsvcid:
664        params['trsvcid'] = trsvcid
665
666    if priority:
667        params['priority'] = priority
668
669    if subnqn:
670        params['subnqn'] = subnqn
671
672    if prchk_reftag:
673        params['prchk_reftag'] = prchk_reftag
674
675    if prchk_guard:
676        params['prchk_guard'] = prchk_guard
677
678    if hdgst:
679        params['hdgst'] = hdgst
680
681    if ddgst:
682        params['ddgst'] = ddgst
683
684    if fabrics_timeout:
685        params['fabrics_connect_timeout_us'] = fabrics_timeout
686
687    if multipath:
688        params['multipath'] = multipath
689
690    if num_io_queues:
691        params['num_io_queues'] = num_io_queues
692
693    if ctrlr_loss_timeout_sec is not None:
694        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
695
696    if reconnect_delay_sec is not None:
697        params['reconnect_delay_sec'] = reconnect_delay_sec
698
699    if fast_io_fail_timeout_sec is not None:
700        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
701
702    if psk:
703        params['psk'] = psk
704
705    return client.call('bdev_nvme_attach_controller', params)
706
707
708def bdev_nvme_detach_controller(client, name, trtype=None, traddr=None,
709                                adrfam=None, trsvcid=None, subnqn=None,
710                                hostaddr=None, hostsvcid=None):
711    """Detach NVMe controller and delete any associated bdevs. Optionally,
712       If all of the transport ID options are specified, only remove that
713       transport path from the specified controller. If that is the only
714       available path for the controller, this will also result in the
715       controller being detached and the associated bdevs being deleted.
716
717    Args:
718        name: controller name
719        trtype: transport type ("PCIe", "RDMA")
720        traddr: transport address (PCI BDF or IP address)
721        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
722        trsvcid: transport service ID (port number for IP-based addresses)
723        subnqn: subsystem NQN to connect to (optional)
724        hostaddr: Host address (IP address)
725        hostsvcid: transport service ID on host side (port number)
726    """
727
728    params = {'name': name}
729
730    if trtype:
731        params['trtype'] = trtype
732
733    if traddr:
734        params['traddr'] = traddr
735
736    if adrfam:
737        params['adrfam'] = adrfam
738
739    if trsvcid:
740        params['trsvcid'] = trsvcid
741
742    if subnqn:
743        params['subnqn'] = subnqn
744
745    if hostaddr:
746        params['hostaddr'] = hostaddr
747
748    if hostsvcid:
749        params['hostsvcid'] = hostsvcid
750
751    return client.call('bdev_nvme_detach_controller', params)
752
753
754def bdev_nvme_reset_controller(client, name):
755    """Reset NVMe controller.
756
757    Args:
758        name: controller name
759    """
760
761    params = {'name': name}
762
763    return client.call('bdev_nvme_reset_controller', params)
764
765
766def bdev_nvme_start_discovery(client, name, trtype, traddr, adrfam=None, trsvcid=None,
767                              hostnqn=None, wait_for_attach=None, ctrlr_loss_timeout_sec=None,
768                              reconnect_delay_sec=None, fast_io_fail_timeout_sec=None,
769                              attach_timeout_ms=None):
770    """Start discovery with the specified discovery subsystem
771
772    Args:
773        name: bdev name prefix; "n" + namespace ID will be appended to create unique names
774        trtype: transport type ("PCIe", "RDMA", "FC", "TCP")
775        traddr: transport address (PCI BDF or IP address)
776        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
777        trsvcid: transport service ID (port number for IP-based addresses)
778        hostnqn: NQN to connect from (optional)
779        wait_for_attach: Wait to complete RPC until all discovered NVM subsystems have attached (optional)
780        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
781        -1 means infinite reconnect retries. 0 means no reconnect retry.
782        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
783        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
784        (optional)
785        reconnect_delay_sec: Time to delay a reconnect retry.
786        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
787        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
788        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
789        (optional)
790        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
791        0 means no such timeout.
792        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
793        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional)
794        attach_timeout_ms: Time to wait until the discovery and all discovered NVM subsystems are attached (optional)
795    """
796    params = {'name': name,
797              'trtype': trtype,
798              'traddr': traddr}
799
800    if hostnqn:
801        params['hostnqn'] = hostnqn
802
803    if adrfam:
804        params['adrfam'] = adrfam
805
806    if trsvcid:
807        params['trsvcid'] = trsvcid
808
809    if wait_for_attach:
810        params['wait_for_attach'] = True
811
812    if attach_timeout_ms is not None:
813        params['attach_timeout_ms'] = attach_timeout_ms
814
815    if ctrlr_loss_timeout_sec is not None:
816        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
817
818    if reconnect_delay_sec is not None:
819        params['reconnect_delay_sec'] = reconnect_delay_sec
820
821    if fast_io_fail_timeout_sec is not None:
822        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
823
824    return client.call('bdev_nvme_start_discovery', params)
825
826
827def bdev_nvme_stop_discovery(client, name):
828    """Stop a previously started discovery service
829
830    Args:
831        name: name of discovery service to start
832    """
833    params = {'name': name}
834
835    return client.call('bdev_nvme_stop_discovery', params)
836
837
838def bdev_nvme_get_discovery_info(client):
839    """Get information about the automatic discovery
840    """
841    return client.call('bdev_nvme_get_discovery_info')
842
843
844def bdev_nvme_get_io_paths(client, name):
845    """Display all or the specified NVMe bdev's active I/O paths
846
847    Args:
848        name: Name of the NVMe bdev (optional)
849
850    Returns:
851        List of active I/O paths
852    """
853    params = {}
854    if name:
855        params['name'] = name
856    return client.call('bdev_nvme_get_io_paths', params)
857
858
859def bdev_nvme_set_preferred_path(client, name, cntlid):
860    """Set the preferred I/O path for an NVMe bdev when in multipath mode
861
862    Args:
863        name: NVMe bdev name
864        cntlid: NVMe-oF controller ID
865    """
866
867    params = {'name': name,
868              'cntlid': cntlid}
869
870    return client.call('bdev_nvme_set_preferred_path', params)
871
872
873def bdev_nvme_set_multipath_policy(client, name, policy):
874    """Set multipath policy of the NVMe bdev
875
876    Args:
877        name: NVMe bdev name
878        policy: Multipath policy (active_passive or active_active)
879    """
880
881    params = {'name': name,
882              'policy': policy}
883
884    return client.call('bdev_nvme_set_multipath_policy', params)
885
886
887def bdev_nvme_cuse_register(client, name):
888    """Register CUSE devices on NVMe controller.
889
890    Args:
891        name: Name of the operating NVMe controller
892    """
893    params = {'name': name}
894
895    return client.call('bdev_nvme_cuse_register', params)
896
897
898def bdev_nvme_cuse_unregister(client, name):
899    """Unregister CUSE devices on NVMe controller.
900
901    Args:
902        name: Name of the operating NVMe controller
903    """
904    params = {'name': name}
905
906    return client.call('bdev_nvme_cuse_unregister', params)
907
908
909def bdev_zone_block_create(client, name, base_bdev, zone_capacity, optimal_open_zones):
910    """Creates a virtual zone device on top of existing non-zoned bdev.
911
912    Args:
913        name: Zone device name
914        base_bdev: Base Nvme bdev name
915        zone_capacity: Surfaced zone capacity in blocks
916        optimal_open_zones: Number of zones required to reach optimal write speed (optional, default: 1)
917
918    Returns:
919        Name of created block device.
920    """
921    params = {'name': name,
922              'base_bdev': base_bdev,
923              'zone_capacity': zone_capacity,
924              'optimal_open_zones': optimal_open_zones}
925
926    return client.call('bdev_zone_block_create', params)
927
928
929def bdev_zone_block_delete(client, name):
930    """Remove block zone bdev from the system.
931
932    Args:
933        name: name of block zone bdev to delete
934    """
935    params = {'name': name}
936    return client.call('bdev_zone_block_delete', params)
937
938
939def bdev_rbd_register_cluster(client, name, user=None, config_param=None, config_file=None, key_file=None):
940    """Create a Rados Cluster object of the Ceph RBD backend.
941
942    Args:
943        name: name of Rados Cluster
944        user: Ceph user name (optional)
945        config_param: map of config keys to values (optional)
946        config_file: file path of Ceph configuration file (optional)
947        key_file: file path of Ceph key file (optional)
948
949    Returns:
950        Name of registered Rados Cluster object.
951    """
952    params = {'name': name}
953
954    if user is not None:
955        params['user_id'] = user
956    if config_param is not None:
957        params['config_param'] = config_param
958    if config_file is not None:
959        params['config_file'] = config_file
960    if key_file is not None:
961        params['key_file'] = key_file
962
963    return client.call('bdev_rbd_register_cluster', params)
964
965
966def bdev_rbd_unregister_cluster(client, name):
967    """Remove Rados cluster object from the system.
968
969    Args:
970        name: name of Rados cluster object to unregister
971    """
972    params = {'name': name}
973    return client.call('bdev_rbd_unregister_cluster', params)
974
975
976def bdev_rbd_get_clusters_info(client, name):
977    """Get the cluster(s) info
978
979    Args:
980        name: name of Rados cluster object to query (optional; if omitted, query all clusters)
981
982    Returns:
983        List of registered Rados cluster information objects.
984    """
985    params = {}
986    if name:
987        params['name'] = name
988    return client.call('bdev_rbd_get_clusters_info', params)
989
990
991def bdev_rbd_create(client, pool_name, rbd_name, block_size, name=None, user=None, config=None, cluster_name=None, uuid=None):
992    """Create a Ceph RBD block device.
993
994    Args:
995        pool_name: Ceph RBD pool name
996        rbd_name: Ceph RBD image name
997        block_size: block size of RBD volume
998        name: name of block device (optional)
999        user: Ceph user name (optional)
1000        config: map of config keys to values (optional)
1001        cluster_name: Name to identify Rados cluster (optional)
1002        uuid: UUID of block device (optional)
1003
1004    Returns:
1005        Name of created block device.
1006    """
1007    params = {
1008        'pool_name': pool_name,
1009        'rbd_name': rbd_name,
1010        'block_size': block_size,
1011    }
1012
1013    if name:
1014        params['name'] = name
1015    if user is not None:
1016        params['user_id'] = user
1017    if config is not None:
1018        params['config'] = config
1019    if cluster_name is not None:
1020        params['cluster_name'] = cluster_name
1021    else:
1022        print("WARNING:bdev_rbd_create should be used with specifying -c to have a cluster name after bdev_rbd_register_cluster.")
1023    if uuid is not None:
1024        params['uuid'] = uuid
1025
1026    return client.call('bdev_rbd_create', params)
1027
1028
1029def bdev_rbd_delete(client, name):
1030    """Remove rbd bdev from the system.
1031
1032    Args:
1033        name: name of rbd bdev to delete
1034    """
1035    params = {'name': name}
1036    return client.call('bdev_rbd_delete', params)
1037
1038
1039def bdev_rbd_resize(client, name, new_size):
1040    """Resize rbd bdev in the system.
1041
1042    Args:
1043        name: name of rbd bdev to resize
1044        new_size: new bdev size of resize operation. The unit is MiB
1045    """
1046    params = {
1047            'name': name,
1048            'new_size': new_size,
1049            }
1050    return client.call('bdev_rbd_resize', params)
1051
1052
1053def bdev_error_create(client, base_name):
1054    """Construct an error injection block device.
1055
1056    Args:
1057        base_name: base bdev name
1058    """
1059    params = {'base_name': base_name}
1060    return client.call('bdev_error_create', params)
1061
1062
1063def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency):
1064    """Construct a delay block device.
1065
1066    Args:
1067        base_bdev_name: name of the existing bdev
1068        name: name of block device
1069        avg_read_latency: complete 99% of read ops with this delay
1070        p99_read_latency: complete 1% of read ops with this delay
1071        avg_write_latency: complete 99% of write ops with this delay
1072        p99_write_latency: complete 1% of write ops with this delay
1073
1074    Returns:
1075        Name of created block device.
1076    """
1077    params = {
1078        'base_bdev_name': base_bdev_name,
1079        'name': name,
1080        'avg_read_latency': avg_read_latency,
1081        'p99_read_latency': p99_read_latency,
1082        'avg_write_latency': avg_write_latency,
1083        'p99_write_latency': p99_write_latency,
1084    }
1085    return client.call('bdev_delay_create', params)
1086
1087
1088def bdev_delay_delete(client, name):
1089    """Remove delay bdev from the system.
1090
1091    Args:
1092        name: name of delay bdev to delete
1093    """
1094    params = {'name': name}
1095    return client.call('bdev_delay_delete', params)
1096
1097
1098def bdev_delay_update_latency(client, delay_bdev_name, latency_type, latency_us):
1099    """Update the latency value for a delay block device
1100
1101    Args:
1102        delay_bdev_name: name of the delay bdev
1103        latency_type: 'one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.'
1104        latency_us: 'new latency value.'
1105
1106    Returns:
1107        True if successful, or a specific error otherwise.
1108    """
1109    params = {
1110        'delay_bdev_name': delay_bdev_name,
1111        'latency_type': latency_type,
1112        'latency_us': latency_us,
1113    }
1114    return client.call('bdev_delay_update_latency', params)
1115
1116
1117def bdev_error_delete(client, name):
1118    """Remove error bdev from the system.
1119
1120    Args:
1121        bdev_name: name of error bdev to delete
1122    """
1123    params = {'name': name}
1124    return client.call('bdev_error_delete', params)
1125
1126
1127def bdev_iscsi_set_options(client, timeout_sec):
1128    """Set options for the bdev iscsi.
1129
1130    Args:
1131        timeout_sec: Timeout for command, in seconds, if 0, don't track timeout
1132    """
1133    params = {}
1134
1135    if timeout_sec is not None:
1136        params['timeout_sec'] = timeout_sec
1137
1138    return client.call('bdev_iscsi_set_options', params)
1139
1140
1141def bdev_iscsi_create(client, name, url, initiator_iqn):
1142    """Construct an iSCSI block device.
1143
1144    Args:
1145        name: name of block device
1146        url: iSCSI URL
1147        initiator_iqn: IQN name to be used by initiator
1148
1149    Returns:
1150        Name of created block device.
1151    """
1152    params = {
1153        'name': name,
1154        'url': url,
1155        'initiator_iqn': initiator_iqn,
1156    }
1157    return client.call('bdev_iscsi_create', params)
1158
1159
1160def bdev_iscsi_delete(client, name):
1161    """Remove iSCSI bdev from the system.
1162
1163    Args:
1164        bdev_name: name of iSCSI bdev to delete
1165    """
1166    params = {'name': name}
1167    return client.call('bdev_iscsi_delete', params)
1168
1169
1170def bdev_pmem_create(client, pmem_file, name):
1171    """Construct a libpmemblk block device.
1172
1173    Args:
1174        pmem_file: path to pmemblk pool file
1175        name: name of block device
1176
1177    Returns:
1178        Name of created block device.
1179    """
1180    params = {
1181        'pmem_file': pmem_file,
1182        'name': name
1183    }
1184    return client.call('bdev_pmem_create', params)
1185
1186
1187def bdev_pmem_delete(client, name):
1188    """Remove pmem bdev from the system.
1189
1190    Args:
1191        name: name of pmem bdev to delete
1192    """
1193    params = {'name': name}
1194    return client.call('bdev_pmem_delete', params)
1195
1196
1197def bdev_passthru_create(client, base_bdev_name, name):
1198    """Construct a pass-through block device.
1199
1200    Args:
1201        base_bdev_name: name of the existing bdev
1202        name: name of block device
1203
1204    Returns:
1205        Name of created block device.
1206    """
1207    params = {
1208        'base_bdev_name': base_bdev_name,
1209        'name': name,
1210    }
1211    return client.call('bdev_passthru_create', params)
1212
1213
1214def bdev_passthru_delete(client, name):
1215    """Remove pass through bdev from the system.
1216
1217    Args:
1218        name: name of pass through bdev to delete
1219    """
1220    params = {'name': name}
1221    return client.call('bdev_passthru_delete', params)
1222
1223
1224def bdev_opal_create(client, nvme_ctrlr_name, nsid, locking_range_id, range_start, range_length, password):
1225    """Create opal virtual block devices from a base nvme bdev.
1226
1227    Args:
1228        nvme_ctrlr_name: name of the nvme ctrlr
1229        nsid: namespace ID of nvme ctrlr
1230        locking_range_id: locking range ID corresponding to this virtual bdev
1231        range_start: start address of this locking range
1232        range_length: length of this locking range
1233        password: admin password of base nvme bdev
1234
1235    Returns:
1236        Name of the new created block devices.
1237    """
1238    params = {
1239        'nvme_ctrlr_name': nvme_ctrlr_name,
1240        'nsid': nsid,
1241        'locking_range_id': locking_range_id,
1242        'range_start': range_start,
1243        'range_length': range_length,
1244        'password': password,
1245    }
1246
1247    return client.call('bdev_opal_create', params)
1248
1249
1250def bdev_opal_get_info(client, bdev_name, password):
1251    """Get opal locking range info.
1252
1253    Args:
1254        bdev_name: name of opal vbdev to get info
1255        password: admin password
1256
1257    Returns:
1258        Locking range info.
1259    """
1260    params = {
1261        'bdev_name': bdev_name,
1262        'password': password,
1263    }
1264
1265    return client.call('bdev_opal_get_info', params)
1266
1267
1268def bdev_opal_delete(client, bdev_name, password):
1269    """Delete opal virtual bdev from the system.
1270
1271    Args:
1272        bdev_name: name of opal vbdev to delete
1273        password: admin password of base nvme bdev
1274    """
1275    params = {
1276        'bdev_name': bdev_name,
1277        'password': password,
1278    }
1279
1280    return client.call('bdev_opal_delete', params)
1281
1282
1283def bdev_opal_new_user(client, bdev_name, admin_password, user_id, user_password):
1284    """Add a user to opal bdev who can set lock state for this bdev.
1285
1286    Args:
1287        bdev_name: name of opal vbdev
1288        admin_password: admin password
1289        user_id: ID of the user who will be added to this opal bdev
1290        user_password: password set for this user
1291    """
1292    params = {
1293        'bdev_name': bdev_name,
1294        'admin_password': admin_password,
1295        'user_id': user_id,
1296        'user_password': user_password,
1297    }
1298
1299    return client.call('bdev_opal_new_user', params)
1300
1301
1302def bdev_opal_set_lock_state(client, bdev_name, user_id, password, lock_state):
1303    """set lock state for an opal bdev.
1304
1305    Args:
1306        bdev_name: name of opal vbdev
1307        user_id: ID of the user who will set lock state
1308        password: password of the user
1309        lock_state: lock state to set
1310    """
1311    params = {
1312        'bdev_name': bdev_name,
1313        'user_id': user_id,
1314        'password': password,
1315        'lock_state': lock_state,
1316    }
1317
1318    return client.call('bdev_opal_set_lock_state', params)
1319
1320
1321def bdev_split_create(client, base_bdev, split_count, split_size_mb=None):
1322    """Create split block devices from a base bdev.
1323
1324    Args:
1325        base_bdev: name of bdev to split
1326        split_count: number of split bdevs to create
1327        split_size_mb: size of each split volume in MiB (optional)
1328
1329    Returns:
1330        List of created block devices.
1331    """
1332    params = {
1333        'base_bdev': base_bdev,
1334        'split_count': split_count,
1335    }
1336    if split_size_mb:
1337        params['split_size_mb'] = split_size_mb
1338
1339    return client.call('bdev_split_create', params)
1340
1341
1342def bdev_split_delete(client, base_bdev):
1343    """Delete split block devices.
1344
1345    Args:
1346        base_bdev: name of previously split bdev
1347    """
1348    params = {
1349        'base_bdev': base_bdev,
1350    }
1351
1352    return client.call('bdev_split_delete', params)
1353
1354
1355def bdev_ftl_create(client, name, base_bdev, **kwargs):
1356    """Construct FTL bdev
1357
1358    Args:
1359        name: name of the bdev
1360        base_bdev: name of the base bdev
1361        kwargs: optional parameters
1362    """
1363    params = {'name': name,
1364              'base_bdev': base_bdev}
1365    for key, value in kwargs.items():
1366        if value is not None:
1367            params[key] = value
1368
1369    return client.call('bdev_ftl_create', params)
1370
1371
1372def bdev_ftl_load(client, name, base_bdev, **kwargs):
1373    """Load FTL bdev
1374
1375    Args:
1376        name: name of the bdev
1377        base_bdev: name of the base bdev
1378        kwargs: optional parameters
1379    """
1380    params = {'name': name,
1381              'base_bdev': base_bdev}
1382    for key, value in kwargs.items():
1383        if value is not None:
1384            params[key] = value
1385
1386    return client.call('bdev_ftl_load', params)
1387
1388
1389def bdev_ftl_unload(client, name, fast_shutdown):
1390    """Unload FTL bdev
1391
1392    Args:
1393        name: name of the bdev
1394    """
1395    params = {'name': name}
1396
1397    return client.call('bdev_ftl_unload', params)
1398
1399
1400def bdev_ftl_delete(client, name, fast_shutdown):
1401    """Delete FTL bdev
1402
1403    Args:
1404        name: name of the bdev
1405    """
1406    params = {'name': name,
1407              'fast_shutdown': fast_shutdown}
1408
1409    return client.call('bdev_ftl_delete', params)
1410
1411
1412def bdev_ftl_unmap(client, name, lba, num_blocks):
1413    """FTL unmap
1414
1415    Args:
1416        name: name of the bdev
1417        lba: starting lba to be unmapped
1418        num_blocks: number of blocks to unmap
1419    """
1420    params = {'name': name,
1421              'lba': lba,
1422              'num_blocks': num_blocks}
1423
1424    return client.call('bdev_ftl_unmap', params)
1425
1426
1427def bdev_ftl_get_stats(client, name):
1428    """get FTL stats
1429
1430    Args:
1431        name: name of the bdev
1432    """
1433    params = {'name': name}
1434
1435    return client.call('bdev_ftl_get_stats', params)
1436
1437
1438def bdev_get_bdevs(client, name=None, timeout=None):
1439    """Get information about block devices.
1440
1441    Args:
1442        name: bdev name to query (optional; if omitted, query all bdevs)
1443        timeout: time in ms to wait for the bdev with specified name to appear
1444
1445    Returns:
1446        List of bdev information objects.
1447    """
1448    params = {}
1449    if name:
1450        params['name'] = name
1451    if timeout:
1452        params['timeout'] = timeout
1453    return client.call('bdev_get_bdevs', params)
1454
1455
1456def bdev_get_iostat(client, name=None):
1457    """Get I/O statistics for block devices.
1458
1459    Args:
1460        name: bdev name to query (optional; if omitted, query all bdevs)
1461
1462    Returns:
1463        I/O statistics for the requested block devices.
1464    """
1465    params = {}
1466    if name:
1467        params['name'] = name
1468    return client.call('bdev_get_iostat', params)
1469
1470
1471def bdev_enable_histogram(client, name, enable):
1472    """Control whether histogram is enabled for specified bdev.
1473
1474    Args:
1475        bdev_name: name of bdev
1476    """
1477    params = {'name': name, "enable": enable}
1478    return client.call('bdev_enable_histogram', params)
1479
1480
1481def bdev_get_histogram(client, name):
1482    """Get histogram for specified bdev.
1483
1484    Args:
1485        bdev_name: name of bdev
1486    """
1487    params = {'name': name}
1488    return client.call('bdev_get_histogram', params)
1489
1490
1491def bdev_error_inject_error(client, name, io_type, error_type, num=1):
1492    """Inject an error via an error bdev.
1493
1494    Args:
1495        name: name of error bdev
1496        io_type: one of "clear", "read", "write", "unmap", "flush", or "all"
1497        error_type: one of "failure" or "pending"
1498        num: number of commands to fail
1499    """
1500    params = {
1501        'name': name,
1502        'io_type': io_type,
1503        'error_type': error_type,
1504    }
1505
1506    if num:
1507        params['num'] = num
1508
1509    return client.call('bdev_error_inject_error', params)
1510
1511
1512def bdev_set_qd_sampling_period(client, name, period):
1513    """Enable queue depth tracking on a specified bdev.
1514
1515    Args:
1516        name: name of a bdev on which to track queue depth.
1517        period: period (in microseconds) at which to update the queue depth reading. If set to 0, polling will be disabled.
1518    """
1519
1520    params = {}
1521    params['name'] = name
1522    params['period'] = period
1523    return client.call('bdev_set_qd_sampling_period', params)
1524
1525
1526def bdev_set_qos_limit(
1527        client,
1528        name,
1529        rw_ios_per_sec=None,
1530        rw_mbytes_per_sec=None,
1531        r_mbytes_per_sec=None,
1532        w_mbytes_per_sec=None):
1533    """Set QoS rate limit on a block device.
1534
1535    Args:
1536        name: name of block device
1537        rw_ios_per_sec: R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited.
1538        rw_mbytes_per_sec: R/W megabytes per second limit (>=10, example: 100). 0 means unlimited.
1539        r_mbytes_per_sec: Read megabytes per second limit (>=10, example: 100). 0 means unlimited.
1540        w_mbytes_per_sec: Write megabytes per second limit (>=10, example: 100). 0 means unlimited.
1541    """
1542    params = {}
1543    params['name'] = name
1544    if rw_ios_per_sec is not None:
1545        params['rw_ios_per_sec'] = rw_ios_per_sec
1546    if rw_mbytes_per_sec is not None:
1547        params['rw_mbytes_per_sec'] = rw_mbytes_per_sec
1548    if r_mbytes_per_sec is not None:
1549        params['r_mbytes_per_sec'] = r_mbytes_per_sec
1550    if w_mbytes_per_sec is not None:
1551        params['w_mbytes_per_sec'] = w_mbytes_per_sec
1552    return client.call('bdev_set_qos_limit', params)
1553
1554
1555def bdev_nvme_apply_firmware(client, bdev_name, filename):
1556    """Download and commit firmware to NVMe device.
1557
1558    Args:
1559        bdev_name: name of NVMe block device
1560        filename: filename of the firmware to download
1561    """
1562    params = {
1563        'filename': filename,
1564        'bdev_name': bdev_name,
1565    }
1566    return client.call('bdev_nvme_apply_firmware', params)
1567
1568
1569def bdev_nvme_get_transport_statistics(client):
1570    """Get bdev_nvme poll group transport statistics"""
1571    return client.call('bdev_nvme_get_transport_statistics')
1572
1573
1574def bdev_nvme_get_controller_health_info(client, name):
1575    """Display health log of the required NVMe bdev controller.
1576
1577    Args:
1578        name: name of the required NVMe bdev controller
1579
1580    Returns:
1581        Health log for the requested NVMe bdev controller.
1582    """
1583    params = {}
1584    params['name'] = name
1585    return client.call('bdev_nvme_get_controller_health_info', params)
1586
1587
1588def bdev_daos_create(client, num_blocks, block_size, pool, cont, name, oclass=None, uuid=None):
1589    """Construct DAOS block device.
1590
1591    Args:
1592        num_blocks: size of block device in blocks
1593        block_size: block size of device; must be a power of 2 and at least 512
1594        name: name of block device (also the name of the backend file on DAOS DFS)
1595        pool: UUID of DAOS pool
1596        cont: UUID of DAOS container
1597        uuid: UUID of block device (optional)
1598        oclass: DAOS object class (optional)
1599
1600    Returns:
1601        Name of created block device.
1602    """
1603    params = {'num_blocks': num_blocks, 'block_size': block_size, 'pool': pool, 'cont': cont, 'name': name}
1604    if uuid:
1605        params['uuid'] = uuid
1606    if oclass:
1607        params['oclass'] = oclass
1608    return client.call('bdev_daos_create', params)
1609
1610
1611def bdev_daos_delete(client, name):
1612    """Delete DAOS block device.
1613
1614    Args:
1615        bdev_name: name of DAOS bdev to delete
1616    """
1617    params = {'name': name}
1618    return client.call('bdev_daos_delete', params)
1619
1620
1621def bdev_daos_resize(client, name, new_size):
1622    """Resize DAOS bdev in the system.
1623    Args:
1624        name: name of DAOS bdev to resize
1625        new_size: new bdev size of resize operation. The unit is MiB
1626    """
1627    params = {
1628            'name': name,
1629            'new_size': new_size,
1630            }
1631    return client.call('bdev_daos_resize', params)
1632