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