sbcli-dev 17.3.4__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.4 → sbcli_dev-17.3.5}/PKG-INFO +1 -1
  2. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/PKG-INFO +1 -1
  3. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/SOURCES.txt +1 -0
  4. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/lvol_controller.py +1 -9
  5. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/snapshot_controller.py +1 -1
  6. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/env_var +1 -1
  7. {sbcli_dev-17.3.4 → 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.4 → sbcli_dev-17.3.5}/simplyblock_core/rpc_client.py +33 -17
  11. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/storage_node_ops.py +87 -54
  12. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/utils.py +12 -0
  13. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_snapshot.py +4 -1
  14. sbcli_dev-17.3.4/simplyblock_core/models/storage_node.py +0 -92
  15. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/README.md +0 -0
  16. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/pyproject.toml +0 -0
  17. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/requirements.txt +0 -0
  18. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/dependency_links.txt +0 -0
  19. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/entry_points.txt +0 -0
  20. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/requires.txt +0 -0
  21. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/top_level.txt +0 -0
  22. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/setup.cfg +0 -0
  23. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/setup.py +0 -0
  24. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_cli/__init__.py +0 -0
  25. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_cli/cli.py +0 -0
  26. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_cli/clibase.py +0 -0
  27. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_cli/main.py +0 -0
  28. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/__init__.py +0 -0
  29. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/cluster_ops.py +0 -0
  30. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/cnode_client.py +0 -0
  31. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/constants.py +0 -0
  32. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/__init__.py +0 -0
  33. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  34. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/cluster_events.py +0 -0
  35. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/device_controller.py +0 -0
  36. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/device_events.py +0 -0
  37. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/events_controller.py +0 -0
  38. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/health_controller.py +0 -0
  39. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/lvol_events.py +0 -0
  40. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/mgmt_events.py +0 -0
  41. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/pool_controller.py +0 -0
  42. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/pool_events.py +0 -0
  43. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/snapshot_events.py +0 -0
  44. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/storage_events.py +0 -0
  45. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tasks_controller.py +0 -0
  46. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tasks_events.py +0 -0
  47. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
  48. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/db_controller.py +0 -0
  49. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/distr_controller.py +0 -0
  50. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/mgmt_node_ops.py +0 -0
  51. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/__init__.py +0 -0
  52. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/caching_node.py +0 -0
  53. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/cluster.py +0 -0
  54. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/deployer.py +0 -0
  55. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/events.py +0 -0
  56. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/iface.py +0 -0
  57. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/job_schedule.py +0 -0
  58. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/lvol_model.py +0 -0
  59. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/mgmt_node.py +0 -0
  60. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/nvme_device.py +0 -0
  61. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/pool.py +0 -0
  62. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/port_stat.py +0 -0
  63. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/snapshot.py +0 -0
  64. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/stats.py +0 -0
  65. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/pci_utils.py +0 -0
  66. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/__init__.py +0 -0
  67. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  68. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  69. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  70. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/config_docker.sh +0 -0
  71. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboard.yml +0 -0
  72. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  73. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  74. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  75. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  76. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  77. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  78. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/datasource.yml +0 -0
  79. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/db_config_double.sh +0 -0
  80. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/db_config_single.sh +0 -0
  81. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
  82. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  83. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  84. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  85. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/foundation.yml +0 -0
  86. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/haproxy.cfg +0 -0
  87. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/install_deps.sh +0 -0
  88. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/objstore.yml +0 -0
  89. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
  90. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/prometheus.yml.j2 +0 -0
  91. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/run_ssh.sh +0 -0
  92. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/set_db_config.sh +0 -0
  93. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  94. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/__init__.py +0 -0
  95. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  96. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/caching_node_monitor.py +0 -0
  97. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/cap_monitor.py +0 -0
  98. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  99. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/device_monitor.py +0 -0
  100. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/health_check_service.py +0 -0
  101. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/install_service.sh +0 -0
  102. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/lvol_monitor.py +0 -0
  103. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  104. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  105. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  106. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/new_device_discovery.py +0 -0
  107. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/remove_service.sh +0 -0
  108. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/service_template.service +0 -0
  109. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk/__init__.py +0 -0
  110. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk/client.py +0 -0
  111. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
  112. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk_stats_collector.py +0 -0
  113. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/storage_node_monitor.py +0 -0
  114. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  115. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  116. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  117. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  118. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  119. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/shell_utils.py +0 -0
  120. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/snode_client.py +0 -0
  121. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/test/test_utils.py +0 -0
  122. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
  123. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/README.md +0 -0
  124. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/__init__.py +0 -0
  125. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/app.py +0 -0
  126. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/auth_middleware.py +0 -0
  127. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/__init__.py +0 -0
  128. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  129. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  130. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  131. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  132. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  133. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/snode_ops.py +0 -0
  134. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  135. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
  136. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  137. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  138. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  139. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_device.py +0 -0
  140. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  141. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_metrics.py +0 -0
  142. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  143. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  144. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  145. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/node_utils.py +0 -0
  146. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/node_utils_k8s.py +0 -0
  147. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/node_webapp.py +0 -0
  148. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/requirements.txt +0 -0
  149. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
  150. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/delete.py +0 -0
  151. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy.py +0 -0
  152. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  153. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  154. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/is_up.py +0 -0
  155. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/list_deps.py +0 -0
  156. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/rpac.yaml +0 -0
  157. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/swagger.yaml +0 -0
  158. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/tst.py +0 -0
  159. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  160. {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  161. {sbcli_dev-17.3.4 → 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.4
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.4
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.4
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
+ })
@@ -25,7 +25,7 @@ from simplyblock_core.models.lvol_model import LVol
25
25
  from simplyblock_core.models.nvme_device import NVMeDevice, JMDevice
