osi-dump 0.1.2.1__tar.gz → 0.1.2.2__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.
Files changed (111) hide show
  1. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/PKG-INFO +1 -1
  2. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/pyproject.toml +1 -1
  3. osi_dump-0.1.2.2/src/osi_dump/api/octavia.py +34 -0
  4. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/load_balancer_batch_handler.py +1 -3
  5. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/role_assignment_batch_handler.py +1 -1
  6. osi_dump-0.1.2.2/src/osi_dump/batch_handler/router_batch_handler.py +49 -0
  7. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/cli.py +14 -0
  8. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py +2 -0
  9. osi_dump-0.1.2.2/src/osi_dump/exporter/router/excel_router_exporter.py +30 -0
  10. osi_dump-0.1.2.2/src/osi_dump/exporter/router/router_exporter.py +7 -0
  11. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +1 -1
  12. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/instance/openstack_instance_importer.py +1 -0
  13. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/load_balancer/openstack_load_balancer_importer.py +14 -7
  14. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py +21 -4
  15. osi_dump-0.1.2.2/src/osi_dump/importer/router/openstack_router_importer.py +86 -0
  16. osi_dump-0.1.2.2/src/osi_dump/importer/router/router_importer.py +9 -0
  17. osi_dump-0.1.2.2/src/osi_dump/model/__init__.py +0 -0
  18. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/image.py +1 -1
  19. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/instance.py +1 -0
  20. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/load_balancer.py +1 -1
  21. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/role_assignment.py +2 -2
  22. osi_dump-0.1.2.2/src/osi_dump/model/router.py +20 -0
  23. osi_dump-0.1.2.2/src/osi_dump/os_connection/__init__.py +0 -0
  24. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/__init__.py +1 -0
  25. osi_dump-0.1.2.2/src/osi_dump/util/panda_excel.py +22 -0
  26. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/PKG-INFO +1 -1
  27. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/SOURCES.txt +9 -0
  28. osi_dump-0.1.2.1/src/osi_dump/api/octavia.py +0 -17
  29. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/README.md +0 -0
  30. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/setup.cfg +0 -0
  31. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/__init__.py +0 -0
  32. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/__main__.py +0 -0
  33. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/api/__init__.py +0 -0
  34. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/api/placement.py +0 -0
  35. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/__init__.py +0 -0
  36. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/flavor_batch_handler.py +0 -0
  37. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/floating_ip_batch_handler.py +0 -0
  38. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/hypervisor_batch_handler.py +0 -0
  39. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/image_batch_handler.py +0 -0
  40. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/instance_batch_handler.py +0 -0
  41. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/project_batch_handler.py +0 -0
  42. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/volume_batch_handler.py +0 -0
  43. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/__init__.py +0 -0
  44. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/flavor/__init__.py +0 -0
  45. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/flavor/excel_flavor_exporter.py +0 -0
  46. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/flavor/flavor_exporter.py +0 -0
  47. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/floating_ip/__init__.py +0 -0
  48. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +0 -0
  49. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py +0 -0
  50. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/hypervisor/__init__.py +0 -0
  51. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +0 -0
  52. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py +0 -0
  53. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/image/__init__.py +0 -0
  54. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/image/excel_image_exporter.py +0 -0
  55. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/image/image_exporter.py +0 -0
  56. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/instance/__init__.py +0 -0
  57. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/instance/excel_instance_exporter.py +0 -0
  58. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/instance/instance_exporter.py +0 -0
  59. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/load_balancer/__init__.py +0 -0
  60. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py +0 -0
  61. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/project/__init__.py +0 -0
  62. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/project/excel_project_exporter.py +0 -0
  63. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/project/project_exporter.py +0 -0
  64. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/role_assignment/__init__.py +0 -0
  65. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py +0 -0
  66. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/role_assignment/role_assignment_exporter.py +0 -0
  67. {osi_dump-0.1.2.1/src/osi_dump/exporter/volume → osi_dump-0.1.2.2/src/osi_dump/exporter/router}/__init__.py +0 -0
  68. {osi_dump-0.1.2.1/src/osi_dump/importer/flavor → osi_dump-0.1.2.2/src/osi_dump/exporter/volume}/__init__.py +0 -0
  69. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/volume/excel_volume_exporter.py +0 -0
  70. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/volume/volume_exporter.py +0 -0
  71. {osi_dump-0.1.2.1/src/osi_dump/importer/floating_ip → osi_dump-0.1.2.2/src/osi_dump/importer/flavor}/__init__.py +0 -0
  72. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/flavor/flavor_importer.py +0 -0
  73. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/flavor/openstack_flavor_importer.py +0 -0
  74. {osi_dump-0.1.2.1/src/osi_dump/importer/hypervisor → osi_dump-0.1.2.2/src/osi_dump/importer/floating_ip}/__init__.py +0 -0
  75. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/floating_ip/floating_ip_importer.py +0 -0
  76. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +0 -0
  77. {osi_dump-0.1.2.1/src/osi_dump/importer/image → osi_dump-0.1.2.2/src/osi_dump/importer/hypervisor}/__init__.py +0 -0
  78. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/hypervisor/hypervisor_importer.py +0 -0
  79. {osi_dump-0.1.2.1/src/osi_dump/importer/instance → osi_dump-0.1.2.2/src/osi_dump/importer/image}/__init__.py +0 -0
  80. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/image/image_importer.py +0 -0
  81. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/image/openstack_image_importer.py +0 -0
  82. {osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer → osi_dump-0.1.2.2/src/osi_dump/importer/instance}/__init__.py +0 -0
  83. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/instance/instance_importer.py +0 -0
  84. {osi_dump-0.1.2.1/src/osi_dump/importer/project → osi_dump-0.1.2.2/src/osi_dump/importer/load_balancer}/__init__.py +0 -0
  85. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/load_balancer/load_balancer_importer.py +0 -0
  86. {osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment → osi_dump-0.1.2.2/src/osi_dump/importer/project}/__init__.py +0 -0
  87. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/project/openstack_project_importer.py +0 -0
  88. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/project/project_importer.py +0 -0
  89. {osi_dump-0.1.2.1/src/osi_dump/importer/volume → osi_dump-0.1.2.2/src/osi_dump/importer/role_assignment}/__init__.py +0 -0
  90. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/role_assignment/role_assignment_importer.py +0 -0
  91. {osi_dump-0.1.2.1/src/osi_dump/model → osi_dump-0.1.2.2/src/osi_dump/importer/router}/__init__.py +0 -0
  92. {osi_dump-0.1.2.1/src/osi_dump/os_connection → osi_dump-0.1.2.2/src/osi_dump/importer/volume}/__init__.py +0 -0
  93. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/volume/openstack_volume_importer.py +0 -0
  94. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/volume/volume_importer.py +0 -0
  95. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/authentication_info.py +0 -0
  96. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/flavor.py +0 -0
  97. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/floating_ip.py +0 -0
  98. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/hypervisor.py +0 -0
  99. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/project.py +0 -0
  100. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/volume.py +0 -0
  101. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/os_connection/get_connections.py +0 -0
  102. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/create_file.py +0 -0
  103. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/excel_autosize_column.py +0 -0
  104. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/excel_sort_sheet.py +0 -0
  105. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/export_data_excel.py +0 -0
  106. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/extract_hostname.py +0 -0
  107. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/validate_dir_path.py +0 -0
  108. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/dependency_links.txt +0 -0
  109. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/entry_points.txt +0 -0
  110. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/requires.txt +0 -0
  111. {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osi-dump
3
- Version: 0.1.2.1
3
+ Version: 0.1.2.2
4
4
  Summary: OpenStack instances information dump tool
5
5
  Author: TVKain
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "osi-dump"
3
- version = "0.1.2.1"
3
+ version = "0.1.2.2"
4
4
  description = "OpenStack instances information dump tool"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "TVKain" }]
