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