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