sbcli-pre 1.2.5__zip → 1.2.7__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 (142) hide show
  1. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/PKG-INFO +1 -1
  2. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/env_var +1 -1
  3. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/PKG-INFO +1 -1
  4. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/SOURCES.txt +5 -3
  5. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_cli/cli.py +138 -136
  6. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/cluster_ops.py +138 -235
  7. sbcli_pre-1.2.7/simplyblock_core/constants.py +91 -0
  8. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/caching_node_controller.py +8 -6
  9. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/cluster_events.py +9 -0
  10. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/device_controller.py +56 -63
  11. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/events_controller.py +5 -3
  12. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/health_controller.py +30 -40
  13. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/lvol_controller.py +75 -39
  14. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/pool_controller.py +8 -4
  15. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/snapshot_controller.py +36 -3
  16. sbcli_pre-1.2.7/simplyblock_core/controllers/tasks_controller.py +103 -0
  17. sbcli_pre-1.2.7/simplyblock_core/controllers/tasks_events.py +37 -0
  18. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/distr_controller.py +13 -9
  19. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/kv_store.py +62 -20
  20. sbcli_pre-1.2.7/simplyblock_core/mgmt_node_ops.py +205 -0
  21. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/events.py +9 -1
  22. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/job_schedule.py +6 -0
  23. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/nvme_device.py +42 -4
  24. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/storage_node.py +14 -2
  25. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/rpc_client.py +55 -10
  26. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/__init__.py +0 -4
  27. sbcli_pre-1.2.5/simplyblock_core/scripts/alerting/alert_resources.yaml → sbcli_pre-1.2.7/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +54 -5
  28. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/cluster.json +1 -1
  29. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/deploy_stack.sh +9 -0
  30. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +32 -15
  31. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/docker-compose-swarm.yml +17 -2
  32. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/haproxy.cfg +15 -0
  33. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/install_deps.sh +3 -0
  34. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/stack_deploy_wait.sh +1 -1
  35. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/capacity_and_stats_collector.py +1 -1
  36. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/device_monitor.py +5 -46
  37. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/distr_event_collector.py +10 -11
  38. sbcli_pre-1.2.7/simplyblock_core/services/health_check_service.py +134 -0
  39. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/lvol_monitor.py +1 -1
  40. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/lvol_stat_collector.py +1 -1
  41. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/port_stat_collector.py +0 -1
  42. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/storage_node_monitor.py +49 -44
  43. sbcli_pre-1.2.7/simplyblock_core/services/tasks_runner_migration.py +61 -0
  44. sbcli_pre-1.2.5/simplyblock_core/services/job_tasks.py → sbcli_pre-1.2.7/simplyblock_core/services/tasks_runner_restart.py +95 -46
  45. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/snode_client.py +12 -0
  46. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/storage_node_ops.py +630 -358
  47. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/utils.py +126 -1
  48. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/snode_ops.py +103 -25
  49. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_cluster.py +20 -43
  50. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_device.py +10 -7
  51. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_lvol.py +9 -5
  52. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_pool.py +14 -5
  53. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_storage_node.py +15 -15
  54. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/node_utils.py +0 -2
  55. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/utils.py +8 -0
  56. sbcli_pre-1.2.5/simplyblock_core/constants.py +0 -65
  57. sbcli_pre-1.2.5/simplyblock_core/mgmt_node_ops.py +0 -80
  58. sbcli_pre-1.2.5/simplyblock_core/scripts/apply_dashboard.sh +0 -22
  59. sbcli_pre-1.2.5/simplyblock_core/services/health_check_service.py +0 -136
  60. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/README.md +0 -0
  61. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/pyproject.toml +0 -0
  62. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/dependency_links.txt +0 -0
  63. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/entry_points.txt +0 -0
  64. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/requires.txt +0 -0
  65. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/top_level.txt +0 -0
  66. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/setup.cfg +0 -0
  67. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/setup.py +0 -0
  68. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_cli/main.py +0 -0
  69. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/__init__.py +0 -0
  70. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/cnode_client.py +0 -0
  71. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/compute_node_ops.py +0 -0
  72. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/__init__.py +0 -0
  73. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/device_events.py +0 -0
  74. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/lvol_events.py +0 -0
  75. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/mgmt_events.py +0 -0
  76. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/pool_events.py +0 -0
  77. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/snapshot_events.py +0 -0
  78. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/storage_events.py +0 -0
  79. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/__init__.py +0 -0
  80. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/base_model.py +0 -0
  81. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/caching_node.py +0 -0
  82. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/cluster.py +0 -0
  83. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/compute_node.py +0 -0
  84. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/deployer.py +0 -0
  85. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/global_settings.py +0 -0
  86. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/iface.py +0 -0
  87. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/lvol_model.py +0 -0
  88. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/mgmt_node.py +0 -0
  89. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/pool.py +0 -0
  90. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/port_stat.py +0 -0
  91. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/snapshot.py +0 -0
  92. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/stats.py +0 -0
  93. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/pci_utils.py +0 -0
  94. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  95. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  96. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/config_docker.sh +0 -0
  97. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  98. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  99. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  100. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  101. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  102. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/datasource.yml +0 -0
  103. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/db_config_double.sh +0 -0
  104. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/db_config_single.sh +0 -0
  105. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/prometheus.yml +0 -0
  106. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/run_ssh.sh +0 -0
  107. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/set_db_config.sh +0 -0
  108. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/__init__.py +0 -0
  109. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/caching_node_monitor.py +0 -0
  110. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/cap_monitor.py +0 -0
  111. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/install_service.sh +0 -0
  112. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/log_agg_service.py +0 -0
  113. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  114. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/remove_service.sh +0 -0
  115. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/service_template.service +0 -0
  116. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/shell_utils.py +0 -0
  117. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/__init__.py +0 -0
  118. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/app.py +0 -0
  119. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/auth_middleware.py +0 -0
  120. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/__init__.py +0 -0
  121. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  122. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  123. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  124. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  125. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  126. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  127. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  128. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  129. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  130. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/caching_node_app.py +0 -0
  131. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/caching_node_app_k8s.py +0 -0
  132. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/node_webapp.py +0 -0
  133. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/snode_app.py +0 -0
  134. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/delete.py +0 -0
  135. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy.py +0 -0
  136. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  137. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  138. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/is_up.py +0 -0
  139. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/list_deps.py +0 -0
  140. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/rpac.yaml +0 -0
  141. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/tst.py +0 -0
  142. {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/templates/deploy_spdk.yaml.j2 +0 -0
@@ -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()
@@ -125,7 +125,7 @@ def validate_add_lvol_func(name, size, host_id_or_name, pool_id_or_name,
125
125
  return False, f"Invalid LVol size: {utils.humanbytes(size)} " \
126
126
  f"Pool max size has reached {utils.humanbytes(total)} of {utils.humanbytes(pool.pool_max_size)}"
127
127
 
128
- for lvol in db_controller.get_lvols():
128
+ for lvol in db_controller.get_lvols(pool.cluster_id):
129
129
  if lvol.pool_uuid == pool.get_id():
130
130
  if lvol.lvol_name == name:
131
131
  return False, f"LVol name must be unique: {name}"
@@ -167,7 +167,7 @@ def validate_add_lvol_func(name, size, host_id_or_name, pool_id_or_name,
167
167
 
168
168
 
169
169
  def get_jm_names(snode):
170
- return [f"jm_{snode.get_id()}"]
170
+ return [snode.jm_device.jm_bdev] if snode.jm_device else []
171
171
 
172
172
 
173
173
  # Deprecated
@@ -218,7 +218,7 @@ def add_lvol(name, size, host_id_or_name, pool_id_or_name, use_comp, use_crypto,
218
218
  return False, "Storage node has no nvme devices"
219
219
 
220
220
  dev_count = 0
221
- for node in db_controller.get_storage_nodes():
221
+ for node in db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id):
222
222
  if node.status == node.STATUS_ONLINE:
223
223
  for dev in node.nvme_devices:
224
224
  if dev.status == dev.STATUS_ONLINE:
@@ -252,7 +252,7 @@ def add_lvol(name, size, host_id_or_name, pool_id_or_name, use_comp, use_crypto,
252
252
  distr_npcs = 1
253
253
  else:
254
254
  node_count = 0
255
- for node in db_controller.get_storage_nodes():
255
+ for node in db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id):
256
256
  if node.status == node.STATUS_ONLINE:
257
257
  node_count += 1
258
258
  if node_count == 3:
@@ -265,7 +265,7 @@ def add_lvol(name, size, host_id_or_name, pool_id_or_name, use_comp, use_crypto,
265
265
 
266
266
  # name, vuid, ndcs, npcs, num_blocks, block_size, alloc_names
267
267
  ret = rpc_client.bdev_distrib_create(f"distr_{name}", vuid, distr_ndcs, distr_npcs, num_blocks, distr_bs, jm_names,
268
- distr_chunk_bs)
268
+ distr_chunk_bs, dev_cpu_mask=snode.dev_cpu_mask)
269
269
  bdev_stack.append({"type": "distr", "name": f"distr_{name}"})
270
270
  if not ret:
271
271
  logger.error("failed to create Distr bdev")
@@ -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():
368
- snodes = db_controller.get_storage_nodes()
367
+ def _get_next_3_nodes(cluster_id, lvol_size=0):
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)
@@ -461,6 +472,7 @@ def validate_aes_xts_keys(key1: str, key2: str) -> Tuple[bool, str]:
461
472
 
462
473
  return True, ""
463
474
 
475
+
464
476
  def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp, use_crypto,
465
477
  distr_vuid, distr_ndcs, distr_npcs,
466
478
  max_rw_iops, max_rw_mbytes, max_r_mbytes, max_w_mbytes,
@@ -483,12 +495,12 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
483
495
  if not pool:
484
496
  return False, f"Pool not found: {pool_id_or_name}"
485
497
 
486
- cl = db_controller.get_clusters()[0]
498
+ cl = db_controller.get_cluster_by_id(pool.cluster_id)
487
499
  if cl.status not in [cl.STATUS_ACTIVE, cl.STATUS_DEGRADED]:
488
500
  return False, f"Cluster is not active, status: {cl.status}"
489
501
 
490
502
  if ha_type == "default":
491
- ha_type = cl.ha_type
503
+ ha_type = "single"
492
504
 
493
505
  max_rw_iops = max_rw_iops or 0
494
506
  max_rw_mbytes = max_rw_mbytes or 0
@@ -502,8 +514,13 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
502
514
  logger.error(error)
503
515
  return False, error
504
516
 
517
+ cluster_size_prov = 0
518
+ cluster_size_total = 0
519
+ for lvol in db_controller.get_lvols(cl.get_id()):
520
+ cluster_size_prov += lvol.size
521
+
505
522
  dev_count = 0
506
- snodes = db_controller.get_storage_nodes()
523
+ snodes = db_controller.get_storage_nodes_by_cluster_id(cl.get_id())
507
524
  online_nodes = []
508
525
  for node in snodes:
509
526
  if node.status == node.STATUS_ONLINE:
@@ -511,6 +528,11 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
511
528
  for dev in node.nvme_devices:
512
529
  if dev.status == dev.STATUS_ONLINE:
513
530
  dev_count += 1
531
+ cluster_size_total += dev.size
532
+
533
+ if len(online_nodes) == 0:
534
+ logger.error("No online Storage nodes found")
535
+ return False, "No online Storage nodes found"
514
536
 
515
537
  if dev_count == 0:
516
538
  logger.error("No NVMe devices found in the cluster")
@@ -523,19 +545,6 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
523
545
  logger.error("Storage nodes are less than 3 in ha cluster")
524
546
  return False, "Storage nodes are less than 3 in ha cluster"
525
547
 
526
- if len(online_nodes) == 0:
527
- logger.error("No online Storage nodes found")
528
- return False, "No online Storage nodes found"
529
-
530
- cluster_size_prov = 0
531
- cluster_size_total = 0
532
- for lvol in db_controller.get_lvols():
533
- cluster_size_prov += lvol.size
534
-
535
- for dev in db_controller.get_storage_devices():
536
- if dev.status == NVMeDevice.STATUS_ONLINE:
537
- cluster_size_total += dev.size
538
-
539
548
  cluster_size_prov_util = int(((cluster_size_prov+size) / cluster_size_total) * 100)
540
549
 
541
550
  if cl.prov_cap_crit and cl.prov_cap_crit < cluster_size_prov_util:
@@ -697,7 +706,9 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
697
706
  lvol.lvol_type += ',compress'
698
707
  lvol.top_bdev = lvol.comp_bdev
699
708
 
700
- nodes = _get_next_3_nodes()
709
+ nodes = _get_next_3_nodes(cl.get_id(), lvol.size)
710
+ if not nodes:
711
+ return False, f"No nodes found with enough resources to create the LVol"
701
712
 
702
713
  if host_node:
703
714
  nodes.insert(0, host_node)
@@ -761,6 +772,7 @@ def _create_bdev_stack(lvol, snode, ha_comm_addrs, ha_inode_self):
761
772
  params['jm_names'] = get_jm_names(snode)
762
773
  params['ha_comm_addrs'] = ha_comm_addrs
763
774
  params['ha_inode_self'] = ha_inode_self
775
+ params['dev_cpu_mask'] = snode.dev_cpu_mask
764
776
  ret = rpc_client.bdev_distrib_create(**params)
765
777
  if ret:
766
778
  ret = distr_controller.send_cluster_map_to_node(snode)
@@ -799,6 +811,18 @@ def add_lvol_on_node(lvol, snode, ha_comm_addrs=None, ha_inode_self=None):
799
811
  rpc_client = RPCClient(snode.mgmt_ip, snode.rpc_port, snode.rpc_username, snode.rpc_password)
800
812
  spdk_mem_info_before = rpc_client.ultra21_util_get_malloc_stats()
801
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
+
802
826
  ret, msg = _create_bdev_stack(lvol, snode, ha_comm_addrs, ha_inode_self)
803
827
  if not ret:
804
828
  return False, msg
@@ -930,7 +954,7 @@ def delete_lvol_from_node(lvol_id, node_id, clear_data=True):
930
954
  # 3- clear alceml devices
931
955
  if clear_data:
932
956
  logger.info(f"Clearing Alceml devices")
933
- for node in db_controller.get_storage_nodes():
957
+ for node in db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id):
934
958
  if node.status == StorageNode.STATUS_ONLINE:
935
959
  rpc_node = RPCClient(node.mgmt_ip, node.rpc_port, node.rpc_username, node.rpc_password)
936
960
  for dev in node.nvme_devices:
@@ -941,11 +965,7 @@ def delete_lvol_from_node(lvol_id, node_id, clear_data=True):
941
965
  lvol.write_to_db(db_controller.kv_store)
942
966
 
943
967
  # 4- clear JM
944
- jm_device = None
945
- for dev in snode.nvme_devices:
946
- if dev.status == NVMeDevice.STATUS_JM:
947
- jm_device = dev
948
- break
968
+ jm_device = snode.jm_device
949
969
  ret = rpc_client.alceml_unmap_vuid(jm_device.alceml_bdev, lvol.vuid)
950
970
  if not ret:
951
971
  logger.error(f"Failed to unmap jm alceml {jm_device.alceml_bdev} with vuid {lvol.vuid}")
@@ -1021,7 +1041,7 @@ def delete_lvol(id_or_name, force_delete=False):
1021
1041
  snap = db_controller.get_snapshot_by_id(lvol.cloned_from_snap)
1022
1042
  if snap.deleted is True:
1023
1043
  lvols_count = 0
1024
- for lvol in db_controller.get_lvols():
1044
+ for lvol in db_controller.get_lvols(): # pass
1025
1045
  if lvol.cloned_from_snap == snap.get_id():
1026
1046
  lvols_count += 1
1027
1047
  if lvols_count == 0:
@@ -1082,8 +1102,20 @@ def set_lvol(uuid, max_rw_iops, max_rw_mbytes, max_r_mbytes, max_w_mbytes, name=
1082
1102
  return True
1083
1103
 
1084
1104
 
1085
- def list_lvols(is_json):
1086
- lvols = db_controller.get_lvols()
1105
+ def list_lvols(is_json, cluster_id, pool_id_or_name):
1106
+ lvols = []
1107
+ if cluster_id:
1108
+ lvols = db_controller.get_lvols(cluster_id)
1109
+ elif pool_id_or_name:
1110
+ pool = db_controller.get_pool_by_id(pool_id_or_name)
1111
+ if not pool:
1112
+ pool = db_controller.get_pool_by_name(pool_id_or_name)
1113
+ if pool:
1114
+ for lv_id in pool.lvols:
1115
+ lvols.append(db_controller.get_lvol_by_id(lv_id))
1116
+ else:
1117
+ lvols = db_controller.get_lvols()
1118
+
1087
1119
  data = []
1088
1120
  for lvol in lvols:
1089
1121
  if lvol.deleted is True:
@@ -1134,7 +1166,7 @@ def list_lvols_mem(is_json, is_csv):
1134
1166
 
1135
1167
  def get_lvol(lvol_id_or_name, is_json):
1136
1168
  lvol = None
1137
- for lv in db_controller.get_lvols():
1169
+ for lv in db_controller.get_lvols(): # pass
1138
1170
  if lv.get_id() == lvol_id_or_name or lv.lvol_name == lvol_id_or_name:
1139
1171
  lvol = lv
1140
1172
  break
@@ -1348,7 +1380,7 @@ def get_cluster_map(lvol_id):
1348
1380
  if not ret:
1349
1381
  logger.error(f"Failed to get LVol cluster map: {lvol_id}")
1350
1382
  return False
1351
- logger.info(ret)
1383
+ logger.debug(ret)
1352
1384
  print("*"*100)
1353
1385
  results, is_passed = distr_controller.parse_distr_cluster_map(ret)
1354
1386
  return utils.print_table(results)
@@ -1361,8 +1393,12 @@ def migrate(lvol_id, node_id):
1361
1393
  logger.error(f"lvol not found: {lvol_id}")
1362
1394
  return False
1363
1395
 
1364
- old_node = lvol.node_id
1365
- nodes = _get_next_3_nodes()
1396
+ old_node_id = lvol.node_id
1397
+ old_node = db_controller.get_storage_node_by_id(old_node_id)
1398
+ nodes = _get_next_3_nodes(old_node.cluster_id)
1399
+ if not nodes:
1400
+ logger.error(f"No nodes found with enough resources to create the LVol")
1401
+ return False
1366
1402
 
1367
1403
  if node_id:
1368
1404
  nodes[0] = db_controller.get_storage_node_by_id(node_id)
@@ -1396,7 +1432,7 @@ def migrate(lvol_id, node_id):
1396
1432
  host_node.write_to_db(db_controller.kv_store)
1397
1433
  lvol.write_to_db(db_controller.kv_store)
1398
1434
 
1399
- lvol_events.lvol_migrate(lvol, old_node, lvol.node_id)
1435
+ lvol_events.lvol_migrate(lvol, old_node_id, lvol.node_id)
1400
1436
 
1401
1437
  return True
1402
1438
 
@@ -23,7 +23,7 @@ def _generate_string(length):
23
23
  string.ascii_letters + string.digits) for _ in range(length))
