osi-dump 0.1.4__tar.gz → 0.1.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. {osi_dump-0.1.4 → osi_dump-0.1.5}/PKG-INFO +1 -1
  2. {osi_dump-0.1.4 → osi_dump-0.1.5}/pyproject.toml +1 -1
  3. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/role_assignment_batch_handler.py +0 -1
  4. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py +2 -10
  5. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/instance/openstack_instance_importer.py +33 -59
  6. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py +10 -46
  7. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/role_assignment/role_assignment_importer.py +5 -5
  8. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/role_assignment.py +8 -8
  9. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump.egg-info/PKG-INFO +1 -1
  10. {osi_dump-0.1.4 → osi_dump-0.1.5}/README.md +0 -0
  11. {osi_dump-0.1.4 → osi_dump-0.1.5}/setup.cfg +0 -0
  12. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/__init__.py +0 -0
  13. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/__main__.py +0 -0
  14. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/api/__init__.py +0 -0
  15. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/api/keystone.py +0 -0
  16. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/api/neutron.py +0 -0
  17. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/api/octavia.py +0 -0
  18. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/api/placement.py +0 -0
  19. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/__init__.py +0 -0
  20. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/external_port_batch_handler.py +0 -0
  21. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/flavor_batch_handler.py +0 -0
  22. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/floating_ip_batch_handler.py +0 -0
  23. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/hypervisor_batch_handler.py +0 -0
  24. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/image_batch_handler.py +0 -0
  25. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/instance_batch_handler.py +0 -0
  26. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/load_balancer_batch_handler.py +0 -0
  27. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/network_batch_handler.py +0 -0
  28. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/project_batch_handler.py +0 -0
  29. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/router_batch_handler.py +0 -0
  30. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/security_group_batch_handler.py +0 -0
  31. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/batch_handler/volume_batch_handler.py +0 -0
  32. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/cli.py +0 -0
  33. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/__init__.py +0 -0
  34. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/external_port/__init__.py +0 -0
  35. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/external_port/excel_external_port_exporter.py +0 -0
  36. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/external_port/external_port_exporter.py +0 -0
  37. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/flavor/__init__.py +0 -0
  38. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/flavor/excel_flavor_exporter.py +0 -0
  39. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/flavor/flavor_exporter.py +0 -0
  40. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/floating_ip/__init__.py +0 -0
  41. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +0 -0
  42. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py +0 -0
  43. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/hypervisor/__init__.py +0 -0
  44. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +0 -0
  45. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py +0 -0
  46. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/image/__init__.py +0 -0
  47. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/image/excel_image_exporter.py +0 -0
  48. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/image/image_exporter.py +0 -0
  49. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/instance/__init__.py +0 -0
  50. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/instance/excel_instance_exporter.py +0 -0
  51. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/instance/instance_exporter.py +0 -0
  52. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/load_balancer/__init__.py +0 -0
  53. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py +0 -0
  54. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py +0 -0
  55. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/network/__init__.py +0 -0
  56. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/network/excel_network_exporter.py +0 -0
  57. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/network/network_exporter.py +0 -0
  58. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/project/__init__.py +0 -0
  59. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/project/excel_project_exporter.py +0 -0
  60. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/project/project_exporter.py +0 -0
  61. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/role_assignment/__init__.py +0 -0
  62. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/role_assignment/role_assignment_exporter.py +0 -0
  63. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/router/__init__.py +0 -0
  64. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/router/excel_router_exporter.py +0 -0
  65. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/router/router_exporter.py +0 -0
  66. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/security_group/excel_security_group_exporter.py +0 -0
  67. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/security_group/security_group_exporter.py +0 -0
  68. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/volume/__init__.py +0 -0
  69. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/volume/excel_volume_exporter.py +0 -0
  70. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/exporter/volume/volume_exporter.py +0 -0
  71. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/external_port/__init__.py +0 -0
  72. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/external_port/external_port_importer.py +0 -0
  73. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/external_port/openstack_external_port_importer.py +0 -0
  74. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/flavor/__init__.py +0 -0
  75. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/flavor/flavor_importer.py +0 -0
  76. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/flavor/openstack_flavor_importer.py +0 -0
  77. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/floating_ip/__init__.py +0 -0
  78. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/floating_ip/floating_ip_importer.py +0 -0
  79. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +0 -0
  80. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/hypervisor/__init__.py +0 -0
  81. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/hypervisor/hypervisor_importer.py +0 -0
  82. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +0 -0
  83. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/image/__init__.py +0 -0
  84. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/image/image_importer.py +0 -0
  85. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/image/openstack_image_importer.py +0 -0
  86. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/instance/__init__.py +0 -0
  87. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/instance/instance_importer.py +0 -0
  88. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/load_balancer/__init__.py +0 -0
  89. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/load_balancer/load_balancer_importer.py +0 -0
  90. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/load_balancer/openstack_load_balancer_importer.py +0 -0
  91. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/network/__init__.py +0 -0
  92. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/network/network_importer.py +0 -0
  93. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/network/openstack_network_importer.py +0 -0
  94. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/project/__init__.py +0 -0
  95. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/project/openstack_project_importer.py +0 -0
  96. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/project/project_importer.py +0 -0
  97. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/role_assignment/__init__.py +0 -0
  98. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/router/__init__.py +0 -0
  99. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/router/openstack_router_importer.py +0 -0
  100. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/router/router_importer.py +0 -0
  101. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/security_group/openstack_security_group_importer.py +0 -0
  102. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/security_group/security_group_importer.py +0 -0
  103. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/volume/__init__.py +0 -0
  104. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/volume/openstack_volume_importer.py +0 -0
  105. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/importer/volume/volume_importer.py +0 -0
  106. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/__init__.py +0 -0
  107. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/authentication_info.py +0 -0
  108. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/external_port.py +0 -0
  109. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/flavor.py +0 -0
  110. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/floating_ip.py +0 -0
  111. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/hypervisor.py +0 -0
  112. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/image.py +0 -0
  113. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/instance.py +0 -0
  114. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/load_balancer.py +0 -0
  115. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/network.py +0 -0
  116. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/project.py +0 -0
  117. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/router.py +0 -0
  118. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/security_group.py +0 -0
  119. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/model/volume.py +0 -0
  120. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/os_connection/__init__.py +0 -0
  121. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/os_connection/get_connections.py +0 -0
  122. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/__init__.py +0 -0
  123. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/create_file.py +0 -0
  124. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/excel_autosize_column.py +0 -0
  125. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/excel_sort_sheet.py +0 -0
  126. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/export_data_excel.py +0 -0
  127. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/extract_hostname.py +0 -0
  128. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/openstack_util.py +0 -0
  129. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/panda_excel.py +0 -0
  130. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump/util/validate_dir_path.py +0 -0
  131. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump.egg-info/SOURCES.txt +0 -0
  132. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump.egg-info/dependency_links.txt +0 -0
  133. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump.egg-info/entry_points.txt +0 -0
  134. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump.egg-info/requires.txt +0 -0
  135. {osi_dump-0.1.4 → osi_dump-0.1.5}/src/osi_dump.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osi-dump
