sbcli-pre 1.2.6__zip → 1.2.8__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 (139) hide show
  1. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/PKG-INFO +1 -1
  2. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/env_var +1 -1
  3. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/sbcli_pre.egg-info/PKG-INFO +1 -1
  4. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_cli/cli.py +28 -24
  5. sbcli_pre-1.2.8/simplyblock_core/constants.py +91 -0
  6. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/lvol_controller.py +26 -3
  7. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/snapshot_controller.py +27 -0
  8. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/kv_store.py +15 -0
  9. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/storage_node.py +5 -1
  10. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/install_deps.sh +1 -1
  11. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/tasks_runner_restart.py +1 -1
  12. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/storage_node_ops.py +115 -32
  13. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/utils.py +80 -0
  14. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_storage_node.py +14 -7
  15. sbcli_pre-1.2.6/simplyblock_core/constants.py +0 -63
  16. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/README.md +0 -0
  17. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/pyproject.toml +0 -0
  18. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/sbcli_pre.egg-info/SOURCES.txt +0 -0
  19. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/sbcli_pre.egg-info/dependency_links.txt +0 -0
  20. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/sbcli_pre.egg-info/entry_points.txt +0 -0
  21. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/sbcli_pre.egg-info/requires.txt +0 -0
  22. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/sbcli_pre.egg-info/top_level.txt +0 -0
  23. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/setup.cfg +0 -0
  24. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/setup.py +0 -0
  25. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_cli/main.py +0 -0
  26. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/__init__.py +0 -0
  27. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/cluster_ops.py +0 -0
  28. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/cnode_client.py +0 -0
  29. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/compute_node_ops.py +0 -0
  30. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/__init__.py +0 -0
  31. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/caching_node_controller.py +0 -0
  32. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/cluster_events.py +0 -0
  33. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/device_controller.py +0 -0
  34. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/device_events.py +0 -0
  35. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/events_controller.py +0 -0
  36. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/health_controller.py +0 -0
  37. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/lvol_events.py +0 -0
  38. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/mgmt_events.py +0 -0
  39. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/pool_controller.py +0 -0
  40. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/pool_events.py +0 -0
  41. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/snapshot_events.py +0 -0
  42. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/storage_events.py +0 -0
  43. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/tasks_controller.py +0 -0
  44. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/controllers/tasks_events.py +0 -0
  45. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/distr_controller.py +0 -0
  46. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/mgmt_node_ops.py +0 -0
  47. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/__init__.py +0 -0
  48. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/base_model.py +0 -0
  49. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/caching_node.py +0 -0
  50. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/cluster.py +0 -0
  51. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/compute_node.py +0 -0
  52. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/deployer.py +0 -0
  53. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/events.py +0 -0
  54. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/global_settings.py +0 -0
  55. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/iface.py +0 -0
  56. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/job_schedule.py +0 -0
  57. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/lvol_model.py +0 -0
  58. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/mgmt_node.py +0 -0
  59. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/nvme_device.py +0 -0
  60. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/pool.py +0 -0
  61. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/port_stat.py +0 -0
  62. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/snapshot.py +0 -0
  63. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/models/stats.py +0 -0
  64. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/pci_utils.py +0 -0
  65. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/rpc_client.py +0 -0
  66. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/__init__.py +0 -0
  67. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  68. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  69. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  70. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/config_docker.sh +0 -0
  71. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  72. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  73. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  74. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  75. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  76. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  77. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/datasource.yml +0 -0
  78. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/db_config_double.sh +0 -0
  79. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/db_config_single.sh +0 -0
  80. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  81. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  82. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  83. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/haproxy.cfg +0 -0
  84. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/prometheus.yml +0 -0
  85. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/run_ssh.sh +0 -0
  86. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/set_db_config.sh +0 -0
  87. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  88. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/__init__.py +0 -0
  89. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/caching_node_monitor.py +0 -0
  90. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/cap_monitor.py +0 -0
  91. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  92. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/device_monitor.py +0 -0
  93. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/distr_event_collector.py +0 -0
  94. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/health_check_service.py +0 -0
  95. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/install_service.sh +0 -0
  96. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/log_agg_service.py +0 -0
  97. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/lvol_monitor.py +0 -0
  98. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  99. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  100. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/port_stat_collector.py +0 -0
  101. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/remove_service.sh +0 -0
  102. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/service_template.service +0 -0
  103. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/storage_node_monitor.py +0 -0
  104. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  105. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/shell_utils.py +0 -0
  106. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_core/snode_client.py +0 -0
  107. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/__init__.py +0 -0
  108. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/app.py +0 -0
  109. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/auth_middleware.py +0 -0
  110. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/__init__.py +0 -0
  111. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  112. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  113. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  114. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  115. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  116. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/snode_ops.py +0 -0
  117. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  118. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  119. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  120. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_device.py +0 -0
  121. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  122. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  123. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  124. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  125. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/caching_node_app.py +0 -0
  126. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/caching_node_app_k8s.py +0 -0
  127. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/node_utils.py +0 -0
  128. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/node_webapp.py +0 -0
  129. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/snode_app.py +0 -0
  130. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/static/delete.py +0 -0
  131. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/static/deploy.py +0 -0
  132. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  133. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  134. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/static/is_up.py +0 -0
  135. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/static/list_deps.py +0 -0
  136. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/static/rpac.yaml +0 -0
  137. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/static/tst.py +0 -0
  138. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/templates/deploy_spdk.yaml.j2 +0 -0
  139. {sbcli_pre-1.2.6 → sbcli_pre-1.2.8}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-pre