26
26
  from simplyblock_core.models.storage_node import StorageNode
27
27
  from simplyblock_core.models.cluster import Cluster
28
- from simplyblock_core.rpc_client import RPCClient
28
+ from simplyblock_core.rpc_client import RPCClient, RPCException
29
29
  from simplyblock_core.snode_client import SNodeClient
30
30
 
31
31
  logger = utils.get_logger(__name__)
@@ -2204,7 +2204,7 @@ def suspend_storage_node(node_id, force=False):
2204
2204
  ret = rpc_client.nvmf_subsystem_listener_set_ana_state(
2205
2205
  lvol.nqn, iface.ip4_address, lvol.subsys_port, False, ana="inaccessible")
2206
2206
 
2207
- rpc_client.bdev_lvol_set_leader(False, lvs_name=node.lvstore)
2207
+ rpc_client.bdev_lvol_set_leader(node.lvstore, leader=False)
2208
2208
  rpc_client.bdev_distrib_force_to_non_leader(node.jm_vuid)
2209
2209
 
2210
2210
 
@@ -2219,7 +2219,7 @@ def suspend_storage_node(node_id, force=False):
2219
2219
  ret = sec_node_client.nvmf_subsystem_listener_set_ana_state(
2220
2220
  lvol.nqn, iface.ip4_address, lvol.subsys_port, False, ana="inaccessible")
2221
2221
  time.sleep(1)
2222
- # sec_node_client.bdev_lvol_set_leader(False, lvs_name=snode.lvstore)
2222
+ # sec_node_client.bdev_lvol_set_leader(snode.lvstore, leader=False)
2223
2223
  # sec_node_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
2224
2224
 
2225
2225
  for lvol in db_controller.get_lvols_by_node_id(snode.get_id()):
@@ -2229,7 +2229,7 @@ def suspend_storage_node(node_id, force=False):
2229
2229
  lvol.nqn, iface.ip4_address, lvol.subsys_port, False, ana="inaccessible")
2230
2230
  time.sleep(1)
2231
2231
 
2232
- rpc_client.bdev_lvol_set_leader(False, lvs_name=snode.lvstore)
2232
+ rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=False)
2233
2233
  rpc_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
2234
2234
  time.sleep(1)
2235
2235
 
@@ -2317,7 +2317,7 @@ def resume_storage_node(node_id):
2317
2317
  ret = sec_node_client.nvmf_subsystem_listener_set_ana_state(
2318
2318
  lvol.nqn, iface.ip4_address, lvol.subsys_port, False, ana="inaccessible")
2319
2319
  time.sleep(1)
2320
- sec_node_client.bdev_lvol_set_leader(False, lvs_name=snode.lvstore)
2320
+ sec_node_client.bdev_lvol_set_leader(snode.lvstore, leader=False)
2321
2321
  sec_node_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
2322
2322
  time.sleep(1)
2323
2323
 
@@ -2803,71 +2803,76 @@ def set_node_status(node_id, status, reconnect_on_online=True):
2803
2803
  return True
2804
2804
 
2805
2805
 
2806
- def recreate_lvstore_on_sec(snode):
2806
+ def recreate_lvstore_on_sec(secondary_node):
2807
2807
  db_controller = DBController()
