osi-dump 0.1.2__tar.gz → 0.1.2.1__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 (101) hide show
  1. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/PKG-INFO +1 -1
  2. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/pyproject.toml +1 -1
  3. osi_dump-0.1.2.1/src/osi_dump/api/octavia.py +17 -0
  4. osi_dump-0.1.2.1/src/osi_dump/batch_handler/flavor_batch_handler.py +51 -0
  5. osi_dump-0.1.2.1/src/osi_dump/batch_handler/image_batch_handler.py +51 -0
  6. osi_dump-0.1.2.1/src/osi_dump/batch_handler/load_balancer_batch_handler.py +61 -0
  7. osi_dump-0.1.2.1/src/osi_dump/batch_handler/role_assignment_batch_handler.py +61 -0
  8. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/cli.py +57 -0
  9. osi_dump-0.1.2.1/src/osi_dump/exporter/flavor/excel_flavor_exporter.py +30 -0
  10. osi_dump-0.1.2.1/src/osi_dump/exporter/flavor/flavor_exporter.py +7 -0
  11. osi_dump-0.1.2.1/src/osi_dump/exporter/image/excel_image_exporter.py +28 -0
  12. osi_dump-0.1.2.1/src/osi_dump/exporter/image/image_exporter.py +7 -0
  13. osi_dump-0.1.2.1/src/osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py +33 -0
  14. osi_dump-0.1.2.1/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py +7 -0
  15. osi_dump-0.1.2.1/src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py +35 -0
  16. osi_dump-0.1.2.1/src/osi_dump/exporter/role_assignment/role_assignment_exporter.py +7 -0
  17. osi_dump-0.1.2.1/src/osi_dump/importer/flavor/flavor_importer.py +9 -0
  18. osi_dump-0.1.2.1/src/osi_dump/importer/flavor/openstack_flavor_importer.py +64 -0
  19. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +10 -1
  20. osi_dump-0.1.2.1/src/osi_dump/importer/image/__init__.py +0 -0
  21. osi_dump-0.1.2.1/src/osi_dump/importer/image/image_importer.py +9 -0
  22. osi_dump-0.1.2.1/src/osi_dump/importer/image/openstack_image_importer.py +77 -0
  23. osi_dump-0.1.2.1/src/osi_dump/importer/instance/__init__.py +0 -0
  24. osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer/__init__.py +0 -0
  25. osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer/load_balancer_importer.py +9 -0
  26. osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer/openstack_load_balancer_importer.py +65 -0
  27. osi_dump-0.1.2.1/src/osi_dump/importer/project/__init__.py +0 -0
  28. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/project/openstack_project_importer.py +6 -6
  29. osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment/__init__.py +0 -0
  30. osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py +83 -0
  31. osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment/role_assignment_importer.py +9 -0
  32. osi_dump-0.1.2.1/src/osi_dump/importer/volume/__init__.py +0 -0
  33. osi_dump-0.1.2.1/src/osi_dump/model/__init__.py +0 -0
  34. osi_dump-0.1.2.1/src/osi_dump/model/flavor.py +20 -0
  35. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/model/hypervisor.py +2 -0
  36. osi_dump-0.1.2.1/src/osi_dump/model/image.py +26 -0
  37. osi_dump-0.1.2.1/src/osi_dump/model/load_balancer.py +17 -0
  38. osi_dump-0.1.2.1/src/osi_dump/model/role_assignment.py +17 -0
  39. osi_dump-0.1.2.1/src/osi_dump/os_connection/__init__.py +0 -0
  40. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/PKG-INFO +1 -1
  41. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/SOURCES.txt +33 -0
  42. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/README.md +0 -0
  43. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/setup.cfg +0 -0
  44. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/__init__.py +0 -0
  45. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/__main__.py +0 -0
  46. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/api/__init__.py +0 -0
  47. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/api/placement.py +0 -0
  48. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/__init__.py +0 -0
  49. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/floating_ip_batch_handler.py +0 -0
  50. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/hypervisor_batch_handler.py +0 -0
  51. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/instance_batch_handler.py +0 -0
  52. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/project_batch_handler.py +0 -0
  53. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/volume_batch_handler.py +0 -0
  54. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/__init__.py +0 -0
  55. {osi_dump-0.1.2/src/osi_dump/exporter/floating_ip → osi_dump-0.1.2.1/src/osi_dump/exporter/flavor}/__init__.py +0 -0
  56. {osi_dump-0.1.2/src/osi_dump/exporter/hypervisor → osi_dump-0.1.2.1/src/osi_dump/exporter/floating_ip}/__init__.py +0 -0
  57. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +0 -0
  58. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py +0 -0
  59. {osi_dump-0.1.2/src/osi_dump/exporter/instance → osi_dump-0.1.2.1/src/osi_dump/exporter/hypervisor}/__init__.py +0 -0
  60. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +0 -0
  61. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py +0 -0
  62. {osi_dump-0.1.2/src/osi_dump/exporter/project → osi_dump-0.1.2.1/src/osi_dump/exporter/image}/__init__.py +0 -0
  63. {osi_dump-0.1.2/src/osi_dump/exporter/volume → osi_dump-0.1.2.1/src/osi_dump/exporter/instance}/__init__.py +0 -0
  64. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/instance/excel_instance_exporter.py +0 -0
  65. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/instance/instance_exporter.py +0 -0
  66. {osi_dump-0.1.2/src/osi_dump/importer/floating_ip → osi_dump-0.1.2.1/src/osi_dump/exporter/load_balancer}/__init__.py +0 -0
  67. {osi_dump-0.1.2/src/osi_dump/importer/hypervisor → osi_dump-0.1.2.1/src/osi_dump/exporter/project}/__init__.py +0 -0
  68. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/project/excel_project_exporter.py +0 -0
  69. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/project/project_exporter.py +0 -0
  70. {osi_dump-0.1.2/src/osi_dump/importer/instance → osi_dump-0.1.2.1/src/osi_dump/exporter/role_assignment}/__init__.py +0 -0
  71. {osi_dump-0.1.2/src/osi_dump/importer/project → osi_dump-0.1.2.1/src/osi_dump/exporter/volume}/__init__.py +0 -0
  72. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/volume/excel_volume_exporter.py +0 -0
  73. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/exporter/volume/volume_exporter.py +0 -0
  74. {osi_dump-0.1.2/src/osi_dump/importer/volume → osi_dump-0.1.2.1/src/osi_dump/importer/flavor}/__init__.py +0 -0
  75. {osi_dump-0.1.2/src/osi_dump/model → osi_dump-0.1.2.1/src/osi_dump/importer/floating_ip}/__init__.py +0 -0
  76. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/floating_ip/floating_ip_importer.py +0 -0
  77. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +0 -0
  78. {osi_dump-0.1.2/src/osi_dump/os_connection → osi_dump-0.1.2.1/src/osi_dump/importer/hypervisor}/__init__.py +0 -0
  79. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/hypervisor/hypervisor_importer.py +0 -0
  80. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/instance/instance_importer.py +0 -0
  81. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/instance/openstack_instance_importer.py +0 -0
  82. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/project/project_importer.py +0 -0
  83. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/volume/openstack_volume_importer.py +0 -0
  84. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/importer/volume/volume_importer.py +0 -0
  85. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/model/authentication_info.py +0 -0
  86. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/model/floating_ip.py +0 -0
  87. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/model/instance.py +0 -0
  88. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/model/project.py +0 -0
  89. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/model/volume.py +0 -0
  90. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/os_connection/get_connections.py +0 -0
  91. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/util/__init__.py +0 -0
  92. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/util/create_file.py +0 -0
  93. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/util/excel_autosize_column.py +0 -0
  94. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/util/excel_sort_sheet.py +0 -0
  95. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/util/export_data_excel.py +0 -0
  96. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/util/extract_hostname.py +0 -0
  97. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump/util/validate_dir_path.py +0 -0
  98. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/dependency_links.txt +0 -0
  99. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/entry_points.txt +0 -0
  100. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/requires.txt +0 -0
  101. {osi_dump-0.1.2 → osi_dump-0.1.2.1}/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
