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