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