@@ -0,0 +1,34 @@
1
+ from openstack.connection import Connection
2
+ from openstack.identity.v3.service import Service
3
+ from openstack.load_balancer.v2.load_balancer import LoadBalancer
4
+
5
+
6
+ def get_load_balancers(connection: Connection) -> list[LoadBalancer]:
7
+ octavia_endpoint = connection.endpoint_for(
8
+ service_type="load-balancer", interface="public"
9
+ )
10
+
11
+ url = f"{octavia_endpoint}/v2.0/lbaas/loadbalancers"
12
+
13
+ response = connection.session.get(url)
14
+
15
+ data = response.json()
16
+
17
+ return data["loadbalancers"]
18
+
19
+
20
+ def get_amphoraes(connection: Connection, load_balancer_id: str) -> list[str]:
21
+
22
+ octavia_endpoint = connection.endpoint_for(
23
+ service_type="load-balancer", interface="public"
24
+ )
25
+
26
+ url = f"{octavia_endpoint}/v2/octavia/amphorae?load_balancer_id={load_balancer_id}&fields=id&fields=compute_id"
27
+
28
+ response = connection.session.get(url)
29
+
30
+ data = response.json()
31
+
32
+ amphoraes = data["amphorae"]
33
+
34
+ return [amphorae["compute_id"] for amphorae in amphoraes]
@@ -34,9 +34,7 @@ class LoadBalancerBatchHandler:
34
34
  for connection in connections:
35
35
  importer = OpenStackLoadBalancerImporter(connection)
36
36
 
37
- sheet_name = (
38
- f"{util.extract_hostname(connection.auth['auth_url'])}-load_balancer"
39
- )
37
+ sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-lb"
40
38
  exporter = ExcelLoadBalancerExporter(
41
39
  sheet_name=sheet_name, output_file=output_file
42
40
  )
@@ -35,7 +35,7 @@ class RoleAssignmentBatchHandler:
35
35
  importer = OpenStackRoleAssignmentImporter(connection)
36
36
 
37
37
  sheet_name = (
38
- f"{util.extract_hostname(connection.auth['auth_url'])}-role_assignment"
38
+ f"{util.extract_hostname(connection.auth['auth_url'])}-role_ass"
39
39
  )
40
40
  exporter = ExcelRoleAssignmentExporter(
41
41
  sheet_name=sheet_name, output_file=output_file
@@ -0,0 +1,49 @@
1
+ import logging
2
+
3
+ from openstack.connection import Connection
4
+
5
+ from osi_dump.exporter.router.router_exporter import (
6
+ RouterExporter,
7
+ )
8
+ from osi_dump.exporter.router.excel_router_exporter import ExcelRouterExporter
9
+
10
+ from osi_dump.importer.router.router_importer import RouterImporter
11
+ from osi_dump.importer.router.openstack_router_importer import (
12
+ OpenStackRouterImporter,
13
+ )
14
+
15
+
16
+ from osi_dump import util
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class RouterBatchHandler:
22
+ def __init__(self):
23
+ self._importer_exporter_list: list[tuple[RouterImporter, RouterExporter]] = []
24
+
25
+ def add_importer_exporter_from_openstack_connections(
26
+ self, connections: list[Connection], output_file: str
27
+ ):
28
+ for connection in connections:
29
+ importer = OpenStackRouterImporter(connection)
30
+
31
+ sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-router"
32
+ exporter = ExcelRouterExporter(
33
+ sheet_name=sheet_name, output_file=output_file
34
+ )
35
+
36
+ self.add_importer_exporter(importer=importer, exporter=exporter)
37
+
38
+ def add_importer_exporter(self, importer: RouterImporter, exporter: RouterExporter):
39
+ self._importer_exporter_list.append((importer, exporter))
40
+
41
+ def process(self):
42
+ for importer, exporter in self._importer_exporter_list:
43
+ try:
44
+ routers = importer.import_routers()
45
+
46
+ exporter.export_routers(routers=routers)
47
+ except Exception as e:
48
+ logger.warning(e)
49
+ logger.warning("Skipping...")
@@ -12,6 +12,7 @@ from osi_dump.batch_handler.load_balancer_batch_handler import LoadBalancerBatch
12
12
  from osi_dump.batch_handler.role_assignment_batch_handler import (
13
13
  RoleAssignmentBatchHandler,
14
14
  )
15
+ from osi_dump.batch_handler.router_batch_handler import RouterBatchHandler
15
16
 
16
17
  app = typer.Typer()
17
18
 
@@ -123,6 +124,16 @@ def _load_balancer(connections, output_path: str):
123
124
  _load_balancer_batch_handler.process()
124
125
 
125
126
 
127
+ def _router(connections, output_path: str):
128
+ _router_batch_handler = RouterBatchHandler()
129
+
130
+ _router_batch_handler.add_importer_exporter_from_openstack_connections(
131
+ connections, output_file=output_path
132
+ )
133
+
134
+ _router_batch_handler.process()
135
+
136
+
126
137
  def inner_main(file_path: str, output_path: str):
127
138
 
128
139
  logger = logging.getLogger(__name__)
@@ -146,6 +157,9 @@ def inner_main(file_path: str, output_path: str):
146
157
  _role_assignment(connections=connections, output_path=output_path)
147
158
 
148
159
  _load_balancer(connections=connections, output_path=output_path)
160
+
161
+ _router(connections=connections, output_path=output_path)
162
+
149
163
  util.excel_autosize_column(output_path)
150
164
 
151
165
  util.excel_sort_sheet(output_path)
@@ -24,6 +24,8 @@ class ExcelLoadBalancerExporter(LoadBalancerExporter):
24
24
  [load_balancer.model_dump() for load_balancer in load_balancers]
25
25
  )
