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