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