sbcli-dev 3.8.36__zip → 3.8.37__zip

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 (149) hide show
  1. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/PKG-INFO +1 -1
  2. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/env_var +1 -1
  3. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/PKG-INFO +1 -1
  4. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_cli/cli.py +4 -1
  5. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/cluster_ops.py +9 -9
  6. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/constants.py +4 -2
  7. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/lvol_controller.py +16 -1
  8. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/tasks_controller.py +19 -17
  9. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/nvme_device.py +1 -0
  10. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/storage_node.py +2 -0
  11. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/rpc_client.py +18 -2
  12. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/storage_node_ops.py +125 -79
  13. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/README.md +0 -0
  14. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/pyproject.toml +0 -0
  15. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/SOURCES.txt +0 -0
  16. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/dependency_links.txt +0 -0
  17. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/entry_points.txt +0 -0
  18. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/requires.txt +0 -0
  19. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/top_level.txt +0 -0
  20. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/setup.cfg +0 -0
  21. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/setup.py +0 -0
  22. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_cli/main.py +0 -0
  23. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/__init__.py +0 -0
  24. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/cnode_client.py +0 -0
  25. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/compute_node_ops.py +0 -0
  26. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/__init__.py +0 -0
  27. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  28. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/cluster_events.py +0 -0
  29. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/device_controller.py +0 -0
  30. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/device_events.py +0 -0
  31. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/events_controller.py +0 -0
  32. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/health_controller.py +0 -0
  33. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/lvol_events.py +0 -0
  34. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/mgmt_events.py +0 -0
  35. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/pool_controller.py +0 -0
  36. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/pool_events.py +0 -0
  37. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  38. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/snapshot_events.py +0 -0
  39. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/storage_events.py +0 -0
  40. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/tasks_events.py +0 -0
  41. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/distr_controller.py +0 -0
  42. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/kv_store.py +0 -0
  43. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/mgmt_node_ops.py +0 -0
  44. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/__init__.py +0 -0
  45. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/base_model.py +0 -0
  46. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/caching_node.py +0 -0
  47. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/cluster.py +0 -0
  48. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/compute_node.py +0 -0
  49. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/deployer.py +0 -0
  50. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/events.py +0 -0
  51. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/global_settings.py +0 -0
  52. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/iface.py +0 -0
  53. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/job_schedule.py +0 -0
  54. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/lvol_model.py +0 -0
  55. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/mgmt_node.py +0 -0
  56. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/pool.py +0 -0
  57. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/port_stat.py +0 -0
  58. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/snapshot.py +0 -0
  59. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/stats.py +0 -0
  60. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/pci_utils.py +0 -0
  61. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/__init__.py +0 -0
  62. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  63. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  64. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  65. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/config_docker.sh +0 -0
  66. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboard.yml +0 -0
  67. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  68. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  69. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  70. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  71. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  72. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  73. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/datasource.yml +0 -0
  74. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/db_config_double.sh +0 -0
  75. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/db_config_single.sh +0 -0
  76. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  77. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  78. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  79. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/haproxy.cfg +0 -0
  80. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/install_deps.sh +0 -0
  81. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/objstore.yml +0 -0
  82. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/prometheus.yml +0 -0
  83. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/run_ssh.sh +0 -0
  84. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/set_db_config.sh +0 -0
  85. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  86. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/__init__.py +0 -0
  87. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  88. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/caching_node_monitor.py +0 -0
  89. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/cap_monitor.py +0 -0
  90. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  91. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/device_monitor.py +0 -0
  92. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/distr_event_collector.py +0 -0
  93. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/health_check_service.py +0 -0
  94. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/install_service.sh +0 -0
  95. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/log_agg_service.py +0 -0
  96. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/lvol_monitor.py +0 -0
  97. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  98. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  99. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  100. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/new_device_discovery.py +0 -0
  101. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/port_stat_collector.py +0 -0
  102. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/remove_service.sh +0 -0
  103. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/service_template.service +0 -0
  104. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/storage_node_monitor.py +0 -0
  105. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  106. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  107. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  108. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  109. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  110. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/shell_utils.py +0 -0
  111. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/snode_client.py +0 -0
  112. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/utils.py +0 -0
  113. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/__init__.py +0 -0
  114. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/app.py +0 -0
  115. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/auth_middleware.py +0 -0
  116. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/__init__.py +0 -0
  117. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  118. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  119. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  120. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  121. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  122. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/snode_ops.py +0 -0
  123. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  124. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  125. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  126. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  127. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_device.py +0 -0
  128. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  129. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  130. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  131. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  132. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  133. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/caching_node_app.py +0 -0
  134. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/caching_node_app_k8s.py +0 -0
  135. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/node_utils.py +0 -0
  136. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/node_webapp.py +0 -0
  137. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/snode_app.py +0 -0
  138. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/snode_app_k8s.py +0 -0
  139. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/delete.py +0 -0
  140. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy.py +0 -0
  141. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  142. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  143. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/is_up.py +0 -0
  144. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/list_deps.py +0 -0
  145. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/rpac.yaml +0 -0
  146. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/tst.py +0 -0
  147. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  148. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  149. {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-dev
3
- Version: 3.8.36
3
+ Version: 3.8.37
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -1,5 +1,5 @@
1
1
  SIMPLY_BLOCK_COMMAND_NAME=sbcli-dev
2
- SIMPLY_BLOCK_VERSION=3.8.36
2
+ SIMPLY_BLOCK_VERSION=3.8.37
3
3
 
4
4
 
5
5
  SIMPLY_BLOCK_DOCKER_IMAGE=simplyblock/simplyblock:main
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-dev
3
- Version: 3.8.36
3
+ Version: 3.8.37
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -56,6 +56,7 @@ class CLIWrapper:
56
56
  sub_command.add_argument("--iobuf_small_bufsize", help='bdev_set_options param', dest='small_bufsize', type=int, default=0)
57
57
  sub_command.add_argument("--iobuf_large_bufsize", help='bdev_set_options param', dest='large_bufsize', type=int, default=0)
58
58
  sub_command.add_argument("--enable-test-device", help='Enable creation of test device', action='store_true')
59
+ sub_command.add_argument("--enable-ha-jm", help='Enable HA JM for ditrib creation', action='store_true')
59
60
 
60
61
 
61
62
  # delete storage node
@@ -717,6 +718,7 @@ class CLIWrapper:
717
718
  max_prov = self.parse_size(args.max_prov)
718
719
  number_of_devices = args.number_of_devices
719
720
  enable_test_device = args.enable_test_device
721
+ enable_ha_jm = args.enable_ha_jm
720
722
  number_of_distribs = args.number_of_distribs
721
723
  if max_prov < 1 * 1024 * 1024 * 1024:
722
724
  return f"Max provisioning memory:{args.max_prov} must be larger than 1G"
@@ -739,7 +741,8 @@ class CLIWrapper:
739
741
  number_of_devices=number_of_devices,
740
742
  enable_test_device=enable_test_device,
741
743
  namespace=None,
742
- number_of_distribs=number_of_distribs
744
+ number_of_distribs=number_of_distribs,
745
+ enable_ha_jm=enable_ha_jm
743
746
  )
