sbcli-pre 1.4.4__zip → 1.4.6__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/PKG-INFO +11 -1
  2. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/env_var +1 -1
  3. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/sbcli_pre.egg-info/PKG-INFO +11 -1
  4. sbcli_pre-1.4.6/sbcli_pre.egg-info/requires.txt +18 -0
  5. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/setup.py +10 -0
  6. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/cnode_client.py +11 -0
  7. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/constants.py +1 -1
  8. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/caching_node_controller.py +48 -15
  9. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/storage_node.py +3 -4
  10. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/deploy_stack.sh +9 -0
  11. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +5 -14
  12. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/caching_node_monitor.py +2 -14
  13. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/cap_monitor.py +2 -15
  14. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/capacity_and_stats_collector.py +3 -13
  15. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/device_monitor.py +2 -14
  16. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/distr_event_collector.py +3 -14
  17. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/health_check_service.py +4 -15
  18. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/lvol_monitor.py +5 -17
  19. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/lvol_stat_collector.py +3 -15
  20. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/mgmt_node_monitor.py +2 -12
  21. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/port_stat_collector.py +3 -16
  22. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/storage_node_monitor.py +3 -17
  23. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/tasks_runner_migration.py +2 -14
  24. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/tasks_runner_restart.py +2 -15
  25. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/storage_node_ops.py +91 -87
  26. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/utils.py +15 -0
  27. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/app.py +1 -2
  28. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/caching_node_ops.py +72 -1
  29. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/caching_node_ops_k8s.py +76 -1
  30. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/snode_ops.py +42 -42
  31. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/templates/deploy_spdk.yaml.j2 +8 -3
  32. sbcli_pre-1.4.4/sbcli_pre.egg-info/requires.txt +0 -8
  33. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/README.md +0 -0
  34. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/pyproject.toml +0 -0
  35. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/sbcli_pre.egg-info/SOURCES.txt +0 -0
  36. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/sbcli_pre.egg-info/dependency_links.txt +0 -0
  37. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/sbcli_pre.egg-info/entry_points.txt +0 -0
  38. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/sbcli_pre.egg-info/top_level.txt +0 -0
  39. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/setup.cfg +0 -0
  40. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_cli/cli.py +0 -0
  41. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_cli/main.py +0 -0
  42. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/__init__.py +0 -0
  43. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/cluster_ops.py +0 -0
  44. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/compute_node_ops.py +0 -0
  45. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/__init__.py +0 -0
  46. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/cluster_events.py +0 -0
  47. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/device_controller.py +0 -0
  48. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/device_events.py +0 -0
  49. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/events_controller.py +0 -0
  50. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/health_controller.py +0 -0
  51. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/lvol_controller.py +0 -0
  52. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/lvol_events.py +0 -0
  53. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/mgmt_events.py +0 -0
  54. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/pool_controller.py +0 -0
  55. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/pool_events.py +0 -0
  56. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  57. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/snapshot_events.py +0 -0
  58. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/storage_events.py +0 -0
  59. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/tasks_controller.py +0 -0
  60. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/controllers/tasks_events.py +0 -0
  61. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/distr_controller.py +0 -0
  62. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/kv_store.py +0 -0
  63. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/mgmt_node_ops.py +0 -0
  64. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/__init__.py +0 -0
  65. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/base_model.py +0 -0
  66. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/caching_node.py +0 -0
  67. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/cluster.py +0 -0
  68. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/compute_node.py +0 -0
  69. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/deployer.py +0 -0
  70. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/events.py +0 -0
  71. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/global_settings.py +0 -0
  72. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/iface.py +0 -0
  73. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/job_schedule.py +0 -0
  74. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/lvol_model.py +0 -0
  75. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/mgmt_node.py +0 -0
  76. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/nvme_device.py +0 -0
  77. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/pool.py +0 -0
  78. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/port_stat.py +0 -0
  79. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/snapshot.py +0 -0
  80. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/models/stats.py +0 -0
  81. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/pci_utils.py +0 -0
  82. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/rpc_client.py +0 -0
  83. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/__init__.py +0 -0
  84. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  85. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  86. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  87. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/config_docker.sh +0 -0
  88. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/dashboard.yml +0 -0
  89. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  90. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  91. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  92. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  93. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  94. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  95. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/datasource.yml +0 -0
  96. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/db_config_double.sh +0 -0
  97. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/db_config_single.sh +0 -0
  98. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
  99. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/haproxy.cfg +0 -0
  100. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/install_deps.sh +0 -0
  101. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/objstore.yml +0 -0
  102. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/prometheus.yml +0 -0
  103. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/run_ssh.sh +0 -0
  104. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/set_db_config.sh +0 -0
  105. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  106. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/__init__.py +0 -0
  107. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/install_service.sh +0 -0
  108. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/log_agg_service.py +0 -0
  109. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/remove_service.sh +0 -0
  110. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/services/service_template.service +0 -0
  111. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/shell_utils.py +0 -0
  112. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_core/snode_client.py +0 -0
  113. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/__init__.py +0 -0
  114. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/auth_middleware.py +0 -0
  115. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/__init__.py +0 -0
  116. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  117. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  118. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  119. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  120. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  121. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  122. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_device.py +0 -0
  123. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  124. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  125. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  126. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  127. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  128. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/caching_node_app.py +0 -0
  129. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/caching_node_app_k8s.py +0 -0
  130. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/node_utils.py +0 -0
  131. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/node_webapp.py +0 -0
  132. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/snode_app.py +0 -0
  133. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/static/delete.py +0 -0
  134. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/static/deploy.py +0 -0
  135. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  136. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  137. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/static/is_up.py +0 -0
  138. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/static/list_deps.py +0 -0
  139. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/static/rpac.yaml +0 -0
  140. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/static/tst.py +0 -0
  141. {sbcli_pre-1.4.4 → sbcli_pre-1.4.6}/simplyblock_web/utils.py +0 -0
