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