sbcli-pre 25.6.2__tar.gz → 25.6.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/PKG-INFO +1 -1
  2. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/sbcli_pre.egg-info/PKG-INFO +1 -1
  3. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/cluster_ops.py +7 -58
  4. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/constants.py +1 -1
  5. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/device_controller.py +8 -4
  6. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/lvol_controller.py +12 -0
  7. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/tasks_controller.py +3 -3
  8. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/distr_controller.py +1 -1
  9. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/env_var +1 -1
  10. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/mgmt_node_ops.py +3 -0
  11. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/cluster.py +1 -0
  12. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/storage_node.py +6 -3
  13. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/rpc_client.py +8 -3
  14. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/tasks_runner_port_allow.py +19 -4
  15. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/storage_node_ops.py +4 -3
  16. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/utils.py +57 -2
  17. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/snode_ops.py +2 -1
  18. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/README.md +0 -0
  19. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/pyproject.toml +0 -0
  20. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/requirements.txt +0 -0
  21. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/sbcli_pre.egg-info/SOURCES.txt +0 -0
  22. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/sbcli_pre.egg-info/dependency_links.txt +0 -0
  23. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/sbcli_pre.egg-info/entry_points.txt +0 -0
  24. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/sbcli_pre.egg-info/requires.txt +0 -0
  25. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/sbcli_pre.egg-info/top_level.txt +0 -0
  26. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/setup.cfg +0 -0
  27. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/setup.py +0 -0
  28. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_cli/__init__.py +0 -0
  29. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_cli/cli.py +0 -0
  30. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_cli/clibase.py +0 -0
  31. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_cli/main.py +0 -0
  32. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/__init__.py +0 -0
  33. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/cnode_client.py +0 -0
  34. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/__init__.py +0 -0
  35. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  36. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/cluster_events.py +0 -0
  37. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/device_events.py +0 -0
  38. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/events_controller.py +0 -0
  39. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/health_controller.py +0 -0
  40. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/lvol_events.py +0 -0
  41. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/mgmt_events.py +0 -0
  42. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/pool_controller.py +0 -0
  43. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/pool_events.py +0 -0
  44. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  45. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/snapshot_events.py +0 -0
  46. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/storage_events.py +0 -0
  47. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/tasks_events.py +0 -0
  48. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
  49. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/db_controller.py +0 -0
  50. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/__init__.py +0 -0
  51. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/base_model.py +0 -0
  52. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/caching_node.py +0 -0
  53. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/deployer.py +0 -0
  54. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/events.py +0 -0
  55. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/hublvol.py +0 -0
  56. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/iface.py +0 -0
  57. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/job_schedule.py +0 -0
  58. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/lvol_model.py +0 -0
  59. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/mgmt_node.py +0 -0
  60. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/nvme_device.py +0 -0
  61. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/pool.py +0 -0
  62. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/port_stat.py +0 -0
  63. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/snapshot.py +0 -0
  64. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/models/stats.py +0 -0
  65. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/pci_utils.py +0 -0
  66. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/__init__.py +0 -0
  67. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  68. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  69. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  70. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/config_docker.sh +0 -0
  71. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/dashboard.yml +0 -0
  72. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  73. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  74. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  75. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  76. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  77. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  78. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/datasource.yml +0 -0
  79. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/db_config_double.sh +0 -0
  80. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/db_config_single.sh +0 -0
  81. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
  82. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  83. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  84. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  85. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/foundation.yml +0 -0
  86. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/haproxy.cfg +0 -0
  87. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/helpers/__init__.py +0 -0
  88. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/helpers/deploy_cluster.sh +0 -0
  89. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/helpers/destroy_cluster.sh +0 -0
  90. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/helpers/nvme_disconnect_by_ip.py +0 -0
  91. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/install_deps.sh +0 -0
  92. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/objstore.yml +0 -0
  93. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
  94. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/prometheus.yml.j2 +0 -0
  95. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/run_ssh.sh +0 -0
  96. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/set_db_config.sh +0 -0
  97. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  98. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/__init__.py +0 -0
  99. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  100. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/caching_node_monitor.py +0 -0
  101. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/cap_monitor.py +0 -0
  102. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  103. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/device_monitor.py +0 -0
  104. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/health_check_service.py +0 -0
  105. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/install_service.sh +0 -0
  106. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/lvol_monitor.py +0 -0
  107. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  108. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  109. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  110. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/new_device_discovery.py +0 -0
  111. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/remove_service.sh +0 -0
  112. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/service_template.service +0 -0
  113. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/spdk/__init__.py +0 -0
  114. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/spdk/client.py +0 -0
  115. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
  116. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/storage_node_monitor.py +0 -0
  117. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/tasks_cluster_status.py +0 -0
  118. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  119. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  120. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  121. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  122. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  123. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/shell_utils.py +0 -0
  124. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/snode_client.py +0 -0
  125. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/test/test_models.py +0 -0
  126. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/test/test_utils.py +0 -0
  127. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
  128. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/README.md +0 -0
  129. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/__init__.py +0 -0
  130. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/app.py +0 -0
  131. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/auth_middleware.py +0 -0
  132. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/__init__.py +0 -0
  133. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  134. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  135. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  136. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  137. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  138. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  139. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
  140. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  141. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  142. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  143. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_device.py +0 -0
  144. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  145. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_metrics.py +0 -0
  146. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  147. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  148. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  149. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  150. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/node_configure.py +0 -0
  151. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/node_utils.py +0 -0
  152. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/node_utils_k8s.py +0 -0
  153. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/node_webapp.py +0 -0
  154. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
  155. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/delete.py +0 -0
  156. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/deploy.py +0 -0
  157. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  158. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  159. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/is_up.py +0 -0
  160. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/list_deps.py +0 -0
  161. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/rpac.yaml +0 -0
  162. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/swagger.yaml +0 -0
  163. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/static/tst.py +0 -0
  164. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  165. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  166. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/test/api/test_lvol.py +0 -0
  167. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/test/api/test_pool.py +0 -0
  168. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/test/api/test_snapshot.py +0 -0
  169. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/test/api/test_storage_node.py +0 -0
  170. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/test/conftest.py +0 -0
  171. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/test/pytest.ini +0 -0
  172. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/test/requirements.txt +0 -0
  173. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/test/util.py +0 -0
  174. {sbcli-pre-25.6.2 → sbcli-pre-25.6.4}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-pre