3
+ Version: 0.1.2.1
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"
3
+ version = "0.1.2.1"
4
4
  description = "OpenStack instances information dump tool"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "TVKain" }]
@@ -0,0 +1,17 @@
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"]
@@ -0,0 +1,51 @@
1
+ import logging
2
+
3
+ from openstack.connection import Connection
4
+
5
+ from osi_dump.exporter.flavor.flavor_exporter import FlavorExporter
6
+ from osi_dump.exporter.flavor.excel_flavor_exporter import (
7
+ ExcelFlavorExporter,
8
+ )
9
+
10
+ from osi_dump.importer.flavor.flavor_importer import FlavorImporter
11
+ from osi_dump.importer.flavor.openstack_flavor_importer import (
12
+ OpenStackFlavorImporter,
13
+ )
14
+
15
+
16
+ from osi_dump import util
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class FlavorBatchHandler:
22
+ def __init__(self):
23
+ self._importer_exporter_list: list[tuple[FlavorImporter, FlavorExporter]] = []
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 = OpenStackFlavorImporter(connection)
30
+
31
+ sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-flavor"
32
+ exporter = ExcelFlavorExporter(
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: FlavorImporter, exporter: FlavorExporter):
39
+ self._importer_exporter_list.append((importer, exporter))
40
+
41
+ def process(self):
42
+
43
+ for importer, exporter in self._importer_exporter_list:
44
+ try:
45
+
46
+ flavors = importer.import_flavors()
47
+
48
+ exporter.export_flavors(flavors=flavors)
49
+ except Exception as e:
50
+ logger.warning(e)
51
+ logger.warning("Skipping...")
@@ -0,0 +1,51 @@
1
+ import logging
2
+
3
+ from openstack.connection import Connection
4
+
5
+ from osi_dump.exporter.image.image_exporter import ImageExporter
6
+ from osi_dump.exporter.image.excel_image_exporter import (
7
+ ExcelImageExporter,
8
+ )
9
+
10
+ from osi_dump.importer.image.image_importer import ImageImporter
11
+ from osi_dump.importer.image.openstack_image_importer import (
12
+ OpenStackImageImporter,
13
+ )
14
+
15
+
16
+ from osi_dump import util
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class ImageBatchHandler:
22
+ def __init__(self):
23
+ self._importer_exporter_list: list[tuple[ImageImporter, ImageExporter]] = []
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 = OpenStackImageImporter(connection)
30
+
31
+ sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-image"
32
+ exporter = ExcelImageExporter(
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: ImageImporter, exporter: ImageExporter):
39
+ self._importer_exporter_list.append((importer, exporter))
40
+
41
+ def process(self):
42
+
43
+ for importer, exporter in self._importer_exporter_list:
44
+ try:
45
+
46
+ images = importer.import_images()
47
+
48
+ exporter.export_images(images=images)
49
+ except Exception as e:
50
+ logger.warning(e)
51
+ logger.warning("Skipping...")
@@ -0,0 +1,61 @@
1
+ import logging
2
+
3
+ from openstack.connection import Connection
4
+
5
+ from osi_dump.exporter.load_balancer.load_balancer_exporter import (
6
+ LoadBalancerExporter,
7
+ )
8
+ from osi_dump.exporter.load_balancer.excel_load_balancer_exporter import (
9
+ ExcelLoadBalancerExporter,
10
+ )
11
+
12
+ from osi_dump.importer.load_balancer.load_balancer_importer import (
13
+ LoadBalancerImporter,
14
+ )
15
+ from osi_dump.importer.load_balancer.openstack_load_balancer_importer import (
16
+ OpenStackLoadBalancerImporter,
17
+ )
18
+
19
+
20
+ from osi_dump import util
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class LoadBalancerBatchHandler:
26
+ def __init__(self):
27
+ self._importer_exporter_list: list[
28
+ tuple[LoadBalancerImporter, LoadBalancerExporter]
29
+ ] = []
30
+
31
+ def add_importer_exporter_from_openstack_connections(
32
+ self, connections: list[Connection], output_file: str
33
+ ):
34
+ for connection in connections:
35
+ importer = OpenStackLoadBalancerImporter(connection)
36
+
37
+ sheet_name = (
38
+ f"{util.extract_hostname(connection.auth['auth_url'])}-load_balancer"
39
+ )
40
+ exporter = ExcelLoadBalancerExporter(
41
+ sheet_name=sheet_name, output_file=output_file
42
+ )
43
+
44
+ self.add_importer_exporter(importer=importer, exporter=exporter)
45
+
46
+ def add_importer_exporter(
47
+ self, importer: LoadBalancerImporter, exporter: LoadBalancerExporter
48
+ ):
49
+ self._importer_exporter_list.append((importer, exporter))
50
+
51
+ def process(self):
52
+
53
+ for importer, exporter in self._importer_exporter_list:
54
+ try:
55
+
56
+ load_balancers = importer.import_load_balancers()
57
+
58
+ exporter.export_load_balancers(load_balancers=load_balancers)
59
+ except Exception as e:
60
+ logger.warning(e)
61
+ logger.warning("Skipping...")
@@ -0,0 +1,61 @@
1
+ import logging
2
+
3
+ from openstack.connection import Connection
4
+
5
+ from osi_dump.exporter.role_assignment.role_assignment_exporter import (
6
+ RoleAssignmentExporter,
7
+ )
8
+ from osi_dump.exporter.role_assignment.excel_role_assignment_exporter import (
9
+ ExcelRoleAssignmentExporter,
10
+ )
11
+
12
+ from osi_dump.importer.role_assignment.role_assignment_importer import (
13
+ RoleAssignmentImporter,
14
+ )
15
+ from osi_dump.importer.role_assignment.openstack_role_assignment_importer import (
16
+ OpenStackRoleAssignmentImporter,
17
+ )
18
+
19
+
20
+ from osi_dump import util
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class RoleAssignmentBatchHandler:
26
+ def __init__(self):
27
+ self._importer_exporter_list: list[
28
+ tuple[RoleAssignmentImporter, RoleAssignmentExporter]
29
+ ] = []
30
+
31
+ def add_importer_exporter_from_openstack_connections(
32
+ self, connections: list[Connection], output_file: str
33
+ ):
34
+ for connection in connections:
35
+ importer = OpenStackRoleAssignmentImporter(connection)
36
+
37
+ sheet_name = (
38
+ f"{util.extract_hostname(connection.auth['auth_url'])}-role_assignment"
39
+ )
40
+ exporter = ExcelRoleAssignmentExporter(
41
+ sheet_name=sheet_name, output_file=output_file
42
+ )
43
+
44
+ self.add_importer_exporter(importer=importer, exporter=exporter)
45
+
46
+ def add_importer_exporter(
47
+ self, importer: RoleAssignmentImporter, exporter: RoleAssignmentExporter
48
+ ):
49
+ self._importer_exporter_list.append((importer, exporter))
50
+
51
+ def process(self):
52
+
53
+ for importer, exporter in self._importer_exporter_list:
54
+ try:
55
+
56
+ role_assignments = importer.import_role_assignments()
57
+
58
+ exporter.export_role_assignments(role_assignments=role_assignments)
59
+ except Exception as e:
60
+ logger.warning(e)
61
+ logger.warning("Skipping...")
@@ -8,9 +8,16 @@ import typer
8
8
 