744
747
 
745
748
  return out
@@ -369,7 +369,7 @@ def cluster_activate(cl_id):
369
369
  logger.info(f"Node {snode.get_id()} already has lvstore {snode.lvstore}... skipping")
370
370
  continue
371
371
  ret = storage_node_ops.create_lvstore(snode, cluster.distr_ndcs, cluster.distr_npcs, cluster.distr_bs,
372
- cluster.distr_chunk_bs, cluster.page_size_in_blocks, max_size)
372
+ cluster.distr_chunk_bs, cluster.page_size_in_blocks, max_size, snodes)
373
373
  if not ret:
374
374
  logger.error("Failed to activate cluster")
375
375
  set_cluster_status(cl_id, Cluster.STATUS_UNREADY)
@@ -688,14 +688,14 @@ def update_cluster(cl_id):
688
688
  except Exception as e:
689
689
  print(e)
690
690
 
691
- for node in db_controller.get_storage_nodes_by_cluster_id(cl_id):
692
- node_docker = docker.DockerClient(base_url=f"tcp://{node.mgmt_ip}:2375", version="auto")
693
- logger.info(f"Pulling image {constants.SIMPLY_BLOCK_SPDK_ULTRA_IMAGE}")
694
- node_docker.images.pull(constants.SIMPLY_BLOCK_SPDK_ULTRA_IMAGE)
695
- if node.status == StorageNode.STATUS_ONLINE:
696
- storage_node_ops.shutdown_storage_node(node.get_id(), force=True)
697
- time.sleep(3)
698
- storage_node_ops.restart_storage_node(node.get_id())
691
+ # for node in db_controller.get_storage_nodes_by_cluster_id(cl_id):
692
+ # node_docker = docker.DockerClient(base_url=f"tcp://{node.mgmt_ip}:2375", version="auto")
693
+ # logger.info(f"Pulling image {constants.SIMPLY_BLOCK_SPDK_ULTRA_IMAGE}")
694
+ # node_docker.images.pull(constants.SIMPLY_BLOCK_SPDK_ULTRA_IMAGE)
695
+ # if node.status == StorageNode.STATUS_ONLINE:
696
+ # storage_node_ops.shutdown_storage_node(node.get_id(), force=True)
697
+ # time.sleep(3)
698
+ # storage_node_ops.restart_storage_node(node.get_id())
699
699
 
700
700
  logger.info("Done")
701
701
  return True
@@ -11,7 +11,7 @@ LOG_WEB_DEBUG = True
11
11
 
12
12
  INSTALL_DIR = os.path.dirname(os.path.realpath(__file__))
13
13
 
14
- NODE_MONITOR_INTERVAL_SEC = 3
14
+ NODE_MONITOR_INTERVAL_SEC = 10
15
15
  DEVICE_MONITOR_INTERVAL_SEC = 5
