sbcli-dev 17.3.3__tar.gz → 17.3.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/PKG-INFO +1 -1
  2. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/PKG-INFO +1 -1
  3. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/SOURCES.txt +1 -0
  4. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/lvol_controller.py +1 -9
  5. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/snapshot_controller.py +1 -1
  6. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/env_var +1 -1
  7. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/base_model.py +5 -2
  8. sbcli_dev-17.3.5/simplyblock_core/models/hublvol.py +12 -0
  9. sbcli_dev-17.3.5/simplyblock_core/models/storage_node.py +211 -0
  10. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/rpc_client.py +33 -17
  11. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/storage_node_ops.py +103 -64
  12. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/utils.py +12 -0
  13. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_snapshot.py +4 -1
  14. sbcli_dev-17.3.3/simplyblock_core/models/storage_node.py +0 -92
  15. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/README.md +0 -0
  16. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/pyproject.toml +0 -0
  17. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/requirements.txt +0 -0
  18. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/dependency_links.txt +0 -0
  19. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/entry_points.txt +0 -0
  20. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/requires.txt +0 -0
  21. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/top_level.txt +0 -0
  22. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/setup.cfg +0 -0
  23. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/setup.py +0 -0
  24. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_cli/__init__.py +0 -0
  25. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_cli/cli.py +0 -0
  26. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_cli/clibase.py +0 -0
  27. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_cli/main.py +0 -0
  28. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/__init__.py +0 -0
  29. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/cluster_ops.py +0 -0
  30. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/cnode_client.py +0 -0
  31. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/constants.py +0 -0
  32. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/__init__.py +0 -0
  33. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  34. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/cluster_events.py +0 -0
  35. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/device_controller.py +0 -0
  36. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/device_events.py +0 -0
  37. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/events_controller.py +0 -0
  38. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/health_controller.py +0 -0
  39. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/lvol_events.py +0 -0
  40. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/mgmt_events.py +0 -0
  41. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/pool_controller.py +0 -0
  42. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/pool_events.py +0 -0
  43. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/snapshot_events.py +0 -0
  44. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/storage_events.py +0 -0
  45. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tasks_controller.py +0 -0
  46. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tasks_events.py +0 -0
  47. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
  48. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/db_controller.py +0 -0
  49. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/distr_controller.py +0 -0
  50. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/mgmt_node_ops.py +0 -0
  51. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/__init__.py +0 -0
  52. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/caching_node.py +0 -0
  53. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/cluster.py +0 -0
  54. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/deployer.py +0 -0
  55. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/events.py +0 -0
  56. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/iface.py +0 -0
  57. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/job_schedule.py +0 -0
  58. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/lvol_model.py +0 -0
  59. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/mgmt_node.py +0 -0
  60. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/nvme_device.py +0 -0
  61. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/pool.py +0 -0
  62. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/port_stat.py +0 -0
  63. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/snapshot.py +0 -0
  64. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/models/stats.py +0 -0
  65. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/pci_utils.py +0 -0
  66. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/__init__.py +0 -0
  67. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  68. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  69. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  70. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/config_docker.sh +0 -0
  71. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboard.yml +0 -0
  72. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  73. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  74. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  75. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  76. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  77. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  78. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/datasource.yml +0 -0
  79. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/db_config_double.sh +0 -0
  80. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/db_config_single.sh +0 -0
  81. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
  82. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  83. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  84. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  85. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/foundation.yml +0 -0
  86. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/haproxy.cfg +0 -0
  87. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/install_deps.sh +0 -0
  88. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/objstore.yml +0 -0
  89. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
  90. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/prometheus.yml.j2 +0 -0
  91. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/run_ssh.sh +0 -0
  92. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/set_db_config.sh +0 -0
  93. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  94. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/__init__.py +0 -0
  95. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  96. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/caching_node_monitor.py +0 -0
  97. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/cap_monitor.py +0 -0
  98. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  99. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/device_monitor.py +0 -0
  100. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/health_check_service.py +0 -0
  101. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/install_service.sh +0 -0
  102. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/lvol_monitor.py +0 -0
  103. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  104. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  105. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  106. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/new_device_discovery.py +0 -0
  107. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/remove_service.sh +0 -0
  108. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/service_template.service +0 -0
  109. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk/__init__.py +0 -0
  110. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk/client.py +0 -0
  111. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
  112. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk_stats_collector.py +0 -0
  113. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/storage_node_monitor.py +0 -0
  114. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  115. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  116. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  117. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  118. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  119. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/shell_utils.py +0 -0
  120. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/snode_client.py +0 -0
  121. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/test/test_utils.py +0 -0
  122. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
  123. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/README.md +0 -0
  124. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/__init__.py +0 -0
  125. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/app.py +0 -0
  126. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/auth_middleware.py +0 -0
  127. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/__init__.py +0 -0
  128. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  129. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  130. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  131. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  132. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  133. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/snode_ops.py +0 -0
  134. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  135. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
  136. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  137. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  138. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  139. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_device.py +0 -0
  140. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  141. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_metrics.py +0 -0
  142. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  143. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  144. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  145. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/node_utils.py +0 -0
  146. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/node_utils_k8s.py +0 -0
  147. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/node_webapp.py +0 -0
  148. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/requirements.txt +0 -0
  149. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
  150. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/delete.py +0 -0
  151. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy.py +0 -0
  152. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  153. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  154. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/is_up.py +0 -0
  155. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/list_deps.py +0 -0
  156. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/rpac.yaml +0 -0
  157. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/swagger.yaml +0 -0
  158. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/static/tst.py +0 -0
  159. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  160. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  161. {sbcli_dev-17.3.3 → sbcli_dev-17.3.5}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sbcli-dev