24
24
 
25
25
 
26
- def add_pool(name, pool_max, lvol_max, max_rw_iops, max_rw_mbytes, max_r_mbytes, max_w_mbytes, has_secret):
26
+ def add_pool(name, pool_max, lvol_max, max_rw_iops, max_rw_mbytes, max_r_mbytes, max_w_mbytes, has_secret, cluster_id):
27
27
 
28
28
  if not name:
29
29
  logger.error("Pool name is empty!")
@@ -34,6 +34,11 @@ def add_pool(name, pool_max, lvol_max, max_rw_iops, max_rw_mbytes, max_r_mbytes,
34
34
  logger.error(f"Pool found with the same name: {name}")
35
35
  return False
36
36
 
37
+ cluster = db_controller.get_cluster_by_id(cluster_id)
38
+ if not cluster:
39
+ logger.error(f"Cluster not found: {cluster_id}")
40
+ return False
41
+
37
42
  pool_max = pool_max or 0
38
43
  lvol_max = lvol_max or 0
39
44
  max_rw_iops = max_rw_iops or 0
@@ -46,7 +51,6 @@ def add_pool(name, pool_max, lvol_max, max_rw_iops, max_rw_mbytes, max_r_mbytes,
46
51
  logger.error("max_rw_mbytes must be greater than max_w_mbytes and max_r_mbytes")
47
52
  return False
48
53
 
49
- cluster = db_controller.get_clusters()[0]
50
54
  logger.info("Adding pool")
51
55
  pool = Pool()
52
56
  pool.id = str(uuid.uuid4())
@@ -136,8 +140,8 @@ def delete_pool(uuid):
136
140
  return True
137
141
 
138
142
 
139
- def list_pools(is_json):
140
- pools = db_controller.get_pools()
143
+ def list_pools(is_json, cluster_id=None):
144
+ pools = db_controller.get_pools(cluster_id)
141
145
  data = []
142
146
  for pool in pools:
143
147
  data.append({
@@ -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
@@ -49,7 +66,7 @@ def add(lvol_id, snapshot_name):
49
66
  ret = rpc_client.bdev_distrib_create(
50
67
  base_name, new_vuid, lvol.ndcs, lvol.npcs, num_blocks,
51
68
  lvol.distr_bs, lvol_controller.get_jm_names(snode), lvol.distr_chunk_bs,
52
- None, None, lvol.distr_page_size)
69
+ None, None, lvol.distr_page_size, dev_cpu_mask=snode.dev_cpu_mask)
53
70
  if not ret:
54
71
  logger.error("Failed to create Distr bdev")
55
72
  return False, "Failed to create Distr bdev"
@@ -119,7 +136,12 @@ def delete(snapshot_uuid):
119
136
  logger.error(f"Snapshot not found {snapshot_uuid}")
120
137
  return False
121
138
 
122
- for lvol in db_controller.get_lvols():
139
+ snode = db_controller.get_storage_node_by_id(snap.lvol.node_id)
140
+ if not snode:
141
+ logger.error(f"Storage node not found {snap.lvol.node_id}")
142
+ return False
143
+
144
+ for lvol in db_controller.get_lvols(snode.cluster_id):
123
145
  if lvol.cloned_from_snap and lvol.cloned_from_snap == snapshot_uuid:
124
146
  logger.warning(f"Soft delete snapshot with clones, lvol ID: {lvol.get_id()}")
125
147
  snap.deleted = True
@@ -194,6 +216,16 @@ def clone(snapshot_id, clone_name, new_size=0):
194
216
  logger.error(msg)
195
217
  return False, msg
196
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()}"
197
229
  lvol = LVol()
198
230
  lvol.lvol_name = clone_name
199
231
  lvol.size = snap.lvol.size
@@ -227,7 +259,8 @@ def clone(snapshot_id, clone_name, new_size=0):
227
259
  name = f"distr_{new_vuid}_1"
228
260
  ret = rpc_client.bdev_distrib_create(
229
261
  name, new_vuid, lvol.ndcs, lvol.npcs, num_blocks,
230
- lvol.distr_bs, jm_names, lvol.distr_chunk_bs, None, None, lvol.distr_page_size)
262
+ lvol.distr_bs, jm_names, lvol.distr_chunk_bs, None, None, lvol.distr_page_size,
263
+ dev_cpu_mask=snode.dev_cpu_mask)
231
264
  if not ret:
232
265
  msg="Failed to create Distr bdev"
233
266
  logger.error(msg)
@@ -0,0 +1,103 @@
1
+ # coding=utf-8
2
+ import logging
3
+ import time
4
+ import uuid
5
+
6
+ from simplyblock_core import kv_store, constants, utils
7
+ from simplyblock_core.controllers import tasks_events
8
+ from simplyblock_core.models.job_schedule import JobSchedule
9
+
10
+ logger = logging.getLogger()
11
+ db_controller = kv_store.DBController()
12
+
13
+
14
+ def _validate_new_task_node_restart(cluster_id, node_id):
15
+ tasks = db_controller.get_job_tasks(cluster_id)
16
+ for task in tasks:
17
+ if task.function_name == JobSchedule.FN_NODE_RESTART and task.node_id == node_id:
18
+ if task.status != JobSchedule.STATUS_DONE:
19
+ logger.info(f"Task found, skip adding new task: {task.get_id()}")
20
+ return False
21
+ return True
22
+
23
+
24
+ def _validate_new_task_dev_restart(cluster_id, node_id, device_id):
25
+ tasks = db_controller.get_job_tasks(cluster_id)
26
+ for task in tasks:
27
+ if task.function_name == JobSchedule.FN_DEV_RESTART and task.device_id == device_id:
28
+ if task.status != JobSchedule.STATUS_DONE:
29
+ logger.info(f"Task found, skip adding new task: {task.get_id()}")
30
+ return False
31
+ elif task.function_name == JobSchedule.FN_NODE_RESTART and task.node_id == node_id:
32
+ if task.status != JobSchedule.STATUS_DONE:
33
+ logger.info(f"Task found, skip adding new task: {task.get_id()}")
34
+ return False
35
+ return True
36
+
37
+
38
+ def _add_task(function_name, cluster_id, node_id, device_id):
39
+
40
+ if function_name in [JobSchedule.FN_DEV_RESTART, JobSchedule.FN_DEV_MIG]:
41
+ if not _validate_new_task_dev_restart(cluster_id, node_id, device_id):
42
+ return False
43
+ elif function_name == JobSchedule.FN_NODE_RESTART:
44
+ if not _validate_new_task_node_restart(cluster_id, node_id):
45
+ return False
46
+
47
+ task_obj = JobSchedule()
48
+ task_obj.uuid = str(uuid.uuid4())
49
+ task_obj.cluster_id = cluster_id
50
+ task_obj.node_id = node_id
51
+ task_obj.device_id = device_id
52
+ task_obj.date = int(time.time())
53
+ task_obj.function_name = function_name
54
+ task_obj.status = JobSchedule.STATUS_NEW
55
+ task_obj.write_to_db(db_controller.kv_store)
56
+ tasks_events.task_create(task_obj)
57
+ return task_obj.uuid
58
+
59
+
60
+ def add_device_mig_task(device_id):
61
+ device = db_controller.get_storage_devices(device_id)
62
+ return _add_task(JobSchedule.FN_DEV_MIG, device.cluster_id, device.node_id, device.get_id())
63
+
64
+
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())
67
+
68
+
69
+ def add_node_to_auto_restart(node):
70
+ return _add_task(JobSchedule.FN_NODE_RESTART, node.cluster_id, node.get_id(), "")
71
+
72
+
73
+ def list_tasks(cluster_id):
74
+ cluster = db_controller.get_cluster_by_id(cluster_id)
75
+ if not cluster:
76
+ logger.error("Cluster not found: %s", cluster_id)
77
+ return False
78
+
79
+ data = []
80
+ tasks = db_controller.get_job_tasks(cluster_id)
81
+ for task in tasks:
82
+ data.append({
83
+ "Task ID": task.uuid,
84
+ "Target ID": task.device_id or task.node_id,
85
+ "Function": task.function_name,
86
+ "Retry": f"{task.retry}/{constants.TASK_EXEC_RETRY_COUNT}",
87
+ "Status": task.status,
88
+ "Result": task.function_result,
89
+ "Date": time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(task.date)),
90
+ })
91
+ return utils.print_table(data)
92
+
93
+
94
+ def cancel_task(task_id):
95
+ task = db_controller.get_task_by_id(task_id)
96
+ if not task:
97
+ logger.error("Task not found: %s", task_id)
98
+ return False
99
+
100
+ task.canceled = True
101
+ task.write_to_db(db_controller.kv_store)
102
+ tasks_events.task_canceled(task)
103
+ return True
@@ -0,0 +1,37 @@
1
+ # coding=utf-8
2
+ import logging
3
+
4
+ from simplyblock_core.controllers import events_controller as ec
5
+ from simplyblock_core.kv_store import DBController
6
+
7
+ logger = logging.getLogger()
8
+ db_controller = DBController()
9
+
10
+
11
+ def _task_event(task, message, caused_by, event):
12
+ ec.log_event_cluster(
13
+ cluster_id=task.cluster_id,
14
+ domain=ec.DOMAIN_CLUSTER,
15
+ event=event,
16
+ db_object=task,
17
+ caused_by=caused_by,
18
+ message=message,
19
+ node_id=task.node_id,
20
+ status=task.status)
21
+
22
+
23
+ def task_create(task, caused_by=ec.CAUSED_BY_CLI):
24
+ _task_event(task, f"task created: {task.uuid}", caused_by, ec.EVENT_OBJ_CREATED)
25
+
26
+
27
+ def task_updated(task, caused_by=ec.CAUSED_BY_CLI):
28
+ _task_event(task, f"Task updated: {task.uuid}", caused_by, ec.EVENT_STATUS_CHANGE)
29
+
30
+
31
+ def task_status_change(task, new_state, old_status, caused_by=ec.CAUSED_BY_CLI):
32
+ _task_event(task, f"task status changed from: {old_status} to: {new_state}", caused_by, ec.EVENT_STATUS_CHANGE)
33
+
34
+
35
+ def task_canceled(task, caused_by=ec.CAUSED_BY_CLI):
36
+ _task_event(task, f"Task canceled: {task.uuid}", caused_by, ec.EVENT_STATUS_CHANGE)
37
+
@@ -10,8 +10,9 @@ from simplyblock_core.kv_store import DBController
10
10
  logger = logging.getLogger()
