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.
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/PKG-INFO +1 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/env_var +1 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/PKG-INFO +1 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/SOURCES.txt +5 -3
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_cli/cli.py +138 -136
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/cluster_ops.py +138 -235
- sbcli_pre-1.2.7/simplyblock_core/constants.py +91 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/caching_node_controller.py +8 -6
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/cluster_events.py +9 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/device_controller.py +56 -63
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/events_controller.py +5 -3
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/health_controller.py +30 -40
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/lvol_controller.py +75 -39
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/pool_controller.py +8 -4
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/snapshot_controller.py +36 -3
- sbcli_pre-1.2.7/simplyblock_core/controllers/tasks_controller.py +103 -0
- sbcli_pre-1.2.7/simplyblock_core/controllers/tasks_events.py +37 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/distr_controller.py +13 -9
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/kv_store.py +62 -20
- sbcli_pre-1.2.7/simplyblock_core/mgmt_node_ops.py +205 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/events.py +9 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/job_schedule.py +6 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/nvme_device.py +42 -4
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/storage_node.py +14 -2
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/rpc_client.py +55 -10
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/__init__.py +0 -4
- 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
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/cluster.json +1 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/deploy_stack.sh +9 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +32 -15
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/docker-compose-swarm.yml +17 -2
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/haproxy.cfg +15 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/install_deps.sh +3 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/stack_deploy_wait.sh +1 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/capacity_and_stats_collector.py +1 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/device_monitor.py +5 -46
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/distr_event_collector.py +10 -11
- sbcli_pre-1.2.7/simplyblock_core/services/health_check_service.py +134 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/lvol_monitor.py +1 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/lvol_stat_collector.py +1 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/port_stat_collector.py +0 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/storage_node_monitor.py +49 -44
- sbcli_pre-1.2.7/simplyblock_core/services/tasks_runner_migration.py +61 -0
- 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
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/snode_client.py +12 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/storage_node_ops.py +630 -358
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/utils.py +126 -1
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/snode_ops.py +103 -25
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_cluster.py +20 -43
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_device.py +10 -7
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_lvol.py +9 -5
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_pool.py +14 -5
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_storage_node.py +15 -15
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/node_utils.py +0 -2
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/utils.py +8 -0
- sbcli_pre-1.2.5/simplyblock_core/constants.py +0 -65
- sbcli_pre-1.2.5/simplyblock_core/mgmt_node_ops.py +0 -80
- sbcli_pre-1.2.5/simplyblock_core/scripts/apply_dashboard.sh +0 -22
- sbcli_pre-1.2.5/simplyblock_core/services/health_check_service.py +0 -136
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/README.md +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/pyproject.toml +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/dependency_links.txt +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/entry_points.txt +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/requires.txt +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/top_level.txt +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/setup.cfg +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/setup.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_cli/main.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/__init__.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/cnode_client.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/compute_node_ops.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/__init__.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/device_events.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/lvol_events.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/mgmt_events.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/pool_events.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/snapshot_events.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/controllers/storage_events.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/__init__.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/base_model.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/caching_node.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/cluster.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/compute_node.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/deployer.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/global_settings.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/iface.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/lvol_model.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/mgmt_node.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/pool.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/port_stat.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/snapshot.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/models/stats.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/pci_utils.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/config_docker.sh +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/devices.json +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/pools.json +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/datasource.yml +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/db_config_double.sh +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/db_config_single.sh +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/prometheus.yml +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/run_ssh.sh +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/scripts/set_db_config.sh +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/__init__.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/caching_node_monitor.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/cap_monitor.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/install_service.sh +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/log_agg_service.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/remove_service.sh +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/services/service_template.service +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_core/shell_utils.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/__init__.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/app.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/auth_middleware.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/__init__.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_basic.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/caching_node_app.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/caching_node_app_k8s.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/node_webapp.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/snode_app.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/delete.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy_cnode.yaml +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy_spdk.yaml +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/is_up.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/list_deps.py +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/rpac.yaml +0 -0
- {sbcli_pre-1.2.5 → sbcli_pre-1.2.7}/simplyblock_web/static/tst.py +0 -0
- {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 [
|
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.
|
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.
|
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.
|
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.
|
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 =
|
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.
|
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.
|
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 =
|
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 =
|
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.
|
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
|
-
|
1365
|
-
|
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,
|
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
|
-
|
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(
|
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.
|
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(
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|