sbcli-pre 25.5.3__tar.gz → 25.5.5__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.5.3 → sbcli-pre-25.5.5}/PKG-INFO +1 -1
  2. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/sbcli_pre.egg-info/PKG-INFO +1 -1
  3. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/sbcli_pre.egg-info/entry_points.txt +1 -0
  4. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/setup.py +1 -1
  5. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_cli/cli.py +1 -1
  6. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_cli/clibase.py +2 -2
  7. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/cluster_ops.py +25 -0
  8. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/tasks_controller.py +6 -2
  9. sbcli-pre-25.5.5/simplyblock_core/env_var +6 -0
  10. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/mgmt_node_ops.py +1 -1
  11. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/storage_node.py +9 -2
  12. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/rpc_client.py +2 -2
  13. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/health_check_service.py +1 -1
  14. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/tasks_runner_failed_migration.py +2 -1
  15. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/tasks_runner_migration.py +2 -1
  16. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/tasks_runner_new_dev_migration.py +2 -1
  17. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/storage_node_ops.py +38 -20
  18. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_storage_node.py +6 -6
  19. sbcli-pre-25.5.3/simplyblock_core/env_var +0 -6
  20. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/README.md +0 -0
  21. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/pyproject.toml +0 -0
  22. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/requirements.txt +0 -0
  23. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/sbcli_pre.egg-info/SOURCES.txt +0 -0
  24. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/sbcli_pre.egg-info/dependency_links.txt +0 -0
  25. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/sbcli_pre.egg-info/requires.txt +0 -0
  26. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/sbcli_pre.egg-info/top_level.txt +0 -0
  27. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/setup.cfg +0 -0
  28. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_cli/__init__.py +0 -0
  29. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_cli/main.py +0 -0
  30. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/__init__.py +0 -0
  31. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/cnode_client.py +0 -0
  32. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/constants.py +0 -0
  33. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/__init__.py +0 -0
  34. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  35. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/cluster_events.py +0 -0
  36. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/device_controller.py +0 -0
  37. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/device_events.py +0 -0
  38. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/events_controller.py +0 -0
  39. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/health_controller.py +0 -0
  40. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/lvol_controller.py +0 -0
  41. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/lvol_events.py +0 -0
  42. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/mgmt_events.py +0 -0
  43. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/pool_controller.py +0 -0
  44. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/pool_events.py +0 -0
  45. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  46. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/snapshot_events.py +0 -0
  47. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/storage_events.py +0 -0
  48. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/tasks_events.py +0 -0
  49. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
  50. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/db_controller.py +0 -0
  51. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/distr_controller.py +0 -0
  52. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/__init__.py +0 -0
  53. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/base_model.py +0 -0
  54. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/caching_node.py +0 -0
  55. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/cluster.py +0 -0
  56. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/deployer.py +0 -0
  57. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/events.py +0 -0
  58. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/hublvol.py +0 -0
  59. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/iface.py +0 -0
  60. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/job_schedule.py +0 -0
  61. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/lvol_model.py +0 -0
  62. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/mgmt_node.py +0 -0
  63. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/nvme_device.py +0 -0
  64. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/pool.py +0 -0
  65. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/port_stat.py +0 -0
  66. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/snapshot.py +0 -0
  67. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/models/stats.py +0 -0
  68. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/pci_utils.py +0 -0
  69. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/__init__.py +0 -0
  70. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  71. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  72. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  73. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/config_docker.sh +0 -0
  74. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/dashboard.yml +0 -0
  75. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  76. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  77. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  78. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  79. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  80. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  81. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/datasource.yml +0 -0
  82. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/db_config_double.sh +0 -0
  83. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/db_config_single.sh +0 -0
  84. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
  85. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  86. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  87. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  88. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/foundation.yml +0 -0
  89. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/haproxy.cfg +0 -0
  90. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/helpers/__init__.py +0 -0
  91. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/helpers/deploy_cluster.sh +0 -0
  92. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/helpers/destroy_cluster.sh +0 -0
  93. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/helpers/nvme_disconnect_by_ip.py +0 -0
  94. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/install_deps.sh +0 -0
  95. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/objstore.yml +0 -0
  96. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
  97. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/prometheus.yml.j2 +0 -0
  98. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/run_ssh.sh +0 -0
  99. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/set_db_config.sh +0 -0
  100. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  101. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/__init__.py +0 -0
  102. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  103. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/caching_node_monitor.py +0 -0
  104. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/cap_monitor.py +0 -0
  105. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  106. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/device_monitor.py +0 -0
  107. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/install_service.sh +0 -0
  108. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/lvol_monitor.py +0 -0
  109. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  110. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  111. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  112. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/new_device_discovery.py +0 -0
  113. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/remove_service.sh +0 -0
  114. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/service_template.service +0 -0
  115. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/spdk/__init__.py +0 -0
  116. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/spdk/client.py +0 -0
  117. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
  118. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/storage_node_monitor.py +0 -0
  119. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/tasks_cluster_status.py +0 -0
  120. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  121. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  122. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/shell_utils.py +0 -0
  123. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/snode_client.py +0 -0
  124. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/test/test_models.py +0 -0
  125. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/test/test_utils.py +0 -0
  126. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/utils.py +0 -0
  127. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
  128. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/README.md +0 -0
  129. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/__init__.py +0 -0
  130. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/app.py +0 -0
  131. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/auth_middleware.py +0 -0
  132. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/__init__.py +0 -0
  133. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  134. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  135. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  136. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  137. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  138. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/snode_ops.py +0 -0
  139. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  140. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
  141. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  142. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  143. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  144. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_device.py +0 -0
  145. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  146. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_metrics.py +0 -0
  147. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  148. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  149. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  150. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/node_configure.py +0 -0
  151. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/node_utils.py +0 -0
  152. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/node_utils_k8s.py +0 -0
  153. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/node_webapp.py +0 -0
  154. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
  155. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/delete.py +0 -0
  156. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/deploy.py +0 -0
  157. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  158. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  159. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/is_up.py +0 -0
  160. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/list_deps.py +0 -0
  161. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/rpac.yaml +0 -0
  162. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/swagger.yaml +0 -0
  163. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/static/tst.py +0 -0
  164. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  165. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  166. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/test/api/test_lvol.py +0 -0
  167. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/test/api/test_pool.py +0 -0
  168. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/test/api/test_snapshot.py +0 -0
  169. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/test/api/test_storage_node.py +0 -0
  170. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/test/conftest.py +0 -0
  171. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/test/pytest.ini +0 -0
  172. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/test/requirements.txt +0 -0
  173. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/test/util.py +0 -0
  174. {sbcli-pre-25.5.3 → sbcli-pre-25.5.5}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-pre