11
11
 
12
12
 
13
- def send_node_status_event(node_id, node_status):
13
+ def send_node_status_event(node, node_status):
14
14
  db_controller = DBController()
15
+ node_id = node.get_id()
15
16
  logging.info(f"Sending event updates, node: {node_id}, status: {node_status}")
16
17
  node_status_event = {
17
18
  "timestamp": datetime.datetime.now().isoformat("T", "seconds") + 'Z',
@@ -20,7 +21,7 @@ def send_node_status_event(node_id, node_status):
20
21
  "status": node_status}
21
22
  events = {"events": [node_status_event]}
22
23
  logger.debug(node_status_event)
23
- snodes = db_controller.get_storage_nodes()
24
+ snodes = db_controller.get_storage_nodes_by_cluster_id(node.cluster_id)
24
25
  for node in snodes:
25
26
  if node.status != node.STATUS_ONLINE:
26
27
  continue
@@ -29,8 +30,9 @@ def send_node_status_event(node_id, node_status):
29
30
  ret = rpc_client.distr_status_events_update(events)
30
31
 
31
32
 
32
- def send_dev_status_event(storage_ID, dev_status):
33
+ def send_dev_status_event(device, dev_status):
33
34
  db_controller = DBController()
35
+ storage_ID = device.cluster_device_order
34
36
  logging.info(f"Sending event updates, device: {storage_ID}, status: {dev_status}")