3
- Version: 25.6.2
3
+ Version: 25.6.4
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-pre
3
- Version: 25.6.2
3
+ Version: 25.6.4
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -3,8 +3,6 @@ import datetime
3
3
  import json
4
4
  import os
5
5
  import socket
6
- import re
7
- import tempfile
8
6
  import subprocess
9
7
  import time
10
8
  import uuid
@@ -13,7 +11,6 @@ import typing as t
13
11
 
14
12
  import docker
15
13
  import requests
16
- from jinja2 import Environment, FileSystemLoader
17
14
 
18
15
  from simplyblock_core import utils, scripts, constants, mgmt_node_ops, storage_node_ops
19
16
  from simplyblock_core.controllers import cluster_events, device_controller, pool_controller, \
@@ -30,7 +27,6 @@ from simplyblock_core.models.storage_node import StorageNode
30
27
  from simplyblock_core.utils import pull_docker_image_with_retry
31
28
 
32
29
  logger = utils.get_logger(__name__)
33
- TOP_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
34
30
 
35
31
  db_controller = DBController()
36
32
 
@@ -216,56 +212,9 @@ def create_cluster(blk_size, page_size_in_blocks, cli_pass,
216
212
  c.inflight_io_threshold = inflight_io_threshold
217
213
  c.enable_qos = enable_qos
218
214
  c.strict_node_anti_affinity = strict_node_anti_affinity
215
+ c.contact_point = contact_point
219
216
 
220
- alerts_template_folder = os.path.join(TOP_DIR, "simplyblock_core/scripts/alerting/")
221
- alert_resources_file = "alert_resources.yaml"
222
-
223
- env = Environment(loader=FileSystemLoader(alerts_template_folder), trim_blocks=True, lstrip_blocks=True)
224
- template = env.get_template(f'{alert_resources_file}.j2')
225
-
226
- slack_pattern = re.compile(r"https://hooks\.slack\.com/services/\S+")
227
- email_pattern = re.compile(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")
228
-
229
- if slack_pattern.match(contact_point):
230
- ALERT_TYPE = "slack"
231
- elif email_pattern.match(contact_point):
232
- ALERT_TYPE = "email"
233
- else:
234
- ALERT_TYPE = "slack"
235
- contact_point = 'https://hooks.slack.com/services/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'
236
-
237
- values = {
238
- 'CONTACT_POINT': contact_point,
239
- 'GRAFANA_ENDPOINT': c.grafana_endpoint,
240
- 'ALERT_TYPE': ALERT_TYPE,
241
- }
242
-
243
- with tempfile.TemporaryDirectory() as temp_dir:
244
- temp_file_path = os.path.join(temp_dir, alert_resources_file)
245
- with open(temp_file_path, 'w') as file:
246
- file.write(template.render(values))
247
-
248
- destination_file_path = os.path.join(alerts_template_folder, alert_resources_file)
249
- subprocess.check_call(['sudo', '-v']) # sudo -v checks if the current user has sudo permissions
250
- subprocess.check_call(['sudo', 'mv', temp_file_path, destination_file_path])
251
- print(f"File moved to {destination_file_path} successfully.")
252
-
253
- scripts_folder = os.path.join(TOP_DIR, "simplyblock_core/scripts/")
254
- prometheus_file = "prometheus.yml"
255
- env = Environment(loader=FileSystemLoader(scripts_folder), trim_blocks=True, lstrip_blocks=True)
256
- template = env.get_template(f'{prometheus_file}.j2')
257
- values = {
258
- 'CLUSTER_ID': c.uuid,
259
- 'CLUSTER_SECRET': c.secret}
260
-
261
- with tempfile.TemporaryDirectory() as temp_dir:
262
- file_path = os.path.join(temp_dir, prometheus_file)
263
- with open(file_path, 'w') as file:
264
- file.write(template.render(values))
265
-
266
- prometheus_file_path = os.path.join(scripts_folder, prometheus_file)
267
- subprocess.check_call(['sudo', 'mv', file_path, prometheus_file_path])
268
- print(f"File moved to {prometheus_file_path} successfully.")
217
+ utils.render_and_deploy_alerting_configs(contact_point, c.grafana_endpoint, c.uuid, c.secret)
269
218
 
270
219
  logger.info("Deploying swarm stack ...")
271
220
  log_level = "DEBUG" if constants.LOG_WEB_DEBUG else "INFO"
@@ -1194,11 +1143,11 @@ def update_cluster(cluster_id, mgmt_only=False, restart=False, spdk_image=None,
1194
1143
  service_image = constants.SIMPLY_BLOCK_DOCKER_IMAGE
1195
1144
  if mgmt_image:
1196
1145
  service_image = mgmt_image
1197
- for service in cluster_docker.services.list():
1198
- if image_parts in service.attrs['Spec']['Labels']['com.docker.stack.image'] or \
1199
- "simplyblock" in service.attrs['Spec']['Labels']['com.docker.stack.image']:
1200
- logger.info(f"Updating service {service.name}")
1201
- service.update(image=service_image, force_update=True)
1146
+ for service in cluster_docker.services.list():
1147
+ if image_parts in service.attrs['Spec']['Labels']['com.docker.stack.image'] or \
1148
+ "simplyblock" in service.attrs['Spec']['Labels']['com.docker.stack.image']:
1149
+ logger.info(f"Updating service {service.name}")
1150
+ service.update(image=service_image, force_update=True)
1202
1151
  logger.info("Done updating mgmt cluster")
1203
1152
 
1204
1153
  if mgmt_only:
@@ -125,7 +125,7 @@ MAX_SNAP_COUNT = 100
125
125
  SPDK_PROXY_MULTI_THREADING_ENABLED=True
126
126
  SPDK_PROXY_TIMEOUT=60*5
127
127
  LVOL_NVME_CONNECT_RECONNECT_DELAY=2
128
- LVOL_NVME_CONNECT_CTRL_LOSS_TMO=60
128
+ LVOL_NVME_CONNECT_CTRL_LOSS_TMO=60*60
129
129
  LVOL_NVME_CONNECT_NR_IO_QUEUES=6
130
130
  LVOL_NVME_KEEP_ALIVE_TO=5
131
131
  LVOL_NVMF_PORT_START=9100
@@ -903,13 +903,15 @@ def restart_jm_device(device_id, force=False, format_alceml=False):
903
903
 
904
904
  if not ret:
905
905
  logger.error(f"Failed to create alceml bdev: {jm_device.alceml_bdev}")
906
- return False
906
+ if not force:
907
+ return False
907
908
 
908
909
  jm_bdev = f"jm_{snode.get_id()}"
909
910
  ret = rpc_client.bdev_jm_create(jm_bdev, jm_device.alceml_bdev, jm_cpu_mask=snode.jm_cpu_mask)
910
911
  if not ret:
911
912
  logger.error(f"Failed to create {jm_bdev}")
912
- return False
913
+ if not force:
914
+ return False
913
915
 
914
916
  if snode.enable_ha_jm:
915
917
  # add pass through
@@ -917,7 +919,8 @@ def restart_jm_device(device_id, force=False, format_alceml=False):
917
919
  ret = rpc_client.bdev_PT_NoExcl_create(pt_name, jm_bdev)
918
920
  if not ret:
919
921
  logger.error(f"Failed to create pt noexcl bdev: {pt_name}")
920
- return False
922
+ if not force:
923
+ return False
921
924
 
922
925
  subsystem_nqn = snode.subsystem + ":dev:" + jm_bdev
923
926
  logger.info("creating subsystem %s", subsystem_nqn)
@@ -936,7 +939,8 @@ def restart_jm_device(device_id, force=False, format_alceml=False):
936
939
  ret = rpc_client.nvmf_subsystem_add_ns(subsystem_nqn, pt_name)
937
940
  if not ret:
938
941
  logger.error(f"Failed to add: {pt_name} to the subsystem: {subsystem_nqn}")
939
- return False
942
+ if not force:
943
+ return False
940
944
 
941
945
  set_jm_device_state(snode.jm_device.get_id(), JMDevice.STATUS_ONLINE)
942
946
 
@@ -932,6 +932,17 @@ def delete_lvol(id_or_name, force_delete=False):
932
932
  logger.error(msg)
933
933
  return False, msg
934
934
 
935
+ # 1- delete subsystem from secondary
936
+ if secondary_node:
937
+ secondary_node = db_controller.get_storage_node_by_id(secondary_node.get_id())
938
+ if secondary_node.status == StorageNode.STATUS_ONLINE:
939
+ logger.info(f"Deleting subsystem for lvol:{lvol.get_id()} from node:{secondary_node.get_id()}")
940
+ secondary_rpc_client = secondary_node.rpc_client()
941
+ ret = secondary_rpc_client.subsystem_delete(lvol.nqn)
942
+ if not ret:
943
+ logger.warning(f"Failed to delete subsystem from node: {secondary_node.get_id()}")
944
+
945
+ # 2- delete subsystem and lvol bdev from primary
935
946
  if primary_node:
936
947
 
937
948
  ret = delete_lvol_from_node(lvol.get_id(), primary_node.get_id())
@@ -940,6 +951,7 @@ def delete_lvol(id_or_name, force_delete=False):
940
951
  if not force_delete:
941
952
  return False
942
953
 
954
+ # 3- delete lvol bdev from secondary
943
955
  if secondary_node:
944
956
  secondary_node = db_controller.get_storage_node_by_id(secondary_node.get_id())
945
957
  if secondary_node.status == StorageNode.STATUS_ONLINE:
@@ -96,11 +96,11 @@ def add_device_to_auto_restart(device):
96
96
 
97
97
  def add_node_to_auto_restart(node):
98
98
  cluster = db.get_cluster_by_id(node.cluster_id)
99
- if cluster.status != Cluster.STATUS_ACTIVE:
100
- logger.info("Cluster is not active, skip node auto restart")
99
+ if cluster.status not in [Cluster.STATUS_ACTIVE, Cluster.STATUS_DEGRADED, Cluster.STATUS_READONLY]:
100
+ logger.warning(f"Cluster is not active, skip node auto restart, status: {cluster.status}")
101
101
  return False
102
102
  for sn in db.get_storage_nodes_by_cluster_id(node.cluster_id):
103
- if node.get_id() != sn.get_id() and sn.status != StorageNode.STATUS_ONLINE:
103
+ if node.get_id() != sn.get_id() and sn.status != StorageNode.STATUS_ONLINE and node.mgmt_ip != sn.mgmt_ip:
104
104
  logger.info("Node found that is not online, skip node auto restart")
105
105
  return False
106
106
  return _add_task(JobSchedule.FN_NODE_RESTART, node.cluster_id, node.get_id(), "")
@@ -49,7 +49,7 @@ def send_dev_status_event(device, status, target_node=None):
49
49
  else:
50
50
  snodes = db_controller.get_storage_nodes_by_cluster_id(device.cluster_id)
51
51
  for node in snodes:
52
- if node.status not in [StorageNode.STATUS_ONLINE, StorageNode.STATUS_SUSPENDED]:
52
+ if node.status not in [StorageNode.STATUS_ONLINE, StorageNode.STATUS_SUSPENDED, StorageNode.STATUS_DOWN]:
53
53
  continue
54
54
 
55
55
  dev_status = status
@@ -1,5 +1,5 @@
1
1
  SIMPLY_BLOCK_COMMAND_NAME=sbcli-pre
2
- SIMPLY_BLOCK_VERSION=25.6.2
2
+ SIMPLY_BLOCK_VERSION=25.6.4
3
3
 
4
4
 
5
5
  SIMPLY_BLOCK_DOCKER_IMAGE=simplyblock/simplyblock:R25.6-PRE
@@ -60,6 +60,9 @@ def deploy_mgmt_node(cluster_ip, cluster_id, ifname, cluster_secret):
60
60
  logger.error("Node already exists in the cluster")
61
61
  return False
62
62
 
63
+ utils.render_and_deploy_alerting_configs(cluster_data['contact_point'], cluster_data['grafana_endpoint'],
64
+ cluster_data['uuid'], cluster_data['secret'])
65
+
63
66
  logger.info("Joining docker swarm...")
64
67
  try:
65
68
  cluster_docker = utils.get_docker_client(cluster_id)
@@ -47,6 +47,7 @@ class Cluster(BaseModel):
47
47
  enable_qos: bool = False
48
48
  grafana_endpoint: str = ""
49
49
  grafana_secret: str = ""
50
+ contact_point: str = ""
50
51
  ha_type: str = "single"
51
52
  inflight_io_threshold: int = 4
52
53
  iscsi: str = ""
@@ -236,12 +236,15 @@ class StorageNode(BaseNodeObject):
236
236
  remote_bdev = f"{primary_node.hublvol.bdev_name}n1"
237
237
 
238
238
  if not rpc_client.get_bdevs(remote_bdev):
239
-
239
+ ip_lst = []
240
240
  for ip in (iface.ip4_address for iface in primary_node.data_nics):
241
+ ip_lst.append(ip)
242
+ multipath = bool(len(ip_lst) > 1)
243
+ for ip in ip_lst:
241
244
  ret = rpc_client.bdev_nvme_attach_controller_tcp(
242
245
  primary_node.hublvol.bdev_name, primary_node.hublvol.nqn,
243
- ip, primary_node.hublvol.nvmf_port)
244
- if not ret:
246
+ ip, primary_node.hublvol.nvmf_port, multipath=multipath)
247
+ if not ret and not multipath:
245
248
  logger.warning(f'Failed to connect to hublvol on {ip}')
246
249
 
247
250
  if not rpc_client.bdev_lvol_set_lvs_opts(
@@ -151,7 +151,8 @@ class RPCClient:
151
151
  "buf_cache_size": 512,
152
152
  "dif_insert_or_strip": False,
153
153
  "c2h_success": True,
154
- "sock_priority": 0
154
+ "sock_priority": 0,
155
+ "ack_timeout": 4096,
155
156
  }
156
157
  return self._request("nvmf_create_transport", params)
157
158
 
@@ -571,7 +572,10 @@ class RPCClient:
571
572
  "trsvcid": str(port),
572
573
  "subnqn": nqn,
573
574
  "fabrics_connect_timeout_us": 100000,
574
- "num_io_queues": 128
575
+ "num_io_queues": 128,
576
+ "fast_io_fail_timeout_sec": 2,
577
+ "ctrlr_loss_timeout_sec": 10,
578
+ "reconnect_delay_sec": 2,
575
579
  }
576
580
  if multipath:
577
581
  params["multipath"] = "failover"
@@ -639,7 +643,8 @@ class RPCClient:
639
643
  "fast_io_fail_timeout_sec" : 0,
640
644
  "reconnect_delay_sec": 1,
641
645
  "keep_alive_timeout_ms": 10000,
642
- "timeout_us": constants.NVME_TIMEOUT_US
646
+ "timeout_us": constants.NVME_TIMEOUT_US,
647
+ "transport_ack_timeout": 13,
643
648
  }