3
- Version: 0.1.4
3
+ Version: 0.1.5
4
4
  Summary: OpenStack 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.4"
3
+ version = "0.1.5"
4
4
  description = "OpenStack information dump tool"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "TVKain" }]
@@ -31,7 +31,6 @@ class RoleAssignmentBatchHandler:
31
31
  def process(self):
32
32
  for importer, exporter in self._importer_exporter_list:
33
33
  try:
34
- # importer to exporter
35
34
  exporter.export_role_assignments(importer=importer)
36
35
  except Exception as e:
37
36
  logger.warning(e)
@@ -12,22 +12,14 @@ class ExcelRoleAssignmentExporter(RoleAssignmentExporter):
12
12
  self.output_file = output_file
13
13
 
14
14
  def export_role_assignments(self, importer: RoleAssignmentImporter):
15
- # Sheet 1: User Effective Roles
16
- df_effective = pd.json_normalize(
17
- (role.model_dump() for role in importer.calculate_effective_roles())
18
- )
19
- if not df_effective.empty:
20
- df_effective.sort_values(by=['user_name', 'role_name'], inplace=True)
21
- self._export_to_sheet(df_effective, f"{self.sheet_name_prefix}-effective")
22
-
23
- # Sheet 2: Raw User Roles
15
+ # Sheet 1: Raw User Role Assignments
24
16
  df_user = pd.json_normalize(
25
17
  (role.model_dump() for role in importer.get_user_roles())
26
18
  )
