sbcli-dev 17.2.4__tar.gz → 17.2.6__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 (159) hide show
  1. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/PKG-INFO +1 -1
  2. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/sbcli_dev.egg-info/PKG-INFO +1 -1
  3. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/sbcli_dev.egg-info/SOURCES.txt +1 -0
  4. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/constants.py +1 -0
  5. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/lvol_controller.py +6 -2
  6. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/db_controller.py +5 -5
  7. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/env_var +1 -1
  8. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/docker-compose-swarm.yml +3 -0
  9. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/capacity_and_stats_collector.py +122 -1
  10. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/lvol_stat_collector.py +25 -2
  11. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/storage_node_monitor.py +1 -1
  12. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/utils.py +1 -1
  13. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/app.py +2 -7
  14. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/auth_middleware.py +2 -1
  15. sbcli_dev-17.2.6/simplyblock_web/blueprints/web_api_metrics.py +27 -0
  16. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/README.md +0 -0
  17. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/pyproject.toml +0 -0
  18. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/requirements.txt +0 -0
  19. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/sbcli_dev.egg-info/dependency_links.txt +0 -0
  20. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/sbcli_dev.egg-info/entry_points.txt +0 -0
  21. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/sbcli_dev.egg-info/requires.txt +0 -0
  22. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/sbcli_dev.egg-info/top_level.txt +0 -0
  23. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/setup.cfg +0 -0
  24. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/setup.py +0 -0
  25. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_cli/__init__.py +0 -0
  26. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_cli/cli.py +0 -0
  27. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_cli/clibase.py +0 -0
  28. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_cli/main.py +0 -0
  29. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/__init__.py +0 -0
  30. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/cluster_ops.py +0 -0
  31. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/cnode_client.py +0 -0
  32. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/__init__.py +0 -0
  33. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  34. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/cluster_events.py +0 -0
  35. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/device_controller.py +0 -0
  36. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/device_events.py +0 -0
  37. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/events_controller.py +0 -0
  38. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/health_controller.py +0 -0
  39. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/lvol_events.py +0 -0
  40. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/mgmt_events.py +0 -0
  41. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/pool_controller.py +0 -0
  42. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/pool_events.py +0 -0
  43. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  44. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/snapshot_events.py +0 -0
  45. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/storage_events.py +0 -0
  46. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/tasks_controller.py +0 -0
  47. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/tasks_events.py +0 -0
  48. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
  49. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/distr_controller.py +0 -0
  50. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/mgmt_node_ops.py +0 -0
  51. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/__init__.py +0 -0
  52. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/base_model.py +0 -0
  53. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/caching_node.py +0 -0
  54. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/cluster.py +0 -0
  55. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/deployer.py +0 -0
  56. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/events.py +0 -0
  57. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/iface.py +0 -0
  58. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/job_schedule.py +0 -0
  59. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/lvol_model.py +0 -0
  60. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/mgmt_node.py +0 -0
  61. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/nvme_device.py +0 -0
  62. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/pool.py +0 -0
  63. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/port_stat.py +0 -0
  64. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/snapshot.py +0 -0
  65. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/stats.py +0 -0
  66. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/models/storage_node.py +0 -0
  67. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/pci_utils.py +0 -0
  68. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/rpc_client.py +0 -0
  69. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/__init__.py +0 -0
  70. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  71. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  72. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  73. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/config_docker.sh +0 -0
  74. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/dashboard.yml +0 -0
  75. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  76. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  77. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  78. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  79. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  80. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  81. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/datasource.yml +0 -0
  82. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/db_config_double.sh +0 -0
  83. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/db_config_single.sh +0 -0
  84. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
  85. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  86. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  87. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/foundation.yml +0 -0
  88. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/haproxy.cfg +0 -0
  89. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/install_deps.sh +0 -0
  90. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/objstore.yml +0 -0
  91. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
  92. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/prometheus.yml +0 -0
  93. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/run_ssh.sh +0 -0
  94. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/set_db_config.sh +0 -0
  95. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  96. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/__init__.py +0 -0
  97. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  98. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/caching_node_monitor.py +0 -0
  99. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/cap_monitor.py +0 -0
  100. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/device_monitor.py +0 -0
  101. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/health_check_service.py +0 -0
  102. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/install_service.sh +0 -0
  103. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/lvol_monitor.py +0 -0
  104. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  105. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  106. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/new_device_discovery.py +0 -0
  107. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/remove_service.sh +0 -0
  108. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/service_template.service +0 -0
  109. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/spdk/__init__.py +0 -0
  110. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/spdk/client.py +0 -0
  111. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
  112. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/spdk_stats_collector.py +0 -0
  113. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  114. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  115. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  116. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  117. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  118. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/shell_utils.py +0 -0
  119. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/snode_client.py +0 -0
  120. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/storage_node_ops.py +0 -0
  121. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/test/test_utils.py +0 -0
  122. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
  123. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/README.md +0 -0
  124. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/__init__.py +0 -0
  125. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/__init__.py +0 -0
  126. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  127. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  128. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  129. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  130. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  131. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/snode_ops.py +0 -0
  132. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  133. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
  134. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  135. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  136. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  137. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_device.py +0 -0
  138. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  139. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  140. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  141. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  142. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  143. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/node_utils.py +0 -0
  144. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/node_utils_k8s.py +0 -0
  145. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/node_webapp.py +0 -0
  146. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/requirements.txt +0 -0
  147. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
  148. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/delete.py +0 -0
  149. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/deploy.py +0 -0
  150. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  151. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  152. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/is_up.py +0 -0
  153. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/list_deps.py +0 -0
  154. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/rpac.yaml +0 -0
  155. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/swagger.yaml +0 -0
  156. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/static/tst.py +0 -0
  157. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  158. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  159. {sbcli_dev-17.2.4 → sbcli_dev-17.2.6}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sbcli-dev
3
- Version: 17.2.4
3
+ Version: 17.2.6
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: 17.2.4
3
+ Version: 17.2.6
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -138,6 +138,7 @@ simplyblock_web/blueprints/web_api_cluster.py
138
138
  simplyblock_web/blueprints/web_api_deployer.py
139
139
  simplyblock_web/blueprints/web_api_device.py
140
140
  simplyblock_web/blueprints/web_api_lvol.py
141
+ simplyblock_web/blueprints/web_api_metrics.py
141
142
  simplyblock_web/blueprints/web_api_mgmt_node.py
142
143
  simplyblock_web/blueprints/web_api_pool.py
143
144
  simplyblock_web/blueprints/web_api_snapshot.py
@@ -132,3 +132,4 @@ HA_JM_COUNT=3
132
132
  SENTRY_SDK_DNS = "https://745047b017ac424b4173550e19910fb7@o4508953941311488.ingest.de.sentry.io/4508996361584720"
133
133
  ONE_KB = 1024
134
134
  TEMP_CORES_FILE = "/etc/simplyblock/tmp_cores_config"
135
+ PROMETHEUS_MULTIPROC_DIR = "/etc/simplyblock/metrics"
@@ -806,7 +806,6 @@ def _remove_bdev_stack(bdev_stack, rpc_client):
806
806
  logger.error(f"Failed to delete BDev {name}")
807
807
 
808
808
  bdev['status'] = 'deleted'
809
- time.sleep(1)
810
809
  return True
811
810
 
812
811
 
@@ -818,7 +817,7 @@ def delete_lvol_from_node(lvol_id, node_id, clear_data=True):
818
817
  return True
819
818
 
820
819
  logger.info(f"Deleting LVol:{lvol.get_id()} from node:{snode.get_id()}")
821
- rpc_client = RPCClient(snode.mgmt_ip, snode.rpc_port, snode.rpc_username, snode.rpc_password)
820
+ rpc_client = RPCClient(snode.mgmt_ip, snode.rpc_port, snode.rpc_username, snode.rpc_password, timeout=5, retry=2)
822
821
 
823
822
  # 1- remove subsystem
824
823
  if rpc_client.subsystem_list(lvol.nqn):
@@ -845,6 +844,11 @@ def delete_lvol(id_or_name, force_delete=False):
845
844
  logger.error(f"lvol not found: {id_or_name}")
846
845
  return False
847
846
 
847
+ if lvol.status == LVol.STATUS_IN_DELETION:
848
+ logger.info(f"lvol:{lvol.get_id()} status is in deletion")
849
+ if not force_delete:
850
+ return False
851
+
848
852
  pool = db_controller.get_pool_by_id(lvol.pool_uuid)
849
853
  if pool.status == Pool.STATUS_INACTIVE:
850
854
  logger.error(f"Pool is disabled")
@@ -136,7 +136,7 @@ class DBController(metaclass=Singleton):
136
136
  def get_lvols(self, cluster_id=None) -> List[LVol]:
137
137
  lvols = self.get_all_lvols()
138
138
  if not cluster_id:
139
- return sorted(lvols, key=lambda x: x.create_dt)
139
+ return lvols
140
140
 
141
141
  node_ids=[]
142
142
  cluster_lvols = []
@@ -147,7 +147,7 @@ class DBController(metaclass=Singleton):
147
147
  if lvol.node_id in node_ids:
148
148
  cluster_lvols.append(lvol)
149
149
 
150
- return sorted(cluster_lvols, key=lambda x: x.create_dt)
150
+ return cluster_lvols
151
151
 
152
152
  def get_all_lvols(self) -> List[LVol]:
153
153
  lvols = LVol().read_from_db(self.kv_store)
@@ -177,9 +177,9 @@ class DBController(metaclass=Singleton):
177
177
  return ret[0]
178
178
 
179
179
  def get_lvol_by_id(self, id) -> LVol:
180
- for lvol in self.get_lvols():
181
- if lvol.get_id() == id:
182
- return lvol
180
+ lvols = LVol().read_from_db(self.kv_store, id=id)
181
+ if lvols:
182
+ return lvols[0]
183
183
 
184
184
  def get_lvol_by_name(self, lvol_name) -> LVol:
185
185
  for lvol in self.get_lvols():
@@ -1,5 +1,5 @@
1
1
  SIMPLY_BLOCK_COMMAND_NAME=sbcli-dev
2
- SIMPLY_BLOCK_VERSION=17.2.4
2
+ SIMPLY_BLOCK_VERSION=17.2.6
3
3
 
4
4
  SIMPLY_BLOCK_DOCKER_IMAGE=public.ecr.aws/simply-block/simplyblock:main
5
5
  SIMPLY_BLOCK_SPDK_ULTRA_IMAGE=public.ecr.aws/simply-block/ultra:main-latest
@@ -60,6 +60,7 @@ services:
60
60
  constraints: [node.role == manager]
61
61
  volumes:
62
62
  - "/etc/foundationdb:/etc/foundationdb"
63
+ - "/etc/simplyblock:/etc/simplyblock"
63
64
  environment:
64
65
  SIMPLYBLOCK_LOG_LEVEL: "$LOG_LEVEL"
65
66
  FLASK_DEBUG: "False"
@@ -112,6 +113,7 @@ services:
112
113
  constraints: [node.role == manager]
113
114
  volumes:
114
115
  - "/etc/foundationdb:/etc/foundationdb"
116
+ - "/etc/simplyblock:/etc/simplyblock"
115
117
  networks:
116
118
  - hostnet
117
119
  environment:
@@ -169,6 +171,7 @@ services:
169
171
  constraints: [node.role == manager]
170
172
  volumes:
171
173
  - "/etc/foundationdb:/etc/foundationdb"
174
+ - "/etc/simplyblock:/etc/simplyblock"
172
175
  networks:
173
176
  - hostnet
174
177
  environment:
@@ -1,12 +1,16 @@
1
1
  # coding=utf-8
2
+ import os
2
3
  import time
3
4
 
4
- from simplyblock_core import constants, db_controller, utils
5
+ from simplyblock_core import constants, db_controller, utils, shell_utils
5
6
  from simplyblock_core.models.nvme_device import NVMeDevice
6
7
  from simplyblock_core.models.storage_node import StorageNode
7
8
  from simplyblock_core.rpc_client import RPCClient
8
9
  from simplyblock_core.models.stats import DeviceStatObject, NodeStatObject, ClusterStatObject
9
10
 
11
+ PROMETHEUS_MULTIPROC_DIR = constants.PROMETHEUS_MULTIPROC_DIR
12
+ os.environ["PROMETHEUS_MULTIPROC_DIR"] = PROMETHEUS_MULTIPROC_DIR
13
+ from prometheus_client import Gauge, CollectorRegistry, multiprocess
10
14
 
11
15
  logger = utils.get_logger(__name__)
12
16
 
@@ -83,6 +87,18 @@ def add_device_stats(cl, device, capacity_dict, stats_dict):
83
87
  stat_obj = DeviceStatObject(data=data)
84
88
  stat_obj.write_to_db(db_controller.kv_store)
85
89
  last_object_record[device.get_id()] = stat_obj
90
+
91
+ ng = get_device_metrics()
92
+ for g in ng:
93
+ v = g.replace("device_", "")
94
+ if v in data:
95
+ ng[g].labels(cluster=cl.get_id(), node_ip=node.get_id(), device_id=device.get_id()).set(data[v])
96
+ elif v == "status_code":
97
+ ng[g].labels(cluster=cl.get_id(), node_ip=node.get_id(), device_id=device.get_id()).set(device.get_status_code())
98
+ elif v == "health_check":
99
+ ng[g].labels(cluster=cl.get_id(), node_ip=node.get_id(), device_id=device.get_id()).set(device.health_check)
100
+
101
+
86
102
  return stat_obj
87
103
 
88
104
 
@@ -116,6 +132,17 @@ def add_node_stats(node, records):
116
132
  })
117
133
  stat_obj = NodeStatObject(data=data)
118
134
  stat_obj.write_to_db(db_controller.kv_store)
135
+
136
+ ng = get_snode_metrics()
137
+ for g in ng:
138
+ v = g.replace("snode_", "")
139
+ if v in data:
140
+ ng[g].labels(cluster=cl.get_id(), node_ip=node.get_id()).set(data[v])
141
+ elif v == "status_code":
142
+ ng[g].labels(cluster=cl.get_id(), node_ip=node.get_id()).set(node.get_status_code())
143
+ elif v == "health_check":
144
+ ng[g].labels(cluster=cl.get_id(), node_ip=node.get_id()).set(node.health_check)
145
+
119
146
  return stat_obj
120
147
 
121
148
 
@@ -144,9 +171,103 @@ def add_cluster_stats(cl, records):
144
171
 
145
172
  stat_obj = ClusterStatObject(data=data)
146
173
  stat_obj.write_to_db(db_controller.kv_store)
174
+
175
+ ng = get_cluster_metrics()
176
+ for g in ng:
177
+ v = g.replace("cluster_", "")
178
+ if v in data:
179
+ ng[g].labels(cluster=cl.get_id()).set(data[v])
180
+ elif v == "status_code":
181
+ ng[g].labels(cluster=cl.get_id()).set(cl.get_status_code())
182
+
147
183
  return stat_obj
148
184
 
149
185
 
186
+ if os.path.exists(PROMETHEUS_MULTIPROC_DIR):
187
+ shell_utils.run_command(f"rm -rf {PROMETHEUS_MULTIPROC_DIR}")
188
+ os.makedirs(PROMETHEUS_MULTIPROC_DIR, exist_ok=True)
189
+
190
+ registry = CollectorRegistry()
191
+ multiprocess.MultiProcessCollector(registry)
192
+
193
+ io_stats_keys = [
194
+ "date",
195
+ "read_bytes",
196
+ "read_bytes_ps",
197
+ "read_io_ps",
198
+ "read_io",
199
+ "read_latency_ps",
200
+ "write_bytes",
201
+ "write_bytes_ps",
202
+ "write_io",
203
+ "write_io_ps",
204
+ "write_latency_ps",
205
+ "size_total",
206
+ "size_prov",
207
+ "size_used",
208
+ "size_free",
209
+ "size_util",
210
+ "size_prov_util",
211
+ "read_latency_ticks",
212
+ "record_duration",
213
+ "record_end_time",
214
+ "record_start_time",
215
+ "unmap_bytes",
216
+ "unmap_bytes_ps",
217
+ "unmap_io",
218
+ "unmap_io_ps",
219
+ "unmap_latency_ps",
220
+ "unmap_latency_ticks",
221
+ "write_latency_ticks",
222
+ ]
223
+
224
+ ng = {}
225
+ cg = {}
226
+ dg = {}
227
+ lg = {}
228
+ pg = {}
229
+
230
+ def get_device_metrics():
231
+ global dg
232
+ if not dg:
233
+ labels = ['cluster', "node_ip", "device_id"]
234
+ for k in io_stats_keys + ["status_code", "health_check"]:
235
+ dg["device_" + k] = Gauge("device_" + k, "device_" + k, labelnames=labels, registry=registry)
236
+ return dg
237
+
238
+ def get_lvol_metrics():
239
+ global lg
240
+ if not lg:
241
+ labels = ['cluster', "pool", "lvol"]
242
+ for k in io_stats_keys + ["status_code", "health_check"]:
243
+ lg["lvol_" + k] = Gauge("lvol_" + k, "lvol_" + k, labelnames=labels, registry=registry)
244
+ return lg
245
+
246
+ def get_pool_metrics():
247
+ global pg
248
+ if not pg:
249
+ labels = ['cluster', "pool", "name"]
250
+ for k in io_stats_keys + ["status_code", "health_check"]:
251
+ pg["pool_" + k] = Gauge("pool_" + k, "pool_" + k, labelnames=labels, registry=registry)
252
+ return pg
253
+
254
+ def get_snode_metrics():
255
+ global ng
256
+ if not ng:
257
+ labels = ['cluster', "node_ip"]
258
+ for k in io_stats_keys + ["status_code", "health_check"]:
259
+ ng["snode_" + k] = Gauge("snode_" + k, "snode_" + k, labelnames=labels, registry=registry)
260
+ return ng
261
+
262
+ def get_cluster_metrics():
263
+ global cg
264
+ if not cg:
265
+ labels = ['cluster']
266
+ for k in io_stats_keys + ["status_code"]:
267
+ cg["cluster_" + k] = Gauge("cluster_" + k, "cluster_" + k, labelnames=labels, registry=registry)
268
+ return cg
269
+
270
+
150
271
 
151
272
  # get DB controller
152
273
  db_controller = db_controller.DBController()
@@ -8,7 +8,7 @@ from simplyblock_core.models.lvol_model import LVol
8
8
  from simplyblock_core.models.stats import LVolStatObject, PoolStatObject
9
9
  from simplyblock_core.models.storage_node import StorageNode
10
10
  from simplyblock_core.rpc_client import RPCClient
11
-
11
+ from simplyblock_core.services.capacity_and_stats_collector import get_lvol_metrics, get_pool_metrics
12
12
 
13
13
  logger = utils.get_logger(__name__)
14
14
 
@@ -48,7 +48,7 @@ def add_lvol_stats(cluster, lvol, stats_list, capacity_dict=None):
48
48
  size_used = 0
49
49
  lvol_dict = capacity_dict
50
50
  size_total = int(lvol_dict['num_blocks']*lvol_dict['block_size'])
51
- cluster_size = cluster.distr_ndcs * cluster.page_size_in_blocks
51
+ cluster_size = cluster.page_size_in_blocks
52
52
  if "driver_specific" in lvol_dict and "lvol" in lvol_dict["driver_specific"]:
53
53
  num_allocated_clusters = lvol_dict["driver_specific"]["lvol"]["num_allocated_clusters"]
54
54
  size_used = int(num_allocated_clusters*cluster_size)
@@ -155,6 +155,17 @@ def add_lvol_stats(cluster, lvol, stats_list, capacity_dict=None):
155
155
  stat_obj = LVolStatObject(data=data)
156
156
  stat_obj.write_to_db(db_controller.kv_store)
157
157
  last_object_record[lvol.get_id()] = stat_obj
158
+
159
+ ng = get_lvol_metrics()
160
+ for g in ng:
161
+ v = g.replace("lvol_", "")
162
+ if v in data:
163
+ ng[g].labels(cluster=cluster.get_id(), lvol=lvol.get_id(), pool=lvol.pool_name).set(data[v])
164
+ elif v == "status_code":
165
+ ng[g].labels(cluster=cluster.get_id(), lvol=lvol.get_id(), pool=lvol.pool_name).set(lvol.get_status_code())
166
+ elif v == "health_check":
167
+ ng[g].labels(cluster=cluster.get_id(), lvol=lvol.get_id(), pool=lvol.pool_name).set(lvol.health_check)
168
+
158
169
  return stat_obj
159
170
 
160
171
 
@@ -174,6 +185,18 @@ def add_pool_stats(pool, records):
174
185
 
175
186
  stat_obj = PoolStatObject(data=data)
176
187
  stat_obj.write_to_db(db_controller.kv_store)
188
+
189
+ ng = get_pool_metrics()
190
+ for g in ng:
191
+ v = g.replace("pool_", "")
192
+ if v in data:
193
+ ng[g].labels(cluster=cluster.get_id(), name=pool.pool_name, pool=pool.get_id()).set(data[v])
194
+ elif v == "status_code":
195
+ ng[g].labels(cluster=cluster.get_id(), name=pool.pool_name, pool=pool.get_id()).set(pool.get_status_code())
196
+ elif v == "health_check":
197
+ ng[g].labels(cluster=cluster.get_id(), name=pool.pool_name, pool=pool.get_id()).set(pool.health_check)
198
+
199
+
177
200
  return stat_obj
178
201
 
179
202
 
@@ -261,7 +261,7 @@ while True:
261
261
  if snode.status == StorageNode.STATUS_SCHEDULABLE and not ping_check and not node_api_check:
262
262
  continue
263
263
 
264
- spdk_process = True
264
+ spdk_process = False
265
265
  if node_api_check:
266
266
  # 3- check spdk_process
267
267
  spdk_process = health_controller._check_spdk_process_up(snode.mgmt_ip, snode.rpc_port)
@@ -115,7 +115,7 @@ _humanbytes_parameter = {
115
115
 
116
116
  def humanbytes(size: int, mode: str = 'si') -> str:
117
117
  """Return the given bytes as a human friendly including the appropriate unit."""
118
- if not size:
118
+ if not size or size < 0:
119
119
  return '0 B'
120
120
 
121
121
  base, exponent, log, infix = _humanbytes_parameter[mode]
@@ -7,11 +7,9 @@ from flask import Flask
7
7
  import utils
8
8
  from blueprints import web_api_cluster, web_api_mgmt_node, web_api_device, \
9
9
  web_api_lvol, web_api_storage_node, web_api_pool, web_api_caching_node, \
10
- web_api_snapshot, web_api_deployer, swagger_ui_blueprint
10
+ web_api_snapshot, web_api_deployer, swagger_ui_blueprint, web_api_metrics
11
11
  from auth_middleware import token_required
12
12
  from simplyblock_core import constants, utils as core_utils
13
- from werkzeug.middleware.dispatcher import DispatcherMiddleware
14
- from prometheus_client import make_wsgi_app
15
13
 
16
14
  logger = core_utils.get_logger(__name__)
17
15
 
@@ -35,6 +33,7 @@ app.register_blueprint(web_api_pool.bp)
35
33
  app.register_blueprint(web_api_caching_node.bp)
36
34
  app.register_blueprint(web_api_deployer.bp)
37
35
  app.register_blueprint(swagger_ui_blueprint.bp, url_prefix=swagger_ui_blueprint.SWAGGER_URL)
36
+ app.register_blueprint(web_api_metrics.bp)
38
37
 
39
38
 
40
39
  @app.before_request
@@ -48,10 +47,6 @@ def status():
48
47
  return utils.get_response("Live")
49
48
 
50
49
 
51
- app.wsgi_app = DispatcherMiddleware(app.wsgi_app, {
52
- '/cluster/metrics': make_wsgi_app()
53
- })
54
-
55
50
  app.config['JSONIFY_PRETTYPRINT_REGULAR'] = True
56
51
  if __name__ == '__main__':
57
52
  logging.getLogger('werkzeug').setLevel(constants.LOG_WEB_LEVEL)
@@ -12,7 +12,8 @@ def token_required(f):
12
12
  @wraps(f)
13
13
  def decorated(*args, **kwargs):
14
14
 
15
- if request.method == "GET" and request.path.startswith("/swagger"):
15
+ if request.method == "GET" and [request.path.startswith("/swagger") or
16
+ request.path.startswith("/cluster/metrics")]:
16
17
  return f(*args, **kwargs)
17
18
 
18
19
  cluster_id = None
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env python
2
+ # encoding: utf-8
3
+ import json
4
+ import logging
5
+ import os
6
+
7
+ from flask import Blueprint
8
+ from simplyblock_core import constants
9
+
10
+ PROMETHEUS_MULTIPROC_DIR = constants.PROMETHEUS_MULTIPROC_DIR
11
+ os.environ["PROMETHEUS_MULTIPROC_DIR"] = PROMETHEUS_MULTIPROC_DIR
12
+
13
+ from prometheus_client import generate_latest, multiprocess
14
+ from flask import Response
15
+ from prometheus_client import CollectorRegistry
16
+
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+ bp = Blueprint("metrics", __name__)
21
+
22
+ registry = CollectorRegistry()
23
+ multiprocess.MultiProcessCollector(registry)
24
+
25
+ @bp.route('/cluster/metrics', methods=['GET'])
26
+ def get_data():
27
+ return Response(generate_latest(registry), mimetype=str('text/plain; version=0.0.4; charset=utf-8'))
File without changes
File without changes
File without changes
File without changes
File without changes