@@ -1,18 +1,14 @@
1
1
  # coding=utf-8
2
- import logging
3
- import os
4
-
5
2
  import time
6
- import sys
7
-
8
3
  import psutil
9
4
 
10
5
 
11
6
  from simplyblock_core import constants, kv_store, utils
12
7
  from simplyblock_core.models.port_stat import PortStat
13
8
 
14
- # Import the GELF logger
15
- from graypy import GELFUDPHandler
9
+
10
+ logger = utils.get_logger(__name__)
11
+
16
12
 
17
13
  def update_port_stats(snode, nic, stats):
18
14
  now = int(time.time())
@@ -40,15 +36,6 @@ def update_port_stats(snode, nic, stats):
40
36
  return
41
37
 
42
38
 
43
- # configure logging
44
- logger_handler = logging.StreamHandler(stream=sys.stdout)
45
- logger_handler.setFormatter(logging.Formatter('%(asctime)s: %(levelname)s: %(message)s'))
46
- gelf_handler = GELFUDPHandler('0.0.0.0', constants.GELF_PORT)
47
- logger = logging.getLogger()
48
- logger.addHandler(gelf_handler)
49
- logger.addHandler(logger_handler)
50
- logger.setLevel(logging.DEBUG)
51
-
52
39
  # get DB controller
53
40
  db_controller = kv_store.DBController()
54
41
 
@@ -1,29 +1,15 @@
1
1
  # coding=utf-8
2
- import logging
3
- import os
4
-
5
2
  import time
6
- import sys
7
- from datetime import datetime
8
3
 
9
4
 
10
- from simplyblock_core import constants, kv_store, cluster_ops, storage_node_ops, distr_controller
5
+ from simplyblock_core import constants, kv_store, cluster_ops, storage_node_ops, utils
11
6
  from simplyblock_core.controllers import health_controller, device_controller, tasks_controller
12
7
  from simplyblock_core.models.cluster import Cluster
13
8
  from simplyblock_core.models.nvme_device import NVMeDevice
14
9
  from simplyblock_core.models.storage_node import StorageNode
15
10
 
16
- # Import the GELF logger
17
- from graypy import GELFUDPHandler
18
-
19
- # configure logging
20
- logger_handler = logging.StreamHandler(stream=sys.stdout)
21
- logger_handler.setFormatter(logging.Formatter('%(asctime)s: %(levelname)s: %(message)s'))
22
- gelf_handler = GELFUDPHandler('0.0.0.0', constants.GELF_PORT)
23
- logger = logging.getLogger()
24
- logger.addHandler(gelf_handler)
25
- logger.addHandler(logger_handler)
26
- logger.setLevel(logging.DEBUG)
11
+
12
+ logger = utils.get_logger(__name__)
27
13
 
28
14
 
29
15
  # get DB controller
@@ -1,16 +1,13 @@
1
1
  # coding=utf-8
2
- import logging
3
2
  import time
4
- import sys
5
3
 
6
4
 
7
- from simplyblock_core import constants, kv_store
5
+ from simplyblock_core import constants, kv_store, utils
8
6
  from simplyblock_core.controllers import tasks_events
9
7
  from simplyblock_core.models.job_schedule import JobSchedule
10
8
 
11
9
 
12
- # Import the GELF logger
13
- from graypy import GELFUDPHandler
10
+ logger = utils.get_logger(__name__)
14
11
 
15
12
 
16
13
  def task_runner(task):
@@ -28,15 +25,6 @@ def task_runner(task):
28
25
  return True