3
- Version: 1.2.6
3
+ Version: 1.2.8
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-pre
2
- SIMPLY_BLOCK_VERSION=1.2.6
2
+ SIMPLY_BLOCK_VERSION=1.2.8
3
3
 
4
4
  SIMPLY_BLOCK_DOCKER_IMAGE=simplyblock/simplyblock:pre-release
5
5
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-pre
3
- Version: 1.2.6
3
+ Version: 1.2.8
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -43,12 +43,14 @@ class CLIWrapper:
43
43
  sub_command.add_argument("--jm-percent", help='Number in percent to use for JM from each device',
44
44
  type=int, default=3, dest='jm_percent')
45
45
  sub_command.add_argument("--data-nics", help='Data interface names', nargs='+', dest='data_nics')
46
- sub_command.add_argument("--memory", help='SPDK huge memory allocation, default is 4G', dest='spdk_mem')
46
+ sub_command.add_argument("--max-lvol", help='Max lvol per storage node', dest='max_lvol', type=int)
47
+ sub_command.add_argument("--max-snap", help='Max snapshot per storage node', dest='max_snap', type=int)
48
+ sub_command.add_argument("--max-prov", help='Max provisioning size of all storage nodes', dest='max_prov')
49
+ sub_command.add_argument("--number-of-devices", help='Number of devices per storage node if it\'s not supported EC2 instance', dest='number_of_devices', type=int)
50
+
47
51
  sub_command.add_argument("--spdk-image", help='SPDK image uri', dest='spdk_image')
48
52
  sub_command.add_argument("--spdk-debug", help='Enable spdk debug logs', dest='spdk_debug', required=False, action='store_true')
49
53
 
50
- sub_command.add_argument("--iobuf_small_pool_count", help='bdev_set_options param', dest='small_pool_count', type=int, default=0)
51
- sub_command.add_argument("--iobuf_large_pool_count", help='bdev_set_options param', dest='large_pool_count', type=int, default=0)
52
54
  sub_command.add_argument("--iobuf_small_bufsize", help='bdev_set_options param', dest='small_bufsize', type=int, default=0)
53
55
  sub_command.add_argument("--iobuf_large_bufsize", help='bdev_set_options param', dest='large_bufsize', type=int, default=0)
54
56
 
@@ -77,12 +79,14 @@ class CLIWrapper:
77
79
  'During restart, the node does not accept IO. In a high-availability setup, '
78
80
  'this will not impact operations')
79
81
  sub_command.add_argument("node_id", help='UUID of storage node')
80
- sub_command.add_argument("--memory", help='SPDK huge memory allocation, default is 4G', dest='spdk_mem')
82
+ sub_command.add_argument("--max-lvol", help='Max lvol per storage node', dest='max_lvol', type=int, default=0)
83
+ sub_command.add_argument("--max-snap", help='Max snapshot per storage node', dest='max_snap', type=int, default=0)
84
+ sub_command.add_argument("--max-prov", help='Max provisioning size of all storage nodes', dest='max_prov', default="")
85
+ sub_command.add_argument("--number-of-devices", help='Number of devices per storage node if it\'s not supported EC2 instance', dest='number_of_devices', type=int)
86
+
81
87
  sub_command.add_argument("--spdk-image", help='SPDK image uri', dest='spdk_image')
82
88
  sub_command.add_argument("--spdk-debug", help='Enable spdk debug logs', dest='spdk_debug', required=False, action='store_true')
83
89
 
84
- sub_command.add_argument("--iobuf_small_pool_count", help='bdev_set_options param', dest='small_pool_count', type=int, default=0)
85
- sub_command.add_argument("--iobuf_large_pool_count", help='bdev_set_options param', dest='large_pool_count', type=int, default=0)
86
90
  sub_command.add_argument("--iobuf_small_bufsize", help='bdev_set_options param', dest='small_bufsize', type=int, default=0)
87
91
  sub_command.add_argument("--iobuf_large_bufsize", help='bdev_set_options param', dest='large_bufsize', type=int, default=0)
88
92
 
@@ -636,6 +640,12 @@ class CLIWrapper:
636
640
  ret = storage_ops.deploy_cleaner()
637
641
 
638
642
  elif sub_command == "add-node":
643
+ if not args.max_lvol:
644
+ self.parser.error(f"Mandatory argument '--max-lvol' not provided for {sub_command}")
645
+ if not args.max_snap:
646
+ self.parser.error(f"Mandatory argument '--max-snap' not provided for {sub_command}")
647
+ if not args.max_prov:
648
+ self.parser.error(f"Mandatory argument '--max-prov' not provided for {sub_command}")
639
649
  cluster_id = args.cluster_id
