sbcli-dev 17.3.4__tar.gz → 17.3.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/PKG-INFO +1 -1
  2. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/PKG-INFO +1 -1
  3. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/SOURCES.txt +1 -0
  4. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/lvol_controller.py +1 -9
  5. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/snapshot_controller.py +1 -1
  6. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/env_var +1 -1
  7. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/base_model.py +5 -2
  8. sbcli_dev-17.3.6/simplyblock_core/models/hublvol.py +12 -0
  9. sbcli_dev-17.3.6/simplyblock_core/models/storage_node.py +211 -0
  10. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/rpc_client.py +33 -17
  11. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/storage_node_ops.py +97 -54
  12. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/utils.py +12 -0
  13. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/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.6}/README.md +0 -0
  16. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/pyproject.toml +0 -0
  17. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/requirements.txt +0 -0
  18. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/dependency_links.txt +0 -0
  19. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/entry_points.txt +0 -0
  20. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/requires.txt +0 -0
  21. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/top_level.txt +0 -0
  22. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/setup.cfg +0 -0
  23. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/setup.py +0 -0
  24. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_cli/__init__.py +0 -0
  25. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_cli/cli.py +0 -0
  26. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_cli/clibase.py +0 -0
  27. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_cli/main.py +0 -0
  28. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/__init__.py +0 -0
  29. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/cluster_ops.py +0 -0
  30. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/cnode_client.py +0 -0
  31. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/constants.py +0 -0
  32. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/__init__.py +0 -0
  33. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  34. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/cluster_events.py +0 -0
  35. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/device_controller.py +0 -0
  36. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/device_events.py +0 -0
  37. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/events_controller.py +0 -0
  38. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/health_controller.py +0 -0
  39. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/lvol_events.py +0 -0
  40. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/mgmt_events.py +0 -0
  41. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/pool_controller.py +0 -0
  42. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/pool_events.py +0 -0
  43. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/snapshot_events.py +0 -0
  44. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/storage_events.py +0 -0
  45. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/tasks_controller.py +0 -0
  46. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/tasks_events.py +0 -0
  47. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
  48. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/db_controller.py +0 -0
  49. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/distr_controller.py +0 -0
  50. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/mgmt_node_ops.py +0 -0
  51. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/__init__.py +0 -0
  52. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/caching_node.py +0 -0
  53. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/cluster.py +0 -0
  54. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/deployer.py +0 -0
  55. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/events.py +0 -0
  56. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/iface.py +0 -0
  57. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/job_schedule.py +0 -0
  58. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/lvol_model.py +0 -0
  59. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/mgmt_node.py +0 -0
  60. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/nvme_device.py +0 -0
  61. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/pool.py +0 -0
  62. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/port_stat.py +0 -0
  63. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/snapshot.py +0 -0
  64. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/stats.py +0 -0
  65. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/pci_utils.py +0 -0
  66. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/__init__.py +0 -0
  67. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  68. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  69. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  70. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/config_docker.sh +0 -0
  71. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboard.yml +0 -0
  72. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  73. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  74. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  75. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  76. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  77. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  78. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/datasource.yml +0 -0
  79. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/db_config_double.sh +0 -0
  80. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/db_config_single.sh +0 -0
  81. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
  82. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  83. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  84. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  85. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/foundation.yml +0 -0
  86. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/haproxy.cfg +0 -0
  87. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/install_deps.sh +0 -0
  88. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/objstore.yml +0 -0
  89. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
  90. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/prometheus.yml.j2 +0 -0
  91. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/run_ssh.sh +0 -0
  92. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/set_db_config.sh +0 -0
  93. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  94. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/__init__.py +0 -0
  95. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  96. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/caching_node_monitor.py +0 -0
  97. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/cap_monitor.py +0 -0
  98. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  99. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/device_monitor.py +0 -0
  100. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/health_check_service.py +0 -0
  101. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/install_service.sh +0 -0
  102. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/lvol_monitor.py +0 -0
  103. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  104. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  105. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  106. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/new_device_discovery.py +0 -0
  107. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/remove_service.sh +0 -0
  108. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/service_template.service +0 -0
  109. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/spdk/__init__.py +0 -0
  110. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/spdk/client.py +0 -0
  111. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
  112. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/spdk_stats_collector.py +0 -0
  113. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/storage_node_monitor.py +0 -0
  114. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  115. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  116. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  117. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  118. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  119. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/shell_utils.py +0 -0
  120. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/snode_client.py +0 -0
  121. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/test/test_utils.py +0 -0
  122. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
  123. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/README.md +0 -0
  124. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/__init__.py +0 -0
  125. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/app.py +0 -0
  126. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/auth_middleware.py +0 -0
  127. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/__init__.py +0 -0
  128. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  129. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  130. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  131. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  132. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  133. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/snode_ops.py +0 -0
  134. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  135. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
  136. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  137. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  138. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  139. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_device.py +0 -0
  140. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  141. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_metrics.py +0 -0
  142. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  143. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  144. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  145. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/node_utils.py +0 -0
  146. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/node_utils_k8s.py +0 -0
  147. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/node_webapp.py +0 -0
  148. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/requirements.txt +0 -0
  149. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
  150. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/delete.py +0 -0
  151. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/deploy.py +0 -0
  152. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  153. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  154. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/is_up.py +0 -0
  155. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/list_deps.py +0 -0
  156. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/rpac.yaml +0 -0
  157. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/swagger.yaml +0 -0
  158. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/tst.py +0 -0
  159. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  160. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  161. {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sbcli-dev
3
- Version: 17.3.4
3
+ Version: 17.3.6
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sbcli-dev
3
- Version: 17.3.4
3
+ Version: 17.3.6
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.6
3
3
 
4
4
  SIMPLY_BLOCK_DOCKER_IMAGE=public.ecr.aws/simply-block/simplyblock:main
5
5
  SIMPLY_BLOCK_SPDK_ULTRA_IMAGE=public.ecr.aws/simply-block/ultra:main-latest
@@ -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,33 @@ 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
+ primary=True
2959
+ )
2960
+ ret = rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=True)
2961
+
2962
+ if sec_node:
2963
+ ### 7- create and connect hublvol
2964
+ cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
2965
+ try:
2966
+ snode.create_hublvol(cluster_nqn)
2967
+ if sec_node.status == StorageNode.STATUS_ONLINE:
2968
+ sec_node.connect_to_hublvol(snode)
2969
+
2970
+ except RPCException as e:
2971
+ logger.error("Error establishing hublvol: %s", e.message)
2972
+ return False
2951
2973
 