26
26
 
27
+ df = util.expand_list_column(df, "amphoraes")
28
+
27
29
  logger.info(f"Exporting load_balancers for {self.sheet_name}")
28
30
  try:
29
31
  util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
@@ -0,0 +1,30 @@
1
+ import pandas as pd
2
+
3
+ import logging
4
+
5
+ from openpyxl import load_workbook
6
+
7
+ from osi_dump import util
8
+ from osi_dump.exporter.router.router_exporter import RouterExporter
9
+
10
+ from osi_dump.model.router import Router
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class ExcelRouterExporter(RouterExporter):
16
+ def __init__(self, sheet_name: str, output_file: str):
17
+ self.sheet_name = sheet_name
18
+ self.output_file = output_file
19
+
20
+ def export_routers(self, routers: list[Router]):
21
+
22
+ df = pd.DataFrame([router.model_dump() for router in routers])
23
+
24
+ logger.info(f"Exporting routers for {self.sheet_name}")
25
+ try:
26
+ util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
27
+
28
+ logger.info(f"Exported routers for {self.sheet_name}")
29
+ except Exception as e:
30
+ logger.warning(f"Exporting routers for {self.sheet_name} error: {e}")
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class RouterExporter(ABC):
5
+ @abstractmethod
6
+ def export_routers(self, routers, output_file: str):
7
+ pass
@@ -67,7 +67,7 @@ class OpenStackHypervisorImporter(HypervisorImporter):
67
67
 
68
68
  servers = list(
69
69
  self.connection.compute.servers(
70
- details=False, all_project=True, hypervisor=hypervisor.id
70
+ details=True, all_project=True, hypervisor_hostname=hypervisor.name
71
71
  )
72
72
  )
73
73
 
@@ -96,6 +96,7 @@ class OpenStackInstanceImporter(InstanceImporter):
96
96
  private_v4_ips=private_v4_ips,
97
97
  floating_ip=floating_ip,
98
98
  status=server.status,
99
+ hypervisor=server.hypervisor_hostname,
99
100
  ram=server.flavor["ram"],
100
101
  vcpus=server.flavor["vcpus"],
101
102
  created_at=server.created_at,
@@ -11,6 +11,8 @@ from osi_dump.importer.load_balancer.load_balancer_importer import (
11
11
  )
12
12
  from osi_dump.model.load_balancer import LoadBalancer
13
13
 
14
+ import osi_dump.api.octavia as octavia_api
15
+
14
16
  logger = logging.getLogger(__name__)
15
17
 
16
18
 
@@ -31,12 +33,12 @@ class OpenStackLoadBalancerImporter(LoadBalancerImporter):
31
33
  logger.info(f"Importing load_balancers for {self.connection.auth['auth_url']}")
32
34
 
33
35
  try:
34
- osload_balancers: list[OSLoadBalancer] = list(
35
- self.connection.network.load_balancers()
36
+ osload_balancers: list[OSLoadBalancer] = octavia_api.get_load_balancers(
37
+ connection=self.connection
36
38
  )
37
39
  except Exception as e:
38
40
  raise Exception(
39
- f"Can not fetch load_balancers for {self.connection.auth['auth_url']}"
41
+ f"Can not fetch load_balancers for {self.connection.auth['auth_url']} {e}"
40
42
  ) from e
41
43
 
42
44
  load_balancers: list[LoadBalancer] = []
@@ -55,11 +57,16 @@ class OpenStackLoadBalancerImporter(LoadBalancerImporter):
55
57
 
56
58
  def _get_load_balancer_info(self, load_balancer: OSLoadBalancer) -> LoadBalancer:
57
59
 
60
+ amphoraes = octavia_api.get_amphoraes(
61
+ connection=self.connection, load_balancer_id=load_balancer["id"]
62
+ )
63
+
58
64
  load_balancer_ret = LoadBalancer(
59
- id=load_balancer.id,
60
- load_balancer_name=load_balancer.name,
61
- status=load_balancer.operating_status,
62
- project_id=load_balancer.project_id,
65
+ id=load_balancer["id"],
66
+ load_balancer_name=load_balancer["name"],
67
+ status=load_balancer["operating_status"],
68
+ project_id=load_balancer["project_id"],
69
+ amphoraes=amphoraes,
63
70
  )
64
71
 
65
72
  return load_balancer_ret
@@ -58,6 +58,19 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
58
58
  self, role_assignment: OSRoleAssignment
59
59
  ) -> RoleAssignment:
60
60
 
61
+ user_id = None
62
+ role_id = None
63
+
64
+ try:
65
+ user_id = role_assignment.user["id"]
66
+ except Exception as e:
67
+ logger.warning(f"Can not get user id: {e}")
68
+
69
+ try:
70
+ role_id = role_assignment.role["id"]
71
+ except Exception as e:
72
+ logger.warning(f"Can not get role id: {e}")
73
+
61
74
  user_name = None
62
75
  role_name = None
63
76
 
@@ -65,17 +78,21 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
65
78
  role_name = self.connection.identity.get_role(
66
79
  role_assignment.role["id"]
67
80
  ).name
81
+
82
+ except Exception as e:
83
+ logger.warning(f"Can not get role name: {e}")
84
+
85
+ try:
68
86
  user_name = self.connection.identity.get_user(
69
87
  role_assignment.user["id"]
70
88
  ).name
71
-
72
89
  except Exception as e:
73
- logger.warning("Can not get role name or user name")
90
+ logger.warning(f"Can not get user name: {e}")
74
91
 
75
92
  role_assignment_ret = RoleAssignment(
76
- user_id=role_assignment.user["id"],
93
+ user_id=user_id,
77
94
  user_name=user_name,
78
- role_id=role_assignment.role["id"],
95
+ role_id=role_id,
79
96
  role_name=role_name,
80
97
  scope=role_assignment.scope,
81
98
  )
