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