osi-dump 0.1__tar.gz → 0.1.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 (69) hide show
  1. {osi_dump-0.1 → osi_dump-0.1.2}/PKG-INFO +1 -1
  2. {osi_dump-0.1 → osi_dump-0.1.2}/pyproject.toml +1 -1
  3. osi_dump-0.1.2/src/osi_dump/api/placement.py +17 -0
  4. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +8 -1
  5. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/instance/openstack_instance_importer.py +3 -5
  6. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/project/openstack_project_importer.py +27 -0
  7. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/volume/openstack_volume_importer.py +17 -1
  8. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/model/hypervisor.py +8 -2
  9. osi_dump-0.1.2/src/osi_dump/model/project.py +31 -0
  10. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/model/volume.py +2 -0
  11. osi_dump-0.1.2/src/osi_dump/os_connection/__init__.py +0 -0
  12. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/os_connection/get_connections.py +0 -1
  13. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump.egg-info/PKG-INFO +1 -1
  14. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump.egg-info/SOURCES.txt +2 -0
  15. osi_dump-0.1/src/osi_dump/model/project.py +0 -13
  16. {osi_dump-0.1 → osi_dump-0.1.2}/README.md +0 -0
  17. {osi_dump-0.1 → osi_dump-0.1.2}/setup.cfg +0 -0
  18. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/__init__.py +0 -0
  19. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/__main__.py +0 -0
  20. {osi_dump-0.1/src/osi_dump/exporter → osi_dump-0.1.2/src/osi_dump/api}/__init__.py +0 -0
  21. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/batch_handler/__init__.py +0 -0
  22. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/batch_handler/floating_ip_batch_handler.py +0 -0
  23. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/batch_handler/hypervisor_batch_handler.py +0 -0
  24. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/batch_handler/instance_batch_handler.py +0 -0
  25. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/batch_handler/project_batch_handler.py +0 -0
  26. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/batch_handler/volume_batch_handler.py +0 -0
  27. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/cli.py +0 -0
  28. {osi_dump-0.1/src/osi_dump/exporter/floating_ip → osi_dump-0.1.2/src/osi_dump/exporter}/__init__.py +0 -0
  29. {osi_dump-0.1/src/osi_dump/exporter/hypervisor → osi_dump-0.1.2/src/osi_dump/exporter/floating_ip}/__init__.py +0 -0
  30. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +0 -0
  31. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py +0 -0
  32. {osi_dump-0.1/src/osi_dump/exporter/instance → osi_dump-0.1.2/src/osi_dump/exporter/hypervisor}/__init__.py +0 -0
  33. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +0 -0
  34. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py +0 -0
  35. {osi_dump-0.1/src/osi_dump/exporter/project → osi_dump-0.1.2/src/osi_dump/exporter/instance}/__init__.py +0 -0
  36. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/instance/excel_instance_exporter.py +0 -0
  37. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/instance/instance_exporter.py +0 -0
  38. {osi_dump-0.1/src/osi_dump/exporter/volume → osi_dump-0.1.2/src/osi_dump/exporter/project}/__init__.py +0 -0
  39. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/project/excel_project_exporter.py +0 -0
  40. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/project/project_exporter.py +0 -0
  41. {osi_dump-0.1/src/osi_dump/importer/floating_ip → osi_dump-0.1.2/src/osi_dump/exporter/volume}/__init__.py +0 -0
  42. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/volume/excel_volume_exporter.py +0 -0
  43. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/exporter/volume/volume_exporter.py +0 -0
  44. {osi_dump-0.1/src/osi_dump/importer/hypervisor → osi_dump-0.1.2/src/osi_dump/importer/floating_ip}/__init__.py +0 -0
  45. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/floating_ip/floating_ip_importer.py +0 -0
  46. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +0 -0
  47. {osi_dump-0.1/src/osi_dump/importer/instance → osi_dump-0.1.2/src/osi_dump/importer/hypervisor}/__init__.py +0 -0
  48. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/hypervisor/hypervisor_importer.py +0 -0
  49. {osi_dump-0.1/src/osi_dump/importer/project → osi_dump-0.1.2/src/osi_dump/importer/instance}/__init__.py +0 -0
  50. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/instance/instance_importer.py +0 -0
  51. {osi_dump-0.1/src/osi_dump/importer/volume → osi_dump-0.1.2/src/osi_dump/importer/project}/__init__.py +0 -0
  52. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/project/project_importer.py +0 -0
  53. {osi_dump-0.1/src/osi_dump/model → osi_dump-0.1.2/src/osi_dump/importer/volume}/__init__.py +0 -0
  54. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/importer/volume/volume_importer.py +0 -0
  55. {osi_dump-0.1/src/osi_dump/os_connection → osi_dump-0.1.2/src/osi_dump/model}/__init__.py +0 -0
  56. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/model/authentication_info.py +0 -0
  57. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/model/floating_ip.py +0 -0
  58. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/model/instance.py +0 -0
  59. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/util/__init__.py +0 -0
  60. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/util/create_file.py +0 -0
  61. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/util/excel_autosize_column.py +0 -0
  62. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/util/excel_sort_sheet.py +0 -0
  63. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/util/export_data_excel.py +0 -0
  64. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/util/extract_hostname.py +0 -0
  65. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump/util/validate_dir_path.py +0 -0
  66. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump.egg-info/dependency_links.txt +0 -0
  67. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump.egg-info/entry_points.txt +0 -0
  68. {osi_dump-0.1 → osi_dump-0.1.2}/src/osi_dump.egg-info/requires.txt +0 -0
  69. {osi_dump-0.1 → osi_dump-0.1.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
3
+ Version: 0.1.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"
3
+ version = "0.1.2"
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_usage(connection: Connection, resource_provider_id: str):
6
+
7
+ placement_endpoint = connection.endpoint_for(
8
+ service_type="placement", interface="public"
9
+ )
10
+
11
+ url = f"{placement_endpoint}/resource_providers/{resource_provider_id}/usages"
12
+
13
+ response = connection.session.get(url)
14
+
15
+ data = response.json()
16
+
17
+ return data["usages"]
@@ -11,6 +11,8 @@ from openstack.placement.v1.resource_provider_inventory import ResourceProviderI
11
11
  from osi_dump.importer.hypervisor.hypervisor_importer import HypervisorImporter
12
12
  from osi_dump.model.hypervisor import Hypervisor
13
13
 
14
+ from osi_dump.api.placement import get_usage
15
+
14
16
  logger = logging.getLogger(__name__)
15
17
 
16
18
 
@@ -61,6 +63,8 @@ class OpenStackHypervisorImporter(HypervisorImporter):
61
63
  )