16
16
  STAT_COLLECTOR_INTERVAL_SEC = 60*5 # 5 minutes
17
17
  LVOL_STAT_COLLECTOR_INTERVAL_SEC = 5
@@ -52,13 +52,15 @@ GRAYLOG_CHECK_INTERVAL_SEC = 60
52
52
 
53
53
  FDB_CHECK_INTERVAL_SEC = 60
54
54
 
55
- SIMPLY_BLOCK_DOCKER_IMAGE = "simplyblock/simplyblock:main"
55
+ SIMPLY_BLOCK_DOCKER_IMAGE = "simplyblock/simplyblock:dev"
56
56
  SIMPLY_BLOCK_CLI_NAME = "sbcli-dev"
57
57
  TASK_EXEC_INTERVAL_SEC = 30
58
58
  TASK_EXEC_RETRY_COUNT = 8
59
59
 
60
60
  SIMPLY_BLOCK_SPDK_CORE_IMAGE = "simplyblock/spdk-core:latest"
61
+ SIMPLY_BLOCK_SPDK_CORE_IMAGE_ARM64 = "simplyblock/spdk-core:latest-arm64"
61
62
  SIMPLY_BLOCK_SPDK_ULTRA_IMAGE = "simplyblock/spdk:348-temp-migration-2-latest"
63
+ SIMPLY_BLOCK_SPDK_ULTRA_IMAGE_JM = "simplyblock/spdk:feature-journal-ha-latest"
62
64
 
63
65
  GELF_PORT = 12201
64
66
 
@@ -169,6 +169,21 @@ def get_jm_names(snode):
169
169
  return [snode.jm_device.jm_bdev] if snode.jm_device else []
170
170
 
171
171
 
172
+ def get_ha_jm_names(current_node, snode_list):
173
+ jm_list = []
174
+ if current_node.jm_device:
175
+ jm_list.append(current_node.jm_device.jm_bdev)
176
+ else:
177
+ jm_list.append("JM_LOCAL")
178
+
179
+ for node in snode_list:
180
+ if node.get_id() == current_node.get_id():
181
+ continue
182
+ name = f"remote_{node.jm_device.jm_bdev}n1"
183
+ jm_list.append(name)
184
+ return jm_list[:3]
185
+
186
+
172
187
  def _get_next_3_nodes(cluster_id, lvol_size=0):
173
188
  snodes = db_controller.get_storage_nodes_by_cluster_id(cluster_id)
174
189
  online_nodes = []
@@ -564,7 +579,7 @@ def _create_bdev_stack(lvol, snode, ha_comm_addrs, ha_inode_self):
564
579
  ret = None
565
580
 
566
581
  if type == "bdev_distr":
567
- params['jm_names'] = get_jm_names(snode)
582
+ # params['jm_names'] = get_jm_names(snode)
568
583
  params['ha_comm_addrs'] = ha_comm_addrs
569
584
  params['ha_inode_self'] = ha_inode_self
570
585
  params['distrib_cpu_mask'] = snode.distrib_cpu_mask