3
- Version: 25.5.3
3
+ Version: 25.5.5
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.5.3
3
+ Version: 25.5.5
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -1,3 +1,4 @@
1
1
  [console_scripts]
2
2
  sbcli-pre = simplyblock_cli.cli:main
3
+ sbctl = simplyblock_cli.cli:main
3
4
 
@@ -97,7 +97,7 @@ setup(
97
97
  entry_points={
98
98
  'console_scripts': [
99
99
  f'{COMMAND_NAME}=simplyblock_cli.cli:main',
100
- # 'sbctl=simplyblock_cli.cli:main',
100
+ 'sbctl=simplyblock_cli.cli:main',
101
101
  ]
102
102
  },
103
103
  include_package_data=True,
@@ -100,7 +100,7 @@ class CLIWrapper(CLIWrapperBase):
100
100
  def init_storage_node__add_node(self, subparser):
101
101
  subcommand = self.add_sub_command(subparser, 'add-node', 'Adds a storage node by its IP address')
102
102
  subcommand.add_argument('cluster_id', help='Cluster id', type=str)
103
- subcommand.add_argument('node_ip', help='IP of storage node to add', type=str)
103
+ subcommand.add_argument('node_addr', help='Address of storage node api to add, like <node-ip>:5000', type=str)
104
104
  subcommand.add_argument('ifname', help='Management interface name', type=str)
105
105
  argument = subcommand.add_argument('--journal-partition', help='1: auto-create small partitions for journal on nvme devices. 0: use a separate (the smallest) nvme device of the node for journal. The journal needs a maximum of 3 percent of total available raw disk space.', type=int, default=1, dest='partitions')
106
106
  if self.developer_mode:
@@ -115,7 +115,7 @@ class CLIWrapperBase:
115
115
 
116
116
  def storage_node__add_node(self, sub_command, args):
117
117
  cluster_id = args.cluster_id
118
- node_ip = args.node_ip
118
+ node_addr = args.node_addr
119
119
  ifname = args.ifname
120
120
  data_nics = args.data_nics
121
121
  spdk_image = args.spdk_image
@@ -134,7 +134,7 @@ class CLIWrapperBase:
134
134
 
135
135
  out = storage_ops.add_node(
136
136
  cluster_id=cluster_id,
137
- node_ip=node_ip,
137
+ node_addr=node_addr,
138
138
  iface_name=ifname,
139
139
  data_nics_list=data_nics,
140
140
  max_snap=max_snap,
@@ -683,6 +683,31 @@ def cluster_activate(cl_id, force=False, force_lvstore_create=False):
683
683
  set_cluster_status(cl_id, ols_status)
684
684
  return False
685
685
 
686
+ snodes = db_controller.get_storage_nodes_by_cluster_id(cl_id)
687
+ for snode in snodes:
688
+ if snode.status != StorageNode.STATUS_ONLINE:
689
+ continue
690
+
691
+ if not snode.is_secondary_node:
692
+ continue
693
+
694
+ logger.info(f"recreating secondary node {snode.get_id()}")
695
+ ret = storage_node_ops.recreate_lvstore_on_sec(snode)
696
+
697
+ snode = db_controller.get_storage_node_by_id(snode.get_id())
698
+ if ret:
699
+ snode.lvstore_status = "ready"
700
+ snode.write_to_db()
701
+
702
+ else:
703
+ snode.lvstore_status = "failed"
704
+ snode.write_to_db()
705
+ logger.error(f"Failed to restore lvstore on node {snode.get_id()}")
706
+ if not force:
707
+ logger.error("Failed to activate cluster")
708
+ set_cluster_status(cl_id, ols_status)
709
+ return False
710
+
686
711
 
687
712
  if not cluster.cluster_max_size:
688
713
  cluster = db_controller.get_cluster_by_id(cl_id)
@@ -179,13 +179,17 @@ def get_active_dev_restart_task(cluster_id, device_id):
179
179
  return False
180
180
 
181
181
 
182
- def get_active_node_mig_task(cluster_id, node_id):
182
+ def get_active_node_mig_task(cluster_id, node_id, distr_name=None):
183
183
  tasks = db.get_job_tasks(cluster_id)
184
184
  for task in tasks:
185
185
  if task.function_name in [JobSchedule.FN_FAILED_DEV_MIG, JobSchedule.FN_DEV_MIG,
186
186
  JobSchedule.FN_NEW_DEV_MIG] and task.node_id == node_id:
187
187
  if task.status == JobSchedule.STATUS_RUNNING and task.canceled is False:
188
- return task.uuid
188
+ if distr_name:
189
+ if "distr_name" in task.function_params and task.function_params["distr_name"] == distr_name:
190
+ return task.uuid
191
+ else:
192
+ return task.uuid
189
193
  return False
190
194
 
191
195
 
@@ -0,0 +1,6 @@
1
+ SIMPLY_BLOCK_COMMAND_NAME=sbcli-pre
2
+ SIMPLY_BLOCK_VERSION=25.5.5
3
+
4
+
5
+ SIMPLY_BLOCK_DOCKER_IMAGE=simplyblock/simplyblock:R25.5-PRE
6
+ SIMPLY_BLOCK_SPDK_ULTRA_IMAGE=simplyblock/spdk:main-latest
@@ -199,7 +199,7 @@ def remove_mgmt_node(uuid):
199
199
 
200
200
  logger.info("Leaving swarm...")
201
201
  node_docker = docker.DockerClient(base_url=f"tcp://{snode.docker_ip_port}", version="auto")
202
- node_docker.swarm.leave()
202
+ node_docker.swarm.leave(force=True)
203
203
 
204
204
  mgmt_events.mgmt_remove(snode)
205
205
  logging.info("done")
@@ -146,7 +146,7 @@ class StorageNode(BaseNodeObject):
146
146
  #
147
147
  # raise
148
148
 
149
- def create_hublvol(self, cluster_nqn):
149
+ def create_hublvol(self):
150
150
  """Create a hublvol for this node's lvstore
151
151
  """
152
152
  logger.info(f'Creating hublvol on {self.get_id()}')
@@ -159,7 +159,7 @@ class StorageNode(BaseNodeObject):
159
159
  raise RPCException('Failed to create hublvol')
160
160
  self.hublvol = HubLVol({
161
161
  'uuid': hublvol_uuid,
162
- 'nqn': f'{cluster_nqn}:lvol:{hublvol_uuid}',
162
+ 'nqn': f'{self.host_nqn}:lvol:{hublvol_uuid}',
163
163
  'bdev_name': f'{self.lvstore}/hublvol',
164
164
  'model_number': str(uuid4()),
165
165
  'nguid': utils.generate_hex_string(16),
@@ -212,6 +212,13 @@ class StorageNode(BaseNodeObject):
212
212
  return True
213
213
  except RPCException:
214
214
  pass
215
+ else:
216
+ try:
217
+ self.create_hublvol()
218
+ return True
219
+ except RPCException as e:
220
+ logger.error("Error establishing hublvol: %s", e.message)
221
+ # return False
215
222
 
216
223
  return self.hublvol
217
224
 
@@ -148,8 +148,8 @@ class RPCClient:
148
148
  "max_io_size": 131072,
149
149
  "io_unit_size": 8192,
150
150
  "max_aq_depth": 128,
151
- "num_shared_buffers": 30000,
152
- "buf_cache_size": 1024,
151
+ "num_shared_buffers": 24576,
152
+ "buf_cache_size": 512,
153
153
  "dif_insert_or_strip": False,
154
154
  "c2h_success": True,
155
155
  "sock_priority": 0
@@ -197,7 +197,7 @@ while True:
197
197
  connected_jms.append(remote_device.get_id())
198
198
 
199
199
  for jm_id in snode.jm_ids:
200
- if jm_id not in connected_jms:
200
+ if jm_id and jm_id not in connected_jms:
201
201
  for nd in db.get_storage_nodes():
202
202
  if nd.jm_device and nd.jm_device.get_id() == jm_id:
203
203
  if nd.status == StorageNode.STATUS_ONLINE:
@@ -138,7 +138,8 @@ while True:
138
138
  for task in tasks:
139
139
  if task.function_name == JobSchedule.FN_FAILED_DEV_MIG:
140
140
  if task.status in [JobSchedule.STATUS_NEW, JobSchedule.STATUS_SUSPENDED]:
141
- active_task = tasks_controller.get_active_node_mig_task(task.cluster_id, task.node_id)
141
+ active_task = tasks_controller.get_active_node_mig_task(
142
+ task.cluster_id, task.node_id, task.function_params["distr_name"])
142
143
  if active_task:
143
144
  logger.info("task found on same node, retry")
144
145
  continue
@@ -134,7 +134,8 @@ while True:
134
134
  if task.function_name == JobSchedule.FN_DEV_MIG and task.status != JobSchedule.STATUS_DONE:
135
135
  task = db.get_task_by_id(task.uuid)
136
136
  if task.status in [JobSchedule.STATUS_NEW, JobSchedule.STATUS_SUSPENDED]:
137
- active_task = tasks_controller.get_active_node_mig_task(task.cluster_id, task.node_id)
137
+ active_task = tasks_controller.get_active_node_mig_task(
138
+ task.cluster_id, task.node_id, task.function_params["distr_name"])
138
139
  if active_task:
139
140
  logger.info("task found on same node, retry")
140
141
  continue
@@ -149,7 +149,8 @@ while True:
149
149
  for task in tasks:
150
150
  if task.function_name == JobSchedule.FN_NEW_DEV_MIG:
151
151
  if task.status in [JobSchedule.STATUS_NEW, JobSchedule.STATUS_SUSPENDED]:
152
- active_task = tasks_controller.get_active_node_mig_task(task.cluster_id, task.node_id)
152
+ active_task = tasks_controller.get_active_node_mig_task(
153
+ task.cluster_id, task.node_id, task.function_params["distr_name"])
153
154
  if active_task:
154
155
  logger.info("task found on same node, retry")
155
156
  continue
@@ -778,13 +778,13 @@ def _connect_to_remote_jm_devs(this_node, jm_ids=None):
778
778
  return new_devs
779
779
 
780
780
 
781
- def add_node(cluster_id, node_ip, iface_name, data_nics_list,
781
+ def add_node(cluster_id, node_addr, iface_name, data_nics_list,
782
782
  max_snap, spdk_image=None, spdk_debug=False,
783
783
  small_bufsize=0, large_bufsize=0,
784
784
  num_partitions_per_dev=0, jm_percent=0, enable_test_device=False,
785
785
  namespace=None, enable_ha_jm=False, id_device_by_nqn=False,
786
786
  partition_size="", ha_jm_count=3, full_page_unmap=False):
787
- snode_api = SNodeClient(node_ip)
787
+ snode_api = SNodeClient(node_addr)
788
788
  node_info, _ = snode_api.info()
789
789
  if node_info.get("nodes_config") and node_info["nodes_config"].get("nodes"):
790
790
  nodes = node_info["nodes_config"]["nodes"]
@@ -804,7 +804,7 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
804
804
  logger.error("Cluster not found: %s", cluster_id)
805
805
  return False
806
806
 
807
- logger.info(f"Adding Storage node: {node_ip}")
807
+ logger.info(f"Adding Storage node: {node_addr}")
808
808
 
809
809
  if not node_info:
810
810
  logger.error("SNode API is not reachable")
@@ -908,7 +908,7 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
908
908
  if ssd_pcie:
909
909
  for ssd in ssd_pcie:
910
910
  for node in db_controller.get_storage_nodes_by_cluster_id(cluster_id):
911
- if node.api_endpoint == node_ip:
911
+ if node.api_endpoint == node_addr:
912
912
  if ssd in node.ssd_pcie:
913
913
  logger.error(f"SSD is being used by other node, ssd: {ssd}, node: {node.get_id()}")
914
914
  return False
@@ -935,7 +935,7 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
935
935
 
936
936
  total_mem = minimum_hp_memory
937
937
  for n in db_controller.get_storage_nodes_by_cluster_id(cluster_id):
938
- if n.api_endpoint == node_ip:
938
+ if n.api_endpoint == node_addr:
939
939
  total_mem += n.spdk_mem
940
940
  total_mem += utils.parse_size("500m")
941
941
  logger.info("Deploying SPDK")
@@ -999,7 +999,7 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
999
999
  snode.rpc_username = rpc_user
1000
1000
  snode.rpc_password = rpc_pass
1001
1001
  snode.cluster_id = cluster_id
1002
- snode.api_endpoint = node_ip
1002
+ snode.api_endpoint = node_addr
1003
1003
  snode.host_secret = utils.generate_string(20)
1004
1004
  snode.ctrl_secret = utils.generate_string(20)
1005
1005
  snode.number_of_distribs = number_of_distribs
@@ -1761,6 +1761,15 @@ def restart_storage_node(
1761
1761
  if devs:
1762
1762
  dev = db_controller.get_jm_device_by_id(devs[0])
1763
1763
  snode.remote_jm_devices.append(dev)
1764
+ if not snode.jm_ids:
1765
+ snode.jm_ids = []
1766
+ for rem_jm in snode.remote_jm_devices:
1767
+ if rem_jm.get_id():
1768
+ snode.jm_ids.append(rem_jm.get_id())
1769
+
1770
+ snode.jm_ids = snode.jm_ids[:constants.HA_JM_COUNT-1]
1771
+ snode.write_to_db(db_controller.kv_store)
1772
+
1764
1773
  snode.remote_jm_devices = _connect_to_remote_jm_devs(snode)
1765
1774
  snode.health_check = True
1766
1775
  snode.lvstore_status = ""
@@ -3088,30 +3097,37 @@ def add_lvol_thread(lvol, snode, lvol_ana_state="optimized"):
3088
3097
  def get_sorted_ha_jms(current_node):
3089
3098
  db_controller = DBController()
3090
3099
  jm_count = {}
3091
- mgmt_ips = []
3100
+ jm_dev_to_mgmt_ip = {}
3101
+
3092
3102
  for node in db_controller.get_storage_nodes_by_cluster_id(current_node.cluster_id):
3093
- if (node.get_id() == current_node.get_id() or node.status != StorageNode.STATUS_ONLINE): # pass
3094
- continue
3095
- if node.mgmt_ip == current_node.mgmt_ip:
3096
- continue
3097
- if node.mgmt_ip in mgmt_ips:
3103
+ if node.get_id() == current_node.get_id(): # pass
3098
3104
  continue
3099
3105
 
3100
- if node.jm_device and node.jm_device.status == JMDevice.STATUS_ONLINE:
3101
- jm_count[node.jm_device.get_id()] = 1
3102
- mgmt_ips.append(node.mgmt_ip)
3106
+ if node.jm_device and node.jm_device.status == JMDevice.STATUS_ONLINE and node.jm_device.get_id():
3107
+ jm_count[node.jm_device.get_id()] = 0
3108
+ jm_dev_to_mgmt_ip[node.jm_device.get_id()] = node.mgmt_ip
3103
3109
 
3104
3110
  for node in db_controller.get_storage_nodes_by_cluster_id(current_node.cluster_id):
3105
- if (node.get_id() == current_node.get_id() or node.status != StorageNode.STATUS_ONLINE): # pass
3111
+ if node.get_id() == current_node.get_id(): # pass
3106
3112
  continue
3107
- if node.mgmt_ip == current_node.mgmt_ip or not node.jm_ids:
3113
+ if not node.jm_ids:
3108
3114
  continue
3109
3115
  for rem_jm_id in node.jm_ids:
3110
3116
  if rem_jm_id in jm_count:
3111
3117
  jm_count[rem_jm_id] += 1
3112
3118
 
3119
+ mgmt_ips = []
3113
3120
  jm_count = dict(sorted(jm_count.items(), key=lambda x: x[1]))
3114
- return list(jm_count.keys())[:3]
3121
+ out = []
3122
+ for jm_id in jm_count.keys():
3123
+ if jm_id:
3124
+ if jm_dev_to_mgmt_ip[jm_id] in mgmt_ips:
3125
+ continue
3126
+ if jm_dev_to_mgmt_ip[jm_id] == current_node.mgmt_ip:
3127
+ continue
3128
+ mgmt_ips.append(jm_dev_to_mgmt_ip[jm_id])
3129
+ out.append(jm_count)
3130
+ return out[:constants.HA_JM_COUNT-1]
3115
3131
 
3116
3132
 
3117
3133
  def get_node_jm_names(current_node, remote_node=None):
@@ -3126,6 +3142,9 @@ def get_node_jm_names(current_node, remote_node=None):
3126
3142
 
3127
3143
  if current_node.enable_ha_jm:
3128
3144
  for jm_id in current_node.jm_ids:
3145
+ if not jm_id:
3146
+ continue
3147
+
3129
3148
  if remote_node:
3130
3149
  if remote_node.jm_device.get_id() == jm_id:
3131
3150
  jm_list.append(remote_node.jm_device.jm_bdev)
@@ -3298,9 +3317,8 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
3298
3317
  sec_rpc_client.bdev_examine(snode.raid)
3299
3318
  sec_rpc_client.bdev_wait_for_examine()
3300
3319
 
3301
- cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
3302
3320
  try:
3303
- snode.create_hublvol(cluster_nqn)
3321
+ snode.create_hublvol()
3304
3322
 
3305
3323
  except RPCException as e:
3306
3324
  logger.error("Error establishing hublvol: %s", e.message)
@@ -182,14 +182,14 @@ def storage_node_add():
182
182
  if 'cluster_id' not in req_data:
183
183
  return utils.get_response_error("missing required param: cluster_id", 400)
184
184
 
185
- if 'node_ip' not in req_data:
186
- return utils.get_response_error("missing required param: node_ip", 400)
185
+ if 'node_addr' not in req_data:
186
+ return utils.get_response_error("missing required param: node_addr", 400)
187
187
 
188
188
  if 'ifname' not in req_data:
189
189
  return utils.get_response_error("missing required param: ifname", 400)
190
190
 
191
191
  cluster_id = req_data['cluster_id']
192
- node_ip = req_data['node_ip']
192
+ node_addr = req_data['node_addr']
193
193
  ifname = req_data['ifname']
194
194
  max_snap = int(req_data.get('max_snap', 500))
195
195
 
@@ -201,9 +201,9 @@ def storage_node_add():
201
201
  enable_test_device = False
202
202
  param = req_data.get('enable_test_device')
203
203
  if param:
204
- if type(param) == bool:
204
+ if isinstance(param, bool):
205
205
  enable_test_device = param
206
- elif type(param) == str:
206
+ elif isinstance(param, str):
207
207
  enable_test_device = param == "true"
208
208
 
209
209
  spdk_image = None
@@ -245,7 +245,7 @@ def storage_node_add():
245
245
 
246
246
  tasks_controller.add_node_add_task(cluster_id, {
247
247
  "cluster_id": cluster_id,
248
- "node_ip": node_ip,
248
+ "node_addr": node_addr,
249
249
  "iface_name": ifname,
250
250
  "data_nics_list": data_nics,
251
251
  "max_snap": max_snap,
@@ -1,6 +0,0 @@
1
- SIMPLY_BLOCK_COMMAND_NAME=sbcli-pre
2
- SIMPLY_BLOCK_VERSION=25.5.3
3
-
4
-
5
- SIMPLY_BLOCK_DOCKER_IMAGE=simplyblock/simplyblock:R25.3-PRE-Hotfix-upgrade
6
- SIMPLY_BLOCK_SPDK_ULTRA_IMAGE=simplyblock/spdk:main-latest
File without changes
File without changes
File without changes
File without changes