9
9
  from typing_extensions import Annotated
10
10
 
11
+ from osi_dump.batch_handler.load_balancer_batch_handler import LoadBalancerBatchHandler
12
+ from osi_dump.batch_handler.role_assignment_batch_handler import (
13
+ RoleAssignmentBatchHandler,
14
+ )
15
+
11
16
  app = typer.Typer()
12
17
 
13
18
 
19
+ from osi_dump.batch_handler.flavor_batch_handler import FlavorBatchHandler
20
+ from osi_dump.batch_handler.image_batch_handler import ImageBatchHandler
14
21
  from osi_dump.batch_handler.volume_batch_handler import VolumeBatchHandler
15
22
  from osi_dump.os_connection.get_connections import get_connections
16
23
 
@@ -76,6 +83,46 @@ def _hypervisor(connections, output_path: str):
76
83
  hypervisor_batch_handler.process()
77
84
 
78
85
 
86
+ def _image(connections, output_path: str):
87
+ image_batch_handler = ImageBatchHandler()
88
+
89
+ image_batch_handler.add_importer_exporter_from_openstack_connections(
90
+ connections, output_file=output_path
91
+ )
92
+
93
+ image_batch_handler.process()
94
+
95
+
96
+ def _flavor(connections, output_path: str):
97
+ flavor_batch_handler = FlavorBatchHandler()
98
+
99
+ flavor_batch_handler.add_importer_exporter_from_openstack_connections(
100
+ connections, output_file=output_path
101
+ )
102
+
103
+ flavor_batch_handler.process()
104
+
105
+
106
+ def _role_assignment(connections, output_path: str):
107
+ _role_assignment_batch_handler = RoleAssignmentBatchHandler()
108
+
109
+ _role_assignment_batch_handler.add_importer_exporter_from_openstack_connections(
110
+ connections, output_file=output_path
111
+ )
112
+
113
+ _role_assignment_batch_handler.process()
114
+
115
+
116
+ def _load_balancer(connections, output_path: str):
117
+ _load_balancer_batch_handler = LoadBalancerBatchHandler()
118
+
119
+ _load_balancer_batch_handler.add_importer_exporter_from_openstack_connections(
120
+ connections, output_file=output_path
121
+ )
122
+
123
+ _load_balancer_batch_handler.process()
124
+
125
+
79
126
  def inner_main(file_path: str, output_path: str):
