sbcli-hmdi 0.0.34__tar.gz → 0.0.35__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/PKG-INFO +1 -1
  2. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/sbcli_hmdi.egg-info/PKG-INFO +1 -1
  3. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/sbcli_hmdi.egg-info/SOURCES.txt +3 -0
  4. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_cli/cli.py +1 -1
  5. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/env_var +1 -1
  6. sbcli_hmdi-0.0.35/simplyblock_core/services/spdk/client.py +281 -0
  7. sbcli_hmdi-0.0.35/simplyblock_core/services/spdk_stats_collector.py +37 -0
  8. sbcli_hmdi-0.0.35/simplyblock_web/blueprints/__init__.py +0 -0
  9. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/README.md +0 -0
  10. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/pyproject.toml +0 -0
  11. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/requirements.txt +0 -0
  12. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/sbcli_hmdi.egg-info/dependency_links.txt +0 -0
  13. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/sbcli_hmdi.egg-info/entry_points.txt +0 -0
  14. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/sbcli_hmdi.egg-info/requires.txt +0 -0
  15. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/sbcli_hmdi.egg-info/top_level.txt +0 -0
  16. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/setup.cfg +0 -0
  17. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/setup.py +0 -0
  18. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_cli/__init__.py +0 -0
  19. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_cli/main.py +0 -0
  20. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/__init__.py +0 -0
  21. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/cluster_ops.py +0 -0
  22. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/cnode_client.py +0 -0
  23. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/constants.py +0 -0
  24. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/__init__.py +0 -0
  25. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  26. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/cluster_events.py +0 -0
  27. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/device_controller.py +0 -0
  28. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/device_events.py +0 -0
  29. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/events_controller.py +0 -0
  30. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/health_controller.py +0 -0
  31. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/lvol_controller.py +0 -0
  32. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/lvol_events.py +0 -0
  33. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/mgmt_events.py +0 -0
  34. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/pool_controller.py +0 -0
  35. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/pool_events.py +0 -0
  36. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  37. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/snapshot_events.py +0 -0
  38. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/storage_events.py +0 -0
  39. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/tasks_controller.py +0 -0
  40. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/controllers/tasks_events.py +0 -0
  41. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/db_controller.py +0 -0
  42. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/distr_controller.py +0 -0
  43. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/mgmt_node_ops.py +0 -0
  44. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/__init__.py +0 -0
  45. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/base_model.py +0 -0
  46. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/caching_node.py +0 -0
  47. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/cluster.py +0 -0
  48. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/deployer.py +0 -0
  49. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/events.py +0 -0
  50. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/iface.py +0 -0
  51. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/job_schedule.py +0 -0
  52. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/lvol_model.py +0 -0
  53. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/mgmt_node.py +0 -0
  54. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/nvme_device.py +0 -0
  55. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/pool.py +0 -0
  56. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/port_stat.py +0 -0
  57. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/snapshot.py +0 -0
  58. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/stats.py +0 -0
  59. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/models/storage_node.py +0 -0
  60. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/pci_utils.py +0 -0
  61. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/rpc_client.py +0 -0
  62. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/__init__.py +0 -0
  63. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  64. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  65. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  66. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/config_docker.sh +0 -0
  67. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/dashboard.yml +0 -0
  68. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  69. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  70. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  71. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  72. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  73. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  74. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/datasource.yml +0 -0
  75. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/db_config_double.sh +0 -0
  76. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/db_config_single.sh +0 -0
  77. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
  78. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  79. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  80. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  81. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/foundation.yml +0 -0
  82. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/haproxy.cfg +0 -0
  83. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/install_deps.sh +0 -0
  84. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/objstore.yml +0 -0
  85. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
  86. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/prometheus.yml +0 -0
  87. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/run_ssh.sh +0 -0
  88. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/set_db_config.sh +0 -0
  89. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  90. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/__init__.py +0 -0
  91. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  92. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/caching_node_monitor.py +0 -0
  93. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/cap_monitor.py +0 -0
  94. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  95. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/device_monitor.py +0 -0
  96. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/health_check_service.py +0 -0
  97. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/install_service.sh +0 -0
  98. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/log_agg_service.py +0 -0
  99. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/lvol_monitor.py +0 -0
  100. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  101. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  102. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  103. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/new_device_discovery.py +0 -0
  104. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/port_stat_collector.py +0 -0
  105. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/remove_service.sh +0 -0
  106. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/service_template.service +0 -0
  107. {sbcli_hmdi-0.0.34/simplyblock_web → sbcli_hmdi-0.0.35/simplyblock_core/services/spdk}/__init__.py +0 -0
  108. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
  109. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/storage_node_monitor.py +0 -0
  110. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  111. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  112. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  113. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  114. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  115. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/shell_utils.py +0 -0
  116. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/snode_client.py +0 -0
  117. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/storage_node_ops.py +0 -0
  118. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/utils.py +0 -0
  119. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
  120. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/README.md +0 -0
  121. {sbcli_hmdi-0.0.34/simplyblock_web/blueprints → sbcli_hmdi-0.0.35/simplyblock_web}/__init__.py +0 -0
  122. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/app.py +0 -0
  123. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/auth_middleware.py +0 -0
  124. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  125. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  126. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  127. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  128. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  129. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/snode_ops.py +0 -0
  130. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  131. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  132. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  133. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  134. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_device.py +0 -0
  135. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  136. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  137. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  138. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  139. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  140. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/caching_node_app.py +0 -0
  141. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/caching_node_app_k8s.py +0 -0
  142. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/node_utils.py +0 -0
  143. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/node_webapp.py +0 -0
  144. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/requirements.txt +0 -0
  145. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/snode_app.py +0 -0
  146. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/snode_app_k8s.py +0 -0
  147. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/static/delete.py +0 -0
  148. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/static/deploy.py +0 -0
  149. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  150. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  151. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/static/is_up.py +0 -0
  152. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/static/list_deps.py +0 -0
  153. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/static/rpac.yaml +0 -0
  154. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/static/tst.py +0 -0
  155. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  156. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  157. {sbcli_hmdi-0.0.34 → sbcli_hmdi-0.0.35}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sbcli-hmdi