27
19
  if not df_user.empty:
28
20
  self._export_to_sheet(df_user, f"{self.sheet_name_prefix}-user")
29
21
 
30
- # Sheet 3: Raw Group Roles
22
+ # Sheet 2: Raw Group Role Assignments
31
23
  df_group = pd.json_normalize(
32
24
  (role.model_dump() for role in importer.get_group_roles())
33
25
  )
@@ -1,10 +1,7 @@
1
1
  import logging
2
-
3
- import concurrent
4
-
2
+ from typing import Generator
5
3
  from openstack.connection import Connection
6
4
  from openstack.compute.v2.server import Server
7
-
8
5
  from openstack.compute.v2.flavor import Flavor as OSFlavor
9
6
 
10
7
  from osi_dump.importer.instance.instance_importer import InstanceImporter
@@ -17,63 +14,45 @@ class OpenStackInstanceImporter(InstanceImporter):
17
14
  def __init__(self, connection: Connection):
18
15
  self.connection = connection
19
16
 
20
- def import_instances(self) -> list[Instance]:
21
- """Import instances information from Openstack
22
-
23
- Raises:
24
- Exception: Raises exception if fetching server failed
25
-
26
- Returns:
27
- list[Instance]: _description_
28
- """
17
+ def import_instances(self) -> Generator[Instance, None, None]:
18
+ """Import instances information from Openstack as a generator."""
29
19
 
30
20
  logger.info(f"Importing instances for {self.connection.auth['auth_url']}")
31
-
32
21
  try:
33
- servers: list[Server] = list(
34
- self.connection.compute.servers(details=True, all_projects=True)
35
- )
36
- except Exception as e:
37
- raise Exception(
38
- f"Can not fetch instances for {self.connection.auth['auth_url']}: {e}"
39
- ) from e
40
-
41
- instances: list[Instance] = []
42
-
43
- with concurrent.futures.ThreadPoolExecutor() as executor:
44
- futures = [
45
- executor.submit(self._get_instance_info, server) for server in servers
46
- ]
47
- for future in concurrent.futures.as_completed(futures):
48
- instances.append(future.result())
22
+ server_iterator = self.connection.compute.servers(details=True, all_projects=True)
23
+
24
+ for server in server_iterator:
25
+ yield self._get_instance_info(server)
49
26
 
50
- logger.info(f"Imported instances for {self.connection.auth['auth_url']}")
51
-
52
- return instances
27
+ except Exception as e:
28
+ logger.error(f"Cannot fetch instances for {self.connection.auth['auth_url']}: {e}")
29
+ return
30
+
31
+ logger.info(f"Finished importing instances for {self.connection.auth['auth_url']}")
53
32
 
54
33
  def _get_instance_info(self, server: Server) -> Instance:
55
-
56
34
  project_name = None
57
35
  project_id = None
36
+ project = None
58
37
  try:
59
38
  project = self.connection.identity.get_project(server.project_id)
60
39
  project_name = project.name
61
40
  project_id = project.id
62
41
  except Exception as e:
63
- logger.warn(
42
+ logger.warning(
64
43
  f"Unable to obtain project name for instance: {server.name}: {e}"
65
44
  )
66
45
 
67
46
  domain_name = None
68
- try:
69
- domain = self.connection.identity.get_domain(project.domain_id)
70
- domain_name = domain.name
71
- except Exception as e:
72
- logger.warning(
73
- f"Unable to obtain domain name for instance {server.name}: {e}"
74
- )
47
+ if project:
48
+ try:
49
+ domain = self.connection.identity.get_domain(project.domain_id)
50
+ domain_name = domain.name
51
+ except Exception as e:
52
+ logger.warning(
53
+ f"Unable to obtain domain name for instance {server.name}: {e}"
54
+ )
75
55
 
76
- # Lấy thông tin IPv4 private
77
56
  private_v4_ips = []
78
57
  floating_ip = None
79
58
 
@@ -91,28 +70,25 @@ class OpenStackInstanceImporter(InstanceImporter):
91
70
 
92
71
  vgpus = None
93
72
  vgpu_type = None
94
-
95
73
  vgpu_metadata_property = "pci_passthrough:alias"
96
74
 
97
75
  try:
98
76
  flavor: OSFlavor = self.connection.get_flavor(
99
77
  name_or_id=server.flavor["id"]
100
78
  )
101
-
102
- vgpu_prop: str = flavor.extra_specs[vgpu_metadata_property]
103
-
104
- vgpu_props = vgpu_prop.split(":")
105
-
106
- vgpu_type = vgpu_props[0]
107
- vgpus = int(vgpu_props[1])
108
-
109
- except Exception as e:
79
+ if flavor and flavor.extra_specs:
80
+ vgpu_prop: str = flavor.extra_specs.get(vgpu_metadata_property)
81
+ if vgpu_prop:
82
+ vgpu_props = vgpu_prop.split(":")
83
+ vgpu_type = vgpu_props[0]
84
+ vgpus = int(vgpu_props[1])
85
+ except Exception:
110
86
  pass
111
87
 
112
- image_id = server.image["id"]
113
- flavor_id = server.flavor["id"]
88
+ image_id = server.image.get("id") if server.image else None
89
+ flavor_id = server.flavor.get("id") if server.flavor else None
114
90
 
115
- instance = Instance(
91
+ return Instance(
116
92
  instance_id=server.id,
117
93
  instance_name=server.name,
118
94
  project_id=project_id,
@@ -131,6 +107,4 @@ class OpenStackInstanceImporter(InstanceImporter):
131
107
  vgpu_type=vgpu_type,
132
108
  image_id=image_id,
133
109
  flavor_id=flavor_id
134
- )
135
-
136
- return instance
110
+ )
@@ -4,7 +4,7 @@ from openstack.identity.v3.role_assignment import RoleAssignment as OSRoleAssign
4
4
  from typing import Generator
5
5
 
6
6
  from .role_assignment_importer import RoleAssignmentImporter
7
- from osi_dump.model.role_assignment import UserRoleAssignment, GroupRoleAssignment, EffectiveUserRole
7
+ from osi_dump.model.role_assignment import UserRoleAssignment, GroupRoleAssignment
8
8
  from osi_dump.api.keystone import get_users
9
9
 
10
10
  logger = logging.getLogger(__name__)
@@ -15,15 +15,14 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
15
15
  self.users = {}
16
16
  self.roles = {}
17
17
  self.groups = {}
18
- self.group_members = {} # group_id -> [user_id_1, user_id_2]
19
- self._raw_assignments = None # Cache
18
+ self._raw_assignments = None
20
19
 
21
- def _fetch_all_data(self):
22
- """pre-cache for metadata."""
20
+ def _fetch_metadata(self):
21
+ """cache metadata"""
23
22
  if self._raw_assignments is not None:
24
- return
23
+ return
25
24
 
26
- logger.info(f"Pre-caching all role assignment metadata for {self.connection.auth['auth_url']}")
25
+ logger.info(f"Pre-caching metadata for role assignments on {self.connection.auth['auth_url']}")
27
26
 
28
27
  try:
29
28
  os_users = get_users(self.connection)
@@ -39,14 +38,7 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
39
38
 
40
39
  try:
41
40
  os_groups = list(self.connection.identity.groups())
42
- for group in os_groups:
43
- self.groups[group.id] = group.name
44
- try:
45
- members = list(self.connection.identity.group_users(group))
46
- self.group_members[group.id] = [user.id for user in members]
47
- except Exception as e:
48
- logger.warning(f"Could not fetch members for group {group.name}: {e}")
49
- self.group_members[group.id] = []
41
+ for group in os_groups: self.groups[group.id] = group.name
50
42
  except Exception as e:
51
43
  logger.error(f"Could not fetch groups: {e}")
52
44
 
@@ -57,7 +49,7 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
57
49
  self._raw_assignments = []
58
50
 
59
51
  def get_user_roles(self) -> Generator[UserRoleAssignment, None, None]:
60
- self._fetch_all_data()
52
+ self._fetch_metadata()
61
53
  for assignment in self._raw_assignments:
62
54
  if assignment.user:
63
55
  user_id = assignment.user.get('id')
@@ -75,7 +67,7 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
75
67
  )