@@ -0,0 +1,86 @@
1
+ import logging
2
+
3
+ import concurrent
4
+
5
+ from openstack.connection import Connection
6
+ from openstack.network.v2.router import Router as OSRouter
7
+
8
+ from osi_dump.importer.router.router_importer import (
9
+ RouterImporter,
10
+ )
11
+ from osi_dump.model.router import Router
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class OpenStackRouterImporter(RouterImporter):
17
+ def __init__(self, connection: Connection):
18
+ self.connection = connection
19
+
20
+ def import_routers(self) -> list[Router]:
21
+ """Import routers information from Openstack
22
+
23
+ Raises:
24
+ Exception: Raises exception if fetching router failed
25
+
26
+ Returns:
27
+ list[Router]: _description_
28
+ """
29
+
30
+ logger.info(f"Importing routers for {self.connection.auth['auth_url']}")
31
+
32
+ try:
33
+ osrouters: list[OSRouter] = list(self.connection.network.routers())
34
+ except Exception as e:
35
+ raise Exception(
36
+ f"Can not fetch routers for {self.connection.auth['auth_url']}"
37
+ ) from e
38
+
39
+ routers: list[Router] = []
40
+
41
+ with concurrent.futures.ThreadPoolExecutor() as executor:
42
+ futures = [
43
+ executor.submit(self._get_router_info, router) for router in osrouters
44
+ ]
45
+ for future in concurrent.futures.as_completed(futures):
46
+ routers.append(future.result())
47
+
48
+ logger.info(f"Imported routers for {self.connection.auth['auth_url']}")
49
+
50
+ return routers
51
+
52
+ def _get_router_info(self, router: OSRouter) -> Router:
53
+ """
54
+ {"network_id": "49760654-71d8-4967-8fdd-5a35d3ff78ef", "external_fixed_ips": [{"subnet_id": |
55
+ | | "c044a5c0-4b11-4d8d-ae5e-9ff4ce6c1be6", "ip_address": "10.0.2.188"}], "enable_snat": true}
56
+ """
57
+
58
+ external_net_id = None
59
+
60
+ try:
61
+ external_net_id = router.external_gateway_info["network_id"]
62
+ except Exception as e:
63
+ logger.warning(f"Could not get external net id for router: {router.id}")
64
+
65
+ external_net_ip = None
66
+
67
+ try:
68
+ external_net_ip = router.external_gateway_info["external_fixed_ips"][0][
69
+ "ip_address"
70
+ ]
71
+
72
+ except Exception as e:
73
+ logger.warning(f"Could not get external net ip for router {router.id}")
74
+
75
+ router_ret = Router(
76
+ router_id=router.id,
77
+ name=router.name,
78
+ external_net_id=external_net_id,
79
+ external_net_ip=external_net_ip,
80
+ status=router.status,
81
+ project_id=router.project_id,
82
+ created_at=router.created_at,
83
+ updated_at=router.updated_at,
84
+ )
85
+
86
+ return router_ret
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from osi_dump.model.router import Router
4
+
5
+
6
+ class RouterImporter(ABC):
7
+ @abstractmethod
8
+ def import_routers(self) -> list[Router]:
9
+ pass
File without changes
@@ -19,7 +19,7 @@ class Image(BaseModel):
19
19
  protected: bool
20
20
  status: str
21
21
  size: int
22
- virtual_size: int
22
+ virtual_size: Optional[int]
23
23
  visibility: str
24
24
 
25
25
  created_at: str
@@ -16,5 +16,6 @@ class Instance(BaseModel):
16
16
  status: str
17
17
  ram: int
18
18
  vcpus: int
19
+ hypervisor: Optional[str]
19
20
  created_at: str
20
21
  updated_at: str
@@ -12,6 +12,6 @@ class LoadBalancer(BaseModel):
12
12
 
13
13
  status: str
14
14
 
15
- # amphora_id: Optional[str]
15
+ amphoraes: list[str]
16
16
 
17
17
  project_id: Optional[str]
@@ -6,11 +6,11 @@ from pydantic import BaseModel, ConfigDict, ValidationError
6
6
  class RoleAssignment(BaseModel):
7
7
  model_config = ConfigDict(strict=True)
8
8
 
9
- user_id: str
9
+ user_id: Optional[str]
10
10
 
11
11
  user_name: Optional[str]
12
12
 
13
- role_id: str
13
+ role_id: Optional[str]
14
14
 
15
15
  role_name: Optional[str]
16
16
 
@@ -0,0 +1,20 @@
1
+ from typing import Optional
2
+
3
+ from pydantic import BaseModel, ConfigDict, ValidationError
4
+
5
+
6
+ class Router(BaseModel):
7
+ model_config = ConfigDict(strict=True)
8
+
9
+ router_id: str
10
+
11
+ name: Optional[str]
12
+
13
+ external_net_id: Optional[str]
14
+ external_net_ip: Optional[str]
15
+
16
+ status: str
17
+ project_id: Optional[str]
18
+
19
+ created_at: str
20
+ updated_at: str
@@ -4,3 +4,4 @@ from .create_file import create_file
4
4
  from .export_data_excel import export_data_excel
5
5
  from .excel_sort_sheet import excel_sort_sheet
6
6
  from .validate_dir_path import validate_dir_path
