osi-dump 0.1.1__tar.gz → 0.1.2.1__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.1 → osi_dump-0.1.2.1}/PKG-INFO +1 -1
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/pyproject.toml +1 -1
- osi_dump-0.1.2.1/src/osi_dump/api/octavia.py +17 -0
- osi_dump-0.1.2.1/src/osi_dump/api/placement.py +17 -0
- osi_dump-0.1.2.1/src/osi_dump/batch_handler/flavor_batch_handler.py +51 -0
- osi_dump-0.1.2.1/src/osi_dump/batch_handler/image_batch_handler.py +51 -0
- osi_dump-0.1.2.1/src/osi_dump/batch_handler/load_balancer_batch_handler.py +61 -0
- osi_dump-0.1.2.1/src/osi_dump/batch_handler/role_assignment_batch_handler.py +61 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/cli.py +57 -0
- osi_dump-0.1.2.1/src/osi_dump/exporter/flavor/excel_flavor_exporter.py +30 -0
- osi_dump-0.1.2.1/src/osi_dump/exporter/flavor/flavor_exporter.py +7 -0
- osi_dump-0.1.2.1/src/osi_dump/exporter/image/excel_image_exporter.py +28 -0
- osi_dump-0.1.2.1/src/osi_dump/exporter/image/image_exporter.py +7 -0
- osi_dump-0.1.2.1/src/osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py +33 -0
- osi_dump-0.1.2.1/src/osi_dump/exporter/load_balancer/load_balancer_exporter.py +7 -0
- osi_dump-0.1.2.1/src/osi_dump/exporter/role_assignment/excel_role_assignment_exporter.py +35 -0
- osi_dump-0.1.2.1/src/osi_dump/exporter/role_assignment/role_assignment_exporter.py +7 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/flavor/flavor_importer.py +9 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/flavor/openstack_flavor_importer.py +64 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/hypervisor/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +18 -2
- osi_dump-0.1.2.1/src/osi_dump/importer/image/__init__.py +0 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/image/image_importer.py +9 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/image/openstack_image_importer.py +77 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/instance/__init__.py +0 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer/__init__.py +0 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer/load_balancer_importer.py +9 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/load_balancer/openstack_load_balancer_importer.py +65 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/project/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/project/openstack_project_importer.py +27 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment/__init__.py +0 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment/openstack_role_assignment_importer.py +83 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/role_assignment/role_assignment_importer.py +9 -0
- osi_dump-0.1.2.1/src/osi_dump/importer/volume/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/volume/openstack_volume_importer.py +14 -0
- osi_dump-0.1.2.1/src/osi_dump/model/__init__.py +0 -0
- osi_dump-0.1.2.1/src/osi_dump/model/flavor.py +20 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/model/hypervisor.py +10 -2
- osi_dump-0.1.2.1/src/osi_dump/model/image.py +26 -0
- osi_dump-0.1.2.1/src/osi_dump/model/load_balancer.py +17 -0
- osi_dump-0.1.2.1/src/osi_dump/model/project.py +31 -0
- osi_dump-0.1.2.1/src/osi_dump/model/role_assignment.py +17 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/model/volume.py +2 -0
- osi_dump-0.1.2.1/src/osi_dump/os_connection/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/os_connection/get_connections.py +0 -1
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/PKG-INFO +1 -1
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/SOURCES.txt +35 -0
- osi_dump-0.1.1/src/osi_dump/model/project.py +0 -13
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/README.md +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/setup.cfg +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/__main__.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/exporter → osi_dump-0.1.2.1/src/osi_dump/api}/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/floating_ip_batch_handler.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/hypervisor_batch_handler.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/instance_batch_handler.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/project_batch_handler.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/batch_handler/volume_batch_handler.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/exporter/floating_ip → osi_dump-0.1.2.1/src/osi_dump/exporter}/__init__.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/exporter/hypervisor → osi_dump-0.1.2.1/src/osi_dump/exporter/flavor}/__init__.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/exporter/instance → osi_dump-0.1.2.1/src/osi_dump/exporter/floating_ip}/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/floating_ip/floating_ip_exporter.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/exporter/project → osi_dump-0.1.2.1/src/osi_dump/exporter/hypervisor}/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/hypervisor/excel_hypervisor_exporter.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/hypervisor/hypervisor_exporter.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/exporter/volume → osi_dump-0.1.2.1/src/osi_dump/exporter/image}/__init__.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/importer/floating_ip → osi_dump-0.1.2.1/src/osi_dump/exporter/instance}/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/instance/excel_instance_exporter.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/instance/instance_exporter.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/importer/hypervisor → osi_dump-0.1.2.1/src/osi_dump/exporter/load_balancer}/__init__.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/importer/instance → osi_dump-0.1.2.1/src/osi_dump/exporter/project}/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/project/excel_project_exporter.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/project/project_exporter.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/importer/project → osi_dump-0.1.2.1/src/osi_dump/exporter/role_assignment}/__init__.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/importer → osi_dump-0.1.2.1/src/osi_dump/exporter}/volume/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/volume/excel_volume_exporter.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/exporter/volume/volume_exporter.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/model → osi_dump-0.1.2.1/src/osi_dump/importer/flavor}/__init__.py +0 -0
- {osi_dump-0.1.1/src/osi_dump/os_connection → osi_dump-0.1.2.1/src/osi_dump/importer/floating_ip}/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/floating_ip/floating_ip_importer.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/floating_ip/openstack_floating_ip_importer.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/hypervisor/hypervisor_importer.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/instance/instance_importer.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/instance/openstack_instance_importer.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/project/project_importer.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/importer/volume/volume_importer.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/model/authentication_info.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/model/floating_ip.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/model/instance.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/util/__init__.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/util/create_file.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/util/excel_autosize_column.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/util/excel_sort_sheet.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/util/export_data_excel.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/util/extract_hostname.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump/util/validate_dir_path.py +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/dependency_links.txt +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/entry_points.txt +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/requires.txt +0 -0
- {osi_dump-0.1.1 → osi_dump-0.1.2.1}/src/osi_dump.egg-info/top_level.txt +0 -0
@@ -0,0 +1,17 @@
|
|
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"]
|
@@ -0,0 +1,17 @@
|
|
1
|
+
from openstack.connection import Connection
|
2
|
+
from openstack.identity.v3.service import Service
|
3
|
+
|
4
|
+
|
5
|
+
def get_usage(connection: Connection, resource_provider_id: str):
|
6
|
+
|
7
|
+
placement_endpoint = connection.endpoint_for(
|
8
|
+
service_type="placement", interface="public"
|
9
|
+
)
|
10
|
+
|
11
|
+
url = f"{placement_endpoint}/resource_providers/{resource_provider_id}/usages"
|
12
|
+
|
13
|
+
response = connection.session.get(url)
|
14
|
+
|
15
|
+
data = response.json()
|
16
|
+
|
17
|
+
return data["usages"]
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from openstack.connection import Connection
|
4
|
+
|
5
|
+
from osi_dump.exporter.flavor.flavor_exporter import FlavorExporter
|
6
|
+
from osi_dump.exporter.flavor.excel_flavor_exporter import (
|
7
|
+
ExcelFlavorExporter,
|
8
|
+
)
|
9
|
+
|
10
|
+
from osi_dump.importer.flavor.flavor_importer import FlavorImporter
|
11
|
+
from osi_dump.importer.flavor.openstack_flavor_importer import (
|
12
|
+
OpenStackFlavorImporter,
|
13
|
+
)
|
14
|
+
|
15
|
+
|
16
|
+
from osi_dump import util
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
class FlavorBatchHandler:
|
22
|
+
def __init__(self):
|
23
|
+
self._importer_exporter_list: list[tuple[FlavorImporter, FlavorExporter]] = []
|
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 = OpenStackFlavorImporter(connection)
|
30
|
+
|
31
|
+
sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-flavor"
|
32
|
+
exporter = ExcelFlavorExporter(
|
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: FlavorImporter, exporter: FlavorExporter):
|
39
|
+
self._importer_exporter_list.append((importer, exporter))
|
40
|
+
|
41
|
+
def process(self):
|
42
|
+
|
43
|
+
for importer, exporter in self._importer_exporter_list:
|
44
|
+
try:
|
45
|
+
|
46
|
+
flavors = importer.import_flavors()
|
47
|
+
|
48
|
+
exporter.export_flavors(flavors=flavors)
|
49
|
+
except Exception as e:
|
50
|
+
logger.warning(e)
|
51
|
+
logger.warning("Skipping...")
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from openstack.connection import Connection
|
4
|
+
|
5
|
+
from osi_dump.exporter.image.image_exporter import ImageExporter
|
6
|
+
from osi_dump.exporter.image.excel_image_exporter import (
|
7
|
+
ExcelImageExporter,
|
8
|
+
)
|
9
|
+
|
10
|
+
from osi_dump.importer.image.image_importer import ImageImporter
|
11
|
+
from osi_dump.importer.image.openstack_image_importer import (
|
12
|
+
OpenStackImageImporter,
|
13
|
+
)
|
14
|
+
|
15
|
+
|
16
|
+
from osi_dump import util
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
class ImageBatchHandler:
|
22
|
+
def __init__(self):
|
23
|
+
self._importer_exporter_list: list[tuple[ImageImporter, ImageExporter]] = []
|
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 = OpenStackImageImporter(connection)
|
30
|
+
|
31
|
+
sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-image"
|
32
|
+
exporter = ExcelImageExporter(
|
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: ImageImporter, exporter: ImageExporter):
|
39
|
+
self._importer_exporter_list.append((importer, exporter))
|
40
|
+
|
41
|
+
def process(self):
|
42
|
+
|
43
|
+
for importer, exporter in self._importer_exporter_list:
|
44
|
+
try:
|
45
|
+
|
46
|
+
images = importer.import_images()
|
47
|
+
|
48
|
+
exporter.export_images(images=images)
|
49
|
+
except Exception as e:
|
50
|
+
logger.warning(e)
|
51
|
+
logger.warning("Skipping...")
|
@@ -0,0 +1,61 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from openstack.connection import Connection
|
4
|
+
|
5
|
+
from osi_dump.exporter.load_balancer.load_balancer_exporter import (
|
6
|
+
LoadBalancerExporter,
|
7
|
+
)
|
8
|
+
from osi_dump.exporter.load_balancer.excel_load_balancer_exporter import (
|
9
|
+
ExcelLoadBalancerExporter,
|
10
|
+
)
|
11
|
+
|
12
|
+
from osi_dump.importer.load_balancer.load_balancer_importer import (
|
13
|
+
LoadBalancerImporter,
|
14
|
+
)
|
15
|
+
from osi_dump.importer.load_balancer.openstack_load_balancer_importer import (
|
16
|
+
OpenStackLoadBalancerImporter,
|
17
|
+
)
|
18
|
+
|
19
|
+
|
20
|
+
from osi_dump import util
|
21
|
+
|
22
|
+
logger = logging.getLogger(__name__)
|
23
|
+
|
24
|
+
|
25
|
+
class LoadBalancerBatchHandler:
|
26
|
+
def __init__(self):
|
27
|
+
self._importer_exporter_list: list[
|
28
|
+
tuple[LoadBalancerImporter, LoadBalancerExporter]
|
29
|
+
] = []
|
30
|
+
|
31
|
+
def add_importer_exporter_from_openstack_connections(
|
32
|
+
self, connections: list[Connection], output_file: str
|
33
|
+
):
|
34
|
+
for connection in connections:
|
35
|
+
importer = OpenStackLoadBalancerImporter(connection)
|
36
|
+
|
37
|
+
sheet_name = (
|
38
|
+
f"{util.extract_hostname(connection.auth['auth_url'])}-load_balancer"
|
39
|
+
)
|
40
|
+
exporter = ExcelLoadBalancerExporter(
|
41
|
+
sheet_name=sheet_name, output_file=output_file
|
42
|
+
)
|
43
|
+
|
44
|
+
self.add_importer_exporter(importer=importer, exporter=exporter)
|
45
|
+
|
46
|
+
def add_importer_exporter(
|
47
|
+
self, importer: LoadBalancerImporter, exporter: LoadBalancerExporter
|
48
|
+
):
|
49
|
+
self._importer_exporter_list.append((importer, exporter))
|
50
|
+
|
51
|
+
def process(self):
|
52
|
+
|
53
|
+
for importer, exporter in self._importer_exporter_list:
|
54
|
+
try:
|
55
|
+
|
56
|
+
load_balancers = importer.import_load_balancers()
|
57
|
+
|
58
|
+
exporter.export_load_balancers(load_balancers=load_balancers)
|
59
|
+
except Exception as e:
|
60
|
+
logger.warning(e)
|
61
|
+
logger.warning("Skipping...")
|
@@ -0,0 +1,61 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from openstack.connection import Connection
|
4
|
+
|
5
|
+
from osi_dump.exporter.role_assignment.role_assignment_exporter import (
|
6
|
+
RoleAssignmentExporter,
|
7
|
+
)
|
8
|
+
from osi_dump.exporter.role_assignment.excel_role_assignment_exporter import (
|
9
|
+
ExcelRoleAssignmentExporter,
|
10
|
+
)
|
11
|
+
|
12
|
+
from osi_dump.importer.role_assignment.role_assignment_importer import (
|
13
|
+
RoleAssignmentImporter,
|
14
|
+
)
|
15
|
+
from osi_dump.importer.role_assignment.openstack_role_assignment_importer import (
|
16
|
+
OpenStackRoleAssignmentImporter,
|
17
|
+
)
|
18
|
+
|
19
|
+
|
20
|
+
from osi_dump import util
|
21
|
+
|
22
|
+
logger = logging.getLogger(__name__)
|
23
|
+
|
24
|
+
|
25
|
+
class RoleAssignmentBatchHandler:
|
26
|
+
def __init__(self):
|
27
|
+
self._importer_exporter_list: list[
|
28
|
+
tuple[RoleAssignmentImporter, RoleAssignmentExporter]
|
29
|
+
] = []
|
30
|
+
|
31
|
+
def add_importer_exporter_from_openstack_connections(
|
32
|
+
self, connections: list[Connection], output_file: str
|
33
|
+
):
|
34
|
+
for connection in connections:
|
35
|
+
importer = OpenStackRoleAssignmentImporter(connection)
|
36
|
+
|
37
|
+
sheet_name = (
|
38
|
+
f"{util.extract_hostname(connection.auth['auth_url'])}-role_assignment"
|
39
|
+
)
|
40
|
+
exporter = ExcelRoleAssignmentExporter(
|
41
|
+
sheet_name=sheet_name, output_file=output_file
|
42
|
+
)
|
43
|
+
|
44
|
+
self.add_importer_exporter(importer=importer, exporter=exporter)
|
45
|
+
|
46
|
+
def add_importer_exporter(
|
47
|
+
self, importer: RoleAssignmentImporter, exporter: RoleAssignmentExporter
|
48
|
+
):
|
49
|
+
self._importer_exporter_list.append((importer, exporter))
|
50
|
+
|
51
|
+
def process(self):
|
52
|
+
|
53
|
+
for importer, exporter in self._importer_exporter_list:
|
54
|
+
try:
|
55
|
+
|
56
|
+
role_assignments = importer.import_role_assignments()
|
57
|
+
|
58
|
+
exporter.export_role_assignments(role_assignments=role_assignments)
|
59
|
+
except Exception as e:
|
60
|
+
logger.warning(e)
|
61
|
+
logger.warning("Skipping...")
|
@@ -8,9 +8,16 @@ import typer
|
|
8
8
|
|
9
9
|
from typing_extensions import Annotated
|
10
10
|
|
11
|
+
from osi_dump.batch_handler.load_balancer_batch_handler import LoadBalancerBatchHandler
|
12
|
+
from osi_dump.batch_handler.role_assignment_batch_handler import (
|
13
|
+
RoleAssignmentBatchHandler,
|
14
|
+
)
|
15
|
+
|
11
16
|
app = typer.Typer()
|
12
17
|
|
13
18
|
|
19
|
+
from osi_dump.batch_handler.flavor_batch_handler import FlavorBatchHandler
|
20
|
+
from osi_dump.batch_handler.image_batch_handler import ImageBatchHandler
|
14
21
|
from osi_dump.batch_handler.volume_batch_handler import VolumeBatchHandler
|
15
22
|
from osi_dump.os_connection.get_connections import get_connections
|
16
23
|
|
@@ -76,6 +83,46 @@ def _hypervisor(connections, output_path: str):
|
|
76
83
|
hypervisor_batch_handler.process()
|
77
84
|
|
78
85
|
|
86
|
+
def _image(connections, output_path: str):
|
87
|
+
image_batch_handler = ImageBatchHandler()
|
88
|
+
|
89
|
+
image_batch_handler.add_importer_exporter_from_openstack_connections(
|
90
|
+
connections, output_file=output_path
|
91
|
+
)
|
92
|
+
|
93
|
+
image_batch_handler.process()
|
94
|
+
|
95
|
+
|
96
|
+
def _flavor(connections, output_path: str):
|
97
|
+
flavor_batch_handler = FlavorBatchHandler()
|
98
|
+
|
99
|
+
flavor_batch_handler.add_importer_exporter_from_openstack_connections(
|
100
|
+
connections, output_file=output_path
|
101
|
+
)
|
102
|
+
|
103
|
+
flavor_batch_handler.process()
|
104
|
+
|
105
|
+
|
106
|
+
def _role_assignment(connections, output_path: str):
|
107
|
+
_role_assignment_batch_handler = RoleAssignmentBatchHandler()
|
108
|
+
|
109
|
+
_role_assignment_batch_handler.add_importer_exporter_from_openstack_connections(
|
110
|
+
connections, output_file=output_path
|
111
|
+
)
|
112
|
+
|
113
|
+
_role_assignment_batch_handler.process()
|
114
|
+
|
115
|
+
|
116
|
+
def _load_balancer(connections, output_path: str):
|
117
|
+
_load_balancer_batch_handler = LoadBalancerBatchHandler()
|
118
|
+
|
119
|
+
_load_balancer_batch_handler.add_importer_exporter_from_openstack_connections(
|
120
|
+
connections, output_file=output_path
|
121
|
+
)
|
122
|
+
|
123
|
+
_load_balancer_batch_handler.process()
|
124
|
+
|
125
|
+
|
79
126
|
def inner_main(file_path: str, output_path: str):
|
80
127
|
|
81
128
|
logger = logging.getLogger(__name__)
|
@@ -92,6 +139,13 @@ def inner_main(file_path: str, output_path: str):
|
|
92
139
|
|
93
140
|
_project(connections=connections, output_path=output_path)
|
94
141
|
|
142
|
+
_image(connections=connections, output_path=output_path)
|
143
|
+
|
144
|
+
_flavor(connections=connections, output_path=output_path)
|
145
|
+
|
146
|
+
_role_assignment(connections=connections, output_path=output_path)
|
147
|
+
|
148
|
+
_load_balancer(connections=connections, output_path=output_path)
|
95
149
|
util.excel_autosize_column(output_path)
|
96
150
|
|
97
151
|
util.excel_sort_sheet(output_path)
|
@@ -141,6 +195,9 @@ Path of the output file, will override if file already exists
|
|
141
195
|
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
|
142
196
|
)
|
143
197
|
|
198
|
+
# Suppress pool limit warning will investigate later
|
199
|
+
logging.getLogger("urllib3").propagate = False
|
200
|
+
|
144
201
|
logger = logging.getLogger(__name__)
|
145
202
|
|
146
203
|
if util.validate_dir_path(file_path=output_path) is False:
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
|
4
|
+
import pandas as pd
|
5
|
+
|
6
|
+
|
7
|
+
from osi_dump.exporter.flavor.flavor_exporter import FlavorExporter
|
8
|
+
|
9
|
+
from osi_dump.model.flavor import Flavor
|
10
|
+
|
11
|
+
from osi_dump import util
|
12
|
+
|
13
|
+
logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
class ExcelFlavorExporter(FlavorExporter):
|
17
|
+
def __init__(self, sheet_name: str, output_file: str):
|
18
|
+
self.sheet_name = sheet_name
|
19
|
+
self.output_file = output_file
|
20
|
+
|
21
|
+
def export_flavors(self, flavors: list[Flavor]):
|
22
|
+
df = pd.json_normalize([flavor.model_dump() for flavor in flavors])
|
23
|
+
|
24
|
+
logger.info(f"Exporting flavors 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 flavors for {self.sheet_name}")
|
29
|
+
except Exception as e:
|
30
|
+
logger.warning(f"Exporting floating ips for {self.sheet_name} error: {e}")
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import pandas as pd
|
2
|
+
|
3
|
+
import logging
|
4
|
+
|
5
|
+
|
6
|
+
from osi_dump import util
|
7
|
+
from osi_dump.exporter.image.image_exporter import ImageExporter
|
8
|
+
|
9
|
+
from osi_dump.model.image import Image
|
10
|
+
|
11
|
+
logger = logging.getLogger(__name__)
|
12
|
+
|
13
|
+
|
14
|
+
class ExcelImageExporter(ImageExporter):
|
15
|
+
def __init__(self, sheet_name: str, output_file: str):
|
16
|
+
self.sheet_name = sheet_name
|
17
|
+
self.output_file = output_file
|
18
|
+
|
19
|
+
def export_images(self, images: list[Image]):
|
20
|
+
df = pd.json_normalize([image.model_dump() for image in images])
|
21
|
+
|
22
|
+
logger.info(f"Exporting images for {self.sheet_name}")
|
23
|
+
try:
|
24
|
+
util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
|
25
|
+
|
26
|
+
logger.info(f"Exported images for {self.sheet_name}")
|
27
|
+
except Exception as e:
|
28
|
+
logger.warning(f"Exporting images for {self.sheet_name} error: {e}")
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import pandas as pd
|
2
|
+
|
3
|
+
import logging
|
4
|
+
|
5
|
+
|
6
|
+
from osi_dump import util
|
7
|
+
|
8
|
+
from osi_dump.exporter.load_balancer.load_balancer_exporter import (
|
9
|
+
LoadBalancerExporter,
|
10
|
+
)
|
11
|
+
|
12
|
+
from osi_dump.model.load_balancer import LoadBalancer
|
13
|
+
|
14
|
+
logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
class ExcelLoadBalancerExporter(LoadBalancerExporter):
|
18
|
+
def __init__(self, sheet_name: str, output_file: str):
|
19
|
+
self.sheet_name = sheet_name
|
20
|
+
self.output_file = output_file
|
21
|
+
|
22
|
+
def export_load_balancers(self, load_balancers: list[LoadBalancer]):
|
23
|
+
df = pd.json_normalize(
|
24
|
+
[load_balancer.model_dump() for load_balancer in load_balancers]
|
25
|
+
)
|
26
|
+
|
27
|
+
logger.info(f"Exporting load_balancers for {self.sheet_name}")
|
28
|
+
try:
|
29
|
+
util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
|
30
|
+
|
31
|
+
logger.info(f"Exported load_balancers for {self.sheet_name}")
|
32
|
+
except Exception as e:
|
33
|
+
logger.warning(f"Exporting load_balancers for {self.sheet_name} error: {e}")
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import pandas as pd
|
2
|
+
|
3
|
+
import logging
|
4
|
+
|
5
|
+
|
6
|
+
from osi_dump import util
|
7
|
+
|
8
|
+
from osi_dump.exporter.role_assignment.role_assignment_exporter import (
|
9
|
+
RoleAssignmentExporter,
|
10
|
+
)
|
11
|
+
|
12
|
+
from osi_dump.model.role_assignment import RoleAssignment
|
13
|
+
|
14
|
+
logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
class ExcelRoleAssignmentExporter(RoleAssignmentExporter):
|
18
|
+
def __init__(self, sheet_name: str, output_file: str):
|
19
|
+
self.sheet_name = sheet_name
|
20
|
+
self.output_file = output_file
|
21
|
+
|
22
|
+
def export_role_assignments(self, role_assignments: list[RoleAssignment]):
|
23
|
+
df = pd.json_normalize(
|
24
|
+
[role_assignment.model_dump() for role_assignment in role_assignments]
|
25
|
+
)
|
26
|
+
|
27
|
+
logger.info(f"Exporting role_assignments for {self.sheet_name}")
|
28
|
+
try:
|
29
|
+
util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
|
30
|
+
|
31
|
+
logger.info(f"Exported role_assignments for {self.sheet_name}")
|
32
|
+
except Exception as e:
|
33
|
+
logger.warning(
|
34
|
+
f"Exporting role_assignments for {self.sheet_name} error: {e}"
|
35
|
+
)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
import concurrent
|
4
|
+
|
5
|
+
from openstack.connection import Connection
|
6
|
+
from openstack.compute.v2.flavor import Flavor as OSFlavor
|
7
|
+
|
8
|
+
from osi_dump.importer.flavor.flavor_importer import FlavorImporter
|
9
|
+
from osi_dump.model.flavor import Flavor
|
10
|
+
|
11
|
+
logger = logging.getLogger(__name__)
|
12
|
+
|
13
|
+
|
14
|
+
class OpenStackFlavorImporter(FlavorImporter):
|
15
|
+
def __init__(self, connection: Connection):
|
16
|
+
self.connection = connection
|
17
|
+
|
18
|
+
def import_flavors(self) -> list[Flavor]:
|
19
|
+
"""Import flavors information from Openstack
|
20
|
+
|
21
|
+
Raises:
|
22
|
+
Exception: Raises exception if fetching flavor failed
|
23
|
+
|
24
|
+
Returns:
|
25
|
+
list[Instance]: _description_
|
26
|
+
"""
|
27
|
+
|
28
|
+
logger.info(f"Importing flavors for {self.connection.auth['auth_url']}")
|
29
|
+
|
30
|
+
try:
|
31
|
+
osflavors: list[OSFlavor] = list(self.connection.list_flavors())
|
32
|
+
except Exception as e:
|
33
|
+
raise Exception(
|
34
|
+
f"Can not fetch flavors for {self.connection.auth['auth_url']}"
|
35
|
+
) from e
|
36
|
+
|
37
|
+
flavors: list[Flavor] = []
|
38
|
+
|
39
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
40
|
+
futures = [
|
41
|
+
executor.submit(self._get_flavor_info, osflavor)
|
42
|
+
for osflavor in osflavors
|
43
|
+
]
|
44
|
+
for future in concurrent.futures.as_completed(futures):
|
45
|
+
flavors.append(future.result())
|
46
|
+
|
47
|
+
logger.info(f"Imported flavors for {self.connection.auth['auth_url']}")
|
48
|
+
|
49
|
+
return flavors
|
50
|
+
|
51
|
+
def _get_flavor_info(self, flavor: OSFlavor) -> Flavor:
|
52
|
+
|
53
|
+
ret_flavor = Flavor(
|
54
|
+
flavor_id=flavor.id,
|
55
|
+
flavor_name=flavor.name,
|
56
|
+
ram=flavor.ram,
|
57
|
+
vcpus=flavor.vcpus,
|
58
|
+
disk=flavor.disk,
|
59
|
+
swap=flavor.swap,
|
60
|
+
public=flavor.is_public,
|
61
|
+
properties=flavor.extra_specs,
|
62
|
+
)
|
63
|
+
|
64
|
+
return ret_flavor
|
File without changes
|
@@ -11,6 +11,8 @@ from openstack.placement.v1.resource_provider_inventory import ResourceProviderI
|
|
11
11
|
from osi_dump.importer.hypervisor.hypervisor_importer import HypervisorImporter
|
12
12
|
from osi_dump.model.hypervisor import Hypervisor
|
13
13
|
|
14
|
+
from osi_dump.api.placement import get_usage
|
15
|
+
|
14
16
|
logger = logging.getLogger(__name__)
|
15
17
|
|
16
18
|
|
@@ -31,7 +33,9 @@ class OpenStackHypervisorImporter(HypervisorImporter):
|
|
31
33
|
logger.info(f"Importing hypervisors for {self.connection.auth['auth_url']}")
|
32
34
|
|
33
35
|
try:
|
34
|
-
oshypervisors: list[OSHypervisor] = list(
|
36
|
+
oshypervisors: list[OSHypervisor] = list(
|
37
|
+
self.connection.compute.hypervisors(details=True)
|
38
|
+
)
|
35
39
|
except Exception as e:
|
36
40
|
raise Exception(
|
37
41
|
f"Can not fetch hypervisor for {self.connection.auth['auth_url']}"
|
@@ -61,6 +65,14 @@ class OpenStackHypervisorImporter(HypervisorImporter):
|
|
61
65
|
)
|
62
66
|
)
|
63
67
|
|
68
|
+
servers = list(
|
69
|
+
self.connection.compute.servers(
|
70
|
+
details=False, all_project=True, hypervisor=hypervisor.id
|
71
|
+
)
|
72
|
+
)
|
73
|
+
|
74
|
+
usage_data = get_usage(self.connection, resource_provider_id=hypervisor.id)
|
75
|
+
|
64
76
|
vcpu = rpi[0]
|
65
77
|
memory = rpi[1]
|
66
78
|
disk = rpi[2]
|
@@ -73,7 +85,11 @@ class OpenStackHypervisorImporter(HypervisorImporter):
|
|
73
85
|
status=hypervisor.status,
|
74
86
|
local_disk_size=disk["max_unit"],
|
75
87
|
memory_size=memory["max_unit"] + memory["reserved"],
|
76
|
-
|
88
|
+
vcpus=vcpu["max_unit"],
|
89
|
+
vcpus_usage=usage_data["VCPU"],
|
90
|
+
memory_usage=usage_data["MEMORY_MB"],
|
91
|
+
local_disk_usage=usage_data["DISK_GB"],
|
92
|
+
vm_count=len(servers),
|
77
93
|
)
|
78
94
|
|
79
95
|
return ret_hypervisor
|
File without changes
|