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_xnvme_create(client, filename, name, io_mechanism): 444 """Create a bdev with xNVMe backend. 445 446 Args: 447 filename: path to device or file (ex: /dev/nvme0n1) 448 name: name of xNVMe bdev to create 449 io_mechanism: I/O mechanism to use (ex: io_uring, io_uring_cmd, etc.) 450 451 Returns: 452 Name of created bdev. 453 """ 454 params = {'name': name, 455 'filename': filename, 456 'io_mechanism': io_mechanism} 457 458 return client.call('bdev_xnvme_create', params) 459 460 461def bdev_xnvme_delete(client, name): 462 """Delete a xNVMe bdev. 463 464 Args: 465 name: name of xNVMe bdev to delete 466 """ 467 params = {'name': name} 468 return client.call('bdev_xnvme_delete', params) 469 470 471def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, timeout_admin_us=None, 472 keep_alive_timeout_ms=None, retry_count=None, arbitration_burst=None, 473 low_priority_weight=None, medium_priority_weight=None, high_priority_weight=None, 474 nvme_adminq_poll_period_us=None, nvme_ioq_poll_period_us=None, io_queue_requests=None, 475 delay_cmd_submit=None, transport_retry_count=None, bdev_retry_count=None, 476 transport_ack_timeout=None, ctrlr_loss_timeout_sec=None, reconnect_delay_sec=None, 477 fast_io_fail_timeout_sec=None, disable_auto_failback=None): 478 """Set options for the bdev nvme. This is startup command. 479 480 Args: 481 action_on_timeout: action to take on command time out. Valid values are: none, reset, abort (optional) 482 timeout_us: Timeout for each command, in microseconds. If 0, don't track timeouts (optional) 483 timeout_admin_us: Timeout for each admin command, in microseconds. If 0, treat same as io timeouts (optional) 484 keep_alive_timeout_ms: Keep alive timeout period in millisecond, default is 10s (optional) 485 retry_count: The number of attempts per I/O when an I/O fails (deprecated) (optional) 486 arbitration_burst: The value is expressed as a power of two (optional) 487 low_priority_weight: The number of commands that may be executed from the low priority queue at one time (optional) 488 medium_priority_weight: The number of commands that may be executed from the medium priority queue at one time (optional) 489 high_priority_weight: The number of commands that may be executed from the high priority queue at one time (optional) 490 nvme_adminq_poll_period_us: How often the admin queue is polled for asynchronous events in microseconds (optional) 491 nvme_ioq_poll_period_us: How often to poll I/O queues for completions in microseconds (optional) 492 io_queue_requests: The number of requests allocated for each NVMe I/O queue. Default: 512 (optional) 493 delay_cmd_submit: Enable delayed NVMe command submission to allow batching of multiple commands (optional) 494 transport_retry_count: The number of attempts per I/O in the transport layer when an I/O fails (optional) 495 bdev_retry_count: The number of attempts per I/O in the bdev layer when an I/O fails. -1 means infinite retries. (optional) 496 transport_ack_timeout: Time to wait ack until packet retransmission for RDMA or until closes connection for TCP. 497 Range 0-31 where 0 is driver-specific default value (optional) 498 ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr. 499 -1 means infinite reconnect retries. 0 means no reconnect retry. 500 If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero. 501 If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec. 502 This can be overridden by bdev_nvme_attach_controller. (optional) 503 reconnect_delay_sec: Time to delay a reconnect retry. 504 If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero. 505 If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero. 506 If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec. 507 This can be overridden by bdev_nvme_attach_controller. (optional) 508 fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 509 0 means no such timeout. 510 If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than 511 ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. 512 This can be overridden by bdev_nvme_attach_controller. (optional) 513 disable_auto_failback: Disable automatic failback. bdev_nvme_set_preferred_path can be used to do manual failback. 514 By default, immediately failback to the preferred I/O path if it is restored. (optional) 515 516 """ 517 params = {} 518 519 if action_on_timeout: 520 params['action_on_timeout'] = action_on_timeout 521 522 if timeout_us is not None: 523 params['timeout_us'] = timeout_us 524 525 if timeout_admin_us is not None: 526 params['timeout_admin_us'] = timeout_admin_us 527 528 if keep_alive_timeout_ms is not None: 529 params['keep_alive_timeout_ms'] = keep_alive_timeout_ms 530 531 if retry_count is not None: 532 print("WARNING: retry_count is deprecated, please use transport_retry_count.") 533 params['retry_count'] = retry_count 534 535 if arbitration_burst is not None: 536 params['arbitration_burst'] = arbitration_burst 537 538 if low_priority_weight is not None: 539 params['low_priority_weight'] = low_priority_weight 540 541 if medium_priority_weight is not None: 542 params['medium_priority_weight'] = medium_priority_weight 543 544 if high_priority_weight is not None: 545 params['high_priority_weight'] = high_priority_weight 546 547 if nvme_adminq_poll_period_us: 548 params['nvme_adminq_poll_period_us'] = nvme_adminq_poll_period_us 549 550 if nvme_ioq_poll_period_us is not None: 551 params['nvme_ioq_poll_period_us'] = nvme_ioq_poll_period_us 552 553 if io_queue_requests is not None: 554 params['io_queue_requests'] = io_queue_requests 555 556 if delay_cmd_submit is not None: 557 params['delay_cmd_submit'] = delay_cmd_submit 558 559 if transport_retry_count is not None: 560 params['transport_retry_count'] = transport_retry_count 561 562 if bdev_retry_count is not None: 563 params['bdev_retry_count'] = bdev_retry_count 564 565 if transport_ack_timeout is not None: 566 params['transport_ack_timeout'] = transport_ack_timeout 567 568 if ctrlr_loss_timeout_sec is not None: 569 params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec 570 571 if reconnect_delay_sec is not None: 572 params['reconnect_delay_sec'] = reconnect_delay_sec 573 574 if fast_io_fail_timeout_sec is not None: 575 params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec 576 577 if disable_auto_failback is not None: 578 params['disable_auto_failback'] = disable_auto_failback 579 580 return client.call('bdev_nvme_set_options', params) 581 582 583def bdev_nvme_set_hotplug(client, enable, period_us=None): 584 """Set options for the bdev nvme. This is startup command. 585 586 Args: 587 enable: True to enable hotplug, False to disable. 588 period_us: how often the hotplug is processed for insert and remove events. Set 0 to reset to default. (optional) 589 """ 590 params = {'enable': enable} 591 592 if period_us: 593 params['period_us'] = period_us 594 595 return client.call('bdev_nvme_set_hotplug', params) 596 597 598def bdev_nvme_attach_controller(client, name, trtype, traddr, adrfam=None, trsvcid=None, 599 priority=None, subnqn=None, hostnqn=None, hostaddr=None, 600 hostsvcid=None, prchk_reftag=None, prchk_guard=None, 601 hdgst=None, ddgst=None, fabrics_timeout=None, multipath=None, num_io_queues=None, 602 ctrlr_loss_timeout_sec=None, reconnect_delay_sec=None, 603 fast_io_fail_timeout_sec=None, psk=None): 604 """Construct block device for each NVMe namespace in the attached controller. 605 606 Args: 607 name: bdev name prefix; "n" + namespace ID will be appended to create unique names 608 trtype: transport type ("PCIe", "RDMA", "FC", "TCP") 609 traddr: transport address (PCI BDF or IP address) 610 adrfam: address family ("IPv4", "IPv6", "IB", or "FC") 611 trsvcid: transport service ID (port number for IP-based addresses) 612 priority: transport connection priority (Sock priority for TCP-based transports; optional) 613 subnqn: subsystem NQN to connect to (optional) 614 hostnqn: NQN to connect from (optional) 615 hostaddr: host transport address (IP address for IP-based transports, NULL for PCIe or FC; optional) 616 hostsvcid: host transport service ID (port number for IP-based transports, NULL for PCIe or FC; optional) 617 prchk_reftag: Enable checking of PI reference tag for I/O processing (optional) 618 prchk_guard: Enable checking of PI guard for I/O processing (optional) 619 hdgst: Enable TCP header digest (optional) 620 ddgst: Enable TCP data digest (optional) 621 fabrics_timeout: Fabrics connect timeout in us (optional) 622 multipath: The behavior when multiple paths are created ("disable", "failover", or "multipath"; failover if not specified) 623 num_io_queues: The number of IO queues to request during initialization. (optional) 624 ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr. 625 -1 means infinite reconnect retries. 0 means no reconnect retry. 626 If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero. 627 If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec. 628 (optional) 629 reconnect_delay_sec: Time to delay a reconnect retry. 630 If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero. 631 If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero. 632 If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec. 633 (optional) 634 fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 635 0 means no such timeout. 636 If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than 637 ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional) 638 psk: Set PSK and enable TCP SSL socket implementation (optional) 639 640 Returns: 641 Names of created block devices. 642 """ 643 params = {'name': name, 644 'trtype': trtype, 645 'traddr': traddr} 646 647 if hostnqn: 648 params['hostnqn'] = hostnqn 649 650 if hostaddr: 651 params['hostaddr'] = hostaddr 652 653 if hostsvcid: 654 params['hostsvcid'] = hostsvcid 655 656 if adrfam: 657 params['adrfam'] = adrfam 658 659 if trsvcid: 660 params['trsvcid'] = trsvcid 661 662 if priority: 663 params['priority'] = priority 664 665 if subnqn: 666 params['subnqn'] = subnqn 667 668 if prchk_reftag: 669 params['prchk_reftag'] = prchk_reftag 670 671 if prchk_guard: 672 params['prchk_guard'] = prchk_guard 673 674 if hdgst: 675 params['hdgst'] = hdgst 676 677 if ddgst: 678 params['ddgst'] = ddgst 679 680 if fabrics_timeout: 681 params['fabrics_connect_timeout_us'] = fabrics_timeout 682 683 if multipath: 684 params['multipath'] = multipath 685 686 if num_io_queues: 687 params['num_io_queues'] = num_io_queues 688 689 if ctrlr_loss_timeout_sec is not None: 690 params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec 691 692 if reconnect_delay_sec is not None: 693 params['reconnect_delay_sec'] = reconnect_delay_sec 694 695 if fast_io_fail_timeout_sec is not None: 696 params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec 697 698 if psk: 699 params['psk'] = psk 700 701 return client.call('bdev_nvme_attach_controller', params) 702 703 704def bdev_nvme_detach_controller(client, name, trtype=None, traddr=None, 705 adrfam=None, trsvcid=None, subnqn=None, 706 hostaddr=None, hostsvcid=None): 707 """Detach NVMe controller and delete any associated bdevs. Optionally, 708 If all of the transport ID options are specified, only remove that 709 transport path from the specified controller. If that is the only 710 available path for the controller, this will also result in the 711 controller being detached and the associated bdevs being deleted. 712 713 Args: 714 name: controller name 715 trtype: transport type ("PCIe", "RDMA") 716 traddr: transport address (PCI BDF or IP address) 717 adrfam: address family ("IPv4", "IPv6", "IB", or "FC") 718 trsvcid: transport service ID (port number for IP-based addresses) 719 subnqn: subsystem NQN to connect to (optional) 720 hostaddr: Host address (IP address) 721 hostsvcid: transport service ID on host side (port number) 722 """ 723 724 params = {'name': name} 725 726 if trtype: 727 params['trtype'] = trtype 728 729 if traddr: 730 params['traddr'] = traddr 731 732 if adrfam: 733 params['adrfam'] = adrfam 734 735 if trsvcid: 736 params['trsvcid'] = trsvcid 737 738 if subnqn: 739 params['subnqn'] = subnqn 740 741 if hostaddr: 742 params['hostaddr'] = hostaddr 743 744 if hostsvcid: 745 params['hostsvcid'] = hostsvcid 746 747 return client.call('bdev_nvme_detach_controller', params) 748 749 750def bdev_nvme_reset_controller(client, name): 751 """Reset NVMe controller. 752 753 Args: 754 name: controller name 755 """ 756 757 params = {'name': name} 758 759 return client.call('bdev_nvme_reset_controller', params) 760 761 762def bdev_nvme_start_discovery(client, name, trtype, traddr, adrfam=None, trsvcid=None, 763 hostnqn=None, wait_for_attach=None, ctrlr_loss_timeout_sec=None, 764 reconnect_delay_sec=None, fast_io_fail_timeout_sec=None, 765 attach_timeout_ms=None): 766 """Start discovery with the specified discovery subsystem 767 768 Args: 769 name: bdev name prefix; "n" + namespace ID will be appended to create unique names 770 trtype: transport type ("PCIe", "RDMA", "FC", "TCP") 771 traddr: transport address (PCI BDF or IP address) 772 adrfam: address family ("IPv4", "IPv6", "IB", or "FC") 773 trsvcid: transport service ID (port number for IP-based addresses) 774 hostnqn: NQN to connect from (optional) 775 wait_for_attach: Wait to complete RPC until all discovered NVM subsystems have attached (optional) 776 ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr. 777 -1 means infinite reconnect retries. 0 means no reconnect retry. 778 If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero. 779 If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec. 780 (optional) 781 reconnect_delay_sec: Time to delay a reconnect retry. 782 If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero. 783 If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero. 784 If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec. 785 (optional) 786 fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 787 0 means no such timeout. 788 If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than 789 ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional) 790 attach_timeout_ms: Time to wait until the discovery and all discovered NVM subsystems are attached (optional) 791 """ 792 params = {'name': name, 793 'trtype': trtype, 794 'traddr': traddr} 795 796 if hostnqn: 797 params['hostnqn'] = hostnqn 798 799 if adrfam: 800 params['adrfam'] = adrfam 801 802 if trsvcid: 803 params['trsvcid'] = trsvcid 804 805 if wait_for_attach: 806 params['wait_for_attach'] = True 807 808 if attach_timeout_ms is not None: 809 params['attach_timeout_ms'] = attach_timeout_ms 810 811 if ctrlr_loss_timeout_sec is not None: 812 params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec 813 814 if reconnect_delay_sec is not None: 815 params['reconnect_delay_sec'] = reconnect_delay_sec 816 817 if fast_io_fail_timeout_sec is not None: 818 params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec 819 820 return client.call('bdev_nvme_start_discovery', params) 821 822 823def bdev_nvme_stop_discovery(client, name): 824 """Stop a previously started discovery service 825 826 Args: 827 name: name of discovery service to start 828 """ 829 params = {'name': name} 830 831 return client.call('bdev_nvme_stop_discovery', params) 832 833 834def bdev_nvme_get_discovery_info(client): 835 """Get information about the automatic discovery 836 """ 837 return client.call('bdev_nvme_get_discovery_info') 838 839 840def bdev_nvme_get_io_paths(client, name): 841 """Display all or the specified NVMe bdev's active I/O paths 842 843 Args: 844 name: Name of the NVMe bdev (optional) 845 846 Returns: 847 List of active I/O paths 848 """ 849 params = {} 850 if name: 851 params['name'] = name 852 return client.call('bdev_nvme_get_io_paths', params) 853 854 855def bdev_nvme_set_preferred_path(client, name, cntlid): 856 """Set the preferred I/O path for an NVMe bdev when in multipath mode 857 858 Args: 859 name: NVMe bdev name 860 cntlid: NVMe-oF controller ID 861 """ 862 863 params = {'name': name, 864 'cntlid': cntlid} 865 866 return client.call('bdev_nvme_set_preferred_path', params) 867 868 869def bdev_nvme_set_multipath_policy(client, name, policy): 870 """Set multipath policy of the NVMe bdev 871 872 Args: 873 name: NVMe bdev name 874 policy: Multipath policy (active_passive or active_active) 875 """ 876 877 params = {'name': name, 878 'policy': policy} 879 880 return client.call('bdev_nvme_set_multipath_policy', params) 881 882 883def bdev_nvme_cuse_register(client, name): 884 """Register CUSE devices on NVMe controller. 885 886 Args: 887 name: Name of the operating NVMe controller 888 """ 889 params = {'name': name} 890 891 return client.call('bdev_nvme_cuse_register', params) 892 893 894def bdev_nvme_cuse_unregister(client, name): 895 """Unregister CUSE devices on NVMe controller. 896 897 Args: 898 name: Name of the operating NVMe controller 899 """ 900 params = {'name': name} 901 902 return client.call('bdev_nvme_cuse_unregister', params) 903 904 905def bdev_zone_block_create(client, name, base_bdev, zone_capacity, optimal_open_zones): 906 """Creates a virtual zone device on top of existing non-zoned bdev. 907 908 Args: 909 name: Zone device name 910 base_bdev: Base Nvme bdev name 911 zone_capacity: Surfaced zone capacity in blocks 912 optimal_open_zones: Number of zones required to reach optimal write speed (optional, default: 1) 913 914 Returns: 915 Name of created block device. 916 """ 917 params = {'name': name, 918 'base_bdev': base_bdev, 919 'zone_capacity': zone_capacity, 920 'optimal_open_zones': optimal_open_zones} 921 922 return client.call('bdev_zone_block_create', params) 923 924 925def bdev_zone_block_delete(client, name): 926 """Remove block zone bdev from the system. 927 928 Args: 929 name: name of block zone bdev to delete 930 """ 931 params = {'name': name} 932 return client.call('bdev_zone_block_delete', params) 933 934 935def bdev_rbd_register_cluster(client, name, user=None, config_param=None, config_file=None, key_file=None): 936 """Create a Rados Cluster object of the Ceph RBD backend. 937 938 Args: 939 name: name of Rados Cluster 940 user: Ceph user name (optional) 941 config_param: map of config keys to values (optional) 942 config_file: file path of Ceph configuration file (optional) 943 key_file: file path of Ceph key file (optional) 944 945 Returns: 946 Name of registered Rados Cluster object. 947 """ 948 params = {'name': name} 949 950 if user is not None: 951 params['user_id'] = user 952 if config_param is not None: 953 params['config_param'] = config_param 954 if config_file is not None: 955 params['config_file'] = config_file 956 if key_file is not None: 957 params['key_file'] = key_file 958 959 return client.call('bdev_rbd_register_cluster', params) 960 961 962def bdev_rbd_unregister_cluster(client, name): 963 """Remove Rados cluster object from the system. 964 965 Args: 966 name: name of Rados cluster object to unregister 967 """ 968 params = {'name': name} 969 return client.call('bdev_rbd_unregister_cluster', params) 970 971 972def bdev_rbd_get_clusters_info(client, name): 973 """Get the cluster(s) info 974 975 Args: 976 name: name of Rados cluster object to query (optional; if omitted, query all clusters) 977 978 Returns: 979 List of registered Rados cluster information objects. 980 """ 981 params = {} 982 if name: 983 params['name'] = name 984 return client.call('bdev_rbd_get_clusters_info', params) 985 986 987def bdev_rbd_create(client, pool_name, rbd_name, block_size, name=None, user=None, config=None, cluster_name=None, uuid=None): 988 """Create a Ceph RBD block device. 989 990 Args: 991 pool_name: Ceph RBD pool name 992 rbd_name: Ceph RBD image name 993 block_size: block size of RBD volume 994 name: name of block device (optional) 995 user: Ceph user name (optional) 996 config: map of config keys to values (optional) 997 cluster_name: Name to identify Rados cluster (optional) 998 uuid: UUID of block device (optional) 999 1000 Returns: 1001 Name of created block device. 1002 """ 1003 params = { 1004 'pool_name': pool_name, 1005 'rbd_name': rbd_name, 1006 'block_size': block_size, 1007 } 1008 1009 if name: 1010 params['name'] = name 1011 if user is not None: 1012 params['user_id'] = user 1013 if config is not None: 1014 params['config'] = config 1015 if cluster_name is not None: 1016 params['cluster_name'] = cluster_name 1017 else: 1018 print("WARNING:bdev_rbd_create should be used with specifying -c to have a cluster name after bdev_rbd_register_cluster.") 1019 if uuid is not None: 1020 params['uuid'] = uuid 1021 1022 return client.call('bdev_rbd_create', params) 1023 1024 1025def bdev_rbd_delete(client, name): 1026 """Remove rbd bdev from the system. 1027 1028 Args: 1029 name: name of rbd bdev to delete 1030 """ 1031 params = {'name': name} 1032 return client.call('bdev_rbd_delete', params) 1033 1034 1035def bdev_rbd_resize(client, name, new_size): 1036 """Resize rbd bdev in the system. 1037 1038 Args: 1039 name: name of rbd bdev to resize 1040 new_size: new bdev size of resize operation. The unit is MiB 1041 """ 1042 params = { 1043 'name': name, 1044 'new_size': new_size, 1045 } 1046 return client.call('bdev_rbd_resize', params) 1047 1048 1049def bdev_error_create(client, base_name): 1050 """Construct an error injection block device. 1051 1052 Args: 1053 base_name: base bdev name 1054 """ 1055 params = {'base_name': base_name} 1056 return client.call('bdev_error_create', params) 1057 1058 1059def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency): 1060 """Construct a delay block device. 1061 1062 Args: 1063 base_bdev_name: name of the existing bdev 1064 name: name of block device 1065 avg_read_latency: complete 99% of read ops with this delay 1066 p99_read_latency: complete 1% of read ops with this delay 1067 avg_write_latency: complete 99% of write ops with this delay 1068 p99_write_latency: complete 1% of write ops with this delay 1069 1070 Returns: 1071 Name of created block device. 1072 """ 1073 params = { 1074 'base_bdev_name': base_bdev_name, 1075 'name': name, 1076 'avg_read_latency': avg_read_latency, 1077 'p99_read_latency': p99_read_latency, 1078 'avg_write_latency': avg_write_latency, 1079 'p99_write_latency': p99_write_latency, 1080 } 1081 return client.call('bdev_delay_create', params) 1082 1083 1084def bdev_delay_delete(client, name): 1085 """Remove delay bdev from the system. 1086 1087 Args: 1088 name: name of delay bdev to delete 1089 """ 1090 params = {'name': name} 1091 return client.call('bdev_delay_delete', params) 1092 1093 1094def bdev_delay_update_latency(client, delay_bdev_name, latency_type, latency_us): 1095 """Update the latency value for a delay block device 1096 1097 Args: 1098 delay_bdev_name: name of the delay bdev 1099 latency_type: 'one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.' 1100 latency_us: 'new latency value.' 1101 1102 Returns: 1103 True if successful, or a specific error otherwise. 1104 """ 1105 params = { 1106 'delay_bdev_name': delay_bdev_name, 1107 'latency_type': latency_type, 1108 'latency_us': latency_us, 1109 } 1110 return client.call('bdev_delay_update_latency', params) 1111 1112 1113def bdev_error_delete(client, name): 1114 """Remove error bdev from the system. 1115 1116 Args: 1117 bdev_name: name of error bdev to delete 1118 """ 1119 params = {'name': name} 1120 return client.call('bdev_error_delete', params) 1121 1122 1123def bdev_iscsi_set_options(client, timeout_sec): 1124 """Set options for the bdev iscsi. 1125 1126 Args: 1127 timeout_sec: Timeout for command, in seconds, if 0, don't track timeout 1128 """ 1129 params = {} 1130 1131 if timeout_sec is not None: 1132 params['timeout_sec'] = timeout_sec 1133 1134 return client.call('bdev_iscsi_set_options', params) 1135 1136 1137def bdev_iscsi_create(client, name, url, initiator_iqn): 1138 """Construct an iSCSI block device. 1139 1140 Args: 1141 name: name of block device 1142 url: iSCSI URL 1143 initiator_iqn: IQN name to be used by initiator 1144 1145 Returns: 1146 Name of created block device. 1147 """ 1148 params = { 1149 'name': name, 1150 'url': url, 1151 'initiator_iqn': initiator_iqn, 1152 } 1153 return client.call('bdev_iscsi_create', params) 1154 1155 1156def bdev_iscsi_delete(client, name): 1157 """Remove iSCSI bdev from the system. 1158 1159 Args: 1160 bdev_name: name of iSCSI bdev to delete 1161 """ 1162 params = {'name': name} 1163 return client.call('bdev_iscsi_delete', params) 1164 1165 1166def bdev_pmem_create(client, pmem_file, name): 1167 """Construct a libpmemblk block device. 1168 1169 Args: 1170 pmem_file: path to pmemblk pool file 1171 name: name of block device 1172 1173 Returns: 1174 Name of created block device. 1175 """ 1176 params = { 1177 'pmem_file': pmem_file, 1178 'name': name 1179 } 1180 return client.call('bdev_pmem_create', params) 1181 1182 1183def bdev_pmem_delete(client, name): 1184 """Remove pmem bdev from the system. 1185 1186 Args: 1187 name: name of pmem bdev to delete 1188 """ 1189 params = {'name': name} 1190 return client.call('bdev_pmem_delete', params) 1191 1192 1193def bdev_passthru_create(client, base_bdev_name, name): 1194 """Construct a pass-through block device. 1195 1196 Args: 1197 base_bdev_name: name of the existing bdev 1198 name: name of block device 1199 1200 Returns: 1201 Name of created block device. 1202 """ 1203 params = { 1204 'base_bdev_name': base_bdev_name, 1205 'name': name, 1206 } 1207 return client.call('bdev_passthru_create', params) 1208 1209 1210def bdev_passthru_delete(client, name): 1211 """Remove pass through bdev from the system. 1212 1213 Args: 1214 name: name of pass through bdev to delete 1215 """ 1216 params = {'name': name} 1217 return client.call('bdev_passthru_delete', params) 1218 1219 1220def bdev_opal_create(client, nvme_ctrlr_name, nsid, locking_range_id, range_start, range_length, password): 1221 """Create opal virtual block devices from a base nvme bdev. 1222 1223 Args: 1224 nvme_ctrlr_name: name of the nvme ctrlr 1225 nsid: namespace ID of nvme ctrlr 1226 locking_range_id: locking range ID corresponding to this virtual bdev 1227 range_start: start address of this locking range 1228 range_length: length of this locking range 1229 password: admin password of base nvme bdev 1230 1231 Returns: 1232 Name of the new created block devices. 1233 """ 1234 params = { 1235 'nvme_ctrlr_name': nvme_ctrlr_name, 1236 'nsid': nsid, 1237 'locking_range_id': locking_range_id, 1238 'range_start': range_start, 1239 'range_length': range_length, 1240 'password': password, 1241 } 1242 1243 return client.call('bdev_opal_create', params) 1244 1245 1246def bdev_opal_get_info(client, bdev_name, password): 1247 """Get opal locking range info. 1248 1249 Args: 1250 bdev_name: name of opal vbdev to get info 1251 password: admin password 1252 1253 Returns: 1254 Locking range info. 1255 """ 1256 params = { 1257 'bdev_name': bdev_name, 1258 'password': password, 1259 } 1260 1261 return client.call('bdev_opal_get_info', params) 1262 1263 1264def bdev_opal_delete(client, bdev_name, password): 1265 """Delete opal virtual bdev from the system. 1266 1267 Args: 1268 bdev_name: name of opal vbdev to delete 1269 password: admin password of base nvme bdev 1270 """ 1271 params = { 1272 'bdev_name': bdev_name, 1273 'password': password, 1274 } 1275 1276 return client.call('bdev_opal_delete', params) 1277 1278 1279def bdev_opal_new_user(client, bdev_name, admin_password, user_id, user_password): 1280 """Add a user to opal bdev who can set lock state for this bdev. 1281 1282 Args: 1283 bdev_name: name of opal vbdev 1284 admin_password: admin password 1285 user_id: ID of the user who will be added to this opal bdev 1286 user_password: password set for this user 1287 """ 1288 params = { 1289 'bdev_name': bdev_name, 1290 'admin_password': admin_password, 1291 'user_id': user_id, 1292 'user_password': user_password, 1293 } 1294 1295 return client.call('bdev_opal_new_user', params) 1296 1297 1298def bdev_opal_set_lock_state(client, bdev_name, user_id, password, lock_state): 1299 """set lock state for an opal bdev. 1300 1301 Args: 1302 bdev_name: name of opal vbdev 1303 user_id: ID of the user who will set lock state 1304 password: password of the user 1305 lock_state: lock state to set 1306 """ 1307 params = { 1308 'bdev_name': bdev_name, 1309 'user_id': user_id, 1310 'password': password, 1311 'lock_state': lock_state, 1312 } 1313 1314 return client.call('bdev_opal_set_lock_state', params) 1315 1316 1317def bdev_split_create(client, base_bdev, split_count, split_size_mb=None): 1318 """Create split block devices from a base bdev. 1319 1320 Args: 1321 base_bdev: name of bdev to split 1322 split_count: number of split bdevs to create 1323 split_size_mb: size of each split volume in MiB (optional) 1324 1325 Returns: 1326 List of created block devices. 1327 """ 1328 params = { 1329 'base_bdev': base_bdev, 1330 'split_count': split_count, 1331 } 1332 if split_size_mb: 1333 params['split_size_mb'] = split_size_mb 1334 1335 return client.call('bdev_split_create', params) 1336 1337 1338def bdev_split_delete(client, base_bdev): 1339 """Delete split block devices. 1340 1341 Args: 1342 base_bdev: name of previously split bdev 1343 """ 1344 params = { 1345 'base_bdev': base_bdev, 1346 } 1347 1348 return client.call('bdev_split_delete', params) 1349 1350 1351def bdev_ftl_create(client, name, base_bdev, **kwargs): 1352 """Construct FTL bdev 1353 1354 Args: 1355 name: name of the bdev 1356 base_bdev: name of the base bdev 1357 kwargs: optional parameters 1358 """ 1359 params = {'name': name, 1360 'base_bdev': base_bdev} 1361 for key, value in kwargs.items(): 1362 if value is not None: 1363 params[key] = value 1364 1365 return client.call('bdev_ftl_create', params) 1366 1367 1368def bdev_ftl_load(client, name, base_bdev, **kwargs): 1369 """Load FTL bdev 1370 1371 Args: 1372 name: name of the bdev 1373 base_bdev: name of the base bdev 1374 kwargs: optional parameters 1375 """ 1376 params = {'name': name, 1377 'base_bdev': base_bdev} 1378 for key, value in kwargs.items(): 1379 if value is not None: 1380 params[key] = value 1381 1382 return client.call('bdev_ftl_load', params) 1383 1384 1385def bdev_ftl_unload(client, name, fast_shutdown): 1386 """Unload FTL bdev 1387 1388 Args: 1389 name: name of the bdev 1390 """ 1391 params = {'name': name} 1392 1393 return client.call('bdev_ftl_unload', params) 1394 1395 1396def bdev_ftl_delete(client, name, fast_shutdown): 1397 """Delete FTL bdev 1398 1399 Args: 1400 name: name of the bdev 1401 """ 1402 params = {'name': name, 1403 'fast_shutdown': fast_shutdown} 1404 1405 return client.call('bdev_ftl_delete', params) 1406 1407 1408def bdev_ftl_unmap(client, name, lba, num_blocks): 1409 """FTL unmap 1410 1411 Args: 1412 name: name of the bdev 1413 lba: starting lba to be unmapped 1414 num_blocks: number of blocks to unmap 1415 """ 1416 params = {'name': name, 1417 'lba': lba, 1418 'num_blocks': num_blocks} 1419 1420 return client.call('bdev_ftl_unmap', params) 1421 1422 1423def bdev_ftl_get_stats(client, name): 1424 """get FTL stats 1425 1426 Args: 1427 name: name of the bdev 1428 """ 1429 params = {'name': name} 1430 1431 return client.call('bdev_ftl_get_stats', params) 1432 1433 1434def bdev_get_bdevs(client, name=None, timeout=None): 1435 """Get information about block devices. 1436 1437 Args: 1438 name: bdev name to query (optional; if omitted, query all bdevs) 1439 timeout: time in ms to wait for the bdev with specified name to appear 1440 1441 Returns: 1442 List of bdev information objects. 1443 """ 1444 params = {} 1445 if name: 1446 params['name'] = name 1447 if timeout: 1448 params['timeout'] = timeout 1449 return client.call('bdev_get_bdevs', params) 1450 1451 1452def bdev_get_iostat(client, name=None): 1453 """Get I/O statistics for block devices. 1454 1455 Args: 1456 name: bdev name to query (optional; if omitted, query all bdevs) 1457 1458 Returns: 1459 I/O statistics for the requested block devices. 1460 """ 1461 params = {} 1462 if name: 1463 params['name'] = name 1464 return client.call('bdev_get_iostat', params) 1465 1466 1467def bdev_enable_histogram(client, name, enable): 1468 """Control whether histogram is enabled for specified bdev. 1469 1470 Args: 1471 bdev_name: name of bdev 1472 """ 1473 params = {'name': name, "enable": enable} 1474 return client.call('bdev_enable_histogram', params) 1475 1476 1477def bdev_get_histogram(client, name): 1478 """Get histogram for specified bdev. 1479 1480 Args: 1481 bdev_name: name of bdev 1482 """ 1483 params = {'name': name} 1484 return client.call('bdev_get_histogram', params) 1485 1486 1487def bdev_error_inject_error(client, name, io_type, error_type, num=1): 1488 """Inject an error via an error bdev. 1489 1490 Args: 1491 name: name of error bdev 1492 io_type: one of "clear", "read", "write", "unmap", "flush", or "all" 1493 error_type: one of "failure" or "pending" 1494 num: number of commands to fail 1495 """ 1496 params = { 1497 'name': name, 1498 'io_type': io_type, 1499 'error_type': error_type, 1500 } 1501 1502 if num: 1503 params['num'] = num 1504 1505 return client.call('bdev_error_inject_error', params) 1506 1507 1508def bdev_set_qd_sampling_period(client, name, period): 1509 """Enable queue depth tracking on a specified bdev. 1510 1511 Args: 1512 name: name of a bdev on which to track queue depth. 1513 period: period (in microseconds) at which to update the queue depth reading. If set to 0, polling will be disabled. 1514 """ 1515 1516 params = {} 1517 params['name'] = name 1518 params['period'] = period 1519 return client.call('bdev_set_qd_sampling_period', params) 1520 1521 1522def bdev_set_qos_limit( 1523 client, 1524 name, 1525 rw_ios_per_sec=None, 1526 rw_mbytes_per_sec=None, 1527 r_mbytes_per_sec=None, 1528 w_mbytes_per_sec=None): 1529 """Set QoS rate limit on a block device. 1530 1531 Args: 1532 name: name of block device 1533 rw_ios_per_sec: R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited. 1534 rw_mbytes_per_sec: R/W megabytes per second limit (>=10, example: 100). 0 means unlimited. 1535 r_mbytes_per_sec: Read megabytes per second limit (>=10, example: 100). 0 means unlimited. 1536 w_mbytes_per_sec: Write megabytes per second limit (>=10, example: 100). 0 means unlimited. 1537 """ 1538 params = {} 1539 params['name'] = name 1540 if rw_ios_per_sec is not None: 1541 params['rw_ios_per_sec'] = rw_ios_per_sec 1542 if rw_mbytes_per_sec is not None: 1543 params['rw_mbytes_per_sec'] = rw_mbytes_per_sec 1544 if r_mbytes_per_sec is not None: 1545 params['r_mbytes_per_sec'] = r_mbytes_per_sec 1546 if w_mbytes_per_sec is not None: 1547 params['w_mbytes_per_sec'] = w_mbytes_per_sec 1548 return client.call('bdev_set_qos_limit', params) 1549 1550 1551def bdev_nvme_apply_firmware(client, bdev_name, filename): 1552 """Download and commit firmware to NVMe device. 1553 1554 Args: 1555 bdev_name: name of NVMe block device 1556 filename: filename of the firmware to download 1557 """ 1558 params = { 1559 'filename': filename, 1560 'bdev_name': bdev_name, 1561 } 1562 return client.call('bdev_nvme_apply_firmware', params) 1563 1564 1565def bdev_nvme_get_transport_statistics(client): 1566 """Get bdev_nvme poll group transport statistics""" 1567 return client.call('bdev_nvme_get_transport_statistics') 1568 1569 1570def bdev_nvme_get_controller_health_info(client, name): 1571 """Display health log of the required NVMe bdev controller. 1572 1573 Args: 1574 name: name of the required NVMe bdev controller 1575 1576 Returns: 1577 Health log for the requested NVMe bdev controller. 1578 """ 1579 params = {} 1580 params['name'] = name 1581 return client.call('bdev_nvme_get_controller_health_info', params) 1582 1583 1584def bdev_daos_create(client, num_blocks, block_size, pool, cont, name, uuid=None): 1585 """Construct DAOS block device. 1586 1587 Args: 1588 num_blocks: size of block device in blocks 1589 block_size: block size of device; must be a power of 2 and at least 512 1590 name: name of block device (also the name of the backend file on DAOS DFS) 1591 pool: UUID of DAOS pool 1592 cont: UUID of DAOS container 1593 uuid: UUID of block device (optional) 1594 1595 Returns: 1596 Name of created block device. 1597 """ 1598 params = {'num_blocks': num_blocks, 'block_size': block_size, 'pool': pool, 'cont': cont, 'name': name} 1599 if uuid: 1600 params['uuid'] = uuid 1601 return client.call('bdev_daos_create', params) 1602 1603 1604def bdev_daos_delete(client, name): 1605 """Delete DAOS block device. 1606 1607 Args: 1608 bdev_name: name of DAOS bdev to delete 1609 """ 1610 params = {'name': name} 1611 return client.call('bdev_daos_delete', params) 1612