7
+ from .panda_excel import expand_list_column
@@ -0,0 +1,22 @@
1
+ import pandas as pd
2
+
3
+ from pandas import DataFrame
4
+
5
+
6
+ def expand_list_column(df: DataFrame, column: str) -> DataFrame:
7
+ # Find the maximum length of the list in the column
8
+ max_len = df[column].apply(len).max()
9
+
10
+ # Create a DataFrame from the list column
11
+ expanded_df = pd.DataFrame(
12
+ df[column].apply(lambda x: x + [None] * (max_len - len(x))).tolist(),
13
+ index=df.index,
14
+ )
15
+
16
+ # Rename the columns
17
+ expanded_df.columns = [f"{column}_{i+1}" for i in range(expanded_df.shape[1])]
18
+
19
+ # Drop the original column and join the expanded columns
20
+ df = df.drop(column, axis=1).join(expanded_df)
21
+
22
+ return df
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osi-dump
3
- Version: 0.1.2.1
3
+ Version: 0.1.2.2
4
4
  Summary: OpenStack instances information dump tool
5
5
  Author: TVKain
6
6
  License: Apache-2.0
@@ -21,6 +21,7 @@ src/osi_dump/batch_handler/instance_batch_handler.py
21
21
  src/osi_dump/batch_handler/load_balancer_batch_handler.py
22
22
  src/osi_dump/batch_handler/project_batch_handler.py
23
23
  src/osi_dump/batch_handler/role_assignment_batch_handler.py
24
+ src/osi_dump/batch_handler/router_batch_handler.py
24
25
  src/osi_dump/batch_handler/volume_batch_handler.py
25
26
  src/osi_dump/exporter/__init__.py
26
27
  src/osi_dump/exporter/flavor/__init__.py
@@ -47,6 +48,9 @@ src/osi_dump/exporter/project/project_exporter.py
47
48
  src/osi_dump/exporter/role_assignment/__init__.py
48
49
  src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py
49
50
  src/osi_dump/exporter/role_assignment/role_assignment_exporter.py
51
+ src/osi_dump/exporter/router/__init__.py
52
+ src/osi_dump/exporter/router/excel_router_exporter.py
53
+ src/osi_dump/exporter/router/router_exporter.py
50
54
  src/osi_dump/exporter/volume/__init__.py
51
55
  src/osi_dump/exporter/volume/excel_volume_exporter.py
52
56
  src/osi_dump/exporter/volume/volume_exporter.py
@@ -74,6 +78,9 @@ src/osi_dump/importer/project/project_importer.py
74
78
  src/osi_dump/importer/role_assignment/__init__.py
75
79
  src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py
76
80
  src/osi_dump/importer/role_assignment/role_assignment_importer.py
81
+ src/osi_dump/importer/router/__init__.py
82
+ src/osi_dump/importer/router/openstack_router_importer.py
83
+ src/osi_dump/importer/router/router_importer.py
77
84
  src/osi_dump/importer/volume/__init__.py
78
85
  src/osi_dump/importer/volume/openstack_volume_importer.py
79
86
  src/osi_dump/importer/volume/volume_importer.py
@@ -87,6 +94,7 @@ src/osi_dump/model/instance.py
87
94
  src/osi_dump/model/load_balancer.py
88
95
  src/osi_dump/model/project.py
89
96
  src/osi_dump/model/role_assignment.py
97
+ src/osi_dump/model/router.py
90
98
  src/osi_dump/model/volume.py
91
99
  src/osi_dump/os_connection/__init__.py
92
100
  src/osi_dump/os_connection/get_connections.py
@@ -96,4 +104,5 @@ src/osi_dump/util/excel_autosize_column.py
96
104
  src/osi_dump/util/excel_sort_sheet.py
97
105
  src/osi_dump/util/export_data_excel.py
98
106
  src/osi_dump/util/extract_hostname.py
107
+ src/osi_dump/util/panda_excel.py
99
108
  src/osi_dump/util/validate_dir_path.py
@@ -1,17 +0,0 @@
1
- from openstack.connection import Connection
2
- from openstack.identity.v3.service import Service
3
-
4
-
5
- def get_amphorae(connection: Connection, load_balancer_id: str) -> str | None:
6
-
7
- octavia_endpoint = connection.endpoint_for(
8
- service_type="octavia", interface="public"
9
- )
10
-
11
- url = f"{octavia_endpoint}/v2/octavia/amphorae"
12
-
13
- response = connection.session.get(url)
14
-
15
- data = response.json()
16
-
17
- return data["usages"]
File without changes
File without changes