sbcli-dev 15.0.2__tar.gz → 16.0.0__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 (163) hide show
  1. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/PKG-INFO +1 -1
  2. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/sbcli_dev.egg-info/PKG-INFO +1 -1
  3. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/sbcli_dev.egg-info/SOURCES.txt +5 -0
  4. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_cli/cli.py +21 -12
  5. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_cli/clibase.py +24 -51
  6. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/cluster_ops.py +28 -71
  7. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/constants.py +6 -8
  8. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/caching_node_controller.py +8 -9
  9. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/cluster_events.py +6 -6
  10. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/device_controller.py +2 -3
  11. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/events_controller.py +1 -0
  12. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/lvol_controller.py +3 -5
  13. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/distr_controller.py +8 -7
  14. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/env_var +1 -1
  15. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/nvme_device.py +3 -1
  16. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/cap_monitor.py +14 -3
  17. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/capacity_and_stats_collector.py +2 -2
  18. sbcli_dev-16.0.0/simplyblock_core/services/device_monitor.py +47 -0
  19. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/main_distr_event_collector.py +12 -5
  20. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/storage_node_monitor.py +6 -3
  21. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/tasks_runner_migration.py +2 -4
  22. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/storage_node_ops.py +19 -20
  23. sbcli_dev-16.0.0/simplyblock_core/test/test_utils.py +109 -0
  24. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/utils.py +87 -63
  25. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/app.py +3 -1
  26. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/auth_middleware.py +13 -0
  27. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/caching_node_ops.py +6 -40
  28. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/caching_node_ops_k8s.py +4 -12
  29. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/node_api_caching_docker.py +4 -9
  30. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/node_api_caching_ks.py +3 -9
  31. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/snode_ops.py +4 -10
  32. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/snode_ops_k8s.py +13 -89
  33. sbcli_dev-16.0.0/simplyblock_web/blueprints/swagger_ui_blueprint.py +27 -0
  34. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_caching_node.py +4 -7
  35. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_cluster.py +24 -0
  36. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_lvol.py +3 -3
  37. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_pool.py +8 -8
  38. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_snapshot.py +2 -2
  39. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_storage_node.py +2 -3
  40. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/node_utils.py +28 -101
  41. sbcli_dev-16.0.0/simplyblock_web/node_utils_k8s.py +104 -0
  42. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/requirements.txt +4 -0
  43. sbcli_dev-16.0.0/simplyblock_web/static/SimplyBlock-API.postman_collection.json +4581 -0
  44. sbcli_dev-16.0.0/simplyblock_web/static/swagger.yaml +57873 -0
  45. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/utils.py +0 -5
  46. sbcli_dev-15.0.2/simplyblock_core/services/device_monitor.py +0 -43
  47. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/README.md +0 -0
  48. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/pyproject.toml +0 -0
  49. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/requirements.txt +0 -0
  50. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/sbcli_dev.egg-info/dependency_links.txt +0 -0
  51. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/sbcli_dev.egg-info/entry_points.txt +0 -0
  52. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/sbcli_dev.egg-info/requires.txt +0 -0
  53. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/sbcli_dev.egg-info/top_level.txt +0 -0
  54. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/setup.cfg +0 -0
  55. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/setup.py +0 -0
  56. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_cli/__init__.py +0 -0
  57. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_cli/main.py +0 -0
  58. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/__init__.py +0 -0
  59. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/cnode_client.py +0 -0
  60. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/__init__.py +0 -0
  61. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/device_events.py +0 -0
  62. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/health_controller.py +0 -0
  63. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/lvol_events.py +0 -0
  64. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/mgmt_events.py +0 -0
  65. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/pool_controller.py +0 -0
  66. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/pool_events.py +0 -0
  67. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  68. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/snapshot_events.py +0 -0
  69. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/storage_events.py +0 -0
  70. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/tasks_controller.py +0 -0
  71. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/tasks_events.py +0 -0
  72. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
  73. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/db_controller.py +0 -0
  74. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/mgmt_node_ops.py +0 -0
  75. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/__init__.py +0 -0
  76. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/base_model.py +0 -0
  77. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/caching_node.py +0 -0
  78. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/cluster.py +0 -0
  79. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/deployer.py +0 -0
  80. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/events.py +0 -0
  81. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/iface.py +0 -0
  82. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/job_schedule.py +0 -0
  83. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/lvol_model.py +0 -0
  84. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/mgmt_node.py +0 -0
  85. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/pool.py +0 -0
  86. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/port_stat.py +0 -0
  87. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/snapshot.py +0 -0
  88. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/stats.py +0 -0
  89. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/models/storage_node.py +0 -0
  90. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/pci_utils.py +0 -0
  91. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/rpc_client.py +0 -0
  92. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/__init__.py +0 -0
  93. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  94. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  95. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  96. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/config_docker.sh +0 -0
  97. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/dashboard.yml +0 -0
  98. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  99. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  100. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  101. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  102. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  103. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  104. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/datasource.yml +0 -0
  105. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/db_config_double.sh +0 -0
  106. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/db_config_single.sh +0 -0
  107. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
  108. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  109. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  110. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  111. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/foundation.yml +0 -0
  112. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/haproxy.cfg +0 -0
  113. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/install_deps.sh +0 -0
  114. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/objstore.yml +0 -0
  115. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
  116. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/prometheus.yml +0 -0
  117. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/run_ssh.sh +0 -0
  118. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/set_db_config.sh +0 -0
  119. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  120. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/__init__.py +0 -0
  121. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  122. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/caching_node_monitor.py +0 -0
  123. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/health_check_service.py +0 -0
  124. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/install_service.sh +0 -0
  125. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/lvol_monitor.py +0 -0
  126. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  127. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  128. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/new_device_discovery.py +0 -0
  129. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/remove_service.sh +0 -0
  130. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/service_template.service +0 -0
  131. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/spdk/__init__.py +0 -0
  132. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/spdk/client.py +0 -0
  133. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
  134. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/spdk_stats_collector.py +0 -0
  135. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  136. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  137. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  138. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  139. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/shell_utils.py +0 -0
  140. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/snode_client.py +0 -0
  141. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
  142. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/README.md +0 -0
  143. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/__init__.py +0 -0
  144. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/__init__.py +0 -0
  145. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  146. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  147. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_device.py +0 -0
  148. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  149. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/caching_node_app.py +0 -0
  150. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/caching_node_app_k8s.py +0 -0
  151. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/node_webapp.py +0 -0
  152. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/snode_app.py +0 -0
  153. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/snode_app_k8s.py +0 -0
  154. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/static/delete.py +0 -0
  155. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/static/deploy.py +0 -0
  156. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  157. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  158. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/static/is_up.py +0 -0
  159. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/static/list_deps.py +0 -0
  160. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/static/rpac.yaml +0 -0
  161. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/static/tst.py +0 -0
  162. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  163. {sbcli_dev-15.0.2 → sbcli_dev-16.0.0}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sbcli-dev