@@ -54,20 +54,22 @@ def _add_task(function_name, cluster_id, node_id, device_id,
54
54
 
55
55
 
56
56
  def add_device_mig_task(device_id):
57
- device = db_controller.get_storage_devices(device_id)
58
- for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
59
- for lvol_id in node.lvols:
60
- _add_task(JobSchedule.FN_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
61
- max_retry=0, function_params={'lvol_id': lvol_id})
57
+ # device = db_controller.get_storage_devices(device_id)
58
+ # for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
59
+ # for lvol_id in node.lvols:
60
+ # _add_task(JobSchedule.FN_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
61
+ # max_retry=0, function_params={'lvol_id': lvol_id})
62
62
  return True
63
63
 
64
64
 
65
65
  def add_device_to_auto_restart(device):
66
- return _add_task(JobSchedule.FN_DEV_RESTART, device.cluster_id, device.node_id, device.get_id())
66
+ return True
67
+ # return _add_task(JobSchedule.FN_DEV_RESTART, device.cluster_id, device.node_id, device.get_id())
67
68
 
68
69
 
69
70
  def add_node_to_auto_restart(node):
70
- return _add_task(JobSchedule.FN_NODE_RESTART, node.cluster_id, node.get_id(), "")
71
+ return True
72
+ # return _add_task(JobSchedule.FN_NODE_RESTART, node.cluster_id, node.get_id(), "")
71
73
 
72
74
 
73
75
  def list_tasks(cluster_id):
@@ -135,20 +137,20 @@ def get_active_node_mig_task(cluster_id, node_id):
135
137
 
136
138
 
137
139
  def add_device_failed_mig_task(device_id):
138
- device = db_controller.get_storage_devices(device_id)
139
- for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
140
- for lvol_id in node.lvols:
141
- _add_task(JobSchedule.FN_FAILED_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
142
- max_retry=0, function_params={'lvol_id': lvol_id})
140
+ # device = db_controller.get_storage_devices(device_id)
141
+ # for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
142
+ # for lvol_id in node.lvols:
143
+ # _add_task(JobSchedule.FN_FAILED_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
144
+ # max_retry=0, function_params={'lvol_id': lvol_id})
143
145
  return True
144
146
 
145
147
 
146
148
  def add_new_device_mig_task(device_id):
147
- device = db_controller.get_storage_devices(device_id)
148
- for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
149
- for lvol_id in node.lvols:
150
- _add_task(JobSchedule.FN_NEW_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
151
- max_retry=0, function_params={'lvol_id': lvol_id})
149
+ # device = db_controller.get_storage_devices(device_id)
150
+ # for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
151
+ # for lvol_id in node.lvols:
152
+ # _add_task(JobSchedule.FN_NEW_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
153
+ # max_retry=0, function_params={'lvol_id': lvol_id})
152
154
  return True
153
155
 
154
156
 
@@ -113,6 +113,7 @@ class JMDevice(BaseModel):
113
113
  "nvmf_nqn": {"type": str, 'default': ""},
114
114
  "nvmf_ip": {"type": str, 'default': ""},
115
115
  "nvmf_port": {"type": int, 'default': 4420},
116
+ "remote_bdev": {"type": str, 'default': ""},
116
117
 
117
118
  "health_check": {"type": bool, "default": True},
118
119
  "io_error": {"type": bool, 'default': False},
@@ -108,6 +108,8 @@ class StorageNode(BaseModel):
108
108
  "num_partitions_per_dev": {"type": int, "default": 1},
109
109
  "jm_percent": {"type": int, "default": 3},
110
110
  "jm_device": {"type": JMDevice, "default": None},
111
+ "remote_jm_devices": {"type": List[JMDevice], 'default': []},
112
+ "enable_ha_jm": {"type": bool, "default": False},
111
113
 
112
114
  "namespace": {"type": str, "default": ""},
113
115
 
@@ -363,7 +363,7 @@ class RPCClient:
363
363
 
364
364
  def bdev_distrib_create(self, name, vuid, ndcs, npcs, num_blocks, block_size, jm_names,
365
365
  chunk_size, ha_comm_addrs=None, ha_inode_self=None, pba_page_size=2097152,
366
- distrib_cpu_mask=""):
366
+ distrib_cpu_mask="", ha_is_non_leader=True, jm_vuid=1):
367
367
  """"
368
368
  // Optional (not specified = no HA)
369
369
  // Comma-separated communication addresses, for each node, e.g. "192.168.10.1:45001,192.168.10.1:32768".
@@ -379,12 +379,14 @@ class RPCClient:
379
379
  "name": name,
380
380
  "jm_names": ",".join(jm_names),
381
381
  "vuid": vuid,
382
+ "jm_vuid": jm_vuid,
382
383
  "ndcs": ndcs,
383
384
  "npcs": npcs,
384
385
  "num_blocks": num_blocks,
385
386
  "block_size": block_size,
386
387
  "chunk_size": chunk_size,
387
- "pba_page_size": pba_page_size
388
+ "pba_page_size": pba_page_size,
389
+ "ha_is_non_leader": ha_is_non_leader,
388
390
  }
389
391
  if ha_comm_addrs:
390
392
  params['ha_comm_addrs'] = ha_comm_addrs
@@ -470,6 +472,20 @@ class RPCClient:
470
472
  }
471
473
  return self._request("bdev_nvme_attach_controller", params)
472
474
 
475
+ def bdev_nvme_attach_controller_tcp_jm(self, name, nqn, ip, port):
476
+ params = {
477
+ "name": name,
478
+ "trtype": "tcp",
479
+ "traddr": ip,
480
+ "adrfam": "ipv4",
481
+ "trsvcid": str(port),
482
+ "subnqn": nqn,
483
+ "fast_io_fail_timeout_sec": 1,
484
+ "ctrlr_loss_timeout_sec": 1,
485
+ "reconnect_delay_sec": 1,
486
+ }
487
+ return self._request("bdev_nvme_attach_controller", params)
488
+
473
489
  def bdev_nvme_attach_controller_tcp_caching(self, name, nqn, ip, port):
474
490
  params = {
475
491
  "name": name,
@@ -295,9 +295,9 @@ def _create_jm_stack_on_raid(rpc_client, jm_nvme_bdevs, snode, after_restart):
295
295
  logger.error(f"Failed to create pt noexcl bdev: {pt_name}")
296
296
  return False
297
297
 
298
- subsystem_nqn = snode.subsystem + ":dev:" + alceml_id
298
+ subsystem_nqn = snode.subsystem + ":dev:" + jm_bdev
299
299
  logger.info("creating subsystem %s", subsystem_nqn)
300
- ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', alceml_id)
300
+ ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', jm_bdev)
301
301
  IP = None
302
302
  for iface in snode.data_nics:
303
303
  if iface.ip4_address:
@@ -387,9 +387,9 @@ def _create_jm_stack_on_device(rpc_client, nvme, snode, after_restart):
387
387
  logger.error(f"Failed to create pt noexcl bdev: {pt_name}")
388
388
  return False
389
389
 
390
- subsystem_nqn = snode.subsystem + ":dev:" + alceml_id
390
+ subsystem_nqn = snode.subsystem + ":dev:" + jm_bdev
391
391
  logger.info("creating subsystem %s", subsystem_nqn)
392
- ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', alceml_id)
392
+ ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', jm_bdev)
393
393
  IP = None
394
394
  for iface in snode.data_nics:
395
395
  if iface.ip4_address:
@@ -648,6 +648,7 @@ def _prepare_cluster_devices_on_restart(snode):
648
648
  if not dev:
649
649
  logger.error(f"Failed to create dev stack {nvme.get_id()}")
650
650
  return False
651
+ nvme.status = NVMeDevice.STATUS_ONLINE
651
652
  device_events.device_restarted(dev)
652
653
 
653
654
  # prepare JM device
@@ -700,7 +701,6 @@ def _prepare_cluster_devices_on_restart(snode):
700
701
  logger.error(f"Failed to create {jm_bdev}")
701
702
  return False
702
703
 
703
- alceml_id = jm_device.uuid
704
704
  # add pass through
705
705
  pt_name = f"{jm_bdev}_PT"
706
706
  ret = rpc_client.bdev_PT_NoExcl_create(pt_name, jm_bdev)
@@ -708,9 +708,9 @@ def _prepare_cluster_devices_on_restart(snode):
708
708
  logger.error(f"Failed to create pt noexcl bdev: {pt_name}")
709
709
  return False
710
710
 
711
- subsystem_nqn = snode.subsystem + ":dev:" + alceml_id
711
+ subsystem_nqn = snode.subsystem + ":dev:" + jm_bdev
712
712
  logger.info("creating subsystem %s", subsystem_nqn)
713
- ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', alceml_id)
713
+ ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', jm_bdev)
714
714
  IP = None
715
715
  for iface in snode.data_nics:
716
716
  if iface.ip4_address:
@@ -733,7 +733,6 @@ def _prepare_cluster_devices_on_restart(snode):
733
733
  logger.error(f"Failed to add: {pt_name} to the subsystem: {subsystem_nqn}")
734
734
  return False
735
735
 
736
-
737
736
  return True
738
737
 
739
738
 
@@ -750,26 +749,67 @@ def _connect_to_remote_devs(this_node):
750
749
  for node_index, node in enumerate(snodes):
751
750
  if node.get_id() == this_node.get_id() or node.status != StorageNode.STATUS_ONLINE:
752
751
  continue
752
+ logger.info(f"Connecting to node {node.get_id()}")
753
753
  for index, dev in enumerate(node.nvme_devices):
754
754
  if dev.status != NVMeDevice.STATUS_ONLINE:
755
755
  logger.debug(f"Device is not online: {dev.get_id()}, status: {dev.status}")
756
756
  continue
757
+
757
758
  name = f"remote_{dev.alceml_bdev}"
758
- logger.info(f"Connecting to {name}")
759
- ret = rpc_client.bdev_nvme_attach_controller_tcp(name, dev.nvmf_nqn, dev.nvmf_ip, dev.nvmf_port)
760
- if not ret:
761
- logger.error(f"Failed to connect to device: {dev.get_id()}")
762
- continue
763
- dev.remote_bdev = f"{name}n1"
759
+ bdev_name = f"{name}n1"
760
+ ret = rpc_client.get_bdevs(bdev_name)
761
+ if ret:
762
+ logger.info(f"bdev found {bdev_name}")
763
+ else:
764
+ ret = rpc_client.bdev_nvme_attach_controller_tcp(name, dev.nvmf_nqn, dev.nvmf_ip, dev.nvmf_port)
765
+ if not ret:
766
+ logger.error(f"Failed to connect to device: {dev.get_id()}")
767
+ continue
768
+ dev.remote_bdev = bdev_name
764
769
  remote_devices.append(dev)
765
770
  return remote_devices
766
771
 
767
772
 
773
+ def _connect_to_remote_jm_devs(this_node):
774
+ db_controller = DBController()
775
+
776
+ rpc_client = RPCClient(
777
+ this_node.mgmt_ip, this_node.rpc_port,
778
+ this_node.rpc_username, this_node.rpc_password)
779
+
780
+ remote_devices = []
781
+ # connect to remote devs
782
+ snodes = db_controller.get_storage_nodes_by_cluster_id(this_node.cluster_id)
783
+ for node_index, node in enumerate(snodes):
784
+ if node.get_id() == this_node.get_id() or node.status != StorageNode.STATUS_ONLINE:
785
+ continue
786
+
787
+ logger.info(f"Connecting to node {node.get_id()}")
788
+ if node.jm_device:
789
+ name = f"remote_{node.jm_device.jm_bdev}"
790
+ bdev_name = f"{name}n1"
791
+ ret = rpc_client.get_bdevs(bdev_name)
792
+ if ret:
793
+ logger.info(f"bdev found {bdev_name}")
794
+ else:
795
+ logger.info(f"Connecting {this_node.get_id()} to {name}")
796
+ ret = rpc_client.bdev_nvme_attach_controller_tcp(
797
+ name, node.jm_device.nvmf_nqn, node.jm_device.nvmf_ip, node.jm_device.nvmf_port)
798
+ if not ret:
799
+ logger.error(f"failed to connect to remote JM {node.jm_device.jm_bdev}")
800
+ continue
801
+
802
+ node.jm_device.remote_bdev = bdev_name
803
+ remote_devices.append(node.jm_device)
804
+
805
+ return remote_devices
806
+
807
+
768
808
  def add_node(cluster_id, node_ip, iface_name, data_nics_list,
769
809
  max_lvol, max_snap, max_prov, spdk_image=None, spdk_debug=False,
770
810
  small_bufsize=0, large_bufsize=0, spdk_cpu_mask=None,
771
811
  num_partitions_per_dev=0, jm_percent=0, number_of_devices=0, enable_test_device=False,
772
- namespace=None, number_of_distribs=2):
812
+ namespace=None, number_of_distribs=2, enable_ha_jm=False):
773
813
 
774
814
  db_controller = DBController()
775
815
  kv_store = db_controller.kv_store
@@ -913,7 +953,9 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
913
953
  logger.error(f"Failed to Join docker swarm: {err}")
914
954
  return False
915
955
 
916
- rpc_user, rpc_pass = utils.generate_rpc_user_and_pass()
956
+ #rpc_user, rpc_pass = utils.generate_rpc_user_and_pass()
957
+ rpc_user = "rpc_username"
958
+ rpc_pass = "rpc_password"
917
959
  mgmt_ip = node_info['network_interface'][iface_name]['ip']
918
960
 
919
961
  logger.info("Deploying SPDK")
@@ -971,6 +1013,9 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
971
1013
  snode.host_secret = utils.generate_string(20)
972
1014
  snode.ctrl_secret = utils.generate_string(20)
973
1015
  snode.number_of_distribs = number_of_distribs
1016
+ snode.enable_ha_jm = enable_ha_jm
1017
+ if enable_ha_jm:
1018
+ spdk_image = constants.SIMPLY_BLOCK_SPDK_ULTRA_IMAGE_JM
974
1019
 
975
1020
  if 'cpu_count' in node_info:
976
1021
  snode.cpu = node_info['cpu_count']
@@ -1091,6 +1136,10 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
1091
1136
  remote_devices = _connect_to_remote_devs(snode)
1092
1137
  snode.remote_devices = remote_devices
1093
1138
 
1139
+ if snode.enable_ha_jm:
1140
+ logger.info("Connecting to remote JMs")
1141
+ snode.remote_jm_devices = _connect_to_remote_jm_devs(snode)
1142
+
1094
1143
  logger.info("Setting node status to Active")
1095
1144
  snode.status = StorageNode.STATUS_ONLINE
1096
1145
  snode.write_to_db(kv_store)
@@ -1103,7 +1152,6 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
1103
1152
  continue
1104
1153
  logger.info(f"Connecting to node: {node.get_id()}")
1105
1154
  rpc_client = RPCClient(node.mgmt_ip, node.rpc_port, node.rpc_username, node.rpc_password)
1106
- count = 0
1107
1155
  for dev in snode.nvme_devices:
1108
1156
  if dev.status != NVMeDevice.STATUS_ONLINE:
1109
1157
  logger.debug(f"Device is not online: {dev.get_id()}, status: {dev.status}")
@@ -1124,9 +1172,11 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
1124
1172
  node.remote_devices[idx] = dev
1125
1173
  else:
1126
1174
  node.remote_devices.append(dev)
1127
- count += 1
1175
+
1176
+ if node.enable_ha_jm:
1177
+ node.remote_jm_devices = _connect_to_remote_jm_devs(node)
1128
1178
  node.write_to_db(kv_store)
1129
- logger.info(f"connected to devices count: {count}")
1179
+ logger.info(f"connected to devices count: {len(node.remote_devices)}")
1130
1180
  time.sleep(3)
1131
1181
 
1132
1182
  if cluster.status == cluster.STATUS_UNREADY:
@@ -1149,10 +1199,11 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
1149
1199
  distr_controller.send_dev_status_event(dev, NVMeDevice.STATUS_ONLINE)
1150
1200
  tasks_controller.add_new_device_mig_task(dev.get_id())
1151
1201
 
1202
+ nodes = db_controller.get_storage_nodes_by_cluster_id(cluster_id)
1152
1203
  # Create distribs
1153
1204
  max_size = cluster.cluster_max_size
1154
1205
  ret = create_lvstore(snode, cluster.distr_ndcs, cluster.distr_npcs, cluster.distr_bs,
1155
- cluster.distr_chunk_bs, cluster.page_size_in_blocks, max_size)
1206
+ cluster.distr_chunk_bs, cluster.page_size_in_blocks, max_size, nodes)
1156
1207
  if not ret:
1157
1208
  return False, "Failed to create distribs on node"
1158
1209
 
@@ -1577,68 +1628,46 @@ def restart_storage_node(
1577
1628
  logger.error("Failed to prepare cluster devices")
1578
1629
  # return False
1579
1630
 
1631
+ snode.write_to_db(kv_store)
1632
+
1580
1633
  logger.info("Connecting to remote devices")
1581
1634
  remote_devices = _connect_to_remote_devs(snode)
1582
1635
  snode = db_controller.get_storage_node_by_id(node_id)
1583
1636
  snode.remote_devices = remote_devices
1584
1637
  snode.write_to_db(db_controller.kv_store)
1585
1638
 
1586
- # make other nodes connect to the new devices
1587
- logger.info("Make other nodes connect to the node devices")
1588
- snodes = db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id)
1589
- for node_index, node in enumerate(snodes):
1590
- if node.get_id() == snode.get_id() or node.status != StorageNode.STATUS_ONLINE:
1591
- continue
1592
- logger.info(f"Connecting to node: {node.get_id()}")
1593
- rpc_client = RPCClient(node.mgmt_ip, node.rpc_port, node.rpc_username, node.rpc_password)
1594
- count = 0
1595
- for dev in snode.nvme_devices:
1596
- if dev.status != 'online':
1597
- continue
1598
- name = f"remote_{dev.alceml_bdev}"
1599
- ret = rpc_client.bdev_nvme_controller_list(name)
1600
- if ret:
1601
- logger.debug(f"controller found, removing")
1602
- rpc_client.bdev_nvme_detach_controller(name)
1603
- time.sleep(1)
1604
- ret = rpc_client.bdev_nvme_attach_controller_tcp(name, dev.nvmf_nqn, dev.nvmf_ip, dev.nvmf_port)
1605
- if not ret:
1606
- logger.warning(f"Failed to connect to device: {name}")
1607
- return False
1608
-
1609
- dev.remote_bdev = f"{name}n1"
1610
- idx = -1
1611
- for i, d in enumerate(node.remote_devices):
1612
- if d.get_id() == dev.get_id():
1613
- idx = i
1614
- break
1615
- if idx >= 0:
1616
- node.remote_devices[idx] = dev
1617
- else:
1618
- node.remote_devices.append(dev)
1619
- count += 1
1620
- node.write_to_db(kv_store)
1621
- logger.info(f"connected to devices count: {count}")
1622
- time.sleep(3)
1639
+ if snode.enable_ha_jm:
1640
+ logger.info("Connecting to remote JMs")
1641
+ snode.remote_jm_devices = _connect_to_remote_jm_devs(snode)
1623
1642
 
1624
1643
  logger.info("Setting node status to Online")
1625
- snode = db_controller.get_storage_node_by_id(node_id)
1626
1644
  old_status = snode.status
1627
1645
  snode.status = StorageNode.STATUS_ONLINE
1628
1646
  snode.write_to_db(kv_store)
1629
1647
  storage_events.snode_status_change(snode, snode.status, old_status)
1630
1648
 
1631
- logger.info("Sending node event update")
1632
- distr_controller.send_node_status_event(snode, StorageNode.STATUS_ONLINE)
1633
1649
 
1634
- logger.info("Sending devices event updates")
1650
+ # make other nodes connect to the new devices
1651
+ logger.info("Make other nodes connect to the node devices")
1652
+ snodes = db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id)
1653
+ for node in snodes:
1654
+ if node.get_id() == snode.get_id() or node.status != StorageNode.STATUS_ONLINE:
1655
+ continue
1656
+ node.remote_devices = _connect_to_remote_devs(node)
1657
+ if node.enable_ha_jm:
1658
+ node.remote_jm_devices = _connect_to_remote_jm_devs(node)
1659
+ node.write_to_db(kv_store)
1660
+
1661
+ logger.info(f"Sending cluster map to node {node.get_id()}")
1662
+ distr_controller.send_cluster_map_to_node(node)
1663
+
1635
1664
  logger.info("Starting migration tasks")
1636
1665
  for dev in snode.nvme_devices:
1637
1666
  if dev.status != NVMeDevice.STATUS_ONLINE:
1638
1667
  logger.info(f"Device is not online: {dev.get_id()}, status: {dev.status}")
1639
1668
  continue
1640
1669
 
1641
- distr_controller.send_dev_status_event(dev, NVMeDevice.STATUS_ONLINE)
1670
+ # distr_controller.send_dev_status_event(dev, NVMeDevice.STATUS_ONLINE)
1642
1671
  tasks_controller.add_device_mig_task(dev.get_id())
1643
1672
 
1644
1673
  # Create distribs, raid0, and lvstore and expose lvols to the fabrics
@@ -1655,15 +1684,6 @@ def restart_storage_node(
1655
1684
  ret = temp_rpc_client.bdev_wait_for_examine()
1656
1685
  time.sleep(1)
1657
1686
 
1658
- #logger.info("Sending cluster map to current node")
1659
- #ret = distr_controller.send_cluster_map_to_node(snode)
1660
- #if not ret:
1661
- # return False, "Failed to send cluster map"
1662
- #time.sleep(3)
1663
-
1664
- # temp_rpc_client.bdev_examine(snode.raid)
1665
- # time.sleep(3)
1666
-
1667
1687
  if snode.lvols:
1668
1688
  for lvol_id in snode.lvols:
1669
1689
  lvol = lvol_controller.recreate_lvol(lvol_id, snode)
@@ -1765,6 +1785,18 @@ def list_storage_devices(kv_store, node_id, sort, is_json):
1765
1785
  "Serial Number": device.serial_number,
1766
1786
  "Node ID": device.node_id,
1767
1787
  })
1788
+
1789
+ for device in snode.remote_jm_devices:
1790
+ logger.debug(device)
1791
+ logger.debug("*" * 20)
1792
+ remote_devices.append({
1793
+ "UUID": device.uuid,
1794
+ "Name": device.remote_bdev,
1795
+ "Size": utils.humanbytes(device.size),
1796
+ "Serial Number": "",
1797
+ "Node ID": "",
1798
+ })
1799
+
1768
1800
  if sort and sort in ['node-seq', 'dev-seq', 'serial']:
1769
1801
  if sort == 'serial':
1770
1802
  sort_key = "Serial Number"
@@ -2497,7 +2529,10 @@ def set_node_status(node_id, status):
2497
2529
 
2498
2530
  if snode.status == StorageNode.STATUS_ONLINE:
2499
2531
  logger.info("Connecting to remote devices")
2500
- _connect_to_remote_devs(snode)
2532
+ snode.remote_devices = _connect_to_remote_devs(snode)
2533
+ if snode.enable_ha_jm:
2534
+ snode.remote_jm_devices = _connect_to_remote_jm_devs(snode)
2535
+ snode.write_to_db(db_controller.kv_store)
2501
2536
 
2502
2537
  return True
2503
2538
 
@@ -2511,7 +2546,7 @@ def recreate_lvstore(snode):
2511
2546
  return True
2512
2547
 
2513
2548
 
2514
- def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blocks, max_size):
2549
+ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blocks, max_size, nodes):
2515
2550
  lvstore_stack = []
2516
2551
  distrib_list = []
2517
2552
  size = max_size // snode.number_of_distribs
@@ -2519,6 +2554,15 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
2519
2554
  cluster_sz = ndcs * page_size_in_blocks
2520
2555
  strip_size_kb = int((ndcs + npcs) * 64)
2521
2556
  strip_size_kb = utils.nearest_upper_power_of_2(strip_size_kb)
2557
+ if snode.enable_ha_jm:
2558
+ if len(nodes) > 3:
2559
+ nodes = nodes[:3]
2560
+ jm_names = lvol_controller.get_ha_jm_names(snode, nodes)
2561
+ else:
2562
+ jm_names = lvol_controller.get_jm_names(snode)
2563
+
2564
+ jm_vuid = utils.get_random_vuid()
2565
+
2522
2566
  for _ in range(snode.number_of_distribs):
2523
2567
  distrib_vuid = utils.get_random_vuid()
2524
2568
  distrib_name = f"distrib_{distrib_vuid}"
@@ -2530,6 +2574,8 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
2530
2574
  "name": distrib_name,
2531
2575
  "params": {
2532
2576
  "name": distrib_name,
2577
+ "jm_names": jm_names,
2578
+ "jm_vuid": jm_vuid,
2533
2579
  "vuid": distrib_vuid,
2534
2580
  "ndcs": ndcs,
2535
2581
  "npcs": npcs,
@@ -2548,11 +2594,12 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
2548
2594
  {
2549
2595
  "type": "bdev_raid",
2550
2596
  "name": raid_device,
2551
- "params":
2552
- {"name": raid_device,
2553
- "raid_level": "0",
2554
- "base_bdevs": distrib_list,
2555
- "strip_size_kb": strip_size_kb},
2597
+ "params": {
2598
+ "name": raid_device,
2599
+ "raid_level": "0",
2600
+ "base_bdevs": distrib_list,
2601
+ "strip_size_kb": strip_size_kb
2602
+ },
2556
2603
  "distribs_list": distrib_list
2557
2604
  },
2558
2605
  {
@@ -2602,7 +2649,6 @@ def _create_bdev_stack(snode, lvstore_stack=None):
2602
2649
  params = bdev['params']
2603
2650
 
2604
2651
  if type == "bdev_distr":
2605
- params['jm_names'] = lvol_controller.get_jm_names(snode)
2606
2652
  if snode.distrib_cpu_cores:
2607
2653
  distrib_cpu_mask = utils.decimal_to_hex_power_of_2(snode.distrib_cpu_cores[snode.distrib_cpu_index])
2608
2654
  params['distrib_cpu_mask'] = distrib_cpu_mask
File without changes
File without changes
File without changes
File without changes