3
- Version: 17.3.3
3
+ Version: 17.3.5
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sbcli-dev
3
- Version: 17.3.3
3
+ Version: 17.3.5
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -50,6 +50,7 @@ simplyblock_core/models/caching_node.py
50
50
  simplyblock_core/models/cluster.py
51
51
  simplyblock_core/models/deployer.py
52
52
  simplyblock_core/models/events.py
53
+ simplyblock_core/models/hublvol.py
53
54
  simplyblock_core/models/iface.py
54
55
  simplyblock_core/models/job_schedule.py
55
56
  simplyblock_core/models/lvol_model.py
@@ -23,14 +23,6 @@ from simplyblock_core.snode_client import SNodeClient
23
23
  logger = lg.getLogger()
24
24
 
25
25
 
26
- def _generate_hex_string(length):
27
- def _generate_string(length):
28
- return ''.join(random.SystemRandom().choice(
29
- string.ascii_letters + string.digits) for _ in range(length))
30
-
31
- return _generate_string(length).encode('utf-8').hex()
32
-
33
-
34
26
  def _create_crypto_lvol(rpc_client, name, base_name, key1, key2):
35
27
  key_name = f'key_{name}'
36
28
  ret = rpc_client.lvol_crypto_key_create(key_name, key1, key2)
@@ -427,7 +419,7 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
427
419
  lvol.ha_type = ha_type
428
420
  lvol.bdev_stack = []
429
421
  lvol.uuid = uid or str(uuid.uuid4())
430
- lvol.guid = _generate_hex_string(16)
422
+ lvol.guid = utils.generate_hex_string(16)
431
423
  lvol.vuid = vuid
432
424
  lvol.lvol_bdev = f"LVOL_{vuid}"
433
425
 
@@ -439,7 +439,7 @@ def clone(snapshot_id, clone_name, new_size=0):
439
439
  lvol.pool_uuid = pool.get_id()
440
440
  lvol.ha_type = snap.lvol.ha_type
441
441
  lvol.lvol_type = 'lvol'
442
- lvol.guid = lvol_controller._generate_hex_string(16)
442
+ lvol.guid = utils.generate_hex_string(16)
443
443
  lvol.vuid = snap.lvol.vuid
444
444
  lvol.snapshot_name = snap.snap_bdev
445
445
  lvol.subsys_port = snap.lvol.subsys_port
@@ -1,5 +1,5 @@
1
1
  SIMPLY_BLOCK_COMMAND_NAME=sbcli-dev
2
- SIMPLY_BLOCK_VERSION=17.3.3
2
+ SIMPLY_BLOCK_VERSION=17.3.5
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
@@ -1,5 +1,6 @@
1
1
  # coding=utf-8
2
2
  import pprint
3
+ import logging
3
4
 
4
5
  import json
5
6
  from inspect import ismethod
@@ -115,8 +116,10 @@ class BaseModel(object):
115
116
  for k, v in kv_store.get_range_startswith(prefix.strip().encode('utf-8'), limit=limit, reverse=reverse):