644
649
  return self._request("bdev_nvme_set_options", params)
645
650
 
@@ -2,8 +2,8 @@
2
2
  import time
3
3
 
4
4
 
5
- from simplyblock_core import db_controller, utils
6
- from simplyblock_core.controllers import tasks_events, tcp_ports_events
5
+ from simplyblock_core import db_controller, utils, storage_node_ops, distr_controller
6
+ from simplyblock_core.controllers import tasks_events, tcp_ports_events, health_controller
7
7
  from simplyblock_core.models.job_schedule import JobSchedule
8
8
  from simplyblock_core.models.cluster import Cluster
9
9
  from simplyblock_core.models.storage_node import StorageNode
@@ -57,8 +57,23 @@ while True:
57
57
  task.write_to_db(db.kv_store)
58
58
  continue
59
59
 
60
- if node.health_check is False:
61
- msg = f"Node health check fail: {node.get_id()}, retry later"
60
+ logger.info("connecting remote devices")
61
+ node.remote_devices = storage_node_ops._connect_to_remote_devs(
62
+ node, force_conect_restarting_nodes=True)
63
+ node.write_to_db()
64
+
65
+ logger.info("Sending device status event")
66
+ for db_dev in node.nvme_devices:
67
+ distr_controller.send_dev_status_event(db_dev, db_dev.status)
68
+
69
+ lvstore_check = True
70
+ if node.lvstore_status == "ready":
71
+ lvstore_check &= health_controller._check_node_lvstore(node.lvstore_stack, node, auto_fix=True)
72
+ if node.secondary_node_id:
73
+ lvstore_check &= health_controller._check_node_hublvol(node)
74
+
75
+ if lvstore_check is False:
76
+ msg = f"Node LVolStore check fail, retry later"
62
77
  logger.warning(msg)
