sbcli-dev 17.3.4__tar.gz → 17.3.6__tar.gz
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-17.3.4 → sbcli_dev-17.3.6}/PKG-INFO +1 -1
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/PKG-INFO +1 -1
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/SOURCES.txt +1 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/lvol_controller.py +1 -9
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/snapshot_controller.py +1 -1
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/env_var +1 -1
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/base_model.py +5 -2
- sbcli_dev-17.3.6/simplyblock_core/models/hublvol.py +12 -0
- sbcli_dev-17.3.6/simplyblock_core/models/storage_node.py +211 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/rpc_client.py +33 -17
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/storage_node_ops.py +97 -54
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/utils.py +12 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_snapshot.py +4 -1
- sbcli_dev-17.3.4/simplyblock_core/models/storage_node.py +0 -92
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/README.md +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/pyproject.toml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/requirements.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/dependency_links.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/entry_points.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/requires.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/sbcli_dev.egg-info/top_level.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/setup.cfg +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/setup.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_cli/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_cli/cli.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_cli/clibase.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_cli/main.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/cluster_ops.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/cnode_client.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/constants.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/caching_node_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/cluster_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/device_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/device_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/events_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/health_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/lvol_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/mgmt_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/pool_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/pool_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/snapshot_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/storage_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/tasks_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/tasks_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/db_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/distr_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/mgmt_node_ops.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/caching_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/cluster.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/deployer.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/iface.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/job_schedule.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/lvol_model.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/mgmt_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/nvme_device.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/pool.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/port_stat.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/snapshot.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/models/stats.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/pci_utils.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/config_docker.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboard.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/devices.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/dashboards/pools.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/datasource.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/db_config_double.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/db_config_single.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/deploy_stack.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/foundation.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/haproxy.cfg +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/install_deps.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/objstore.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/prometheus.yml.j2 +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/run_ssh.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/set_db_config.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/caching_node_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/cap_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/device_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/health_check_service.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/install_service.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/lvol_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/lvol_stat_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/main_distr_event_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/new_device_discovery.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/remove_service.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/service_template.service +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/spdk/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/spdk/client.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/spdk_stats_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/storage_node_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_migration.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/services/tasks_runner_restart.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/shell_utils.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/snode_client.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/test/test_utils.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/README.md +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/app.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/auth_middleware.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/node_api_basic.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/snode_ops.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_device.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_metrics.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_pool.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/node_utils.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/node_utils_k8s.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/node_webapp.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/requirements.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/delete.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/deploy.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/deploy_cnode.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/deploy_spdk.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/is_up.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/list_deps.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/rpac.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/swagger.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/static/tst.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.6}/simplyblock_web/utils.py +0 -0
|
@@ -50,6 +50,7 @@ simplyblock_core/models/caching_node.py
|
|
|
50
50
|
simplyblock_core/models/cluster.py
|
|
51
51
|
simplyblock_core/models/deployer.py
|
|
52
52
|
simplyblock_core/models/events.py
|
|
53
|
+
simplyblock_core/models/hublvol.py
|
|
53
54
|
simplyblock_core/models/iface.py
|
|
54
55
|
simplyblock_core/models/job_schedule.py
|
|
55
56
|
simplyblock_core/models/lvol_model.py
|
|
@@ -23,14 +23,6 @@ from simplyblock_core.snode_client import SNodeClient
|
|
|
23
23
|
logger = lg.getLogger()
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def _generate_hex_string(length):
|
|
27
|
-
def _generate_string(length):
|
|
28
|
-
return ''.join(random.SystemRandom().choice(
|
|
29
|
-
string.ascii_letters + string.digits) for _ in range(length))
|
|
30
|
-
|
|
31
|
-
return _generate_string(length).encode('utf-8').hex()
|
|
32
|
-
|
|
33
|
-
|
|
34
26
|
def _create_crypto_lvol(rpc_client, name, base_name, key1, key2):
|
|
35
27
|
key_name = f'key_{name}'
|
|
36
28
|
ret = rpc_client.lvol_crypto_key_create(key_name, key1, key2)
|
|
@@ -427,7 +419,7 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
|
|
|
427
419
|
lvol.ha_type = ha_type
|
|
428
420
|
lvol.bdev_stack = []
|
|
429
421
|
lvol.uuid = uid or str(uuid.uuid4())
|
|
430
|
-
lvol.guid =
|
|
422
|
+
lvol.guid = utils.generate_hex_string(16)
|
|
431
423
|
lvol.vuid = vuid
|
|
432
424
|
lvol.lvol_bdev = f"LVOL_{vuid}"
|
|
433
425
|
|
|
@@ -439,7 +439,7 @@ def clone(snapshot_id, clone_name, new_size=0):
|
|
|
439
439
|
lvol.pool_uuid = pool.get_id()
|
|
440
440
|
lvol.ha_type = snap.lvol.ha_type
|
|
441
441
|
lvol.lvol_type = 'lvol'
|
|
442
|
-
lvol.guid =
|
|
442
|
+
lvol.guid = utils.generate_hex_string(16)
|
|
443
443
|
lvol.vuid = snap.lvol.vuid
|
|
444
444
|
lvol.snapshot_name = snap.snap_bdev
|
|
445
445
|
lvol.subsys_port = snap.lvol.subsys_port
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# coding=utf-8
|
|
2
2
|
import pprint
|
|
3
|
+
import logging
|
|
3
4
|
|
|
4
5
|
import json
|
|
5
6
|
from inspect import ismethod
|
|
@@ -115,8 +116,10 @@ class BaseModel(object):
|
|
|
115
116
|
for k, v in kv_store.get_range_startswith(prefix.strip().encode('utf-8'), limit=limit, reverse=reverse):
|
|
116
117
|
objects.append(self.__class__().from_dict(json.loads(v)))
|
|
117
118
|
return objects
|
|
118
|
-
except Exception
|
|
119
|
-
|
|
119
|
+
except Exception:
|
|
120
|
+
from simplyblock_core import utils
|
|
121
|
+
logger = utils.get_logger(__name__)
|
|
122
|
+
logger.exception('Error reading from FDB')
|
|
120
123
|
return []
|
|
121
124
|
|
|
122
125
|
def get_last(self, kv_store):
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
|
|
3
|
+
from typing import List
|
|
4
|
+
from uuid import uuid4
|
|
5
|
+
|
|
6
|
+
from simplyblock_core import utils
|
|
7
|
+
from simplyblock_core.models.base_model import BaseNodeObject
|
|
8
|
+
from simplyblock_core.models.hublvol import HubLVol
|
|
9
|
+
from simplyblock_core.models.iface import IFace
|
|
10
|
+
from simplyblock_core.models.nvme_device import NVMeDevice, JMDevice
|
|
11
|
+
from simplyblock_core.rpc_client import RPCClient, RPCException
|
|
12
|
+
|
|
13
|
+
logger = utils.get_logger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class StorageNode(BaseNodeObject):
|
|
17
|
+
|
|
18
|
+
alceml_cpu_cores: List[int] = []
|
|
19
|
+
alceml_cpu_index: int = 0
|
|
20
|
+
alceml_worker_cpu_cores: List[int] = []
|
|
21
|
+
alceml_worker_cpu_index: int = 0
|
|
22
|
+
api_endpoint: str = ""
|
|
23
|
+
app_thread_mask: str = ""
|
|
24
|
+
baseboard_sn: str = ""
|
|
25
|
+
cloud_instance_id: str = ""
|
|
26
|
+
cloud_instance_public_ip: str = ""
|
|
27
|
+
cloud_instance_type: str = ""
|
|
28
|
+
cloud_name: str = ""
|
|
29
|
+
cluster_id: str = ""
|
|
30
|
+
cpu: int = 0
|
|
31
|
+
cpu_hz: int = 0
|
|
32
|
+
ctrl_secret: str = ""
|
|
33
|
+
data_nics: List[IFace] = []
|
|
34
|
+
distrib_cpu_cores: List[int] = []
|
|
35
|
+
distrib_cpu_index: int = 0
|
|
36
|
+
distrib_cpu_mask: str = ""
|
|
37
|
+
enable_ha_jm: bool = False
|
|
38
|
+
ha_jm_count: int = 3
|
|
39
|
+
enable_test_device: bool = False
|
|
40
|
+
health_check: bool = True
|
|
41
|
+
host_nqn: str = ""
|
|
42
|
+
host_secret: str = ""
|
|
43
|
+
hostname: str = ""
|
|
44
|
+
hugepages: int = 0
|
|
45
|
+
ib_devices: List[IFace] = []
|
|
46
|
+
id_device_by_nqn: bool = False
|
|
47
|
+
iobuf_large_bufsize: int = 0
|
|
48
|
+
iobuf_large_pool_count: int = 0
|
|
49
|
+
iobuf_small_bufsize: int = 0
|
|
50
|
+
iobuf_small_pool_count: int = 0
|
|
51
|
+
is_secondary_node: bool = False
|
|
52
|
+
jc_singleton_mask: str = ""
|
|
53
|
+
jm_cpu_mask: str = ""
|
|
54
|
+
jm_device: JMDevice = None
|
|
55
|
+
jm_percent: int = 3
|
|
56
|
+
jm_vuid: int = 0
|
|
57
|
+
lvols: int = 0
|
|
58
|
+
lvstore: str = ""
|
|
59
|
+
lvstore_stack: List[dict] = []
|
|
60
|
+
lvstore_stack_secondary_1: List[dict] = []
|
|
61
|
+
lvstore_stack_secondary_2: List[dict] = []
|
|
62
|
+
lvol_subsys_port: int = 9090
|
|
63
|
+
max_lvol: int = 0
|
|
64
|
+
max_prov: int = 0
|
|
65
|
+
max_snap: int = 0
|
|
66
|
+
memory: int = 0
|
|
67
|
+
mgmt_ip: str = ""
|
|
68
|
+
namespace: str = ""
|
|
69
|
+
node_lvs: str = "lvs"
|
|
70
|
+
num_partitions_per_dev: int = 1
|
|
71
|
+
number_of_devices: int = 0
|
|
72
|
+
number_of_distribs: int = 4
|
|
73
|
+
nvme_devices: List[NVMeDevice] = []
|
|
74
|
+
online_since: str = ""
|
|
75
|
+
partitions_count: int = 0 # Unused
|
|
76
|
+
poller_cpu_cores: List[int] = []
|
|
77
|
+
ssd_pcie: List = []
|
|
78
|
+
pollers_mask: str = ""
|
|
79
|
+
primary_ip: str = ""
|
|
80
|
+
raid: str = ""
|
|
81
|
+
remote_devices: List[NVMeDevice] = []
|
|
82
|
+
remote_jm_devices: List[JMDevice] = []
|
|
83
|
+
rpc_password: str = ""
|
|
84
|
+
rpc_port: int = -1
|
|
85
|
+
rpc_username: str = ""
|
|
86
|
+
secondary_node_id: str = ""
|
|
87
|
+
sequential_number: int = 0 # Unused
|
|
88
|
+
jm_ids: List[str] = []
|
|
89
|
+
spdk_cpu_mask: str = ""
|
|
90
|
+
spdk_debug: bool = False
|
|
91
|
+
spdk_image: str = ""
|
|
92
|
+
spdk_mem: int = 0
|
|
93
|
+
partition_size: int = 0
|
|
94
|
+
subsystem: str = ""
|
|
95
|
+
system_uuid: str = ""
|
|
96
|
+
lvstore_status: str = ""
|
|
97
|
+
nvmf_port: int = 4420
|
|
98
|
+
physical_label: int = 0
|
|
99
|
+
hublvol: HubLVol = None
|
|
100
|
+
|
|
101
|
+
def rpc_client(self, **kwargs):
|
|
102
|
+
"""Return rpc client to this node
|
|
103
|
+
"""
|
|
104
|
+
return RPCClient(
|
|
105
|
+
self.mgmt_ip, self.rpc_port,
|
|
106
|
+
self.rpc_username, self.rpc_password, **kwargs)
|
|
107
|
+
|
|
108
|
+
def expose_bdev(self, nqn, bdev_name, model_number, uuid, nguid, port):
|
|
109
|
+
rpc_client = self.rpc_client()
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
if not rpc_client.subsystem_create(
|
|
113
|
+
nqn=nqn,
|
|
114
|
+
serial_number='sbcli-cn',
|
|
115
|
+
model_number=model_number,
|
|
116
|
+
):
|
|
117
|
+
raise RPCException(f'Failed to create subsystem for {nqn}')
|
|
118
|
+
|
|
119
|
+
for ip in (iface.ip4_address for iface in self.data_nics):
|
|
120
|
+
if not rpc_client.listeners_create(
|
|
121
|
+
nqn=nqn,
|
|
122
|
+
trtype='TCP',
|
|
123
|
+
traddr=ip,
|
|
124
|
+
trsvcid=port,
|
|
125
|
+
):
|
|
126
|
+
raise RPCException(f'Failed to create listener for {nqn}')
|
|
127
|
+
|
|
128
|
+
if not rpc_client.nvmf_subsystem_add_ns(
|
|
129
|
+
nqn=nqn,
|
|
130
|
+
dev_name=bdev_name,
|
|
131
|
+
uuid=uuid,
|
|
132
|
+
nguid=nguid,
|
|
133
|
+
):
|
|
134
|
+
raise RPCException(f'Failed to add namespace to subsytem {nqn}')
|
|
135
|
+
except RPCException:
|
|
136
|
+
if self.hublvol and rpc_client.subsystem_list(self.hublvol.nqn):
|
|
137
|
+
rpc_client.subsystem_delete(self.hublvol.nqn)
|
|
138
|
+
|
|
139
|
+
raise
|
|
140
|
+
|
|
141
|
+
def create_hublvol(self, cluster_nqn):
|
|
142
|
+
"""Create a hublvol for this node's lvstore
|
|
143
|
+
"""
|
|
144
|
+
logger.info(f'Creating hublvol on {self.get_id()}')
|
|
145
|
+
rpc_client = self.rpc_client()
|
|
146
|
+
|
|
147
|
+
hublvol_uuid = None
|
|
148
|
+
try:
|
|
149
|
+
hublvol_uuid = rpc_client.bdev_lvol_create_hublvol(self.lvstore)
|
|
150
|
+
if not hublvol_uuid:
|
|
151
|
+
raise RPCException('Failed to create hublvol')
|
|
152
|
+
self.hublvol = HubLVol({
|
|
153
|
+
'uuid': hublvol_uuid,
|
|
154
|
+
'nqn': f'{cluster_nqn}:lvol:{hublvol_uuid}',
|
|
155
|
+
'name': f'{self.lvstore}/hublvol',
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
self.expose_bdev(
|
|
159
|
+
nqn=self.hublvol.nqn,
|
|
160
|
+
bdev_name=self.hublvol.name,
|
|
161
|
+
model_number=str(uuid4()),
|
|
162
|
+
uuid=self.hublvol.uuid,
|
|
163
|
+
nguid=utils.generate_hex_string(16),
|
|
164
|
+
port=self.hublvol.nvmf_port
|
|
165
|
+
)
|
|
166
|
+
except RPCException:
|
|
167
|
+
if hublvol_uuid is not None and rpc_client.get_bdevs(hublvol_uuid):
|
|
168
|
+
rpc_client.bdev_lvol_delete_hublvol(self.hublvol.nqn)
|
|
169
|
+
|
|
170
|
+
if self.hublvol and rpc_client.subsystem_list(self.hublvol.nqn):
|
|
171
|
+
rpc_client.subsystem_delete(self.hublvol.nqn)
|
|
172
|
+
self.hublvol = None
|
|
173
|
+
|
|
174
|
+
raise
|
|
175
|
+
|
|
176
|
+
self.write_to_db()
|
|
177
|
+
return self.hublvol
|
|
178
|
+
|
|
179
|
+
def connect_to_hublvol(self, primary_node):
|
|
180
|
+
"""Connect to a primary node's hublvol
|
|
181
|
+
"""
|
|
182
|
+
logger.info(f'Connecting node {self.get_id()} to hublvol on {primary_node.get_id()}')
|
|
183
|
+
|
|
184
|
+
if primary_node.hublvol is None:
|
|
185
|
+
raise ValueError(f"HubLVol of primary node {primary_node.get_id()} is not present")
|
|
186
|
+
|
|
187
|
+
rpc_client = self.rpc_client()
|
|
188
|
+
|
|
189
|
+
remote_bdev = None
|
|
190
|
+
for ip in (iface.ip4_address for iface in primary_node.data_nics):
|
|
191
|
+
remote_bdev = rpc_client.bdev_nvme_attach_controller_tcp(
|
|
192
|
+
primary_node.hublvol.name, primary_node.hublvol.nqn,
|
|
193
|
+
ip, primary_node.hublvol.nvmf_port)[0]
|
|
194
|
+
if remote_bdev is not None:
|
|
195
|
+
break
|
|
196
|
+
else:
|
|
197
|
+
logger.warning(f'Failed to connect to hublvol on {ip}')
|
|
198
|
+
|
|
199
|
+
if remote_bdev is None:
|
|
200
|
+
raise RPCException('Failed to connect to hublvol')
|
|
201
|
+
|
|
202
|
+
if not rpc_client.bdev_lvol_set_lvs_opts(
|
|
203
|
+
primary_node.lvstore,
|
|
204
|
+
groupid=primary_node.jm_vuid,
|
|
205
|
+
subsystem_port=self.lvol_subsys_port,
|
|
206
|
+
secondary=True,
|
|
207
|
+
):
|
|
208
|
+
raise RPCException('Failed to set secondary lvstore options')
|
|
209
|
+
|
|
210
|
+
if not rpc_client.bdev_lvol_connect_hublvol(primary_node.lvstore, remote_bdev):
|
|
211
|
+
raise RPCException('Failed to connect secondary lvstore to primary')
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import inspect
|
|
2
3
|
|
|
3
4
|
import requests
|
|
4
5
|
|
|
@@ -913,18 +914,12 @@ class RPCClient:
|
|
|
913
914
|
params = {"jm_vuid": jm_vuid}
|
|
914
915
|
return self._request("bdev_distrib_force_to_non_leader", params)
|
|
915
916
|
|
|
916
|
-
def bdev_lvol_set_leader(self,
|
|
917
|
-
|
|
918
|
-
"
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
elif lvs_name:
|
|
923
|
-
params["lvs_name"] = lvs_name
|
|
924
|
-
|
|
925
|
-
params["bs_nonleadership"] = bs_nonleadership
|
|
926
|
-
|
|
927
|
-
return self._request("bdev_lvol_set_leader_all", params)
|
|
917
|
+
def bdev_lvol_set_leader(self, lvs, *, leader=False, bs_nonleadership=False):
|
|
918
|
+
return self._request("bdev_lvol_set_leader_all", {
|
|
919
|
+
"uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
|
|
920
|
+
"lvs_leadership": leader,
|
|
921
|
+
"bs_nonleadership": bs_nonleadership,
|
|
922
|
+
})
|
|
928
923
|
|
|
929
924
|
def bdev_lvol_register(self, name, lvs_name, registered_uuid, blobid, priority_class=0):
|
|
930
925
|
params = {
|
|
@@ -982,13 +977,19 @@ class RPCClient:
|
|
|
982
977
|
}
|
|
983
978
|
return self._request("nvmf_set_max_subsystems", params)
|
|
984
979
|
|
|
985
|
-
def
|
|
986
|
-
|
|
980
|
+
def bdev_lvol_set_lvs_opts(self, lvs, *, groupid, subsystem_port=9090, primary=False, secondary=False):
|
|
981
|
+
"""Set lvstore options
|
|
982
|
+
|
|
983
|
+
`lvs` must be either an ID or the lvstore name.
|
|
984
|
+
"""
|
|
985
|
+
|
|
986
|
+
return self._request(inspect.currentframe().f_code.co_name, {
|
|
987
|
+
"uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
|
|
987
988
|
"groupid": groupid,
|
|
988
|
-
"lvs_name": lvs_name,
|
|
989
989
|
"subsystem_port": subsystem_port,
|
|
990
|
-
|
|
991
|
-
|
|
990
|
+
"primary": primary,
|
|
991
|
+
"secondary": secondary,
|
|
992
|
+
})
|
|
992
993
|
|
|
993
994
|
def bdev_lvol_get_lvol_delete_status(self, name):
|
|
994
995
|
"""
|
|
@@ -1010,3 +1011,18 @@ class RPCClient:
|
|
|
1010
1011
|
}
|
|
1011
1012
|
return self._request("bdev_lvol_set_lvs_read_only", params)
|
|
1012
1013
|
|
|
1014
|
+
def bdev_lvol_create_hublvol(self, lvs):
|
|
1015
|
+
return self._request(inspect.currentframe().f_code.co_name, {
|
|
1016
|
+
"uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
|
|
1017
|
+
})
|
|
1018
|
+
|
|
1019
|
+
def bdev_lvol_delete_hublvol(self, lvs):
|
|
1020
|
+
return self._request(inspect.currentframe().f_code.co_name, {
|
|
1021
|
+
"uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
|
|
1022
|
+
})
|
|
1023
|
+
|
|
1024
|
+
def bdev_lvol_connect_hublvol(self, lvs, bdev):
|
|
1025
|
+
return self._request(inspect.currentframe().f_code.co_name, {
|
|
1026
|
+
"uuid" if utils.UUID_PATTERN.match(lvs) else "lvs_name": lvs,
|
|
1027
|
+
"remote_bdev": bdev,
|
|
1028
|
+
})
|
|
@@ -25,7 +25,7 @@ from simplyblock_core.models.lvol_model import LVol
|
|
|
25
25
|
from simplyblock_core.models.nvme_device import NVMeDevice, JMDevice
|
|
26
26
|
from simplyblock_core.models.storage_node import StorageNode
|
|
27
27
|
from simplyblock_core.models.cluster import Cluster
|
|
28
|
-
from simplyblock_core.rpc_client import RPCClient
|
|
28
|
+
from simplyblock_core.rpc_client import RPCClient, RPCException
|
|
29
29
|
from simplyblock_core.snode_client import SNodeClient
|
|
30
30
|
|
|
31
31
|
logger = utils.get_logger(__name__)
|
|
@@ -2204,7 +2204,7 @@ def suspend_storage_node(node_id, force=False):
|
|
|
2204
2204
|
ret = rpc_client.nvmf_subsystem_listener_set_ana_state(
|
|
2205
2205
|
lvol.nqn, iface.ip4_address, lvol.subsys_port, False, ana="inaccessible")
|
|
2206
2206
|
|
|
2207
|
-
rpc_client.bdev_lvol_set_leader(
|
|
2207
|
+
rpc_client.bdev_lvol_set_leader(node.lvstore, leader=False)
|
|
2208
2208
|
rpc_client.bdev_distrib_force_to_non_leader(node.jm_vuid)
|
|
2209
2209
|
|
|
2210
2210
|
|
|
@@ -2219,7 +2219,7 @@ def suspend_storage_node(node_id, force=False):
|
|
|
2219
2219
|
ret = sec_node_client.nvmf_subsystem_listener_set_ana_state(
|
|
2220
2220
|
lvol.nqn, iface.ip4_address, lvol.subsys_port, False, ana="inaccessible")
|
|
2221
2221
|
time.sleep(1)
|
|
2222
|
-
# sec_node_client.bdev_lvol_set_leader(
|
|
2222
|
+
# sec_node_client.bdev_lvol_set_leader(snode.lvstore, leader=False)
|
|
2223
2223
|
# sec_node_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
|
|
2224
2224
|
|
|
2225
2225
|
for lvol in db_controller.get_lvols_by_node_id(snode.get_id()):
|
|
@@ -2229,7 +2229,7 @@ def suspend_storage_node(node_id, force=False):
|
|
|
2229
2229
|
lvol.nqn, iface.ip4_address, lvol.subsys_port, False, ana="inaccessible")
|
|
2230
2230
|
time.sleep(1)
|
|
2231
2231
|
|
|
2232
|
-
rpc_client.bdev_lvol_set_leader(
|
|
2232
|
+
rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=False)
|
|
2233
2233
|
rpc_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
|
|
2234
2234
|
time.sleep(1)
|
|
2235
2235
|
|
|
@@ -2317,7 +2317,7 @@ def resume_storage_node(node_id):
|
|
|
2317
2317
|
ret = sec_node_client.nvmf_subsystem_listener_set_ana_state(
|
|
2318
2318
|
lvol.nqn, iface.ip4_address, lvol.subsys_port, False, ana="inaccessible")
|
|
2319
2319
|
time.sleep(1)
|
|
2320
|
-
sec_node_client.bdev_lvol_set_leader(
|
|
2320
|
+
sec_node_client.bdev_lvol_set_leader(snode.lvstore, leader=False)
|
|
2321
2321
|
sec_node_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
|
|
2322
2322
|
time.sleep(1)
|
|
2323
2323
|
|
|
@@ -2803,71 +2803,76 @@ def set_node_status(node_id, status, reconnect_on_online=True):
|
|
|
2803
2803
|
return True
|
|
2804
2804
|
|
|
2805
2805
|
|
|
2806
|
-
def recreate_lvstore_on_sec(
|
|
2806
|
+
def recreate_lvstore_on_sec(secondary_node):
|
|
2807
2807
|
db_controller = DBController()
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2808
|
+
secondary_rpc_client = RPCClient(
|
|
2809
|
+
secondary_node.mgmt_ip, secondary_node.rpc_port,
|
|
2810
|
+
secondary_node.rpc_username, secondary_node.rpc_password)
|
|
2811
2811
|
|
|
2812
|
-
|
|
2812
|
+
primary_nodes = db_controller.get_primary_storage_nodes_by_secondary_node_id(secondary_node.get_id())
|
|
2813
2813
|
|
|
2814
|
-
for
|
|
2815
|
-
|
|
2816
|
-
|
|
2814
|
+
for primary_node in primary_nodes:
|
|
2815
|
+
primary_rpc_client = RPCClient(
|
|
2816
|
+
primary_node.mgmt_ip, primary_node.rpc_port, primary_node.rpc_username, primary_node.rpc_password)
|
|
2817
2817
|
|
|
2818
|
-
|
|
2819
|
-
|
|
2818
|
+
primary_node.lvstore_status = "in_creation"
|
|
2819
|
+
primary_node.write_to_db()
|
|
2820
2820
|
|
|
2821
2821
|
lvol_list = []
|
|
2822
|
-
for lv in db_controller.get_lvols_by_node_id(
|
|
2822
|
+
for lv in db_controller.get_lvols_by_node_id(primary_node.get_id()):
|
|
2823
2823
|
if lv.status not in [LVol.STATUS_IN_DELETION, LVol.STATUS_IN_CREATION]:
|
|
2824
2824
|
lvol_list.append(lv)
|
|
2825
2825
|
|
|
2826
2826
|
### 1- create distribs and raid
|
|
2827
|
-
ret, err = _create_bdev_stack(
|
|
2827
|
+
ret, err = _create_bdev_stack(secondary_node, primary_node.lvstore_stack, primary_node=primary_node)
|
|
2828
2828
|
if err:
|
|
2829
|
-
logger.error(f"Failed to recreate lvstore on node {
|
|
2829
|
+
logger.error(f"Failed to recreate lvstore on node {secondary_node.get_id()}")
|
|
2830
2830
|
logger.error(err)
|
|
2831
2831
|
return False
|
|
2832
2832
|
|
|
2833
|
-
|
|
2833
|
+
primary_node_api = SNodeClient(primary_node.api_endpoint)
|
|
2834
2834
|
|
|
2835
2835
|
### 2- create lvols nvmf subsystems
|
|
2836
2836
|
for lvol in lvol_list:
|
|
2837
2837
|
logger.info("creating subsystem %s", lvol.nqn)
|
|
2838
|
-
|
|
2838
|
+
secondary_rpc_client.subsystem_create(lvol.nqn, 'sbcli-cn', lvol.uuid, 1000)
|
|
2839
2839
|
|
|
2840
|
-
if
|
|
2840
|
+
if primary_node.status == StorageNode.STATUS_ONLINE:
|
|
2841
2841
|
|
|
2842
2842
|
### 3- block primary port
|
|
2843
|
-
|
|
2844
|
-
tcp_ports_events.port_deny(
|
|
2843
|
+
primary_node_api.firewall_set_port(primary_node.lvol_subsys_port, "tcp", "block")
|
|
2844
|
+
tcp_ports_events.port_deny(primary_node, primary_node.lvol_subsys_port)
|
|
2845
2845
|
|
|
2846
2846
|
### 4- set leadership to false
|
|
2847
|
-
|
|
2848
|
-
|
|
2847
|
+
primary_rpc_client.bdev_lvol_set_leader(primary_node.lvstore, leader=False)
|
|
2848
|
+
primary_rpc_client.bdev_distrib_force_to_non_leader(primary_node.jm_vuid)
|
|
2849
2849
|
# time.sleep(1)
|
|
2850
2850
|
|
|
2851
2851
|
|
|
2852
2852
|
### 5- examine
|
|
2853
|
-
ret =
|
|
2853
|
+
ret = secondary_rpc_client.bdev_examine(primary_node.raid)
|
|
2854
2854
|
|
|
2855
2855
|
### 6- wait for examine
|
|
2856
|
-
ret =
|
|
2857
|
-
|
|
2856
|
+
ret = secondary_rpc_client.bdev_wait_for_examine()
|
|
2857
|
+
try:
|
|
2858
|
+
secondary_node.connect_to_hublvol(primary_node)
|
|
2859
|
+
|
|
2860
|
+
except RPCException as e:
|
|
2861
|
+
logger.error("Error connecting to hublvol: %s", e.message)
|
|
2862
|
+
return False
|
|
2858
2863
|
|
|
2859
2864
|
### 8- allow port on primary
|
|
2860
|
-
|
|
2861
|
-
tcp_ports_events.port_allowed(
|
|
2865
|
+
primary_node_api.firewall_set_port(primary_node.lvol_subsys_port, "tcp", "allow")
|
|
2866
|
+
tcp_ports_events.port_allowed(primary_node, primary_node.lvol_subsys_port)
|
|
2862
2867
|
|
|
2863
2868
|
### 7- add lvols to subsystems
|
|
2864
2869
|
executor = ThreadPoolExecutor(max_workers=100)
|
|
2865
2870
|
for lvol in lvol_list:
|
|
2866
|
-
a = executor.submit(add_lvol_thread, lvol,
|
|
2871
|
+
a = executor.submit(add_lvol_thread, lvol, secondary_node, lvol_ana_state="non_optimized")
|
|
2867
2872
|
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2873
|
+
primary_node = db_controller.get_storage_node_by_id(primary_node.get_id())
|
|
2874
|
+
primary_node.lvstore_status = "ready"
|
|
2875
|
+
primary_node.write_to_db()
|
|
2871
2876
|
|
|
2872
2877
|
return True
|
|
2873
2878
|
|
|
@@ -2936,7 +2941,7 @@ def recreate_lvstore(snode):
|
|
|
2936
2941
|
|
|
2937
2942
|
# time.sleep(1)
|
|
2938
2943
|
### 4- set leadership to false
|
|
2939
|
-
sec_rpc_client.bdev_lvol_set_leader(
|
|
2944
|
+
sec_rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=False, bs_nonleadership=True)
|
|
2940
2945
|
sec_rpc_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
|
|
2941
2946
|
# time.sleep(1)
|
|
2942
2947
|
|
|
@@ -2946,10 +2951,33 @@ def recreate_lvstore(snode):
|
|
|
2946
2951
|
|
|
2947
2952
|
### 6- wait for examine
|
|
2948
2953
|
ret = rpc_client.bdev_wait_for_examine()
|
|
2949
|
-
ret = rpc_client.
|
|
2950
|
-
|
|
2954
|
+
ret = rpc_client.bdev_lvol_set_lvs_opts(
|
|
2955
|
+
snode.lvstore,
|
|
2956
|
+
groupid=snode.jm_vuid,
|
|
2957
|
+
subsystem_port=snode.lvol_subsys_port,
|
|
2958
|
+
primary=True
|
|
2959
|
+
)
|
|
2960
|
+
ret = rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=True)
|
|
2961
|
+
|
|
2962
|
+
if sec_node:
|
|
2963
|
+
### 7- create and connect hublvol
|
|
2964
|
+
cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
|
|
2965
|
+
try:
|
|
2966
|
+
snode.create_hublvol(cluster_nqn)
|
|
2967
|
+
if sec_node.status == StorageNode.STATUS_ONLINE:
|
|
2968
|
+
sec_node.connect_to_hublvol(snode)
|
|
2969
|
+
|
|
2970
|
+
except RPCException as e:
|
|
2971
|
+
logger.error("Error establishing hublvol: %s", e.message)
|
|
2972
|
+
return False
|
|
2951
2973
|
|
|
2952
|
-
|
|
2974
|
+
finally:
|
|
2975
|
+
### 8- allow secondary port
|
|
2976
|
+
if sec_node.status == StorageNode.STATUS_ONLINE:
|
|
2977
|
+
sec_node_api.firewall_set_port(snode.lvol_subsys_port, "tcp", "allow", sec_node.rpc_port)
|
|
2978
|
+
tcp_ports_events.port_allowed(sec_node, snode.lvol_subsys_port)
|
|
2979
|
+
|
|
2980
|
+
### 9- add lvols to subsystems
|
|
2953
2981
|
executor = ThreadPoolExecutor(max_workers=100)
|
|
2954
2982
|
for lvol in lvol_list:
|
|
2955
2983
|
a = executor.submit(add_lvol_thread, lvol, snode, lvol_ana_state)
|
|
@@ -2959,11 +2987,8 @@ def recreate_lvstore(snode):
|
|
|
2959
2987
|
logger.info("Node status changed to suspended")
|
|
2960
2988
|
return False
|
|
2961
2989
|
|
|
2962
|
-
###
|
|
2990
|
+
### 10- finish
|
|
2963
2991
|
if sec_node.status == StorageNode.STATUS_ONLINE:
|
|
2964
|
-
time.sleep(7)
|
|
2965
|
-
sec_node_api.firewall_set_port(snode.lvol_subsys_port, "tcp", "allow", sec_node.rpc_port)
|
|
2966
|
-
tcp_ports_events.port_allowed(sec_node, snode.lvol_subsys_port)
|
|
2967
2992
|
sec_node = db_controller.get_storage_node_by_id(snode.secondary_node_id)
|
|
2968
2993
|
sec_node.lvstore_status = "ready"
|
|
2969
2994
|
sec_node.write_to_db()
|
|
@@ -3019,6 +3044,8 @@ def get_sorted_ha_jms(current_node):
|
|
|
3019
3044
|
if (node.get_id() == current_node.get_id() or node.status != StorageNode.STATUS_ONLINE or
|
|
3020
3045
|
node.is_secondary_node): # pass
|
|
3021
3046
|
continue
|
|
3047
|
+
if node.mgmt_ip == current_node.mgmt_ip:
|
|
3048
|
+
continue
|
|
3022
3049
|
if node.jm_device and node.jm_device.status == JMDevice.STATUS_ONLINE:
|
|
3023
3050
|
jm_count[node.jm_device.get_id()] = 1 + jm_count.get(node.jm_device.get_id(), 0)
|
|
3024
3051
|
for rem_jm_device in node.remote_jm_devices:
|
|
@@ -3185,26 +3212,42 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
|
|
|
3185
3212
|
logger.error(err)
|
|
3186
3213
|
return False
|
|
3187
3214
|
|
|
3215
|
+
rpc_client = RPCClient(snode.mgmt_ip, snode.rpc_port, snode.rpc_username, snode.rpc_password )
|
|
3216
|
+
ret = rpc_client.bdev_lvol_set_lvs_opts(
|
|
3217
|
+
snode.lvstore,
|
|
3218
|
+
groupid=snode.jm_vuid,
|
|
3219
|
+
subsystem_port=snode.lvol_subsys_port,
|
|
3220
|
+
primary=True
|
|
3221
|
+
)
|
|
3222
|
+
ret = rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=True)
|
|
3223
|
+
|
|
3188
3224
|
if snode.secondary_node_id:
|
|
3225
|
+
sec_node = db_controller.get_storage_node_by_id(snode.secondary_node_id)
|
|
3226
|
+
|
|
3189
3227
|
# creating lvstore on secondary
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
ret, err = _create_bdev_stack(sec_node_1, lvstore_stack, primary_node=snode)
|
|
3228
|
+
sec_node.remote_jm_devices = _connect_to_remote_jm_devs(sec_node)
|
|
3229
|
+
sec_node.write_to_db()
|
|
3230
|
+
ret, err = _create_bdev_stack(sec_node, lvstore_stack, primary_node=snode)
|
|
3194
3231
|
if err:
|
|
3195
|
-
logger.error(f"Failed to create lvstore on node {
|
|
3232
|
+
logger.error(f"Failed to create lvstore on node {sec_node.get_id()}")
|
|
3196
3233
|
logger.error(err)
|
|
3197
3234
|
return False
|
|
3198
3235
|
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3236
|
+
sec_rpc_client = sec_node.rpc_client()
|
|
3237
|
+
sec_rpc_client.bdev_examine(snode.raid)
|
|
3238
|
+
sec_rpc_client.bdev_wait_for_examine()
|
|
3239
|
+
|
|
3240
|
+
cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
|
|
3241
|
+
try:
|
|
3242
|
+
snode.create_hublvol(cluster_nqn)
|
|
3243
|
+
if sec_node.status == StorageNode.STATUS_ONLINE:
|
|
3244
|
+
sec_node.connect_to_hublvol(snode)
|
|
3202
3245
|
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3246
|
+
except RPCException as e:
|
|
3247
|
+
logger.error("Error establishing hublvol: %s", e.message)
|
|
3248
|
+
return False
|
|
3206
3249
|
|
|
3207
|
-
|
|
3250
|
+
sec_node.write_to_db()
|
|
3208
3251
|
|
|
3209
3252
|
return True
|
|
3210
3253
|
|