sbcli-dev 17.3.4__tar.gz → 17.3.5__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.5}/PKG-INFO +1 -1
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/PKG-INFO +1 -1
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/SOURCES.txt +1 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/lvol_controller.py +1 -9
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/snapshot_controller.py +1 -1
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/env_var +1 -1
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/base_model.py +5 -2
- sbcli_dev-17.3.5/simplyblock_core/models/hublvol.py +12 -0
- sbcli_dev-17.3.5/simplyblock_core/models/storage_node.py +211 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/rpc_client.py +33 -17
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/storage_node_ops.py +87 -54
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/utils.py +12 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/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.5}/README.md +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/pyproject.toml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/requirements.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/dependency_links.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/entry_points.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/requires.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/sbcli_dev.egg-info/top_level.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/setup.cfg +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/setup.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_cli/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_cli/cli.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_cli/clibase.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_cli/main.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/cluster_ops.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/cnode_client.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/constants.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/caching_node_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/cluster_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/device_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/device_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/events_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/health_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/lvol_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/mgmt_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/pool_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/pool_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/snapshot_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/storage_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tasks_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tasks_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/db_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/distr_controller.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/mgmt_node_ops.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/caching_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/cluster.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/deployer.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/events.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/iface.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/job_schedule.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/lvol_model.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/mgmt_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/nvme_device.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/pool.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/port_stat.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/snapshot.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/models/stats.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/pci_utils.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/config_docker.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboard.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/devices.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/dashboards/pools.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/datasource.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/db_config_double.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/db_config_single.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/deploy_stack.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/foundation.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/haproxy.cfg +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/install_deps.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/objstore.yml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/prometheus.yml.j2 +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/run_ssh.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/set_db_config.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/cached_lvol_stat_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/caching_node_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/cap_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/device_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/health_check_service.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/install_service.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/lvol_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/lvol_stat_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/main_distr_event_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/new_device_discovery.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/remove_service.sh +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/service_template.service +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk/client.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/spdk_stats_collector.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/storage_node_monitor.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_migration.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/services/tasks_runner_restart.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/shell_utils.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/snode_client.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/test/test_utils.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/README.md +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/app.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/auth_middleware.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/__init__.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_basic.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/snode_ops.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/snode_ops_k8s.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_device.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_metrics.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_pool.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/node_utils.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/node_utils_k8s.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/node_webapp.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/requirements.txt +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/delete.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy_cnode.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/deploy_spdk.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/is_up.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/list_deps.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/rpac.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/swagger.yaml +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/static/tst.py +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-17.3.4 → sbcli_dev-17.3.5}/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,32 @@ 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
|
+
)
|
|
2959
|
+
ret = rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=True)
|
|
2960
|
+
|
|
2961
|
+
if sec_node:
|
|
2962
|
+
### 7- create and connect hublvol
|
|
2963
|
+
cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
|
|
2964
|
+
try:
|
|
2965
|
+
snode.create_hublvol(cluster_nqn)
|
|
2966
|
+
if sec_node.status == StorageNode.STATUS_ONLINE:
|
|
2967
|
+
sec_node.connect_to_hublvol(snode)
|
|
2951
2968
|
|
|
2952
|
-
|
|
2969
|
+
except RPCException as e:
|
|
2970
|
+
logger.error("Error establishing hublvol: %s", e.message)
|
|
2971
|
+
return False
|
|
2972
|
+
|
|
2973
|
+
finally:
|
|
2974
|
+
### 8- allow secondary port
|
|
2975
|
+
if sec_node.status == StorageNode.STATUS_ONLINE:
|
|
2976
|
+
sec_node_api.firewall_set_port(snode.lvol_subsys_port, "tcp", "allow", sec_node.rpc_port)
|
|
2977
|
+
tcp_ports_events.port_allowed(sec_node, snode.lvol_subsys_port)
|
|
2978
|
+
|
|
2979
|
+
### 9- add lvols to subsystems
|
|
2953
2980
|
executor = ThreadPoolExecutor(max_workers=100)
|
|
2954
2981
|
for lvol in lvol_list:
|
|
2955
2982
|
a = executor.submit(add_lvol_thread, lvol, snode, lvol_ana_state)
|
|
@@ -2959,11 +2986,8 @@ def recreate_lvstore(snode):
|
|
|
2959
2986
|
logger.info("Node status changed to suspended")
|
|
2960
2987
|
return False
|
|
2961
2988
|
|
|
2962
|
-
###
|
|
2989
|
+
### 10- finish
|
|
2963
2990
|
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
2991
|
sec_node = db_controller.get_storage_node_by_id(snode.secondary_node_id)
|
|
2968
2992
|
sec_node.lvstore_status = "ready"
|
|
2969
2993
|
sec_node.write_to_db()
|
|
@@ -3019,6 +3043,8 @@ def get_sorted_ha_jms(current_node):
|
|
|
3019
3043
|
if (node.get_id() == current_node.get_id() or node.status != StorageNode.STATUS_ONLINE or
|
|
3020
3044
|
node.is_secondary_node): # pass
|
|
3021
3045
|
continue
|
|
3046
|
+
if node.mgmt_ip == current_node.mgmt_ip:
|
|
3047
|
+
continue
|
|
3022
3048
|
if node.jm_device and node.jm_device.status == JMDevice.STATUS_ONLINE:
|
|
3023
3049
|
jm_count[node.jm_device.get_id()] = 1 + jm_count.get(node.jm_device.get_id(), 0)
|
|
3024
3050
|
for rem_jm_device in node.remote_jm_devices:
|
|
@@ -3186,25 +3212,32 @@ def create_lvstore(snode, ndcs, npcs, distr_bs, distr_chunk_bs, page_size_in_blo
|
|
|
3186
3212
|
return False
|
|
3187
3213
|
|
|
3188
3214
|
if snode.secondary_node_id:
|
|
3215
|
+
sec_node = db_controller.get_storage_node_by_id(snode.secondary_node_id)
|
|
3216
|
+
|
|
3189
3217
|
# creating lvstore on secondary
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
ret, err = _create_bdev_stack(sec_node_1, lvstore_stack, primary_node=snode)
|
|
3218
|
+
sec_node.remote_jm_devices = _connect_to_remote_jm_devs(sec_node)
|
|
3219
|
+
sec_node.write_to_db()
|
|
3220
|
+
ret, err = _create_bdev_stack(sec_node, lvstore_stack, primary_node=snode)
|
|
3194
3221
|
if err:
|
|
3195
|
-
logger.error(f"Failed to create lvstore on node {
|
|
3222
|
+
logger.error(f"Failed to create lvstore on node {sec_node.get_id()}")
|
|
3196
3223
|
logger.error(err)
|
|
3197
3224
|
return False
|
|
3198
3225
|
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3226
|
+
sec_rpc_client = sec_node.rpc_client()
|
|
3227
|
+
sec_rpc_client.bdev_examine(snode.raid)
|
|
3228
|
+
sec_rpc_client.bdev_wait_for_examine()
|
|
3202
3229
|
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3230
|
+
cluster_nqn = db_controller.get_cluster_by_id(snode.cluster_id).nqn
|
|
3231
|
+
try:
|
|
3232
|
+
snode.create_hublvol(cluster_nqn)
|
|
3233
|
+
if sec_node.status == StorageNode.STATUS_ONLINE:
|
|
3234
|
+
sec_node.connect_to_hublvol(snode)
|
|
3206
3235
|
|
|
3207
|
-
|
|
3236
|
+
except RPCException as e:
|
|
3237
|
+
logger.error("Error establishing hublvol: %s", e.message)
|
|
3238
|
+
return False
|
|
3239
|
+
|
|
3240
|
+
sec_node.write_to_db()
|
|
3208
3241
|
|
|
3209
3242
|
return True
|
|
3210
3243
|
|
|
@@ -28,6 +28,10 @@ CONFIG_KEYS = [
|
|
|
28
28
|
"jc_singleton_core",
|
|
29
29
|
]
|
|
30
30
|
|
|
31
|
+
|
|
32
|
+
UUID_PATTERN = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$')
|
|
33
|
+
|
|
34
|
+
|
|
31
35
|
def get_env_var(name, default=None, is_required=False):
|
|
32
36
|
if not name:
|
|
33
37
|
logger.warning("Invalid env var name %s", name)
|
|
@@ -929,3 +933,11 @@ def init_sentry_sdk(name=None):
|
|
|
929
933
|
# # set_level("critical")
|
|
930
934
|
|
|
931
935
|
return True
|
|
936
|
+
|
|
937
|
+
|
|
938
|
+
def generate_hex_string(length):
|
|
939
|
+
def _generate_string(length):
|
|
940
|
+
return ''.join(random.SystemRandom().choice(
|
|
941
|
+
string.ascii_letters + string.digits) for _ in range(length))
|
|
942
|
+
|
|
943
|
+
return _generate_string(length).encode('utf-8').hex()
|