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