sbcli-dev 3.8.36__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.36 → sbcli_dev-3.8.37}/PKG-INFO +1 -1
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/env_var +1 -1
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/PKG-INFO +1 -1
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_cli/cli.py +4 -1
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/cluster_ops.py +9 -9
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/constants.py +4 -2
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/lvol_controller.py +16 -1
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/tasks_controller.py +19 -17
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/nvme_device.py +1 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/storage_node.py +2 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/rpc_client.py +18 -2
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/storage_node_ops.py +125 -79
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/README.md +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/pyproject.toml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/SOURCES.txt +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/dependency_links.txt +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/entry_points.txt +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/requires.txt +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/sbcli_dev.egg-info/top_level.txt +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/setup.cfg +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/setup.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_cli/main.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/__init__.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/cnode_client.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/compute_node_ops.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/__init__.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/caching_node_controller.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/cluster_events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/device_controller.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/device_events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/events_controller.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/health_controller.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/lvol_events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/mgmt_events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/pool_controller.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/pool_events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/snapshot_controller.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/snapshot_events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/storage_events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/tasks_events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/distr_controller.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/kv_store.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/mgmt_node_ops.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/__init__.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/base_model.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/caching_node.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/cluster.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/compute_node.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/deployer.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/events.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/global_settings.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/iface.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/job_schedule.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/lvol_model.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/mgmt_node.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/pool.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/port_stat.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/snapshot.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/models/stats.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/pci_utils.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/__init__.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/config_docker.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboard.yml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/devices.json +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/pools.json +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/datasource.yml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/db_config_double.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/db_config_single.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/deploy_stack.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/haproxy.cfg +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/install_deps.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/objstore.yml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/prometheus.yml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/run_ssh.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/set_db_config.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/__init__.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/caching_node_monitor.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/cap_monitor.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/device_monitor.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/distr_event_collector.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/health_check_service.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/install_service.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/log_agg_service.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/lvol_monitor.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/lvol_stat_collector.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/main_distr_event_collector.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/new_device_discovery.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/port_stat_collector.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/remove_service.sh +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/service_template.service +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/storage_node_monitor.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_migration.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_restart.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/shell_utils.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/snode_client.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/utils.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/__init__.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/app.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/auth_middleware.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/__init__.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_basic.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/snode_ops.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_device.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_pool.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/caching_node_app.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/caching_node_app_k8s.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/node_utils.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/node_webapp.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/snode_app.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/snode_app_k8s.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/delete.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy_cnode.yaml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/deploy_spdk.yaml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/is_up.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/list_deps.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/rpac.yaml +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/static/tst.py +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-3.8.36 → 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
|
|
|
@@ -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,
|
|
@@ -295,9 +295,9 @@ def _create_jm_stack_on_raid(rpc_client, jm_nvme_bdevs, snode, after_restart):
|
|
|
295
295
|
logger.error(f"Failed to create pt noexcl bdev: {pt_name}")
|
|
296
296
|
return False
|
|
297
297
|
|
|
298
|
-
subsystem_nqn = snode.subsystem + ":dev:" +
|
|
298
|
+
subsystem_nqn = snode.subsystem + ":dev:" + jm_bdev
|
|
299
299
|
logger.info("creating subsystem %s", subsystem_nqn)
|
|
300
|
-
ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn',
|
|
300
|
+
ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', jm_bdev)
|
|
301
301
|
IP = None
|
|
302
302
|
for iface in snode.data_nics:
|
|
303
303
|
if iface.ip4_address:
|
|
@@ -387,9 +387,9 @@ def _create_jm_stack_on_device(rpc_client, nvme, snode, after_restart):
|
|
|
387
387
|
logger.error(f"Failed to create pt noexcl bdev: {pt_name}")
|
|
388
388
|
return False
|
|
389
389
|
|
|
390
|
-
subsystem_nqn = snode.subsystem + ":dev:" +
|
|
390
|
+
subsystem_nqn = snode.subsystem + ":dev:" + jm_bdev
|
|
391
391
|
logger.info("creating subsystem %s", subsystem_nqn)
|
|
392
|
-
ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn',
|
|
392
|
+
ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', jm_bdev)
|
|
393
393
|
IP = None
|
|
394
394
|
for iface in snode.data_nics:
|
|
395
395
|
if iface.ip4_address:
|
|
@@ -648,6 +648,7 @@ def _prepare_cluster_devices_on_restart(snode):
|
|
|
648
648
|
if not dev:
|
|
649
649
|
logger.error(f"Failed to create dev stack {nvme.get_id()}")
|
|
650
650
|
return False
|
|
651
|
+
nvme.status = NVMeDevice.STATUS_ONLINE
|
|
651
652
|
device_events.device_restarted(dev)
|
|
652
653
|
|
|
653
654
|
# prepare JM device
|
|
@@ -700,7 +701,6 @@ def _prepare_cluster_devices_on_restart(snode):
|
|
|
700
701
|
logger.error(f"Failed to create {jm_bdev}")
|
|
701
702
|
return False
|
|
702
703
|
|
|
703
|
-
alceml_id = jm_device.uuid
|
|
704
704
|
# add pass through
|
|
705
705
|
pt_name = f"{jm_bdev}_PT"
|
|
706
706
|
ret = rpc_client.bdev_PT_NoExcl_create(pt_name, jm_bdev)
|
|
@@ -708,9 +708,9 @@ def _prepare_cluster_devices_on_restart(snode):
|
|
|
708
708
|
logger.error(f"Failed to create pt noexcl bdev: {pt_name}")
|
|
709
709
|
return False
|
|
710
710
|
|
|
711
|
-
subsystem_nqn = snode.subsystem + ":dev:" +
|
|
711
|
+
subsystem_nqn = snode.subsystem + ":dev:" + jm_bdev
|
|
712
712
|
logger.info("creating subsystem %s", subsystem_nqn)
|
|
713
|
-
ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn',
|
|
713
|
+
ret = rpc_client.subsystem_create(subsystem_nqn, 'sbcli-cn', jm_bdev)
|
|
714
714
|
IP = None
|
|
715
715
|
for iface in snode.data_nics:
|
|
716
716
|
if iface.ip4_address:
|
|
@@ -733,7 +733,6 @@ def _prepare_cluster_devices_on_restart(snode):
|
|
|
733
733
|
logger.error(f"Failed to add: {pt_name} to the subsystem: {subsystem_nqn}")
|
|
734
734
|
return False
|
|
735
735
|
|
|
736
|
-
|
|
737
736
|
return True
|
|
738
737
|
|
|
739
738
|
|
|
@@ -750,26 +749,67 @@ def _connect_to_remote_devs(this_node):
|
|
|
750
749
|
for node_index, node in enumerate(snodes):
|
|
751
750
|
if node.get_id() == this_node.get_id() or node.status != StorageNode.STATUS_ONLINE:
|
|
752
751
|
continue
|
|
752
|
+
logger.info(f"Connecting to node {node.get_id()}")
|
|
753
753
|
for index, dev in enumerate(node.nvme_devices):
|
|
754
754
|
if dev.status != NVMeDevice.STATUS_ONLINE:
|
|
755
755
|
logger.debug(f"Device is not online: {dev.get_id()}, status: {dev.status}")
|
|
756
756
|
continue
|
|
757
|
+
|
|
757
758
|
name = f"remote_{dev.alceml_bdev}"
|
|
758
|
-
|
|
759
|
-
ret = rpc_client.
|
|
760
|
-
if
|
|
761
|
-
logger.
|
|
762
|
-
|
|
763
|
-
|
|
759
|
+
bdev_name = f"{name}n1"
|
|
760
|
+
ret = rpc_client.get_bdevs(bdev_name)
|
|
761
|
+
if ret:
|
|
762
|
+
logger.info(f"bdev found {bdev_name}")
|
|
763
|
+
else:
|
|
764
|
+
ret = rpc_client.bdev_nvme_attach_controller_tcp(name, dev.nvmf_nqn, dev.nvmf_ip, dev.nvmf_port)
|
|
765
|
+
if not ret:
|
|
766
|
+
logger.error(f"Failed to connect to device: {dev.get_id()}")
|
|
767
|
+
continue
|
|
768
|
+
dev.remote_bdev = bdev_name
|
|
764
769
|
remote_devices.append(dev)
|
|
765
770
|
return remote_devices
|
|
766
771
|
|
|
767
772
|
|
|
773
|
+
def _connect_to_remote_jm_devs(this_node):
|
|
774
|
+
db_controller = DBController()
|
|
775
|
+
|
|
776
|
+
rpc_client = RPCClient(
|
|
777
|
+
this_node.mgmt_ip, this_node.rpc_port,
|
|
778
|
+
this_node.rpc_username, this_node.rpc_password)
|
|
779
|
+
|
|
780
|
+
remote_devices = []
|
|
781
|
+
# connect to remote devs
|
|
782
|
+
snodes = db_controller.get_storage_nodes_by_cluster_id(this_node.cluster_id)
|
|
783
|
+
for node_index, node in enumerate(snodes):
|
|
784
|
+
if node.get_id() == this_node.get_id() or node.status != StorageNode.STATUS_ONLINE:
|
|
785
|
+
continue
|
|
786
|
+
|
|
787
|
+
logger.info(f"Connecting to node {node.get_id()}")
|
|
788
|
+
if node.jm_device:
|
|
789
|
+
name = f"remote_{node.jm_device.jm_bdev}"
|
|
790
|
+
bdev_name = f"{name}n1"
|
|
791
|
+
ret = rpc_client.get_bdevs(bdev_name)
|
|
792
|
+
if ret:
|
|
793
|
+
logger.info(f"bdev found {bdev_name}")
|
|
794
|
+
else:
|
|
795
|
+
logger.info(f"Connecting {this_node.get_id()} to {name}")
|
|
796
|
+
ret = rpc_client.bdev_nvme_attach_controller_tcp(
|
|
797
|
+
name, node.jm_device.nvmf_nqn, node.jm_device.nvmf_ip, node.jm_device.nvmf_port)
|
|
798
|
+
if not ret:
|
|
799
|
+
logger.error(f"failed to connect to remote JM {node.jm_device.jm_bdev}")
|
|
800
|
+
continue
|
|
801
|
+
|
|
802
|
+
node.jm_device.remote_bdev = bdev_name
|
|
803
|
+
remote_devices.append(node.jm_device)
|
|
804
|
+
|
|
805
|
+
return remote_devices
|
|
806
|
+
|
|
807
|
+
|
|
768
808
|
def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
769
809
|
max_lvol, max_snap, max_prov, spdk_image=None, spdk_debug=False,
|
|
770
810
|
small_bufsize=0, large_bufsize=0, spdk_cpu_mask=None,
|
|
771
811
|
num_partitions_per_dev=0, jm_percent=0, number_of_devices=0, enable_test_device=False,
|
|
772
|
-
namespace=None, number_of_distribs=2):
|
|
812
|
+
namespace=None, number_of_distribs=2, enable_ha_jm=False):
|
|
773
813
|
|
|
774
814
|
db_controller = DBController()
|
|
775
815
|
kv_store = db_controller.kv_store
|
|
@@ -913,7 +953,9 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
|
913
953
|
logger.error(f"Failed to Join docker swarm: {err}")
|
|
914
954
|
return False
|
|
915
955
|
|
|
916
|
-
rpc_user, rpc_pass = utils.generate_rpc_user_and_pass()
|
|
956
|
+
#rpc_user, rpc_pass = utils.generate_rpc_user_and_pass()
|
|
957
|
+
rpc_user = "rpc_username"
|
|
958
|
+
rpc_pass = "rpc_password"
|
|
917
959
|
mgmt_ip = node_info['network_interface'][iface_name]['ip']
|
|
918
960
|
|
|
919
961
|
logger.info("Deploying SPDK")
|
|
@@ -971,6 +1013,9 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
|
971
1013
|
snode.host_secret = utils.generate_string(20)
|
|
972
1014
|
snode.ctrl_secret = utils.generate_string(20)
|
|
973
1015
|
snode.number_of_distribs = number_of_distribs
|
|
1016
|
+
snode.enable_ha_jm = enable_ha_jm
|
|
1017
|
+
if enable_ha_jm:
|
|
1018
|
+
spdk_image = constants.SIMPLY_BLOCK_SPDK_ULTRA_IMAGE_JM
|
|
974
1019
|
|
|
975
1020
|
if 'cpu_count' in node_info:
|
|
976
1021
|
snode.cpu = node_info['cpu_count']
|
|
@@ -1091,6 +1136,10 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
|
1091
1136
|
remote_devices = _connect_to_remote_devs(snode)
|
|
1092
1137
|
snode.remote_devices = remote_devices
|
|
1093
1138
|
|
|
1139
|
+
if snode.enable_ha_jm:
|
|
1140
|
+
logger.info("Connecting to remote JMs")
|
|
1141
|
+
snode.remote_jm_devices = _connect_to_remote_jm_devs(snode)
|
|
1142
|
+
|
|
1094
1143
|
logger.info("Setting node status to Active")
|
|
1095
1144
|
snode.status = StorageNode.STATUS_ONLINE
|
|
1096
1145
|
snode.write_to_db(kv_store)
|
|
@@ -1103,7 +1152,6 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
|
1103
1152
|
continue
|
|
1104
1153
|
logger.info(f"Connecting to node: {node.get_id()}")
|
|
1105
1154
|
rpc_client = RPCClient(node.mgmt_ip, node.rpc_port, node.rpc_username, node.rpc_password)
|
|
1106
|
-
count = 0
|
|
1107
1155
|
for dev in snode.nvme_devices:
|
|
1108
1156
|
if dev.status != NVMeDevice.STATUS_ONLINE:
|
|
1109
1157
|
logger.debug(f"Device is not online: {dev.get_id()}, status: {dev.status}")
|
|
@@ -1124,9 +1172,11 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
|
1124
1172
|
node.remote_devices[idx] = dev
|
|
1125
1173
|
else:
|
|
1126
1174
|
node.remote_devices.append(dev)
|
|
1127
|
-
|
|
1175
|
+
|
|
1176
|
+
if node.enable_ha_jm:
|
|
1177
|
+
node.remote_jm_devices = _connect_to_remote_jm_devs(node)
|
|
1128
1178
|
node.write_to_db(kv_store)
|
|
1129
|
-
logger.info(f"connected to devices count: {
|
|
1179
|
+
logger.info(f"connected to devices count: {len(node.remote_devices)}")
|
|
1130
1180
|
time.sleep(3)
|
|
1131
1181
|
|
|
1132
1182
|
if cluster.status == cluster.STATUS_UNREADY:
|
|
@@ -1149,10 +1199,11 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
|
1149
1199
|
distr_controller.send_dev_status_event(dev, NVMeDevice.STATUS_ONLINE)
|
|
1150
1200
|
tasks_controller.add_new_device_mig_task(dev.get_id())
|
|
1151
1201
|
|
|
1202
|
+
nodes = db_controller.get_storage_nodes_by_cluster_id(cluster_id)
|
|
1152
1203
|
# Create distribs
|
|
1153
1204
|
max_size = cluster.cluster_max_size
|
|
1154
1205
|
ret = create_lvstore(snode, cluster.distr_ndcs, cluster.distr_npcs, cluster.distr_bs,
|
|
1155
|
-
cluster.distr_chunk_bs, cluster.page_size_in_blocks, max_size)
|
|
1206
|
+
cluster.distr_chunk_bs, cluster.page_size_in_blocks, max_size, nodes)
|
|
1156
1207
|
if not ret:
|
|
1157
1208
|
return False, "Failed to create distribs on node"
|
|
1158
1209
|
|
|
@@ -1577,68 +1628,46 @@ def restart_storage_node(
|
|
|
1577
1628
|
logger.error("Failed to prepare cluster devices")
|
|
1578
1629
|
# return False
|
|
1579
1630
|
|
|
1631
|
+
snode.write_to_db(kv_store)
|
|
1632
|
+
|
|
1580
1633
|
logger.info("Connecting to remote devices")
|
|
1581
1634
|
remote_devices = _connect_to_remote_devs(snode)
|
|
1582
1635
|
snode = db_controller.get_storage_node_by_id(node_id)
|
|
1583
1636
|
snode.remote_devices = remote_devices
|
|
1584
1637
|
snode.write_to_db(db_controller.kv_store)
|
|
1585
1638
|
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
for node_index, node in enumerate(snodes):
|
|
1590
|
-
if node.get_id() == snode.get_id() or node.status != StorageNode.STATUS_ONLINE:
|
|
1591
|
-
continue
|
|
1592
|
-
logger.info(f"Connecting to node: {node.get_id()}")
|
|
1593
|
-
rpc_client = RPCClient(node.mgmt_ip, node.rpc_port, node.rpc_username, node.rpc_password)
|
|
1594
|
-
count = 0
|
|
1595
|
-
for dev in snode.nvme_devices:
|
|
1596
|
-
if dev.status != 'online':
|
|
1597
|
-
continue
|
|
1598
|
-
name = f"remote_{dev.alceml_bdev}"
|
|
1599
|
-
ret = rpc_client.bdev_nvme_controller_list(name)
|
|
1600
|
-
if ret:
|
|
1601
|
-
logger.debug(f"controller found, removing")
|
|
1602
|
-
rpc_client.bdev_nvme_detach_controller(name)
|
|
1603
|
-
time.sleep(1)
|
|
1604
|
-
ret = rpc_client.bdev_nvme_attach_controller_tcp(name, dev.nvmf_nqn, dev.nvmf_ip, dev.nvmf_port)
|
|
1605
|
-
if not ret:
|
|
1606
|
-
logger.warning(f"Failed to connect to device: {name}")
|
|
1607
|
-
return False
|
|
1608
|
-
|
|
1609
|
-
dev.remote_bdev = f"{name}n1"
|
|
1610
|
-
idx = -1
|
|
1611
|
-
for i, d in enumerate(node.remote_devices):
|
|
1612
|
-
if d.get_id() == dev.get_id():
|
|
1613
|
-
idx = i
|
|
1614
|
-
break
|
|
1615
|
-
if idx >= 0:
|
|
1616
|
-
node.remote_devices[idx] = dev
|
|
1617
|
-
else:
|
|
1618
|
-
node.remote_devices.append(dev)
|
|
1619
|
-
count += 1
|
|
1620
|
-
node.write_to_db(kv_store)
|
|
1621
|
-
logger.info(f"connected to devices count: {count}")
|
|
1622
|
-
time.sleep(3)
|
|
1639
|
+
if snode.enable_ha_jm:
|
|
1640
|
+
logger.info("Connecting to remote JMs")
|
|
1641
|
+
snode.remote_jm_devices = _connect_to_remote_jm_devs(snode)
|
|
1623
1642
|
|
|
1624
1643
|
logger.info("Setting node status to Online")
|
|
1625
|
-
snode = db_controller.get_storage_node_by_id(node_id)
|
|
1626
1644
|
old_status = snode.status
|
|
1627
1645
|
snode.status = StorageNode.STATUS_ONLINE
|
|
1628
1646
|
snode.write_to_db(kv_store)
|
|
1629
1647
|
storage_events.snode_status_change(snode, snode.status, old_status)
|
|
1630
1648
|
|
|
1631
|
-
logger.info("Sending node event update")
|
|
1632
|
-
distr_controller.send_node_status_event(snode, StorageNode.STATUS_ONLINE)
|
|
1633
1649
|
|
|
1634
|
-
|
|
1650
|
+
# make other nodes connect to the new devices
|
|
1651
|
+
logger.info("Make other nodes connect to the node devices")
|
|
1652
|
+
snodes = db_controller.get_storage_nodes_by_cluster_id(snode.cluster_id)
|
|
1653
|
+
for node in snodes:
|
|
1654
|
+
if node.get_id() == snode.get_id() or node.status != StorageNode.STATUS_ONLINE:
|
|
1655
|
+
continue
|
|
1656
|
+
node.remote_devices = _connect_to_remote_devs(node)
|
|
1657
|
+
if node.enable_ha_jm:
|
|
1658
|
+
node.remote_jm_devices = _connect_to_remote_jm_devs(node)
|
|
1659
|
+
node.write_to_db(kv_store)
|
|
1660
|
+
|
|
1661
|
+
logger.info(f"Sending cluster map to node {node.get_id()}")
|
|
1662
|
+
distr_controller.send_cluster_map_to_node(node)
|
|
1663
|
+
|
|
1635
1664
|
logger.info("Starting migration tasks")
|
|
1636
1665
|
for dev in snode.nvme_devices:
|
|
1637
1666
|
if dev.status != NVMeDevice.STATUS_ONLINE:
|
|
1638
1667
|
logger.info(f"Device is not online: {dev.get_id()}, status: {dev.status}")
|
|
1639
1668
|
continue
|
|
1640
1669
|
|
|
1641
|
-
distr_controller.send_dev_status_event(dev, NVMeDevice.STATUS_ONLINE)
|
|
1670
|
+
# distr_controller.send_dev_status_event(dev, NVMeDevice.STATUS_ONLINE)
|
|
1642
1671
|
tasks_controller.add_device_mig_task(dev.get_id())
|
|
1643
1672
|
|
|
1644
1673
|
# Create distribs, raid0, and lvstore and expose lvols to the fabrics
|
|
@@ -1655,15 +1684,6 @@ def restart_storage_node(
|
|
|
1655
1684
|
ret = temp_rpc_client.bdev_wait_for_examine()
|
|
1656
1685
|
time.sleep(1)
|
|
1657
1686
|
|
|
1658
|
-
#logger.info("Sending cluster map to current node")
|
|
1659
|
-
#ret = distr_controller.send_cluster_map_to_node(snode)
|
|
1660
|
-
#if not ret:
|
|
1661
|
-
# return False, "Failed to send cluster map"
|
|
1662
|
-
#time.sleep(3)
|
|
1663
|
-
|
|
1664
|
-
# temp_rpc_client.bdev_examine(snode.raid)
|
|
1665
|
-
# time.sleep(3)
|
|
1666
|
-
|
|
1667
1687
|
if snode.lvols:
|
|
1668
1688
|
for lvol_id in snode.lvols:
|
|
1669
1689
|
lvol = lvol_controller.recreate_lvol(lvol_id, snode)
|
|
@@ -1765,6 +1785,18 @@ def list_storage_devices(kv_store, node_id, sort, is_json):
|
|
|
1765
1785
|
"Serial Number": device.serial_number,
|
|
1766
1786
|
"Node ID": device.node_id,
|
|
1767
1787
|
})
|
|
1788
|
+
|
|
1789
|
+
for device in snode.remote_jm_devices:
|
|
1790
|
+
logger.debug(device)
|
|
1791
|
+
logger.debug("*" * 20)
|
|
1792
|
+
remote_devices.append({
|
|
1793
|
+
"UUID": device.uuid,
|
|
1794
|
+
"Name": device.remote_bdev,
|
|
1795
|
+
"Size": utils.humanbytes(device.size),
|
|
1796
|
+
"Serial Number": "",
|
|
1797
|
+
"Node ID": "",
|
|
1798
|
+
})
|
|
1799
|
+
|
|
1768
1800
|
if sort and sort in ['node-seq', 'dev-seq', 'serial']:
|
|
1769
1801
|
if sort == 'serial':
|
|
1770
1802
|
sort_key = "Serial Number"
|
|
@@ -2497,7 +2529,10 @@ def set_node_status(node_id, status):
|
|
|
2497
2529
|
|
|
2498
2530
|
if snode.status == StorageNode.STATUS_ONLINE:
|
|
2499
2531
|
logger.info("Connecting to remote devices")
|
|
2500
|
-
_connect_to_remote_devs(snode)
|
|
2532
|
+
snode.remote_devices = _connect_to_remote_devs(snode)
|
|
2533
|
+
if snode.enable_ha_jm:
|
|
2534
|
+
snode.remote_jm_devices = _connect_to_remote_jm_devs(snode)
|
|
2535
|
+
snode.write_to_db(db_controller.kv_store)
|
|
2501
2536
|
|
|
2502
2537
|
return True
|
|
2503
2538
|
|
|
@@ -2511,7 +2546,7 @@ def recreate_lvstore(snode):
|
|
|
2511
2546
|
return True
|
|
2512
2547
|
|
|
2513
2548
|
|
|
2514
|
-
def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blocks, max_size):
|
|
2549
|
+
def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blocks, max_size, nodes):
|
|
2515
2550
|
lvstore_stack = []
|
|
2516
2551
|
distrib_list = []
|
|
2517
2552
|
size = max_size // snode.number_of_distribs
|
|
@@ -2519,6 +2554,15 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
|
|
|
2519
2554
|
cluster_sz = ndcs * page_size_in_blocks
|
|
2520
2555
|
strip_size_kb = int((ndcs + npcs) * 64)
|
|
2521
2556
|
strip_size_kb = utils.nearest_upper_power_of_2(strip_size_kb)
|
|
2557
|
+
if snode.enable_ha_jm:
|
|
2558
|
+
if len(nodes) > 3:
|
|
2559
|
+
nodes = nodes[:3]
|
|
2560
|
+
jm_names = lvol_controller.get_ha_jm_names(snode, nodes)
|
|
2561
|
+
else:
|
|
2562
|
+
jm_names = lvol_controller.get_jm_names(snode)
|
|
2563
|
+
|
|
2564
|
+
jm_vuid = utils.get_random_vuid()
|
|
2565
|
+
|
|
2522
2566
|
for _ in range(snode.number_of_distribs):
|
|
2523
2567
|
distrib_vuid = utils.get_random_vuid()
|
|
2524
2568
|
distrib_name = f"distrib_{distrib_vuid}"
|
|
@@ -2530,6 +2574,8 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
|
|
|
2530
2574
|
"name": distrib_name,
|
|
2531
2575
|
"params": {
|
|
2532
2576
|
"name": distrib_name,
|
|
2577
|
+
"jm_names": jm_names,
|
|
2578
|
+
"jm_vuid": jm_vuid,
|
|
2533
2579
|
"vuid": distrib_vuid,
|
|
2534
2580
|
"ndcs": ndcs,
|
|
2535
2581
|
"npcs": npcs,
|
|
@@ -2548,11 +2594,12 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
|
|
|
2548
2594
|
{
|
|
2549
2595
|
"type": "bdev_raid",
|
|
2550
2596
|
"name": raid_device,
|
|
2551
|
-
"params":
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2597
|
+
"params": {
|
|
2598
|
+
"name": raid_device,
|
|
2599
|
+
"raid_level": "0",
|
|
2600
|
+
"base_bdevs": distrib_list,
|
|
2601
|
+
"strip_size_kb": strip_size_kb
|
|
2602
|
+
},
|
|
2556
2603
|
"distribs_list": distrib_list
|
|
2557
2604
|
},
|
|
2558
2605
|
{
|
|
@@ -2602,7 +2649,6 @@ def _create_bdev_stack(snode, lvstore_stack=None):
|
|
|
2602
2649
|
params = bdev['params']
|
|
2603
2650
|
|
|
2604
2651
|
if type == "bdev_distr":
|
|
2605
|
-
params['jm_names'] = lvol_controller.get_jm_names(snode)
|
|
2606
2652
|
if snode.distrib_cpu_cores:
|
|
2607
2653
|
distrib_cpu_mask = utils.decimal_to_hex_power_of_2(snode.distrib_cpu_cores[snode.distrib_cpu_index])
|
|
2608
2654
|
params['distrib_cpu_mask'] = distrib_cpu_mask
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/controllers/caching_node_controller.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2
RENAMED
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/clean_local_storage_deploy.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/dashboards/node-exporter.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/cached_lvol_stat_collector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/capacity_and_stats_collector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/main_distr_event_collector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_failed_migration.py
RENAMED
|
File without changes
|
|
File without changes
|
{sbcli_dev-3.8.36 → sbcli_dev-3.8.37}/simplyblock_core/services/tasks_runner_new_dev_migration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|