osi-dump 0.1.3.3.4.2__py3-none-any.whl → 0.1.4__py3-none-any.whl

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 (102) hide show
  1. osi_dump/__main__.py +4 -4
  2. osi_dump/api/keystone.py +70 -70
  3. osi_dump/api/neutron.py +65 -65
  4. osi_dump/api/octavia.py +94 -94
  5. osi_dump/api/placement.py +41 -41
  6. osi_dump/batch_handler/__init__.py +6 -5
  7. osi_dump/batch_handler/external_port_batch_handler.py +55 -55
  8. osi_dump/batch_handler/flavor_batch_handler.py +51 -51
  9. osi_dump/batch_handler/floating_ip_batch_handler.py +57 -57
  10. osi_dump/batch_handler/hypervisor_batch_handler.py +55 -55
  11. osi_dump/batch_handler/image_batch_handler.py +51 -51
  12. osi_dump/batch_handler/instance_batch_handler.py +46 -54
  13. osi_dump/batch_handler/load_balancer_batch_handler.py +59 -59
  14. osi_dump/batch_handler/network_batch_handler.py +51 -51
  15. osi_dump/batch_handler/project_batch_handler.py +51 -51
  16. osi_dump/batch_handler/role_assignment_batch_handler.py +38 -61
  17. osi_dump/batch_handler/router_batch_handler.py +49 -49
  18. osi_dump/batch_handler/security_group_batch_handler.py +37 -0
  19. osi_dump/batch_handler/volume_batch_handler.py +45 -45
  20. osi_dump/cli.py +267 -257
  21. osi_dump/exporter/external_port/excel_external_port_exporter.py +34 -34
  22. osi_dump/exporter/external_port/external_port_exporter.py +7 -7
  23. osi_dump/exporter/flavor/excel_flavor_exporter.py +30 -30
  24. osi_dump/exporter/flavor/flavor_exporter.py +7 -7
  25. osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +30 -30
  26. osi_dump/exporter/floating_ip/floating_ip_exporter.py +7 -7
  27. osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +32 -32
  28. osi_dump/exporter/hypervisor/hypervisor_exporter.py +7 -7
  29. osi_dump/exporter/image/excel_image_exporter.py +28 -28
  30. osi_dump/exporter/image/image_exporter.py +7 -7
  31. osi_dump/exporter/instance/excel_instance_exporter.py +29 -29
  32. osi_dump/exporter/instance/instance_exporter.py +8 -7
  33. osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py +36 -36
  34. osi_dump/exporter/load_balancer/load_balancer_exporter.py +7 -7
  35. osi_dump/exporter/network/excel_network_exporter.py +32 -32
  36. osi_dump/exporter/network/network_exporter.py +7 -7
  37. osi_dump/exporter/project/excel_project_exporter.py +30 -30
  38. osi_dump/exporter/project/project_exporter.py +7 -7
  39. osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py +43 -35
  40. osi_dump/exporter/role_assignment/role_assignment_exporter.py +7 -7
  41. osi_dump/exporter/router/excel_router_exporter.py +30 -30
  42. osi_dump/exporter/router/router_exporter.py +7 -7
  43. osi_dump/exporter/security_group/excel_security_group_exporter.py +35 -0
  44. osi_dump/exporter/security_group/security_group_exporter.py +8 -0
  45. osi_dump/exporter/volume/excel_volume_exporter.py +29 -29
  46. osi_dump/exporter/volume/volume_exporter.py +7 -7
  47. osi_dump/importer/external_port/external_port_importer.py +9 -9
  48. osi_dump/importer/external_port/openstack_external_port_importer.py +177 -177
  49. osi_dump/importer/flavor/flavor_importer.py +9 -9
  50. osi_dump/importer/flavor/openstack_flavor_importer.py +64 -64
  51. osi_dump/importer/floating_ip/floating_ip_importer.py +9 -9
  52. osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +68 -68
  53. osi_dump/importer/hypervisor/hypervisor_importer.py +9 -9
  54. osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +137 -137
  55. osi_dump/importer/image/image_importer.py +9 -9
  56. osi_dump/importer/image/openstack_image_importer.py +81 -81
  57. osi_dump/importer/instance/instance_importer.py +8 -9
  58. osi_dump/importer/instance/openstack_instance_importer.py +136 -136
  59. osi_dump/importer/load_balancer/load_balancer_importer.py +9 -9
  60. osi_dump/importer/load_balancer/openstack_load_balancer_importer.py +113 -113
  61. osi_dump/importer/network/network_importer.py +9 -9
  62. osi_dump/importer/network/openstack_network_importer.py +93 -93
  63. osi_dump/importer/project/openstack_project_importer.py +141 -141
  64. osi_dump/importer/project/project_importer.py +9 -9
  65. osi_dump/importer/role_assignment/openstack_role_assignment_importer.py +117 -141
  66. osi_dump/importer/role_assignment/role_assignment_importer.py +16 -9
  67. osi_dump/importer/router/openstack_router_importer.py +87 -87
  68. osi_dump/importer/router/router_importer.py +9 -9
  69. osi_dump/importer/security_group/openstack_security_group_importer.py +54 -0
  70. osi_dump/importer/security_group/security_group_importer.py +8 -0
  71. osi_dump/importer/volume/openstack_volume_importer.py +81 -81
  72. osi_dump/importer/volume/volume_importer.py +9 -9
  73. osi_dump/model/authentication_info.py +15 -15
  74. osi_dump/model/external_port.py +30 -30
  75. osi_dump/model/flavor.py +20 -20
  76. osi_dump/model/floating_ip.py +24 -24
  77. osi_dump/model/hypervisor.py +24 -24
  78. osi_dump/model/image.py +27 -27
  79. osi_dump/model/instance.py +29 -29
  80. osi_dump/model/load_balancer.py +26 -26
  81. osi_dump/model/network.py +25 -25
  82. osi_dump/model/project.py +33 -33
  83. osi_dump/model/role_assignment.py +30 -21
  84. osi_dump/model/router.py +23 -23
  85. osi_dump/model/security_group.py +22 -0
  86. osi_dump/model/volume.py +25 -25
  87. osi_dump/os_connection/get_connections.py +67 -67
  88. osi_dump/util/__init__.py +7 -7
  89. osi_dump/util/create_file.py +11 -11
  90. osi_dump/util/excel_autosize_column.py +39 -39
  91. osi_dump/util/excel_sort_sheet.py +35 -35
  92. osi_dump/util/export_data_excel.py +36 -36
  93. osi_dump/util/extract_hostname.py +5 -5
  94. osi_dump/util/openstack_util.py +48 -48
  95. osi_dump/util/panda_excel.py +26 -26
  96. osi_dump/util/validate_dir_path.py +20 -20
  97. {osi_dump-0.1.3.3.4.2.dist-info → osi_dump-0.1.4.dist-info}/METADATA +40 -40
  98. osi_dump-0.1.4.dist-info/RECORD +130 -0
  99. {osi_dump-0.1.3.3.4.2.dist-info → osi_dump-0.1.4.dist-info}/WHEEL +1 -1
  100. osi_dump-0.1.3.3.4.2.dist-info/RECORD +0 -124
  101. {osi_dump-0.1.3.3.4.2.dist-info → osi_dump-0.1.4.dist-info}/entry_points.txt +0 -0
  102. {osi_dump-0.1.3.3.4.2.dist-info → osi_dump-0.1.4.dist-info}/top_level.txt +0 -0