62
64
  )
63
65
 
66
+ usage_data = get_usage(self.connection, resource_provider_id=hypervisor.id)
67
+
64
68
  vcpu = rpi[0]
65
69
  memory = rpi[1]
66
70
  disk = rpi[2]
@@ -73,7 +77,10 @@ class OpenStackHypervisorImporter(HypervisorImporter):
73
77
  status=hypervisor.status,
74
78
  local_disk_size=disk["max_unit"],
75
79
  memory_size=memory["max_unit"] + memory["reserved"],
76
- vpus=vcpu["max_unit"],
80
+ vcpus=vcpu["max_unit"],
81
+ vcpus_usage=usage_data["VCPU"],
82
+ memory_usage=usage_data["MEMORY_MB"],
83
+ local_disk_usage=usage_data["DISK_GB"],
77
84
  )
78
85
 
79
86
  return ret_hypervisor
@@ -51,7 +51,8 @@ class OpenStackInstanceImporter(InstanceImporter):
51
51
 
52
52
  def _get_instance_info(self, server: Server) -> Instance:
53
53
 
54
- # Lấy thông tin project
54
+ project_name = None
55
+ project_id = None
55
56
  try:
56
57
  project = self.connection.identity.get_project(server.project_id)
57
58
  project_name = project.name
