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