xref: /spdk/python/spdk/rpc/bdev.py (revision 7bcd316de1f71f5ca5303d08ac26df20dcd05669)
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                              attach_timeout_ms=None):
755    """Start discovery with the specified discovery subsystem
756
757    Args:
758        name: bdev name prefix; "n" + namespace ID will be appended to create unique names
759        trtype: transport type ("PCIe", "RDMA", "FC", "TCP")
760        traddr: transport address (PCI BDF or IP address)
761        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
762        trsvcid: transport service ID (port number for IP-based addresses)
763        hostnqn: NQN to connect from (optional)
764        wait_for_attach: Wait to complete RPC until all discovered NVM subsystems have attached (optional)
765        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
766        -1 means infinite reconnect retries. 0 means no reconnect retry.
767        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
768        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
769        (optional)
770        reconnect_delay_sec: Time to delay a reconnect retry.
771        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
772        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
773        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
774        (optional)
775        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
776        0 means no such timeout.
777        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
778        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional)
779        attach_timeout_ms: Time to wait until the discovery and all discovered NVM subsystems are attached (optional)
780    """
781    params = {'name': name,
782              'trtype': trtype,
783              'traddr': traddr}
784
785    if hostnqn:
786        params['hostnqn'] = hostnqn
787
788    if adrfam:
789        params['adrfam'] = adrfam
790
791    if trsvcid:
792        params['trsvcid'] = trsvcid
793
794    if wait_for_attach:
795        params['wait_for_attach'] = True
796
797    if attach_timeout_ms is not None:
798        params['attach_timeout_ms'] = attach_timeout_ms
799
800    if ctrlr_loss_timeout_sec is not None:
801        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
802
803    if reconnect_delay_sec is not None:
804        params['reconnect_delay_sec'] = reconnect_delay_sec
805
806    if fast_io_fail_timeout_sec is not None:
807        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
808
809    return client.call('bdev_nvme_start_discovery', params)
810
811
812def bdev_nvme_stop_discovery(client, name):
813    """Stop a previously started discovery service
814
815    Args:
816        name: name of discovery service to start
817    """
818    params = {'name': name}
819
820    return client.call('bdev_nvme_stop_discovery', params)
821
822
823def bdev_nvme_get_discovery_info(client):
824    """Get information about the automatic discovery
825    """
826    return client.call('bdev_nvme_get_discovery_info')
827
828
829def bdev_nvme_get_io_paths(client, name):
830    """Display all or the specified NVMe bdev's active I/O paths
831
832    Args:
833        name: Name of the NVMe bdev (optional)
834
835    Returns:
836        List of active I/O paths
837    """
838    params = {}
839    if name:
840        params['name'] = name
841    return client.call('bdev_nvme_get_io_paths', params)
842
843
844def bdev_nvme_set_preferred_path(client, name, cntlid):
845    """Set the preferred I/O path for an NVMe bdev when in multipath mode
846
847    Args:
848        name: NVMe bdev name
849        cntlid: NVMe-oF controller ID
850    """
851
852    params = {'name': name,
853              'cntlid': cntlid}
854
855    return client.call('bdev_nvme_set_preferred_path', params)
856
857
858def bdev_nvme_set_multipath_policy(client, name, policy):
859    """Set multipath policy of the NVMe bdev
860
861    Args:
862        name: NVMe bdev name
863        policy: Multipath policy (active_passive or active_active)
864    """
865
866    params = {'name': name,
867              'policy': policy}
868
869    return client.call('bdev_nvme_set_multipath_policy', params)
870
871
872def bdev_nvme_cuse_register(client, name):
873    """Register CUSE devices on NVMe controller.
874
875    Args:
876        name: Name of the operating NVMe controller
877    """
878    params = {'name': name}
879
880    return client.call('bdev_nvme_cuse_register', params)
881
882
883def bdev_nvme_cuse_unregister(client, name):
884    """Unregister CUSE devices on NVMe controller.
885
886    Args:
887        name: Name of the operating NVMe controller
888    """
889    params = {'name': name}
890
891    return client.call('bdev_nvme_cuse_unregister', params)
892
893
894def bdev_zone_block_create(client, name, base_bdev, zone_capacity, optimal_open_zones):
895    """Creates a virtual zone device on top of existing non-zoned bdev.
896
897    Args:
898        name: Zone device name
899        base_bdev: Base Nvme bdev name
900        zone_capacity: Surfaced zone capacity in blocks
901        optimal_open_zones: Number of zones required to reach optimal write speed (optional, default: 1)
902
903    Returns:
904        Name of created block device.
905    """
906    params = {'name': name,
907              'base_bdev': base_bdev,
908              'zone_capacity': zone_capacity,
909              'optimal_open_zones': optimal_open_zones}
910
911    return client.call('bdev_zone_block_create', params)
912
913
914def bdev_zone_block_delete(client, name):
915    """Remove block zone bdev from the system.
916
917    Args:
918        name: name of block zone bdev to delete
919    """
920    params = {'name': name}
921    return client.call('bdev_zone_block_delete', params)
922
923
924def bdev_rbd_register_cluster(client, name, user=None, config_param=None, config_file=None, key_file=None):
925    """Create a Rados Cluster object of the Ceph RBD backend.
926
927    Args:
928        name: name of Rados Cluster
929        user: Ceph user name (optional)
930        config_param: map of config keys to values (optional)
931        config_file: file path of Ceph configuration file (optional)
932        key_file: file path of Ceph key file (optional)
933
934    Returns:
935        Name of registered Rados Cluster object.
936    """
937    params = {'name': name}
938
939    if user is not None:
940        params['user_id'] = user
941    if config_param is not None:
942        params['config_param'] = config_param
943    if config_file is not None:
944        params['config_file'] = config_file
945    if key_file is not None:
946        params['key_file'] = key_file
947
948    return client.call('bdev_rbd_register_cluster', params)
949
950
951def bdev_rbd_unregister_cluster(client, name):
952    """Remove Rados cluster object from the system.
953
954    Args:
955        name: name of Rados cluster object to unregister
956    """
957    params = {'name': name}
958    return client.call('bdev_rbd_unregister_cluster', params)
959
960
961def bdev_rbd_get_clusters_info(client, name):
962    """Get the cluster(s) info
963
964    Args:
965        name: name of Rados cluster object to query (optional; if omitted, query all clusters)
966
967    Returns:
968        List of registered Rados cluster information objects.
969    """
970    params = {}
971    if name:
972        params['name'] = name
973    return client.call('bdev_rbd_get_clusters_info', params)
974
975
976@deprecated_alias('construct_rbd_bdev')
977def bdev_rbd_create(client, pool_name, rbd_name, block_size, name=None, user=None, config=None, cluster_name=None, uuid=None):
978    """Create a Ceph RBD block device.
979
980    Args:
981        pool_name: Ceph RBD pool name
982        rbd_name: Ceph RBD image name
983        block_size: block size of RBD volume
984        name: name of block device (optional)
985        user: Ceph user name (optional)
986        config: map of config keys to values (optional)
987        cluster_name: Name to identify Rados cluster (optional)
988        uuid: UUID of block device (optional)
989
990    Returns:
991        Name of created block device.
992    """
993    params = {
994        'pool_name': pool_name,
995        'rbd_name': rbd_name,
996        'block_size': block_size,
997    }
998
999    if name:
1000        params['name'] = name
1001    if user is not None:
1002        params['user_id'] = user
1003    if config is not None:
1004        params['config'] = config
1005    if cluster_name is not None:
1006        params['cluster_name'] = cluster_name
1007    if uuid is not None:
1008        params['uuid'] = uuid
1009
1010    return client.call('bdev_rbd_create', params)
1011
1012
1013@deprecated_alias('delete_rbd_bdev')
1014def bdev_rbd_delete(client, name):
1015    """Remove rbd bdev from the system.
1016
1017    Args:
1018        name: name of rbd bdev to delete
1019    """
1020    params = {'name': name}
1021    return client.call('bdev_rbd_delete', params)
1022
1023
1024def bdev_rbd_resize(client, name, new_size):
1025    """Resize rbd bdev in the system.
1026
1027    Args:
1028        name: name of rbd bdev to resize
1029        new_size: new bdev size of resize operation. The unit is MiB
1030    """
1031    params = {
1032            'name': name,
1033            'new_size': new_size,
1034            }
1035    return client.call('bdev_rbd_resize', params)
1036
1037
1038@deprecated_alias('construct_error_bdev')
1039def bdev_error_create(client, base_name):
1040    """Construct an error injection block device.
1041
1042    Args:
1043        base_name: base bdev name
1044    """
1045    params = {'base_name': base_name}
1046    return client.call('bdev_error_create', params)
1047
1048
1049def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency):
1050    """Construct a delay block device.
1051
1052    Args:
1053        base_bdev_name: name of the existing bdev
1054        name: name of block device
1055        avg_read_latency: complete 99% of read ops with this delay
1056        p99_read_latency: complete 1% of read ops with this delay
1057        avg_write_latency: complete 99% of write ops with this delay
1058        p99_write_latency: complete 1% of write ops with this delay
1059
1060    Returns:
1061        Name of created block device.
1062    """
1063    params = {
1064        'base_bdev_name': base_bdev_name,
1065        'name': name,
1066        'avg_read_latency': avg_read_latency,
1067        'p99_read_latency': p99_read_latency,
1068        'avg_write_latency': avg_write_latency,
1069        'p99_write_latency': p99_write_latency,
1070    }
1071    return client.call('bdev_delay_create', params)
1072
1073
1074def bdev_delay_delete(client, name):
1075    """Remove delay bdev from the system.
1076
1077    Args:
1078        name: name of delay bdev to delete
1079    """
1080    params = {'name': name}
1081    return client.call('bdev_delay_delete', params)
1082
1083
1084def bdev_delay_update_latency(client, delay_bdev_name, latency_type, latency_us):
1085    """Update the latency value for a delay block device
1086
1087    Args:
1088        delay_bdev_name: name of the delay bdev
1089        latency_type: 'one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.'
1090        latency_us: 'new latency value.'
1091
1092    Returns:
1093        True if successful, or a specific error otherwise.
1094    """
1095    params = {
1096        'delay_bdev_name': delay_bdev_name,
1097        'latency_type': latency_type,
1098        'latency_us': latency_us,
1099    }
1100    return client.call('bdev_delay_update_latency', params)
1101
1102
1103@deprecated_alias('delete_error_bdev')
1104def bdev_error_delete(client, name):
1105    """Remove error bdev from the system.
1106
1107    Args:
1108        bdev_name: name of error bdev to delete
1109    """
1110    params = {'name': name}
1111    return client.call('bdev_error_delete', params)
1112
1113
1114@deprecated_alias('construct_iscsi_bdev')
1115def bdev_iscsi_create(client, name, url, initiator_iqn):
1116    """Construct an iSCSI block device.
1117
1118    Args:
1119        name: name of block device
1120        url: iSCSI URL
1121        initiator_iqn: IQN name to be used by initiator
1122
1123    Returns:
1124        Name of created block device.
1125    """
1126    params = {
1127        'name': name,
1128        'url': url,
1129        'initiator_iqn': initiator_iqn,
1130    }
1131    return client.call('bdev_iscsi_create', params)
1132
1133
1134@deprecated_alias('delete_iscsi_bdev')
1135def bdev_iscsi_delete(client, name):
1136    """Remove iSCSI bdev from the system.
1137
1138    Args:
1139        bdev_name: name of iSCSI bdev to delete
1140    """
1141    params = {'name': name}
1142    return client.call('bdev_iscsi_delete', params)
1143
1144
1145@deprecated_alias('construct_pmem_bdev')
1146def bdev_pmem_create(client, pmem_file, name):
1147    """Construct a libpmemblk block device.
1148
1149    Args:
1150        pmem_file: path to pmemblk pool file
1151        name: name of block device
1152
1153    Returns:
1154        Name of created block device.
1155    """
1156    params = {
1157        'pmem_file': pmem_file,
1158        'name': name
1159    }
1160    return client.call('bdev_pmem_create', params)
1161
1162
1163@deprecated_alias('delete_pmem_bdev')
1164def bdev_pmem_delete(client, name):
1165    """Remove pmem bdev from the system.
1166
1167    Args:
1168        name: name of pmem bdev to delete
1169    """
1170    params = {'name': name}
1171    return client.call('bdev_pmem_delete', params)
1172
1173
1174@deprecated_alias('construct_passthru_bdev')
1175def bdev_passthru_create(client, base_bdev_name, name):
1176    """Construct a pass-through block device.
1177
1178    Args:
1179        base_bdev_name: name of the existing bdev
1180        name: name of block device
1181
1182    Returns:
1183        Name of created block device.
1184    """
1185    params = {
1186        'base_bdev_name': base_bdev_name,
1187        'name': name,
1188    }
1189    return client.call('bdev_passthru_create', params)
1190
1191
1192@deprecated_alias('delete_passthru_bdev')
1193def bdev_passthru_delete(client, name):
1194    """Remove pass through bdev from the system.
1195
1196    Args:
1197        name: name of pass through bdev to delete
1198    """
1199    params = {'name': name}
1200    return client.call('bdev_passthru_delete', params)
1201
1202
1203def bdev_opal_create(client, nvme_ctrlr_name, nsid, locking_range_id, range_start, range_length, password):
1204    """Create opal virtual block devices from a base nvme bdev.
1205
1206    Args:
1207        nvme_ctrlr_name: name of the nvme ctrlr
1208        nsid: namespace ID of nvme ctrlr
1209        locking_range_id: locking range ID corresponding to this virtual bdev
1210        range_start: start address of this locking range
1211        range_length: length of this locking range
1212        password: admin password of base nvme bdev
1213
1214    Returns:
1215        Name of the new created block devices.
1216    """
1217    params = {
1218        'nvme_ctrlr_name': nvme_ctrlr_name,
1219        'nsid': nsid,
1220        'locking_range_id': locking_range_id,
1221        'range_start': range_start,
1222        'range_length': range_length,
1223        'password': password,
1224    }
1225
1226    return client.call('bdev_opal_create', params)
1227
1228
1229def bdev_opal_get_info(client, bdev_name, password):
1230    """Get opal locking range info.
1231
1232    Args:
1233        bdev_name: name of opal vbdev to get info
1234        password: admin password
1235
1236    Returns:
1237        Locking range info.
1238    """
1239    params = {
1240        'bdev_name': bdev_name,
1241        'password': password,
1242    }
1243
1244    return client.call('bdev_opal_get_info', params)
1245
1246
1247def bdev_opal_delete(client, bdev_name, password):
1248    """Delete opal virtual bdev from the system.
1249
1250    Args:
1251        bdev_name: name of opal vbdev to delete
1252        password: admin password of base nvme bdev
1253    """
1254    params = {
1255        'bdev_name': bdev_name,
1256        'password': password,
1257    }
1258
1259    return client.call('bdev_opal_delete', params)
1260
1261
1262def bdev_opal_new_user(client, bdev_name, admin_password, user_id, user_password):
1263    """Add a user to opal bdev who can set lock state for this bdev.
1264
1265    Args:
1266        bdev_name: name of opal vbdev
1267        admin_password: admin password
1268        user_id: ID of the user who will be added to this opal bdev
1269        user_password: password set for this user
1270    """
1271    params = {
1272        'bdev_name': bdev_name,
1273        'admin_password': admin_password,
1274        'user_id': user_id,
1275        'user_password': user_password,
1276    }
1277
1278    return client.call('bdev_opal_new_user', params)
1279
1280
1281def bdev_opal_set_lock_state(client, bdev_name, user_id, password, lock_state):
1282    """set lock state for an opal bdev.
1283
1284    Args:
1285        bdev_name: name of opal vbdev
1286        user_id: ID of the user who will set lock state
1287        password: password of the user
1288        lock_state: lock state to set
1289    """
1290    params = {
1291        'bdev_name': bdev_name,
1292        'user_id': user_id,
1293        'password': password,
1294        'lock_state': lock_state,
1295    }
1296
1297    return client.call('bdev_opal_set_lock_state', params)
1298
1299
1300@deprecated_alias('construct_split_vbdev')
1301def bdev_split_create(client, base_bdev, split_count, split_size_mb=None):
1302    """Create split block devices from a base bdev.
1303
1304    Args:
1305        base_bdev: name of bdev to split
1306        split_count: number of split bdevs to create
1307        split_size_mb: size of each split volume in MiB (optional)
1308
1309    Returns:
1310        List of created block devices.
1311    """
1312    params = {
1313        'base_bdev': base_bdev,
1314        'split_count': split_count,
1315    }
1316    if split_size_mb:
1317        params['split_size_mb'] = split_size_mb
1318
1319    return client.call('bdev_split_create', params)
1320
1321
1322@deprecated_alias('destruct_split_vbdev')
1323def bdev_split_delete(client, base_bdev):
1324    """Delete split block devices.
1325
1326    Args:
1327        base_bdev: name of previously split bdev
1328    """
1329    params = {
1330        'base_bdev': base_bdev,
1331    }
1332
1333    return client.call('bdev_split_delete', params)
1334
1335
1336@deprecated_alias('construct_ftl_bdev')
1337def bdev_ftl_create(client, name, base_bdev, **kwargs):
1338    """Construct FTL bdev
1339
1340    Args:
1341        name: name of the bdev
1342        base_bdev: name of the base bdev
1343        kwargs: optional parameters
1344    """
1345    params = {'name': name,
1346              'base_bdev': base_bdev}
1347    for key, value in kwargs.items():
1348        if value is not None:
1349            params[key] = value
1350
1351    return client.call('bdev_ftl_create', params)
1352
1353
1354@deprecated_alias('delete_ftl_bdev')
1355def bdev_ftl_delete(client, name):
1356    """Delete FTL bdev
1357
1358    Args:
1359        name: name of the bdev
1360    """
1361    params = {'name': name}
1362
1363    return client.call('bdev_ftl_delete', params)
1364
1365
1366def bdev_get_bdevs(client, name=None, timeout=None):
1367    """Get information about block devices.
1368
1369    Args:
1370        name: bdev name to query (optional; if omitted, query all bdevs)
1371        timeout: time in ms to wait for the bdev with specified name to appear
1372
1373    Returns:
1374        List of bdev information objects.
1375    """
1376    params = {}
1377    if name:
1378        params['name'] = name
1379    if timeout:
1380        params['timeout'] = timeout
1381    return client.call('bdev_get_bdevs', params)
1382
1383
1384def bdev_get_iostat(client, name=None):
1385    """Get I/O statistics for block devices.
1386
1387    Args:
1388        name: bdev name to query (optional; if omitted, query all bdevs)
1389
1390    Returns:
1391        I/O statistics for the requested block devices.
1392    """
1393    params = {}
1394    if name:
1395        params['name'] = name
1396    return client.call('bdev_get_iostat', params)
1397
1398
1399def bdev_enable_histogram(client, name, enable):
1400    """Control whether histogram is enabled for specified bdev.
1401
1402    Args:
1403        bdev_name: name of bdev
1404    """
1405    params = {'name': name, "enable": enable}
1406    return client.call('bdev_enable_histogram', params)
1407
1408
1409def bdev_get_histogram(client, name):
1410    """Get histogram for specified bdev.
1411
1412    Args:
1413        bdev_name: name of bdev
1414    """
1415    params = {'name': name}
1416    return client.call('bdev_get_histogram', params)
1417
1418
1419@deprecated_alias('bdev_inject_error')
1420def bdev_error_inject_error(client, name, io_type, error_type, num=1):
1421    """Inject an error via an error bdev.
1422
1423    Args:
1424        name: name of error bdev
1425        io_type: one of "clear", "read", "write", "unmap", "flush", or "all"
1426        error_type: one of "failure" or "pending"
1427        num: number of commands to fail
1428    """
1429    params = {
1430        'name': name,
1431        'io_type': io_type,
1432        'error_type': error_type,
1433        'num': num,
1434    }
1435
1436    return client.call('bdev_error_inject_error', params)
1437
1438
1439def bdev_set_qd_sampling_period(client, name, period):
1440    """Enable queue depth tracking on a specified bdev.
1441
1442    Args:
1443        name: name of a bdev on which to track queue depth.
1444        period: period (in microseconds) at which to update the queue depth reading. If set to 0, polling will be disabled.
1445    """
1446
1447    params = {}
1448    params['name'] = name
1449    params['period'] = period
1450    return client.call('bdev_set_qd_sampling_period', params)
1451
1452
1453def bdev_set_qos_limit(
1454        client,
1455        name,
1456        rw_ios_per_sec=None,
1457        rw_mbytes_per_sec=None,
1458        r_mbytes_per_sec=None,
1459        w_mbytes_per_sec=None):
1460    """Set QoS rate limit on a block device.
1461
1462    Args:
1463        name: name of block device
1464        rw_ios_per_sec: R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited.
1465        rw_mbytes_per_sec: R/W megabytes per second limit (>=10, example: 100). 0 means unlimited.
1466        r_mbytes_per_sec: Read megabytes per second limit (>=10, example: 100). 0 means unlimited.
1467        w_mbytes_per_sec: Write megabytes per second limit (>=10, example: 100). 0 means unlimited.
1468    """
1469    params = {}
1470    params['name'] = name
1471    if rw_ios_per_sec is not None:
1472        params['rw_ios_per_sec'] = rw_ios_per_sec
1473    if rw_mbytes_per_sec is not None:
1474        params['rw_mbytes_per_sec'] = rw_mbytes_per_sec
1475    if r_mbytes_per_sec is not None:
1476        params['r_mbytes_per_sec'] = r_mbytes_per_sec
1477    if w_mbytes_per_sec is not None:
1478        params['w_mbytes_per_sec'] = w_mbytes_per_sec
1479    return client.call('bdev_set_qos_limit', params)
1480
1481
1482@deprecated_alias('apply_firmware')
1483def bdev_nvme_apply_firmware(client, bdev_name, filename):
1484    """Download and commit firmware to NVMe device.
1485
1486    Args:
1487        bdev_name: name of NVMe block device
1488        filename: filename of the firmware to download
1489    """
1490    params = {
1491        'filename': filename,
1492        'bdev_name': bdev_name,
1493    }
1494    return client.call('bdev_nvme_apply_firmware', params)
1495
1496
1497def bdev_nvme_get_transport_statistics(client):
1498    """Get bdev_nvme poll group transport statistics"""
1499    return client.call('bdev_nvme_get_transport_statistics')
1500
1501
1502def bdev_nvme_get_controller_health_info(client, name):
1503    """Display health log of the required NVMe bdev controller.
1504
1505    Args:
1506        name: name of the required NVMe bdev controller
1507
1508    Returns:
1509        Health log for the requested NVMe bdev controller.
1510    """
1511    params = {}
1512    params['name'] = name
1513    return client.call('bdev_nvme_get_controller_health_info', params)
1514