@@ -60,10 +61,8 @@ class OpenStackInstanceImporter(InstanceImporter):
60
61
  logger.warn(
61
62
  f"Unable to obtain project name for instance: {server.name}: {e}"
62
63
  )
63
- project_name = None
64
- project_id = None
65
64
 
66
- # Lấy thông tin domain
65
+ domain_name = None
67
66
  try:
68
67
  domain = self.connection.identity.get_domain(project.domain_id)
69
68
  domain_name = domain.name
@@ -71,7 +70,6 @@ class OpenStackInstanceImporter(InstanceImporter):
71
70
  logger.warning(
72
71
  f"Unable to obtain domain name for instance {server.name}: {e}"
73
72
  )
74
- domain_name = None
75
73
 
76
74
  # Lấy thông tin IPv4 private
77
75
  private_v4_ips = []
@@ -49,12 +49,39 @@ class OpenStackProjectImporter(ProjectImporter):
49
49
  return projects
50
50
 
51
51
  def _get_project_info(self, project: OSProject) -> Project:
52
+
53
+ try:
54
+ compute_quotas = self.connection.compute.get_quota_set(
55
+ project.id, usage=True
56
+ )
57
+ except Exception as e:
58
+ logger.warning(f"Get compute quotas failed for {project.id} error: {e}")
59
+
60
+ try:
61
+ storage_quotas = self.connection.block_storage.get_quota_set(
62
+ project.id, usage=True
63
+ )
64
+ except Exception as e:
65
+ logger.warning(f"Get storage quotas failed for {project.id} error: {e}")
66
+
52
67
  project_ret = Project(
53
68
  project_id=project.id,
54
69
  project_name=project.name,
55
70
  domain_id=project.domain_id,
56
71
  enabled=project.is_enabled,
57
72
  parent_id=project.parent_id,
73
+ usage_instance=compute_quotas.usage["instances"],
74
+ quota_instance=compute_quotas.instances,
75
+ usage_ram=compute_quotas.usage["ram"],
76
+ quota_ram=compute_quotas.ram,
77
+ usage_vcpu=compute_quotas.usage["cores"],
78
+ quota_vcpu=compute_quotas.cores,
79
+ usage_volume=storage_quotas.volumes,
80
+ quota_volume=storage_quotas.usage["volumes"],
81
+ usage_snapshot=storage_quotas.snapshots,
82
+ quota_snapshot=storage_quotas.usage["snapshots"],
83
+ usage_storage=storage_quotas.gigabytes,
84
+ quota_storage=storage_quotas.usage["gigabytes"],
58
85
  )
59
86
 
60
87
  return project_ret
@@ -29,7 +29,9 @@ class OpenStackVolumeImporter(VolumeImporter):
29
29
  logger.info(f"Importing volumes for {self.connection.auth['auth_url']}")
30
30
 
31
31
  try:
32
- osvolumes: list[OSVolume] = list(self.connection.list_volumes())
32
+ osvolumes: list[OSVolume] = list(
33
+ self.connection.block_storage.volumes(details=True, all_projects=True)
34
+ )
33
35
  except Exception as e:
34
36
  raise Exception(
35
37
  f"Can not fetch volumes for {self.connection.auth['auth_url']}"
@@ -50,6 +52,19 @@ class OpenStackVolumeImporter(VolumeImporter):
50
52
 
51
53
  def _get_volume_info(self, volume: OSVolume) -> Volume:
52
54
 
55
+ snapshots = []
56
+ try:
57
+ snapshots = list(
58
+ self.connection.block_storage.snapshots(
59
+ details=False, all_projects=True, volume_id=volume.id
60
+ )
61
+ )
62
+
63
+ snapshots = [snapshot["id"] for snapshot in snapshots]
64
+
65
+ except Exception as e:
66
+ logger.warning(f"Fetching snapshots failed for {volume.id} error: {e}")
67
+
53
68
  ret_volume = Volume(
54
69
  volume_id=volume.id,
55
70
  project_id=volume.project_id,
@@ -57,6 +72,7 @@ class OpenStackVolumeImporter(VolumeImporter):
57
72
  attachments=[att["server_id"] for att in volume.attachments],
58
73
  type=volume.volume_type,
59
74
  size=volume.size,
75
+ snapshots=snapshots,
60
76
  updated_at=volume.updated_at,
61
77
  created_at=volume.created_at,
62
78
  )
@@ -7,6 +7,12 @@ class Hypervisor(BaseModel):
7
7
  name: str
8
8
  state: str
9
9
  status: str
10
- local_disk_size: int
10
+
11
+ vcpus: int
12
+ vcpus_usage: int
13
+
11
14
  memory_size: int
12
- vpus: int
15
+ memory_usage: int
16
+
17
+ local_disk_usage: int
18
+ local_disk_size: int
@@ -0,0 +1,31 @@
1
+ from typing import Optional
2
+
3
+ from pydantic import BaseModel, ConfigDict, ValidationError
4
+
5
+
6
+ class Project(BaseModel):
7
+ model_config = ConfigDict(strict=True)
8
+
9
+ project_id: str
10
+ project_name: Optional[str]
11
+ domain_id: Optional[str]
12
+ enabled: bool
13
+ parent_id: Optional[str]
14
+
15
+ usage_instance: Optional[int]
16
+ quota_instance: Optional[int]
17
+
18
+ usage_vcpu: Optional[int]
19
+ quota_vcpu: Optional[int]
20
+
21
+ usage_ram: Optional[int]
22
+ quota_ram: Optional[int]
23
+
24
+ usage_volume: Optional[int]
25
+ quota_volume: Optional[int]
26
+
27
+ usage_snapshot: Optional[int]
28
+ quota_snapshot: Optional[int]
29
+
30
+ usage_storage: Optional[int]
31
+ quota_storage: Optional[int]
@@ -17,5 +17,7 @@ class Volume(BaseModel):
17
17
  type: str
18
18
  size: int
19
19
 
20
+ snapshots: Optional[list[str]]
21
+
20
22
  updated_at: str
21
23
  created_at: str
File without changes
@@ -33,7 +33,6 @@ def get_connections(file_path) -> list[Connection]:
33
33
  password=auth.password,
34
34
  project_domain_name=auth.project_domain_name,
35
35
  user_domain_name=auth.user_domain_name,
36
- timeout=TIMEOUT_SECOND,
37
36
  )
38
37
 
39
38
  connections.append(connection)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osi-dump
3
- Version: 0.1
3
+ Version: 0.1.2
4
4
  Summary: OpenStack instances information dump tool
5
5
  Author: TVKain
6
6
  License: Apache-2.0
@@ -9,6 +9,8 @@ src/osi_dump.egg-info/dependency_links.txt
9
9
  src/osi_dump.egg-info/entry_points.txt
10
10
  src/osi_dump.egg-info/requires.txt
11
11
  src/osi_dump.egg-info/top_level.txt
12
+ src/osi_dump/api/__init__.py
13
+ src/osi_dump/api/placement.py
12
14
  src/osi_dump/batch_handler/__init__.py
13
15
  src/osi_dump/batch_handler/floating_ip_batch_handler.py
14
16
  src/osi_dump/batch_handler/hypervisor_batch_handler.py
@@ -1,13 +0,0 @@
1
- from typing import Optional
2
-
3
- from pydantic import BaseModel, ConfigDict, ValidationError
4
-
5
-
6
- class Project(BaseModel):
7
- model_config = ConfigDict(strict=True)
8
-
9
- project_id: str
10
- project_name: Optional[str]
11
- domain_id: Optional[str]
12
- enabled: bool
13
- parent_id: Optional[str]
File without changes
File without changes
File without changes