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