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