640
650
  node_ip = args.node_ip
641
651
  ifname = args.ifname
@@ -643,22 +653,21 @@ class CLIWrapper:
643
653
  spdk_image = args.spdk_image
644
654
  spdk_debug = args.spdk_debug
645
655
 
646
- small_pool_count = args.small_pool_count
647
- large_pool_count = args.large_pool_count
648
656
  small_bufsize = args.small_bufsize
649
657
  large_bufsize = args.large_bufsize
650
658
  num_partitions_per_dev = args.partitions
651
659
  jm_percent = args.jm_percent
652
660
 
653
- spdk_mem = None
654
- if args.spdk_mem:
655
- spdk_mem = self.parse_size(args.spdk_mem)
656
- if spdk_mem < 1 * 1024 * 1024:
657
- return f"SPDK memory:{args.spdk_mem} must be larger than 1G"
661
+ max_lvol = args.max_lvol
662
+ max_snap = args.max_snap
663
+ max_prov = self.parse_size(args.max_prov)
664
+ number_of_devices = args.number_of_devices
665
+ if max_prov < 1 * 1024 * 1024:
666
+ return f"Max provisioning memory:{args.max_prov} must be larger than 1G"
658
667
 
659
668
  out = storage_ops.add_node(
660
- cluster_id, node_ip, ifname, data_nics, spdk_mem, spdk_image, spdk_debug,
661
- small_pool_count, large_pool_count, small_bufsize, large_bufsize, num_partitions_per_dev, jm_percent)
669
+ cluster_id, node_ip, ifname, data_nics, max_lvol, max_snap, max_prov, spdk_image, spdk_debug,
670
+ small_bufsize, large_bufsize, num_partitions_per_dev, jm_percent, number_of_devices)
662
671
  return out
663
672
 
664
673
  elif sub_command == "list":
@@ -676,22 +685,17 @@ class CLIWrapper:
676
685
  spdk_image = args.spdk_image
677
686
  spdk_debug = args.spdk_debug
678
687
 
679
- spdk_mem = None
680
- if args.spdk_mem:
681
- spdk_mem = self.parse_size(args.spdk_mem)
682
- if spdk_mem < 1 * 1024 * 1024:
683
- return f"SPDK memory:{args.spdk_mem} must be larger than 1G"
684
688
 
689
+ max_lvol = args.max_lvol
690
+ max_snap = args.max_snap
691
+ max_prov = self.parse_size(args.max_prov)
685
692
 
686
- small_pool_count = args.small_pool_count
687
- large_pool_count = args.large_pool_count
688
693
  small_bufsize = args.small_bufsize
689
694
  large_bufsize = args.large_bufsize
690
695
 
691
696
  ret = storage_ops.restart_storage_node(
692
- node_id, spdk_mem,
697
+ node_id, max_lvol, max_snap, max_prov,
693
698
  spdk_image, spdk_debug,
694
- small_pool_count, large_pool_count,
695
699
  small_bufsize, large_bufsize)
696
700
 
697
701
  elif sub_command == "list-devices":
