sbcli-dev 3.8.35__zip → 3.8.37__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/PKG-INFO +1 -1
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/env_var +1 -1
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/PKG-INFO +1 -1
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_cli/cli.py +4 -1
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/cluster_ops.py +9 -9
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/constants.py +4 -2
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/device_controller.py +21 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/health_controller.py +53 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/lvol_controller.py +16 -1
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/tasks_controller.py +19 -17
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/nvme_device.py +1 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/storage_node.py +2 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/rpc_client.py +18 -2
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/storage_node_monitor.py +24 -1
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/storage_node_ops.py +125 -79
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/README.md +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/pyproject.toml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/SOURCES.txt +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/dependency_links.txt +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/entry_points.txt +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/requires.txt +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/top_level.txt +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/setup.cfg +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/setup.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_cli/main.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/__init__.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/cnode_client.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/compute_node_ops.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/__init__.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/caching_node_controller.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/cluster_events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/device_events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/events_controller.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/lvol_events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/mgmt_events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/pool_controller.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/pool_events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/snapshot_controller.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/snapshot_events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/storage_events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/controllers/tasks_events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/distr_controller.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/kv_store.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/mgmt_node_ops.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/__init__.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/base_model.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/caching_node.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/cluster.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/compute_node.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/deployer.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/events.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/global_settings.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/iface.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/job_schedule.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/lvol_model.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/mgmt_node.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/pool.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/port_stat.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/snapshot.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/models/stats.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/pci_utils.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/__init__.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/config_docker.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboard.yml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/devices.json +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/pools.json +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/datasource.yml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/db_config_double.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/db_config_single.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/deploy_stack.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/haproxy.cfg +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/install_deps.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/objstore.yml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/prometheus.yml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/run_ssh.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/set_db_config.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/__init__.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/caching_node_monitor.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/cap_monitor.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/device_monitor.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/distr_event_collector.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/health_check_service.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/install_service.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/log_agg_service.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/lvol_monitor.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/lvol_stat_collector.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/main_distr_event_collector.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/new_device_discovery.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/port_stat_collector.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/remove_service.sh +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/service_template.service +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_migration.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_restart.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/shell_utils.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/snode_client.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_core/utils.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/__init__.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/app.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/auth_middleware.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/__init__.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_basic.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/snode_ops.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_device.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_pool.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/caching_node_app.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/caching_node_app_k8s.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/node_utils.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/node_webapp.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/snode_app.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/snode_app_k8s.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/delete.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy_cnode.yaml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy_spdk.yaml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/is_up.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/list_deps.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/rpac.yaml +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/static/tst.py +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-3.8.35 → sbcli_dev-3.8.37}/simplyblock_web/utils.py +0 -0
|
@@ -56,6 +56,7 @@ class CLIWrapper:
|
|
|
56
56
|
sub_command.add_argument("--iobuf_small_bufsize", help='bdev_set_options param', dest='small_bufsize', type=int, default=0)
|
|
57
57
|
sub_command.add_argument("--iobuf_large_bufsize", help='bdev_set_options param', dest='large_bufsize', type=int, default=0)
|
|
58
58
|
sub_command.add_argument("--enable-test-device", help='Enable creation of test device', action='store_true')
|
|
59
|
+
sub_command.add_argument("--enable-ha-jm", help='Enable HA JM for ditrib creation', action='store_true')
|
|
59
60
|
|
|
60
61
|
|
|
61
62
|
# delete storage node
|
|
@@ -717,6 +718,7 @@ class CLIWrapper:
|
|
|
717
718
|
max_prov = self.parse_size(args.max_prov)
|
|
718
719
|
number_of_devices = args.number_of_devices
|
|
719
720
|
enable_test_device = args.enable_test_device
|
|
721
|
+
enable_ha_jm = args.enable_ha_jm
|
|
720
722
|
number_of_distribs = args.number_of_distribs
|
|
721
723
|
if max_prov < 1 * 1024 * 1024 * 1024:
|
|
722
724
|
return f"Max provisioning memory:{args.max_prov} must be larger than 1G"
|
|
@@ -739,7 +741,8 @@ class CLIWrapper:
|
|
|
739
741
|
number_of_devices=number_of_devices,
|
|
740
742
|
enable_test_device=enable_test_device,
|
|
741
743
|
namespace=None,
|
|
742
|
-
number_of_distribs=number_of_distribs
|
|
744
|
+
number_of_distribs=number_of_distribs,
|
|
745
|
+
enable_ha_jm=enable_ha_jm
|
|
743
746
|
)
|
|
744
747
|
|
|
745
748
|
return out
|
|
@@ -369,7 +369,7 @@ def cluster_activate(cl_id):
|
|
|
369
369
|
logger.info(f"Node {snode.get_id()} already has lvstore {snode.lvstore}... skipping")
|
|
370
370
|
continue
|
|
371
371
|
ret = storage_node_ops.create_lvstore(snode, cluster.distr_ndcs, cluster.distr_npcs, cluster.distr_bs,
|
|
372
|
-
cluster.distr_chunk_bs, cluster.page_size_in_blocks, max_size)
|
|
372
|
+
cluster.distr_chunk_bs, cluster.page_size_in_blocks, max_size, snodes)
|
|
373
373
|
if not ret:
|
|
374
374
|
logger.error("Failed to activate cluster")
|
|
375
375
|
set_cluster_status(cl_id, Cluster.STATUS_UNREADY)
|
|
@@ -688,14 +688,14 @@ def update_cluster(cl_id):
|
|
|
688
688
|
except Exception as e:
|
|
689
689
|
print(e)
|
|
690
690
|
|
|
691
|
-
for node in db_controller.get_storage_nodes_by_cluster_id(cl_id):
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
691
|
+
# for node in db_controller.get_storage_nodes_by_cluster_id(cl_id):
|
|
692
|
+
# node_docker = docker.DockerClient(base_url=f"tcp://{node.mgmt_ip}:2375", version="auto")
|
|
693
|
+
# logger.info(f"Pulling image {constants.SIMPLY_BLOCK_SPDK_ULTRA_IMAGE}")
|
|
694
|
+
# node_docker.images.pull(constants.SIMPLY_BLOCK_SPDK_ULTRA_IMAGE)
|
|
695
|
+
# if node.status == StorageNode.STATUS_ONLINE:
|
|
696
|
+
# storage_node_ops.shutdown_storage_node(node.get_id(), force=True)
|
|
697
|
+
# time.sleep(3)
|
|
698
|
+
# storage_node_ops.restart_storage_node(node.get_id())
|
|
699
699
|
|
|
700
700
|
logger.info("Done")
|
|
701
701
|
return True
|
|
@@ -11,7 +11,7 @@ LOG_WEB_DEBUG = True
|
|
|
11
11
|
|
|
12
12
|
INSTALL_DIR = os.path.dirname(os.path.realpath(__file__))
|
|
13
13
|
|
|
14
|
-
NODE_MONITOR_INTERVAL_SEC =
|
|
14
|
+
NODE_MONITOR_INTERVAL_SEC = 10
|
|
15
15
|
DEVICE_MONITOR_INTERVAL_SEC = 5
|
|
16
16
|
STAT_COLLECTOR_INTERVAL_SEC = 60*5 # 5 minutes
|
|
17
17
|
LVOL_STAT_COLLECTOR_INTERVAL_SEC = 5
|
|
@@ -52,13 +52,15 @@ GRAYLOG_CHECK_INTERVAL_SEC = 60
|
|
|
52
52
|
|
|
53
53
|
FDB_CHECK_INTERVAL_SEC = 60
|
|
54
54
|
|
|
55
|
-
SIMPLY_BLOCK_DOCKER_IMAGE = "simplyblock/simplyblock:
|
|
55
|
+
SIMPLY_BLOCK_DOCKER_IMAGE = "simplyblock/simplyblock:dev"
|
|
56
56
|
SIMPLY_BLOCK_CLI_NAME = "sbcli-dev"
|
|
57
57
|
TASK_EXEC_INTERVAL_SEC = 30
|
|
58
58
|
TASK_EXEC_RETRY_COUNT = 8
|
|
59
59
|
|
|
60
60
|
SIMPLY_BLOCK_SPDK_CORE_IMAGE = "simplyblock/spdk-core:latest"
|
|
61
|
+
SIMPLY_BLOCK_SPDK_CORE_IMAGE_ARM64 = "simplyblock/spdk-core:latest-arm64"
|
|
61
62
|
SIMPLY_BLOCK_SPDK_ULTRA_IMAGE = "simplyblock/spdk:348-temp-migration-2-latest"
|
|
63
|
+
SIMPLY_BLOCK_SPDK_ULTRA_IMAGE_JM = "simplyblock/spdk:feature-journal-ha-latest"
|
|
62
64
|
|
|
63
65
|
GELF_PORT = 12201
|
|
64
66
|
|
|
@@ -689,3 +689,24 @@ def add_device(device_id):
|
|
|
689
689
|
|
|
690
690
|
def device_set_failed_and_migrated(device_id):
|
|
691
691
|
return device_set_state(device_id, NVMeDevice.STATUS_FAILED_AND_MIGRATED)
|
|
692
|
+
|
|
693
|
+
|
|
694
|
+
def set_jm_device_state(device_id, state):
|
|
695
|
+
db_controller = DBController()
|
|
696
|
+
jm_device = None
|
|
697
|
+
snode = None
|
|
698
|
+
for node in db_controller.get_storage_nodes():
|
|
699
|
+
if node.jm_device.get_id() == device_id:
|
|
700
|
+
jm_device = node.jm_device
|
|
701
|
+
snode = node
|
|
702
|
+
break
|
|
703
|
+
if not jm_device:
|
|
704
|
+
logger.error("device not found")
|
|
705
|
+
return False
|
|
706
|
+
|
|
707
|
+
if jm_device.status == state:
|
|
708
|
+
return True
|
|
709
|
+
|
|
710
|
+
jm_device.status = state
|
|
711
|
+
snode.write_to_db(db_controller.kv_store)
|
|
712
|
+
return True
|
|
@@ -178,6 +178,13 @@ def check_node(node_id, with_devices=True):
|
|
|
178
178
|
else:
|
|
179
179
|
logger.info(f"Checking bdev: {remote_device.remote_bdev} ... not found")
|
|
180
180
|
# node_remote_devices_check &= bool(ret)
|
|
181
|
+
if snode.jm_device:
|
|
182
|
+
jm_device = snode.jm_device
|
|
183
|
+
ret = check_jm_device(jm_device.get_id())
|
|
184
|
+
if ret:
|
|
185
|
+
logger.info(f"Checking jm bdev: {jm_device.jm_bdev} ... ok")
|
|
186
|
+
else:
|
|
187
|
+
logger.info(f"Checking jm bdev: {jm_device.jm_bdev} ... not found")
|
|
181
188
|
lvstore_check = True
|
|
182
189
|
if snode.lvstore and snode.lvstore_stack:
|
|
183
190
|
distribs_list = []
|
|
@@ -226,6 +233,11 @@ def check_device(device_id):
|
|
|
226
233
|
db_controller = DBController()
|
|
227
234
|
device = db_controller.get_storage_device_by_id(device_id)
|
|
228
235
|
if not device:
|
|
236
|
+
# is jm device ?
|
|
237
|
+
for node in db_controller.get_storage_nodes():
|
|
238
|
+
if node.jm_device and node.jm_device.get_id() == device_id:
|
|
239
|
+
return check_jm_device(node.jm_device.get_id())
|
|
240
|
+
|
|
229
241
|
logger.error("device not found")
|
|
230
242
|
return False
|
|
231
243
|
|
|
@@ -394,3 +406,44 @@ def check_snap(snap_id):
|
|
|
394
406
|
|
|
395
407
|
ret = rpc_client.get_bdevs(snap.snap_bdev)
|
|
396
408
|
return ret
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
def check_jm_device(device_id):
|
|
412
|
+
db_controller = DBController()
|
|
413
|
+
jm_device = None
|
|
414
|
+
snode = None
|
|
415
|
+
for node in db_controller.get_storage_nodes():
|
|
416
|
+
if node.jm_device.get_id() == device_id:
|
|
417
|
+
jm_device = node.jm_device
|
|
418
|
+
snode = node
|
|
419
|
+
break
|
|
420
|
+
if not jm_device:
|
|
421
|
+
logger.error("device not found")
|
|
422
|
+
return False
|
|
423
|
+
|
|
424
|
+
if snode.status in [StorageNode.STATUS_OFFLINE, StorageNode.STATUS_REMOVED]:
|
|
425
|
+
logger.info(f"Skipping ,node status is {snode.status}")
|
|
426
|
+
return True
|
|
427
|
+
|
|
428
|
+
if jm_device.status in [NVMeDevice.STATUS_REMOVED, NVMeDevice.STATUS_FAILED]:
|
|
429
|
+
logger.info(f"Skipping ,device status is {jm_device.status}")
|
|
430
|
+
return True
|
|
431
|
+
|
|
432
|
+
passed = True
|
|
433
|
+
try:
|
|
434
|
+
rpc_client = RPCClient(
|
|
435
|
+
snode.mgmt_ip, snode.rpc_port,
|
|
436
|
+
snode.rpc_username, snode.rpc_password)
|
|
437
|
+
|
|
438
|
+
ret = rpc_client.get_bdevs(jm_device.jm_bdev)
|
|
439
|
+
if ret:
|
|
440
|
+
logger.debug(f"Checking bdev: {jm_device.jm_bdev} ... ok")
|
|
441
|
+
else:
|
|
442
|
+
logger.debug(f"Checking bdev: {jm_device.jm_bdev} ... not found")
|
|
443
|
+
passed = False
|
|
444
|
+
|
|
445
|
+
except Exception as e:
|
|
446
|
+
logger.error(f"Failed to connect to node's SPDK: {e}")
|
|
447
|
+
passed = False
|
|
448
|
+
|
|
449
|
+
return passed
|
|
@@ -169,6 +169,21 @@ def get_jm_names(snode):
|
|
|
169
169
|
return [snode.jm_device.jm_bdev] if snode.jm_device else []
|
|
170
170
|
|
|
171
171
|
|
|
172
|
+
def get_ha_jm_names(current_node, snode_list):
|
|
173
|
+
jm_list = []
|
|
174
|
+
if current_node.jm_device:
|
|
175
|
+
jm_list.append(current_node.jm_device.jm_bdev)
|
|
176
|
+
else:
|
|
177
|
+
jm_list.append("JM_LOCAL")
|
|
178
|
+
|
|
179
|
+
for node in snode_list:
|
|
180
|
+
if node.get_id() == current_node.get_id():
|
|
181
|
+
continue
|
|
182
|
+
name = f"remote_{node.jm_device.jm_bdev}n1"
|
|
183
|
+
jm_list.append(name)
|
|
184
|
+
return jm_list[:3]
|
|
185
|
+
|
|
186
|
+
|
|
172
187
|
def _get_next_3_nodes(cluster_id, lvol_size=0):
|
|
173
188
|
snodes = db_controller.get_storage_nodes_by_cluster_id(cluster_id)
|
|
174
189
|
online_nodes = []
|
|
@@ -564,7 +579,7 @@ def _create_bdev_stack(lvol, snode, ha_comm_addrs, ha_inode_self):
|
|
|
564
579
|
ret = None
|
|
565
580
|
|
|
566
581
|
if type == "bdev_distr":
|
|
567
|
-
params['jm_names'] = get_jm_names(snode)
|
|
582
|
+
# params['jm_names'] = get_jm_names(snode)
|
|
568
583
|
params['ha_comm_addrs'] = ha_comm_addrs
|
|
569
584
|
params['ha_inode_self'] = ha_inode_self
|
|
570
585
|
params['distrib_cpu_mask'] = snode.distrib_cpu_mask
|
|
@@ -54,20 +54,22 @@ def _add_task(function_name, cluster_id, node_id, device_id,
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
def add_device_mig_task(device_id):
|
|
57
|
-
device = db_controller.get_storage_devices(device_id)
|
|
58
|
-
for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
# device = db_controller.get_storage_devices(device_id)
|
|
58
|
+
# for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
|
|
59
|
+
# for lvol_id in node.lvols:
|
|
60
|
+
# _add_task(JobSchedule.FN_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
|
|
61
|
+
# max_retry=0, function_params={'lvol_id': lvol_id})
|
|
62
62
|
return True
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
def add_device_to_auto_restart(device):
|
|
66
|
-
return
|
|
66
|
+
return True
|
|
67
|
+
# return _add_task(JobSchedule.FN_DEV_RESTART, device.cluster_id, device.node_id, device.get_id())
|
|
67
68
|
|
|
68
69
|
|
|
69
70
|
def add_node_to_auto_restart(node):
|
|
70
|
-
return
|
|
71
|
+
return True
|
|
72
|
+
# return _add_task(JobSchedule.FN_NODE_RESTART, node.cluster_id, node.get_id(), "")
|
|
71
73
|
|
|
72
74
|
|
|
73
75
|
def list_tasks(cluster_id):
|
|
@@ -135,20 +137,20 @@ def get_active_node_mig_task(cluster_id, node_id):
|
|
|
135
137
|
|
|
136
138
|
|
|
137
139
|
def add_device_failed_mig_task(device_id):
|
|
138
|
-
device = db_controller.get_storage_devices(device_id)
|
|
139
|
-
for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
# device = db_controller.get_storage_devices(device_id)
|
|
141
|
+
# for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
|
|
142
|
+
# for lvol_id in node.lvols:
|
|
143
|
+
# _add_task(JobSchedule.FN_FAILED_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
|
|
144
|
+
# max_retry=0, function_params={'lvol_id': lvol_id})
|
|
143
145
|
return True
|
|
144
146
|
|
|
145
147
|
|
|
146
148
|
def add_new_device_mig_task(device_id):
|
|
147
|
-
device = db_controller.get_storage_devices(device_id)
|
|
148
|
-
for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
# device = db_controller.get_storage_devices(device_id)
|
|
150
|
+
# for node in db_controller.get_storage_nodes_by_cluster_id(device.cluster_id):
|
|
151
|
+
# for lvol_id in node.lvols:
|
|
152
|
+
# _add_task(JobSchedule.FN_NEW_DEV_MIG, device.cluster_id, node.get_id(), device.get_id(),
|
|
153
|
+
# max_retry=0, function_params={'lvol_id': lvol_id})
|
|
152
154
|
return True
|
|
153
155
|
|
|
154
156
|
|
|
@@ -113,6 +113,7 @@ class JMDevice(BaseModel):
|
|
|
113
113
|
"nvmf_nqn": {"type": str, 'default': ""},
|
|
114
114
|
"nvmf_ip": {"type": str, 'default': ""},
|
|
115
115
|
"nvmf_port": {"type": int, 'default': 4420},
|
|
116
|
+
"remote_bdev": {"type": str, 'default': ""},
|
|
116
117
|
|
|
117
118
|
"health_check": {"type": bool, "default": True},
|
|
118
119
|
"io_error": {"type": bool, 'default': False},
|
|
@@ -108,6 +108,8 @@ class StorageNode(BaseModel):
|
|
|
108
108
|
"num_partitions_per_dev": {"type": int, "default": 1},
|
|
109
109
|
"jm_percent": {"type": int, "default": 3},
|
|
110
110
|
"jm_device": {"type": JMDevice, "default": None},
|
|
111
|
+
"remote_jm_devices": {"type": List[JMDevice], 'default': []},
|
|
112
|
+
"enable_ha_jm": {"type": bool, "default": False},
|
|
111
113
|
|
|
112
114
|
"namespace": {"type": str, "default": ""},
|
|
113
115
|
|
|
@@ -363,7 +363,7 @@ class RPCClient:
|
|
|
363
363
|
|
|
364
364
|
def bdev_distrib_create(self, name, vuid, ndcs, npcs, num_blocks, block_size, jm_names,
|
|
365
365
|
chunk_size, ha_comm_addrs=None, ha_inode_self=None, pba_page_size=2097152,
|
|
366
|
-
distrib_cpu_mask=""):
|
|
366
|
+
distrib_cpu_mask="", ha_is_non_leader=True, jm_vuid=1):
|
|
367
367
|
""""
|
|
368
368
|
// Optional (not specified = no HA)
|
|
369
369
|
// Comma-separated communication addresses, for each node, e.g. "192.168.10.1:45001,192.168.10.1:32768".
|
|
@@ -379,12 +379,14 @@ class RPCClient:
|
|
|
379
379
|
"name": name,
|
|
380
380
|
"jm_names": ",".join(jm_names),
|
|
381
381
|
"vuid": vuid,
|
|
382
|
+
"jm_vuid": jm_vuid,
|
|
382
383
|
"ndcs": ndcs,
|
|
383
384
|
"npcs": npcs,
|
|
384
385
|
"num_blocks": num_blocks,
|
|
385
386
|
"block_size": block_size,
|
|
386
387
|
"chunk_size": chunk_size,
|
|
387
|
-
"pba_page_size": pba_page_size
|
|
388
|
+
"pba_page_size": pba_page_size,
|
|
389
|
+
"ha_is_non_leader": ha_is_non_leader,
|
|
388
390
|
}
|
|
389
391
|
if ha_comm_addrs:
|
|
390
392
|
params['ha_comm_addrs'] = ha_comm_addrs
|
|
@@ -470,6 +472,20 @@ class RPCClient:
|
|
|
470
472
|
}
|
|
471
473
|
return self._request("bdev_nvme_attach_controller", params)
|
|
472
474
|
|
|
475
|
+
def bdev_nvme_attach_controller_tcp_jm(self, name, nqn, ip, port):
|
|
476
|
+
params = {
|
|
477
|
+
"name": name,
|
|
478
|
+
"trtype": "tcp",
|
|
479
|
+
"traddr": ip,
|
|
480
|
+
"adrfam": "ipv4",
|
|
481
|
+
"trsvcid": str(port),
|
|
482
|
+
"subnqn": nqn,
|
|
483
|
+
"fast_io_fail_timeout_sec": 1,
|
|
484
|
+
"ctrlr_loss_timeout_sec": 1,
|
|
485
|
+
"reconnect_delay_sec": 1,
|
|
486
|
+
}
|
|
487
|
+
return self._request("bdev_nvme_attach_controller", params)
|
|
488
|
+
|
|
473
489
|
def bdev_nvme_attach_controller_tcp_caching(self, name, nqn, ip, port):
|
|
474
490
|
params = {
|
|
475
491
|
"name": name,
|
|
@@ -5,7 +5,7 @@ import time
|
|
|
5
5
|
from simplyblock_core import constants, kv_store, cluster_ops, storage_node_ops, utils
|
|
6
6
|
from simplyblock_core.controllers import health_controller, device_controller, tasks_controller
|
|
7
7
|
from simplyblock_core.models.cluster import Cluster
|
|
8
|
-
from simplyblock_core.models.nvme_device import NVMeDevice
|
|
8
|
+
from simplyblock_core.models.nvme_device import NVMeDevice, JMDevice
|
|
9
9
|
from simplyblock_core.models.storage_node import StorageNode
|
|
10
10
|
|
|
11
11
|
|
|
@@ -113,6 +113,16 @@ def set_node_offline(node):
|
|
|
113
113
|
tasks_controller.add_node_to_auto_restart(node)
|
|
114
114
|
|
|
115
115
|
|
|
116
|
+
def set_jm_device_status(node):
|
|
117
|
+
if node.status != StorageNode.STATUS_UNREACHABLE:
|
|
118
|
+
for dev in node.nvme_devices:
|
|
119
|
+
device_controller.device_set_unavailable(dev.get_id())
|
|
120
|
+
|
|
121
|
+
storage_node_ops.set_node_status(snode.get_id(), StorageNode.STATUS_UNREACHABLE)
|
|
122
|
+
# add node to auto restart
|
|
123
|
+
tasks_controller.add_node_to_auto_restart(node)
|
|
124
|
+
|
|
125
|
+
|
|
116
126
|
logger.info("Starting node monitor")
|
|
117
127
|
while True:
|
|
118
128
|
clusters = db_controller.get_clusters()
|
|
@@ -158,6 +168,19 @@ while True:
|
|
|
158
168
|
else:
|
|
159
169
|
set_node_offline(snode)
|
|
160
170
|
|
|
171
|
+
# check JM device
|
|
172
|
+
if snode.jm_device:
|
|
173
|
+
if snode.jm_device.status in [JMDevice.STATUS_ONLINE, JMDevice.STATUS_UNAVAILABLE]:
|
|
174
|
+
ret = health_controller.check_jm_device(snode.jm_device.get_id())
|
|
175
|
+
if ret:
|
|
176
|
+
logger.error(f"JM bdev is online: {snode.jm_device.get_id()}")
|
|
177
|
+
if snode.jm_device.status != JMDevice.STATUS_ONLINE:
|
|
178
|
+
device_controller.set_jm_device_state(snode.jm_device.get_id(), JMDevice.STATUS_ONLINE)
|
|
179
|
+
else:
|
|
180
|
+
logger.error(f"JM bdev is offline: {snode.jm_device.get_id()}")
|
|
181
|
+
if snode.jm_device.status != JMDevice.STATUS_UNAVAILABLE:
|
|
182
|
+
device_controller.set_jm_device_state(snode.jm_device.get_id(), JMDevice.STATUS_UNAVAILABLE)
|
|
183
|
+
|
|
161
184
|
update_cluster_status(cluster_id)
|
|
162
185
|
|
|
163
186
|
logger.info(f"Sleeping for {constants.NODE_MONITOR_INTERVAL_SEC} seconds")
|