29
26
 
30
27
 
31
- # configure logging
32
- logger_handler = logging.StreamHandler(stream=sys.stdout)
33
- logger_handler.setFormatter(logging.Formatter('%(asctime)s: %(levelname)s: %(message)s'))
34
- gelf_handler = GELFUDPHandler('0.0.0.0', constants.GELF_PORT)
35
- logger = logging.getLogger()
36
- logger.addHandler(gelf_handler)
37
- logger.addHandler(logger_handler)
38
- logger.setLevel(logging.DEBUG)
39
-
40
28
  # get DB controller
41
29
  db_controller = kv_store.DBController()
42
30
 
@@ -1,28 +1,15 @@
1
1
  # coding=utf-8
2
- import logging
3
2
  import time
4
- import sys
5
3
 
6
4
 
7
- from simplyblock_core import constants, kv_store, storage_node_ops
5
+ from simplyblock_core import constants, kv_store, storage_node_ops, utils
8
6
  from simplyblock_core.controllers import device_controller, tasks_events, health_controller
9
7
  from simplyblock_core.models.job_schedule import JobSchedule
10
8
  from simplyblock_core.models.nvme_device import NVMeDevice
11
-
12
- # Import the GELF logger
13
- from graypy import GELFUDPHandler
14
-
15
9
  from simplyblock_core.models.storage_node import StorageNode
16
10
 
17
11
 
18
- # configure logging
19
- logger_handler = logging.StreamHandler(stream=sys.stdout)
20
- logger_handler.setFormatter(logging.Formatter('%(asctime)s: %(levelname)s: %(message)s'))
21
- gelf_handler = GELFUDPHandler('0.0.0.0', constants.GELF_PORT)
22
- logger = logging.getLogger()
23
- logger.addHandler(gelf_handler)
24
- logger.addHandler(logger_handler)
25
- logger.setLevel(logging.DEBUG)
12
+ logger = utils.get_logger(__name__)
26
13
 
27
14
  # get DB controller
28
15
  db_controller = kv_store.DBController()
@@ -95,35 +95,40 @@ def addNvmeDevices(cluster, rpc_client, devs, snode):
95
95
 
96
96
  if pcie in ctr_map:
97
97
  nvme_controller = ctr_map[pcie]
98
+ nvme_bdevs = []
99
+ for bdev in rpc_client.get_bdevs():
100
+ if bdev['name'].startswith(nvme_controller):
101
+ nvme_bdevs.append(bdev['name'])
98
102
  else:
99
- nvme_controller = "nvme_%s" % index
100
- ret, err = rpc_client.bdev_nvme_controller_attach(nvme_controller, pcie)
103
+ pci_st = str(pcie).replace("0", "").replace(":", "").replace(".", "")
104
+ nvme_controller = "nvme_%s" % pci_st
105
+ nvme_bdevs, err = rpc_client.bdev_nvme_controller_attach(nvme_controller, pcie)
101
106
  time.sleep(2)
102
107
 
103
- nvme_bdev = f"{nvme_controller}n1"
104
- rpc_client.bdev_examine(nvme_bdev)
105
- time.sleep(5)
106
- ret = rpc_client.get_bdevs(nvme_bdev)
107
- nvme_dict = ret[0]
108
- nvme_driver_data = nvme_dict['driver_specific']['nvme'][0]
109
- model_number = nvme_driver_data['ctrlr_data']['model_number']
110
- total_size = nvme_dict['block_size'] * nvme_dict['num_blocks']
111
-
112
- devices.append(
113
- NVMeDevice({
114
- 'uuid': str(uuid.uuid4()),
115
- 'device_name': nvme_dict['name'],
116
- 'size': total_size,
117
- 'physical_label': next_physical_label,
118
- 'pcie_address': nvme_driver_data['pci_address'],
119
- 'model_id': model_number,
120
- 'serial_number': nvme_driver_data['ctrlr_data']['serial_number'],
121
- 'nvme_bdev': nvme_bdev,
122
- 'nvme_controller': nvme_controller,
123
- 'node_id': snode.get_id(),
124
- 'cluster_id': snode.cluster_id,
125
- 'status': NVMeDevice.STATUS_ONLINE
126
- }))
108
+ for nvme_bdev in nvme_bdevs:
109
+ rpc_client.bdev_examine(nvme_bdev)
110
+ time.sleep(3)
111
+ ret = rpc_client.get_bdevs(nvme_bdev)
112
+ nvme_dict = ret[0]
113
+ nvme_driver_data = nvme_dict['driver_specific']['nvme'][0]
114
+ model_number = nvme_driver_data['ctrlr_data']['model_number']
115
+ total_size = nvme_dict['block_size'] * nvme_dict['num_blocks']
116
+
117
+ devices.append(
118
+ NVMeDevice({
119
+ 'uuid': str(uuid.uuid4()),
120
+ 'device_name': nvme_dict['name'],
121
+ 'size': total_size,
122
+ 'physical_label': next_physical_label,
123
+ 'pcie_address': nvme_driver_data['pci_address'],
124
+ 'model_id': model_number,
125
+ 'serial_number': nvme_driver_data['ctrlr_data']['serial_number'],
126
+ 'nvme_bdev': nvme_bdev,
127
+ 'nvme_controller': nvme_controller,
128
+ 'node_id': snode.get_id(),
129
+ 'cluster_id': snode.cluster_id,
130
+ 'status': NVMeDevice.STATUS_ONLINE
131
+ }))
127
132
  next_physical_label += 1