@@ -0,0 +1,91 @@
1
+ import logging
2
+ import os
3
+
4
+ KVD_DB_VERSION = 730
5
+ KVD_DB_FILE_PATH = '/etc/foundationdb/fdb.cluster'
6
+ KVD_DB_TIMEOUT_MS = 10000
7
+ SPK_DIR = '/home/ec2-user/spdk'
8
+ RPC_HTTP_PROXY_PORT = 8080
9
+ LOG_LEVEL = logging.INFO
10
+ LOG_WEB_DEBUG = True
11
+
12
+ INSTALL_DIR = os.path.dirname(os.path.realpath(__file__))
13
+
14
+ NODE_MONITOR_INTERVAL_SEC = 3
15
+ DEVICE_MONITOR_INTERVAL_SEC = 5
16
+ STAT_COLLECTOR_INTERVAL_SEC = 60*5 # 5 minutes
17
+ LVOL_STAT_COLLECTOR_INTERVAL_SEC = 2
18
+ LVOL_MONITOR_INTERVAL_SEC = 60
19
+ DEV_MONITOR_INTERVAL_SEC = 10
20
+ DEV_STAT_COLLECTOR_INTERVAL_SEC = 2
21
+ PROT_STAT_COLLECTOR_INTERVAL_SEC = 2
22
+ DISTR_EVENT_COLLECTOR_INTERVAL_SEC = 2
23
+ DISTR_EVENT_COLLECTOR_NUM_OF_EVENTS = 10
24
+ CAP_MONITOR_INTERVAL_SEC = 30
25
+ SSD_VENDOR_WHITE_LIST = ["1d0f:cd01", "1d0f:cd00"]
26
+
27
+ PMEM_DIR = '/tmp/pmem'
28
+
29
+ NVME_PROGRAM_FAIL_COUNT = 50
30
+ NVME_ERASE_FAIL_COUNT = 50
31
+ NVME_CRC_ERROR_COUNT = 50
32
+ DEVICE_OVERLOAD_STDEV_VALUE = 50
33
+ DEVICE_OVERLOAD_CAPACITY_THRESHOLD = 50
34
+
35
+ CLUSTER_NQN = "nqn.2023-02.io.simplyblock"
36
+
37
+ weights = {
38
+ "lvol": 50,
39
+ "cpu": 10,
40
+ "r_io": 10,
41
+ "w_io": 10,
42
+ "r_b": 10,
43
+ "w_b": 10
44
+ }
45
+
46
+ # To use 75% of hugepages to calculate ssd size to use for the ocf bdev
47
+ CACHING_NODE_MEMORY_FACTOR = 0.75
48
+
49
+ HEALTH_CHECK_INTERVAL_SEC = 60
50
+
51
+ GRAYLOG_CHECK_INTERVAL_SEC = 60
52
+
53
+ FDB_CHECK_INTERVAL_SEC = 60
54
+
55
+ SIMPLY_BLOCK_DOCKER_IMAGE = "simplyblock/simplyblock:pre-release"
56
+ SIMPLY_BLOCK_CLI_NAME = "sbcli"
57
+ TASK_EXEC_INTERVAL_SEC = 30
58
+ TASK_EXEC_RETRY_COUNT = 8
59
+
60
+ SIMPLY_BLOCK_SPDK_CORE_IMAGE = "simplyblock/spdk-core:latest"
61
+ SIMPLY_BLOCK_SPDK_ULTRA_IMAGE = "simplyblock/spdk:prerelease-latest"
62
+
63
+ GELF_PORT = 12201
64
+
65
+ MIN_HUGE_PAGE_MEMORY_FOR_LVOL = 209715200
66
+ MIN_SYS_MEMORY_FOR_LVOL = 524288000
67
+ EXTRA_SMALL_POOL_COUNT = 1024
68
+ EXTRA_LARGE_POOL_COUNT = 128
69
+ EXTRA_HUGE_PAGE_MEMORY = 2147483648
70
+ EXTRA_SYS_MEMORY = 2147483648
71
+
72
+ INSTANCE_STORAGE_DATA = {
73
+ 'i4i.large': {'number_of_devices': 1, 'size_per_device_gb': 468},
74
+ 'i4i.xlarge': {'number_of_devices': 1, 'size_per_device_gb': 937},
75
+ 'i4i.2xlarge': {'number_of_devices': 1, 'size_per_device_gb': 1875},
76
+ 'i4i.4xlarge': {'number_of_devices': 1, 'size_per_device_gb': 3750},
77
+ 'i4i.8xlarge': {'number_of_devices': 2, 'size_per_device_gb': 3750},
78
+ 'i4i.12xlarge': {'number_of_devices': 3, 'size_per_device_gb': 3750},
79
+ 'i4i.16xlarge': {'number_of_devices': 4, 'size_per_device_gb': 3750},
80
+ 'i4i.24xlarge': {'number_of_devices': 6, 'size_per_device_gb': 3750},
81
+ 'i4i.32xlarge': {'number_of_devices': 8, 'size_per_device_gb': 3750},
82
+ 'i4i.metal': {'number_of_devices': 8, 'size_per_device_gb': 3750},
83
+ 'i3en.large': {'number_of_devices': 1, 'size_per_device_gb': 1250},
84
+ 'i3en.xlarge': {'number_of_devices': 1, 'size_per_device_gb': 2500},
85
+ 'i3en.2xlarge': {'number_of_devices': 2, 'size_per_device_gb': 2500},
86
+ 'i3en.3xlarge': {'number_of_devices': 1, 'size_per_device_gb': 7500},
87
+ 'i3en.6xlarge': {'number_of_devices': 2, 'size_per_device_gb': 7500},
88
+ 'i3en.12xlarge': {'number_of_devices': 4, 'size_per_device_gb': 7500},
89
+ 'i3en.24xlarge': {'number_of_devices': 8, 'size_per_device_gb': 7500},
90
+ 'i3en.metal': {'number_of_devices': 8, 'size_per_device_gb': 7500},
91
+ }
@@ -17,7 +17,7 @@ from simplyblock_core.models.pool import Pool
17
17
  from simplyblock_core.models.lvol_model import LVol
18
18
  from simplyblock_core.models.storage_node import StorageNode
19
19
  from simplyblock_core.rpc_client import RPCClient
20
-
20
+ from simplyblock_core.snode_client import SNodeClient
21
21
 
22
22
  logger = lg.getLogger()
23
23
  db_controller = DBController()