80
127
 
81
128
  logger = logging.getLogger(__name__)
@@ -92,6 +139,13 @@ def inner_main(file_path: str, output_path: str):
92
139
 
93
140
  _project(connections=connections, output_path=output_path)
94
141
 
142
+ _image(connections=connections, output_path=output_path)
143
+
144
+ _flavor(connections=connections, output_path=output_path)
145
+
146
+ _role_assignment(connections=connections, output_path=output_path)
147
+
148
+ _load_balancer(connections=connections, output_path=output_path)
95
149
  util.excel_autosize_column(output_path)
96
150
 
97
151
  util.excel_sort_sheet(output_path)
@@ -141,6 +195,9 @@ Path of the output file, will override if file already exists
141
195
  level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
142
196
  )
143
197
 
198
+ # Suppress pool limit warning will investigate later
199
+ logging.getLogger("urllib3").propagate = False
200
+
144
201
  logger = logging.getLogger(__name__)
145
202
 
146
203
  if util.validate_dir_path(file_path=output_path) is False:
@@ -0,0 +1,30 @@
1
+ import logging
2
+
3
+
4
+ import pandas as pd
5
+
6
+
7
+ from osi_dump.exporter.flavor.flavor_exporter import FlavorExporter
8
+
9
+ from osi_dump.model.flavor import Flavor
10
+
11
+ from osi_dump import util
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class ExcelFlavorExporter(FlavorExporter):
17
+ def __init__(self, sheet_name: str, output_file: str):
18
+ self.sheet_name = sheet_name
19
+ self.output_file = output_file
20
+
21
+ def export_flavors(self, flavors: list[Flavor]):
22
+ df = pd.json_normalize([flavor.model_dump() for flavor in flavors])
23
+
24
+ logger.info(f"Exporting flavors 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 flavors for {self.sheet_name}")
29
+ except Exception as e:
30
+ logger.warning(f"Exporting floating ips for {self.sheet_name} error: {e}")
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class FlavorExporter(ABC):
5
+ @abstractmethod
6
+ def export_flavors(self, flavors, output_file: str):
7
+ pass
@@ -0,0 +1,28 @@
1
+ import pandas as pd
2
+
3
+ import logging
4
+
5
+
6
+ from osi_dump import util
7
+ from osi_dump.exporter.image.image_exporter import ImageExporter
8
+
9
+ from osi_dump.model.image import Image
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class ExcelImageExporter(ImageExporter):
15
+ def __init__(self, sheet_name: str, output_file: str):
16
+ self.sheet_name = sheet_name
17
+ self.output_file = output_file
18
+
19
+ def export_images(self, images: list[Image]):
20
+ df = pd.json_normalize([image.model_dump() for image in images])
21
+
22
+ logger.info(f"Exporting images for {self.sheet_name}")
23
+ try:
24
+ util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
25
+
26
+ logger.info(f"Exported images for {self.sheet_name}")
27
+ except Exception as e:
28
+ logger.warning(f"Exporting images for {self.sheet_name} error: {e}")
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class ImageExporter(ABC):
5
+ @abstractmethod
6
+ def export_images(self, images, output_file: str):
7
+ pass
@@ -0,0 +1,33 @@
1
+ import pandas as pd
2
+
3
+ import logging
4
+
5
+
6
+ from osi_dump import util
7
+
8
+ from osi_dump.exporter.load_balancer.load_balancer_exporter import (
9
+ LoadBalancerExporter,
10
+ )
11
+
12
+ from osi_dump.model.load_balancer import LoadBalancer
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class ExcelLoadBalancerExporter(LoadBalancerExporter):
18
+ def __init__(self, sheet_name: str, output_file: str):
19
+ self.sheet_name = sheet_name
20
+ self.output_file = output_file
21
+
22
+ def export_load_balancers(self, load_balancers: list[LoadBalancer]):
23
+ df = pd.json_normalize(
24
+ [load_balancer.model_dump() for load_balancer in load_balancers]
25
+ )
26
+
27
+ logger.info(f"Exporting load_balancers for {self.sheet_name}")
28
+ try:
29
+ util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
30
+
31
+ logger.info(f"Exported load_balancers for {self.sheet_name}")
32
+ except Exception as e:
33
+ logger.warning(f"Exporting load_balancers for {self.sheet_name} error: {e}")
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class LoadBalancerExporter(ABC):
5
+ @abstractmethod
6
+ def export_load_balancers(self, load_balancers, output_file: str):
7
+ pass
@@ -0,0 +1,35 @@
1
+ import pandas as pd
2
+
3
+ import logging
4
+
5
+
6
+ from osi_dump import util
7
+
8
+ from osi_dump.exporter.role_assignment.role_assignment_exporter import (
9
+ RoleAssignmentExporter,
10
+ )
11
+
12
+ from osi_dump.model.role_assignment import RoleAssignment
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class ExcelRoleAssignmentExporter(RoleAssignmentExporter):
18
+ def __init__(self, sheet_name: str, output_file: str):
19
+ self.sheet_name = sheet_name
20
+ self.output_file = output_file
21
+
22
+ def export_role_assignments(self, role_assignments: list[RoleAssignment]):
23
+ df = pd.json_normalize(
24
+ [role_assignment.model_dump() for role_assignment in role_assignments]
25
+ )
26
+
27
+ logger.info(f"Exporting role_assignments for {self.sheet_name}")
28
+ try:
29
+ util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
30
+
31
+ logger.info(f"Exported role_assignments for {self.sheet_name}")
32
+ except Exception as e:
33
+ logger.warning(
34
+ f"Exporting role_assignments for {self.sheet_name} error: {e}"
35
+ )
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class RoleAssignmentExporter(ABC):
5
+ @abstractmethod
6
+ def export_role_assignments(self, role_assignments, output_file: str):
7
+ pass
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from osi_dump.model.flavor import Flavor
4
+
5
+
6
+ class FlavorImporter(ABC):
7
+ @abstractmethod
8
+ def import_flavors(self) -> list[Flavor]:
9
+ pass
@@ -0,0 +1,64 @@
1
+ import logging
2
+
3
+ import concurrent
4
+
5
+ from openstack.connection import Connection
6
+ from openstack.compute.v2.flavor import Flavor as OSFlavor
7
+
8
+ from osi_dump.importer.flavor.flavor_importer import FlavorImporter
9
+ from osi_dump.model.flavor import Flavor
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class OpenStackFlavorImporter(FlavorImporter):
15
+ def __init__(self, connection: Connection):
16
+ self.connection = connection
17
+
18
+ def import_flavors(self) -> list[Flavor]:
19
+ """Import flavors information from Openstack
20
+
21
+ Raises:
22
+ Exception: Raises exception if fetching flavor failed
23
+
24
+ Returns:
25
+ list[Instance]: _description_
26
+ """
27
+
28
+ logger.info(f"Importing flavors for {self.connection.auth['auth_url']}")
29
+
30
+ try:
31
+ osflavors: list[OSFlavor] = list(self.connection.list_flavors())
32
+ except Exception as e:
33
+ raise Exception(
34
+ f"Can not fetch flavors for {self.connection.auth['auth_url']}"
35
+ ) from e
36
+
37
+ flavors: list[Flavor] = []
38
+
39
+ with concurrent.futures.ThreadPoolExecutor() as executor:
40
+ futures = [
41
+ executor.submit(self._get_flavor_info, osflavor)
42
+ for osflavor in osflavors
43
+ ]
44
+ for future in concurrent.futures.as_completed(futures):
45
+ flavors.append(future.result())
46
+
47
+ logger.info(f"Imported flavors for {self.connection.auth['auth_url']}")
48
+
49
+ return flavors
50
+
51
+ def _get_flavor_info(self, flavor: OSFlavor) -> Flavor:
52
+
53
+ ret_flavor = Flavor(
54
+ flavor_id=flavor.id,
55
+ flavor_name=flavor.name,
56
+ ram=flavor.ram,
57
+ vcpus=flavor.vcpus,
58
+ disk=flavor.disk,
59
+ swap=flavor.swap,
60
+ public=flavor.is_public,
61
+ properties=flavor.extra_specs,
62
+ )
63
+
64
+ return ret_flavor
@@ -33,7 +33,9 @@ class OpenStackHypervisorImporter(HypervisorImporter):
33
33
  logger.info(f"Importing hypervisors for {self.connection.auth['auth_url']}")
