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