xref: /spdk/python/spdk/rpc/bdev.py (revision eb7506a1b4fb1589911dbb1ffb5ac60a048202be)
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):
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
580    """
581    params = {}
582
583    if action_on_timeout:
584        params['action_on_timeout'] = action_on_timeout
585
586    if timeout_us is not None:
587        params['timeout_us'] = timeout_us
588
589    if timeout_admin_us is not None:
590        params['timeout_admin_us'] = timeout_admin_us
591
592    if keep_alive_timeout_ms is not None:
593        params['keep_alive_timeout_ms'] = keep_alive_timeout_ms
594
595    if retry_count is not None:
596        print("WARNING: retry_count is deprecated, please use transport_retry_count.")
597        params['retry_count'] = retry_count
598
599    if arbitration_burst is not None:
600        params['arbitration_burst'] = arbitration_burst
601
602    if low_priority_weight is not None:
603        params['low_priority_weight'] = low_priority_weight
604
605    if medium_priority_weight is not None:
606        params['medium_priority_weight'] = medium_priority_weight
607
608    if high_priority_weight is not None:
609        params['high_priority_weight'] = high_priority_weight
610
611    if nvme_adminq_poll_period_us:
612        params['nvme_adminq_poll_period_us'] = nvme_adminq_poll_period_us
613
614    if nvme_ioq_poll_period_us is not None:
615        params['nvme_ioq_poll_period_us'] = nvme_ioq_poll_period_us
616
617    if io_queue_requests is not None:
618        params['io_queue_requests'] = io_queue_requests
619
620    if delay_cmd_submit is not None:
621        params['delay_cmd_submit'] = delay_cmd_submit
622
623    if transport_retry_count is not None:
624        params['transport_retry_count'] = transport_retry_count
625
626    if bdev_retry_count is not None:
627        params['bdev_retry_count'] = bdev_retry_count
628
629    if transport_ack_timeout is not None:
630        params['transport_ack_timeout'] = transport_ack_timeout
631
632    if ctrlr_loss_timeout_sec is not None:
633        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
634
635    if reconnect_delay_sec is not None:
636        params['reconnect_delay_sec'] = reconnect_delay_sec
637
638    if fast_io_fail_timeout_sec is not None:
639        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
640
641    if disable_auto_failback is not None:
642        params['disable_auto_failback'] = disable_auto_failback
643
644    if generate_uuids is not None:
645        params['generate_uuids'] = generate_uuids
646
647    if transport_tos is not None:
648        params['transport_tos'] = transport_tos
649
650    if nvme_error_stat is not None:
651        params['nvme_error_stat'] = nvme_error_stat
652
653    return client.call('bdev_nvme_set_options', params)
654
655
656def bdev_nvme_set_hotplug(client, enable, period_us=None):
657    """Set options for the bdev nvme. This is startup command.
658
659    Args:
660       enable: True to enable hotplug, False to disable.
661       period_us: how often the hotplug is processed for insert and remove events. Set 0 to reset to default. (optional)
662    """
663    params = {'enable': enable}
664
665    if period_us:
666        params['period_us'] = period_us
667
668    return client.call('bdev_nvme_set_hotplug', params)
669
670
671def bdev_nvme_attach_controller(client, name, trtype, traddr, adrfam=None, trsvcid=None,
672                                priority=None, subnqn=None, hostnqn=None, hostaddr=None,
673                                hostsvcid=None, prchk_reftag=None, prchk_guard=None,
674                                hdgst=None, ddgst=None, fabrics_timeout=None, multipath=None, num_io_queues=None,
675                                ctrlr_loss_timeout_sec=None, reconnect_delay_sec=None,
676                                fast_io_fail_timeout_sec=None, psk=None):
677    """Construct block device for each NVMe namespace in the attached controller.
678
679    Args:
680        name: bdev name prefix; "n" + namespace ID will be appended to create unique names
681        trtype: transport type ("PCIe", "RDMA", "FC", "TCP")
682        traddr: transport address (PCI BDF or IP address)
683        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
684        trsvcid: transport service ID (port number for IP-based addresses)
685        priority: transport connection priority (Sock priority for TCP-based transports; optional)
686        subnqn: subsystem NQN to connect to (optional)
687        hostnqn: NQN to connect from (optional)
688        hostaddr: host transport address (IP address for IP-based transports, NULL for PCIe or FC; optional)
689        hostsvcid: host transport service ID (port number for IP-based transports, NULL for PCIe or FC; optional)
690        prchk_reftag: Enable checking of PI reference tag for I/O processing (optional)
691        prchk_guard: Enable checking of PI guard for I/O processing (optional)
692        hdgst: Enable TCP header digest (optional)
693        ddgst: Enable TCP data digest (optional)
694        fabrics_timeout: Fabrics connect timeout in us (optional)
695        multipath: The behavior when multiple paths are created ("disable", "failover", or "multipath"; failover if not specified)
696        num_io_queues: The number of IO queues to request during initialization. (optional)
697        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
698        -1 means infinite reconnect retries. 0 means no reconnect retry.
699        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
700        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
701        (optional)
702        reconnect_delay_sec: Time to delay a reconnect retry.
703        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
704        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
705        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
706        (optional)
707        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
708        0 means no such timeout.
709        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
710        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional)
711        psk: Set PSK and enable TCP SSL socket implementation (optional)
712
713    Returns:
714        Names of created block devices.
715    """
716    params = {'name': name,
717              'trtype': trtype,
718              'traddr': traddr}
719
720    if hostnqn:
721        params['hostnqn'] = hostnqn
722
723    if hostaddr:
724        params['hostaddr'] = hostaddr
725
726    if hostsvcid:
727        params['hostsvcid'] = hostsvcid
728
729    if adrfam:
730        params['adrfam'] = adrfam
731
732    if trsvcid:
733        params['trsvcid'] = trsvcid
734
735    if priority:
736        params['priority'] = priority
737
738    if subnqn:
739        params['subnqn'] = subnqn
740
741    if prchk_reftag:
742        params['prchk_reftag'] = prchk_reftag
743
744    if prchk_guard:
745        params['prchk_guard'] = prchk_guard
746
747    if hdgst:
748        params['hdgst'] = hdgst
749
750    if ddgst:
751        params['ddgst'] = ddgst
752
753    if fabrics_timeout:
754        params['fabrics_connect_timeout_us'] = fabrics_timeout
755
756    if multipath:
757        params['multipath'] = multipath
758
759    if num_io_queues:
760        params['num_io_queues'] = num_io_queues
761
762    if ctrlr_loss_timeout_sec is not None:
763        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
764
765    if reconnect_delay_sec is not None:
766        params['reconnect_delay_sec'] = reconnect_delay_sec
767
768    if fast_io_fail_timeout_sec is not None:
769        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
770
771    if psk:
772        params['psk'] = psk
773
774    return client.call('bdev_nvme_attach_controller', params)
775
776
777def bdev_nvme_detach_controller(client, name, trtype=None, traddr=None,
778                                adrfam=None, trsvcid=None, subnqn=None,
779                                hostaddr=None, hostsvcid=None):
780    """Detach NVMe controller and delete any associated bdevs. Optionally,
781       If all of the transport ID options are specified, only remove that
782       transport path from the specified controller. If that is the only
783       available path for the controller, this will also result in the
784       controller being detached and the associated bdevs being deleted.
785
786    Args:
787        name: controller name
788        trtype: transport type ("PCIe", "RDMA")
789        traddr: transport address (PCI BDF or IP address)
790        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
791        trsvcid: transport service ID (port number for IP-based addresses)
792        subnqn: subsystem NQN to connect to (optional)
793        hostaddr: Host address (IP address)
794        hostsvcid: transport service ID on host side (port number)
795    """
796
797    params = {'name': name}
798
799    if trtype:
800        params['trtype'] = trtype
801
802    if traddr:
803        params['traddr'] = traddr
804
805    if adrfam:
806        params['adrfam'] = adrfam
807
808    if trsvcid:
809        params['trsvcid'] = trsvcid
810
811    if subnqn:
812        params['subnqn'] = subnqn
813
814    if hostaddr:
815        params['hostaddr'] = hostaddr
816
817    if hostsvcid:
818        params['hostsvcid'] = hostsvcid
819
820    return client.call('bdev_nvme_detach_controller', params)
821
822
823def bdev_nvme_reset_controller(client, name):
824    """Reset NVMe controller.
825
826    Args:
827        name: controller name
828    """
829
830    params = {'name': name}
831
832    return client.call('bdev_nvme_reset_controller', params)
833
834
835def bdev_nvme_start_discovery(client, name, trtype, traddr, adrfam=None, trsvcid=None,
836                              hostnqn=None, wait_for_attach=None, ctrlr_loss_timeout_sec=None,
837                              reconnect_delay_sec=None, fast_io_fail_timeout_sec=None,
838                              attach_timeout_ms=None):
839    """Start discovery with the specified discovery subsystem
840
841    Args:
842        name: bdev name prefix; "n" + namespace ID will be appended to create unique names
843        trtype: transport type ("PCIe", "RDMA", "FC", "TCP")
844        traddr: transport address (PCI BDF or IP address)
845        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
846        trsvcid: transport service ID (port number for IP-based addresses)
847        hostnqn: NQN to connect from (optional)
848        wait_for_attach: Wait to complete RPC until all discovered NVM subsystems have attached (optional)
849        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
850        -1 means infinite reconnect retries. 0 means no reconnect retry.
851        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
852        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
853        (optional)
854        reconnect_delay_sec: Time to delay a reconnect retry.
855        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
856        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
857        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
858        (optional)
859        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
860        0 means no such timeout.
861        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
862        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional)
863        attach_timeout_ms: Time to wait until the discovery and all discovered NVM subsystems are attached (optional)
864    """
865    params = {'name': name,
866              'trtype': trtype,
867              'traddr': traddr}
868
869    if hostnqn:
870        params['hostnqn'] = hostnqn
871
872    if adrfam:
873        params['adrfam'] = adrfam
874
875    if trsvcid:
876        params['trsvcid'] = trsvcid
877
878    if wait_for_attach:
879        params['wait_for_attach'] = True
880
881    if attach_timeout_ms is not None:
882        params['attach_timeout_ms'] = attach_timeout_ms
883
884    if ctrlr_loss_timeout_sec is not None:
885        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
886
887    if reconnect_delay_sec is not None:
888        params['reconnect_delay_sec'] = reconnect_delay_sec
889
890    if fast_io_fail_timeout_sec is not None:
891        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
892
893    return client.call('bdev_nvme_start_discovery', params)
894
895
896def bdev_nvme_stop_discovery(client, name):
897    """Stop a previously started discovery service
898
899    Args:
900        name: name of discovery service to start
901    """
902    params = {'name': name}
903
904    return client.call('bdev_nvme_stop_discovery', params)
905
906
907def bdev_nvme_get_discovery_info(client):
908    """Get information about the automatic discovery
909    """
910    return client.call('bdev_nvme_get_discovery_info')
911
912
913def bdev_nvme_get_io_paths(client, name):
914    """Display all or the specified NVMe bdev's active I/O paths
915
916    Args:
917        name: Name of the NVMe bdev (optional)
918
919    Returns:
920        List of active I/O paths
921    """
922    params = {}
923    if name:
924        params['name'] = name
925    return client.call('bdev_nvme_get_io_paths', params)
926
927
928def bdev_nvme_set_preferred_path(client, name, cntlid):
929    """Set the preferred I/O path for an NVMe bdev when in multipath mode
930
931    Args:
932        name: NVMe bdev name
933        cntlid: NVMe-oF controller ID
934    """
935
936    params = {'name': name,
937              'cntlid': cntlid}
938
939    return client.call('bdev_nvme_set_preferred_path', params)
940
941
942def bdev_nvme_set_multipath_policy(client, name, policy):
943    """Set multipath policy of the NVMe bdev
944
945    Args:
946        name: NVMe bdev name
947        policy: Multipath policy (active_passive or active_active)
948    """
949
950    params = {'name': name,
951              'policy': policy}
952
953    return client.call('bdev_nvme_set_multipath_policy', params)
954
955
956def bdev_nvme_cuse_register(client, name):
957    """Register CUSE devices on NVMe controller.
958
959    Args:
960        name: Name of the operating NVMe controller
961    """
962    params = {'name': name}
963
964    return client.call('bdev_nvme_cuse_register', params)
965
966
967def bdev_nvme_cuse_unregister(client, name):
968    """Unregister CUSE devices on NVMe controller.
969
970    Args:
971        name: Name of the operating NVMe controller
972    """
973    params = {'name': name}
974
975    return client.call('bdev_nvme_cuse_unregister', params)
976
977
978def bdev_zone_block_create(client, name, base_bdev, zone_capacity, optimal_open_zones):
979    """Creates a virtual zone device on top of existing non-zoned bdev.
980
981    Args:
982        name: Zone device name
983        base_bdev: Base Nvme bdev name
984        zone_capacity: Surfaced zone capacity in blocks
985        optimal_open_zones: Number of zones required to reach optimal write speed (optional, default: 1)
986
987    Returns:
988        Name of created block device.
989    """
990    params = {'name': name,
991              'base_bdev': base_bdev,
992              'zone_capacity': zone_capacity,
993              'optimal_open_zones': optimal_open_zones}
994
995    return client.call('bdev_zone_block_create', params)
996
997
998def bdev_zone_block_delete(client, name):
999    """Remove block zone bdev from the system.
1000
1001    Args:
1002        name: name of block zone bdev to delete
1003    """
1004    params = {'name': name}
1005    return client.call('bdev_zone_block_delete', params)
1006
1007
1008def bdev_rbd_register_cluster(client, name, user=None, config_param=None, config_file=None, key_file=None):
1009    """Create a Rados Cluster object of the Ceph RBD backend.
1010
1011    Args:
1012        name: name of Rados Cluster
1013        user: Ceph user name (optional)
1014        config_param: map of config keys to values (optional)
1015        config_file: file path of Ceph configuration file (optional)
1016        key_file: file path of Ceph key file (optional)
1017
1018    Returns:
1019        Name of registered Rados Cluster object.
1020    """
1021    params = {'name': name}
1022
1023    if user is not None:
1024        params['user_id'] = user
1025    if config_param is not None:
1026        params['config_param'] = config_param
1027    if config_file is not None:
1028        params['config_file'] = config_file
1029    if key_file is not None:
1030        params['key_file'] = key_file
1031
1032    return client.call('bdev_rbd_register_cluster', params)
1033
1034
1035def bdev_rbd_unregister_cluster(client, name):
1036    """Remove Rados cluster object from the system.
1037
1038    Args:
1039        name: name of Rados cluster object to unregister
1040    """
1041    params = {'name': name}
1042    return client.call('bdev_rbd_unregister_cluster', params)
1043
1044
1045def bdev_rbd_get_clusters_info(client, name):
1046    """Get the cluster(s) info
1047
1048    Args:
1049        name: name of Rados cluster object to query (optional; if omitted, query all clusters)
1050
1051    Returns:
1052        List of registered Rados cluster information objects.
1053    """
1054    params = {}
1055    if name:
1056        params['name'] = name
1057    return client.call('bdev_rbd_get_clusters_info', params)
1058
1059
1060def bdev_rbd_create(client, pool_name, rbd_name, block_size, name=None, user=None, config=None, cluster_name=None, uuid=None):
1061    """Create a Ceph RBD block device.
1062
1063    Args:
1064        pool_name: Ceph RBD pool name
1065        rbd_name: Ceph RBD image name
1066        block_size: block size of RBD volume
1067        name: name of block device (optional)
1068        user: Ceph user name (optional)
1069        config: map of config keys to values (optional)
1070        cluster_name: Name to identify Rados cluster (optional)
1071        uuid: UUID of block device (optional)
1072
1073    Returns:
1074        Name of created block device.
1075    """
1076    params = {
1077        'pool_name': pool_name,
1078        'rbd_name': rbd_name,
1079        'block_size': block_size,
1080    }
1081
1082    if name:
1083        params['name'] = name
1084    if user is not None:
1085        params['user_id'] = user
1086    if config is not None:
1087        params['config'] = config
1088    if cluster_name is not None:
1089        params['cluster_name'] = cluster_name
1090    else:
1091        print("WARNING:bdev_rbd_create should be used with specifying -c to have a cluster name after bdev_rbd_register_cluster.")
1092    if uuid is not None:
1093        params['uuid'] = uuid
1094
1095    return client.call('bdev_rbd_create', params)
1096
1097
1098def bdev_rbd_delete(client, name):
1099    """Remove rbd bdev from the system.
1100
1101    Args:
1102        name: name of rbd bdev to delete
1103    """
1104    params = {'name': name}
1105    return client.call('bdev_rbd_delete', params)
1106
1107
1108def bdev_rbd_resize(client, name, new_size):
1109    """Resize rbd bdev in the system.
1110
1111    Args:
1112        name: name of rbd bdev to resize
1113        new_size: new bdev size of resize operation. The unit is MiB
1114    """
1115    params = {
1116            'name': name,
1117            'new_size': new_size,
1118            }
1119    return client.call('bdev_rbd_resize', params)
1120
1121
1122def bdev_error_create(client, base_name):
1123    """Construct an error injection block device.
1124
1125    Args:
1126        base_name: base bdev name
1127    """
1128    params = {'base_name': base_name}
1129    return client.call('bdev_error_create', params)
1130
1131
1132def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency):
1133    """Construct a delay block device.
1134
1135    Args:
1136        base_bdev_name: name of the existing bdev
1137        name: name of block device
1138        avg_read_latency: complete 99% of read ops with this delay
1139        p99_read_latency: complete 1% of read ops with this delay
1140        avg_write_latency: complete 99% of write ops with this delay
1141        p99_write_latency: complete 1% of write ops with this delay
1142
1143    Returns:
1144        Name of created block device.
1145    """
1146    params = {
1147        'base_bdev_name': base_bdev_name,
1148        'name': name,
1149        'avg_read_latency': avg_read_latency,
1150        'p99_read_latency': p99_read_latency,
1151        'avg_write_latency': avg_write_latency,
1152        'p99_write_latency': p99_write_latency,
1153    }
1154    return client.call('bdev_delay_create', params)
1155
1156
1157def bdev_delay_delete(client, name):
1158    """Remove delay bdev from the system.
1159
1160    Args:
1161        name: name of delay bdev to delete
1162    """
1163    params = {'name': name}
1164    return client.call('bdev_delay_delete', params)
1165
1166
1167def bdev_delay_update_latency(client, delay_bdev_name, latency_type, latency_us):
1168    """Update the latency value for a delay block device
1169
1170    Args:
1171        delay_bdev_name: name of the delay bdev
1172        latency_type: 'one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.'
1173        latency_us: 'new latency value.'
1174
1175    Returns:
1176        True if successful, or a specific error otherwise.
1177    """
1178    params = {
1179        'delay_bdev_name': delay_bdev_name,
1180        'latency_type': latency_type,
1181        'latency_us': latency_us,
1182    }
1183    return client.call('bdev_delay_update_latency', params)
1184
1185
1186def bdev_error_delete(client, name):
1187    """Remove error bdev from the system.
1188
1189    Args:
1190        bdev_name: name of error bdev to delete
1191    """
1192    params = {'name': name}
1193    return client.call('bdev_error_delete', params)
1194
1195
1196def bdev_iscsi_set_options(client, timeout_sec):
1197    """Set options for the bdev iscsi.
1198
1199    Args:
1200        timeout_sec: Timeout for command, in seconds, if 0, don't track timeout
1201    """
1202    params = {}
1203
1204    if timeout_sec is not None:
1205        params['timeout_sec'] = timeout_sec
1206
1207    return client.call('bdev_iscsi_set_options', params)
1208
1209
1210def bdev_iscsi_create(client, name, url, initiator_iqn):
1211    """Construct an iSCSI block device.
1212
1213    Args:
1214        name: name of block device
1215        url: iSCSI URL
1216        initiator_iqn: IQN name to be used by initiator
1217
1218    Returns:
1219        Name of created block device.
1220    """
1221    params = {
1222        'name': name,
1223        'url': url,
1224        'initiator_iqn': initiator_iqn,
1225    }
1226    return client.call('bdev_iscsi_create', params)
1227
1228
1229def bdev_iscsi_delete(client, name):
1230    """Remove iSCSI bdev from the system.
1231
1232    Args:
1233        bdev_name: name of iSCSI bdev to delete
1234    """
1235    params = {'name': name}
1236    return client.call('bdev_iscsi_delete', params)
1237
1238
1239def bdev_pmem_create(client, pmem_file, name):
1240    """Construct a libpmemblk block device.
1241
1242    Args:
1243        pmem_file: path to pmemblk pool file
1244        name: name of block device
1245
1246    Returns:
1247        Name of created block device.
1248    """
1249    params = {
1250        'pmem_file': pmem_file,
1251        'name': name
1252    }
1253    return client.call('bdev_pmem_create', params)
1254
1255
1256def bdev_pmem_delete(client, name):
1257    """Remove pmem bdev from the system.
1258
1259    Args:
1260        name: name of pmem bdev to delete
1261    """
1262    params = {'name': name}
1263    return client.call('bdev_pmem_delete', params)
1264
1265
1266def bdev_passthru_create(client, base_bdev_name, name):
1267    """Construct a pass-through block device.
1268
1269    Args:
1270        base_bdev_name: name of the existing bdev
1271        name: name of block device
1272
1273    Returns:
1274        Name of created block device.
1275    """
1276    params = {
1277        'base_bdev_name': base_bdev_name,
1278        'name': name,
1279    }
1280    return client.call('bdev_passthru_create', params)
1281
1282
1283def bdev_passthru_delete(client, name):
1284    """Remove pass through bdev from the system.
1285
1286    Args:
1287        name: name of pass through bdev to delete
1288    """
1289    params = {'name': name}
1290    return client.call('bdev_passthru_delete', params)
1291
1292
1293def bdev_opal_create(client, nvme_ctrlr_name, nsid, locking_range_id, range_start, range_length, password):
1294    """Create opal virtual block devices from a base nvme bdev.
1295
1296    Args:
1297        nvme_ctrlr_name: name of the nvme ctrlr
1298        nsid: namespace ID of nvme ctrlr
1299        locking_range_id: locking range ID corresponding to this virtual bdev
1300        range_start: start address of this locking range
1301        range_length: length of this locking range
1302        password: admin password of base nvme bdev
1303
1304    Returns:
1305        Name of the new created block devices.
1306    """
1307    params = {
1308        'nvme_ctrlr_name': nvme_ctrlr_name,
1309        'nsid': nsid,
1310        'locking_range_id': locking_range_id,
1311        'range_start': range_start,
1312        'range_length': range_length,
1313        'password': password,
1314    }
1315
1316    return client.call('bdev_opal_create', params)
1317
1318
1319def bdev_opal_get_info(client, bdev_name, password):
1320    """Get opal locking range info.
1321
1322    Args:
1323        bdev_name: name of opal vbdev to get info
1324        password: admin password
1325
1326    Returns:
1327        Locking range info.
1328    """
1329    params = {
1330        'bdev_name': bdev_name,
1331        'password': password,
1332    }
1333
1334    return client.call('bdev_opal_get_info', params)
1335
1336
1337def bdev_opal_delete(client, bdev_name, password):
1338    """Delete opal virtual bdev from the system.
1339
1340    Args:
1341        bdev_name: name of opal vbdev to delete
1342        password: admin password of base nvme bdev
1343    """
1344    params = {
1345        'bdev_name': bdev_name,
1346        'password': password,
1347    }
1348
1349    return client.call('bdev_opal_delete', params)
1350
1351
1352def bdev_opal_new_user(client, bdev_name, admin_password, user_id, user_password):
1353    """Add a user to opal bdev who can set lock state for this bdev.
1354
1355    Args:
1356        bdev_name: name of opal vbdev
1357        admin_password: admin password
1358        user_id: ID of the user who will be added to this opal bdev
1359        user_password: password set for this user
1360    """
1361    params = {
1362        'bdev_name': bdev_name,
1363        'admin_password': admin_password,
1364        'user_id': user_id,
1365        'user_password': user_password,
1366    }
1367
1368    return client.call('bdev_opal_new_user', params)
1369
1370
1371def bdev_opal_set_lock_state(client, bdev_name, user_id, password, lock_state):
1372    """set lock state for an opal bdev.
1373
1374    Args:
1375        bdev_name: name of opal vbdev
1376        user_id: ID of the user who will set lock state
1377        password: password of the user
1378        lock_state: lock state to set
1379    """
1380    params = {
1381        'bdev_name': bdev_name,
1382        'user_id': user_id,
1383        'password': password,
1384        'lock_state': lock_state,
1385    }
1386
1387    return client.call('bdev_opal_set_lock_state', params)
1388
1389
1390def bdev_split_create(client, base_bdev, split_count, split_size_mb=None):
1391    """Create split block devices from a base bdev.
1392
1393    Args:
1394        base_bdev: name of bdev to split
1395        split_count: number of split bdevs to create
1396        split_size_mb: size of each split volume in MiB (optional)
1397
1398    Returns:
1399        List of created block devices.
1400    """
1401    params = {
1402        'base_bdev': base_bdev,
1403        'split_count': split_count,
1404    }
1405    if split_size_mb:
1406        params['split_size_mb'] = split_size_mb
1407
1408    return client.call('bdev_split_create', params)
1409
1410
1411def bdev_split_delete(client, base_bdev):
1412    """Delete split block devices.
1413
1414    Args:
1415        base_bdev: name of previously split bdev
1416    """
1417    params = {
1418        'base_bdev': base_bdev,
1419    }
1420
1421    return client.call('bdev_split_delete', params)
1422
1423
1424def bdev_ftl_create(client, name, base_bdev, **kwargs):
1425    """Construct FTL bdev
1426
1427    Args:
1428        name: name of the bdev
1429        base_bdev: name of the base bdev
1430        kwargs: optional parameters
1431    """
1432    params = {'name': name,
1433              'base_bdev': base_bdev}
1434    for key, value in kwargs.items():
1435        if value is not None:
1436            params[key] = value
1437
1438    return client.call('bdev_ftl_create', params)
1439
1440
1441def bdev_ftl_load(client, name, base_bdev, **kwargs):
1442    """Load FTL bdev
1443
1444    Args:
1445        name: name of the bdev
1446        base_bdev: name of the base bdev
1447        kwargs: optional parameters
1448    """
1449    params = {'name': name,
1450              'base_bdev': base_bdev}
1451    for key, value in kwargs.items():
1452        if value is not None:
1453            params[key] = value
1454
1455    return client.call('bdev_ftl_load', params)
1456
1457
1458def bdev_ftl_unload(client, name, fast_shutdown):
1459    """Unload FTL bdev
1460
1461    Args:
1462        name: name of the bdev
1463    """
1464    params = {'name': name,
1465              'fast_shutdown': fast_shutdown}
1466
1467    return client.call('bdev_ftl_unload', params)
1468
1469
1470def bdev_ftl_delete(client, name, fast_shutdown):
1471    """Delete FTL bdev
1472
1473    Args:
1474        name: name of the bdev
1475    """
1476    params = {'name': name,
1477              'fast_shutdown': fast_shutdown}
1478
1479    return client.call('bdev_ftl_delete', params)
1480
1481
1482def bdev_ftl_unmap(client, name, lba, num_blocks):
1483    """FTL unmap
1484
1485    Args:
1486        name: name of the bdev
1487        lba: starting lba to be unmapped
1488        num_blocks: number of blocks to unmap
1489    """
1490    params = {'name': name,
1491              'lba': lba,
1492              'num_blocks': num_blocks}
1493
1494    return client.call('bdev_ftl_unmap', params)
1495
1496
1497def bdev_ftl_get_stats(client, name):
1498    """get FTL stats
1499
1500    Args:
1501        name: name of the bdev
1502    """
1503    params = {'name': name}
1504
1505    return client.call('bdev_ftl_get_stats', params)
1506
1507
1508def bdev_get_bdevs(client, name=None, timeout=None):
1509    """Get information about block devices.
1510
1511    Args:
1512        name: bdev name to query (optional; if omitted, query all bdevs)
1513        timeout: time in ms to wait for the bdev with specified name to appear
1514
1515    Returns:
1516        List of bdev information objects.
1517    """
1518    params = {}
1519    if name:
1520        params['name'] = name
1521    if timeout:
1522        params['timeout'] = timeout
1523    return client.call('bdev_get_bdevs', params)
1524
1525
1526def bdev_get_iostat(client, name=None, per_channel=None):
1527    """Get I/O statistics for block devices.
1528
1529    Args:
1530        name: bdev name to query (optional; if omitted, query all bdevs)
1531        per_channel: display per channel IO stats for specified bdev
1532
1533    Returns:
1534        I/O statistics for the requested block devices.
1535    """
1536    params = {}
1537    if name:
1538        params['name'] = name
1539    if per_channel:
1540        params['per_channel'] = per_channel
1541    return client.call('bdev_get_iostat', params)
1542
1543
1544def bdev_reset_iostat(client, name=None, mode=None):
1545    """Reset I/O statistics for block devices.
1546
1547    Args:
1548        name: bdev name to reset (optional; if omitted, reset all bdevs)
1549        mode: mode to reset: all, maxmin (optional: if omitted, reset all fields)
1550    """
1551    params = {}
1552    if name:
1553        params['name'] = name
1554    if mode:
1555        params['mode'] = mode
1556
1557    return client.call('bdev_reset_iostat', params)
1558
1559
1560def bdev_enable_histogram(client, name, enable):
1561    """Control whether histogram is enabled for specified bdev.
1562
1563    Args:
1564        bdev_name: name of bdev
1565    """
1566    params = {'name': name, "enable": enable}
1567    return client.call('bdev_enable_histogram', params)
1568
1569
1570def bdev_get_histogram(client, name):
1571    """Get histogram for specified bdev.
1572
1573    Args:
1574        bdev_name: name of bdev
1575    """
1576    params = {'name': name}
1577    return client.call('bdev_get_histogram', params)
1578
1579
1580def bdev_error_inject_error(client, name, io_type, error_type, num,
1581                            corrupt_offset, corrupt_value):
1582    """Inject an error via an error bdev.
1583
1584    Args:
1585        name: name of error bdev
1586        io_type: one of "clear", "read", "write", "unmap", "flush", or "all"
1587        error_type: one of "failure", "pending", or "corrupt_data"
1588        num: number of commands to fail
1589        corrupt_offset: offset in bytes to xor with corrupt_value
1590        corrupt_value: value for xor (1-255, 0 is invalid)
1591    """
1592    params = {
1593        'name': name,
1594        'io_type': io_type,
1595        'error_type': error_type,
1596    }
1597
1598    if num:
1599        params['num'] = num
1600    if corrupt_offset:
1601        params['corrupt_offset'] = corrupt_offset
1602    if corrupt_value:
1603        params['corrupt_value'] = corrupt_value
1604
1605    return client.call('bdev_error_inject_error', params)
1606
1607
1608def bdev_set_qd_sampling_period(client, name, period):
1609    """Enable queue depth tracking on a specified bdev.
1610
1611    Args:
1612        name: name of a bdev on which to track queue depth.
1613        period: period (in microseconds) at which to update the queue depth reading. If set to 0, polling will be disabled.
1614    """
1615
1616    params = {}
1617    params['name'] = name
1618    params['period'] = period
1619    return client.call('bdev_set_qd_sampling_period', params)
1620
1621
1622def bdev_set_qos_limit(
1623        client,
1624        name,
1625        rw_ios_per_sec=None,
1626        rw_mbytes_per_sec=None,
1627        r_mbytes_per_sec=None,
1628        w_mbytes_per_sec=None):
1629    """Set QoS rate limit on a block device.
1630
1631    Args:
1632        name: name of block device
1633        rw_ios_per_sec: R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited.
1634        rw_mbytes_per_sec: R/W megabytes per second limit (>=10, example: 100). 0 means unlimited.
1635        r_mbytes_per_sec: Read megabytes per second limit (>=10, example: 100). 0 means unlimited.
1636        w_mbytes_per_sec: Write megabytes per second limit (>=10, example: 100). 0 means unlimited.
1637    """
1638    params = {}
1639    params['name'] = name
1640    if rw_ios_per_sec is not None:
1641        params['rw_ios_per_sec'] = rw_ios_per_sec
1642    if rw_mbytes_per_sec is not None:
1643        params['rw_mbytes_per_sec'] = rw_mbytes_per_sec
1644    if r_mbytes_per_sec is not None:
1645        params['r_mbytes_per_sec'] = r_mbytes_per_sec
1646    if w_mbytes_per_sec is not None:
1647        params['w_mbytes_per_sec'] = w_mbytes_per_sec
1648    return client.call('bdev_set_qos_limit', params)
1649
1650
1651def bdev_nvme_apply_firmware(client, bdev_name, filename):
1652    """Download and commit firmware to NVMe device.
1653
1654    Args:
1655        bdev_name: name of NVMe block device
1656        filename: filename of the firmware to download
1657    """
1658    params = {
1659        'filename': filename,
1660        'bdev_name': bdev_name,
1661    }
1662    return client.call('bdev_nvme_apply_firmware', params)
1663
1664
1665def bdev_nvme_get_transport_statistics(client):
1666    """Get bdev_nvme poll group transport statistics"""
1667    return client.call('bdev_nvme_get_transport_statistics')
1668
1669
1670def bdev_nvme_get_controller_health_info(client, name):
1671    """Display health log of the required NVMe bdev controller.
1672
1673    Args:
1674        name: name of the required NVMe bdev controller
1675
1676    Returns:
1677        Health log for the requested NVMe bdev controller.
1678    """
1679    params = {}
1680    params['name'] = name
1681    return client.call('bdev_nvme_get_controller_health_info', params)
1682
1683
1684def bdev_daos_create(client, num_blocks, block_size, pool, cont, name, oclass=None, uuid=None):
1685    """Construct DAOS block device.
1686
1687    Args:
1688        num_blocks: size of block device in blocks
1689        block_size: block size of device; must be a power of 2 and at least 512
1690        name: name of block device (also the name of the backend file on DAOS DFS)
1691        pool: UUID of DAOS pool
1692        cont: UUID of DAOS container
1693        uuid: UUID of block device (optional)
1694        oclass: DAOS object class (optional)
1695
1696    Returns:
1697        Name of created block device.
1698    """
1699    params = {'num_blocks': num_blocks, 'block_size': block_size, 'pool': pool, 'cont': cont, 'name': name}
1700    if uuid:
1701        params['uuid'] = uuid
1702    if oclass:
1703        params['oclass'] = oclass
1704    return client.call('bdev_daos_create', params)
1705
1706
1707def bdev_daos_delete(client, name):
1708    """Delete DAOS block device.
1709
1710    Args:
1711        bdev_name: name of DAOS bdev to delete
1712    """
1713    params = {'name': name}
1714    return client.call('bdev_daos_delete', params)
1715
1716
1717def bdev_daos_resize(client, name, new_size):
1718    """Resize DAOS bdev in the system.
1719    Args:
1720        name: name of DAOS bdev to resize
1721        new_size: new bdev size of resize operation. The unit is MiB
1722    """
1723    params = {
1724            'name': name,
1725            'new_size': new_size,
1726            }
1727    return client.call('bdev_daos_resize', params)
1728
1729
1730def bdev_nvme_start_mdns_discovery(client, name, svcname, hostnqn=None):
1731    """Start discovery with mDNS
1732
1733    Args:
1734        name: bdev name prefix; "n" + unique seqno + namespace ID will be appended to create unique names
1735        svcname: service to discover ("_nvme-disc._tcp")
1736        hostnqn: NQN to connect from (optional)
1737    """
1738    params = {'name': name,
1739              'svcname': svcname}
1740
1741    if hostnqn:
1742        params['hostnqn'] = hostnqn
1743    return client.call('bdev_nvme_start_mdns_discovery', params)
1744
1745
1746def bdev_nvme_stop_mdns_discovery(client, name):
1747    """Stop a previously started mdns discovery service
1748
1749    Args:
1750        name: name of the discovery service to stop
1751    """
1752    params = {'name': name}
1753
1754    return client.call('bdev_nvme_stop_mdns_discovery', params)
1755
1756
1757def bdev_nvme_get_mdns_discovery_info(client):
1758    """Get information about the automatic mdns discovery
1759    """
1760    return client.call('bdev_nvme_get_mdns_discovery_info')
1761