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_cuse_register(client, name): 844 """Register CUSE devices on NVMe controller. 845 846 Args: 847 name: Name of the operating NVMe controller 848 """ 849 params = {'name': name} 850 851 return client.call('bdev_nvme_cuse_register', params) 852 853 854def bdev_nvme_cuse_unregister(client, name): 855 """Unregister CUSE devices on NVMe controller. 856 857 Args: 858 name: Name of the operating NVMe controller 859 """ 860 params = {'name': name} 861 862 return client.call('bdev_nvme_cuse_unregister', params) 863 864 865def bdev_zone_block_create(client, name, base_bdev, zone_capacity, optimal_open_zones): 866 """Creates a virtual zone device on top of existing non-zoned bdev. 867 868 Args: 869 name: Zone device name 870 base_bdev: Base Nvme bdev name 871 zone_capacity: Surfaced zone capacity in blocks 872 optimal_open_zones: Number of zones required to reach optimal write speed (optional, default: 1) 873 874 Returns: 875 Name of created block device. 876 """ 877 params = {'name': name, 878 'base_bdev': base_bdev, 879 'zone_capacity': zone_capacity, 880 'optimal_open_zones': optimal_open_zones} 881 882 return client.call('bdev_zone_block_create', params) 883 884 885def bdev_zone_block_delete(client, name): 886 """Remove block zone bdev from the system. 887 888 Args: 889 name: name of block zone bdev to delete 890 """ 891 params = {'name': name} 892 return client.call('bdev_zone_block_delete', params) 893 894 895def bdev_rbd_register_cluster(client, name, user=None, config_param=None, config_file=None, key_file=None): 896 """Create a Rados Cluster object of the Ceph RBD backend. 897 898 Args: 899 name: name of Rados Cluster 900 user: Ceph user name (optional) 901 config_param: map of config keys to values (optional) 902 config_file: file path of Ceph configuration file (optional) 903 key_file: file path of Ceph key file (optional) 904 905 Returns: 906 Name of registered Rados Cluster object. 907 """ 908 params = {'name': name} 909 910 if user is not None: 911 params['user_id'] = user 912 if config_param is not None: 913 params['config_param'] = config_param 914 if config_file is not None: 915 params['config_file'] = config_file 916 if key_file is not None: 917 params['key_file'] = key_file 918 919 return client.call('bdev_rbd_register_cluster', params) 920 921 922def bdev_rbd_unregister_cluster(client, name): 923 """Remove Rados cluster object from the system. 924 925 Args: 926 name: name of Rados cluster object to unregister 927 """ 928 params = {'name': name} 929 return client.call('bdev_rbd_unregister_cluster', params) 930 931 932def bdev_rbd_get_clusters_info(client, name): 933 """Get the cluster(s) info 934 935 Args: 936 name: name of Rados cluster object to query (optional; if omitted, query all clusters) 937 938 Returns: 939 List of registered Rados cluster information objects. 940 """ 941 params = {} 942 if name: 943 params['name'] = name 944 return client.call('bdev_rbd_get_clusters_info', params) 945 946 947@deprecated_alias('construct_rbd_bdev') 948def bdev_rbd_create(client, pool_name, rbd_name, block_size, name=None, user=None, config=None, cluster_name=None, uuid=None): 949 """Create a Ceph RBD block device. 950 951 Args: 952 pool_name: Ceph RBD pool name 953 rbd_name: Ceph RBD image name 954 block_size: block size of RBD volume 955 name: name of block device (optional) 956 user: Ceph user name (optional) 957 config: map of config keys to values (optional) 958 cluster_name: Name to identify Rados cluster (optional) 959 uuid: UUID of block device (optional) 960 961 Returns: 962 Name of created block device. 963 """ 964 params = { 965 'pool_name': pool_name, 966 'rbd_name': rbd_name, 967 'block_size': block_size, 968 } 969 970 if name: 971 params['name'] = name 972 if user is not None: 973 params['user_id'] = user 974 if config is not None: 975 params['config'] = config 976 if cluster_name is not None: 977 params['cluster_name'] = cluster_name 978 if uuid is not None: 979 params['uuid'] = uuid 980 981 return client.call('bdev_rbd_create', params) 982 983 984@deprecated_alias('delete_rbd_bdev') 985def bdev_rbd_delete(client, name): 986 """Remove rbd bdev from the system. 987 988 Args: 989 name: name of rbd bdev to delete 990 """ 991 params = {'name': name} 992 return client.call('bdev_rbd_delete', params) 993 994 995def bdev_rbd_resize(client, name, new_size): 996 """Resize rbd bdev in the system. 997 998 Args: 999 name: name of rbd bdev to resize 1000 new_size: new bdev size of resize operation. The unit is MiB 1001 """ 1002 params = { 1003 'name': name, 1004 'new_size': new_size, 1005 } 1006 return client.call('bdev_rbd_resize', params) 1007 1008 1009@deprecated_alias('construct_error_bdev') 1010def bdev_error_create(client, base_name): 1011 """Construct an error injection block device. 1012 1013 Args: 1014 base_name: base bdev name 1015 """ 1016 params = {'base_name': base_name} 1017 return client.call('bdev_error_create', params) 1018 1019 1020def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency): 1021 """Construct a delay block device. 1022 1023 Args: 1024 base_bdev_name: name of the existing bdev 1025 name: name of block device 1026 avg_read_latency: complete 99% of read ops with this delay 1027 p99_read_latency: complete 1% of read ops with this delay 1028 avg_write_latency: complete 99% of write ops with this delay 1029 p99_write_latency: complete 1% of write ops with this delay 1030 1031 Returns: 1032 Name of created block device. 1033 """ 1034 params = { 1035 'base_bdev_name': base_bdev_name, 1036 'name': name, 1037 'avg_read_latency': avg_read_latency, 1038 'p99_read_latency': p99_read_latency, 1039 'avg_write_latency': avg_write_latency, 1040 'p99_write_latency': p99_write_latency, 1041 } 1042 return client.call('bdev_delay_create', params) 1043 1044 1045def bdev_delay_delete(client, name): 1046 """Remove delay bdev from the system. 1047 1048 Args: 1049 name: name of delay bdev to delete 1050 """ 1051 params = {'name': name} 1052 return client.call('bdev_delay_delete', params) 1053 1054 1055def bdev_delay_update_latency(client, delay_bdev_name, latency_type, latency_us): 1056 """Update the latency value for a delay block device 1057 1058 Args: 1059 delay_bdev_name: name of the delay bdev 1060 latency_type: 'one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.' 1061 latency_us: 'new latency value.' 1062 1063 Returns: 1064 True if successful, or a specific error otherwise. 1065 """ 1066 params = { 1067 'delay_bdev_name': delay_bdev_name, 1068 'latency_type': latency_type, 1069 'latency_us': latency_us, 1070 } 1071 return client.call('bdev_delay_update_latency', params) 1072 1073 1074@deprecated_alias('delete_error_bdev') 1075def bdev_error_delete(client, name): 1076 """Remove error bdev from the system. 1077 1078 Args: 1079 bdev_name: name of error bdev to delete 1080 """ 1081 params = {'name': name} 1082 return client.call('bdev_error_delete', params) 1083 1084 1085@deprecated_alias('construct_iscsi_bdev') 1086def bdev_iscsi_create(client, name, url, initiator_iqn): 1087 """Construct an iSCSI block device. 1088 1089 Args: 1090 name: name of block device 1091 url: iSCSI URL 1092 initiator_iqn: IQN name to be used by initiator 1093 1094 Returns: 1095 Name of created block device. 1096 """ 1097 params = { 1098 'name': name, 1099 'url': url, 1100 'initiator_iqn': initiator_iqn, 1101 } 1102 return client.call('bdev_iscsi_create', params) 1103 1104 1105@deprecated_alias('delete_iscsi_bdev') 1106def bdev_iscsi_delete(client, name): 1107 """Remove iSCSI bdev from the system. 1108 1109 Args: 1110 bdev_name: name of iSCSI bdev to delete 1111 """ 1112 params = {'name': name} 1113 return client.call('bdev_iscsi_delete', params) 1114 1115 1116@deprecated_alias('construct_pmem_bdev') 1117def bdev_pmem_create(client, pmem_file, name): 1118 """Construct a libpmemblk block device. 1119 1120 Args: 1121 pmem_file: path to pmemblk pool file 1122 name: name of block device 1123 1124 Returns: 1125 Name of created block device. 1126 """ 1127 params = { 1128 'pmem_file': pmem_file, 1129 'name': name 1130 } 1131 return client.call('bdev_pmem_create', params) 1132 1133 1134@deprecated_alias('delete_pmem_bdev') 1135def bdev_pmem_delete(client, name): 1136 """Remove pmem bdev from the system. 1137 1138 Args: 1139 name: name of pmem bdev to delete 1140 """ 1141 params = {'name': name} 1142 return client.call('bdev_pmem_delete', params) 1143 1144 1145@deprecated_alias('construct_passthru_bdev') 1146def bdev_passthru_create(client, base_bdev_name, name): 1147 """Construct a pass-through block device. 1148 1149 Args: 1150 base_bdev_name: name of the existing bdev 1151 name: name of block device 1152 1153 Returns: 1154 Name of created block device. 1155 """ 1156 params = { 1157 'base_bdev_name': base_bdev_name, 1158 'name': name, 1159 } 1160 return client.call('bdev_passthru_create', params) 1161 1162 1163@deprecated_alias('delete_passthru_bdev') 1164def bdev_passthru_delete(client, name): 1165 """Remove pass through bdev from the system. 1166 1167 Args: 1168 name: name of pass through bdev to delete 1169 """ 1170 params = {'name': name} 1171 return client.call('bdev_passthru_delete', params) 1172 1173 1174def bdev_opal_create(client, nvme_ctrlr_name, nsid, locking_range_id, range_start, range_length, password): 1175 """Create opal virtual block devices from a base nvme bdev. 1176 1177 Args: 1178 nvme_ctrlr_name: name of the nvme ctrlr 1179 nsid: namespace ID of nvme ctrlr 1180 locking_range_id: locking range ID corresponding to this virtual bdev 1181 range_start: start address of this locking range 1182 range_length: length of this locking range 1183 password: admin password of base nvme bdev 1184 1185 Returns: 1186 Name of the new created block devices. 1187 """ 1188 params = { 1189 'nvme_ctrlr_name': nvme_ctrlr_name, 1190 'nsid': nsid, 1191 'locking_range_id': locking_range_id, 1192 'range_start': range_start, 1193 'range_length': range_length, 1194 'password': password, 1195 } 1196 1197 return client.call('bdev_opal_create', params) 1198 1199 1200def bdev_opal_get_info(client, bdev_name, password): 1201 """Get opal locking range info. 1202 1203 Args: 1204 bdev_name: name of opal vbdev to get info 1205 password: admin password 1206 1207 Returns: 1208 Locking range info. 1209 """ 1210 params = { 1211 'bdev_name': bdev_name, 1212 'password': password, 1213 } 1214 1215 return client.call('bdev_opal_get_info', params) 1216 1217 1218def bdev_opal_delete(client, bdev_name, password): 1219 """Delete opal virtual bdev from the system. 1220 1221 Args: 1222 bdev_name: name of opal vbdev to delete 1223 password: admin password of base nvme bdev 1224 """ 1225 params = { 1226 'bdev_name': bdev_name, 1227 'password': password, 1228 } 1229 1230 return client.call('bdev_opal_delete', params) 1231 1232 1233def bdev_opal_new_user(client, bdev_name, admin_password, user_id, user_password): 1234 """Add a user to opal bdev who can set lock state for this bdev. 1235 1236 Args: 1237 bdev_name: name of opal vbdev 1238 admin_password: admin password 1239 user_id: ID of the user who will be added to this opal bdev 1240 user_password: password set for this user 1241 """ 1242 params = { 1243 'bdev_name': bdev_name, 1244 'admin_password': admin_password, 1245 'user_id': user_id, 1246 'user_password': user_password, 1247 } 1248 1249 return client.call('bdev_opal_new_user', params) 1250 1251 1252def bdev_opal_set_lock_state(client, bdev_name, user_id, password, lock_state): 1253 """set lock state for an opal bdev. 1254 1255 Args: 1256 bdev_name: name of opal vbdev 1257 user_id: ID of the user who will set lock state 1258 password: password of the user 1259 lock_state: lock state to set 1260 """ 1261 params = { 1262 'bdev_name': bdev_name, 1263 'user_id': user_id, 1264 'password': password, 1265 'lock_state': lock_state, 1266 } 1267 1268 return client.call('bdev_opal_set_lock_state', params) 1269 1270 1271@deprecated_alias('construct_split_vbdev') 1272def bdev_split_create(client, base_bdev, split_count, split_size_mb=None): 1273 """Create split block devices from a base bdev. 1274 1275 Args: 1276 base_bdev: name of bdev to split 1277 split_count: number of split bdevs to create 1278 split_size_mb: size of each split volume in MiB (optional) 1279 1280 Returns: 1281 List of created block devices. 1282 """ 1283 params = { 1284 'base_bdev': base_bdev, 1285 'split_count': split_count, 1286 } 1287 if split_size_mb: 1288 params['split_size_mb'] = split_size_mb 1289 1290 return client.call('bdev_split_create', params) 1291 1292 1293@deprecated_alias('destruct_split_vbdev') 1294def bdev_split_delete(client, base_bdev): 1295 """Delete split block devices. 1296 1297 Args: 1298 base_bdev: name of previously split bdev 1299 """ 1300 params = { 1301 'base_bdev': base_bdev, 1302 } 1303 1304 return client.call('bdev_split_delete', params) 1305 1306 1307@deprecated_alias('construct_ftl_bdev') 1308def bdev_ftl_create(client, name, base_bdev, **kwargs): 1309 """Construct FTL bdev 1310 1311 Args: 1312 name: name of the bdev 1313 base_bdev: name of the base bdev 1314 kwargs: optional parameters 1315 """ 1316 params = {'name': name, 1317 'base_bdev': base_bdev} 1318 for key, value in kwargs.items(): 1319 if value is not None: 1320 params[key] = value 1321 1322 return client.call('bdev_ftl_create', params) 1323 1324 1325@deprecated_alias('delete_ftl_bdev') 1326def bdev_ftl_delete(client, name): 1327 """Delete FTL bdev 1328 1329 Args: 1330 name: name of the bdev 1331 """ 1332 params = {'name': name} 1333 1334 return client.call('bdev_ftl_delete', params) 1335 1336 1337@deprecated_alias('get_bdevs') 1338def bdev_get_bdevs(client, name=None, timeout=None): 1339 """Get information about block devices. 1340 1341 Args: 1342 name: bdev name to query (optional; if omitted, query all bdevs) 1343 timeout: time in ms to wait for the bdev with specified name to appear 1344 1345 Returns: 1346 List of bdev information objects. 1347 """ 1348 params = {} 1349 if name: 1350 params['name'] = name 1351 if timeout: 1352 params['timeout'] = timeout 1353 return client.call('bdev_get_bdevs', params) 1354 1355 1356@deprecated_alias('get_bdevs_iostat') 1357def bdev_get_iostat(client, name=None): 1358 """Get I/O statistics for block devices. 1359 1360 Args: 1361 name: bdev name to query (optional; if omitted, query all bdevs) 1362 1363 Returns: 1364 I/O statistics for the requested block devices. 1365 """ 1366 params = {} 1367 if name: 1368 params['name'] = name 1369 return client.call('bdev_get_iostat', params) 1370 1371 1372@deprecated_alias('enable_bdev_histogram') 1373def bdev_enable_histogram(client, name, enable): 1374 """Control whether histogram is enabled for specified bdev. 1375 1376 Args: 1377 bdev_name: name of bdev 1378 """ 1379 params = {'name': name, "enable": enable} 1380 return client.call('bdev_enable_histogram', params) 1381 1382 1383@deprecated_alias('get_bdev_histogram') 1384def bdev_get_histogram(client, name): 1385 """Get histogram for specified bdev. 1386 1387 Args: 1388 bdev_name: name of bdev 1389 """ 1390 params = {'name': name} 1391 return client.call('bdev_get_histogram', params) 1392 1393 1394@deprecated_alias('bdev_inject_error') 1395def bdev_error_inject_error(client, name, io_type, error_type, num=1): 1396 """Inject an error via an error bdev. 1397 1398 Args: 1399 name: name of error bdev 1400 io_type: one of "clear", "read", "write", "unmap", "flush", or "all" 1401 error_type: one of "failure" or "pending" 1402 num: number of commands to fail 1403 """ 1404 params = { 1405 'name': name, 1406 'io_type': io_type, 1407 'error_type': error_type, 1408 'num': num, 1409 } 1410 1411 return client.call('bdev_error_inject_error', params) 1412 1413 1414@deprecated_alias('set_bdev_qd_sampling_period') 1415def bdev_set_qd_sampling_period(client, name, period): 1416 """Enable queue depth tracking on a specified bdev. 1417 1418 Args: 1419 name: name of a bdev on which to track queue depth. 1420 period: period (in microseconds) at which to update the queue depth reading. If set to 0, polling will be disabled. 1421 """ 1422 1423 params = {} 1424 params['name'] = name 1425 params['period'] = period 1426 return client.call('bdev_set_qd_sampling_period', params) 1427 1428 1429@deprecated_alias('set_bdev_qos_limit') 1430def bdev_set_qos_limit( 1431 client, 1432 name, 1433 rw_ios_per_sec=None, 1434 rw_mbytes_per_sec=None, 1435 r_mbytes_per_sec=None, 1436 w_mbytes_per_sec=None): 1437 """Set QoS rate limit on a block device. 1438 1439 Args: 1440 name: name of block device 1441 rw_ios_per_sec: R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited. 1442 rw_mbytes_per_sec: R/W megabytes per second limit (>=10, example: 100). 0 means unlimited. 1443 r_mbytes_per_sec: Read megabytes per second limit (>=10, example: 100). 0 means unlimited. 1444 w_mbytes_per_sec: Write megabytes per second limit (>=10, example: 100). 0 means unlimited. 1445 """ 1446 params = {} 1447 params['name'] = name 1448 if rw_ios_per_sec is not None: 1449 params['rw_ios_per_sec'] = rw_ios_per_sec 1450 if rw_mbytes_per_sec is not None: 1451 params['rw_mbytes_per_sec'] = rw_mbytes_per_sec 1452 if r_mbytes_per_sec is not None: 1453 params['r_mbytes_per_sec'] = r_mbytes_per_sec 1454 if w_mbytes_per_sec is not None: 1455 params['w_mbytes_per_sec'] = w_mbytes_per_sec 1456 return client.call('bdev_set_qos_limit', params) 1457 1458 1459@deprecated_alias('apply_firmware') 1460def bdev_nvme_apply_firmware(client, bdev_name, filename): 1461 """Download and commit firmware to NVMe device. 1462 1463 Args: 1464 bdev_name: name of NVMe block device 1465 filename: filename of the firmware to download 1466 """ 1467 params = { 1468 'filename': filename, 1469 'bdev_name': bdev_name, 1470 } 1471 return client.call('bdev_nvme_apply_firmware', params) 1472 1473 1474def bdev_nvme_get_transport_statistics(client): 1475 """Get bdev_nvme poll group transport statistics""" 1476 return client.call('bdev_nvme_get_transport_statistics') 1477 1478 1479def bdev_nvme_get_controller_health_info(client, name): 1480 """Display health log of the required NVMe bdev controller. 1481 1482 Args: 1483 name: name of the required NVMe bdev controller 1484 1485 Returns: 1486 Health log for the requested NVMe bdev controller. 1487 """ 1488 params = {} 1489 params['name'] = name 1490 return client.call('bdev_nvme_get_controller_health_info', params) 1491