35
37
  node_status_event = {
36
38
  "timestamp": datetime.datetime.now().isoformat("T", "seconds") + 'Z',
@@ -39,7 +41,7 @@ def send_dev_status_event(storage_ID, dev_status):
39
41
  "status": dev_status}
40
42
  events = {"events": [node_status_event]}
41
43
  logger.debug(node_status_event)
42
- snodes = db_controller.get_storage_nodes()
44
+ snodes = db_controller.get_storage_nodes_by_cluster_id(device.cluster_id)
43
45
  for node in snodes:
44
46
  if node.status != node.STATUS_ONLINE:
45
47
  continue
@@ -52,7 +54,7 @@ def send_dev_status_event(storage_ID, dev_status):
52
54
 
53
55
  def disconnect_device(device):
54
56
  db_controller = DBController()
55
- snodes = db_controller.get_storage_nodes()
57
+ snodes = db_controller.get_storage_nodes_by_cluster_id(device.cluster_id)
56
58
  for node in snodes:
57
59
  if node.status != node.STATUS_ONLINE:
58
60
  continue
@@ -95,7 +97,9 @@ def get_distr_cluster_map(snodes, target_node):
95
97
  dev_map[dev.cluster_device_order] = {
96
98
  "UUID": dev.get_id(),
97
99
  "bdev_name": name,
98
- "status": dev.status}
100
+ "status": dev.status,
101
+ "physical_label": dev.physical_label
102
+ }
99
103
  dev_w_map.append({
100
104
  "weight": dev_w,
101
105
  "id": dev.cluster_device_order})