3
- Version: 15.0.2
3
+ Version: 16.0.0
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.4
2
2
  Name: sbcli-dev
3
- Version: 15.0.2
3
+ Version: 16.0.0
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -113,6 +113,7 @@ simplyblock_core/services/tasks_runner_node_add.py
113
113
  simplyblock_core/services/tasks_runner_restart.py
114
114
  simplyblock_core/services/spdk/__init__.py
115
115
  simplyblock_core/services/spdk/client.py
116
+ simplyblock_core/test/test_utils.py
116
117
  simplyblock_core/workers/cleanup_foundationdb.py
117
118
  simplyblock_web/README.md
118
119
  simplyblock_web/__init__.py
@@ -121,6 +122,7 @@ simplyblock_web/auth_middleware.py
121
122
  simplyblock_web/caching_node_app.py
122
123
  simplyblock_web/caching_node_app_k8s.py
123
124
  simplyblock_web/node_utils.py
125
+ simplyblock_web/node_utils_k8s.py
124
126
  simplyblock_web/node_webapp.py
125
127
  simplyblock_web/requirements.txt
126
128
  simplyblock_web/snode_app.py
@@ -134,6 +136,7 @@ simplyblock_web/blueprints/node_api_caching_docker.py
134
136
  simplyblock_web/blueprints/node_api_caching_ks.py
135
137
  simplyblock_web/blueprints/snode_ops.py
136
138
  simplyblock_web/blueprints/snode_ops_k8s.py
139
+ simplyblock_web/blueprints/swagger_ui_blueprint.py
137
140
  simplyblock_web/blueprints/web_api_caching_node.py
138
141
  simplyblock_web/blueprints/web_api_cluster.py
139
142
  simplyblock_web/blueprints/web_api_deployer.py
@@ -143,6 +146,7 @@ simplyblock_web/blueprints/web_api_mgmt_node.py
143
146
  simplyblock_web/blueprints/web_api_pool.py
144
147
  simplyblock_web/blueprints/web_api_snapshot.py
145
148
  simplyblock_web/blueprints/web_api_storage_node.py
149
+ simplyblock_web/static/SimplyBlock-API.postman_collection.json
146
150
  simplyblock_web/static/delete.py
147
151
  simplyblock_web/static/deploy.py
148
152
  simplyblock_web/static/deploy_cnode.yaml
@@ -150,6 +154,7 @@ simplyblock_web/static/deploy_spdk.yaml
150
154
  simplyblock_web/static/is_up.py
151
155
  simplyblock_web/static/list_deps.py
152
156
  simplyblock_web/static/rpac.yaml
157
+ simplyblock_web/static/swagger.yaml
153
158
  simplyblock_web/static/tst.py
154
159
  simplyblock_web/templates/caching_deploy_spdk.yaml.j2
155
160
  simplyblock_web/templates/storage_deploy_spdk.yaml.j2
@@ -68,8 +68,7 @@ class CLIWrapper(CLIWrapperBase):
68
68
  self.init_storage_node__send_cluster_map(subparser)
69
69
  if self.developer_mode:
70
70
  self.init_storage_node__get_cluster_map(subparser)
71
- if self.developer_mode:
72
- self.init_storage_node__make_primary(subparser)
71
+ self.init_storage_node__make_primary(subparser)
73
72
  if self.developer_mode:
74
73
  self.init_storage_node__dump_lvstore(subparser)
75
74
  if self.developer_mode:
@@ -149,8 +148,8 @@ class CLIWrapper(CLIWrapperBase):
149
148
  if self.developer_mode:
150
149
  argument = subcommand.add_argument('--max-snap', help='Max snapshot per storage node', type=int, default=5000, dest='max_snap', required=False)
151
150
  if self.developer_mode:
152
- argument = subcommand.add_argument('--max-size', help='Maximum amount of GB to be utilized on this storage node', type=str, default='', dest='max_prov', required=False)
153
- argument = subcommand.add_argument('--node-ip', help='Restart Node on new node', type=str, dest='node_ip', required=False)
151
+ argument = subcommand.add_argument('--max-size', help='Maximum amount of GB to be utilized on this storage node', type=str, default='0', dest='max_prov', required=False)
152
+ argument = subcommand.add_argument('--node-addr', '--node-ip', help='Restart Node on new node', type=str, dest='node_ip', required=False)
154
153
  argument = subcommand.add_argument('--number-of-devices', help='Number of devices per storage node if it\'s not supported EC2 instance', type=int, dest='number_of_devices', required=False)
155
154
  if self.developer_mode:
156
155
  argument = subcommand.add_argument('--spdk-image', help='SPDK image uri', type=str, dest='spdk_image', required=False)
@@ -277,7 +276,7 @@ class CLIWrapper(CLIWrapperBase):
277
276
  subcommand.add_argument('node_id', help='Storage node id', type=str).completer = self._completer_get_sn_list
278
277
 
279
278
  def init_storage_node__make_primary(self, subparser):
280
- subcommand = self.add_sub_command(subparser, 'make-primary', 'In case of HA SNode, makes the current node as primary')
279
+ subcommand = self.add_sub_command(subparser, 'make-primary', 'Forces to make the provided node id primary')
281
280
  subcommand.add_argument('node_id', help='Storage node id', type=str).completer = self._completer_get_sn_list
282
281
 
283
282
  def init_storage_node__dump_lvstore(self, subparser):
@@ -315,6 +314,8 @@ class CLIWrapper(CLIWrapperBase):
315
314
  self.init_cluster__list_tasks(subparser)
316
315
  self.init_cluster__cancel_task(subparser)
317
316
  self.init_cluster__delete(subparser)
317
+ if self.developer_mode:
318
+ self.init_cluster__set(subparser)
318
319
 
319
320
 
320
321
  def init_cluster__deploy(self, subparser):
@@ -556,6 +557,12 @@ class CLIWrapper(CLIWrapperBase):
556
557
  subcommand = self.add_sub_command(subparser, 'delete', 'Deletes a cluster')
557
558
  subcommand.add_argument('cluster_id', help='Cluster id', type=str).completer = self._completer_get_cluster_list
558
559
 
560
+ def init_cluster__set(self, subparser):
561
+ subcommand = self.add_sub_command(subparser, 'set', 'set cluster db value')
562
+ subcommand.add_argument('cluster_id', help='cluster id', type=str)
563
+ subcommand.add_argument('attr_name', help='attr_name', type=str)
564
+ subcommand.add_argument('attr_value', help='attr_value', type=str)
565
+
559
566
 
560
567
  def init_volume(self):
561
568
  subparser = self.add_command('volume', 'Logical volume commands', aliases=['lvol',])
@@ -600,7 +607,7 @@ class CLIWrapper(CLIWrapperBase):
600
607
  argument = subcommand.add_argument('--namespace', help='Set logical volume namespace for k8s clients', type=str, dest='namespace', required=False)
601
608
  if self.developer_mode:
602
609
  argument = subcommand.add_argument('--uid', help='Set logical volume id', type=str, dest='uid', required=False)
603
- argument = subcommand.add_argument('--pvc_name', help='Set logical volume PVC name for k8s clients', type=str, dest='pvc_name', required=False)
610
+ argument = subcommand.add_argument('--pvc-name', '--pvc_name', help='Set logical volume PVC name for k8s clients', type=str, dest='pvc_name', required=False)
604
611
 
605
612
  def init_volume__qos_set(self, subparser):
606
613
  subcommand = self.add_sub_command(subparser, 'qos-set', 'Changes QoS settings for an active logical volume')
@@ -906,7 +913,7 @@ class CLIWrapper(CLIWrapperBase):
906
913
  elif sub_command in ['restart']:
907
914
  if not self.developer_mode:
908
915
  args.max_snap = 5000
909
- args.max_prov = ''
916
+ args.max_prov = '0'
910
917
  args.spdk_image = None
911
918
  args.spdk_debug = None
912
919
  args.small_bufsize = 0
@@ -983,11 +990,7 @@ class CLIWrapper(CLIWrapperBase):
983
990
  else:
984
991
  ret = self.storage_node__get_cluster_map(sub_command, args)
985
992
  elif sub_command in ['make-primary']:
986
- if not self.developer_mode:
987
- print("This command is private.")
988
- ret = False
989
- else:
990
- ret = self.storage_node__make_primary(sub_command, args)
993
+ ret = self.storage_node__make_primary(sub_command, args)
991
994
  elif sub_command in ['dump-lvstore']:
992
995
  if not self.developer_mode:
993
996
  print("This command is private.")
