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