osi-dump 0.1.2.1__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.1 → osi_dump-0.1.2.3}/PKG-INFO +3 -2
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/pyproject.toml +10 -3
- osi_dump-0.1.2.3/src/osi_dump/api/octavia.py +34 -0
- osi_dump-0.1.2.3/src/osi_dump/batch_handler/external_port_batch_handler.py +57 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/load_balancer_batch_handler.py +1 -3
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/role_assignment_batch_handler.py +1 -1
- osi_dump-0.1.2.3/src/osi_dump/batch_handler/router_batch_handler.py +49 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/cli.py +32 -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.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py +2 -0
- osi_dump-0.1.2.3/src/osi_dump/exporter/router/excel_router_exporter.py +30 -0
- osi_dump-0.1.2.3/src/osi_dump/exporter/router/router_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.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +3 -10
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/instance/openstack_instance_importer.py +1 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/load_balancer/openstack_load_balancer_importer.py +15 -7
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py +21 -4
- osi_dump-0.1.2.3/src/osi_dump/importer/router/__init__.py +0 -0
- osi_dump-0.1.2.3/src/osi_dump/importer/router/openstack_router_importer.py +86 -0
- osi_dump-0.1.2.3/src/osi_dump/importer/router/router_importer.py +9 -0
- osi_dump-0.1.2.3/src/osi_dump/importer/volume/__init__.py +0 -0
- 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.1 → osi_dump-0.1.2.3}/src/osi_dump/model/image.py +2 -2
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/instance.py +1 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/load_balancer.py +4 -2
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/role_assignment.py +2 -2
- osi_dump-0.1.2.3/src/osi_dump/model/router.py +20 -0
- osi_dump-0.1.2.3/src/osi_dump/os_connection/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/util/__init__.py +1 -0
- osi_dump-0.1.2.3/src/osi_dump/util/panda_excel.py +33 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/PKG-INFO +3 -2
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/SOURCES.txt +17 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/requires.txt +1 -0
- osi_dump-0.1.2.1/src/osi_dump/api/octavia.py +0 -17
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/README.md +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/setup.cfg +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/__main__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/api/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/api/placement.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/flavor_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/floating_ip_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/hypervisor_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/image_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/instance_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/project_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/volume_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/__init__.py +0 -0
- {osi_dump-0.1.2.1/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.1/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.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/flavor/excel_flavor_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/flavor/flavor_exporter.py +0 -0
- {osi_dump-0.1.2.1/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.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py +0 -0
- {osi_dump-0.1.2.1/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.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py +0 -0
- {osi_dump-0.1.2.1/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.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/image/excel_image_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/image/image_exporter.py +0 -0
- {osi_dump-0.1.2.1/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.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/instance/excel_instance_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/instance/instance_exporter.py +0 -0
- {osi_dump-0.1.2.1/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.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py +0 -0
- {osi_dump-0.1.2.1/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.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/project/excel_project_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/project/project_exporter.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/exporter/volume → osi_dump-0.1.2.3/src/osi_dump/exporter/role_assignment}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/role_assignment/role_assignment_exporter.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/flavor → osi_dump-0.1.2.3/src/osi_dump/exporter/router}/__init__.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/floating_ip → osi_dump-0.1.2.3/src/osi_dump/exporter/volume}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/volume/excel_volume_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/exporter/volume/volume_exporter.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/hypervisor → osi_dump-0.1.2.3/src/osi_dump/importer/external_port}/__init__.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/image → osi_dump-0.1.2.3/src/osi_dump/importer/flavor}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/flavor/flavor_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/flavor/openstack_flavor_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/instance → osi_dump-0.1.2.3/src/osi_dump/importer/floating_ip}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/floating_ip/floating_ip_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer → osi_dump-0.1.2.3/src/osi_dump/importer/hypervisor}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/hypervisor/hypervisor_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/project → osi_dump-0.1.2.3/src/osi_dump/importer/image}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/image/image_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/image/openstack_image_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment → osi_dump-0.1.2.3/src/osi_dump/importer/instance}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/instance/instance_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/volume → osi_dump-0.1.2.3/src/osi_dump/importer/load_balancer}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/load_balancer/load_balancer_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/model → osi_dump-0.1.2.3/src/osi_dump/importer/project}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/project/openstack_project_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/project/project_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/os_connection → osi_dump-0.1.2.3/src/osi_dump/importer/role_assignment}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/role_assignment/role_assignment_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/volume/openstack_volume_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/volume/volume_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/authentication_info.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/flavor.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/floating_ip.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/hypervisor.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/project.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/model/volume.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/os_connection/get_connections.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/util/create_file.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/util/excel_autosize_column.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/util/excel_sort_sheet.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/util/export_data_excel.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/util/extract_hostname.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/util/validate_dir_path.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/dependency_links.txt +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump.egg-info/entry_points.txt +0 -0
- {osi_dump-0.1.2.1 → 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]
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from openstack.connection import Connection
|
2
|
+
from openstack.identity.v3.service import Service
|
3
|
+
from openstack.load_balancer.v2.load_balancer import LoadBalancer
|
4
|
+
|
5
|
+
|
6
|
+
def get_load_balancers(connection: Connection) -> list[LoadBalancer]:
|
7
|
+
octavia_endpoint = connection.endpoint_for(
|
8
|
+
service_type="load-balancer", interface="public"
|
9
|
+
)
|
10
|
+
|
11
|
+
url = f"{octavia_endpoint}/v2.0/lbaas/loadbalancers"
|
12
|
+
|
13
|
+
response = connection.session.get(url)
|
14
|
+
|
15
|
+
data = response.json()
|
16
|
+
|
17
|
+
return data["loadbalancers"]
|
18
|
+
|
19
|
+
|
20
|
+
def get_amphoraes(connection: Connection, load_balancer_id: str) -> list[dict]:
|
21
|
+
|
22
|
+
octavia_endpoint = connection.endpoint_for(
|
23
|
+
service_type="load-balancer", interface="public"
|
24
|
+
)
|
25
|
+
|
26
|
+
url = f"{octavia_endpoint}/v2/octavia/amphorae?load_balancer_id={load_balancer_id}&fields=status&fields=compute_id"
|
27
|
+
|
28
|
+
response = connection.session.get(url)
|
29
|
+
|
30
|
+
data = response.json()
|
31
|
+
|
32
|
+
amphoraes = data["amphorae"]
|
33
|
+
|
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...")
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/load_balancer_batch_handler.py
RENAMED
@@ -34,9 +34,7 @@ class LoadBalancerBatchHandler:
|
|
34
34
|
for connection in connections:
|
35
35
|
importer = OpenStackLoadBalancerImporter(connection)
|
36
36
|
|
37
|
-
sheet_name = (
|
38
|
-
f"{util.extract_hostname(connection.auth['auth_url'])}-load_balancer"
|
39
|
-
)
|
37
|
+
sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-lb"
|
40
38
|
exporter = ExcelLoadBalancerExporter(
|
41
39
|
sheet_name=sheet_name, output_file=output_file
|
42
40
|
)
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/batch_handler/role_assignment_batch_handler.py
RENAMED
@@ -35,7 +35,7 @@ class RoleAssignmentBatchHandler:
|
|
35
35
|
importer = OpenStackRoleAssignmentImporter(connection)
|
36
36
|
|
37
37
|
sheet_name = (
|
38
|
-
f"{util.extract_hostname(connection.auth['auth_url'])}-
|
38
|
+
f"{util.extract_hostname(connection.auth['auth_url'])}-role_ass"
|
39
39
|
)
|
40
40
|
exporter = ExcelRoleAssignmentExporter(
|
41
41
|
sheet_name=sheet_name, output_file=output_file
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from openstack.connection import Connection
|
4
|
+
|
5
|
+
from osi_dump.exporter.router.router_exporter import (
|
6
|
+
RouterExporter,
|
7
|
+
)
|
8
|
+
from osi_dump.exporter.router.excel_router_exporter import ExcelRouterExporter
|
9
|
+
|
10
|
+
from osi_dump.importer.router.router_importer import RouterImporter
|
11
|
+
from osi_dump.importer.router.openstack_router_importer import (
|
12
|
+
OpenStackRouterImporter,
|
13
|
+
)
|
14
|
+
|
15
|
+
|
16
|
+
from osi_dump import util
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
class RouterBatchHandler:
|
22
|
+
def __init__(self):
|
23
|
+
self._importer_exporter_list: list[tuple[RouterImporter, RouterExporter]] = []
|
24
|
+
|
25
|
+
def add_importer_exporter_from_openstack_connections(
|
26
|
+
self, connections: list[Connection], output_file: str
|
27
|
+
):
|
28
|
+
for connection in connections:
|
29
|
+
importer = OpenStackRouterImporter(connection)
|
30
|
+
|
31
|
+
sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-router"
|
32
|
+
exporter = ExcelRouterExporter(
|
33
|
+
sheet_name=sheet_name, output_file=output_file
|
34
|
+
)
|
35
|
+
|
36
|
+
self.add_importer_exporter(importer=importer, exporter=exporter)
|
37
|
+
|
38
|
+
def add_importer_exporter(self, importer: RouterImporter, exporter: RouterExporter):
|
39
|
+
self._importer_exporter_list.append((importer, exporter))
|
40
|
+
|
41
|
+
def process(self):
|
42
|
+
for importer, exporter in self._importer_exporter_list:
|
43
|
+
try:
|
44
|
+
routers = importer.import_routers()
|
45
|
+
|
46
|
+
exporter.export_routers(routers=routers)
|
47
|
+
except Exception as e:
|
48
|
+
logger.warning(e)
|
49
|
+
logger.warning("Skipping...")
|
@@ -8,10 +8,12 @@ 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,
|
14
15
|
)
|
16
|
+
from osi_dump.batch_handler.router_batch_handler import RouterBatchHandler
|
15
17
|
|
16
18
|
app = typer.Typer()
|
17
19
|
|
@@ -30,6 +32,11 @@ from osi_dump.batch_handler import (
|
|
30
32
|
)
|
31
33
|
|
32
34
|
|
35
|
+
from osi_dump.importer.external_port.openstack_external_port_importer import (
|
36
|
+
OpenStackExternalPortImporter,
|
37
|
+
)
|
38
|
+
|
39
|
+
|
33
40
|
from osi_dump import util
|
34
41
|
|
35
42
|
|
@@ -123,6 +130,26 @@ def _load_balancer(connections, output_path: str):
|
|
123
130
|
_load_balancer_batch_handler.process()
|
124
131
|
|
125
132
|
|
133
|
+
def _router(connections, output_path: str):
|
134
|
+
_router_batch_handler = RouterBatchHandler()
|
135
|
+
|
136
|
+
_router_batch_handler.add_importer_exporter_from_openstack_connections(
|
137
|
+
connections, output_file=output_path
|
138
|
+
)
|
139
|
+
|
140
|
+
_router_batch_handler.process()
|
141
|
+
|
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
|
+
|
126
153
|
def inner_main(file_path: str, output_path: str):
|
127
154
|
|
128
155
|
logger = logging.getLogger(__name__)
|
@@ -146,6 +173,11 @@ def inner_main(file_path: str, output_path: str):
|
|
146
173
|
_role_assignment(connections=connections, output_path=output_path)
|
147
174
|
|
148
175
|
_load_balancer(connections=connections, output_path=output_path)
|
176
|
+
|
177
|
+
_router(connections=connections, output_path=output_path)
|
178
|
+
|
179
|
+
_external_port(connections=connections, output_path=output_path)
|
180
|
+
|
149
181
|
util.excel_autosize_column(output_path)
|
150
182
|
|
151
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}")
|
@@ -24,6 +24,8 @@ class ExcelLoadBalancerExporter(LoadBalancerExporter):
|
|
24
24
|
[load_balancer.model_dump() for load_balancer in load_balancers]
|
25
25
|
)
|
26
26
|
|
27
|
+
df = util.expand_list_column(df, "amphoraes")
|
28
|
+
|
27
29
|
logger.info(f"Exporting load_balancers for {self.sheet_name}")
|
28
30
|
try:
|
29
31
|
util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
|
@@ -0,0 +1,30 @@
|
|
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.router.router_exporter import RouterExporter
|
9
|
+
|
10
|
+
from osi_dump.model.router import Router
|
11
|
+
|
12
|
+
logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
|
15
|
+
class ExcelRouterExporter(RouterExporter):
|
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_routers(self, routers: list[Router]):
|
21
|
+
|
22
|
+
df = pd.DataFrame([router.model_dump() for router in routers])
|
23
|
+
|
24
|
+
logger.info(f"Exporting routers for {self.sheet_name}")
|
25
|
+
try:
|
26
|
+
util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
|
27
|
+
|
28
|
+
logger.info(f"Exported routers for {self.sheet_name}")
|
29
|
+
except Exception as e:
|
30
|
+
logger.warning(f"Exporting routers 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=False, all_project=True, hypervisor=hypervisor.id
|
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
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.3}/src/osi_dump/importer/instance/openstack_instance_importer.py
RENAMED
@@ -96,6 +96,7 @@ class OpenStackInstanceImporter(InstanceImporter):
|
|
96
96
|
private_v4_ips=private_v4_ips,
|
97
97
|
floating_ip=floating_ip,
|
98
98
|
status=server.status,
|
99
|
+
hypervisor=server.hypervisor_hostname,
|
99
100
|
ram=server.flavor["ram"],
|
100
101
|
vcpus=server.flavor["vcpus"],
|
101
102
|
created_at=server.created_at,
|
@@ -11,6 +11,8 @@ from osi_dump.importer.load_balancer.load_balancer_importer import (
|
|
11
11
|
)
|
12
12
|
from osi_dump.model.load_balancer import LoadBalancer
|
13
13
|
|
14
|
+
import osi_dump.api.octavia as octavia_api
|
15
|
+
|
14
16
|
logger = logging.getLogger(__name__)
|
15
17
|
|
16
18
|
|
@@ -31,12 +33,12 @@ class OpenStackLoadBalancerImporter(LoadBalancerImporter):
|
|
31
33
|
logger.info(f"Importing load_balancers for {self.connection.auth['auth_url']}")
|
32
34
|
|
33
35
|
try:
|
34
|
-
osload_balancers: list[OSLoadBalancer] =
|
35
|
-
self.connection
|
36
|
+
osload_balancers: list[OSLoadBalancer] = octavia_api.get_load_balancers(
|
37
|
+
connection=self.connection
|
36
38
|
)
|
37
39
|
except Exception as e:
|
38
40
|
raise Exception(
|
39
|
-
f"Can not fetch load_balancers for {self.connection.auth['auth_url']}"
|
41
|
+
f"Can not fetch load_balancers for {self.connection.auth['auth_url']} {e}"
|
40
42
|
) from e
|
41
43
|
|
42
44
|
load_balancers: list[LoadBalancer] = []
|
@@ -55,11 +57,17 @@ class OpenStackLoadBalancerImporter(LoadBalancerImporter):
|
|
55
57
|
|
56
58
|
def _get_load_balancer_info(self, load_balancer: OSLoadBalancer) -> LoadBalancer:
|
57
59
|
|
60
|
+
amphoraes = octavia_api.get_amphoraes(
|
61
|
+
connection=self.connection, load_balancer_id=load_balancer["id"]
|
62
|
+
)
|
63
|
+
|
58
64
|
load_balancer_ret = LoadBalancer(
|
59
|
-
id=load_balancer
|
60
|
-
load_balancer_name=load_balancer
|
61
|
-
|
62
|
-
project_id=load_balancer
|
65
|
+
id=load_balancer["id"],
|
66
|
+
load_balancer_name=load_balancer["name"],
|
67
|
+
operating_status=load_balancer["operating_status"],
|
68
|
+
project_id=load_balancer["project_id"],
|
69
|
+
provisioning_status=load_balancer["provisioning_status"],
|
70
|
+
amphoraes=amphoraes,
|
63
71
|
)
|
64
72
|
|
65
73
|
return load_balancer_ret
|
@@ -58,6 +58,19 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
|
|
58
58
|
self, role_assignment: OSRoleAssignment
|
59
59
|
) -> RoleAssignment:
|
60
60
|
|
61
|
+
user_id = None
|
62
|
+
role_id = None
|
63
|
+
|
64
|
+
try:
|
65
|
+
user_id = role_assignment.user["id"]
|
66
|
+
except Exception as e:
|
67
|
+
logger.warning(f"Can not get user id: {e}")
|
68
|
+
|
69
|
+
try:
|
70
|
+
role_id = role_assignment.role["id"]
|
71
|
+
except Exception as e:
|
72
|
+
logger.warning(f"Can not get role id: {e}")
|
73
|
+
|
61
74
|
user_name = None
|
62
75
|
role_name = None
|
63
76
|
|
@@ -65,17 +78,21 @@ class OpenStackRoleAssignmentImporter(RoleAssignmentImporter):
|
|
65
78
|
role_name = self.connection.identity.get_role(
|
66
79
|
role_assignment.role["id"]
|
67
80
|
).name
|
81
|
+
|
82
|
+
except Exception as e:
|
83
|
+
logger.warning(f"Can not get role name: {e}")
|
84
|
+
|
85
|
+
try:
|
68
86
|
user_name = self.connection.identity.get_user(
|
69
87
|
role_assignment.user["id"]
|
70
88
|
).name
|
71
|
-
|
72
89
|
except Exception as e:
|
73
|
-
logger.warning("Can not get
|
90
|
+
logger.warning(f"Can not get user name: {e}")
|
74
91
|
|
75
92
|
role_assignment_ret = RoleAssignment(
|
76
|
-
user_id=
|
93
|
+
user_id=user_id,
|
77
94
|
user_name=user_name,
|
78
|
-
role_id=
|
95
|
+
role_id=role_id,
|
79
96
|
role_name=role_name,
|
80
97
|
scope=role_assignment.scope,
|
81
98
|
)
|
File without changes
|