@@ -364,12 +364,23 @@ def add_lvol(name, size, host_id_or_name, pool_id_or_name, use_comp, use_crypto,
364
364
  return lvol_id, None
365
365
 
366
366
 
367
- def _get_next_3_nodes(cluster_id):
367
+ def _get_next_3_nodes(cluster_id, lvol_size=0):
368
368
  snodes = db_controller.get_storage_nodes_by_cluster_id(cluster_id)
369
369
  online_nodes = []
370
370
  node_stats = {}
371
371
  for node in snodes:
372
372
  if node.status == node.STATUS_ONLINE:
373
+ # Validate Eligible nodes for adding lvol
374
+ snode_api = SNodeClient(node.api_endpoint)
375
+ result, _ = snode_api.info()
376
+ memory_free = result["memory_details"]["free"]
377
+ huge_free = result["memory_details"]["huge_free"]
378
+ total_node_capacity = db_controller.get_snode_size(node.get_id())
379
+ error = utils.validate_add_lvol_or_snap_on_node(memory_free, huge_free, node.max_lvol, lvol_size, total_node_capacity, len(node.lvols))
380
+ if error:
381
+ logger.warning(error)
382
+ continue
383
+
373
384
  online_nodes.append(node)
374
385
  node_stat_list = db_controller.get_node_stats(node, limit=1000)
375
386
  combined_record = utils.sum_records(node_stat_list)
@@ -695,7 +706,7 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
695
706
  lvol.lvol_type += ',compress'
696
707
  lvol.top_bdev = lvol.comp_bdev
697
708
 
698
- nodes = _get_next_3_nodes(cl.get_id())
709
+ nodes = _get_next_3_nodes(cl.get_id(), lvol.size)
699
710
  if not nodes:
700
711
  return False, f"No nodes found with enough resources to create the LVol"
701
712
 
@@ -800,6 +811,18 @@ def add_lvol_on_node(lvol, snode, ha_comm_addrs=None, ha_inode_self=None):
800
811
  rpc_client = RPCClient(snode.mgmt_ip, snode.rpc_port, snode.rpc_username, snode.rpc_password)
801
812
  spdk_mem_info_before = rpc_client.ultra21_util_get_malloc_stats()
802
813
 
814
+ # Validate adding lvol on storage node
815
+ snode_api = SNodeClient(snode.api_endpoint)
816
+ result, _ = snode_api.info()
817
+ memory_free = result["memory_details"]["free"]
818
+ huge_free = result["memory_details"]["huge_free"]
819
+
820
+ total_node_capacity = db_controller.get_snode_size(snode.get_id())
821
+ error = utils.validate_add_lvol_or_snap_on_node(memory_free, huge_free, snode.max_lvol, lvol.size, total_node_capacity, len(snode.lvols))
822
+ if error:
823
+ logger.error(error)
824
+ return False, f"Failed to add lvol on node {snode.get_id()}"
825
+
803
826
  ret, msg = _create_bdev_stack(lvol, snode, ha_comm_addrs, ha_inode_self)
804
827
  if not ret:
805
828
  return False, msg
@@ -13,6 +13,8 @@ from simplyblock_core.models.pool import Pool
13
13
  from simplyblock_core.models.snapshot import SnapShot
14
14
  from simplyblock_core.models.lvol_model import LVol
15
15
  from simplyblock_core.rpc_client import RPCClient
16
+ from simplyblock_core.snode_client import SNodeClient
17
+
16
18
 
17
19
  logger = lg.getLogger()
18
20
 
@@ -33,6 +35,21 @@ def add(lvol_id, snapshot_name):
33
35
  logger.info(f"Creating snapshot: {snapshot_name} from LVol: {lvol.id}")
34
36
  snode = db_controller.get_storage_node_by_id(lvol.node_id)
35
37
 
38
+ ##############################################################################
39
+ # Validate adding snap on storage node
40
+ snode_api = SNodeClient(snode.api_endpoint)
41
+ result, _ = snode_api.info()
42
+ memory_free = result["memory_details"]["free"]
43
+ huge_free = result["memory_details"]["huge_free"]
44
+ total_node_capacity = db_controller.get_snode_size(snode.get_id())
45
+
46
+ error = utils.validate_add_lvol_or_snap_on_node(memory_free, huge_free, snode.max_snap, lvol.size, total_node_capacity,
47
+ len(db_controller.get_snapshots_by_node_id(snode.get_id())))
48
+
49
+ if error:
50
+ logger.error(f"Failed to add snap on node {snode.get_id()}")
51
+ logger.error(error)
52
+ return False
36
53
 
37
54
  ##############################################################################
38
55
  snap_count = 0
@@ -199,6 +216,16 @@ def clone(snapshot_id, clone_name, new_size=0):
199
216
  logger.error(msg)
200
217
  return False, msg
201
218
 
219
+ # Validate cloning snap on storage node
220
+ snode_api = SNodeClient(snode.api_endpoint)
221
+ result, _ = snode_api.info()
222
+ memory_free = result["memory_details"]["free"]
223
+ huge_free = result["memory_details"]["huge_free"]
224
+ total_node_capacity = db_controller.get_snode_size(snode.get_id())
225
+ error = utils.validate_add_lvol_or_snap_on_node(memory_free, huge_free, snode.max_lvol, snap.lvol.size, total_node_capacity, len(snode.lvols))
226
+ if error:
227
+ logger.error(error)
228
+ return False, f"Failed to add lvol on node {snode.get_id()}"
202
229
  lvol = LVol()
203
230
  lvol.lvol_name = clone_name
204
231
  lvol.size = snap.lvol.size
@@ -288,3 +288,18 @@ class DBController:
288
288
  for task in self.get_job_tasks(""):
289
289
  if task.uuid == task_id:
290
290
  return task
291
+
292
+ def get_snapshots_by_node_id(self, node_id):
293
+ ret = []
294
+ snaps = SnapShot().read_from_db(self.kv_store)
295
+ for snap in snaps:
296
+ if snap.lvol.host_id == node_id:
297
+ ret.append(snap)
298
+ return ret
299
+
300
+ def get_snode_size(self, node_id):
301
+ snode = self.get_storage_node_by_id(node_id)
302
+ total_node_capacity = 0
303
+ for dev in snode.nvme_devices:
304
+ total_node_capacity += dev.size
305
+ return total_node_capacity
@@ -61,7 +61,9 @@ class StorageNode(BaseModel):
61
61
  "remote_devices": {"type": List[NVMeDevice], 'default': []},
62
62
  "host_secret": {"type": str, "default": ""},
63
63
  "ctrl_secret": {"type": str, "default": ""},
64
-
64
+ "max_lvol": {"type": int, "default": 0},
65
+ "max_snap": {"type": int, "default": 0},
66
+ "max_prov": {"type": str, "default": ""},
65
67
  "cpu": {"type": int, "default": 0},
66
68
  "cpu_hz": {"type": int, "default": 0},
67
69
  "memory": {"type": int, "default": 0},
@@ -73,11 +75,13 @@ class StorageNode(BaseModel):
73
75
  "app_thread_mask": {"type": str, "default": ""},
74
76
  "pollers_mask": {"type": str, "default": ""},
75
77
  "os_cores": {"type": str, "default": []},
78
+ "nvme_pollers_cores": {"type": str, "default": ""},
76
79
  "dev_cpu_mask": {"type": str, "default": ""},
77
80
  "spdk_mem": {"type": int, "default": 0},
78
81
  "spdk_image": {"type": str, "default": ""},
79
82
  "spdk_debug": {"type": bool, "default": False},
80
83
 
84
+
81
85
  "ec2_metadata": {"type": dict, "default": {}},
82
86
  "ec2_instance_id": {"type": str, "default": ""},
83
87
  "ec2_public_ip": {"type": str, "default": ""},
@@ -15,7 +15,7 @@ sudo yum install hostname pkg-config git wget python3-pip yum-utils docker-ce do
15
15
  sudo systemctl enable docker
16
16
  sudo systemctl start docker
17
17
 
18
- sudo docker plugin install --grant-all-permissions rexray/efs REXRAY_PREEMPT=true
18
+ sudo docker plugin install rexray/efs --grant-all-permissions EFS_TAG=$INSTANCE_ID REXRAY_PREEMPT=true
19
19
 
20
20
  wget https://github.com/apple/foundationdb/releases/download/7.3.3/foundationdb-clients-7.3.3-1.el7.x86_64.rpm -q
21
21
  sudo rpm -U foundationdb-clients-7.3.3-1.el7.x86_64.rpm --quiet --reinstall
@@ -209,7 +209,7 @@ while True:
209
209
  if task.function_name in [JobSchedule.FN_DEV_RESTART, JobSchedule.FN_NODE_RESTART]:
210
210
  while task.status != JobSchedule.STATUS_DONE:
211
211
  # get new task object because it could be changed from cancel task
212
- task = db_controller.get_task_by_id(task.get_id())
212
+ task = db_controller.get_task_by_id(task.uuid)
213
213
  res = task_runner(task)
214
214
  if res:
215
215
  tasks_events.task_updated(task)
@@ -550,9 +550,9 @@ def _connect_to_remote_devs(this_node):
550
550
 
551
551
 
552
552
  def add_node(cluster_id, node_ip, iface_name, data_nics_list,
553
- spdk_mem, spdk_image=None, spdk_debug=False,
554
- small_pool_count=0, large_pool_count=0, small_bufsize=0, large_bufsize=0,
555
- num_partitions_per_dev=0, jm_percent=0):
553
+ max_lvol, max_snap, max_prov, spdk_image=None, spdk_debug=False,
554
+ small_bufsize=0, large_bufsize=0,
555
+ num_partitions_per_dev=0, jm_percent=0, number_of_devices=0):
556
556
  db_controller = DBController()
