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