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