@@ -1105,6 +1108,12 @@ class CLIWrapper(CLIWrapperBase):
1105
1108
  ret = self.cluster__cancel_task(sub_command, args)
1106
1109
  elif sub_command in ['delete']:
1107
1110
  ret = self.cluster__delete(sub_command, args)
1111
+ elif sub_command in ['set']:
1112
+ if not self.developer_mode:
1113
+ print("This command is private.")
1114
+ ret = False
1115
+ else:
1116
+ ret = self.cluster__set(sub_command, args)
1108
1117
  else:
1109
1118
  self.parser.print_help()
1110
1119
 
@@ -76,7 +76,7 @@ class CLIWrapperBase:
76
76
 
77
77
  max_lvol = args.max_lvol
78
78
  max_snap = args.max_snap
79
- max_prov = args.max_prov
79
+ max_prov = utils.parse_size(args.max_prov, unit='G')
80
80
  number_of_devices = args.number_of_devices
81
81
  enable_test_device = args.enable_test_device
82
82
  enable_ha_jm = args.enable_ha_jm
@@ -132,7 +132,7 @@ class CLIWrapperBase:
132
132
 
133
133
  max_lvol = args.max_lvol
134
134
  max_snap = args.max_snap
135
- max_prov = args.max_prov if args.max_prov else 0
135
+ max_prov = utils.parse_size(args.max_prov, unit='G')
136
136
  number_of_devices = args.number_of_devices
137
137
 
138
138
  small_bufsize = args.small_bufsize
@@ -357,10 +357,14 @@ class CLIWrapperBase:
357
357
  cluster_id = args.cluster_id
358
358
  return cluster_ops.get_ssh_pass(cluster_id)
359
359
 
360
+ def cluster__set(self, sub_command, args):
361
+ cluster_id = args.cluster_id
362
+ return cluster_ops.set(cluster_id, args.attr_name, args.attr_value)
363
+
360
364
  def volume__add(self, sub_command, args):
361
365
  name = args.name
362
- size = self.parse_size(args.size)
363
- max_size = self.parse_size(args.max_size)
366
+ size = utils.parse_size(args.size)
367
+ max_size = utils.parse_size(args.max_size)
364
368
  host_id = args.host_id
365
369
  ha_type = args.ha_type
366
370
  pool = args.pool
@@ -414,7 +418,7 @@ class CLIWrapperBase:
414
418
 
415
419
  def volume__resize(self, sub_command, args):
416
420
  volume_id = args.volume_id
417
- size = self.parse_size(args.size)
421
+ size = utils.parse_size(args.size)
418
422
  return lvol_controller.resize_lvol(volume_id, size)
419
423
 
420
424
  def volume__create_snapshot(self, sub_command, args):
@@ -426,7 +430,7 @@ class CLIWrapperBase:
426
430
  def volume__clone(self, sub_command, args):
427
431
  new_size = 0
428
432
  if args.resize:
429
- new_size = self.parse_size(args.resize)
433
+ new_size = utils.parse_size(args.resize)
430
434
 
431
435
  clone_id, error = snapshot_controller.clone(args.snapshot_id, args.clone_name, new_size)
432
436
  return clone_id if not error else error
@@ -479,8 +483,8 @@ class CLIWrapperBase:
479
483
  has_secret = False