116
117
  objects.append(self.__class__().from_dict(json.loads(v)))
117
118
  return objects
118
- except Exception as e:
119
- print(f"Error reading from FDB: {e}")
119
+ except Exception:
120
+ from simplyblock_core import utils
121
+ logger = utils.get_logger(__name__)
122
+ logger.exception('Error reading from FDB')
120
123
  return []
121
124
 
122
125
  def get_last(self, kv_store):
@@ -0,0 +1,12 @@
1
+ # coding=utf-8
2
+
3
+ from simplyblock_core.models.base_model import BaseModel
4
+
5
+
6
+ class HubLVol(BaseModel):
7
+ """Identifying information of a HubLVol
8
+ """
9
+ uuid: str = ""
10
+ nqn: str = ""
11
+ name: str = ""
12
+ nvmf_port: int = 9099
@@ -0,0 +1,211 @@
1
+ # coding=utf-8
2
+
3
+ from typing import List
4
+ from uuid import uuid4
5
+
6
+ from simplyblock_core import utils
7
+ from simplyblock_core.models.base_model import BaseNodeObject
8
+ from simplyblock_core.models.hublvol import HubLVol
9
+ from simplyblock_core.models.iface import IFace
10
+ from simplyblock_core.models.nvme_device import NVMeDevice, JMDevice
11
+ from simplyblock_core.rpc_client import RPCClient, RPCException
12
+
13
+ logger = utils.get_logger(__name__)
14
+
15
+
16
+ class StorageNode(BaseNodeObject):
17
+
18
+ alceml_cpu_cores: List[int] = []
19
+ alceml_cpu_index: int = 0
20
+ alceml_worker_cpu_cores: List[int] = []
21
+ alceml_worker_cpu_index: int = 0
22
+ api_endpoint: str = ""
23
+ app_thread_mask: str = ""
24
+ baseboard_sn: str = ""
25
+ cloud_instance_id: str = ""
26
+ cloud_instance_public_ip: str = ""
27
+ cloud_instance_type: str = ""
28
+ cloud_name: str = ""
29
+ cluster_id: str = ""
30
+ cpu: int = 0
31
+ cpu_hz: int = 0
32
+ ctrl_secret: str = ""
33
+ data_nics: List[IFace] = []
34
+ distrib_cpu_cores: List[int] = []
35
+ distrib_cpu_index: int = 0
36
+ distrib_cpu_mask: str = ""
37
+ enable_ha_jm: bool = False
38
+ ha_jm_count: int = 3
39
+ enable_test_device: bool = False
40
+ health_check: bool = True
41
+ host_nqn: str = ""
42
+ host_secret: str = ""
43
+ hostname: str = ""
44
+ hugepages: int = 0
45
+ ib_devices: List[IFace] = []
46
+ id_device_by_nqn: bool = False
47
+ iobuf_large_bufsize: int = 0
48
+ iobuf_large_pool_count: int = 0
49
+ iobuf_small_bufsize: int = 0
50
+ iobuf_small_pool_count: int = 0
51
+ is_secondary_node: bool = False
52
+ jc_singleton_mask: str = ""
53
+ jm_cpu_mask: str = ""
54
+ jm_device: JMDevice = None
55
+ jm_percent: int = 3
56
+ jm_vuid: int = 0
57
+ lvols: int = 0
58
+ lvstore: str = ""
59
+ lvstore_stack: List[dict] = []
60
+ lvstore_stack_secondary_1: List[dict] = []
61
+ lvstore_stack_secondary_2: List[dict] = []
62
+ lvol_subsys_port: int = 9090
63
+ max_lvol: int = 0
64
+ max_prov: int = 0
65
+ max_snap: int = 0
66
+ memory: int = 0
67
+ mgmt_ip: str = ""
68
+ namespace: str = ""
69
+ node_lvs: str = "lvs"
70
+ num_partitions_per_dev: int = 1
71
+ number_of_devices: int = 0
72
+ number_of_distribs: int = 4
73
+ nvme_devices: List[NVMeDevice] = []
74
+ online_since: str = ""
75
+ partitions_count: int = 0 # Unused
76
+ poller_cpu_cores: List[int] = []
77
+ ssd_pcie: List = []
78
+ pollers_mask: str = ""
79
+ primary_ip: str = ""
80
+ raid: str = ""
81
+ remote_devices: List[NVMeDevice] = []
82
+ remote_jm_devices: List[JMDevice] = []
83
+ rpc_password: str = ""
84
+ rpc_port: int = -1
85
+ rpc_username: str = ""
86
+ secondary_node_id: str = ""
87
+ sequential_number: int = 0 # Unused
88
+ jm_ids: List[str] = []
89
+ spdk_cpu_mask: str = ""
90
+ spdk_debug: bool = False
91
+ spdk_image: str = ""
92
+ spdk_mem: int = 0
93
+ partition_size: int = 0
94
+ subsystem: str = ""
95
+ system_uuid: str = ""
96
+ lvstore_status: str = ""
97
+ nvmf_port: int = 4420
98
+ physical_label: int = 0
99
+ hublvol: HubLVol = None
100
+
101
+ def rpc_client(self, **kwargs):
102
+ """Return rpc client to this node
103
+ """
104
+ return RPCClient(
105
+ self.mgmt_ip, self.rpc_port,
106
+ self.rpc_username, self.rpc_password, **kwargs)
107
+
108
+ def expose_bdev(self, nqn, bdev_name, model_number, uuid, nguid, port):
109
+ rpc_client = self.rpc_client()
110
+
111
+ try:
112
+ if not rpc_client.subsystem_create(
113
+ nqn=nqn,
114
+ serial_number='sbcli-cn',
115
+ model_number=model_number,
116
+ ):
117
+ raise RPCException(f'Failed to create subsystem for {nqn}')
118
+
119
+ for ip in (iface.ip4_address for iface in self.data_nics):
120
+ if not rpc_client.listeners_create(
121
+ nqn=nqn,
122
+ trtype='TCP',
123
+ traddr=ip,
124
+ trsvcid=port,
125
+ ):
126
+ raise RPCException(f'Failed to create listener for {nqn}')
127
+
128
+ if not rpc_client.nvmf_subsystem_add_ns(
129
+ nqn=nqn,
130
+ dev_name=bdev_name,
131
+ uuid=uuid,
132
+ nguid=nguid,
133
+ ):
134
+ raise RPCException(f'Failed to add namespace to subsytem {nqn}')
135
+ except RPCException:
136
+ if self.hublvol and rpc_client.subsystem_list(self.hublvol.nqn):
137
+ rpc_client.subsystem_delete(self.hublvol.nqn)
138
+
139
+ raise
140
+
141
+ def create_hublvol(self, cluster_nqn):
142
+ """Create a hublvol for this node's lvstore
143
+ """
144
+ logger.info(f'Creating hublvol on {self.get_id()}')
145
+ rpc_client = self.rpc_client()
146
+
147
+ hublvol_uuid = None
148
+ try:
149
+ hublvol_uuid = rpc_client.bdev_lvol_create_hublvol(self.lvstore)
150
+ if not hublvol_uuid:
151
+ raise RPCException('Failed to create hublvol')
152
+ self.hublvol = HubLVol({
153
+ 'uuid': hublvol_uuid,
154
+ 'nqn': f'{cluster_nqn}:lvol:{hublvol_uuid}',
155
+ 'name': f'{self.lvstore}/hublvol',
156
+ })
157
+
158
+ self.expose_bdev(
159
+ nqn=self.hublvol.nqn,
160
+ bdev_name=self.hublvol.name,
161
+ model_number=str(uuid4()),
162
+ uuid=self.hublvol.uuid,
163
+ nguid=utils.generate_hex_string(16),
164
+ port=self.hublvol.nvmf_port
165
+ )
166
+ except RPCException:
167
+ if hublvol_uuid is not None and rpc_client.get_bdevs(hublvol_uuid):
168
+ rpc_client.bdev_lvol_delete_hublvol(self.hublvol.nqn)
169
+
170
+ if self.hublvol and rpc_client.subsystem_list(self.hublvol.nqn):
171
+ rpc_client.subsystem_delete(self.hublvol.nqn)
172
+ self.hublvol = None
173
+
174
+ raise
175
+
176
+ self.write_to_db()
177
+ return self.hublvol
178
+
179
+ def connect_to_hublvol(self, primary_node):
180
+ """Connect to a primary node's hublvol
181
+ """
182
+ logger.info(f'Connecting node {self.get_id()} to hublvol on {primary_node.get_id()}')
183
+
184
+ if primary_node.hublvol is None:
185
+ raise ValueError(f"HubLVol of primary node {primary_node.get_id()} is not present")
186
+
187
+ rpc_client = self.rpc_client()
188
+
189
+ remote_bdev = None
190
+ for ip in (iface.ip4_address for iface in primary_node.data_nics):
191
+ remote_bdev = rpc_client.bdev_nvme_attach_controller_tcp(
192
+ primary_node.hublvol.name, primary_node.hublvol.nqn,
193
+ ip, primary_node.hublvol.nvmf_port)[0]
194
+ if remote_bdev is not None:
195
+ break
196
+ else:
197
+ logger.warning(f'Failed to connect to hublvol on {ip}')
198
+
199
+ if remote_bdev is None:
200
+ raise RPCException('Failed to connect to hublvol')
201
+
202
+ if not rpc_client.bdev_lvol_set_lvs_opts(
203
+ primary_node.lvstore,
204
+ groupid=primary_node.jm_vuid,
205
+ subsystem_port=self.lvol_subsys_port,
206
+ secondary=True,
207
+ ):
208
+ raise RPCException('Failed to set secondary lvstore options')
209
+
210
+ if not rpc_client.bdev_lvol_connect_hublvol(primary_node.lvstore, remote_bdev):
211
+ raise RPCException('Failed to connect secondary lvstore to primary')
@@ -1,4 +1,5 @@
1
1
  import json