128
133
  return devices
129
134
 
@@ -601,40 +606,27 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
601
606
  logger.error(f"This node is part of another cluster: {node_info['cluster_id']}")
602
607
  return False
603
608
 
604
- ec2_metadata = None
605
- if "ec2_metadata" in node_info and node_info['ec2_metadata']:
606
- ec2_metadata = node_info['ec2_metadata']
607
- """"
608
- "ec2_metadata": {
609
- "accountId": "565979732541",
610
- "architecture": "x86_64",
611
- "availabilityZone": "eu-west-1a",
612
- "billingProducts": [
613
- "bp-6fa54006"
614
- ],
615
- "devpayProductCodes": null,
616
- "imageId": "ami-08e592fbb0f535224",
617
- "instanceId": "i-0ba9e766df57bc62c",
618
- "instanceType": "m6id.large",
619
- "kernelId": null,
620
- "marketplaceProductCodes": null,
621
- "pendingTime": "2024-03-24T19:39:14Z",
622
- "privateIp": "172.31.23.236",
623
- "ramdiskId": null,
624
- "region": "eu-west-1",
625
- "version": "2017-09-30"
626
- }
627
- """""
628
- logger.debug(json.dumps(ec2_metadata,indent=2))
629
- logger.info(f"EC2 Instance found: {ec2_metadata['instanceId']}")
630
- logger.info(f"EC2 Instance type: {ec2_metadata['instanceType']}")
631
- logger.info(f"EC2 Instance privateIp: {ec2_metadata['privateIp']}")
632
- logger.info(f"EC2 Instance region: {ec2_metadata['region']}")
633
-
634
- for node in db_controller.get_storage_nodes():
635
- if node.ec2_instance_id and node.ec2_instance_id == ec2_metadata['instanceId']:
636
- logger.error(f"Node already exists, try remove it first: {ec2_metadata['instanceId']}")
637
- return False
609
+ cloud_instance = node_info['cloud_instance']
610
+ """"
611
+ "cloud_instance": {
612
+ "id": "565979732541",
613
+ "type": "m6id.large",
614
+ "cloud": "google",
615
+ "ip": "10.10.10.10",
616
+ "public_ip": "20.20.20.20",
617
+ }
618
+ """""
619
+ logger.debug(json.dumps(cloud_instance, indent=2))
620
+ logger.info(f"Instance id: {cloud_instance['id']}")
621
+ logger.info(f"Instance cloud: {cloud_instance['cloud']}")
622
+ logger.info(f"Instance type: {cloud_instance['type']}")
623
+ logger.info(f"Instance privateIp: {cloud_instance['ip']}")
624
+ logger.info(f"Instance public_ip: {cloud_instance['public_ip']}")
625
+
626
+ for node in db_controller.get_storage_nodes():
627
+ if node.cloud_instance_id and node.cloud_instance_id == cloud_instance['id']:
628
+ logger.error(f"Node already exists, try remove it first: {cloud_instance['id']}")
629
+ return False
638
630
 
639
631
  # Tune cpu maks parameters
640
632
  cpu_count = node_info["cpu_count"]
@@ -662,18 +654,19 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
662
654
  distrib_cpu_mask = utils.generate_mask(distrib_cpu_cores)
663
655
 
664
656
  # Calculate pool count
665
- if ec2_metadata and ec2_metadata.get('instanceType'):
666
- supported_type, storage_devices, device_size = utils.get_total_size_per_instance_type(ec2_metadata["instanceType"])
657
+ if cloud_instance['type']:
658
+ ins_type = cloud_instance['type']
659
+ supported_type, storage_devices, device_size = utils.get_total_size_per_instance_type(ins_type)
667
660
  if not supported_type:
668
- logger.warning(f"Unsupported ec2 instance-type {ec2_metadata['instanceType']} for deployment")
661
+ logger.warning(f"Unsupported instance-type {ins_type} for deployment")
669
662
  if not number_of_devices:
670
- logger.error(f"Unsupported ec2 instance-type {ec2_metadata['instanceType']} "
663
+ logger.error(f"Unsupported instance-type {ins_type} "
671
664
  "for deployment, please specify --number-of-devices")
672
665
  return False
673
666
  else:
674
667
  number_of_devices = storage_devices
675
668
  else:
676
- logger.warning("Can not get ec2 instance type for this instance.")
669
+ logger.warning("Can not get instance type for this instance.")
677
670
  if not number_of_devices:
678
671
  logger.error("Unsupported instance type please specify --number-of-devices.")
679
672
  return False
@@ -696,7 +689,7 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
696
689
  logger.info(f"Total: {utils.humanbytes(memory_details['total'])}")
697
690
  logger.info(f"Free: {utils.humanbytes(memory_details['free'])}")
698
691
  else:
699
- logger.error(f"Cannot get memory info from the ec2 instance.. Exiting")
692
+ logger.error(f"Cannot get memory info from the instance.. Exiting")
700
693
  return False
701
694
 
702
695
  satisfied, spdk_mem = utils.calculate_spdk_memory(minimum_hp_memory,
@@ -750,12 +743,9 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
750
743
  snode.baseboard_sn = node_info['system_id']
751
744
  snode.system_uuid = node_info['system_id']
752
745
 
753
- if ec2_metadata:
754
- snode.ec2_metadata = ec2_metadata
755
- snode.ec2_instance_id = ec2_metadata['instanceId']
756
-
757
- if "ec2_public_ip" in node_info and node_info['ec2_public_ip']:
758
- snode.ec2_public_ip = node_info['ec2_public_ip']
746
+ snode.cloud_instance_id = cloud_instance['id']
747
+ snode.cloud_instance_type = cloud_instance['type']
748
+ snode.cloud_instance_public_ip = cloud_instance['public_ip']
759
749
 
760
750
  snode.hostname = hostname
761
751
  snode.host_nqn = subsystem_nqn
@@ -904,7 +894,7 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
904
894
  ret = rpc_client.bdev_nvme_attach_controller_tcp(name, dev.nvmf_nqn, dev.nvmf_ip, dev.nvmf_port)
905
895
  if not ret:
906
896
  logger.error(f"Failed to connect to device: {name}")
907
- continue
897
+ return False
908
898
 
909
899
  dev.remote_bdev = f"{name}n1"
910
900
  idx = -1
@@ -979,6 +969,12 @@ def remove_storage_node(node_id, force_remove=False, force_migrate=False):
979
969
  if force_remove is False:
980
970
  return False
981
971
 
972
+ task_id = tasks_controller.get_active_node_restart_task(snode.cluster_id, snode.get_id())
973
+ if task_id:
974
+ logger.error(f"Restart task found: {task_id}, can not remove storage node")
975
+ if force_remove is False:
976
+ return False
977
+
982
978
  if snode.lvols:
983
979
  if force_migrate:
984
980
  for lvol_id in snode.lvols:
@@ -1076,6 +1072,12 @@ def restart_storage_node(
1076
1072
  if force is False:
1077
1073
  return False
1078
1074
 
1075
+ task_id = tasks_controller.get_active_node_restart_task(snode.cluster_id, snode.get_id())
1076
+ if task_id:
1077
+ logger.error(f"Restart task found: {task_id}, can not restart storage node")
1078
+ if force is False:
1079
+ return False
1080
+
1079
1081
  logger.info("Setting node state to restarting")
1080
1082
  old_status = snode.status
1081
1083
  snode.status = StorageNode.STATUS_RESTARTING
@@ -1088,7 +1090,7 @@ def restart_storage_node(
1088
1090
 
1089
1091
  snode_api = SNodeClient(snode.api_endpoint)
1090
1092
  node_info, _ = snode_api.info()
1091
- logger.info(f"Node info: {node_info}")
1093
+ logger.debug(f"Node info: {node_info}")
1092
1094
 
1093
1095
  logger.info("Restarting SPDK")
1094
1096
 
@@ -1104,20 +1106,20 @@ def restart_storage_node(
1104
1106
  snode.spdk_image = img
1105
1107
 
1106
1108
  # Calculate pool count
1107
- if snode.ec2_metadata and snode.ec2_metadata.get('instanceType'):
1108
- supported_type, storage_devices, device_size = utils.get_total_size_per_instance_type(snode.ec2_metadata["instanceType"])
1109
+ if snode.cloud_instance_type:
1110
+ supported_type, storage_devices, device_size = utils.get_total_size_per_instance_type(snode.cloud_instance_type)
1109
1111
  if not supported_type:
1110
- logger.warning(f"Unsupported ec2 instance-type {snode.ec2_metadata['instanceType']} for deployment")
1112
+ logger.warning(f"Unsupported instance-type {snode.cloud_instance_type} for deployment")
1111
1113
  if not number_of_devices:
1112
1114
  if not snode.number_of_devices:
1113
- logger.error(f"Unsupported ec2 instance-type {snode.ec2_metadata['instanceType']} "
1115
+ logger.error(f"Unsupported instance-type {snode.cloud_instance_type} "
1114
1116
  "for deployment, please specify --number-of-devices")
1115
1117
  return False
1116
1118
  number_of_devices = snode.number_of_devices
1117
1119
  else:
1118
1120
  number_of_devices = storage_devices
1119
1121
  else:
1120
- logger.warning("Can not get ec2 instance type for this instance..")
1122
+ logger.warning("Can not get instance type for this instance..")
1121
1123
  if not number_of_devices:
1122
1124
  if snode.number_of_devices:
1123
1125
  number_of_devices = snode.number_of_devices
@@ -1144,7 +1146,7 @@ def restart_storage_node(
1144
1146
  logger.info(f"Total: {utils.humanbytes(memory_details['total'])}")
1145
1147
  logger.info(f"Free: {utils.humanbytes(memory_details['free'])}")
1146
1148
  else:
1147
- logger.error(f"Cannot get memory info from the ec2 instance.. Exiting")
1149
+ logger.error(f"Cannot get memory info from the instance.. Exiting")
1148
1150
 
1149
1151
  satisfied, spdk_mem = utils.calculate_spdk_memory(minimum_hp_memory,
1150
1152
  minimum_sys_memory,
@@ -1297,10 +1299,15 @@ def restart_storage_node(
1297
1299
  if dev.status != 'online':
1298
1300
  continue
1299
1301
  name = f"remote_{dev.alceml_bdev}"
1302
+ ret = rpc_client.bdev_nvme_controller_list(name)
1303
+ if ret:
1304
+ logger.debug(f"controller found, removing")
1305
+ rpc_client.bdev_nvme_detach_controller(name)
1306
+ time.sleep(1)
1300
1307
  ret = rpc_client.bdev_nvme_attach_controller_tcp(name, dev.nvmf_nqn, dev.nvmf_ip, dev.nvmf_port)
1301
1308
  if not ret:
1302
1309
  logger.warning(f"Failed to connect to device: {name}")
1303
- continue
1310
+ return False
1304
1311
 
1305
1312
  dev.remote_bdev = f"{name}n1"
1306
1313
  idx = -1
@@ -1378,16 +1385,13 @@ def list_storage_nodes(is_json, cluster_id=None):
1378
1385
  "Management IP": node.mgmt_ip,
1379
1386
  "Devices": f"{total_devices}/{online_devices}",
1380
1387
  "LVols": f"{len(node.lvols)}",
1381
- # "Data NICs": "\n".join([d.if_name for d in node.data_nics]),
1382
1388
  "Status": node.status,
1383
1389
  "Health": node.health_check,
1384
1390
 
1385
- "EC2 ID": node.ec2_instance_id,
1386
- "EC2 Type": node.ec2_metadata['instanceType'] if node.ec2_metadata else "",
1387
- "EC2 Ext IP": node.ec2_public_ip,
1391
+ "Cloud ID": node.cloud_instance_id,
1392
+ "Cloud Type": node.cloud_instance_type,
1393
+ "Ext IP": node.cloud_instance_public_ip,
1388
1394
 
1389
- # "Updated At": datetime.datetime.strptime(node.updated_at, "%Y-%m-%d %H:%M:%S.%f").strftime(
1390
- # "%H:%M:%S, %d/%m/%Y"),
1391
1395
  })
1392
1396
 
1393
1397
  if not data:
@@ -5,9 +5,11 @@ import os
5
5
  import random
6
6
  import re
7
7
  import string
8
+ import sys
8
9
 
9
10
  import docker
10
11
  from prettytable import PrettyTable
12
+ from graypy import GELFUDPHandler
11
13
 
12
14
  from simplyblock_core import constants
13
15
  from simplyblock_core import shell_utils
@@ -408,7 +410,20 @@ def get_host_arch():
408
410
  out, _, _ = shell_utils.run_command("uname -m")
409
411
  return out
410
412
 
413
+
411
414
  def decimal_to_hex_power_of_2(decimal_number):
412
415
  power_result = 2 ** decimal_number
413
416
  hex_result = hex(power_result)
414
417
  return hex_result
418
+
419
+
420
+ def get_logger(name):
421
+ logger = logging.getLogger(name)
422
+ logger.setLevel(constants.LOG_LEVEL)
423
+ logger_handler = logging.StreamHandler(stream=sys.stdout)
424
+ logger_handler.setFormatter(logging.Formatter('%(asctime)s: %(levelname)s: %(message)s'))
425
+ logger.addHandler(logger_handler)
426
+
427
+ gelf_handler = GELFUDPHandler('0.0.0.0', constants.GELF_PORT)
428
+ logger.addHandler(gelf_handler)
429
+ return logger
@@ -7,7 +7,7 @@ from flask import Flask
7
7
 
8
8
  import utils
9
9
  from blueprints import web_api_cluster, web_api_mgmt_node, web_api_device, \
10
- web_api_lvol, web_api_storage_node, web_api_pool, web_api_caching_node, web_api_snapshot, web_api_deployer
10
+ web_api_lvol, web_api_storage_node, web_api_pool, web_api_caching_node, web_api_snapshot
11
11
  from auth_middleware import token_required
12
12
  from simplyblock_core import constants
13
13
 
@@ -31,7 +31,6 @@ app.register_blueprint(web_api_snapshot.bp)
31
31
  app.register_blueprint(web_api_storage_node.bp)
32
32
  app.register_blueprint(web_api_pool.bp)
33
33
  app.register_blueprint(web_api_caching_node.bp)
34
- app.register_blueprint(web_api_deployer.bp)
35
34
 
36
35
 
37
36
  @app.before_request
@@ -14,7 +14,7 @@ from flask import Blueprint
14
14
  from flask import request
15
15
 
16
16
  from simplyblock_web import utils, node_utils
17
- from simplyblock_core import scripts, constants
17
+ from simplyblock_core import scripts, constants, shell_utils
18
18
 
19
19
  logger = logging.getLogger(__name__)
20
20
  logger.setLevel(logging.DEBUG)
@@ -392,3 +392,74 @@ def disconnect_all():
392
392
  logger.debug(out)
393
393
  logger.debug(err)
394
394
  return utils.get_response(ret_code)
395
+
396
+
397
+
398
+ @bp.route('/make_gpt_partitions', methods=['POST'])
399
+ def make_gpt_partitions_for_nbd():
400
+ nbd_device = '/dev/nbd0'
401
+ jm_percent = 10
402
+
403
+ try:
404
+ data = request.get_json()
405
+ nbd_device = data['nbd_device']
406
+ jm_percent = data['jm_percent']
407
+ except:
408
+ pass
409
+
410
+ cmd_list = [
411
+ f"parted -fs {nbd_device} mklabel gpt",
412
+ f"parted -f {nbd_device} mkpart journal \"0%\" \"{jm_percent}%\""
413
+ ]
414
+ sg_cmd_list = [
415
+ f"sgdisk -t 1:6527994e-2c5a-4eec-9613-8f5944074e8b {nbd_device}",
416
+ ]
417
+
418
+ for cmd in cmd_list+sg_cmd_list:
419
+ logger.debug(cmd)
420
+ out, err, ret_code = shell_utils.run_command(cmd)
421
+ logger.debug(out)
422
+ logger.debug(ret_code)
423
+ if ret_code != 0:
424
+ logger.error(err)
425
+ return utils.get_response(False, f"Error running cmd: {cmd}, returncode: {ret_code}, output: {out}, err: {err}")
426
+ time.sleep(1)
427
+
428
+ return utils.get_response(True)
429
+
430
+
431
+
432
+ @bp.route('/delete_dev_gpt_partitions', methods=['POST'])
433
+ def delete_gpt_partitions_for_dev():
434
+
435
+ data = request.get_json()
436
+
437
+ if "device_pci" not in data:
438
+ return utils.get_response(False, "Required parameter is missing: device_pci")
439
+
440
+ device_pci = data['device_pci']
441
+
442
+ cmd_list = [
443
+ f"echo -n \"{device_pci}\" > /sys/bus/pci/drivers/uio_pci_generic/unbind",
444
+ f"echo -n \"{device_pci}\" > /sys/bus/pci/drivers/nvme/bind",
445
+ ]
446
+
447
+ for cmd in cmd_list:
448
+ logger.debug(cmd)
449
+ ret = os.popen(cmd).read().strip()
450
+ logger.debug(ret)
451
+ time.sleep(1)
452
+
453
+ device_name = os.popen(f"ls /sys/devices/pci0000:00/{device_pci}/nvme/nvme*/ | grep nvme").read().strip()
454
+ cmd_list = [
455
+ f"parted -fs /dev/{device_name} mklabel gpt",
456
+ f"echo -n \"{device_pci}\" > /sys/bus/pci/drivers/nvme/unbind",
457
+ ]
458
+
459
+ for cmd in cmd_list:
460
+ logger.debug(cmd)
461
+ ret = os.popen(cmd).read().strip()
462
+ logger.debug(ret)
463
+ time.sleep(1)
464
+
465
+ return utils.get_response(True)
@@ -14,7 +14,7 @@ from flask import request
14
14
  from kubernetes.client import ApiException
15
15
  from jinja2 import Environment, FileSystemLoader
16
16
 
17
- from simplyblock_core import constants
17
+ from simplyblock_core import constants, shell_utils
18
18
 
19
19
  from simplyblock_web import utils, node_utils
20
20
 
@@ -111,6 +111,8 @@ def spdk_process_start():
111
111
  else:
112
112
  spdk_mem = 64096
113
113
 
114
+ spdk_mem_gega = int(spdk_mem / 1024)
115
+
114
116
  spdk_image = constants.SIMPLY_BLOCK_SPDK_CORE_IMAGE
115
117
  if node_utils.get_host_arch() == "aarch64":
116
118
  spdk_image = constants.SIMPLY_BLOCK_SPDK_CORE_IMAGE_ARM64
@@ -132,6 +134,7 @@ def spdk_process_start():
132
134
  'SPDK_IMAGE': spdk_image,
133
135
  'SPDK_CPU_MASK': spdk_cpu_mask,
134
136
  'SPDK_MEM': spdk_mem,
137
+ 'MEM_GEGA': spdk_mem_gega,
135
138
  'SERVER_IP': data['server_ip'],
136
139
  'RPC_PORT': data['rpc_port'],
137
140
  'RPC_USERNAME': data['rpc_username'],
@@ -277,3 +280,75 @@ def disconnect_all():
277
280
  logger.debug(out)
278
281
  logger.debug(err)
279
282
  return utils.get_response(ret_code)
283
+
284
+
285
+
286
+
287
+ @bp.route('/make_gpt_partitions', methods=['POST'])
288
+ def make_gpt_partitions_for_nbd():
289
+ nbd_device = '/dev/nbd0'
290
+ jm_percent = 10
291
+
292
+ try:
293
+ data = request.get_json()
294
+ nbd_device = data['nbd_device']
295
+ jm_percent = data['jm_percent']
296
+ except:
297
+ pass
298
+
299
+ cmd_list = [
300
+ f"parted -fs {nbd_device} mklabel gpt",
301
+ f"parted -f {nbd_device} mkpart journal \"0%\" \"{jm_percent}%\""
302
+ ]
303
+ sg_cmd_list = [
304
+ f"sgdisk -t 1:6527994e-2c5a-4eec-9613-8f5944074e8b {nbd_device}",
305
+ ]
306
+
307
+ for cmd in cmd_list+sg_cmd_list:
308
+ logger.debug(cmd)
309
+ out, err, ret_code = shell_utils.run_command(cmd)
310
+ logger.debug(out)
311
+ logger.debug(ret_code)
312
+ if ret_code != 0:
313
+ logger.error(err)
314
+ return utils.get_response(False, f"Error running cmd: {cmd}, returncode: {ret_code}, output: {out}, err: {err}")
315
+ time.sleep(1)
316
+
317
+ return utils.get_response(True)
318
+
319
+
320
+
321
+ @bp.route('/delete_dev_gpt_partitions', methods=['POST'])
322
+ def delete_gpt_partitions_for_dev():
323
+
324
+ data = request.get_json()
325
+
326
+ if "device_pci" not in data:
327
+ return utils.get_response(False, "Required parameter is missing: device_pci")
328
+
329
+ device_pci = data['device_pci']
330
+
331
+ cmd_list = [
332
+ f"echo -n \"{device_pci}\" > /sys/bus/pci/drivers/uio_pci_generic/unbind",
333
+ f"echo -n \"{device_pci}\" > /sys/bus/pci/drivers/nvme/bind",
334
+ ]
335
+
336
+ for cmd in cmd_list:
337
+ logger.debug(cmd)
338
+ ret = os.popen(cmd).read().strip()
339
+ logger.debug(ret)
340
+ time.sleep(1)
341
+
342
+ device_name = os.popen(f"ls /sys/devices/pci0000:00/{device_pci}/nvme/nvme*/ | grep nvme").read().strip()
343
+ cmd_list = [
344
+ f"parted -fs /dev/{device_name} mklabel gpt",
345
+ f"echo -n \"{device_pci}\" > /sys/bus/pci/drivers/nvme/unbind",
346
+ ]
347
+
348
+ for cmd in cmd_list:
349
+ logger.debug(cmd)
350
+ ret = os.popen(cmd).read().strip()
351
+ logger.debug(ret)
352
+ time.sleep(1)
353
+
354
+ return utils.get_response(True)