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