76
68
 
77
69
  def get_group_roles(self) -> Generator[GroupRoleAssignment, None, None]:
78
- self._fetch_all_data()
70
+ self._fetch_metadata()
79
71
  for assignment in self._raw_assignments:
80
72
  if assignment.group:
81
73
  group_id = assignment.group.get('id')
@@ -86,32 +78,4 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
86
78
  role_id=role_id,
87
79
  role_name=self.roles.get(role_id),
88
80
  scope=assignment.scope
89
- )
90
-
91
- def calculate_effective_roles(self) -> Generator[EffectiveUserRole, None, None]:
92
- # generator
93
- # direct role
94
- for user_role in self.get_user_roles():
95
- yield EffectiveUserRole(
96
- user_id=user_role.user_id,
97
- user_name=user_role.user_name,
98
- role_id=user_role.role_id,
99
- role_name=user_role.role_name,
100
- scope=user_role.scope,
101
- inherited_from_group='[Direct]'
102
- )
103
-
104
- # inherited_from_group
105
- for group_role in self.get_group_roles():
106
- group_id = group_role.group_id
107
- if group_id in self.group_members:
108
- for user_id in self.group_members[group_id]:
109
- user_info = self.users.get(user_id, {})
110
- yield EffectiveUserRole(
111
- user_id=user_id,
112
- user_name=user_info.get('name'),
113
- role_id=group_role.role_id,
114
- role_name=group_role.role_name,
115
- scope=group_role.scope,
116
- inherited_from_group=group_role.group_name
117
- )
81
+ )
@@ -1,6 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from typing import Generator
3
- from osi_dump.model.role_assignment import UserRoleAssignment, GroupRoleAssignment, EffectiveUserRole
3
+ from osi_dump.model.role_assignment import UserRoleAssignment, GroupRoleAssignment
4
4
 
5
5
  class RoleAssignmentImporter(ABC):
6
6
  @abstractmethod
@@ -10,7 +10,7 @@ class RoleAssignmentImporter(ABC):
10
10
  @abstractmethod
11
11
  def get_group_roles(self) -> Generator[GroupRoleAssignment, None, None]:
12
12
  pass
13
-
14
- @abstractmethod
15
- def calculate_effective_roles(self) -> Generator[EffectiveUserRole, None, None]:
16
- pass
13
+
14
+ # @abstractmethod
15
+ # def calculate_effective_roles(self) -> Generator[EffectiveUserRole, None, None]:
16
+ # pass
@@ -20,11 +20,11 @@ class GroupRoleAssignment(BaseModel):
20
20
  role_name: Optional[str]
21
21
  scope: dict
22
22
 
23
- class EffectiveUserRole(BaseModel):
24
- model_config = ConfigDict(strict=True)
25
- user_id: str
26
- user_name: Optional[str]
27
- role_id: str
28
- role_name: Optional[str]
29
- scope: dict
30
- inherited_from_group: Optional[str]
23
+ #class EffectiveUserRole(BaseModel):
24
+ # model_config = ConfigDict(strict=True)
25
+ # user_id: str
26
+ # user_name: Optional[str]
27
+ # role_id: str
28
+ # role_name: Optional[str]
29
+ # scope: dict
30
+ # inherited_from_group: Optional[str]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osi-dump
3
- Version: 0.1.4
3
+ Version: 0.1.5
4
4
  Summary: OpenStack information dump tool
5
5
  Author: TVKain
6
6
  License: Apache-2.0
File without changes
File without changes
File without changes