2808
- rpc_client = RPCClient(
2809
- snode.mgmt_ip, snode.rpc_port,
2810
- snode.rpc_username, snode.rpc_password)
2808
+ secondary_rpc_client = RPCClient(
2809
+ secondary_node.mgmt_ip, secondary_node.rpc_port,
2810
+ secondary_node.rpc_username, secondary_node.rpc_password)
2811
2811
 
2812
- nodes = db_controller.get_primary_storage_nodes_by_secondary_node_id(snode.get_id())
2812
+ primary_nodes = db_controller.get_primary_storage_nodes_by_secondary_node_id(secondary_node.get_id())
2813
2813
 
2814
- for node in nodes:
2815
- remote_rpc_client = RPCClient(
2816
- node.mgmt_ip, node.rpc_port, node.rpc_username, node.rpc_password)
2814
+ for primary_node in primary_nodes:
2815
+ primary_rpc_client = RPCClient(
2816
+ primary_node.mgmt_ip, primary_node.rpc_port, primary_node.rpc_username, primary_node.rpc_password)
2817
2817
 
2818
- node.lvstore_status = "in_creation"
2819
- node.write_to_db()
2818
+ primary_node.lvstore_status = "in_creation"
2819
+ primary_node.write_to_db()
2820
2820
 
2821
2821
  lvol_list = []
2822
- for lv in db_controller.get_lvols_by_node_id(node.get_id()):
2822
+ for lv in db_controller.get_lvols_by_node_id(primary_node.get_id()):
2823
2823
  if lv.status not in [LVol.STATUS_IN_DELETION, LVol.STATUS_IN_CREATION]:
2824
2824
  lvol_list.append(lv)
2825
2825
 
2826
2826
  ### 1- create distribs and raid
2827
- ret, err = _create_bdev_stack(snode, node.lvstore_stack, primary_node=node)
2827
+ ret, err = _create_bdev_stack(secondary_node, primary_node.lvstore_stack, primary_node=primary_node)
2828
2828
  if err:
2829
- logger.error(f"Failed to recreate lvstore on node {snode.get_id()}")
2829
+ logger.error(f"Failed to recreate lvstore on node {secondary_node.get_id()}")
2830
2830
  logger.error(err)
2831
2831
  return False
2832
2832
 
2833
- node_api = SNodeClient(node.api_endpoint)
2833
+ primary_node_api = SNodeClient(primary_node.api_endpoint)
2834
2834
 
2835
2835
  ### 2- create lvols nvmf subsystems
2836
2836
  for lvol in lvol_list:
2837
2837
  logger.info("creating subsystem %s", lvol.nqn)
2838
- rpc_client.subsystem_create(lvol.nqn, 'sbcli-cn', lvol.uuid, 1000)
2838
+ secondary_rpc_client.subsystem_create(lvol.nqn, 'sbcli-cn', lvol.uuid, 1000)
2839
2839
 
2840
- if node.status == StorageNode.STATUS_ONLINE:
2840
+ if primary_node.status == StorageNode.STATUS_ONLINE:
2841
2841
 
2842
2842
  ### 3- block primary port
2843
- node_api.firewall_set_port(node.lvol_subsys_port, "tcp", "block")
2844
- tcp_ports_events.port_deny(node, node.lvol_subsys_port)
2843
+ primary_node_api.firewall_set_port(primary_node.lvol_subsys_port, "tcp", "block")
2844
+ tcp_ports_events.port_deny(primary_node, primary_node.lvol_subsys_port)
2845
2845
 
2846
2846
  ### 4- set leadership to false
2847
- remote_rpc_client.bdev_lvol_set_leader(False, lvs_name=node.lvstore)
2848
- remote_rpc_client.bdev_distrib_force_to_non_leader(node.jm_vuid)
2847
+ primary_rpc_client.bdev_lvol_set_leader(primary_node.lvstore, leader=False)
2848
+ primary_rpc_client.bdev_distrib_force_to_non_leader(primary_node.jm_vuid)
2849
2849
  # time.sleep(1)
2850
2850
 
2851
2851
 
2852
2852
  ### 5- examine
2853
- ret = rpc_client.bdev_examine(node.raid)
2853
+ ret = secondary_rpc_client.bdev_examine(primary_node.raid)
2854
2854
 
2855
2855
  ### 6- wait for examine