63
78
  task.function_result = msg
64
79
  task.status = JobSchedule.STATUS_SUSPENDED
@@ -1502,11 +1502,11 @@ def restart_storage_node(
1502
1502
  # Calculate pool count
1503
1503
 
1504
1504
  number_of_alceml_devices = snode.number_of_alceml_devices
1505
- small_pool_count, large_pool_count = utils.calculate_pool_count(
1506
- number_of_alceml_devices, snode.number_of_distribs * 2, snode.cpu, len(snode.poller_cpu_cores) or snode.cpu)
1505
+ #small_pool_count, large_pool_count = utils.calculate_pool_count(
1506
+ # number_of_alceml_devices, snode.number_of_distribs * 2, snode.cpu, len(snode.poller_cpu_cores) or snode.cpu)
1507
1507
 
1508
1508
  # Calculate minimum huge page memory
1509
- minimum_hp_memory = utils.calculate_minimum_hp_memory(small_pool_count, large_pool_count, snode.max_lvol,
1509
+ minimum_hp_memory = utils.calculate_minimum_hp_memory(snode.iobuf_small_pool_count, snode.iobuf_large_pool_count, snode.max_lvol,
1510
1510
  snode.max_prov,
1511
1511
  len(utils.hexa_to_cpu_list(snode.spdk_cpu_mask)))
1512
1512
 
@@ -1546,6 +1546,7 @@ def restart_storage_node(
1546
1546
  for n in db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id):
1547
1547
  if n.api_endpoint == snode.api_endpoint:
1548
1548
  total_mem += n.spdk_mem
1549
+ total_mem+= utils.parse_size("500m")
1549
1550
 
1550
1551
  results = None
1551
1552
  try:
@@ -16,6 +16,9 @@ import docker
16
16
  from prettytable import PrettyTable
17
17
  from docker.errors import APIError, DockerException, ImageNotFound
18
18
 
19
+ import tempfile
20
+ from jinja2 import Environment, FileSystemLoader
21
+
19
22
  from simplyblock_core import constants
20
23
  from simplyblock_core import shell_utils
21
24
  from simplyblock_core.models.job_schedule import JobSchedule
@@ -1409,7 +1412,7 @@ def regenerate_config(new_config, old_config, force=False):
1409
1412
  logger.error(f"The nic {nic} is not a member of system nics {all_nics}")
1410
1413
  return False
1411
1414
 
1412
- small_pool_count, large_pool_count = calculate_pool_count(number_of_alcemls, 2 * number_of_distribs,
1415
+ small_pool_count, large_pool_count = calculate_pool_count(number_of_alcemls + 1, 2 * number_of_distribs,
1413
1416
  len(isolated_cores),
1414
1417
  number_of_poller_cores or len(
1415
1418
  isolated_cores),)
@@ -1478,7 +1481,7 @@ def generate_configs(max_lvol, max_prov, sockets_to_use, nodes_per_socket, pci_a
1478
1481
  nvme_by_numa = {nid: [] for nid in sockets_to_use}
1479
1482
  nvme_numa_neg1 = []
1480
1483
  for nvme_name, val in nvmes.items():
1481
- numa = val["numa_node"]
1484
+ numa = int(val["numa_node"])
1482
1485
  if numa in sockets_to_use:
1483
1486
  nvme_by_numa[numa].append(nvme_name)
1484
1487
  elif int(numa) == -1:
@@ -1760,3 +1763,55 @@ def remove_container(client: docker.DockerClient, name, timeout=3):
1760
1763
  except docker.errors.APIError as e:
1761
1764
  if 'Conflict ("removal of container {container.id} is already in progress")' != e.response.reason:
1762
1765
  raise
1766
+
1767
+ def render_and_deploy_alerting_configs(contact_point, grafana_endpoint, cluster_uuid, cluster_secret):
1768
+ TOP_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
1769
+ alerts_template_folder = os.path.join(TOP_DIR, "simplyblock_core/scripts/alerting/")
1770
+ alert_resources_file = "alert_resources.yaml"
1771
+
1772
+ env = Environment(loader=FileSystemLoader(alerts_template_folder), trim_blocks=True, lstrip_blocks=True)
1773
+ template = env.get_template(f'{alert_resources_file}.j2')
1774
+
1775
+ slack_pattern = re.compile(r"https://hooks\.slack\.com/services/\S+")
1776
+ email_pattern = re.compile(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")
1777
+
1778
+ if slack_pattern.match(contact_point):
1779
+ ALERT_TYPE = "slack"
1780
+ elif email_pattern.match(contact_point):
1781
+ ALERT_TYPE = "email"
1782
+ else:
1783
+ ALERT_TYPE = "slack"
1784
+ contact_point = 'https://hooks.slack.com/services/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'
1785
+
1786
+ values = {
1787
+ 'CONTACT_POINT': contact_point,
1788
+ 'GRAFANA_ENDPOINT': grafana_endpoint,
1789
+ 'ALERT_TYPE': ALERT_TYPE,
1790
+ }
1791
+
1792
+ with tempfile.TemporaryDirectory() as temp_dir:
1793
+ temp_file_path = os.path.join(temp_dir, alert_resources_file)
1794
+ with open(temp_file_path, 'w') as file:
1795
+ file.write(template.render(values))
1796
+
1797
+ destination_file_path = os.path.join(alerts_template_folder, alert_resources_file)
1798
+ subprocess.check_call(['sudo', '-v']) # sudo -v checks if the current user has sudo permissions
1799
+ subprocess.check_call(['sudo', 'mv', temp_file_path, destination_file_path])
1800
+ print(f"File moved to {destination_file_path} successfully.")
1801
+
1802
+ scripts_folder = os.path.join(TOP_DIR, "simplyblock_core/scripts/")
1803
+ prometheus_file = "prometheus.yml"
1804
+ env = Environment(loader=FileSystemLoader(scripts_folder), trim_blocks=True, lstrip_blocks=True)
1805
+ template = env.get_template(f'{prometheus_file}.j2')
1806
+ values = {
1807
+ 'CLUSTER_ID': cluster_uuid,
1808
+ 'CLUSTER_SECRET': cluster_secret}
1809
+
1810
+ with tempfile.TemporaryDirectory() as temp_dir:
1811
+ file_path = os.path.join(temp_dir, prometheus_file)
1812
+ with open(file_path, 'w') as file:
1813
+ file.write(template.render(values))
1814
+
1815
+ prometheus_file_path = os.path.join(scripts_folder, prometheus_file)
1816
+ subprocess.check_call(['sudo', 'mv', file_path, prometheus_file_path])
1817
+ print(f"File moved to {prometheus_file_path} successfully.")
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # encoding: utf-8
3
3
  import json
4
+ import math
4
5
  import os
5
6
  import time
6
7
  from typing import List, Optional, Union
@@ -633,7 +634,7 @@ def set_hugepages():
633
634
  numa = node_config["socket"]
634
635
  huge_page_memory_dict[numa] = huge_page_memory_dict.get(numa, 0) + node_config["huge_page_memory"]
635
636
  for numa, huge_page_memory in huge_page_memory_dict.items():
636
- num_pages = huge_page_memory // (2048 * 1024)
637
+ num_pages = math.ceil(huge_page_memory / (2048 * 1024))
637
638
  core_utils.set_hugepages_if_needed(numa, num_pages)
638
639
 
639
640
  return utils.get_response(True)
File without changes
File without changes
File without changes
File without changes
File without changes