sbcli-dev 19.2.3__tar.gz → 19.2.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-19.2.3 → sbcli_dev-19.2.5}/PKG-INFO +1 -1
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/sbcli_dev.egg-info/PKG-INFO +1 -1
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/sbcli_dev.egg-info/SOURCES.txt +1 -7
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_cli/cli.py +1 -96
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_cli/clibase.py +2 -48
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/cluster_ops.py +1 -1
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/lvol_controller.py +1 -8
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/pool_controller.py +1 -33
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/db_controller.py +0 -27
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/env_var +1 -1
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/pool.py +1 -1
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/docker-compose-swarm.yml +1 -15
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/health_check_service.py +1 -1
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/tasks_runner_port_allow.py +3 -3
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/storage_node_ops.py +4 -4
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/app.py +1 -2
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/snode_ops_k8s.py +33 -1
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_lvol.py +0 -12
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_pool.py +2 -27
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/node_webapp.py +0 -12
- sbcli_dev-19.2.5/simplyblock_web/templates/storage_core_isolation.yaml.j2 +201 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/test/api/test_pool.py +1 -1
- sbcli_dev-19.2.3/simplyblock_core/controllers/caching_node_controller.py +0 -747
- sbcli_dev-19.2.3/simplyblock_core/models/caching_node.py +0 -56
- sbcli_dev-19.2.3/simplyblock_core/services/cached_lvol_stat_collector.py +0 -88
- sbcli_dev-19.2.3/simplyblock_core/services/caching_node_monitor.py +0 -84
- sbcli_dev-19.2.3/simplyblock_web/blueprints/caching_node_ops.py +0 -301
- sbcli_dev-19.2.3/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -298
- sbcli_dev-19.2.3/simplyblock_web/blueprints/web_api_caching_node.py +0 -176
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/README.md +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/pyproject.toml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/requirements.txt +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/sbcli_dev.egg-info/dependency_links.txt +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/sbcli_dev.egg-info/entry_points.txt +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/sbcli_dev.egg-info/requires.txt +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/sbcli_dev.egg-info/top_level.txt +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/setup.cfg +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/setup.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_cli/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_cli/main.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/cnode_client.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/constants.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/cluster_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/device_controller.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/device_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/events_controller.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/health_controller.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/lvol_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/mgmt_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/pool_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/snapshot_controller.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/snapshot_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/storage_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/tasks_controller.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/tasks_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/controllers/tcp_ports_events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/distr_controller.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/fw_api_client.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/mgmt_node_ops.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/base_model.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/cluster.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/deployer.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/events.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/hublvol.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/iface.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/job_schedule.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/lvol_model.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/mgmt_node.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/nvme_device.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/port_stat.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/snapshot.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/stats.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/models/storage_node.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/pci_utils.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/rpc_client.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/config_docker.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/dashboard.yml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/dashboards/devices.json +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/dashboards/pools.json +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/datasource.yml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/db_config_double.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/db_config_single.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/deploy_fdb.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/deploy_stack.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/foundation.yml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/haproxy.cfg +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/helpers/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/helpers/deploy_cluster.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/helpers/destroy_cluster.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/helpers/nvme_disconnect_by_ip.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/install_deps.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/objstore.yml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/prepare_fdb.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/prometheus.yml.j2 +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/run_ssh.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/set_db_config.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/cap_monitor.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/device_monitor.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/install_service.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/lvol_monitor.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/lvol_stat_collector.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/main_distr_event_collector.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/new_device_discovery.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/remove_service.sh +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/service_template.service +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/spdk/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/spdk/client.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/spdk_http_proxy_server.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/storage_node_monitor.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/tasks_cluster_status.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/tasks_runner_failed_migration.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/tasks_runner_migration.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/tasks_runner_new_dev_migration.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/tasks_runner_node_add.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/services/tasks_runner_restart.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/shell_utils.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/snode_client.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/test/test_models.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/test/test_utils.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/utils.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_core/workers/cleanup_foundationdb.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/README.md +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/auth_middleware.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/__init__.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/node_api_basic.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/snode_ops.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/swagger_ui_blueprint.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_device.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_metrics.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/node_configure.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/node_utils.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/node_utils_k8s.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/SimplyBlock-API.postman_collection.json +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/delete.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/deploy.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/deploy_cnode.yaml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/deploy_spdk.yaml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/is_up.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/list_deps.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/rpac.yaml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/swagger.yaml +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/static/tst.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/templates/caching_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/templates/storage_deploy_spdk.yaml.j2 +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/templates/storage_init_job.yaml.j2 +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/test/api/test_lvol.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/test/api/test_snapshot.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/test/api/test_storage_node.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/test/conftest.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/test/pytest.ini +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/test/requirements.txt +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/test/util.py +0 -0
- {sbcli_dev-19.2.3 → sbcli_dev-19.2.5}/simplyblock_web/utils.py +0 -0
|
@@ -28,7 +28,6 @@ simplyblock_core/snode_client.py
|
|
|
28
28
|
simplyblock_core/storage_node_ops.py
|
|
29
29
|
simplyblock_core/utils.py
|
|
30
30
|
simplyblock_core/controllers/__init__.py
|
|
31
|
-
simplyblock_core/controllers/caching_node_controller.py
|
|
32
31
|
simplyblock_core/controllers/cluster_events.py
|
|
33
32
|
simplyblock_core/controllers/device_controller.py
|
|
34
33
|
simplyblock_core/controllers/device_events.py
|
|
@@ -47,7 +46,6 @@ simplyblock_core/controllers/tasks_events.py
|
|
|
47
46
|
simplyblock_core/controllers/tcp_ports_events.py
|
|
48
47
|
simplyblock_core/models/__init__.py
|
|
49
48
|
simplyblock_core/models/base_model.py
|
|
50
|
-
simplyblock_core/models/caching_node.py
|
|
51
49
|
simplyblock_core/models/cluster.py
|
|
52
50
|
simplyblock_core/models/deployer.py
|
|
53
51
|
simplyblock_core/models/events.py
|
|
@@ -95,8 +93,6 @@ simplyblock_core/scripts/helpers/deploy_cluster.sh
|
|
|
95
93
|
simplyblock_core/scripts/helpers/destroy_cluster.sh
|
|
96
94
|
simplyblock_core/scripts/helpers/nvme_disconnect_by_ip.py
|
|
97
95
|
simplyblock_core/services/__init__.py
|
|
98
|
-
simplyblock_core/services/cached_lvol_stat_collector.py
|
|
99
|
-
simplyblock_core/services/caching_node_monitor.py
|
|
100
96
|
simplyblock_core/services/cap_monitor.py
|
|
101
97
|
simplyblock_core/services/capacity_and_stats_collector.py
|
|
102
98
|
simplyblock_core/services/device_monitor.py
|
|
@@ -133,13 +129,10 @@ simplyblock_web/node_utils_k8s.py
|
|
|
133
129
|
simplyblock_web/node_webapp.py
|
|
134
130
|
simplyblock_web/utils.py
|
|
135
131
|
simplyblock_web/blueprints/__init__.py
|
|
136
|
-
simplyblock_web/blueprints/caching_node_ops.py
|
|
137
|
-
simplyblock_web/blueprints/caching_node_ops_k8s.py
|
|
138
132
|
simplyblock_web/blueprints/node_api_basic.py
|
|
139
133
|
simplyblock_web/blueprints/snode_ops.py
|
|
140
134
|
simplyblock_web/blueprints/snode_ops_k8s.py
|
|
141
135
|
simplyblock_web/blueprints/swagger_ui_blueprint.py
|
|
142
|
-
simplyblock_web/blueprints/web_api_caching_node.py
|
|
143
136
|
simplyblock_web/blueprints/web_api_cluster.py
|
|
144
137
|
simplyblock_web/blueprints/web_api_deployer.py
|
|
145
138
|
simplyblock_web/blueprints/web_api_device.py
|
|
@@ -160,6 +153,7 @@ simplyblock_web/static/rpac.yaml
|
|
|
160
153
|
simplyblock_web/static/swagger.yaml
|
|
161
154
|
simplyblock_web/static/tst.py
|
|
162
155
|
simplyblock_web/templates/caching_deploy_spdk.yaml.j2
|
|
156
|
+
simplyblock_web/templates/storage_core_isolation.yaml.j2
|
|
163
157
|
simplyblock_web/templates/storage_deploy_spdk.yaml.j2
|
|
164
158
|
simplyblock_web/templates/storage_init_job.yaml.j2
|
|
165
159
|
simplyblock_web/test/conftest.py
|
|
@@ -27,7 +27,6 @@ class CLIWrapper(CLIWrapperBase):
|
|
|
27
27
|
self.init_control_plane()
|
|
28
28
|
self.init_storage_pool()
|
|
29
29
|
self.init_snapshot()
|
|
30
|
-
self.init_caching_node()
|
|
31
30
|
super().__init__()
|
|
32
31
|
|
|
33
32
|
def init_storage_node(self):
|
|
@@ -169,6 +168,7 @@ class CLIWrapper(CLIWrapperBase):
|
|
|
169
168
|
argument = subcommand.add_argument('--iobuf_large_bufsize', help='bdev_set_options param', type=int, default=0, dest='large_bufsize')
|
|
170
169
|
argument = subcommand.add_argument('--force', help='Force restart', dest='force', action='store_true')
|
|
171
170
|
argument = subcommand.add_argument('--ssd-pcie', help='New Nvme PCIe address to add to the storage node. Can be more than one.', type=str, default='', dest='ssd_pcie', required=False, nargs='+')
|
|
171
|
+
argument = subcommand.add_argument('--force-lvol-recreate', help='Force LVol recreate on node restart even if lvol bdev was not recovered', type=bool, dest='force_lvol_recreate')
|
|
172
172
|
|
|
173
173
|
def init_storage_node__shutdown(self, subparser):
|
|
174
174
|
subcommand = self.add_sub_command(subparser, 'shutdown', 'Initiates a storage node shutdown')
|
|
@@ -655,8 +655,6 @@ class CLIWrapper(CLIWrapperBase):
|
|
|
655
655
|
argument = subcommand.add_argument('--max-rw-mbytes', help='Maximum Read Write Megabytes Per Second', type=int, dest='max_rw_mbytes')
|
|
656
656
|
argument = subcommand.add_argument('--max-r-mbytes', help='Maximum Read Megabytes Per Second', type=int, dest='max_r_mbytes')
|
|
657
657
|
argument = subcommand.add_argument('--max-w-mbytes', help='Maximum Write Megabytes Per Second', type=int, dest='max_w_mbytes')
|
|
658
|
-
if self.developer_mode:
|
|
659
|
-
argument = subcommand.add_argument('--has-secret', help='Pool is created with a secret (all further API interactions with the pool and logical volumes in the pool require this secret)', dest='has_secret', action='store_true')
|
|
660
658
|
|
|
661
659
|
def init_storage_pool__set(self, subparser):
|
|
662
660
|
subcommand = self.add_sub_command(subparser, 'set', 'Sets a storage pool\'s attributes')
|
|
@@ -730,70 +728,6 @@ class CLIWrapper(CLIWrapperBase):
|
|
|
730
728
|
argument = subcommand.add_argument('--resize', help='New logical volume size: 10M, 10G, 10(bytes). Can only increase.', type=size_type(), default='0', dest='resize')
|
|
731
729
|
|
|
732
730
|
|
|
733
|
-
def init_caching_node(self):
|
|
734
|
-
subparser = self.add_command('caching-node', 'Caching node commands', aliases=['cn',])
|
|
735
|
-
self.init_caching_node__deploy(subparser)
|
|
736
|
-
self.init_caching_node__add_node(subparser)
|
|
737
|
-
self.init_caching_node__list(subparser)
|
|
738
|
-
self.init_caching_node__list_lvols(subparser)
|
|
739
|
-
self.init_caching_node__remove(subparser)
|
|
740
|
-
self.init_caching_node__connect(subparser)
|
|
741
|
-
self.init_caching_node__disconnect(subparser)
|
|
742
|
-
self.init_caching_node__recreate(subparser)
|
|
743
|
-
self.init_caching_node__get_lvol_stats(subparser)
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
def init_caching_node__deploy(self, subparser):
|
|
747
|
-
subcommand = self.add_sub_command(subparser, 'deploy', 'Deploys a caching node on this machine (local run)')
|
|
748
|
-
argument = subcommand.add_argument('--ifname', help='Management interface name, e.g. eth0', type=str, dest='ifname')
|
|
749
|
-
|
|
750
|
-
def init_caching_node__add_node(self, subparser):
|
|
751
|
-
subcommand = self.add_sub_command(subparser, 'add-node', 'Adds a new caching node to the cluster')
|
|
752
|
-
subcommand.add_argument('cluster_id', help='Cluster id', type=str)
|
|
753
|
-
subcommand.add_argument('node_ip', help='Node IP address', type=str)
|
|
754
|
-
subcommand.add_argument('ifname', help='Management interface name', type=str)
|
|
755
|
-
argument = subcommand.add_argument('--vcpu-count', help='Number of vCPUs used for SPDK. Remaining CPUs will be used for Linux system, TCP/IP processing, and other workloads. The default on non-Kubernetes hosts is 80%%.', type=int, dest='vcpu_count')
|
|
756
|
-
if self.developer_mode:
|
|
757
|
-
argument = subcommand.add_argument('--cpu-mask', help='SPDK app CPU mask, default is all cores found', type=regex_type(r'^(0x|0X)?[a-fA-F0-9]+$'), dest='spdk_cpu_mask')
|
|
758
|
-
if self.developer_mode:
|
|
759
|
-
argument = subcommand.add_argument('--memory', help='SPDK huge memory allocation. By default it will acquire all available huge pages.', type=size_type(min=utils.parse_size('1G'), max=None), dest='spdk_mem')
|
|
760
|
-
if self.developer_mode:
|
|
761
|
-
argument = subcommand.add_argument('--spdk-image', help='SPDK image uri', type=str, dest='spdk_image')
|
|
762
|
-
argument = subcommand.add_argument('--namespace', help='k8s namespace to deploy on', type=str, dest='namespace')
|
|
763
|
-
argument = subcommand.add_argument('--multipathing', help='Enable multipathing for logical volume connection, default: on', type=str, default='True', dest='multipathing', choices=['on','off',])
|
|
764
|
-
|
|
765
|
-
def init_caching_node__list(self, subparser):
|
|
766
|
-
subcommand = self.add_sub_command(subparser, 'list', 'Lists all caching nodes')
|
|
767
|
-
|
|
768
|
-
def init_caching_node__list_lvols(self, subparser):
|
|
769
|
-
subcommand = self.add_sub_command(subparser, 'list-lvols', 'Lists all connected logical volumes')
|
|
770
|
-
subcommand.add_argument('node_id', help='Caching node id', type=str)
|
|
771
|
-
|
|
772
|
-
def init_caching_node__remove(self, subparser):
|
|
773
|
-
subcommand = self.add_sub_command(subparser, 'remove', 'Removes a caching node from the cluster')
|
|
774
|
-
subcommand.add_argument('node_id', help='Caching node id', type=str)
|
|
775
|
-
argument = subcommand.add_argument('--force', help='Force remove', dest='force', action='store_true')
|
|
776
|
-
|
|
777
|
-
def init_caching_node__connect(self, subparser):
|
|
778
|
-
subcommand = self.add_sub_command(subparser, 'connect', 'Connects a logical volume to the caching node')
|
|
779
|
-
subcommand.add_argument('node_id', help='Caching node id', type=str)
|
|
780
|
-
subcommand.add_argument('lvol_id', help='Logical volume id', type=str)
|
|
781
|
-
|
|
782
|
-
def init_caching_node__disconnect(self, subparser):
|
|
783
|
-
subcommand = self.add_sub_command(subparser, 'disconnect', 'Disconnects a logical volume from the caching node')
|
|
784
|
-
subcommand.add_argument('node_id', help='Caching node id', type=str)
|
|
785
|
-
subcommand.add_argument('lvol_id', help='Logical volume id', type=str)
|
|
786
|
-
|
|
787
|
-
def init_caching_node__recreate(self, subparser):
|
|
788
|
-
subcommand = self.add_sub_command(subparser, 'recreate', 'Recreate a caching node\'s bdevs')
|
|
789
|
-
subcommand.add_argument('node_id', help='Caching node id', type=str)
|
|
790
|
-
|
|
791
|
-
def init_caching_node__get_lvol_stats(self, subparser):
|
|
792
|
-
subcommand = self.add_sub_command(subparser, 'get-lvol-stats', 'Gets a logical volume\'s statistics')
|
|
793
|
-
subcommand.add_argument('lvol_id', help='Logical volume id', type=str)
|
|
794
|
-
argument = subcommand.add_argument('--history', help='(XXdYYh), list history records (one for every 15 minutes) for XX days and YY hours (up to 10 days in total).', type=str, dest='history')
|
|
795
|
-
|
|
796
|
-
|
|
797
731
|
def run(self):
|
|
798
732
|
args = self.parser.parse_args()
|
|
799
733
|
if args.debug:
|
|
@@ -1076,8 +1010,6 @@ class CLIWrapper(CLIWrapperBase):
|
|
|
1076
1010
|
elif args.command in ['storage-pool', 'pool']:
|
|
1077
1011
|
sub_command = args_dict['storage-pool']
|
|
1078
1012
|
if sub_command in ['add']:
|
|
1079
|
-
if not self.developer_mode:
|
|
1080
|
-
args.has_secret = None
|
|
1081
1013
|
ret = self.storage_pool__add(sub_command, args)
|
|
1082
1014
|
elif sub_command in ['set']:
|
|
1083
1015
|
ret = self.storage_pool__set(sub_command, args)
|
|
@@ -1111,33 +1043,6 @@ class CLIWrapper(CLIWrapperBase):
|
|
|
1111
1043
|
else:
|
|
1112
1044
|
self.parser.print_help()
|
|
1113
1045
|
|
|
1114
|
-
elif args.command in ['caching-node', 'cn']:
|
|
1115
|
-
sub_command = args_dict['caching-node']
|
|
1116
|
-
if sub_command in ['deploy']:
|
|
1117
|
-
ret = self.caching_node__deploy(sub_command, args)
|
|
1118
|
-
elif sub_command in ['add-node']:
|
|
1119
|
-
if not self.developer_mode:
|
|
1120
|
-
args.spdk_cpu_mask = None
|
|
1121
|
-
args.spdk_mem = None
|
|
1122
|
-
args.spdk_image = None
|
|
1123
|
-
ret = self.caching_node__add_node(sub_command, args)
|
|
1124
|
-
elif sub_command in ['list']:
|
|
1125
|
-
ret = self.caching_node__list(sub_command, args)
|
|
1126
|
-
elif sub_command in ['list-lvols']:
|
|
1127
|
-
ret = self.caching_node__list_lvols(sub_command, args)
|
|
1128
|
-
elif sub_command in ['remove']:
|
|
1129
|
-
ret = self.caching_node__remove(sub_command, args)
|
|
1130
|
-
elif sub_command in ['connect']:
|
|
1131
|
-
ret = self.caching_node__connect(sub_command, args)
|
|
1132
|
-
elif sub_command in ['disconnect']:
|
|
1133
|
-
ret = self.caching_node__disconnect(sub_command, args)
|
|
1134
|
-
elif sub_command in ['recreate']:
|
|
1135
|
-
ret = self.caching_node__recreate(sub_command, args)
|
|
1136
|
-
elif sub_command in ['get-lvol-stats']:
|
|
1137
|
-
ret = self.caching_node__get_lvol_stats(sub_command, args)
|
|
1138
|
-
else:
|
|
1139
|
-
self.parser.print_help()
|
|
1140
|
-
|
|
1141
1046
|
else:
|
|
1142
1047
|
self.parser.print_help()
|
|
1143
1048
|
|
|
@@ -13,7 +13,7 @@ from simplyblock_core import storage_node_ops as storage_ops
|
|
|
13
13
|
from simplyblock_core import mgmt_node_ops as mgmt_ops
|
|
14
14
|
from simplyblock_core.controllers import pool_controller, lvol_controller, snapshot_controller, device_controller, \
|
|
15
15
|
tasks_controller
|
|
16
|
-
from simplyblock_core.controllers import
|
|
16
|
+
from simplyblock_core.controllers import health_controller
|
|
17
17
|
from simplyblock_core.models.pool import Pool
|
|
18
18
|
from simplyblock_core.models.cluster import Cluster
|
|
19
19
|
|
|
@@ -188,7 +188,7 @@ class CLIWrapperBase:
|
|
|
188
188
|
node_id, max_lvol, max_snap, max_prov,
|
|
189
189
|
spdk_image, spdk_debug,
|
|
190
190
|
small_bufsize, large_bufsize, node_ip=args.node_ip, reattach_volume=reattach_volume, force=args.force,
|
|
191
|
-
new_ssd_pcie=ssd_pcie)
|
|
191
|
+
new_ssd_pcie=ssd_pcie, force_lvol_recreate=args.force_lvol_recreate)
|
|
192
192
|
|
|
193
193
|
def storage_node__shutdown(self, sub_command, args):
|
|
194
194
|
return storage_ops.shutdown_storage_node(args.node_id, args.force)
|
|
@@ -553,9 +553,6 @@ class CLIWrapperBase:
|
|
|
553
553
|
return mgmt_ops.remove_mgmt_node(args.node_id)
|
|
554
554
|
|
|
555
555
|
def storage_pool__add(self, sub_command, args):
|
|
556
|
-
has_secret = args.has_secret
|
|
557
|
-
if has_secret is None:
|
|
558
|
-
has_secret = False
|
|
559
556
|
return pool_controller.add_pool(
|
|
560
557
|
args.name,
|
|
561
558
|
args.pool_max,
|
|
@@ -564,7 +561,6 @@ class CLIWrapperBase:
|
|
|
564
561
|
args.max_rw_mbytes,
|
|
565
562
|
args.max_r_mbytes,
|
|
566
563
|
args.max_w_mbytes,
|
|
567
|
-
has_secret,
|
|
568
564
|
args.cluster_id
|
|
569
565
|
)
|
|
570
566
|
|
|
@@ -625,48 +621,6 @@ class CLIWrapperBase:
|
|
|
625
621
|
success, details = snapshot_controller.clone(args.snapshot_id, args.lvol_name, new_size)
|
|
626
622
|
return details
|
|
627
623
|
|
|
628
|
-
def caching_node__deploy(self, sub_command, args):
|
|
629
|
-
return caching_node_controller.deploy(args.ifname)
|
|
630
|
-
|
|
631
|
-
def caching_node__add_node(self, sub_command, args):
|
|
632
|
-
cluster_id = args.cluster_id
|
|
633
|
-
node_ip = args.node_ip
|
|
634
|
-
ifname = args.ifname
|
|
635
|
-
data_nics = []
|
|
636
|
-
spdk_image = args.spdk_image
|
|
637
|
-
namespace = args.namespace
|
|
638
|
-
multipathing = args.multipathing == "on"
|
|
639
|
-
spdk_cpu_mask = args.spdk_cpu_mask
|
|
640
|
-
spdk_mem = args.spdk_mem
|
|
641
|
-
|
|
642
|
-
return caching_node_controller.add_node(
|
|
643
|
-
cluster_id, node_ip, ifname, data_nics, spdk_cpu_mask, spdk_mem, spdk_image, namespace, multipathing)
|
|
644
|
-
|
|
645
|
-
def caching_node__list(self, sub_command, args):
|
|
646
|
-
return caching_node_controller.list_nodes()
|
|
647
|
-
|
|
648
|
-
def caching_node__list_lvols(self, sub_command, args):
|
|
649
|
-
return caching_node_controller.list_lvols(args.node_id)
|
|
650
|
-
|
|
651
|
-
def caching_node__remove(self, sub_command, args):
|
|
652
|
-
return caching_node_controller.remove_node(args.node_id, args.force)
|
|
653
|
-
|
|
654
|
-
def caching_node__connect(self, sub_command, args):
|
|
655
|
-
return caching_node_controller.connect(args.node_id, args.lvol_id)
|
|
656
|
-
|
|
657
|
-
def caching_node__disconnect(self, sub_command, args):
|
|
658
|
-
return caching_node_controller.disconnect(args.node_id, args.lvol_id)
|
|
659
|
-
|
|
660
|
-
def caching_node__recreate(self, sub_command, args):
|
|
661
|
-
return caching_node_controller.recreate(args.node_id)
|
|
662
|
-
|
|
663
|
-
def caching_node__get_lvol_stats(self, sub_command, args):
|
|
664
|
-
data = caching_node_controller.get_io_stats(args.lvol_id, args.history)
|
|
665
|
-
if data:
|
|
666
|
-
return utils.print_table(data)
|
|
667
|
-
else:
|
|
668
|
-
return False
|
|
669
|
-
|
|
670
624
|
def storage_node_list_devices(self, args):
|
|
671
625
|
node_id = args.node_id
|
|
672
626
|
is_json = args.json
|
|
@@ -506,7 +506,7 @@ def cluster_expand(cl_id) -> None:
|
|
|
506
506
|
secondary_nodes = storage_node_ops.get_secondary_nodes(snode)
|
|
507
507
|
if not secondary_nodes:
|
|
508
508
|
set_cluster_status(cl_id, ols_status)
|
|
509
|
-
raise ValueError("
|
|
509
|
+
raise ValueError("A minimum of 2 new nodes are required to expand cluster")
|
|
510
510
|
|
|
511
511
|
snode = db_controller.get_storage_node_by_id(snode.get_id())
|
|
512
512
|
snode.secondary_node_id = secondary_nodes[0]
|
|
@@ -9,7 +9,7 @@ from datetime import datetime
|
|
|
9
9
|
from typing import Tuple
|
|
10
10
|
|
|
11
11
|
from simplyblock_core import utils, constants
|
|
12
|
-
from simplyblock_core.controllers import snapshot_controller, pool_controller, lvol_events
|
|
12
|
+
from simplyblock_core.controllers import snapshot_controller, pool_controller, lvol_events
|
|
13
13
|
from simplyblock_core.db_controller import DBController
|
|
14
14
|
from simplyblock_core.models.pool import Pool
|
|
15
15
|
from simplyblock_core.models.lvol_model import LVol
|
|
@@ -873,13 +873,6 @@ def delete_lvol(id_or_name, force_delete=False):
|
|
|
873
873
|
logger.info("Done")
|
|
874
874
|
return True
|
|
875
875
|
|
|
876
|
-
# disconnect from caching nodes:
|
|
877
|
-
cnodes = db_controller.get_caching_nodes()
|
|
878
|
-
for cnode in cnodes:
|
|
879
|
-
for lv in cnode.lvols:
|
|
880
|
-
if lv.lvol_id == lvol.get_id():
|
|
881
|
-
caching_node_controller.disconnect(cnode.get_id(), lvol.get_id())
|
|
882
|
-
|
|
883
876
|
if lvol.ha_type == 'single':
|
|
884
877
|
if snode.status != StorageNode.STATUS_ONLINE:
|
|
885
878
|
logger.error(f"Node status is not online, node: {snode.get_id()}, status: {snode.status}")
|
|
@@ -22,7 +22,7 @@ def _generate_string(length):
|
|
|
22
22
|
string.ascii_letters + string.digits) for _ in range(length))
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def add_pool(name, pool_max, lvol_max, max_rw_iops, max_rw_mbytes, max_r_mbytes, max_w_mbytes,
|
|
25
|
+
def add_pool(name, pool_max, lvol_max, max_rw_iops, max_rw_mbytes, max_r_mbytes, max_w_mbytes, cluster_id):
|
|
26
26
|
db_controller = DBController()
|
|
27
27
|
if not name:
|
|
28
28
|
logger.error("Pool name is empty!")
|
|
@@ -58,8 +58,6 @@ def add_pool(name, pool_max, lvol_max, max_rw_iops, max_rw_mbytes, max_r_mbytes,
|
|
|
58
58
|
pool.cluster_id = cluster.get_id()
|
|
59
59
|
pool.numeric_id = _generate_numeric_id(pool_list)
|
|
60
60
|
pool.pool_name = name
|
|
61
|
-
if has_secret:
|
|
62
|
-
pool.secret = _generate_string(20)
|
|
63
61
|
pool.pool_max_size = pool_max
|
|
64
62
|
pool.lvol_max_size = lvol_max
|
|
65
63
|
pool.max_rw_ios_per_sec = max_rw_iops
|
|
@@ -304,36 +302,6 @@ def get_io_stats(pool_id, history, records_count=20):
|
|
|
304
302
|
return utils.print_table(out)
|
|
305
303
|
|
|
306
304
|
|
|
307
|
-
def get_secret(pool_id):
|
|
308
|
-
db_controller = DBController()
|
|
309
|
-
try:
|
|
310
|
-
pool = db_controller.get_pool_by_id(pool_id)
|
|
311
|
-
except KeyError:
|
|
312
|
-
logger.error(f"Pool not found {pool_id}")
|
|
313
|
-
return False
|
|
314
|
-
|
|
315
|
-
if pool.secret:
|
|
316
|
-
return pool.secret
|
|
317
|
-
else:
|
|
318
|
-
return "Pool has no secret"
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
def set_secret(pool_id, secret):
|
|
322
|
-
db_controller = DBController()
|
|
323
|
-
try:
|
|
324
|
-
pool = db_controller.get_pool_by_id(pool_id)
|
|
325
|
-
except KeyError:
|
|
326
|
-
logger.error(f"Pool not found {pool_id}")
|
|
327
|
-
return False
|
|
328
|
-
|
|
329
|
-
secret = secret.strip()
|
|
330
|
-
if len(secret) < 20:
|
|
331
|
-
return "Secret must be at least 20 char"
|
|
332
|
-
|
|
333
|
-
pool.secret = secret
|
|
334
|
-
pool.write_to_db(db_controller.kv_store)
|
|
335
|
-
|
|
336
|
-
|
|
337
305
|
def get_pool_total_capacity(pool_id):
|
|
338
306
|
db_controller = DBController()
|
|
339
307
|
try:
|
|
@@ -5,7 +5,6 @@ import fdb
|
|
|
5
5
|
from typing import List, Optional
|
|
6
6
|
|
|
7
7
|
from simplyblock_core import constants
|
|
8
|
-
from simplyblock_core.models.caching_node import CachingNode
|
|
9
8
|
from simplyblock_core.models.cluster import Cluster
|
|
10
9
|
from simplyblock_core.models.deployer import Deployer
|
|
11
10
|
from simplyblock_core.models.events import EventObj
|
|
@@ -89,32 +88,6 @@ class DBController(metaclass=Singleton):
|
|
|
89
88
|
raise KeyError(f'StorageNode {id} not found')
|
|
90
89
|
return ret[0]
|
|
91
90
|
|
|
92
|
-
# todo: change this function for multi cluster
|
|
93
|
-
def get_caching_nodes(self) -> List[CachingNode]:
|
|
94
|
-
ret = CachingNode().read_from_db(self.kv_store)
|
|
95
|
-
ret = sorted(ret, key=lambda x: x.create_dt)
|
|
96
|
-
return ret
|
|
97
|
-
|
|
98
|
-
def get_caching_node_by_id(self, id) -> Optional[CachingNode]:
|
|
99
|
-
ret = CachingNode().read_from_db(self.kv_store, id)
|
|
100
|
-
if ret:
|
|
101
|
-
return ret[0]
|
|
102
|
-
return None
|
|
103
|
-
|
|
104
|
-
def get_caching_node_by_system_id(self, system_id) -> Optional[CachingNode]:
|
|
105
|
-
nodes = CachingNode().read_from_db(self.kv_store)
|
|
106
|
-
for node in nodes:
|
|
107
|
-
if node.system_uuid == system_id:
|
|
108
|
-
return node
|
|
109
|
-
return None
|
|
110
|
-
|
|
111
|
-
def get_caching_node_by_hostname(self, hostname) -> Optional[CachingNode]:
|
|
112
|
-
nodes = self.get_caching_nodes()
|
|
113
|
-
for node in nodes:
|
|
114
|
-
if node.hostname == hostname:
|
|
115
|
-
return node
|
|
116
|
-
return None
|
|
117
|
-
|
|
118
91
|
def get_storage_node_by_hostname(self, hostname) -> Optional[StorageNode]:
|
|
119
92
|
nodes = self.get_storage_nodes()
|
|
120
93
|
for node in nodes:
|
|
@@ -29,7 +29,7 @@ services:
|
|
|
29
29
|
placement:
|
|
30
30
|
constraints: [ node.role == manager ]
|
|
31
31
|
resources:
|
|
32
|
-
|
|
32
|
+
reservations:
|
|
33
33
|
memory: 4g
|
|
34
34
|
|
|
35
35
|
fdb-backup-agent:
|
|
@@ -92,20 +92,6 @@ services:
|
|
|
92
92
|
environment:
|
|
93
93
|
SIMPLYBLOCK_LOG_LEVEL: "$LOG_LEVEL"
|
|
94
94
|
|
|
95
|
-
CachingNodeMonitor:
|
|
96
|
-
<<: *service-base
|
|
97
|
-
image: $SIMPLYBLOCK_DOCKER_IMAGE
|
|
98
|
-
command: "python simplyblock_core/services/caching_node_monitor.py"
|
|
99
|
-
deploy:
|
|
100
|
-
placement:
|
|
101
|
-
constraints: [node.role == manager]
|
|
102
|
-
volumes:
|
|
103
|
-
- "/etc/foundationdb:/etc/foundationdb"
|
|
104
|
-
networks:
|
|
105
|
-
- hostnet
|
|
106
|
-
environment:
|
|
107
|
-
SIMPLYBLOCK_LOG_LEVEL: "$LOG_LEVEL"
|
|
108
|
-
|
|
109
95
|
LVolStatsCollector:
|
|
110
96
|
<<: *service-base
|
|
111
97
|
image: $SIMPLYBLOCK_DOCKER_IMAGE
|
|
@@ -208,7 +208,7 @@ while True:
|
|
|
208
208
|
|
|
209
209
|
lvstore_check = True
|
|
210
210
|
snode = db.get_storage_node_by_id(snode.get_id())
|
|
211
|
-
if snode.
|
|
211
|
+
if snode.status == StorageNode.STATUS_ONLINE:
|
|
212
212
|
|
|
213
213
|
lvstore_stack = snode.lvstore_stack
|
|
214
214
|
lvstore_check &= health_controller._check_node_lvstore(
|
|
@@ -68,7 +68,7 @@ while True:
|
|
|
68
68
|
logger.info(f"Check 2: ping mgmt ip {node.mgmt_ip} ... {ping_check}")
|
|
69
69
|
|
|
70
70
|
if not ping_check:
|
|
71
|
-
msg =
|
|
71
|
+
msg = "Node ping is false, retry task"
|
|
72
72
|
logger.info(msg)
|
|
73
73
|
task.function_result = msg
|
|
74
74
|
task.status = JobSchedule.STATUS_SUSPENDED
|
|
@@ -105,7 +105,7 @@ while True:
|
|
|
105
105
|
node.remote_devices = remote_devices
|
|
106
106
|
node.write_to_db()
|
|
107
107
|
else:
|
|
108
|
-
msg =
|
|
108
|
+
msg = "Node unable to connect to remote devs, retry task"
|
|
109
109
|
logger.info(msg)
|
|
110
110
|
task.function_result = msg
|
|
111
111
|
task.status = JobSchedule.STATUS_SUSPENDED
|
|
@@ -114,7 +114,7 @@ while True:
|
|
|
114
114
|
|
|
115
115
|
except Exception as e:
|
|
116
116
|
logger.error(e)
|
|
117
|
-
msg =
|
|
117
|
+
msg = "Error when connect to remote devs, retry task"
|
|
118
118
|
logger.info(msg)
|
|
119
119
|
task.function_result = msg
|
|
120
120
|
task.status = JobSchedule.STATUS_SUSPENDED
|
|
@@ -1361,7 +1361,7 @@ def restart_storage_node(
|
|
|
1361
1361
|
node_id, max_lvol=0, max_snap=0, max_prov=0,
|
|
1362
1362
|
spdk_image=None, set_spdk_debug=None,
|
|
1363
1363
|
small_bufsize=0, large_bufsize=0,
|
|
1364
|
-
force=False, node_ip=None, reattach_volume=False, clear_data=False, new_ssd_pcie=[]):
|
|
1364
|
+
force=False, node_ip=None, reattach_volume=False, clear_data=False, new_ssd_pcie=[], force_lvol_recreate=False):
|
|
1365
1365
|
db_controller = DBController()
|
|
1366
1366
|
kv_store = db_controller.kv_store
|
|
1367
1367
|
|
|
@@ -1793,7 +1793,7 @@ def restart_storage_node(
|
|
|
1793
1793
|
snode = db_controller.get_storage_node_by_id(snode.get_id())
|
|
1794
1794
|
logger.info("Recreate lvstore")
|
|
1795
1795
|
try:
|
|
1796
|
-
ret = recreate_lvstore(snode, force=
|
|
1796
|
+
ret = recreate_lvstore(snode, force=force_lvol_recreate)
|
|
1797
1797
|
except Exception as e:
|
|
1798
1798
|
logger.error(e)
|
|
1799
1799
|
return False
|
|
@@ -3005,7 +3005,7 @@ def recreate_lvstore(snode, force=False):
|
|
|
3005
3005
|
fw_api.firewall_set_port(snode.lvol_subsys_port, "tcp", "block", sec_node.rpc_port)
|
|
3006
3006
|
tcp_ports_events.port_deny(sec_node, snode.lvol_subsys_port)
|
|
3007
3007
|
|
|
3008
|
-
|
|
3008
|
+
time.sleep(0.5)
|
|
3009
3009
|
### 4- set leadership to false
|
|
3010
3010
|
sec_rpc_client.bdev_lvol_set_leader(snode.lvstore, leader=False, bs_nonleadership=True)
|
|
3011
3011
|
sec_rpc_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
|
|
@@ -3015,7 +3015,7 @@ def recreate_lvstore(snode, force=False):
|
|
|
3015
3015
|
rpc_client.jc_explicit_synchronization(snode.jm_vuid)
|
|
3016
3016
|
|
|
3017
3017
|
### 5- examine
|
|
3018
|
-
time.sleep(0.2)
|
|
3018
|
+
# time.sleep(0.2)
|
|
3019
3019
|
rpc_client.bdev_distrib_force_to_non_leader(snode.jm_vuid)
|
|
3020
3020
|
ret = rpc_client.bdev_examine(snode.raid)
|
|
3021
3021
|
# time.sleep(1)
|
|
@@ -6,7 +6,7 @@ from flask import Flask
|
|
|
6
6
|
|
|
7
7
|
from simplyblock_web import utils
|
|
8
8
|
from simplyblock_web.blueprints import web_api_cluster, web_api_mgmt_node, web_api_device, \
|
|
9
|
-
web_api_lvol, web_api_storage_node, web_api_pool,
|
|
9
|
+
web_api_lvol, web_api_storage_node, web_api_pool, \
|
|
10
10
|
web_api_snapshot, web_api_deployer, swagger_ui_blueprint, web_api_metrics
|
|
11
11
|
from simplyblock_web.auth_middleware import token_required
|
|
12
12
|
from simplyblock_core import constants, utils as core_utils
|
|
@@ -31,7 +31,6 @@ app.register_blueprint(web_api_lvol.bp)
|
|
|
31
31
|
app.register_blueprint(web_api_snapshot.bp)
|
|
32
32
|
app.register_blueprint(web_api_storage_node.bp)
|
|
33
33
|
app.register_blueprint(web_api_pool.bp)
|
|
34
|
-
app.register_blueprint(web_api_caching_node.bp)
|
|
35
34
|
app.register_blueprint(web_api_deployer.bp)
|
|
36
35
|
app.register_blueprint(swagger_ui_blueprint.bp, url_prefix=swagger_ui_blueprint.SWAGGER_URL)
|
|
37
36
|
app.register_blueprint(web_api_metrics.bp)
|
|
@@ -336,14 +336,24 @@ def spdk_process_start(body: SPDKParams):
|
|
|
336
336
|
spdk_process_kill(query)
|
|
337
337
|
|
|
338
338
|
node_prepration_job_name = "snode-spdk-job-"
|
|
339
|
+
node_prepration_core_name = "snode-spdk-core-isolate-"
|
|
339
340
|
node_name = os.environ.get("HOSTNAME", "")
|
|
340
|
-
|
|
341
|
+
core_isolate = os.environ.get("CORE_ISOLATION", False)
|
|
342
|
+
if isinstance(core_isolate, str):
|
|
343
|
+
core_isolate = core_isolate.strip().lower() in ("true")
|
|
344
|
+
|
|
341
345
|
# limit the job name length to 63 characters
|
|
342
346
|
k8s_job_name_length = len(node_prepration_job_name+node_name)
|
|
347
|
+
core_name_length = len(node_prepration_core_name+node_name)
|
|
343
348
|
if k8s_job_name_length > 63:
|
|
344
349
|
node_prepration_job_name += node_name[k8s_job_name_length-63:]
|
|
345
350
|
else:
|
|
346
351
|
node_prepration_job_name += node_name
|
|
352
|
+
|
|
353
|
+
if core_name_length > 63:
|
|
354
|
+
node_prepration_core_name += node_name[core_name_length-63:]
|
|
355
|
+
else:
|
|
356
|
+
node_prepration_core_name += node_name
|
|
347
357
|
|
|
348
358
|
logger.debug(f"deploying k8s job to prepare worker: {node_name}")
|
|
349
359
|
|
|
@@ -361,6 +371,7 @@ def spdk_process_start(body: SPDKParams):
|
|
|
361
371
|
'RPC_PASSWORD': body.rpc_password,
|
|
362
372
|
'HOSTNAME': node_name,
|
|
363
373
|
'JOBNAME': node_prepration_job_name,
|
|
374
|
+
'CORE_JOBNAME': node_prepration_core_name,
|
|
364
375
|
'NAMESPACE': namespace,
|
|
365
376
|
'FDB_CONNECTION': body.fdb_connection,
|
|
366
377
|
'SIMPLYBLOCK_DOCKER_IMAGE': constants.SIMPLY_BLOCK_DOCKER_IMAGE,
|
|
@@ -390,6 +401,27 @@ def spdk_process_start(body: SPDKParams):
|
|
|
390
401
|
)
|
|
391
402
|
logger.info(f"Job deleted: '{job_resp.metadata.name}' in namespace '{namespace}")
|
|
392
403
|
|
|
404
|
+
if core_isolate:
|
|
405
|
+
core_template = env.get_template('storage_core_isolation.yaml.j2')
|
|
406
|
+
core_yaml = yaml.safe_load(core_template.render(values))
|
|
407
|
+
batch_v1 = core_utils.get_k8s_batch_client()
|
|
408
|
+
core_resp = batch_v1.create_namespaced_job(namespace=namespace, body=core_yaml)
|
|
409
|
+
msg = f"Job created: '{core_resp.metadata.name}' in namespace '{namespace}"
|
|
410
|
+
logger.info(msg)
|
|
411
|
+
|
|
412
|
+
node_utils_k8s.wait_for_job_completion(core_resp.metadata.name, namespace)
|
|
413
|
+
logger.info(f"Job '{core_resp.metadata.name}' completed successfully")
|
|
414
|
+
|
|
415
|
+
batch_v1.delete_namespaced_job(
|
|
416
|
+
name=core_resp.metadata.name,
|
|
417
|
+
namespace=namespace,
|
|
418
|
+
body=V1DeleteOptions(
|
|
419
|
+
propagation_policy='Foreground',
|
|
420
|
+
grace_period_seconds=0
|
|
421
|
+
)
|
|
422
|
+
)
|
|
423
|
+
logger.info(f"Job deleted: '{core_resp.metadata.name}' in namespace '{namespace}")
|
|
424
|
+
|
|
393
425
|
env = Environment(loader=FileSystemLoader(os.path.join(TOP_DIR, 'templates')), trim_blocks=True, lstrip_blocks=True)
|
|
394
426
|
template = env.get_template('storage_deploy_spdk.yaml.j2')
|
|
395
427
|
dep = yaml.safe_load(template.render(values))
|
|
@@ -49,12 +49,6 @@ def lvol_iostats(uuid, history):
|
|
|
49
49
|
if not lvol:
|
|
50
50
|
return utils.get_response_error(f"LVol not found: {uuid}", 404)
|
|
51
51
|
|
|
52
|
-
pool = db.get_pool_by_id(lvol.pool_uuid)
|
|
53
|
-
if pool.secret:
|
|
54
|
-
req_secret = request.headers.get('secret', "")
|
|
55
|
-
if req_secret != pool.secret:
|
|
56
|
-
return utils.get_response_error("Pool secret doesn't mach the value in the request header", 400)
|
|
57
|
-
|
|
58
52
|
data = lvol_controller.get_io_stats(uuid, history, parse_sizes=False, with_sizes=True)
|
|
59
53
|
ret = {
|
|
60
54
|
"object_data": lvol.get_clean_dict(),
|
|
@@ -69,12 +63,6 @@ def lvol_capacity(uuid, history):
|
|
|
69
63
|
if not lvol:
|
|
70
64
|
return utils.get_response_error(f"LVol not found: {uuid}", 404)
|
|
71
65
|
|
|
72
|
-
pool = db.get_pool_by_id(lvol.pool_uuid)
|
|
73
|
-
if pool.secret:
|
|
74
|
-
req_secret = request.headers.get('secret', "")
|
|
75
|
-
if req_secret != pool.secret:
|
|
76
|
-
return utils.get_response_error("Pool secret doesn't mach the value in the request header", 400)
|
|
77
|
-
|
|
78
66
|
data = lvol_controller.get_capacity(uuid, history, parse_sizes=False)
|
|
79
67
|
out = []
|
|
80
68
|
if data:
|