3
- Version: 0.0.34
3
+ Version: 0.0.35
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.2
2
2
  Name: sbcli-hmdi
3
- Version: 0.0.34
3
+ Version: 0.0.35
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -104,12 +104,15 @@ simplyblock_core/services/port_stat_collector.py
104
104
  simplyblock_core/services/remove_service.sh
105
105
  simplyblock_core/services/service_template.service
106
106
  simplyblock_core/services/spdk_http_proxy_server.py
107
+ simplyblock_core/services/spdk_stats_collector.py
107
108
  simplyblock_core/services/storage_node_monitor.py
108
109
  simplyblock_core/services/tasks_runner_failed_migration.py
109
110
  simplyblock_core/services/tasks_runner_migration.py
110
111
  simplyblock_core/services/tasks_runner_new_dev_migration.py
111
112
  simplyblock_core/services/tasks_runner_node_add.py
112
113
  simplyblock_core/services/tasks_runner_restart.py
114
+ simplyblock_core/services/spdk/__init__.py
115
+ simplyblock_core/services/spdk/client.py
113
116
  simplyblock_core/workers/cleanup_foundationdb.py
114
117
  simplyblock_web/README.md
115
118
  simplyblock_web/__init__.py
@@ -302,7 +302,7 @@ class CLIWrapper:
302
302
  default=0, choices=range(128))
303
303
  sub_command.add_argument("--max-queue-size", help='The max size the queue will grow', type=int, default=128)
304
304
  sub_command.add_argument("--inflight-io-threshold", help='The number of inflight IOs allowed before the IO queuing starts', type=int, default=4)
305
- sub_command.add_argument("--enable-qos", help='Enable qos bdev for storage nodes, true by default', dest='enable_qos', type=bool, defaiult=True)
305
+ sub_command.add_argument("--enable-qos", help='Enable qos bdev for storage nodes, true by default', dest='enable_qos', type=bool, default=True)
306
306
  sub_command.add_argument("--strict-node-anti-affinity", help='Enable strict node anti affinity for storage nodes', action='store_true')
307
307
 
308
308
 
@@ -1,5 +1,5 @@
1
1
  SIMPLY_BLOCK_COMMAND_NAME=sbcli-hmdi
2
- SIMPLY_BLOCK_VERSION=0.0.34
2
+ SIMPLY_BLOCK_VERSION=0.0.35
3
3
 
4
4
  SIMPLY_BLOCK_DOCKER_IMAGE=public.ecr.aws/simply-block/simplyblock:hmdi
