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