2
+ import inspect
2
3
 
3
4
  import requests
4
5
 
@@ -913,18 +914,12 @@ class RPCClient:
913
914
  params = {"jm_vuid": jm_vuid}
914
915
  return self._request("bdev_distrib_force_to_non_leader", params)
915
916
 
916
- def bdev_lvol_set_leader(self, is_leader=False, uuid=None, lvs_name=None, bs_nonleadership=False):
917
- params = {
918
- "lvs_leadership": is_leader,
919
- }
920
- if uuid:
921
- params["uuid"] = uuid
922
- elif lvs_name:
923
- params["lvs_name"] = lvs_name
924
-
925
- params["bs_nonleadership"] = bs_nonleadership
926
-
927
- return self._request("bdev_lvol_set_leader_all", params)
917
+ def bdev_lvol_set_leader(self, lvs, *, leader=False, bs_nonleadership=False):
918
+ return self._request("bdev_lvol_set_leader_all", {
919
+ "uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
920
+ "lvs_leadership": leader,
921
+ "bs_nonleadership": bs_nonleadership,
922
+ })
928
923
 
929
924
  def bdev_lvol_register(self, name, lvs_name, registered_uuid, blobid, priority_class=0):
930
925
  params = {
@@ -982,13 +977,19 @@ class RPCClient:
982
977
  }
