osi-dump 0.1.2.2__tar.gz → 0.1.2.3__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.
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/PKG-INFO +3 -2
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/pyproject.toml +10 -3
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/api/octavia.py +3 -3
- osi_dump-0.1.2.3/src/osi_dump/batch_handler/external_port_batch_handler.py +57 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/cli.py +18 -0
- osi_dump-0.1.2.3/src/osi_dump/exporter/external_port/excel_external_port_exporter.py +34 -0
- osi_dump-0.1.2.3/src/osi_dump/exporter/external_port/external_port_exporter.py +7 -0
- osi_dump-0.1.2.3/src/osi_dump/importer/external_port/external_port_importer.py +9 -0
- osi_dump-0.1.2.3/src/osi_dump/importer/external_port/openstack_external_port_importer.py +129 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +3 -10
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/load_balancer/openstack_load_balancer_importer.py +2 -1
- osi_dump-0.1.2.3/src/osi_dump/model/__init__.py +0 -0
- osi_dump-0.1.2.3/src/osi_dump/model/external_port.py +27 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/image.py +1 -1
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/load_balancer.py +4 -2
- osi_dump-0.1.2.3/src/osi_dump/os_connection/__init__.py +0 -0
- osi_dump-0.1.2.3/src/osi_dump/util/panda_excel.py +33 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/PKG-INFO +3 -2
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/SOURCES.txt +8 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/requires.txt +1 -0
- osi_dump-0.1.2.2/src/osi_dump/util/panda_excel.py +0 -22
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/README.md +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/setup.cfg +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/__main__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/api/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/api/placement.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/flavor_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/floating_ip_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/hypervisor_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/image_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/instance_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/load_balancer_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/project_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/role_assignment_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/router_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/volume_batch_handler.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/__init__.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/flavor → osi_dump-0.1.2.3/src/osi_dump/exporter/external_port}/__init__.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/floating_ip → osi_dump-0.1.2.3/src/osi_dump/exporter/flavor}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/flavor/excel_flavor_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/flavor/flavor_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/hypervisor → osi_dump-0.1.2.3/src/osi_dump/exporter/floating_ip}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/image → osi_dump-0.1.2.3/src/osi_dump/exporter/hypervisor}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/instance → osi_dump-0.1.2.3/src/osi_dump/exporter/image}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/image/excel_image_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/image/image_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/load_balancer → osi_dump-0.1.2.3/src/osi_dump/exporter/instance}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/instance/excel_instance_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/instance/instance_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/project → osi_dump-0.1.2.3/src/osi_dump/exporter/load_balancer}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/role_assignment → osi_dump-0.1.2.3/src/osi_dump/exporter/project}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/project/excel_project_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/project/project_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/router → osi_dump-0.1.2.3/src/osi_dump/exporter/role_assignment}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/role_assignment/role_assignment_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/exporter/volume → osi_dump-0.1.2.3/src/osi_dump/exporter/router}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/router/excel_router_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/router/router_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/flavor → osi_dump-0.1.2.3/src/osi_dump/exporter/volume}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/volume/excel_volume_exporter.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/volume/volume_exporter.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/floating_ip → osi_dump-0.1.2.3/src/osi_dump/importer/external_port}/__init__.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/hypervisor → osi_dump-0.1.2.3/src/osi_dump/importer/flavor}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/flavor/flavor_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/flavor/openstack_flavor_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/image → osi_dump-0.1.2.3/src/osi_dump/importer/floating_ip}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/floating_ip/floating_ip_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/instance → osi_dump-0.1.2.3/src/osi_dump/importer/hypervisor}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/hypervisor/hypervisor_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/load_balancer → osi_dump-0.1.2.3/src/osi_dump/importer/image}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/image/image_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/image/openstack_image_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/project → osi_dump-0.1.2.3/src/osi_dump/importer/instance}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/instance/instance_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/instance/openstack_instance_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/role_assignment → osi_dump-0.1.2.3/src/osi_dump/importer/load_balancer}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/load_balancer/load_balancer_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/router → osi_dump-0.1.2.3/src/osi_dump/importer/project}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/project/openstack_project_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/project/project_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/importer/volume → osi_dump-0.1.2.3/src/osi_dump/importer/role_assignment}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/role_assignment/role_assignment_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/model → osi_dump-0.1.2.3/src/osi_dump/importer/router}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/router/openstack_router_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/router/router_importer.py +0 -0
- {osi_dump-0.1.2.2/src/osi_dump/os_connection → osi_dump-0.1.2.3/src/osi_dump/importer/volume}/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/volume/openstack_volume_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/volume/volume_importer.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/authentication_info.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/flavor.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/floating_ip.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/hypervisor.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/instance.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/project.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/role_assignment.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/router.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/model/volume.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/os_connection/get_connections.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/util/__init__.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/util/create_file.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/util/excel_autosize_column.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/util/excel_sort_sheet.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/util/export_data_excel.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/util/extract_hostname.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/util/validate_dir_path.py +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/dependency_links.txt +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/entry_points.txt +0 -0
- {osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/top_level.txt +0 -0
@@ -1,7 +1,7 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: osi-dump
|
3
|
-
Version: 0.1.2.
|
4
|
-
Summary: OpenStack
|
3
|
+
Version: 0.1.2.3
|
4
|
+
Summary: OpenStack information dump tool
|
5
5
|
Author: TVKain
|
6
6
|
License: Apache-2.0
|
7
7
|
Classifier: License :: OSI Approved :: Apache Software License
|
@@ -12,6 +12,7 @@ Requires-Dist: openstacksdk
|
|
12
12
|
Requires-Dist: pydantic
|
13
13
|
Requires-Dist: pandas
|
14
14
|
Requires-Dist: openpyxl
|
15
|
+
Requires-Dist: numpy
|
15
16
|
Provides-Extra: test
|
16
17
|
Requires-Dist: pytest; extra == "test"
|
17
18
|
|
@@ -1,13 +1,20 @@
|
|
1
1
|
[project]
|
2
2
|
name = "osi-dump"
|
3
|
-
version = "0.1.2.
|
4
|
-
description = "OpenStack
|
3
|
+
version = "0.1.2.3"
|
4
|
+
description = "OpenStack information dump tool"
|
5
5
|
readme = "README.md"
|
6
6
|
authors = [{ name = "TVKain" }]
|
7
7
|
license = { text = "Apache-2.0" }
|
8
8
|
requires-python = ">=3.10"
|
9
9
|
classifiers = ["License :: OSI Approved :: Apache Software License"]
|
10
|
-
dependencies = [
|
10
|
+
dependencies = [
|
11
|
+
"typer",
|
12
|
+
"openstacksdk",
|
13
|
+
"pydantic",
|
14
|
+
"pandas",
|
15
|
+
"openpyxl",
|
16
|
+
"numpy",
|
17
|
+
]
|
11
18
|
|
12
19
|
|
13
20
|
[project.scripts]
|
@@ -17,13 +17,13 @@ def get_load_balancers(connection: Connection) -> list[LoadBalancer]:
|
|
17
17
|
return data["loadbalancers"]
|
18
18
|
|
19
19
|
|
20
|
-
def get_amphoraes(connection: Connection, load_balancer_id: str) -> list[
|
20
|
+
def get_amphoraes(connection: Connection, load_balancer_id: str) -> list[dict]:
|
21
21
|
|
22
22
|
octavia_endpoint = connection.endpoint_for(
|
23
23
|
service_type="load-balancer", interface="public"
|
24
24
|
)
|
25
25
|
|
26
|
-
url = f"{octavia_endpoint}/v2/octavia/amphorae?load_balancer_id={load_balancer_id}&fields=
|
26
|
+
url = f"{octavia_endpoint}/v2/octavia/amphorae?load_balancer_id={load_balancer_id}&fields=status&fields=compute_id"
|
27
27
|
|
28
28
|
response = connection.session.get(url)
|
29
29
|
|
@@ -31,4 +31,4 @@ def get_amphoraes(connection: Connection, load_balancer_id: str) -> list[str]:
|
|
31
31
|
|
32
32
|
amphoraes = data["amphorae"]
|
33
33
|
|
34
|
-
return
|
34
|
+
return amphoraes
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from openstack.connection import Connection
|
4
|
+
|
5
|
+
from osi_dump.exporter.external_port.external_port_exporter import ExternalPortExporter
|
6
|
+
from osi_dump.exporter.external_port.excel_external_port_exporter import (
|
7
|
+
ExcelExternalPortExporter,
|
8
|
+
)
|
9
|
+
|
10
|
+
from osi_dump.importer.external_port.external_port_importer import ExternalPortImporter
|
11
|
+
from osi_dump.importer.external_port.openstack_external_port_importer import (
|
12
|
+
OpenStackExternalPortImporter,
|
13
|
+
)
|
14
|
+
|
15
|
+
|
16
|
+
from osi_dump import util
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
class ExternalPortBatchHandler:
|
22
|
+
def __init__(self):
|
23
|
+
self._importer_exporter_list: list[
|
24
|
+
tuple[ExternalPortImporter, ExternalPortExporter]
|
25
|
+
] = []
|
26
|
+
|
27
|
+
def add_importer_exporter_from_openstack_connections(
|
28
|
+
self, connections: list[Connection], output_file: str
|
29
|
+
):
|
30
|
+
for connection in connections:
|
31
|
+
importer = OpenStackExternalPortImporter(connection)
|
32
|
+
|
33
|
+
sheet_name = (
|
34
|
+
f"{util.extract_hostname(connection.auth['auth_url'])}-external_port"
|
35
|
+
)
|
36
|
+
exporter = ExcelExternalPortExporter(
|
37
|
+
sheet_name=sheet_name, output_file=output_file
|
38
|
+
)
|
39
|
+
|
40
|
+
self.add_importer_exporter(importer=importer, exporter=exporter)
|
41
|
+
|
42
|
+
def add_importer_exporter(
|
43
|
+
self, importer: ExternalPortImporter, exporter: ExternalPortExporter
|
44
|
+
):
|
45
|
+
self._importer_exporter_list.append((importer, exporter))
|
46
|
+
|
47
|
+
def process(self):
|
48
|
+
|
49
|
+
for importer, exporter in self._importer_exporter_list:
|
50
|
+
try:
|
51
|
+
|
52
|
+
external_ports = importer.import_external_ports()
|
53
|
+
|
54
|
+
exporter.export_external_ports(external_ports=external_ports)
|
55
|
+
except Exception as e:
|
56
|
+
logger.warning(e)
|
57
|
+
logger.warning("Skipping...")
|
@@ -8,6 +8,7 @@ import typer
|
|
8
8
|
|
9
9
|
from typing_extensions import Annotated
|
10
10
|
|
11
|
+
from osi_dump.batch_handler.external_port_batch_handler import ExternalPortBatchHandler
|
11
12
|
from osi_dump.batch_handler.load_balancer_batch_handler import LoadBalancerBatchHandler
|
12
13
|
from osi_dump.batch_handler.role_assignment_batch_handler import (
|
13
14
|
RoleAssignmentBatchHandler,
|
@@ -31,6 +32,11 @@ from osi_dump.batch_handler import (
|
|
31
32
|
)
|
32
33
|
|
33
34
|
|
35
|
+
from osi_dump.importer.external_port.openstack_external_port_importer import (
|
36
|
+
OpenStackExternalPortImporter,
|
37
|
+
)
|
38
|
+
|
39
|
+
|
34
40
|
from osi_dump import util
|
35
41
|
|
36
42
|
|
@@ -134,6 +140,16 @@ def _router(connections, output_path: str):
|
|
134
140
|
_router_batch_handler.process()
|
135
141
|
|
136
142
|
|
143
|
+
def _external_port(connections, output_path: str):
|
144
|
+
_external_batch_handler = ExternalPortBatchHandler()
|
145
|
+
|
146
|
+
_external_batch_handler.add_importer_exporter_from_openstack_connections(
|
147
|
+
connections, output_file=output_path
|
148
|
+
)
|
149
|
+
|
150
|
+
_external_batch_handler.process()
|
151
|
+
|
152
|
+
|
137
153
|
def inner_main(file_path: str, output_path: str):
|
138
154
|
|
139
155
|
logger = logging.getLogger(__name__)
|
@@ -160,6 +176,8 @@ def inner_main(file_path: str, output_path: str):
|
|
160
176
|
|
161
177
|
_router(connections=connections, output_path=output_path)
|
162
178
|
|
179
|
+
_external_port(connections=connections, output_path=output_path)
|
180
|
+
|
163
181
|
util.excel_autosize_column(output_path)
|
164
182
|
|
165
183
|
util.excel_sort_sheet(output_path)
|
@@ -0,0 +1,34 @@
|
|
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.external_port.external_port_exporter import ExternalPortExporter
|
9
|
+
|
10
|
+
from osi_dump.model.external_port import ExternalPort
|
11
|
+
|
12
|
+
logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
|
15
|
+
class ExcelExternalPortExporter(ExternalPortExporter):
|
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_external_ports(self, external_ports: list[ExternalPort]):
|
21
|
+
|
22
|
+
df = pd.DataFrame(
|
23
|
+
[external_port.model_dump() for external_port in external_ports]
|
24
|
+
)
|
25
|
+
|
26
|
+
df = util.panda_excel.expand_list_column(df, "allowed_address_pairs")
|
27
|
+
|
28
|
+
logger.info(f"Exporting external_ports for {self.sheet_name}")
|
29
|
+
try:
|
30
|
+
util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
|
31
|
+
|
32
|
+
logger.info(f"Exported external_ports for {self.sheet_name}")
|
33
|
+
except Exception as e:
|
34
|
+
logger.warning(f"Exporting external_ports for {self.sheet_name} error: {e}")
|
@@ -0,0 +1,129 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
import ipaddress
|
4
|
+
|
5
|
+
import concurrent
|
6
|
+
|
7
|
+
import numpy as np
|
8
|
+
|
9
|
+
from openstack.connection import Connection
|
10
|
+
from openstack.network.v2.port import Port as OSPort
|
11
|
+
from openstack.network.v2.subnet import Subnet as OSSubnet
|
12
|
+
|
13
|
+
from osi_dump.importer.external_port.external_port_importer import ExternalPortImporter
|
14
|
+
from osi_dump.model.external_port import ExternalPort
|
15
|
+
|
16
|
+
logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
|
19
|
+
class OpenStackExternalPortImporter(ExternalPortImporter):
|
20
|
+
def __init__(self, connection: Connection):
|
21
|
+
self.connection = connection
|
22
|
+
|
23
|
+
def _get_external_ports(self) -> list[OSPort]:
|
24
|
+
|
25
|
+
self.connection.list_networks()
|
26
|
+
# Get all external networks
|
27
|
+
networks = self.connection.network.networks(
|
28
|
+
is_router_external=True,
|
29
|
+
)
|
30
|
+
|
31
|
+
external_ports = []
|
32
|
+
|
33
|
+
for network in networks:
|
34
|
+
ex_ports = list(self.connection.network.ports(network_id=network.id))
|
35
|
+
|
36
|
+
for ex_port in ex_ports:
|
37
|
+
ex_port["segmentation_id"] = network.provider_segmentation_id
|
38
|
+
|
39
|
+
external_ports.append(ex_ports)
|
40
|
+
|
41
|
+
# Get all port on those networks
|
42
|
+
|
43
|
+
external_ports = list(np.array(external_ports).flatten())
|
44
|
+
|
45
|
+
return external_ports
|
46
|
+
|
47
|
+
def import_external_ports(self) -> list[ExternalPort]:
|
48
|
+
"""Import external_ports information from Openstack
|
49
|
+
|
50
|
+
|
51
|
+
Raises:
|
52
|
+
Exception: Raises exception if fetching external_port failed
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
list[Instance]: _description_
|
56
|
+
"""
|
57
|
+
|
58
|
+
logger.info(f"Importing external_ports for {self.connection.auth['auth_url']}")
|
59
|
+
|
60
|
+
try:
|
61
|
+
os_ports: list[OSPort] = self._get_external_ports()
|
62
|
+
except Exception as e:
|
63
|
+
raise Exception(
|
64
|
+
f"Can not fetch external_ports for {self.connection.auth['auth_url']}"
|
65
|
+
) from e
|
66
|
+
|
67
|
+
external_ports: list[ExternalPort] = []
|
68
|
+
|
69
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
70
|
+
futures = [
|
71
|
+
executor.submit(self._get_external_port_info, external_port)
|
72
|
+
for external_port in os_ports
|
73
|
+
]
|
74
|
+
for future in concurrent.futures.as_completed(futures):
|
75
|
+
external_ports.append(future.result())
|
76
|
+
|
77
|
+
logger.info(f"Imported external_ports for {self.connection.auth['auth_url']}")
|
78
|
+
|
79
|
+
external_ports = sorted(
|
80
|
+
external_ports,
|
81
|
+
key=lambda external_port: (
|
82
|
+
external_port.network_id,
|
83
|
+
(
|
84
|
+
ipaddress.ip_address(external_port.ip_address)
|
85
|
+
if external_port.ip_address
|
86
|
+
else ipaddress.ip_address("0.0.0.0")
|
87
|
+
),
|
88
|
+
),
|
89
|
+
)
|
90
|
+
|
91
|
+
return external_ports
|
92
|
+
|
93
|
+
def _get_external_port_info(self, external_port: OSPort) -> ExternalPort:
|
94
|
+
|
95
|
+
subnet_id = None
|
96
|
+
ip_address = None
|
97
|
+
subnet_cidr = None
|
98
|
+
|
99
|
+
try:
|
100
|
+
ip_address = external_port.fixed_ips[0]["ip_address"]
|
101
|
+
except Exception as e:
|
102
|
+
logger.warning(f"No IP address found for port {external_port.id}")
|
103
|
+
|
104
|
+
try:
|
105
|
+
subnet_id = external_port.fixed_ips[0]["subnet_id"]
|
106
|
+
except Exception as e:
|
107
|
+
logger.warning(f"No subnet ID found for {external_port.id}")
|
108
|
+
|
109
|
+
try:
|
110
|
+
subnet: OSSubnet = self.connection.get_subnet_by_id(subnet_id)
|
111
|
+
|
112
|
+
subnet_cidr = subnet.cidr
|
113
|
+
except Exception as e:
|
114
|
+
logger.warning(f"No subnet cidr found for port {external_port.id}")
|
115
|
+
|
116
|
+
external_port_ret = ExternalPort(
|
117
|
+
port_id=external_port.id,
|
118
|
+
project_id=external_port.project_id,
|
119
|
+
network_id=external_port.network_id,
|
120
|
+
subnet_id=subnet_id,
|
121
|
+
subnet_cidr=subnet_cidr,
|
122
|
+
ip_address=ip_address,
|
123
|
+
allowed_address_pairs=external_port.allowed_address_pairs,
|
124
|
+
device_id=external_port.device_id,
|
125
|
+
device_owner=external_port.device_owner,
|
126
|
+
status=external_port.status,
|
127
|
+
)
|
128
|
+
|
129
|
+
return external_port_ret
|
@@ -30,12 +30,11 @@ class OpenStackHypervisorImporter(HypervisorImporter):
|
|
30
30
|
list[Hypervisor]: _description_
|
31
31
|
"""
|
32
32
|
|
33
|
-
logger.info(f"Importing hypervisors for {self.connection.auth['auth_url']}")
|
34
|
-
|
35
33
|
try:
|
36
34
|
oshypervisors: list[OSHypervisor] = list(
|
37
|
-
self.connection.compute.hypervisors(details=True)
|
35
|
+
self.connection.compute.hypervisors(details=True, with_servers=True)
|
38
36
|
)
|
37
|
+
|
39
38
|
except Exception as e:
|
40
39
|
raise Exception(
|
41
40
|
f"Can not fetch hypervisor for {self.connection.auth['auth_url']}"
|
@@ -65,12 +64,6 @@ class OpenStackHypervisorImporter(HypervisorImporter):
|
|
65
64
|
)
|
66
65
|
)
|
67
66
|
|
68
|
-
servers = list(
|
69
|
-
self.connection.compute.servers(
|
70
|
-
details=True, all_project=True, hypervisor_hostname=hypervisor.name
|
71
|
-
)
|
72
|
-
)
|
73
|
-
|
74
67
|
usage_data = get_usage(self.connection, resource_provider_id=hypervisor.id)
|
75
68
|
|
76
69
|
vcpu = rpi[0]
|
@@ -89,7 +82,7 @@ class OpenStackHypervisorImporter(HypervisorImporter):
|
|
89
82
|
vcpus_usage=usage_data["VCPU"],
|
90
83
|
memory_usage=usage_data["MEMORY_MB"],
|
91
84
|
local_disk_usage=usage_data["DISK_GB"],
|
92
|
-
vm_count=len(servers),
|
85
|
+
vm_count=len(hypervisor.servers),
|
93
86
|
)
|
94
87
|
|
95
88
|
return ret_hypervisor
|
@@ -64,8 +64,9 @@ class OpenStackLoadBalancerImporter(LoadBalancerImporter):
|
|
64
64
|
load_balancer_ret = LoadBalancer(
|
65
65
|
id=load_balancer["id"],
|
66
66
|
load_balancer_name=load_balancer["name"],
|
67
|
-
|
67
|
+
operating_status=load_balancer["operating_status"],
|
68
68
|
project_id=load_balancer["project_id"],
|
69
|
+
provisioning_status=load_balancer["provisioning_status"],
|
69
70
|
amphoraes=amphoraes,
|
70
71
|
)
|
71
72
|
|
File without changes
|
@@ -0,0 +1,27 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from pydantic import BaseModel, ConfigDict, ValidationError
|
4
|
+
|
5
|
+
|
6
|
+
class ExternalPort(BaseModel):
|
7
|
+
model_config = ConfigDict(strict=True)
|
8
|
+
|
9
|
+
port_id: str
|
10
|
+
|
11
|
+
project_id: Optional[str]
|
12
|
+
|
13
|
+
subnet_id: Optional[str]
|
14
|
+
|
15
|
+
subnet_cidr: Optional[str]
|
16
|
+
|
17
|
+
ip_address: Optional[str]
|
18
|
+
|
19
|
+
network_id: Optional[str]
|
20
|
+
|
21
|
+
allowed_address_pairs: Optional[list[dict]]
|
22
|
+
|
23
|
+
device_id: Optional[str]
|
24
|
+
|
25
|
+
device_owner: Optional[str]
|
26
|
+
|
27
|
+
status: Optional[str]
|
File without changes
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import pandas as pd
|
2
|
+
|
3
|
+
from pandas import DataFrame
|
4
|
+
|
5
|
+
|
6
|
+
def expand_list_column(df, column):
|
7
|
+
# Find the maximum length of the list in the column
|
8
|
+
max_len = df[column].apply(len).max()
|
9
|
+
|
10
|
+
# Expand each dictionary in the list into columns
|
11
|
+
expanded_df = pd.DataFrame(
|
12
|
+
df[column]
|
13
|
+
.apply(lambda x: [{**item} for item in x] + [{}] * (max_len - len(x)))
|
14
|
+
.tolist(),
|
15
|
+
index=df.index,
|
16
|
+
)
|
17
|
+
|
18
|
+
# Flatten the nested dictionaries into separate columns
|
19
|
+
expanded_df = pd.json_normalize(expanded_df.to_dict(orient="records"))
|
20
|
+
|
21
|
+
new_columns = []
|
22
|
+
for i in range(max_len):
|
23
|
+
for key in expanded_df.columns[i::max_len]:
|
24
|
+
new_key = key.split(".")[-1] # Get the actual key name
|
25
|
+
new_columns.append(f"{column}_{i+1}.{new_key}")
|
26
|
+
|
27
|
+
# Rename the columns to reflect the nested structure
|
28
|
+
expanded_df.columns = new_columns
|
29
|
+
|
30
|
+
# Drop the original column and join the expanded columns
|
31
|
+
df = df.drop(column, axis=1).join(expanded_df)
|
32
|
+
|
33
|
+
return df
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: osi-dump
|
3
|
-
Version: 0.1.2.
|
4
|
-
Summary: OpenStack
|
3
|
+
Version: 0.1.2.3
|
4
|
+
Summary: OpenStack information dump tool
|
5
5
|
Author: TVKain
|
6
6
|
License: Apache-2.0
|
7
7
|
Classifier: License :: OSI Approved :: Apache Software License
|
@@ -12,6 +12,7 @@ Requires-Dist: openstacksdk
|
|
12
12
|
Requires-Dist: pydantic
|
13
13
|
Requires-Dist: pandas
|
14
14
|
Requires-Dist: openpyxl
|
15
|
+
Requires-Dist: numpy
|
15
16
|
Provides-Extra: test
|
16
17
|
Requires-Dist: pytest; extra == "test"
|
17
18
|
|
@@ -13,6 +13,7 @@ src/osi_dump/api/__init__.py
|
|
13
13
|
src/osi_dump/api/octavia.py
|
14
14
|
src/osi_dump/api/placement.py
|
15
15
|
src/osi_dump/batch_handler/__init__.py
|
16
|
+
src/osi_dump/batch_handler/external_port_batch_handler.py
|
16
17
|
src/osi_dump/batch_handler/flavor_batch_handler.py
|
17
18
|
src/osi_dump/batch_handler/floating_ip_batch_handler.py
|
18
19
|
src/osi_dump/batch_handler/hypervisor_batch_handler.py
|
@@ -24,6 +25,9 @@ src/osi_dump/batch_handler/role_assignment_batch_handler.py
|
|
24
25
|
src/osi_dump/batch_handler/router_batch_handler.py
|
25
26
|
src/osi_dump/batch_handler/volume_batch_handler.py
|
26
27
|
src/osi_dump/exporter/__init__.py
|
28
|
+
src/osi_dump/exporter/external_port/__init__.py
|
29
|
+
src/osi_dump/exporter/external_port/excel_external_port_exporter.py
|
30
|
+
src/osi_dump/exporter/external_port/external_port_exporter.py
|
27
31
|
src/osi_dump/exporter/flavor/__init__.py
|
28
32
|
src/osi_dump/exporter/flavor/excel_flavor_exporter.py
|
29
33
|
src/osi_dump/exporter/flavor/flavor_exporter.py
|
@@ -54,6 +58,9 @@ src/osi_dump/exporter/router/router_exporter.py
|
|
54
58
|
src/osi_dump/exporter/volume/__init__.py
|
55
59
|
src/osi_dump/exporter/volume/excel_volume_exporter.py
|
56
60
|
src/osi_dump/exporter/volume/volume_exporter.py
|
61
|
+
src/osi_dump/importer/external_port/__init__.py
|
62
|
+
src/osi_dump/importer/external_port/external_port_importer.py
|
63
|
+
src/osi_dump/importer/external_port/openstack_external_port_importer.py
|
57
64
|
src/osi_dump/importer/flavor/__init__.py
|
58
65
|
src/osi_dump/importer/flavor/flavor_importer.py
|
59
66
|
src/osi_dump/importer/flavor/openstack_flavor_importer.py
|
@@ -86,6 +93,7 @@ src/osi_dump/importer/volume/openstack_volume_importer.py
|
|
86
93
|
src/osi_dump/importer/volume/volume_importer.py
|
87
94
|
src/osi_dump/model/__init__.py
|
88
95
|
src/osi_dump/model/authentication_info.py
|
96
|
+
src/osi_dump/model/external_port.py
|
89
97
|
src/osi_dump/model/flavor.py
|
90
98
|
src/osi_dump/model/floating_ip.py
|
91
99
|
src/osi_dump/model/hypervisor.py
|
@@ -1,22 +0,0 @@
|
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/floating_ip_batch_handler.py
RENAMED
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/hypervisor_batch_handler.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/load_balancer_batch_handler.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/role_assignment_batch_handler.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py
RENAMED
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/instance/excel_instance_exporter.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/exporter/project/excel_project_exporter.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/flavor/openstack_flavor_importer.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/floating_ip/floating_ip_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/hypervisor/hypervisor_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/image/openstack_image_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/instance/openstack_instance_importer.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/load_balancer/load_balancer_importer.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/project/openstack_project_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2/src/osi_dump/model → osi_dump-0.1.2.3/src/osi_dump/importer/router}/__init__.py
RENAMED
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/router/openstack_router_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.2 → osi_dump-0.1.2.3}/src/osi_dump/importer/volume/openstack_volume_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|