557
557
  kv_store = db_controller.kv_store
558
558
 
@@ -608,26 +608,12 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
608
608
  logger.error(f"Node already exists, try remove it first: {ec2_metadata['instanceId']}")
609
609
  return False
610
610
 
611
- # check for memory
612
- if "memory_details" in node_info and node_info['memory_details']:
613
- memory_details = node_info['memory_details']
614
- logger.info("Node Memory info")
615
- logger.info(f"Total: {utils.humanbytes(memory_details['total'])}")
616
- logger.info(f"Free: {utils.humanbytes(memory_details['free'])}")
617
- logger.info(f"Hugepages Total: {utils.humanbytes(memory_details['huge_total'])}")
618
- huge_free = memory_details['huge_free']
619
- logger.info(f"Hugepages Free: {utils.humanbytes(huge_free)}")
620
- if huge_free < 1 * 1024 * 1024:
621
- logger.warning(f"Free hugepages are less than 1G: {utils.humanbytes(huge_free)}")
622
- if not spdk_mem:
623
- spdk_mem = huge_free
624
- logger.info(f"Using the free hugepages for spdk memory: {utils.humanbytes(huge_free)}")
625
-
626
611
  # Tune cpu maks parameters
627
612
  cpu_count = node_info["cpu_count"]
628
613
  pollers_mask = ""