34
34
 
35
35
  try:
36
- oshypervisors: list[OSHypervisor] = list(self.connection.list_hypervisors())
36
+ oshypervisors: list[OSHypervisor] = list(
37
+ self.connection.compute.hypervisors(details=True)
38
+ )
37
39
  except Exception as e:
38
40
  raise Exception(
39
41
  f"Can not fetch hypervisor for {self.connection.auth['auth_url']}"
@@ -63,6 +65,12 @@ class OpenStackHypervisorImporter(HypervisorImporter):
63
65
  )
64
66
  )
65
67
 
68
+ servers = list(
69
+ self.connection.compute.servers(
70
+ details=False, all_project=True, hypervisor=hypervisor.id
71
+ )
72
+ )
73
+
66
74
  usage_data = get_usage(self.connection, resource_provider_id=hypervisor.id)
67
75
 
68
76
  vcpu = rpi[0]
@@ -81,6 +89,7 @@ class OpenStackHypervisorImporter(HypervisorImporter):
81
89
  vcpus_usage=usage_data["VCPU"],
82
90
  memory_usage=usage_data["MEMORY_MB"],
83
91
  local_disk_usage=usage_data["DISK_GB"],
92
+ vm_count=len(servers),
84
93
  )
85
94
 
86
95
  return ret_hypervisor
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from osi_dump.model.image import Image
4
+
5
+
6
+ class ImageImporter(ABC):
7
+ @abstractmethod
8
+ def import_images(self) -> list[Image]:
9
+ pass