480
484
  return pool_controller.add_pool(
481
485
  args.name,
482
- self.parse_size(args.pool_max),
483
- self.parse_size(args.lvol_max),
486
+ utils.parse_size(args.pool_max),
487
+ utils.parse_size(args.lvol_max),
484
488
  args.max_rw_iops,
485
489
  args.max_rw_mbytes,
486
490
  args.max_r_mbytes,
@@ -493,9 +497,9 @@ class CLIWrapperBase:
493
497
  pool_max = None
494
498
  lvol_max = None
495
499
  if args.pool_max:
496
- pool_max = self.parse_size(args.pool_max)
500
+ pool_max = utils.parse_size(args.pool_max)
497
501
  if args.lvol_max:
498
- lvol_max = self.parse_size(args.lvol_max)
502
+ lvol_max = utils.parse_size(args.lvol_max)
499
503
  return pool_controller.set_pool(
500
504
  args.pool_id,
501
505
  pool_max,
@@ -545,7 +549,7 @@ class CLIWrapperBase:
545
549
  def snapshot__clone(self, sub_command, args):
546
550
  new_size = 0
547
551
  if args.resize:
548
- new_size = self.parse_size(args.resize)
552
+ new_size = utils.parse_size(args.resize)
549
553
 
550
554
  success, details = snapshot_controller.clone(args.snapshot_id, args.lvol_name, new_size)
551
555
  return details
@@ -571,9 +575,9 @@ class CLIWrapperBase:
571
575
 
572
576
  spdk_mem = None
573
577
  if args.spdk_mem:
574
- spdk_mem = self.parse_size(args.spdk_mem)
575
- if spdk_mem < 1 * 1024 * 1024:
576
- return f"SPDK memory:{args.spdk_mem} must be larger than 1G"
578
+ spdk_mem = utils.parse_size(args.spdk_mem)
579
+ if spdk_mem < utils.parse_size('1GiB'):
580
+ return f"SPDK memory:{args.spdk_mem} must be larger than 1GiB"
577
581
 
578
582
  return caching_node_controller.add_node(
579
583
  cluster_id, node_ip, ifname, data_nics, spdk_cpu_mask, spdk_mem, spdk_image, namespace, multipathing)
@@ -681,9 +685,11 @@ class CLIWrapperBase:
681
685
  else:
682
686
  return f"Invalid cpu mask value: {args.spdk_cpu_mask}"
683
687
 
688
+
689
+
684
690
  max_lvol = args.max_lvol
685
691
  max_snap = args.max_snap
686
- max_prov = args.max_prov
692
+ max_prov = utils.parse_size(args.max_prov, unit='G')
687
693
  number_of_devices = args.number_of_devices
688
694
  enable_test_device = args.enable_test_device
689
695
  enable_ha_jm = args.enable_ha_jm
@@ -692,11 +698,11 @@ class CLIWrapperBase:
692
698
  secondary_nodes = args.secondary_nodes
693
699
 
694
700
  lvol_name = args.lvol_name
695
- lvol_size = self.parse_size(args.lvol_size)
696
- max_size = self.parse_size(args.max_size)
701
+ lvol_size = utils.parse_size(args.lvol_size)
702
+ max_size = utils.parse_size(args.max_size)
697
703
  lvol_ha_type = args.lvol_ha_type
698
704
  pool_name = args.pool_name
699
- pool_max = self.parse_size(args.pool_max)
705
+ pool_max = utils.parse_size(args.pool_max)
700
706
  host_id = args.host_id
701
707
  comp = None
702
708
  crypto = args.encrypt
@@ -786,39 +792,6 @@ class CLIWrapperBase:
786
792
  else:
787
793
  sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n")
788
794
 
789
- def parse_size(self, size_string: str):
790
- try:
791
- x = int(size_string)
792
- return x
793
- except Exception:
794
- pass
795
- try:
796
- if size_string:
797
- size_string = size_string.lower()
798
- size_string = size_string.replace(" ", "")
799
- size_string = size_string.replace("b", "")
800
- size_number = int(size_string[:-1])
801
- size_v = size_string[-1]
802
- one_k = constants.ONE_KB
803
- multi = 0
804
- if size_v == "k":
805
- multi = 1
806
- elif size_v == "m":
807
- multi = 2
808
- elif size_v == "g":
809
- multi = 3
810
- elif size_v == "t":
811
- multi = 4
812
- else:
813
- print(f"Error parsing size: {size_string}")
814
- return -1
815
- return size_number * math.pow(one_k, multi)
816
- else:
817
- return -1
818
- except:
819
- print(f"Error parsing size: {size_string}")
820
- return -1
821
-
822
795
  def validate_cpu_mask(self, spdk_cpu_mask):
823
796
  return re.match("^(0x|0X)?[a-fA-F0-9]+$", spdk_cpu_mask)
824
797
 
@@ -591,7 +591,8 @@ def cluster_activate(cl_id, force=False, force_lvstore_create=False):
591
591
  if node.status == node.STATUS_ONLINE:
592
592
  online_nodes.append(node)
593
593
  for dev in node.nvme_devices:
594
- if dev.status == dev.STATUS_ONLINE:
594
+ if dev.status in [NVMeDevice.STATUS_ONLINE, NVMeDevice.STATUS_READONLY,
595
+ NVMeDevice.STATUS_CANNOT_ALLOCATE]:
595
596
  dev_count += 1
596
597
  minimum_devices = cluster.distr_ndcs + cluster.distr_npcs + 1
597
598
  if dev_count < minimum_devices:
@@ -723,20 +724,11 @@ def cluster_set_read_only(cl_id):
723
724
  for node in st:
724
725
  if node.status not in [StorageNode.STATUS_ONLINE, StorageNode.STATUS_SUSPENDED, StorageNode.STATUS_DOWN]:
725
726
  continue
726
-
727
- rpc_client = RPCClient(
728
- node.mgmt_ip, node.rpc_port,
729
- node.rpc_username, node.rpc_password, timeout=3, retry=2)
730
-
731
- if node.lvstore:
732
- rpc_client.bdev_lvol_set_lvs_read_only(node.lvstore, True)
733
- if node.secondary_node_id:
734
- sec_node = db_controller.get_storage_node_by_id(node.secondary_node_id)
735
- if sec_node:
736
- sec_rpc_client = RPCClient(
737
- sec_node.mgmt_ip, sec_node.rpc_port,
738
- sec_node.rpc_username, sec_node.rpc_password, timeout=3, retry=2)
739
- sec_rpc_client.bdev_lvol_set_lvs_read_only(node.lvstore, True)
727
+ for dev in node.nvme_devices:
728
+ if dev.status == NVMeDevice.STATUS_ONLINE:
729
+ # dev_stat = db_controller.get_device_stats(dev, 1)
730
+ # if dev_stat and dev_stat[0].size_util >= cluster.cap_crit:
731
+ device_controller.device_set_state(dev.get_id(), NVMeDevice.STATUS_CANNOT_ALLOCATE)
740
732
 
741
733
  return True
742
734
 
@@ -758,19 +750,12 @@ def cluster_set_active(cl_id):
758
750
  if node.status not in [StorageNode.STATUS_ONLINE, StorageNode.STATUS_SUSPENDED, StorageNode.STATUS_DOWN]:
759
751
  continue
760
752
 
761
- rpc_client = RPCClient(
762
- node.mgmt_ip, node.rpc_port,
763
- node.rpc_username, node.rpc_password, timeout=3, retry=2)
764
-
765
- if node.lvstore:
766
- rpc_client.bdev_lvol_set_lvs_read_only(node.lvstore, False)
767
- if node.secondary_node_id:
768
- sec_node = db_controller.get_storage_node_by_id(node.secondary_node_id)
769
- if sec_node:
770
- sec_rpc_client = RPCClient(
771
- sec_node.mgmt_ip, sec_node.rpc_port,
772
- sec_node.rpc_username, sec_node.rpc_password, timeout=3, retry=2)
773
- sec_rpc_client.bdev_lvol_set_lvs_read_only(node.lvstore, False)
753
+ for dev in node.nvme_devices:
754
+ if dev.status in [NVMeDevice.STATUS_CANNOT_ALLOCATE, NVMeDevice.STATUS_READONLY]:
755
+ dev_stat = db_controller.get_device_stats(dev, 1)
756
+ if dev_stat and dev_stat[0].size_util < cluster.cap_crit:
757
+ device_controller.device_set_online(dev.get_id())
758
+
774
759
  return True
775
760
 
776
761
 
@@ -1384,48 +1369,20 @@ def open_db_from_zip(fip_path):
1384
1369
 
1385
1370
 
1386
1371
 
1387
- def cluster_reset():
1388
- """
1389
-
1390
-
1391
- set -x
1392
-
1393
- CMD=$(ls ~/.local/bin/sbcli-* | awk '{n=split($0,a,"/"); print a[n]}')
1394
- cl=$($CMD cluster list | tail -n -3 | awk '{print $2}')
1395
-
1396
- #$CMD cluster graceful-shutdown $cl
1397
-
1398
- for sn_id in $($CMD sn list | grep / | awk '{print $2}'); do
1399
- $CMD -d sn shutdown --force $sn_id
1400
- done
1401
-
1402
- sudo mv /etc/foundationdb/fdb.cluster /etc/foundationdb/fdb.cluster.bck
1403
- for service_id in $(docker service ls | grep / | awk '{print $1}'); do
1404
- docker service update "$service_id" --force --detach
1405
- done
1406
-
1407
- # restore
1408
- fdb_cont=$(sudo docker ps | grep "app_fdb-server" | awk '{print $1}')
1409
- sudo docker rm --force $fdb_cont
1410
- sudo rm -rf /etc/foundationdb/data/*
1411
- fdbcli --exec "configure new single ssd ; writemode on ; clearrange \"\" \\xff" -C /etc/foundationdb/fdb.cluster.bck
1412
- BF=$(fdbbackup list -b file:///etc/foundationdb/backup/)
1413
- fdbrestore start -r "$BF" --dest-cluster-file /etc/foundationdb/fdb.cluster.bck -t fresh_deploy
1414
-
1415
- sudo mv /etc/foundationdb/fdb.cluster.bck /etc/foundationdb/fdb.cluster
1416
-
1417
- for service_id in $(docker service ls | grep / | awk '{print $1}'); do
1418
- docker service update "$service_id" --force --detach
1419
- done
1420
-
1421
- sleep 30
1422
- for sn_id in $($CMD sn list | grep / | awk '{print $2}'); do
1423
- $CMD -d sn shutdown --force $sn_id
1424
- done
1425
-
1426
- sleep 5
1427
- $CMD -d cluster graceful-startup $cl --clear-data
1372
+ def set(cl_id, attr, value):
1373
+ db_controller = DBController()
1374
+ cluster = db_controller.get_cluster_by_id(cl_id)
1375
+ if not cluster:
1376
+ logger.error(f"Cluster not found {cl_id}")
1377
+ return False
1428
1378
 
1429
- $CMD -d cluster activate $cl
1379
+ if attr in cluster.get_attrs_map():
1380
+ try:
1381
+ value = cluster.get_attrs_map()[attr]['type'](value)
1382
+ logger.info(f"Setting {attr} to {value}")
1383
+ setattr(cluster, attr, value)
1384
+ cluster.write_to_db()
1385
+ except:
1386
+ pass
1430
1387
 
1431
- """
1388
+ return True
@@ -66,18 +66,16 @@ GRAYLOG_CHECK_INTERVAL_SEC = 60
66
66
 
67
67
  FDB_CHECK_INTERVAL_SEC = 60
68
68
 
69
+ TASK_EXEC_INTERVAL_SEC = 10
70
+ TASK_EXEC_RETRY_COUNT = 8
69
71
 
70
-
72
+ SIMPLY_BLOCK_SPDK_CORE_IMAGE = "simplyblock/spdk-core:v24.05-tag-latest"
71
73
  SIMPLY_BLOCK_DOCKER_IMAGE = get_from_env_var_file(
72
74
  "SIMPLY_BLOCK_DOCKER_IMAGE","simplyblock/simplyblock:main")
73
75
  SIMPLY_BLOCK_CLI_NAME = get_from_env_var_file(
74
76
  "SIMPLY_BLOCK_COMMAND_NAME", "sbcli")
75
- TASK_EXEC_INTERVAL_SEC = 10
76
- TASK_EXEC_RETRY_COUNT = 8
77
- SIMPLY_BLOCK_SPDK_CORE_IMAGE = "simplyblock/spdk-core:v24.05-tag-latest"
78
-
79
-
80
- SIMPLY_BLOCK_SPDK_ULTRA_IMAGE = "simplyblock/spdk:main-latest"
77
+ SIMPLY_BLOCK_SPDK_ULTRA_IMAGE = get_from_env_var_file(
78
+ "SIMPLY_BLOCK_SPDK_ULTRA_IMAGE", " public.ecr.aws/simply-block/ultra:main-latest")
81
79
 
82
80
  GELF_PORT = 12202
83
81
 
@@ -125,11 +123,11 @@ LVOL_NVME_CONNECT_CTRL_LOSS_TMO=-1
125
123
  LVOL_NVME_CONNECT_NR_IO_QUEUES=6
126
124
  LVOL_NVME_CONNECT_TIMEOUT_S=10
127
125
  LVOL_NVME_KEEP_ALIVE_TO=3
126
+ LVOL_NVMF_PORT_START=9100
128
127
  QPAIR_COUNT=32
129
128
  NVME_TIMEOUT_US=20000000
130
129
 
131
130
  NVMF_MAX_SUBSYSTEMS=50000
132
131
  HA_JM_COUNT=3
133
132
 
134
- ONE_KB = 1024
135
133
  TEMP_CORES_FILE = "/etc/simplyblock/tmp_cores_config"
@@ -135,6 +135,7 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list, spdk_cpu_mask, spd
135
135
  snode.multipathing = multipathing
136
136
 
137
137
  # check for memory
138
+ spdk_mem_min = utils.parse_size('1GiB')
138
139
  if "memory_details" in node_info and node_info['memory_details']:
139
140
  memory_details = node_info['memory_details']
140
141
  logger.info("Node Memory info")
@@ -144,13 +145,11 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list, spdk_cpu_mask, spd
144
145
  logger.info(f"HP Total: {utils.humanbytes(huge_total)}")
145
146
  huge_free = memory_details['huge_free']
146
147
  logger.info(f"HP Free: {utils.humanbytes(huge_free)}")
147
- # if huge_free < 1 * 1024 * 1024:
148
- # logger.warning(f"Free hugepages are less than 1G: {utils.humanbytes(huge_free)}")
149
148
  if not spdk_mem:
150
- if huge_total > 1024 * 1024 * 1024:
149
+ if huge_total > spdk_mem_min:
151
150
  spdk_mem = huge_total
152
151
  else:
153
- logger.error(f"Free hugepages are less than 1G: {utils.humanbytes(huge_total)}")
152
+ logger.error(f"Free hugepages are less than {utils.humanbytes(spdk_mem_min)}: {utils.humanbytes(huge_total)}")
154
153
  return False
155
154
 
156
155
  logger.info(f"Deploying SPDK with HP: {utils.humanbytes(spdk_mem)}")
@@ -204,11 +203,11 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list, spdk_cpu_mask, spd
204
203
  snode.write_to_db(db_controller.kv_store)
205
204
  ssd_dev = nvme_devs[0]
206
205
 
207
- if spdk_mem < 1024*1024:
208
- logger.error("Hugepages must be larger than 1G")
206
+ if spdk_mem < spdk_mem_min:
207
+ logger.error(f"Hugepages must be larger than {utils.humanbytes(spdk_mem_min)}")
209
208
  return False
210
209
 
211
- mem = spdk_mem - 1024*1024*1024
210
+ mem = spdk_mem - spdk_mem_min
212
211
  snode.hugepages = mem
213
212
  logger.info(f"Hugepages to be used: {utils.humanbytes(mem)}")
214
213
 
@@ -273,7 +272,7 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list, spdk_cpu_mask, spd
273
272
  # create tmp ocf
274
273
  logger.info(f"Creating first ocf bdev...")
275
274
 
276
- ret = rpc_client.bdev_malloc_create("malloc_tmp", 512, int((100*1024*1024)/512))
275
+ ret = rpc_client.bdev_malloc_create("malloc_tmp", 512, int(utils.parse_size('100MiB')/512))
277
276
  if not ret:
278
277
  logger.error("Failed ot create tmp malloc")
279
278
  return False
@@ -356,7 +355,7 @@ def recreate(node_id):
356
355
  # create tmp ocf
357
356
  logger.info(f"Creating first ocf bdev...")
358
357
 
359
- ret = rpc_client.bdev_malloc_create("malloc_tmp", 512, int((100 * 1024 * 1024) / 512))
358
+ ret = rpc_client.bdev_malloc_create("malloc_tmp", 512, int(utils.parse_size('100MiB') / 512))
360
359
  if not ret:
361
360
  logger.error("Failed ot create tmp malloc")
362
361
  return False
@@ -30,7 +30,7 @@ def cluster_status_change(cluster, new_state, old_status):
30
30
 
31
31
 
32
32
  def _cluster_cap_event(cluster, msg, event_level):
33
- ec.log_event_cluster(
33
+ return ec.log_event_cluster(
34
34
  cluster_id=cluster.get_id(),
35
35
  node_id=cluster.get_id(),
36
36
  domain=ec.DOMAIN_CLUSTER,
@@ -43,26 +43,26 @@ def _cluster_cap_event(cluster, msg, event_level):
43
43
 
44
44
  def cluster_cap_warn(cluster, util):
45
45
  msg = f"Cluster absolute capacity reached: {util}%"
46
- _cluster_cap_event(cluster, msg, event_level=EventObj.LEVEL_WARN)
46
+ return _cluster_cap_event(cluster, msg, event_level=EventObj.LEVEL_WARN)
47
47
 
48
48
 
49
49
  def cluster_cap_crit(cluster, util):
50
50
  msg = f"Cluster absolute capacity reached: {util}%"
51
- _cluster_cap_event(cluster, msg, event_level=EventObj.LEVEL_CRITICAL)
51
+ return _cluster_cap_event(cluster, msg, event_level=EventObj.LEVEL_CRITICAL)
52
52
 
53
53
 
54
54
  def cluster_prov_cap_warn(cluster, util):
55
55
  msg = f"Cluster provisioned capacity reached: {util}%"
56
- _cluster_cap_event(cluster, msg, event_level=EventObj.LEVEL_WARN)
56
+ return _cluster_cap_event(cluster, msg, event_level=EventObj.LEVEL_WARN)
57
57
 
58
58
 
59
59
  def cluster_prov_cap_crit(cluster, util):
60
60
  msg = f"Cluster provisioned capacity reached: {util}%"
61
- _cluster_cap_event(cluster, msg, event_level=EventObj.LEVEL_CRITICAL)
61
+ return _cluster_cap_event(cluster, msg, event_level=EventObj.LEVEL_CRITICAL)
62
62
 
63
63
 
64
64
  def cluster_delete(cluster):
65
- ec.log_event_cluster(
65
+ return ec.log_event_cluster(
66
66
  cluster_id=cluster.get_id(),
67
67
  domain=ec.DOMAIN_CLUSTER,
68
68
  event=ec.EVENT_OBJ_DELETED,
@@ -658,9 +658,8 @@ def add_device(device_id):
658
658
 
659
659
  snodes = db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id)
660
660
  for node in snodes:
661
- if node.status != StorageNode.STATUS_ONLINE:
662
- continue
663
- distr_controller.send_cluster_map_add_device(device_obj, node)
661
+ if node.status in [StorageNode.STATUS_ONLINE, StorageNode.STATUS_DOWN]:
662
+ distr_controller.send_cluster_map_add_device(device_obj, node)
664
663
 
665
664
  tasks_controller.add_new_device_mig_task(device_id)
666
665
  return device_id
@@ -101,6 +101,7 @@ def log_event_cluster(cluster_id, domain, event, db_object, caused_by, message,
101
101
 
102
102
  db_controller = DBController()
103
103
  ds.write_to_db(db_controller.kv_store)
104
+ return ds.to_dict()
104
105
 
105
106
 
106
107
  def log_event_based_on_level(cluster_id, event, db_object, message, caused_by, event_level):
@@ -89,7 +89,7 @@ def validate_add_lvol_func(name, size, host_id_or_name, pool_id_or_name,
89
89
  return False, "Name can not be empty"
90
90
 
91
91
  # size validation
92
- if size < 100 * 1024 * 1024:
92
+ if size < utils.parse_size('100MiB'):
93
93
  return False, "Size must be larger than 100M"
94
94
 
95
95
  # host validation
@@ -466,7 +466,7 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
466
466
  "name": lvol.lvol_bdev,
467
467
  "params": {
468
468
  "name": lvol.lvol_bdev,
469
- "size_in_mib": int(lvol.size / (constants.ONE_KB * constants.ONE_KB)),
469
+ "size_in_mib": utils.convert_size(lvol.size, 'MiB'),
470
470
  "lvs_name": lvol.lvs_name,
471
471
  "lvol_priority_class": 0
472
472
  }
@@ -1175,8 +1175,6 @@ def resize_lvol(id, new_size):
1175
1175
  logger.error(f"Pool is disabled")
1176
1176
  return False
1177
1177
 
1178
- new_size = utils.parse_size(new_size)
1179
-
1180
1178
  if lvol.size >= new_size:
1181
1179
  logger.error(f"New size {new_size} must be higher than the original size {lvol.size}")
1182
1180
  return False
@@ -1201,7 +1199,7 @@ def resize_lvol(id, new_size):
1201
1199
  logger.info(f"Resizing LVol: {lvol.get_id()}")
1202
1200
  logger.info(f"Current size: {utils.humanbytes(lvol.size)}, new size: {utils.humanbytes(new_size)}")
1203
1201
 
1204
- size_in_mib = int(new_size / (constants.ONE_KB * constants.ONE_KB))
1202
+ size_in_mib = utils.convert_size(new_size, 'MiB')
1205
1203
 
1206
1204
  rpc_client = RPCClient(
1207
1205
  snode.mgmt_ip, snode.rpc_port, snode.rpc_username, snode.rpc_password)