@@ -158,7 +162,7 @@ def parse_distr_cluster_map(map_string):
158
162
  "Actual Status": "",
159
163
  "Results": "",
160
164
  }
161
- sd = db_controller.get_storage_devices(device_id)
165
+ sd = db_controller.get_storage_device_by_id(device_id)
162
166
  if sd:
163
167
  data["Actual Status"] = sd.status
164
168
  if sd.status == status:
@@ -175,7 +179,7 @@ def parse_distr_cluster_map(map_string):
175
179
 
176
180
  def send_cluster_map_to_node(node):
177
181
  db_controller = DBController()
178
- snodes = db_controller.get_storage_nodes()
182
+ snodes = db_controller.get_storage_nodes_by_cluster_id(node.cluster_id)
179
183
  rpc_client = RPCClient(node.mgmt_ip, node.rpc_port, node.rpc_username, node.rpc_password)
180
184
  cluster_map_data = get_distr_cluster_map(snodes, node)
181
185
  cluster_map_data['UUID_node_target'] = node.get_id()
@@ -189,7 +193,7 @@ def send_cluster_map_to_node(node):
189
193
 
190
194
  def send_cluster_map_add_node(snode):
191
195
  db_controller = DBController()
192
- snodes = db_controller.get_storage_nodes()
196
+ snodes = db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id)
193
197
  for node in snodes:
194
198
  if node.status != node.STATUS_ONLINE:
195
199
  continue