2856
- ret = rpc_client.bdev_wait_for_examine()
2857
- ret = rpc_client.bdev_lvol_set_lvs_ops(node.lvstore, node.jm_vuid, node.lvol_subsys_port)
2856
+ ret = secondary_rpc_client.bdev_wait_for_examine()
2857
+ try:
2858
+ secondary_node.connect_to_hublvol(primary_node)
2859
+
2860
+ except RPCException as e:
2861
+ logger.error("Error connecting to hublvol: %s", e.message)
2862
+ return False
2858
2863
 
2859
2864
  ### 8- allow port on primary
2860
- node_api.firewall_set_port(node.lvol_subsys_port, "tcp", "allow")
2861
- tcp_ports_events.port_allowed(node, node.lvol_subsys_port)
2865
+ primary_node_api.firewall_set_port(primary_node.lvol_subsys_port, "tcp", "allow")
2866
+ tcp_ports_events.port_allowed(primary_node, primary_node.lvol_subsys_port)
2862
2867
 
2863
2868
  ### 7- add lvols to subsystems
2864
2869
  executor = ThreadPoolExecutor(max_workers=100)
2865
2870
  for lvol in lvol_list:
2866
- a = executor.submit(add_lvol_thread, lvol, snode, lvol_ana_state="non_optimized")
2871
+ a = executor.submit(add_lvol_thread, lvol, secondary_node, lvol_ana_state="non_optimized")
2867
2872
 
2868
- node = db_controller.get_storage_node_by_id(node.get_id())
2869
- node.lvstore_status = "ready"
2870
- node.write_to_db()
2873
+ primary_node = db_controller.get_storage_node_by_id(primary_node.get_id())
2874
+ primary_node.lvstore_status = "ready"
2875
+ primary_node.write_to_db()
2871
2876
 
2872
2877
  return True
2873
2878
 
@@ -2936,7 +2941,7 @@ def recreate_lvstore(snode):
2936
2941
 
2937
2942
  # time.sleep(1)
2938
2943
  ### 4- set leadership to false
2939
- sec_rpc_client.bdev_lvol_set_leader(False, lvs_name=snode.lvstore, bs_nonleadership=True)
2944
+ sec_rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=False, bs_nonleadership=True)
2940
2945
  sec_rpc_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
2941
2946
  # time.sleep(1)
2942
2947
 
@@ -2946,10 +2951,32 @@ def recreate_lvstore(snode):
2946
2951
 
2947
2952
  ### 6- wait for examine
2948
2953
  ret = rpc_client.bdev_wait_for_examine()
2949
- ret = rpc_client.bdev_lvol_set_lvs_ops(snode.lvstore, snode.jm_vuid, snode.lvol_subsys_port)
2950
- ret = rpc_client.bdev_lvol_set_leader(True, lvs_name=snode.lvstore)
2954
+ ret = rpc_client.bdev_lvol_set_lvs_opts(
2955
+ snode.lvstore,
2956
+ groupid=snode.jm_vuid,
2957
+ subsystem_port=snode.lvol_subsys_port
2958
+ )
2959
+ ret = rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=True)
2960
+
2961
+ if sec_node:
2962
+ ### 7- create and connect hublvol
2963
+ cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
2964
+ try:
2965
+ snode.create_hublvol(cluster_nqn)
2966
+ if sec_node.status == StorageNode.STATUS_ONLINE:
2967
+ sec_node.connect_to_hublvol(snode)
2951
2968
 
2952
- ### 7- add lvols to subsystems
2969
+ except RPCException as e:
2970
+ logger.error("Error establishing hublvol: %s", e.message)
2971
+ return False
2972
+
2973
+ finally:
2974
+ ### 8- allow secondary port
2975
+ if sec_node.status == StorageNode.STATUS_ONLINE:
2976
+ sec_node_api.firewall_set_port(snode.lvol_subsys_port, "tcp", "allow", sec_node.rpc_port)
2977
+ tcp_ports_events.port_allowed(sec_node, snode.lvol_subsys_port)
2978
+
2979
+ ### 9- add lvols to subsystems
2953
2980
  executor = ThreadPoolExecutor(max_workers=100)
2954
2981
  for lvol in lvol_list:
2955
2982
  a = executor.submit(add_lvol_thread, lvol, snode, lvol_ana_state)
@@ -2959,11 +2986,8 @@ def recreate_lvstore(snode):
2959
2986
  logger.info("Node status changed to suspended")
2960
2987
  return False
2961
2988
 
2962
- ### 8- allow secondary port
2989
+ ### 10- finish
2963
2990
  if sec_node.status == StorageNode.STATUS_ONLINE:
2964
- time.sleep(7)
2965
- sec_node_api.firewall_set_port(snode.lvol_subsys_port, "tcp", "allow", sec_node.rpc_port)
2966
- tcp_ports_events.port_allowed(sec_node, snode.lvol_subsys_port)
2967
2991
  sec_node = db_controller.get_storage_node_by_id(snode.secondary_node_id)
2968
2992
  sec_node.lvstore_status = "ready"
2969
2993
  sec_node.write_to_db()
@@ -3019,6 +3043,8 @@ def get_sorted_ha_jms(current_node):
3019
3043
  if (node.get_id() == current_node.get_id() or node.status != StorageNode.STATUS_ONLINE or
3020
3044
  node.is_secondary_node): # pass
3021
3045
  continue
3046
+ if node.mgmt_ip == current_node.mgmt_ip:
3047
+ continue
3022
3048
  if node.jm_device and node.jm_device.status == JMDevice.STATUS_ONLINE:
3023
3049
  jm_count[node.jm_device.get_id()] = 1 + jm_count.get(node.jm_device.get_id(), 0)
3024
3050
  for rem_jm_device in node.remote_jm_devices:
@@ -3186,25 +3212,32 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
3186
3212
  return False
3187
3213
 
3188
3214
  if snode.secondary_node_id:
3215
+ sec_node = db_controller.get_storage_node_by_id(snode.secondary_node_id)
3216
+
3189
3217
  # creating lvstore on secondary
3190
- sec_node_1 = db_controller.get_storage_node_by_id(snode.secondary_node_id)
3191
- sec_node_1.remote_jm_devices = _connect_to_remote_jm_devs(sec_node_1)
3192
- sec_node_1.write_to_db()
3193
- ret, err = _create_bdev_stack(sec_node_1, lvstore_stack, primary_node=snode)
3218
+ sec_node.remote_jm_devices = _connect_to_remote_jm_devs(sec_node)
3219
+ sec_node.write_to_db()
3220
+ ret, err = _create_bdev_stack(sec_node, lvstore_stack, primary_node=snode)
3194
3221
  if err:
3195
- logger.error(f"Failed to create lvstore on node {sec_node_1.get_id()}")
3222
+ logger.error(f"Failed to create lvstore on node {sec_node.get_id()}")
3196
3223
  logger.error(err)
3197
3224
  return False
3198
3225
 
3199
- temp_rpc_client = RPCClient(
3200
- sec_node_1.mgmt_ip, sec_node_1.rpc_port,
3201
- sec_node_1.rpc_username, sec_node_1.rpc_password)
3226
+ sec_rpc_client = sec_node.rpc_client()
3227
+ sec_rpc_client.bdev_examine(snode.raid)
3228
+ sec_rpc_client.bdev_wait_for_examine()
3202
3229
 
3203
- ret = temp_rpc_client.bdev_examine(snode.raid)
3204
- ret = temp_rpc_client.bdev_wait_for_examine()
3205
- ret = temp_rpc_client.bdev_lvol_set_lvs_ops(snode.lvstore, snode.jm_vuid, snode.lvol_subsys_port)
3230
+ cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
3231
+ try:
3232
+ snode.create_hublvol(cluster_nqn)
3233
+ if sec_node.status == StorageNode.STATUS_ONLINE:
3234
+ sec_node.connect_to_hublvol(snode)
3206
3235
 
3207
- sec_node_1.write_to_db()
3236
+ except RPCException as e:
3237
+ logger.error("Error establishing hublvol: %s", e.message)
3238
+ return False
3239
+
3240
+ sec_node.write_to_db()
3208
3241
 
3209
3242
  return True
3210
3243
 
@@ -28,6 +28,10 @@ CONFIG_KEYS = [
28
28
  "jc_singleton_core",
29
29
  ]
30
30
 
31
+
32
+ UUID_PATTERN = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$')
33
+
34
+
31
35
  def get_env_var(name, default=None, is_required=False):
32
36
  if not name:
33
37
  logger.warning("Invalid env var name %s", name)
@@ -929,3 +933,11 @@ def init_sentry_sdk(name=None):
929
933
  # # set_level("critical")
930
934
 
931
935
  return True
936
+
937
+
938
+ def generate_hex_string(length):
939
+ def _generate_string(length):
940
+ return ''.join(random.SystemRandom().choice(
941
+ string.ascii_letters + string.digits) for _ in range(length))
942
+
943
+ return _generate_string(length).encode('utf-8').hex()