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 if uuid is not None: 986 params['uuid'] = uuid 987 988 return client.call('bdev_rbd_create', params) 989 990 991def bdev_rbd_delete(client, name): 992 """Remove rbd bdev from the system. 993 994 Args: 995 name: name of rbd bdev to delete 996 """ 997 params = {'name': name} 998 return client.call('bdev_rbd_delete', params) 999 1000 1001def bdev_rbd_resize(client, name, new_size): 1002 """Resize rbd bdev in the system. 1003 1004 Args: 1005 name: name of rbd bdev to resize 1006 new_size: new bdev size of resize operation. The unit is MiB 1007 """ 1008 params = { 1009 'name': name, 1010 'new_size': new_size, 1011 } 1012 return client.call('bdev_rbd_resize', params) 1013 1014 1015def bdev_error_create(client, base_name): 1016 """Construct an error injection block device. 1017 1018 Args: 1019 base_name: base bdev name 1020 """ 1021 params = {'base_name': base_name} 1022 return client.call('bdev_error_create', params) 1023 1024 1025def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency): 1026 """Construct a delay block device. 1027 1028 Args: 1029 base_bdev_name: name of the existing bdev 1030 name: name of block device 1031 avg_read_latency: complete 99% of read ops with this delay 1032 p99_read_latency: complete 1% of read ops with this delay 1033 avg_write_latency: complete 99% of write ops with this delay 1034 p99_write_latency: complete 1% of write ops with this delay 1035 1036 Returns: 1037 Name of created block device. 1038 """ 1039 params = { 1040 'base_bdev_name': base_bdev_name, 1041 'name': name, 1042 'avg_read_latency': avg_read_latency, 1043 'p99_read_latency': p99_read_latency, 1044 'avg_write_latency': avg_write_latency, 1045 'p99_write_latency': p99_write_latency, 1046 } 1047 return client.call('bdev_delay_create', params) 1048 1049 1050def bdev_delay_delete(client, name): 1051 """Remove delay bdev from the system. 1052 1053 Args: 1054 name: name of delay bdev to delete 1055 """ 1056 params = {'name': name} 1057 return client.call('bdev_delay_delete', params) 1058 1059 1060def bdev_delay_update_latency(client, delay_bdev_name, latency_type, latency_us): 1061 """Update the latency value for a delay block device 1062 1063 Args: 1064 delay_bdev_name: name of the delay bdev 1065 latency_type: 'one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.' 1066 latency_us: 'new latency value.' 1067 1068 Returns: 1069 True if successful, or a specific error otherwise. 1070 """ 1071 params = { 1072 'delay_bdev_name': delay_bdev_name, 1073 'latency_type': latency_type, 1074 'latency_us': latency_us, 1075 } 1076 return client.call('bdev_delay_update_latency', params) 1077 1078 1079def bdev_error_delete(client, name): 1080 """Remove error bdev from the system. 1081 1082 Args: 1083 bdev_name: name of error bdev to delete 1084 """ 1085 params = {'name': name} 1086 return client.call('bdev_error_delete', params) 1087 1088 1089def bdev_iscsi_create(client, name, url, initiator_iqn): 1090 """Construct an iSCSI block device. 1091 1092 Args: 1093 name: name of block device 1094 url: iSCSI URL 1095 initiator_iqn: IQN name to be used by initiator 1096 1097 Returns: 1098 Name of created block device. 1099 """ 1100 params = { 1101 'name': name, 1102 'url': url, 1103 'initiator_iqn': initiator_iqn, 1104 } 1105 return client.call('bdev_iscsi_create', params) 1106 1107 1108def bdev_iscsi_delete(client, name): 1109 """Remove iSCSI bdev from the system. 1110 1111 Args: 1112 bdev_name: name of iSCSI bdev to delete 1113 """ 1114 params = {'name': name} 1115 return client.call('bdev_iscsi_delete', params) 1116 1117 1118def bdev_pmem_create(client, pmem_file, name): 1119 """Construct a libpmemblk block device. 1120 1121 Args: 1122 pmem_file: path to pmemblk pool file 1123 name: name of block device 1124 1125 Returns: 1126 Name of created block device. 1127 """ 1128 params = { 1129 'pmem_file': pmem_file, 1130 'name': name 1131 } 1132 return client.call('bdev_pmem_create', params) 1133 1134 1135def bdev_pmem_delete(client, name): 1136 """Remove pmem bdev from the system. 1137 1138 Args: 1139 name: name of pmem bdev to delete 1140 """ 1141 params = {'name': name} 1142 return client.call('bdev_pmem_delete', params) 1143 1144 1145def bdev_passthru_create(client, base_bdev_name, name): 1146 """Construct a pass-through block device. 1147 1148 Args: 1149 base_bdev_name: name of the existing bdev 1150 name: name of block device 1151 1152 Returns: 1153 Name of created block device. 1154 """ 1155 params = { 1156 'base_bdev_name': base_bdev_name, 1157 'name': name, 1158 } 1159 return client.call('bdev_passthru_create', params) 1160 1161 1162def bdev_passthru_delete(client, name): 1163 """Remove pass through bdev from the system. 1164 1165 Args: 1166 name: name of pass through bdev to delete 1167 """ 1168 params = {'name': name} 1169 return client.call('bdev_passthru_delete', params) 1170 1171 1172def bdev_opal_create(client, nvme_ctrlr_name, nsid, locking_range_id, range_start, range_length, password): 1173 """Create opal virtual block devices from a base nvme bdev. 1174 1175 Args: 1176 nvme_ctrlr_name: name of the nvme ctrlr 1177 nsid: namespace ID of nvme ctrlr 1178 locking_range_id: locking range ID corresponding to this virtual bdev 1179 range_start: start address of this locking range 1180 range_length: length of this locking range 1181 password: admin password of base nvme bdev 1182 1183 Returns: 1184 Name of the new created block devices. 1185 """ 1186 params = { 1187 'nvme_ctrlr_name': nvme_ctrlr_name, 1188 'nsid': nsid, 1189 'locking_range_id': locking_range_id, 1190 'range_start': range_start, 1191 'range_length': range_length, 1192 'password': password, 1193 } 1194 1195 return client.call('bdev_opal_create', params) 1196 1197 1198def bdev_opal_get_info(client, bdev_name, password): 1199 """Get opal locking range info. 1200 1201 Args: 1202 bdev_name: name of opal vbdev to get info 1203 password: admin password 1204 1205 Returns: 1206 Locking range info. 1207 """ 1208 params = { 1209 'bdev_name': bdev_name, 1210 'password': password, 1211 } 1212 1213 return client.call('bdev_opal_get_info', params) 1214 1215 1216def bdev_opal_delete(client, bdev_name, password): 1217 """Delete opal virtual bdev from the system. 1218 1219 Args: 1220 bdev_name: name of opal vbdev to delete 1221 password: admin password of base nvme bdev 1222 """ 1223 params = { 1224 'bdev_name': bdev_name, 1225 'password': password, 1226 } 1227 1228 return client.call('bdev_opal_delete', params) 1229 1230 1231def bdev_opal_new_user(client, bdev_name, admin_password, user_id, user_password): 1232 """Add a user to opal bdev who can set lock state for this bdev. 1233 1234 Args: 1235 bdev_name: name of opal vbdev 1236 admin_password: admin password 1237 user_id: ID of the user who will be added to this opal bdev 1238 user_password: password set for this user 1239 """ 1240 params = { 1241 'bdev_name': bdev_name, 1242 'admin_password': admin_password, 1243 'user_id': user_id, 1244 'user_password': user_password, 1245 } 1246 1247 return client.call('bdev_opal_new_user', params) 1248 1249 1250def bdev_opal_set_lock_state(client, bdev_name, user_id, password, lock_state): 1251 """set lock state for an opal bdev. 1252 1253 Args: 1254 bdev_name: name of opal vbdev 1255 user_id: ID of the user who will set lock state 1256 password: password of the user 1257 lock_state: lock state to set 1258 """ 1259 params = { 1260 'bdev_name': bdev_name, 1261 'user_id': user_id, 1262 'password': password, 1263 'lock_state': lock_state, 1264 } 1265 1266 return client.call('bdev_opal_set_lock_state', params) 1267 1268 1269def bdev_split_create(client, base_bdev, split_count, split_size_mb=None): 1270 """Create split block devices from a base bdev. 1271 1272 Args: 1273 base_bdev: name of bdev to split 1274 split_count: number of split bdevs to create 1275 split_size_mb: size of each split volume in MiB (optional) 1276 1277 Returns: 1278 List of created block devices. 1279 """ 1280 params = { 1281 'base_bdev': base_bdev, 1282 'split_count': split_count, 1283 } 1284 if split_size_mb: 1285 params['split_size_mb'] = split_size_mb 1286 1287 return client.call('bdev_split_create', params) 1288 1289 1290def bdev_split_delete(client, base_bdev): 1291 """Delete split block devices. 1292 1293 Args: 1294 base_bdev: name of previously split bdev 1295 """ 1296 params = { 1297 'base_bdev': base_bdev, 1298 } 1299 1300 return client.call('bdev_split_delete', params) 1301 1302 1303def bdev_ftl_create(client, name, base_bdev, **kwargs): 1304 """Construct FTL bdev 1305 1306 Args: 1307 name: name of the bdev 1308 base_bdev: name of the base bdev 1309 kwargs: optional parameters 1310 """ 1311 params = {'name': name, 1312 'base_bdev': base_bdev} 1313 for key, value in kwargs.items(): 1314 if value is not None: 1315 params[key] = value 1316 1317 return client.call('bdev_ftl_create', params) 1318 1319 1320def bdev_ftl_delete(client, name): 1321 """Delete FTL bdev 1322 1323 Args: 1324 name: name of the bdev 1325 """ 1326 params = {'name': name} 1327 1328 return client.call('bdev_ftl_delete', params) 1329 1330 1331def bdev_get_bdevs(client, name=None, timeout=None): 1332 """Get information about block devices. 1333 1334 Args: 1335 name: bdev name to query (optional; if omitted, query all bdevs) 1336 timeout: time in ms to wait for the bdev with specified name to appear 1337 1338 Returns: 1339 List of bdev information objects. 1340 """ 1341 params = {} 1342 if name: 1343 params['name'] = name 1344 if timeout: 1345 params['timeout'] = timeout 1346 return client.call('bdev_get_bdevs', params) 1347 1348 1349def bdev_get_iostat(client, name=None): 1350 """Get I/O statistics for block devices. 1351 1352 Args: 1353 name: bdev name to query (optional; if omitted, query all bdevs) 1354 1355 Returns: 1356 I/O statistics for the requested block devices. 1357 """ 1358 params = {} 1359 if name: 1360 params['name'] = name 1361 return client.call('bdev_get_iostat', params) 1362 1363 1364def bdev_enable_histogram(client, name, enable): 1365 """Control whether histogram is enabled for specified bdev. 1366 1367 Args: 1368 bdev_name: name of bdev 1369 """ 1370 params = {'name': name, "enable": enable} 1371 return client.call('bdev_enable_histogram', params) 1372 1373 1374def bdev_get_histogram(client, name): 1375 """Get histogram for specified bdev. 1376 1377 Args: 1378 bdev_name: name of bdev 1379 """ 1380 params = {'name': name} 1381 return client.call('bdev_get_histogram', params) 1382 1383 1384def bdev_error_inject_error(client, name, io_type, error_type, num=1): 1385 """Inject an error via an error bdev. 1386 1387 Args: 1388 name: name of error bdev 1389 io_type: one of "clear", "read", "write", "unmap", "flush", or "all" 1390 error_type: one of "failure" or "pending" 1391 num: number of commands to fail 1392 """ 1393 params = { 1394 'name': name, 1395 'io_type': io_type, 1396 'error_type': error_type, 1397 } 1398 1399 if num: 1400 params['num'] = num 1401 1402 return client.call('bdev_error_inject_error', params) 1403 1404 1405def bdev_set_qd_sampling_period(client, name, period): 1406 """Enable queue depth tracking on a specified bdev. 1407 1408 Args: 1409 name: name of a bdev on which to track queue depth. 1410 period: period (in microseconds) at which to update the queue depth reading. If set to 0, polling will be disabled. 1411 """ 1412 1413 params = {} 1414 params['name'] = name 1415 params['period'] = period 1416 return client.call('bdev_set_qd_sampling_period', params) 1417 1418 1419def bdev_set_qos_limit( 1420 client, 1421 name, 1422 rw_ios_per_sec=None, 1423 rw_mbytes_per_sec=None, 1424 r_mbytes_per_sec=None, 1425 w_mbytes_per_sec=None): 1426 """Set QoS rate limit on a block device. 1427 1428 Args: 1429 name: name of block device 1430 rw_ios_per_sec: R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited. 1431 rw_mbytes_per_sec: R/W megabytes per second limit (>=10, example: 100). 0 means unlimited. 1432 r_mbytes_per_sec: Read megabytes per second limit (>=10, example: 100). 0 means unlimited. 1433 w_mbytes_per_sec: Write megabytes per second limit (>=10, example: 100). 0 means unlimited. 1434 """ 1435 params = {} 1436 params['name'] = name 1437 if rw_ios_per_sec is not None: 1438 params['rw_ios_per_sec'] = rw_ios_per_sec 1439 if rw_mbytes_per_sec is not None: 1440 params['rw_mbytes_per_sec'] = rw_mbytes_per_sec 1441 if r_mbytes_per_sec is not None: 1442 params['r_mbytes_per_sec'] = r_mbytes_per_sec 1443 if w_mbytes_per_sec is not None: 1444 params['w_mbytes_per_sec'] = w_mbytes_per_sec 1445 return client.call('bdev_set_qos_limit', params) 1446 1447 1448def bdev_nvme_apply_firmware(client, bdev_name, filename): 1449 """Download and commit firmware to NVMe device. 1450 1451 Args: 1452 bdev_name: name of NVMe block device 1453 filename: filename of the firmware to download 1454 """ 1455 params = { 1456 'filename': filename, 1457 'bdev_name': bdev_name, 1458 } 1459 return client.call('bdev_nvme_apply_firmware', params) 1460 1461 1462def bdev_nvme_get_transport_statistics(client): 1463 """Get bdev_nvme poll group transport statistics""" 1464 return client.call('bdev_nvme_get_transport_statistics') 1465 1466 1467def bdev_nvme_get_controller_health_info(client, name): 1468 """Display health log of the required NVMe bdev controller. 1469 1470 Args: 1471 name: name of the required NVMe bdev controller 1472 1473 Returns: 1474 Health log for the requested NVMe bdev controller. 1475 """ 1476 params = {} 1477 params['name'] = name 1478 return client.call('bdev_nvme_get_controller_health_info', params) 1479