629
614
  app_thread_mask = ""
630
615
  dev_cpu_mask = ""
616
+ nvme_pollers_cores = []
631
617
  if cpu_count < 8:
632
618
  mask = (1 << (cpu_count - 1)) - 1
633
619
  mask <<= 1
@@ -643,6 +629,50 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
643
629
  spdk_cpu_mask = utils.generate_mask(spdk_cores)
644
630
  dev_cpu_mask = utils.generate_mask(dev_cpu_cores)
645
631
 
632
+ # Calculate pool count
633
+ if ec2_metadata and ec2_metadata.get('instanceType'):
634
+ supported_type, storage_devices, device_size = utils.get_total_size_per_instance_type(ec2_metadata["instanceType"])
635
+ if not supported_type:
636
+ logger.warning(f"Unsupported ec2 instance-type {ec2_metadata['instanceType']} for deployment")
637
+ if not number_of_devices:
638
+ logger.error(f"Unsupported ec2 instance-type {ec2_metadata['instanceType']} "
639
+ "for deployment, please specify --number-of-devices")
640
+ return False
641
+ number_of_devices = storage_devices
642
+ else:
643
+ logger.warning("Can not get ec2 instance type for this instance.")
644
+ if not number_of_devices:
645
+ logger.error("Unsupported instance type please specify --number-of-devices.")
646
+ return False
647
+
648
+ number_of_split = num_partitions_per_dev if num_partitions_per_dev else num_partitions_per_dev + 1
649
+ number_of_alceml_devices = number_of_devices * number_of_split
650
+ small_pool_count, large_pool_count = utils.calculate_pool_count(
651
+ number_of_alceml_devices, max_lvol, max_snap, cpu_count, len(nvme_pollers_cores) or cpu_count)
652
+
653
+ # Calculate minimum huge page memory
654
+ minimum_hp_memory = utils.calculate_minimum_hp_memory(small_pool_count, large_pool_count, max_lvol, max_snap, cpu_count)
655
+
656
+ # Calculate minimum sys memory
657
+ minimum_sys_memory = utils.calculate_minimum_sys_memory(max_prov)
658
+
659
+ # check for memory
660
+ if "memory_details" in node_info and node_info['memory_details']:
661
+ memory_details = node_info['memory_details']
662
+ logger.info("Node Memory info")
663
+ logger.info(f"Total: {utils.humanbytes(memory_details['total'])}")
664
+ logger.info(f"Free: {utils.humanbytes(memory_details['free'])}")
665
+ else:
666
+ logger.error(f"Cannot get memory info from the ec2 instance.. Exiting")
667
+ return False
668
+
669
+ satisfied, spdk_mem = utils.calculate_spdk_memory(minimum_hp_memory,
670
+ minimum_sys_memory,
671
+ int(memory_details['free']),
672
+ int(memory_details['huge_total']))
673
+ if not satisfied:
674
+ logger.error(f"Not enough memory for the provided max_lvo: {max_lvol}, max_snap: {max_snap}, max_prov: {max_prov}.. Exiting")
675
+ return False
646
676
 
647
677
  logger.info("Joining docker swarm...")
648
678
  cluster_docker = utils.get_docker_client(cluster_id)
@@ -717,12 +747,17 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
717
747
  snode.hugepages = node_info['hugepages']
718
748
 
719
749
  snode.spdk_cpu_mask = spdk_cpu_mask or ""
720
- snode.spdk_mem = spdk_mem or 0
750
+ snode.spdk_mem = spdk_mem
751
+ snode.max_lvol = max_lvol
752
+ snode.max_snap = max_snap
753
+ snode.max_prov = max_prov
754
+ snode.number_of_devices = number_of_devices
721
755
  snode.spdk_image = spdk_image or ""
722
756
  snode.spdk_debug = spdk_debug or 0
723
757
  snode.write_to_db(kv_store)
724
758
  snode.app_thread_mask = app_thread_mask or ""
725
759
  snode.pollers_mask = pollers_mask or ""
760
+ snode.nvme_pollers_cores = nvme_pollers_cores or []
726
761
  snode.dev_cpu_mask = dev_cpu_mask or ""
727
762
  snode.os_cores = os_cores or []
728
763
 
@@ -975,12 +1010,10 @@ def remove_storage_node(node_id, force_remove=False, force_migrate=False):
975
1010
 
976
1011
 
977
1012
  def restart_storage_node(
978
- node_id,
979
- spdk_mem=None,
1013
+ node_id, max_lvol=0, max_snap=0, max_prov="",
980
1014
  spdk_image=None,
981
1015
  set_spdk_debug=None,
982
- small_pool_count=0, large_pool_count=0,
983
- small_bufsize=0, large_bufsize=0):
1016
+ small_bufsize=0, large_bufsize=0, number_of_devices=0):
984
1017
 
985
1018
  db_controller = DBController()