5
5
  DOCKER_USER=hamdysimplyblock
@@ -0,0 +1,281 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ # Copyright (C) 2017 Intel Corporation.
3
+ # All rights reserved.
4
+
5
+ import json
6
+ import socket
7
+ import time
8
+ import os
9
+ import logging
10
+ import copy
11
+ import ctypes
12
+
13
+
14
+ def print_dict(d):
15
+ print(json.dumps(d, indent=2))
16
+
17
+
18
+ def print_json(s):
19
+ print(json.dumps(s, indent=2).strip('"'))
20
+
21
+
22
+ def get_addr_type(addr):
23
+ try:
24
+ socket.inet_pton(socket.AF_INET, addr)
25
+ return socket.AF_INET
26
+ except Exception as e:
27
+ pass
28
+ try:
29
+ socket.inet_pton(socket.AF_INET6, addr)
30
+ return socket.AF_INET6
31
+ except Exception as e:
32
+ pass
33
+ if os.path.exists(addr):
34
+ return socket.AF_UNIX
35
+ return None
36
+
37
+
38
+ class JSONRPCException(Exception):
39
+ def __init__(self, message):
40
+ self.message = message
41
+
42
+
43
+ class JSONRPCClient(object):
44
+ def __init__(self, addr, port=None, timeout=None, **kwargs):
45
+ self.sock = None
46
+ ch = logging.StreamHandler()
47
+ ch.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
48
+ ch.setLevel(logging.DEBUG)
49
+ self._logger = logging.getLogger("JSONRPCClient(%s)" % addr)
50
+ self._logger.addHandler(ch)
51
+ self.log_set_level(kwargs.get('log_level', logging.ERROR))
52
+ connect_retries = kwargs.get('conn_retries', 0)
53
+
54
+ self.timeout = timeout if timeout is not None else 60.0
55
+ self._request_id = 0
56
+ self._recv_buf = ""
57
+ self._reqs = []
58
+
59
+ for i in range(connect_retries):
60
+ try:
61
+ self._connect(addr, port)
62
+ return
63
+ except Exception as e:
64
+ # ignore and retry in 200ms
65
+ time.sleep(0.2)
66
+
67
+ # try one last time without try/except
68
+ self._connect(addr, port)
69
+
70
+ def __enter__(self):
71
+ return self
72
+
73
+ def __exit__(self, exception_type, exception_value, traceback):
74
+ self.close()
75
+
76
+ def _connect(self, addr, port):
77
+ try:
78
+ addr_type = get_addr_type(addr)
79
+
80
+ if addr_type == socket.AF_UNIX:
81
+ self._logger.debug("Trying to connect to UNIX socket: %s", addr)
82
+ self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
83
+ self.sock.connect(addr)
84
+ elif addr_type == socket.AF_INET6:
85
+ self._logger.debug("Trying to connect to IPv6 address addr:%s, port:%i", addr, port)
86
+ for res in socket.getaddrinfo(addr, port, socket.AF_INET6, socket.SOCK_STREAM, socket.SOL_TCP):
87
+ af, socktype, proto, canonname, sa = res
88
+ self.sock = socket.socket(af, socktype, proto)
89
+ self.sock.connect(sa)
90
+ elif addr_type == socket.AF_INET:
91
+ self._logger.debug("Trying to connect to IPv4 address addr:%s, port:%i'", addr, port)
92
+ self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
93
+ self.sock.connect((addr, port))
94
+ else:
95
+ raise socket.error("Invalid or non-existing address: '%s'" % addr)
96
+ except socket.error as ex:
97
+ raise JSONRPCException("Error while connecting to %s\n"
98
+ "Is SPDK application running?\n"
99
+ "Error details: %s" % (addr, ex))
100
+
101
+ def get_logger(self):
102
+ return self._logger
103
+
104
+ """Set logging level
105
+
106
+ Args:
107
+ lvl: Log level to set as accepted by logger.setLevel
108
+ """
109
+ def log_set_level(self, lvl):
110
+ self._logger.info("Setting log level to %s", lvl)
111
+ self._logger.setLevel(lvl)
112
+ self._logger.info("Log level set to %s", lvl)
113
+
114
+ def close(self):
115
+ if getattr(self, "sock", None):
116
+ self.sock.shutdown(socket.SHUT_RDWR)
117
+ self.sock.close()
118
+ self.sock = None
119
+
120
+ def add_request(self, method, params):
121
+ self._request_id += 1
122
+ req = {
123
+ 'jsonrpc': '2.0',
124
+ 'method': method,
125
+ 'id': self._request_id
126
+ }
127
+
128
+ if params:
129
+ req['params'] = copy.deepcopy(params)
130
+
131
+ self._logger.debug("append request:\n%s\n", json.dumps(req))
132
+ self._reqs.append(req)
133
+ return self._request_id
134
+
135
+ def flush(self):
136
+ self._logger.debug("Flushing buffer")
137
+ # TODO: We can drop indent parameter
138
+ reqstr = "\n".join(json.dumps(req, indent=2) for req in self._reqs)
139
+ self._reqs = []
140
+ self._logger.info("Requests:\n%s\n", reqstr)
141
+ self.sock.sendall(reqstr.encode("utf-8"))
142
+
143
+ def send(self, method, params=None):
144
+ id = self.add_request(method, params)
145
+ self.flush()
146
+ return id
147
+
148
+ def decode_one_response(self):
149
+ try:
150
+ self._logger.debug("Trying to decode response '%s'", self._recv_buf)
151
+ buf = self._recv_buf.lstrip()
152
+ obj, idx = json.JSONDecoder().raw_decode(buf)
153
+ self._recv_buf = buf[idx:]
154
+ return obj
155
+ except ValueError:
156
+ self._logger.debug("Partial response")
157
+ return None
158
+
159
+ def recv(self):
160
+ start_time = time.process_time()
161
+ response = self.decode_one_response()
162
+ while not response:
163
+ try:
164
+ timeout = self.timeout - (time.process_time() - start_time)
165
+ self.sock.settimeout(timeout)
166
+ newdata = self.sock.recv(4096)
167
+ if not newdata:
168
+ self.sock.close()
169
+ self.sock = None
170
+ raise JSONRPCException("Connection closed with partial response:\n%s\n" % self._recv_buf)
171
+ self._recv_buf += newdata.decode("utf-8")
172
+ response = self.decode_one_response()
173
+ except socket.timeout:
174
+ break # throw exception after loop to avoid Python freaking out about nested exceptions
175
+ except ValueError:
176
+ continue # incomplete response; keep buffering
177
+
178
+ if not response:
179
+ raise JSONRPCException("Timeout while waiting for response:\n%s\n" % self._recv_buf)
180
+
181
+ self._logger.info("response:\n%s\n", json.dumps(response, indent=2))
182
+ return response
183
+
184
+ def call(self, method, params=None):
185
+ self._logger.debug("call('%s')" % method)
186
+ params = {} if params is None else params
187
+ if self.timeout <= 0:
188
+ raise JSONRPCException("Timeout value is invalid: %s\n" % self.timeout)
189
+ req_id = self.send(method, params)
190
+ try:
191
+ response = self.recv()
192
+ except JSONRPCException as e:
193
+ """ Don't expect response to kill """
194
+ if not self.sock and method == "spdk_kill_instance":
195
+ self._logger.info("Connection terminated but ignoring since method is '%s'" % method)
196
+ return {}
197
+ else:
198
+ raise e
199
+
200
+ if 'error' in response:
201
+ params["method"] = method
202
+ params["req_id"] = req_id
203
+ msg = "\n".join(["request:", "%s" % json.dumps(params, indent=2),
204
+ "Got JSON-RPC error response",
205
+ "response:",
206
+ json.dumps(response['error'], indent=2)])
207
+ raise JSONRPCException(msg)
208
+
209
+ return response['result']
210
+
211
+
212
+ class JSONRPCGoClient(object):
213
+ INVALID_PARAMETER_ERROR = 1
214
+ CONNECTION_ERROR = 2
215
+ JSON_RPC_CALL_ERROR = 3
216
+ INVALID_RESPONSE_ERROR = 4
217
+
218
+ def __init__(self, addr, **kwargs):
219
+ self.addr = addr
220
+ ch = logging.StreamHandler()
221
+ ch.setFormatter(logging.Formatter('Go client - %(levelname)s: %(message)s'))
222
+ ch.setLevel(logging.DEBUG)
223
+ self._logger = logging.getLogger("JSONRPCGoClient(%s)" % addr)
224
+ self._logger.addHandler(ch)
225
+ self._logger.setLevel(kwargs.get('log_level', logging.ERROR))
226
+
227
+ def call(self, method, params=None):
228
+ self._logger.debug("call('%s')" % method)
229
+ params = {} if params is None else params
230
+
231
+ class GoClientResponse(ctypes.Structure):
232
+ _fields_ = [("response", ctypes.POINTER(ctypes.c_char)), ("error", ctypes.c_int)]
233
+
234
+ client_path = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(__file__),
235
+ os.path.pardir))
236
+ + '/../../build/go/rpc/libspdk_gorpc.so')
237
+ try:
238
+ lib = ctypes.cdll.LoadLibrary(client_path)
239
+ except OSError:
240
+ raise JSONRPCException(f'Failed to load the Go RPC client at {client_path}')
241
+ lib.spdk_gorpc_free_response.argtypes = [ctypes.POINTER(ctypes.c_char)]
242
+ lib.spdk_gorpc_call.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
243
+ lib.spdk_gorpc_call.restype = GoClientResponse
244
+
245
+ command_info = {
246
+ "method": method,
247
+ "params": params
248
+ }
249
+ resp = lib.spdk_gorpc_call(json.dumps(command_info).encode('utf-8'),
250
+ self.addr.encode('utf-8'))
251
+ if resp.error > 0:
252
+ rpc_error = "\n".join(["request:", "%s" % json.dumps(command_info, indent=2),
253
+ "Got JSON-RPC error response"])
254
+ if resp.error == self.INVALID_PARAMETER_ERROR:
255
+ rpc_error = "\n".join([rpc_error, "GoRPCClient: error when decoding "
256
+ "function arguments"])
257
+ elif resp.error == self.CONNECTION_ERROR:
258
+ rpc_error = "\n".join([rpc_error, "GoRPCClient: Error while connecting to "
259
+ f"{self.addr}. Is SPDK application running?"])
260
+ elif resp.error == self.JSON_RPC_CALL_ERROR:
261
+ rpc_error = "\n".join([rpc_error, "GoRPCClient: error on JSON-RPC call"])
262
+ elif resp.error == self.INVALID_RESPONSE_ERROR:
263
+ rpc_error = "\n".join([rpc_error, "GoRPCClient: error on creating json "
264
+ "representation of response"])
265
+ raise JSONRPCException(rpc_error)
266
+
267
+ try:
268
+ json_resp = json.loads(ctypes.c_char_p.from_buffer(resp.response).value)
269
+ finally:
270
+ lib.spdk_gorpc_free_response(resp.response)
271
+
272
+ if 'error' in json_resp:
273
+ params["method"] = method
274
+ params["req_id"] = json_resp['id']
275
+ msg = "\n".join(["request:", "%s" % json.dumps(params, indent=2),
276
+ "Got JSON-RPC error response",
277
+ "response:",
278
+ json.dumps(json_resp['error'], indent=2)])
279
+ raise JSONRPCException(msg)
280
+
281
+ return json_resp['result']
@@ -0,0 +1,37 @@
1
+ import datetime
2
+ import time
3
+
4
+ from simplyblock_core.services.spdk import client as spdk_client
5
+
6
+
7
+ method = "thread_get_stats"
8
+ spdk_sock_path = '/var/tmp/spdk.sock'
9
+ csv_file_path = "/etc/simplyblock/spdk_top.csv"
10
+
11
+ def get_file(ret):
12
+
13
+ f = open(csv_file_path, 'at', buffering=1)
14
+ f.write("date, ")
15
+ for stats in ret["threads"]:
16
+ f.write(", ".join([k for k in stats]))
17
+ f.write("\n")
18
+ return f
19
+
20
+
21
+ if __name__ == '__main__':
22
+
23
+ client = spdk_client.JSONRPCClient(spdk_sock_path, 5260)
24
+
25
+ out_file = None
26
+ while True:
27
+ ret = client.call(method)
28
+ now = str(datetime.datetime.now()).split(".")[0]
29
+ if ret and "threads" in ret:
30
+ if not out_file:
31
+ out_file = get_file(ret)
32
+ out_file.write(now+", ")
33
+ for stats in ret["threads"]:
34
+ out_file.write(", ".join([str(k) for k in stats.values()]))
35
+ out_file.write("\n")
36
+
37
+ time.sleep(10)
File without changes
File without changes
File without changes
File without changes