sbcli-dev 3.8.35__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.35 → sbcli_dev-3.8.37}/PKG-INFO +1 -1
  2. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/env_var +1 -1
  3. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/PKG-INFO +1 -1
  4. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_cli/cli.py +4 -1
  5. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/cluster_ops.py +9 -9
  6. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/constants.py +4 -2
  7. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/device_controller.py +21 -0
  8. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/health_controller.py +53 -0
  9. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/lvol_controller.py +16 -1
  10. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/tasks_controller.py +19 -17
  11. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/nvme_device.py +1 -0
  12. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/storage_node.py +2 -0
  13. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/rpc_client.py +18 -2
  14. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/storage_node_monitor.py +24 -1
  15. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/storage_node_ops.py +125 -79
  16. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/README.md +0 -0
  17. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/pyproject.toml +0 -0
  18. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/SOURCES.txt +0 -0
  19. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/dependency_links.txt +0 -0
  20. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/entry_points.txt +0 -0
  21. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/requires.txt +0 -0
  22. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/top_level.txt +0 -0
  23. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/setup.cfg +0 -0
  24. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/setup.py +0 -0
  25. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_cli/main.py +0 -0
  26. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/__init__.py +0 -0
  27. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/cnode_client.py +0 -0
  28. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/compute_node_ops.py +0 -0
  29. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/__init__.py +0 -0
  30. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  31. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/cluster_events.py +0 -0
  32. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/device_events.py +0 -0
  33. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/events_controller.py +0 -0
  34. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/lvol_events.py +0 -0
  35. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/mgmt_events.py +0 -0
  36. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/pool_controller.py +0 -0
  37. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/pool_events.py +0 -0
  38. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  39. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/snapshot_events.py +0 -0
  40. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/storage_events.py +0 -0
  41. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/tasks_events.py +0 -0
  42. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/distr_controller.py +0 -0
  43. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/kv_store.py +0 -0
  44. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/mgmt_node_ops.py +0 -0
  45. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/__init__.py +0 -0
  46. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/base_model.py +0 -0
  47. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/caching_node.py +0 -0
  48. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/cluster.py +0 -0
  49. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/compute_node.py +0 -0
  50. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/deployer.py +0 -0
  51. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/events.py +0 -0
  52. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/global_settings.py +0 -0
  53. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/iface.py +0 -0
  54. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/job_schedule.py +0 -0
  55. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/lvol_model.py +0 -0
  56. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/mgmt_node.py +0 -0
  57. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/pool.py +0 -0
  58. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/port_stat.py +0 -0
  59. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/snapshot.py +0 -0
  60. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/stats.py +0 -0
  61. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/pci_utils.py +0 -0
  62. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/__init__.py +0 -0
  63. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  64. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  65. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  66. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/config_docker.sh +0 -0
  67. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboard.yml +0 -0
  68. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  69. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  70. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  71. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  72. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  73. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  74. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/datasource.yml +0 -0
  75. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/db_config_double.sh +0 -0
  76. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/db_config_single.sh +0 -0
  77. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  78. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  79. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  80. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/haproxy.cfg +0 -0
  81. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/install_deps.sh +0 -0
  82. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/objstore.yml +0 -0
  83. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/prometheus.yml +0 -0
  84. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/run_ssh.sh +0 -0
  85. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/set_db_config.sh +0 -0
  86. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  87. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/__init__.py +0 -0
  88. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
  89. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/caching_node_monitor.py +0 -0
  90. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/cap_monitor.py +0 -0
  91. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  92. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/device_monitor.py +0 -0
  93. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/distr_event_collector.py +0 -0
  94. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/health_check_service.py +0 -0
  95. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/install_service.sh +0 -0
  96. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/log_agg_service.py +0 -0
  97. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/lvol_monitor.py +0 -0
  98. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  99. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/main_distr_event_collector.py +0 -0
  100. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  101. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/new_device_discovery.py +0 -0
  102. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/port_stat_collector.py +0 -0
  103. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/remove_service.sh +0 -0
  104. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/service_template.service +0 -0
  105. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
  106. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  107. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
  108. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
  109. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  110. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/shell_utils.py +0 -0
  111. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/snode_client.py +0 -0
  112. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/utils.py +0 -0
  113. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/__init__.py +0 -0
  114. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/app.py +0 -0
  115. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/auth_middleware.py +0 -0
  116. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/__init__.py +0 -0
  117. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  118. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  119. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  120. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  121. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  122. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/snode_ops.py +0 -0
  123. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
  124. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  125. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  126. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  127. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_device.py +0 -0
  128. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  129. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  130. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  131. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  132. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  133. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/caching_node_app.py +0 -0
  134. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/caching_node_app_k8s.py +0 -0
  135. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/node_utils.py +0 -0
  136. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/node_webapp.py +0 -0
  137. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/snode_app.py +0 -0
  138. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/snode_app_k8s.py +0 -0
  139. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/delete.py +0 -0
  140. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy.py +0 -0
  141. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  142. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  143. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/is_up.py +0 -0
  144. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/list_deps.py +0 -0
  145. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/rpac.yaml +0 -0
  146. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/tst.py +0 -0
  147. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
  148. {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
  149. {sbcli_dev-3.8.35 → 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.35
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.35
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.35
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
 
@@ -689,3 +689,24 @@ def add_device(device_id):
689
689
 
690
690
  def device_set_failed_and_migrated(device_id):
691
691
  return device_set_state(device_id, NVMeDevice.STATUS_FAILED_AND_MIGRATED)
692
+
693
+
694
+ def set_jm_device_state(device_id, state):
695
+ db_controller = DBController()
696
+ jm_device = None
697
+ snode = None
698
+ for node in db_controller.get_storage_nodes():
699
+ if node.jm_device.get_id() == device_id:
700
+ jm_device = node.jm_device
701
+ snode = node
702
+ break
703
+ if not jm_device:
704
+ logger.error("device not found")
705
+ return False
706
+
707
+ if jm_device.status == state:
708
+ return True
709
+
710
+ jm_device.status = state
711
+ snode.write_to_db(db_controller.kv_store)
712
+ return True
@@ -178,6 +178,13 @@ def check_node(node_id, with_devices=True):
178
178
  else:
179
179
  logger.info(f"Checking bdev: {remote_device.remote_bdev} ... not found")
180
180
  # node_remote_devices_check &= bool(ret)
181
+ if snode.jm_device:
182
+ jm_device = snode.jm_device
183
+ ret = check_jm_device(jm_device.get_id())
184
+ if ret:
185
+ logger.info(f"Checking jm bdev: {jm_device.jm_bdev} ... ok")
186
+ else:
187
+ logger.info(f"Checking jm bdev: {jm_device.jm_bdev} ... not found")
181
188
  lvstore_check = True
182
189
  if snode.lvstore and snode.lvstore_stack:
183
190
  distribs_list = []
@@ -226,6 +233,11 @@ def check_device(device_id):
226
233
  db_controller = DBController()
227
234
  device = db_controller.get_storage_device_by_id(device_id)
228
235
  if not device:
236
+ # is jm device ?
237
+ for node in db_controller.get_storage_nodes():
238
+ if node.jm_device and node.jm_device.get_id() == device_id:
239
+ return check_jm_device(node.jm_device.get_id())
240
+
229
241
  logger.error("device not found")
230
242
  return False
231
243
 
@@ -394,3 +406,44 @@ def check_snap(snap_id):
394
406
 
395
407
  ret = rpc_client.get_bdevs(snap.snap_bdev)
396
408
  return ret
409
+
410
+
411
+ def check_jm_device(device_id):
412
+ db_controller = DBController()
413
+ jm_device = None
414
+ snode = None
415
+ for node in db_controller.get_storage_nodes():
416
+ if node.jm_device.get_id() == device_id:
417
+ jm_device = node.jm_device
418
+ snode = node
419
+ break
420
+ if not jm_device:
421
+ logger.error("device not found")
422
+ return False
423
+
424
+ if snode.status in [StorageNode.STATUS_OFFLINE, StorageNode.STATUS_REMOVED]:
425
+ logger.info(f"Skipping ,node status is {snode.status}")
426
+ return True
427
+
428
+ if jm_device.status in [NVMeDevice.STATUS_REMOVED, NVMeDevice.STATUS_FAILED]:
429
+ logger.info(f"Skipping ,device status is {jm_device.status}")
430
+ return True
431
+
432
+ passed = True
433
+ try:
434
+ rpc_client = RPCClient(
435
+ snode.mgmt_ip, snode.rpc_port,
436
+ snode.rpc_username, snode.rpc_password)
437
+
438
+ ret = rpc_client.get_bdevs(jm_device.jm_bdev)
439
+ if ret:
440
+ logger.debug(f"Checking bdev: {jm_device.jm_bdev} ... ok")
441
+ else:
442
+ logger.debug(f"Checking bdev: {jm_device.jm_bdev} ... not found")
443
+ passed = False
444
+
445
+ except Exception as e:
446
+ logger.error(f"Failed to connect to node's SPDK: {e}")
447
+ passed = False
448
+
449
+ return passed
@@ -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,
@@ -5,7 +5,7 @@ import time
5
5
  from simplyblock_core import constants, kv_store, cluster_ops, storage_node_ops, utils
6
6
  from simplyblock_core.controllers import health_controller, device_controller, tasks_controller
7
7
  from simplyblock_core.models.cluster import Cluster
8
- from simplyblock_core.models.nvme_device import NVMeDevice
8
+ from simplyblock_core.models.nvme_device import NVMeDevice, JMDevice
9
9
  from simplyblock_core.models.storage_node import StorageNode
10
10
 
11
11
 
@@ -113,6 +113,16 @@ def set_node_offline(node):
113
113
  tasks_controller.add_node_to_auto_restart(node)
114
114
 
115
115
 
116
+ def set_jm_device_status(node):
117
+ if node.status != StorageNode.STATUS_UNREACHABLE:
118
+ for dev in node.nvme_devices:
119
+ device_controller.device_set_unavailable(dev.get_id())
120
+
121
+ storage_node_ops.set_node_status(snode.get_id(), StorageNode.STATUS_UNREACHABLE)
122
+ # add node to auto restart
123
+ tasks_controller.add_node_to_auto_restart(node)
124
+
125
+
116
126
  logger.info("Starting node monitor")
117
127
  while True:
118
128
  clusters = db_controller.get_clusters()
@@ -158,6 +168,19 @@ while True:
158
168
  else:
159
169
  set_node_offline(snode)
160
170
 
171
+ # check JM device
172
+ if snode.jm_device:
173
+ if snode.jm_device.status in [JMDevice.STATUS_ONLINE, JMDevice.STATUS_UNAVAILABLE]:
174
+ ret = health_controller.check_jm_device(snode.jm_device.get_id())
175
+ if ret:
176
+ logger.error(f"JM bdev is online: {snode.jm_device.get_id()}")
177
+ if snode.jm_device.status != JMDevice.STATUS_ONLINE:
178
+ device_controller.set_jm_device_state(snode.jm_device.get_id(), JMDevice.STATUS_ONLINE)
179
+ else:
180
+ logger.error(f"JM bdev is offline: {snode.jm_device.get_id()}")
181
+ if snode.jm_device.status != JMDevice.STATUS_UNAVAILABLE:
182
+ device_controller.set_jm_device_state(snode.jm_device.get_id(), JMDevice.STATUS_UNAVAILABLE)
183
+
161
184
  update_cluster_status(cluster_id)
162
185
 
163
186
  logger.info(f"Sleeping for {constants.NODE_MONITOR_INTERVAL_SEC} seconds")