986
1019
  kv_store = db_controller.kv_store
@@ -1011,14 +1044,67 @@ def restart_storage_node(
1011
1044
  logger.info(f"Node info: {node_info}")
1012
1045
 
1013
1046
  logger.info("Restarting SPDK")
1014
- mem = snode.spdk_mem
1015
- if spdk_mem:
1016
- mem = spdk_mem
1017
- snode.spdk_mem = mem
1047
+
1018
1048
  img = snode.spdk_image
1049
+ if max_lvol:
1050
+ snode.max_lvol = max_lvol
1051
+ if max_snap:
1052
+ snode.max_snap = max_snap
1053
+ if max_prov:
1054
+ snode.max_prov = max_prov
1019
1055
  if spdk_image:
1020
1056
  img = spdk_image
1021
1057
  snode.spdk_image = img
1058
+
1059
+ # Calculate pool count
1060
+ if snode.ec2_metadata and snode.ec2_metadata.get('instanceType'):
1061
+ supported_type, storage_devices, device_size = utils.get_total_size_per_instance_type(snode.ec2_metadata["instanceType"])
1062
+ if not supported_type:
1063
+ logger.warning(f"Unsupported ec2 instance-type {snode.ec2_metadata['instanceType']} for deployment")
1064
+ if not number_of_devices:
1065
+ logger.error(f"Unsupported ec2 instance-type {snode.ec2_metadata['instanceType']} "
1066
+ "for deployment, please specify --number-of-devices")
1067
+ return False
1068
+ number_of_devices = storage_devices
1069
+ else:
1070
+ logger.warning("Can not get ec2 instance type for this instance..")
1071
+ if not number_of_devices:
1072
+ if snode.number_of_devices:
1073
+ number_of_devices = snode.number_of_devices
1074
+ else:
1075
+ logger.error("Unsupported instance type please specify --number-of-devices")
1076
+ return False
1077
+
1078
+ snode.number_of_devices = number_of_devices
1079
+
1080
+ number_of_split = snode.num_partitions_per_dev if snode.num_partitions_per_dev else snode.num_partitions_per_dev + 1
1081
+ number_of_alceml_devices = number_of_devices * number_of_split
1082
+ small_pool_count, large_pool_count = utils.calculate_pool_count(
1083
+ number_of_alceml_devices, snode.max_lvol, snode.max_snap, snode.cpu, len(snode.nvme_pollers_cores) or snode.cpu)
1084
+
1085
+ # Calculate minimum huge page memory
1086
+ minimum_hp_memory = utils.calculate_minimum_hp_memory(small_pool_count, large_pool_count, snode.max_lvol, snode.max_snap, snode.cpu)
1087
+
1088
+ # Calculate minimum sys memory
1089
+ minimum_sys_memory = utils.calculate_minimum_sys_memory(snode.max_prov)
1090
+
1091
+ # check for memory
1092
+ if "memory_details" in node_info and node_info['memory_details']:
1093
+ memory_details = node_info['memory_details']
1094
+ logger.info("Node Memory info")
1095
+ logger.info(f"Total: {utils.humanbytes(memory_details['total'])}")
1096
+ logger.info(f"Free: {utils.humanbytes(memory_details['free'])}")
1097
+ else:
1098
+ logger.error(f"Cannot get memory info from the ec2 instance.. Exiting")
1099
+
1100
+ satisfied, spdk_mem = utils.calculate_spdk_memory(minimum_hp_memory,
1101
+ minimum_sys_memory,
1102
+ int(memory_details['free']),
1103
+ int(memory_details['huge_total']))
1104
+ if not satisfied:
1105
+ logger.error(f"Not enough memory for the provided max_lvo: {snode.max_lvol}, max_snap: {snode.max_snap}, max_prov: {utils.humanbytes(snode.max_prov)}.. Exiting")
1106
+
1107
+
1022
1108
  spdk_debug = snode.spdk_debug
1023
1109
  if set_spdk_debug:
1024
1110
  spdk_debug = spdk_debug
@@ -1026,17 +1112,14 @@ def restart_storage_node(
1026
1112
 
1027
1113
  cluster_docker = utils.get_docker_client(snode.cluster_id)
1028
1114
  cluster_ip = cluster_docker.info()["Swarm"]["NodeAddr"]
1029
- results, err = snode_api.spdk_process_start(snode.spdk_cpu_mask, mem, img, spdk_debug, cluster_ip)
1115
+ results, err = snode_api.spdk_process_start(snode.spdk_cpu_mask, spdk_mem, img, spdk_debug, cluster_ip)
1030
1116
 
1031
1117
  if not results:
1032
1118
  logger.error(f"Failed to start spdk: {err}")
1033
1119
  return False
1034
1120
  time.sleep(3)
1035
1121
 
1036
- if small_pool_count:
1037
- snode.iobuf_small_pool_count = small_pool_count
1038
- if large_pool_count:
1039
- snode.iobuf_large_pool_count = large_pool_count
1122
+
1040
1123
  if small_bufsize:
1041
1124
  snode.iobuf_small_bufsize = small_bufsize
1042
1125
  if large_bufsize: