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