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