2952
- ### 7- add lvols to subsystems
2974
+ finally:
2975
+ ### 8- allow secondary port
2976
+ if sec_node.status == StorageNode.STATUS_ONLINE:
2977
+ sec_node_api.firewall_set_port(snode.lvol_subsys_port, "tcp", "allow", sec_node.rpc_port)
2978
+ tcp_ports_events.port_allowed(sec_node, snode.lvol_subsys_port)
2979
+
2980
+ ### 9- add lvols to subsystems
2953
2981
  executor = ThreadPoolExecutor(max_workers=100)
2954
2982
  for lvol in lvol_list:
2955
2983
  a = executor.submit(add_lvol_thread, lvol, snode, lvol_ana_state)
@@ -2959,11 +2987,8 @@ def recreate_lvstore(snode):
2959
2987
  logger.info("Node status changed to suspended")
2960
2988
  return False
2961
2989
 
2962
- ### 8- allow secondary port
2990
+ ### 10- finish
2963
2991
  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
2992
  sec_node = db_controller.get_storage_node_by_id(snode.secondary_node_id)
2968
2993
  sec_node.lvstore_status = "ready"
2969
2994
  sec_node.write_to_db()
@@ -3019,6 +3044,8 @@ def get_sorted_ha_jms(current_node):
3019
3044
  if (node.get_id() == current_node.get_id() or node.status != StorageNode.STATUS_ONLINE or
3020
3045
  node.is_secondary_node): # pass
3021
3046
  continue
3047
+ if node.mgmt_ip == current_node.mgmt_ip:
3048
+ continue
3022
3049
  if node.jm_device and node.jm_device.status == JMDevice.STATUS_ONLINE:
3023
3050
  jm_count[node.jm_device.get_id()] = 1 + jm_count.get(node.jm_device.get_id(), 0)
3024
3051
  for rem_jm_device in node.remote_jm_devices:
@@ -3185,26 +3212,42 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
3185
3212
  logger.error(err)
3186
3213
  return False
3187
3214
 
3215
+ rpc_client = RPCClient(snode.mgmt_ip, snode.rpc_port, snode.rpc_username, snode.rpc_password )
3216
+ ret = rpc_client.bdev_lvol_set_lvs_opts(
3217
+ snode.lvstore,
3218
+ groupid=snode.jm_vuid,
3219
+ subsystem_port=snode.lvol_subsys_port,
3220
+ primary=True
3221
+ )
3222
+ ret = rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=True)
3223
+
3188
3224
  if snode.secondary_node_id:
3225
+ sec_node = db_controller.get_storage_node_by_id(snode.secondary_node_id)
3226
+
3189
3227
  # 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)
3228
+ sec_node.remote_jm_devices = _connect_to_remote_jm_devs(sec_node)
3229
+ sec_node.write_to_db()
3230
+ ret, err = _create_bdev_stack(sec_node, lvstore_stack, primary_node=snode)
3194
3231
  if err:
3195
- logger.error(f"Failed to create lvstore on node {sec_node_1.get_id()}")
3232
+ logger.error(f"Failed to create lvstore on node {sec_node.get_id()}")
3196
3233
  logger.error(err)
3197
3234
  return False
3198
3235
 
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)
3236
+ sec_rpc_client = sec_node.rpc_client()
3237
+ sec_rpc_client.bdev_examine(snode.raid)
3238
+ sec_rpc_client.bdev_wait_for_examine()
3239
+
3240
+ cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
3241
+ try:
3242
+ snode.create_hublvol(cluster_nqn)
3243
+ if sec_node.status == StorageNode.STATUS_ONLINE:
3244
+ sec_node.connect_to_hublvol(snode)
3202
3245
 
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)
3246
+ except RPCException as e:
3247
+ logger.error("Error establishing hublvol: %s", e.message)
3248
+ return False
3206
3249
 
3207
- sec_node_1.write_to_db()
3250
+ sec_node.write_to_db()
3208
3251
 
3209
3252
  return True
3210
3253