osi-dump 0.1.2.1__tar.gz → 0.1.2.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.
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/PKG-INFO +1 -1
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/pyproject.toml +1 -1
- osi_dump-0.1.2.2/src/osi_dump/api/octavia.py +34 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/load_balancer_batch_handler.py +1 -3
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/role_assignment_batch_handler.py +1 -1
- osi_dump-0.1.2.2/src/osi_dump/batch_handler/router_batch_handler.py +49 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/cli.py +14 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py +2 -0
- osi_dump-0.1.2.2/src/osi_dump/exporter/router/excel_router_exporter.py +30 -0
- osi_dump-0.1.2.2/src/osi_dump/exporter/router/router_exporter.py +7 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +1 -1
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/instance/openstack_instance_importer.py +1 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/load_balancer/openstack_load_balancer_importer.py +14 -7
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py +21 -4
- osi_dump-0.1.2.2/src/osi_dump/importer/router/openstack_router_importer.py +86 -0
- osi_dump-0.1.2.2/src/osi_dump/importer/router/router_importer.py +9 -0
- osi_dump-0.1.2.2/src/osi_dump/model/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/image.py +1 -1
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/instance.py +1 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/load_balancer.py +1 -1
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/role_assignment.py +2 -2
- osi_dump-0.1.2.2/src/osi_dump/model/router.py +20 -0
- osi_dump-0.1.2.2/src/osi_dump/os_connection/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/__init__.py +1 -0
- osi_dump-0.1.2.2/src/osi_dump/util/panda_excel.py +22 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/PKG-INFO +1 -1
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/SOURCES.txt +9 -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.2}/README.md +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/setup.cfg +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/__main__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/api/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/api/placement.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/flavor_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/floating_ip_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/hypervisor_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/image_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/instance_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/project_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/volume_batch_handler.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/flavor/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/flavor/excel_flavor_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/flavor/flavor_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/floating_ip/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/hypervisor/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/image/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/image/excel_image_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/image/image_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/instance/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/instance/excel_instance_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/instance/instance_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/load_balancer/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/project/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/project/excel_project_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/project/project_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/role_assignment/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/role_assignment/role_assignment_exporter.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/exporter/volume → osi_dump-0.1.2.2/src/osi_dump/exporter/router}/__init__.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/flavor → osi_dump-0.1.2.2/src/osi_dump/exporter/volume}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/volume/excel_volume_exporter.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/volume/volume_exporter.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/floating_ip → osi_dump-0.1.2.2/src/osi_dump/importer/flavor}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/flavor/flavor_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/flavor/openstack_flavor_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/hypervisor → osi_dump-0.1.2.2/src/osi_dump/importer/floating_ip}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/floating_ip/floating_ip_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/image → osi_dump-0.1.2.2/src/osi_dump/importer/hypervisor}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/hypervisor/hypervisor_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/instance → osi_dump-0.1.2.2/src/osi_dump/importer/image}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/image/image_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/image/openstack_image_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer → osi_dump-0.1.2.2/src/osi_dump/importer/instance}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/instance/instance_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/project → osi_dump-0.1.2.2/src/osi_dump/importer/load_balancer}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/load_balancer/load_balancer_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment → osi_dump-0.1.2.2/src/osi_dump/importer/project}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/project/openstack_project_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/project/project_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/importer/volume → osi_dump-0.1.2.2/src/osi_dump/importer/role_assignment}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/role_assignment/role_assignment_importer.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/model → osi_dump-0.1.2.2/src/osi_dump/importer/router}/__init__.py +0 -0
- {osi_dump-0.1.2.1/src/osi_dump/os_connection → osi_dump-0.1.2.2/src/osi_dump/importer/volume}/__init__.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/volume/openstack_volume_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/volume/volume_importer.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/authentication_info.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/flavor.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/floating_ip.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/hypervisor.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/project.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/model/volume.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/os_connection/get_connections.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/create_file.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/excel_autosize_column.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/excel_sort_sheet.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/export_data_excel.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/extract_hostname.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/util/validate_dir_path.py +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/dependency_links.txt +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/entry_points.txt +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/requires.txt +0 -0
- {osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump.egg-info/top_level.txt +0 -0
@@ -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[str]:
|
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=id&fields=compute_id"
|
27
|
+
|
28
|
+
response = connection.session.get(url)
|
29
|
+
|
30
|
+
data = response.json()
|
31
|
+
|
32
|
+
amphoraes = data["amphorae"]
|
33
|
+
|
34
|
+
return [amphorae["compute_id"] for amphorae in amphoraes]
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/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.2}/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...")
|
@@ -12,6 +12,7 @@ from osi_dump.batch_handler.load_balancer_batch_handler import LoadBalancerBatch
|
|
12
12
|
from osi_dump.batch_handler.role_assignment_batch_handler import (
|
13
13
|
RoleAssignmentBatchHandler,
|
14
14
|
)
|
15
|
+
from osi_dump.batch_handler.router_batch_handler import RouterBatchHandler
|
15
16
|
|
16
17
|
app = typer.Typer()
|
17
18
|
|
@@ -123,6 +124,16 @@ def _load_balancer(connections, output_path: str):
|
|
123
124
|
_load_balancer_batch_handler.process()
|
124
125
|
|
125
126
|
|
127
|
+
def _router(connections, output_path: str):
|
128
|
+
_router_batch_handler = RouterBatchHandler()
|
129
|
+
|
130
|
+
_router_batch_handler.add_importer_exporter_from_openstack_connections(
|
131
|
+
connections, output_file=output_path
|
132
|
+
)
|
133
|
+
|
134
|
+
_router_batch_handler.process()
|
135
|
+
|
136
|
+
|
126
137
|
def inner_main(file_path: str, output_path: str):
|
127
138
|
|
128
139
|
logger = logging.getLogger(__name__)
|
@@ -146,6 +157,9 @@ def inner_main(file_path: str, output_path: str):
|
|
146
157
|
_role_assignment(connections=connections, output_path=output_path)
|
147
158
|
|
148
159
|
_load_balancer(connections=connections, output_path=output_path)
|
160
|
+
|
161
|
+
_router(connections=connections, output_path=output_path)
|
162
|
+
|
149
163
|
util.excel_autosize_column(output_path)
|
150
164
|
|
151
165
|
util.excel_sort_sheet(output_path)
|
@@ -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}")
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/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,16 @@ 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
|
-
status=load_balancer
|
62
|
-
project_id=load_balancer
|
65
|
+
id=load_balancer["id"],
|
66
|
+
load_balancer_name=load_balancer["name"],
|
67
|
+
status=load_balancer["operating_status"],
|
68
|
+
project_id=load_balancer["project_id"],
|
69
|
+
amphoraes=amphoraes,
|
63
70
|
)
|
64
71
|
|
65
72
|
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
|
)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
import concurrent
|
4
|
+
|
5
|
+
from openstack.connection import Connection
|
6
|
+
from openstack.network.v2.router import Router as OSRouter
|
7
|
+
|
8
|
+
from osi_dump.importer.router.router_importer import (
|
9
|
+
RouterImporter,
|
10
|
+
)
|
11
|
+
from osi_dump.model.router import Router
|
12
|
+
|
13
|
+
logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
class OpenStackRouterImporter(RouterImporter):
|
17
|
+
def __init__(self, connection: Connection):
|
18
|
+
self.connection = connection
|
19
|
+
|
20
|
+
def import_routers(self) -> list[Router]:
|
21
|
+
"""Import routers information from Openstack
|
22
|
+
|
23
|
+
Raises:
|
24
|
+
Exception: Raises exception if fetching router failed
|
25
|
+
|
26
|
+
Returns:
|
27
|
+
list[Router]: _description_
|
28
|
+
"""
|
29
|
+
|
30
|
+
logger.info(f"Importing routers for {self.connection.auth['auth_url']}")
|
31
|
+
|
32
|
+
try:
|
33
|
+
osrouters: list[OSRouter] = list(self.connection.network.routers())
|
34
|
+
except Exception as e:
|
35
|
+
raise Exception(
|
36
|
+
f"Can not fetch routers for {self.connection.auth['auth_url']}"
|
37
|
+
) from e
|
38
|
+
|
39
|
+
routers: list[Router] = []
|
40
|
+
|
41
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
42
|
+
futures = [
|
43
|
+
executor.submit(self._get_router_info, router) for router in osrouters
|
44
|
+
]
|
45
|
+
for future in concurrent.futures.as_completed(futures):
|
46
|
+
routers.append(future.result())
|
47
|
+
|
48
|
+
logger.info(f"Imported routers for {self.connection.auth['auth_url']}")
|
49
|
+
|
50
|
+
return routers
|
51
|
+
|
52
|
+
def _get_router_info(self, router: OSRouter) -> Router:
|
53
|
+
"""
|
54
|
+
{"network_id": "49760654-71d8-4967-8fdd-5a35d3ff78ef", "external_fixed_ips": [{"subnet_id": |
|
55
|
+
| | "c044a5c0-4b11-4d8d-ae5e-9ff4ce6c1be6", "ip_address": "10.0.2.188"}], "enable_snat": true}
|
56
|
+
"""
|
57
|
+
|
58
|
+
external_net_id = None
|
59
|
+
|
60
|
+
try:
|
61
|
+
external_net_id = router.external_gateway_info["network_id"]
|
62
|
+
except Exception as e:
|
63
|
+
logger.warning(f"Could not get external net id for router: {router.id}")
|
64
|
+
|
65
|
+
external_net_ip = None
|
66
|
+
|
67
|
+
try:
|
68
|
+
external_net_ip = router.external_gateway_info["external_fixed_ips"][0][
|
69
|
+
"ip_address"
|
70
|
+
]
|
71
|
+
|
72
|
+
except Exception as e:
|
73
|
+
logger.warning(f"Could not get external net ip for router {router.id}")
|
74
|
+
|
75
|
+
router_ret = Router(
|
76
|
+
router_id=router.id,
|
77
|
+
name=router.name,
|
78
|
+
external_net_id=external_net_id,
|
79
|
+
external_net_ip=external_net_ip,
|
80
|
+
status=router.status,
|
81
|
+
project_id=router.project_id,
|
82
|
+
created_at=router.created_at,
|
83
|
+
updated_at=router.updated_at,
|
84
|
+
)
|
85
|
+
|
86
|
+
return router_ret
|
File without changes
|
@@ -6,11 +6,11 @@ from pydantic import BaseModel, ConfigDict, ValidationError
|
|
6
6
|
class RoleAssignment(BaseModel):
|
7
7
|
model_config = ConfigDict(strict=True)
|
8
8
|
|
9
|
-
user_id: str
|
9
|
+
user_id: Optional[str]
|
10
10
|
|
11
11
|
user_name: Optional[str]
|
12
12
|
|
13
|
-
role_id: str
|
13
|
+
role_id: Optional[str]
|
14
14
|
|
15
15
|
role_name: Optional[str]
|
16
16
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from pydantic import BaseModel, ConfigDict, ValidationError
|
4
|
+
|
5
|
+
|
6
|
+
class Router(BaseModel):
|
7
|
+
model_config = ConfigDict(strict=True)
|
8
|
+
|
9
|
+
router_id: str
|
10
|
+
|
11
|
+
name: Optional[str]
|
12
|
+
|
13
|
+
external_net_id: Optional[str]
|
14
|
+
external_net_ip: Optional[str]
|
15
|
+
|
16
|
+
status: str
|
17
|
+
project_id: Optional[str]
|
18
|
+
|
19
|
+
created_at: str
|
20
|
+
updated_at: str
|
File without changes
|
@@ -0,0 +1,22 @@
|
|
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
|
@@ -21,6 +21,7 @@ src/osi_dump/batch_handler/instance_batch_handler.py
|
|
21
21
|
src/osi_dump/batch_handler/load_balancer_batch_handler.py
|
22
22
|
src/osi_dump/batch_handler/project_batch_handler.py
|
23
23
|
src/osi_dump/batch_handler/role_assignment_batch_handler.py
|
24
|
+
src/osi_dump/batch_handler/router_batch_handler.py
|
24
25
|
src/osi_dump/batch_handler/volume_batch_handler.py
|
25
26
|
src/osi_dump/exporter/__init__.py
|
26
27
|
src/osi_dump/exporter/flavor/__init__.py
|
@@ -47,6 +48,9 @@ src/osi_dump/exporter/project/project_exporter.py
|
|
47
48
|
src/osi_dump/exporter/role_assignment/__init__.py
|
48
49
|
src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py
|
49
50
|
src/osi_dump/exporter/role_assignment/role_assignment_exporter.py
|
51
|
+
src/osi_dump/exporter/router/__init__.py
|
52
|
+
src/osi_dump/exporter/router/excel_router_exporter.py
|
53
|
+
src/osi_dump/exporter/router/router_exporter.py
|
50
54
|
src/osi_dump/exporter/volume/__init__.py
|
51
55
|
src/osi_dump/exporter/volume/excel_volume_exporter.py
|
52
56
|
src/osi_dump/exporter/volume/volume_exporter.py
|
@@ -74,6 +78,9 @@ src/osi_dump/importer/project/project_importer.py
|
|
74
78
|
src/osi_dump/importer/role_assignment/__init__.py
|
75
79
|
src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py
|
76
80
|
src/osi_dump/importer/role_assignment/role_assignment_importer.py
|
81
|
+
src/osi_dump/importer/router/__init__.py
|
82
|
+
src/osi_dump/importer/router/openstack_router_importer.py
|
83
|
+
src/osi_dump/importer/router/router_importer.py
|
77
84
|
src/osi_dump/importer/volume/__init__.py
|
78
85
|
src/osi_dump/importer/volume/openstack_volume_importer.py
|
79
86
|
src/osi_dump/importer/volume/volume_importer.py
|
@@ -87,6 +94,7 @@ src/osi_dump/model/instance.py
|
|
87
94
|
src/osi_dump/model/load_balancer.py
|
88
95
|
src/osi_dump/model/project.py
|
89
96
|
src/osi_dump/model/role_assignment.py
|
97
|
+
src/osi_dump/model/router.py
|
90
98
|
src/osi_dump/model/volume.py
|
91
99
|
src/osi_dump/os_connection/__init__.py
|
92
100
|
src/osi_dump/os_connection/get_connections.py
|
@@ -96,4 +104,5 @@ src/osi_dump/util/excel_autosize_column.py
|
|
96
104
|
src/osi_dump/util/excel_sort_sheet.py
|
97
105
|
src/osi_dump/util/export_data_excel.py
|
98
106
|
src/osi_dump/util/extract_hostname.py
|
107
|
+
src/osi_dump/util/panda_excel.py
|
99
108
|
src/osi_dump/util/validate_dir_path.py
|
@@ -1,17 +0,0 @@
|
|
1
|
-
from openstack.connection import Connection
|
2
|
-
from openstack.identity.v3.service import Service
|
3
|
-
|
4
|
-
|
5
|
-
def get_amphorae(connection: Connection, load_balancer_id: str) -> str | None:
|
6
|
-
|
7
|
-
octavia_endpoint = connection.endpoint_for(
|
8
|
-
service_type="octavia", interface="public"
|
9
|
-
)
|
10
|
-
|
11
|
-
url = f"{octavia_endpoint}/v2/octavia/amphorae"
|
12
|
-
|
13
|
-
response = connection.session.get(url)
|
14
|
-
|
15
|
-
data = response.json()
|
16
|
-
|
17
|
-
return data["usages"]
|
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.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/floating_ip_batch_handler.py
RENAMED
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/batch_handler/hypervisor_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
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py
RENAMED
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/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.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/instance/excel_instance_exporter.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/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
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/flavor/openstack_flavor_importer.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/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.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/hypervisor/hypervisor_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/image/openstack_image_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/load_balancer/load_balancer_importer.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/src/osi_dump/importer/project/openstack_project_importer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osi_dump-0.1.2.1/src/osi_dump/model → osi_dump-0.1.2.2/src/osi_dump/importer/router}/__init__.py
RENAMED
File without changes
|
File without changes
|
{osi_dump-0.1.2.1 → osi_dump-0.1.2.2}/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
|