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