@@ -1,81 +1,81 @@
1
- import logging
2
-
3
- import concurrent
4
-
5
- from openstack.connection import Connection
6
- from openstack.image.v2.image import Image as OSImage
7
-
8
- from osi_dump.importer.image.image_importer import ImageImporter
9
- from osi_dump.model.image import Image
10
-
11
- logger = logging.getLogger(__name__)
12
-
13
-
14
- class OpenStackImageImporter(ImageImporter):
15
- def __init__(self, connection: Connection):
16
- self.connection = connection
17
-
18
- def import_images(self) -> list[Image]:
19
- """Import instances information from Openstack
20
-
21
- Raises:
22
- Exception: Raises exception if fetching server failed
23
-
24
- Returns:
25
- list[Instance]: _description_
26
- """
27
-
28
- logger.info(f"Importing images for {self.connection.auth['auth_url']}")
29
-
30
- try:
31
-
32
- os_images: list[OSImage] = list(self.connection.list_images(show_all=True))
33
- except Exception as e:
34
- raise Exception(
35
- f"Can not fetch images for {self.connection.auth['auth_url']}"
36
- ) from e
37
-
38
- images: list[OSImage] = []
39
-
40
- with concurrent.futures.ThreadPoolExecutor() as executor:
41
- futures = [
42
- executor.submit(self._get_image_info, image) for image in os_images
43
- ]
44
- for future in concurrent.futures.as_completed(futures):
45
- images.append(future.result())
46
-
47
- logger.info(f"Imported images for {self.connection.auth['auth_url']}")
48
-
49
- return images
50
-
51
- def _get_image_info(self, os_image: OSImage) -> Image:
52
-
53
- try:
54
- properties: dict = os_image.properties
55
-
56
- properties.pop("owner_specified.openstack.md5", None)
57
- properties.pop("owner_specified.openstack.sha256", None)
58
- properties.pop("owner_specified.openstack.object", None)
59
- properties.pop("stores", None)
60
- except Exception as e:
61
- logger.warn(f"properties for {os_image.id} is None")
62
-
63
- image = Image(
64
- image_id=os_image.id,
65
- disk_format=os_image.disk_format,
66
- min_disk=os_image.min_disk,
67
- min_ram=os_image.min_ram,
68
- image_name=os_image.name,
69
- owner=os_image.owner,
70
- properties=os_image.properties,
71
- protected=os_image.is_protected,
72
- status=os_image.status,
73
- os_distro=os_image.os_distro,
74
- size=os_image.size,
75
- virtual_size=os_image.virtual_size,
76
- visibility=os_image.visibility,
77
- created_at=os_image.created_at,
78
- updated_at=os_image.updated_at,
79
- )
80
-
81
- return image
1
+ import logging
2
+
3
+ import concurrent
4
+
5
+ from openstack.connection import Connection
6
+ from openstack.image.v2.image import Image as OSImage
7
+
8
+ from osi_dump.importer.image.image_importer import ImageImporter
9
+ from osi_dump.model.image import Image
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class OpenStackImageImporter(ImageImporter):
15
+ def __init__(self, connection: Connection):
16
+ self.connection = connection
17
+
18
+ def import_images(self) -> list[Image]:
19
+ """Import instances information from Openstack
20
+
21
+ Raises:
22
+ Exception: Raises exception if fetching server failed
23
+
24
+ Returns:
25
+ list[Instance]: _description_
26
+ """
27
+
28
+ logger.info(f"Importing images for {self.connection.auth['auth_url']}")
29
+
30
+ try:
31
+
32
+ os_images: list[OSImage] = list(self.connection.list_images(show_all=True))
33
+ except Exception as e:
34
+ raise Exception(
35
+ f"Can not fetch images for {self.connection.auth['auth_url']}"
36
+ ) from e
37
+
38
+ images: list[OSImage] = []
39
+
40
+ with concurrent.futures.ThreadPoolExecutor() as executor:
41
+ futures = [
42
+ executor.submit(self._get_image_info, image) for image in os_images
43
+ ]
44
+ for future in concurrent.futures.as_completed(futures):
45
+ images.append(future.result())
46
+
47
+ logger.info(f"Imported images for {self.connection.auth['auth_url']}")
48
+
49
+ return images
50
+
51
+ def _get_image_info(self, os_image: OSImage) -> Image:
52
+
53
+ try:
54
+ properties: dict = os_image.properties
55
+
56
+ properties.pop("owner_specified.openstack.md5", None)
57
+ properties.pop("owner_specified.openstack.sha256", None)
58
+ properties.pop("owner_specified.openstack.object", None)
59
+ properties.pop("stores", None)
60
+ except Exception as e:
61
+ logger.warn(f"properties for {os_image.id} is None")
62
+
63
+ image = Image(
64
+ image_id=os_image.id,
65
+ disk_format=os_image.disk_format,
66
+ min_disk=os_image.min_disk,
67
+ min_ram=os_image.min_ram,
68
+ image_name=os_image.name,
69
+ owner=os_image.owner,
70
+ properties=os_image.properties,
71
+ protected=os_image.is_protected,
72
+ status=os_image.status,
73
+ os_distro=os_image.os_distro,
74
+ size=os_image.size,
75
+ virtual_size=os_image.virtual_size,
76
+ visibility=os_image.visibility,
77
+ created_at=os_image.created_at,
78
+ updated_at=os_image.updated_at,
79
+ )
80
+
81
+ return image
@@ -1,9 +1,8 @@
1
- from abc import ABC, abstractmethod
2
-
3
- from osi_dump.model.instance import Instance
4
-
5
-
6
- class InstanceImporter(ABC):
7
- @abstractmethod
8
- def import_instances(self) -> list[Instance]:
9
- pass
1
+ from abc import ABC, abstractmethod
2
+ from typing import Generator
3
+ from osi_dump.model.instance import Instance
4
+
5
+ class InstanceImporter(ABC):
6
+ @abstractmethod
7
+ def import_instances(self) -> Generator[Instance, None, None]:
8
+ pass
@@ -1,136 +1,136 @@
1
- import logging
2
-
3
- import concurrent
4
-
5
- from openstack.connection import Connection
6
- from openstack.compute.v2.server import Server
7
-
8
- from openstack.compute.v2.flavor import Flavor as OSFlavor
9
-
10
- from osi_dump.importer.instance.instance_importer import InstanceImporter
11
- from osi_dump.model.instance import Instance
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
-
16
- class OpenStackInstanceImporter(InstanceImporter):
17
- def __init__(self, connection: Connection):
18
- self.connection = connection
19
-
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
- """
29
-
30
- logger.info(f"Importing instances for {self.connection.auth['auth_url']}")
31
-
32
- 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())
49
-
50
- logger.info(f"Imported instances for {self.connection.auth['auth_url']}")
51
-
52
- return instances
53
-
54
- def _get_instance_info(self, server: Server) -> Instance:
55
-
56
- project_name = None
57
- project_id = None
58
- try:
59
- project = self.connection.identity.get_project(server.project_id)
60
- project_name = project.name
61
- project_id = project.id
62
- except Exception as e:
63
- logger.warn(
64
- f"Unable to obtain project name for instance: {server.name}: {e}"
65
- )
66
-
67
- 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
- )
75
-
76
- # Lấy thông tin IPv4 private
77
- private_v4_ips = []
78
- floating_ip = None
79
-
80
- try:
81
- for ips in server.addresses.values():
82
- for ip in ips:
83
- if ip["OS-EXT-IPS:type"] == "fixed":
84
- private_v4_ips.append(ip["addr"])
85
- elif ip["OS-EXT-IPS:type"] == "floating":
86
- floating_ip = ip["addr"]
87
- except Exception as e:
88
- logger.warning(
89
- f"Unable to obtain IP address information for instance {server.name}: {e}"
90
- )
91
-
92
- vgpus = None
93
- vgpu_type = None
94
-
95
- vgpu_metadata_property = "pci_passthrough:alias"
96
-
97
- try:
98
- flavor: OSFlavor = self.connection.get_flavor(
99
- name_or_id=server.flavor["id"]
100
- )
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:
110
- pass
111
-
112
- image_id = server.image["id"]
113
- flavor_id = server.flavor["id"]
114
-
115
- instance = Instance(
116
- instance_id=server.id,
117
- instance_name=server.name,
118
- project_id=project_id,
119
- project_name=project_name,
120
- domain_name=domain_name,
121
- private_v4_ips=private_v4_ips,
122
- floating_ip=floating_ip,
123
- status=server.status,
124
- hypervisor=server.hypervisor_hostname,
125
- ram=server.flavor["ram"],
126
- vcpus=server.flavor["vcpus"],
127
- created_at=server.created_at,
128
- updated_at=server.updated_at,
129
- user_id=server.user_id,
130
- vgpus=vgpus,
131
- vgpu_type=vgpu_type,
132
- image_id=image_id,
133
- flavor_id=flavor_id
134
- )
135
-
136
- return instance
1
+ import logging
2
+
3
+ import concurrent
4
+
5
+ from openstack.connection import Connection
6
+ from openstack.compute.v2.server import Server
7
+
8
+ from openstack.compute.v2.flavor import Flavor as OSFlavor
9
+
10
+ from osi_dump.importer.instance.instance_importer import InstanceImporter
11
+ from osi_dump.model.instance import Instance
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class OpenStackInstanceImporter(InstanceImporter):
17
+ def __init__(self, connection: Connection):
18
+ self.connection = connection
19
+
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
+ """
29
+
30
+ logger.info(f"Importing instances for {self.connection.auth['auth_url']}")
31
+
32
+ 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())
49
+
50
+ logger.info(f"Imported instances for {self.connection.auth['auth_url']}")
51
+
52
+ return instances
53
+
54
+ def _get_instance_info(self, server: Server) -> Instance:
55
+
56
+ project_name = None
57
+ project_id = None
58
+ try:
59
+ project = self.connection.identity.get_project(server.project_id)
60
+ project_name = project.name
61
+ project_id = project.id
62
+ except Exception as e:
63
+ logger.warn(
64
+ f"Unable to obtain project name for instance: {server.name}: {e}"
65
+ )
66
+
67
+ 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
+ )
75
+
76
+ # Lấy thông tin IPv4 private
77
+ private_v4_ips = []
78
+ floating_ip = None
79
+
80
+ try:
81
+ for ips in server.addresses.values():
82
+ for ip in ips:
83
+ if ip["OS-EXT-IPS:type"] == "fixed":
84
+ private_v4_ips.append(ip["addr"])
85
+ elif ip["OS-EXT-IPS:type"] == "floating":
86
+ floating_ip = ip["addr"]
87
+ except Exception as e:
88
+ logger.warning(
89
+ f"Unable to obtain IP address information for instance {server.name}: {e}"
90
+ )
91
+
92
+ vgpus = None
93
+ vgpu_type = None
94
+
95
+ vgpu_metadata_property = "pci_passthrough:alias"
96
+
97
+ try:
98
+ flavor: OSFlavor = self.connection.get_flavor(
99
+ name_or_id=server.flavor["id"]
100
+ )
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:
110
+ pass
111
+
112
+ image_id = server.image["id"]
113
+ flavor_id = server.flavor["id"]
114
+
115
+ instance = Instance(
116
+ instance_id=server.id,
117
+ instance_name=server.name,
118
+ project_id=project_id,
119
+ project_name=project_name,
120
+ domain_name=domain_name,
121
+ private_v4_ips=private_v4_ips,
122
+ floating_ip=floating_ip,
123
+ status=server.status,
124
+ hypervisor=server.hypervisor_hostname,
125
+ ram=server.flavor["ram"],
126
+ vcpus=server.flavor["vcpus"],
127
+ created_at=server.created_at,
128
+ updated_at=server.updated_at,
129
+ user_id=server.user_id,
130
+ vgpus=vgpus,
131
+ vgpu_type=vgpu_type,
132
+ image_id=image_id,
133
+ flavor_id=flavor_id
134
+ )
135
+
136
+ return instance
@@ -1,9 +1,9 @@
1
- from abc import ABC, abstractmethod
2
-
3
- from osi_dump.model.load_balancer import LoadBalancer
4
-
5
-
6
- class LoadBalancerImporter(ABC):
7
- @abstractmethod
8
- def import_load_balancers(self) -> list[LoadBalancer]:
9
- pass
1
+ from abc import ABC, abstractmethod
2
+
3
+ from osi_dump.model.load_balancer import LoadBalancer
4
+
5
+
6
+ class LoadBalancerImporter(ABC):
7
+ @abstractmethod
8
+ def import_load_balancers(self) -> list[LoadBalancer]:
9
+ pass