983
978
  return self._request("nvmf_set_max_subsystems", params)
984
979
 
985
- def bdev_lvol_set_lvs_ops(self, lvs_name, groupid, subsystem_port=9090):
986
- params = {
980
+ def bdev_lvol_set_lvs_opts(self, lvs, *, groupid, subsystem_port=9090, primary=False, secondary=False):
981
+ """Set lvstore options
982
+
983
+ `lvs` must be either an ID or the lvstore name.
984
+ """
985
+
986
+ return self._request(inspect.currentframe().f_code.co_name, {
987
+ "uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
987
988
  "groupid": groupid,
988
- "lvs_name": lvs_name,
989
989
  "subsystem_port": subsystem_port,
990
- }
991
- return self._request("bdev_lvol_set_lvs_op", params)
990
+ "primary": primary,
991
+ "secondary": secondary,
992
+ })
992
993
 
993
994
  def bdev_lvol_get_lvol_delete_status(self, name):
994
995
  """
@@ -1010,3 +1011,18 @@ class RPCClient:
1010
1011
  }
1011
1012
  return self._request("bdev_lvol_set_lvs_read_only", params)
1012
1013
 
1014
+ def bdev_lvol_create_hublvol(self, lvs):
1015
+ return self._request(inspect.currentframe().f_code.co_name, {
1016
+ "uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
1017
+ })
1018
+
1019
+ def bdev_lvol_delete_hublvol(self, lvs):
1020
+ return self._request(inspect.currentframe().f_code.co_name, {
1021
+ "uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
1022
+ })
1023
+
1024
+ def bdev_lvol_connect_hublvol(self, lvs, bdev):
1025
+ return self._request(inspect.currentframe().f_code.co_name, {
1026
+ "uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
1027
+ "remote_bdev": bdev,
1028
+ })