osi-dump 0.1.2.2__py3-none-any.whl → 0.1.2.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/api/octavia.py CHANGED
@@ -17,13 +17,13 @@ def get_load_balancers(connection: Connection) -> list[LoadBalancer]:
17
17
  return data["loadbalancers"]
18
18
 
19
19
 
20
- def get_amphoraes(connection: Connection, load_balancer_id: str) -> list[str]:
20
+ def get_amphoraes(connection: Connection, load_balancer_id: str) -> list[dict]:
21
21
 
22
22
  octavia_endpoint = connection.endpoint_for(
23
23
  service_type="load-balancer", interface="public"
24
24
  )
25
25
 
26
- url = f"{octavia_endpoint}/v2/octavia/amphorae?load_balancer_id={load_balancer_id}&fields=id&fields=compute_id"
26
+ url = f"{octavia_endpoint}/v2/octavia/amphorae?load_balancer_id={load_balancer_id}&fields=status&fields=compute_id"
27
27
 
28
28
  response = connection.session.get(url)
29
29
 
@@ -31,4 +31,4 @@ def get_amphoraes(connection: Connection, load_balancer_id: str) -> list[str]:
31
31
 
32
32
  amphoraes = data["amphorae"]
33
33
 
34
- return [amphorae["compute_id"] for amphorae in amphoraes]
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/cli.py CHANGED
@@ -8,6 +8,7 @@ import typer
8
8
 
9
9
  from typing_extensions import Annotated
10
10
 
11
+ from osi_dump.batch_handler.external_port_batch_handler import ExternalPortBatchHandler
11
12
  from osi_dump.batch_handler.load_balancer_batch_handler import LoadBalancerBatchHandler
12
13
  from osi_dump.batch_handler.role_assignment_batch_handler import (
13
14
  RoleAssignmentBatchHandler,
@@ -31,6 +32,11 @@ from osi_dump.batch_handler import (
31
32
  )
32
33
 
33
34
 
35
+ from osi_dump.importer.external_port.openstack_external_port_importer import (
36
+ OpenStackExternalPortImporter,
37
+ )
38
+
39
+
34
40
  from osi_dump import util
35
41
 
36
42
 
@@ -134,6 +140,16 @@ def _router(connections, output_path: str):
134
140
  _router_batch_handler.process()
135
141
 
136
142
 
143
+ def _external_port(connections, output_path: str):
144
+ _external_batch_handler = ExternalPortBatchHandler()
145
+
146
+ _external_batch_handler.add_importer_exporter_from_openstack_connections(
147
+ connections, output_file=output_path
148
+ )
149
+
150
+ _external_batch_handler.process()
151
+
152
+
137
153
  def inner_main(file_path: str, output_path: str):
138
154
 
139
155
  logger = logging.getLogger(__name__)
@@ -160,6 +176,8 @@ def inner_main(file_path: str, output_path: str):
160
176
 
161
177
  _router(connections=connections, output_path=output_path)
162
178
 
179
+ _external_port(connections=connections, output_path=output_path)
180
+
163
181
  util.excel_autosize_column(output_path)
164
182
 
165
183
  util.excel_sort_sheet(output_path)
File without changes
@@ -0,0 +1,34 @@
1
+ import pandas as pd
2
+
3
+ import logging
4
+
5
+ from openpyxl import load_workbook
6
+
7
+ from osi_dump import util
8
+ from osi_dump.exporter.external_port.external_port_exporter import ExternalPortExporter
9
+
10
+ from osi_dump.model.external_port import ExternalPort
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class ExcelExternalPortExporter(ExternalPortExporter):
16
+ def __init__(self, sheet_name: str, output_file: str):
17
+ self.sheet_name = sheet_name
18
+ self.output_file = output_file
19
+
20
+ def export_external_ports(self, external_ports: list[ExternalPort]):
21
+
22
+ df = pd.DataFrame(
23
+ [external_port.model_dump() for external_port in external_ports]
24
+ )
25
+
26
+ df = util.panda_excel.expand_list_column(df, "allowed_address_pairs")
27
+
28
+ logger.info(f"Exporting external_ports for {self.sheet_name}")
29
+ try:
30
+ util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
31
+
32
+ logger.info(f"Exported external_ports for {self.sheet_name}")
33
+ except Exception as e:
34
+ logger.warning(f"Exporting external_ports for {self.sheet_name} error: {e}")
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class ExternalPortExporter(ABC):
5
+ @abstractmethod
6
+ def export_external_ports(self, projects, output_file: str):
7
+ pass
File without changes
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from osi_dump.model.external_port import ExternalPort
4
+
5
+
6
+ class ExternalPortImporter(ABC):
7
+ @abstractmethod
8
+ def import_external_ports(self) -> list[ExternalPort]:
9
+ pass
@@ -0,0 +1,125 @@
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
+ # Get all external networks
26
+ networks = self.connection.network.networks(
27
+ is_router_external=True,
28
+ )
29
+
30
+ external_ports = []
31
+
32
+ for network in networks:
33
+ ex_ports = list(self.connection.network.ports(network_id=network.id))
34
+
35
+ external_ports.append(ex_ports)
36
+
37
+ # Get all port on those networks
38
+
39
+ external_ports = list(np.array(external_ports).flatten())
40
+
41
+ return external_ports
42
+
43
+ def import_external_ports(self) -> list[ExternalPort]:
44
+ """Import external_ports information from Openstack
45
+
46
+
47
+ Raises:
48
+ Exception: Raises exception if fetching external_port failed
49
+
50
+ Returns:
51
+ list[Instance]: _description_
52
+ """
53
+
54
+ logger.info(f"Importing external_ports for {self.connection.auth['auth_url']}")
55
+
56
+ try:
57
+ os_ports: list[OSPort] = self._get_external_ports()
58
+ except Exception as e:
59
+ raise Exception(
60
+ f"Can not fetch external_ports for {self.connection.auth['auth_url']} {e}"
61
+ ) from e
62
+
63
+ external_ports: list[ExternalPort] = []
64
+
65
+ with concurrent.futures.ThreadPoolExecutor() as executor:
66
+ futures = [
67
+ executor.submit(self._get_external_port_info, external_port)
68
+ for external_port in os_ports
69
+ ]
70
+ for future in concurrent.futures.as_completed(futures):
71
+ external_ports.append(future.result())
72
+
73
+ logger.info(f"Imported external_ports for {self.connection.auth['auth_url']}")
74
+
75
+ external_ports = sorted(
76
+ external_ports,
77
+ key=lambda external_port: (
78
+ external_port.network_id,
79
+ (
80
+ ipaddress.ip_address(external_port.ip_address)
81
+ if external_port.ip_address
82
+ else ipaddress.ip_address("0.0.0.0")
83
+ ),
84
+ ),
85
+ )
86
+
87
+ return external_ports
88
+
89
+ def _get_external_port_info(self, external_port: OSPort) -> ExternalPort:
90
+
91
+ subnet_id = None
92
+ ip_address = None
93
+ subnet_cidr = None
94
+
95
+ try:
96
+ ip_address = external_port.fixed_ips[0]["ip_address"]
97
+ except Exception as e:
98
+ logger.warning(f"No IP address found for port {external_port.id}")
99
+
100
+ try:
101
+ subnet_id = external_port.fixed_ips[0]["subnet_id"]
102
+ except Exception as e:
103
+ logger.warning(f"No subnet ID found for {external_port.id}")
104
+
105
+ try:
106
+ subnet: OSSubnet = self.connection.get_subnet_by_id(subnet_id)
107
+
108
+ subnet_cidr = subnet.cidr
109
+ except Exception as e:
110
+ logger.warning(f"No subnet cidr found for port {external_port.id}")
111
+
112
+ external_port_ret = ExternalPort(
113
+ port_id=external_port.id,
114
+ project_id=external_port.project_id,
115
+ network_id=external_port.network_id,
116
+ subnet_id=subnet_id,
117
+ subnet_cidr=subnet_cidr,
118
+ ip_address=ip_address,
119
+ allowed_address_pairs=external_port.allowed_address_pairs,
120
+ device_id=external_port.device_id,
121
+ device_owner=external_port.device_owner,
122
+ status=external_port.status,
123
+ )
124
+
125
+ return external_port_ret
@@ -30,12 +30,11 @@ class OpenStackHypervisorImporter(HypervisorImporter):
30
30
  list[Hypervisor]: _description_
31
31
  """
32
32
 
33
- logger.info(f"Importing hypervisors for {self.connection.auth['auth_url']}")
34
-
35
33
  try:
36
34
  oshypervisors: list[OSHypervisor] = list(
37
- self.connection.compute.hypervisors(details=True)
35
+ self.connection.compute.hypervisors(details=True, with_servers=True)
38
36
  )
37
+
39
38
  except Exception as e:
40
39
  raise Exception(
41
40
  f"Can not fetch hypervisor for {self.connection.auth['auth_url']}"
@@ -65,12 +64,6 @@ class OpenStackHypervisorImporter(HypervisorImporter):
65
64
  )
66
65
  )
67
66
 
68
- servers = list(
69
- self.connection.compute.servers(
70
- details=True, all_project=True, hypervisor_hostname=hypervisor.name
71
- )
72
- )
73
-
74
67
  usage_data = get_usage(self.connection, resource_provider_id=hypervisor.id)
75
68
 
76
69
  vcpu = rpi[0]
@@ -89,7 +82,7 @@ class OpenStackHypervisorImporter(HypervisorImporter):
89
82
  vcpus_usage=usage_data["VCPU"],
90
83
  memory_usage=usage_data["MEMORY_MB"],
91
84
  local_disk_usage=usage_data["DISK_GB"],
92
- vm_count=len(servers),
85
+ vm_count=len(hypervisor.servers),
93
86
  )
94
87
 
95
88
  return ret_hypervisor
@@ -64,8 +64,9 @@ class OpenStackLoadBalancerImporter(LoadBalancerImporter):
64
64
  load_balancer_ret = LoadBalancer(
65
65
  id=load_balancer["id"],
66
66
  load_balancer_name=load_balancer["name"],
67
- status=load_balancer["operating_status"],
67
+ operating_status=load_balancer["operating_status"],
68
68
  project_id=load_balancer["project_id"],
69
+ provisioning_status=load_balancer["provisioning_status"],
69
70
  amphoraes=amphoraes,
70
71
  )
71
72
 
@@ -0,0 +1,27 @@
1
+ from typing import Optional
2
+
3
+ from pydantic import BaseModel, ConfigDict, ValidationError
4
+
5
+
6
+ class ExternalPort(BaseModel):
7
+ model_config = ConfigDict(strict=True)
8
+
9
+ port_id: str
10
+
11
+ project_id: Optional[str]
12
+
13
+ subnet_id: Optional[str]
14
+
15
+ subnet_cidr: Optional[str]
16
+
17
+ ip_address: Optional[str]
18
+
19
+ network_id: Optional[str]
20
+
21
+ allowed_address_pairs: Optional[list[dict]]
22
+
23
+ device_id: Optional[str]
24
+
25
+ device_owner: Optional[str]
26
+
27
+ status: Optional[str]
osi_dump/model/image.py CHANGED
@@ -18,7 +18,7 @@ class Image(BaseModel):
18
18
 
19
19
  protected: bool
20
20
  status: str
21
- size: int
21
+ size: Optional[int]
22
22
  virtual_size: Optional[int]
23
23
  visibility: str
24
24
 
@@ -10,8 +10,10 @@ class LoadBalancer(BaseModel):
10
10
 
11
11
  load_balancer_name: Optional[str]
12
12
 
13
- status: str
13
+ provisioning_status: Optional[str]
14
14
 
15
- amphoraes: list[str]
15
+ operating_status: Optional[str]
16
+
17
+ amphoraes: list[dict]
16
18
 
17
19
  project_id: Optional[str]
@@ -3,18 +3,29 @@ import pandas as pd
3
3
  from pandas import DataFrame
4
4
 
5
5
 
6
- def expand_list_column(df: DataFrame, column: str) -> DataFrame:
6
+ def expand_list_column(df, column):
7
7
  # Find the maximum length of the list in the column
8
8
  max_len = df[column].apply(len).max()
9
9
 
10
- # Create a DataFrame from the list column
10
+ # Expand each dictionary in the list into columns
11
11
  expanded_df = pd.DataFrame(
12
- df[column].apply(lambda x: x + [None] * (max_len - len(x))).tolist(),
12
+ df[column]
13
+ .apply(lambda x: [{**item} for item in x] + [{}] * (max_len - len(x)))
14
+ .tolist(),
13
15
  index=df.index,
14
16
  )
15
17
 
16
- # Rename the columns
17
- expanded_df.columns = [f"{column}_{i+1}" for i in range(expanded_df.shape[1])]
18
+ # Flatten the nested dictionaries into separate columns
19
+ expanded_df = pd.json_normalize(expanded_df.to_dict(orient="records"))
20
+
21
+ new_columns = []
22
+ for i in range(max_len):
23
+ for key in expanded_df.columns[i::max_len]:
24
+ new_key = key.split(".")[-1] # Get the actual key name
25
+ new_columns.append(f"{column}_{i+1}.{new_key}")
26
+
27
+ # Rename the columns to reflect the nested structure
28
+ expanded_df.columns = new_columns
18
29
 
19
30
  # Drop the original column and join the expanded columns
20
31
  df = df.drop(column, axis=1).join(expanded_df)
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osi-dump
3
- Version: 0.1.2.2
4
- Summary: OpenStack instances information dump tool
3
+ Version: 0.1.2.4
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,10 +1,11 @@
1
1
  osi_dump/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  osi_dump/__main__.py,sha256=fCVTLFipB-P0872_4j7iOJNNosOMBj3YdHr8TH_fhRY,71
3
- osi_dump/cli.py,sha256=CjGuTUIf90a-h8hoh6-nh4TKAS1gg9Bi1pXIVK907Qc,5824
3
+ osi_dump/cli.py,sha256=vLijmcrWieCVK4cSLN2sK9ltWlercw9Zg6yBEvZtPkg,6379
4
4
  osi_dump/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- osi_dump/api/octavia.py,sha256=XMA7boyySHpQpvEw6sjGCvjqUWRwGG_SXqLhwPH3k3w,986
5
+ osi_dump/api/octavia.py,sha256=_vuuZ-Pcj4oV1A3Sf_RSiuc_UxcHXKLty87HEyipPGg,950
6
6
  osi_dump/api/placement.py,sha256=9yADLulo1HfUnPLE7IJt4ZY8e2jRTaoeV4J4MMiKCew,455
7
7
  osi_dump/batch_handler/__init__.py,sha256=wsiE42GCjbKgXBzpiahWEDF_-IXCKzr6PyrLn0oEKSc,288
8
+ osi_dump/batch_handler/external_port_batch_handler.py,sha256=kWT7cKmcZZPY1mauYDB_qaCd42CzVbTof7lm7le4U6c,1821
8
9
  osi_dump/batch_handler/flavor_batch_handler.py,sha256=Cxf-rkuW5MrrOyiKi9N3InsdDGku7Bf0CAaPNhhM0hE,1589
9
10
  osi_dump/batch_handler/floating_ip_batch_handler.py,sha256=bEkT4BRi85qir-a1i7eEI_arA0LENq1gD6xHj8IdXu0,1771
10
11
  osi_dump/batch_handler/hypervisor_batch_handler.py,sha256=vkv6SAx1arPNVvFJ6RyvbJjC2F2Hes9km7dwhL4NJDY,1755
@@ -16,6 +17,9 @@ osi_dump/batch_handler/role_assignment_batch_handler.py,sha256=45TtVDDRjp9scpW9G
16
17
  osi_dump/batch_handler/router_batch_handler.py,sha256=XelVNw_2u00Rdnz20SI2HIPPJKwz3623BbceMGnDS8Q,1587
17
18
  osi_dump/batch_handler/volume_batch_handler.py,sha256=UAU34FZD8XkJkmlr4Idk4NgFBzjD52PxekJDgV1ekG0,1569
18
19
  osi_dump/exporter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ osi_dump/exporter/external_port/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ osi_dump/exporter/external_port/excel_external_port_exporter.py,sha256=FgLQersxmb-g2el02PxMFWSO0Chn5YdxEMXfDM_Jtn4,1108
22
+ osi_dump/exporter/external_port/external_port_exporter.py,sha256=LK7r_Do87ZONgmlH8FdtB-k1C_tT0ie3I0dCQyb6OUA,169
19
23
  osi_dump/exporter/flavor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
24
  osi_dump/exporter/flavor/excel_flavor_exporter.py,sha256=_wNVToj0FsIkaLbqn7-TWETrtUftBM1Pjr-0WaBJtBI,876
21
25
  osi_dump/exporter/flavor/flavor_exporter.py,sha256=-zQ8776yk7vHpiZUOcX61V8KxA40AAq8foV7fD0i1g0,155
@@ -46,6 +50,9 @@ osi_dump/exporter/router/router_exporter.py,sha256=DZxDVnBnHZej3ZfMHO9gwsvonUWlR
46
50
  osi_dump/exporter/volume/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
51
  osi_dump/exporter/volume/excel_volume_exporter.py,sha256=BhesTGXMQF3BAwHgJMYfnxFgHxZo7TKPePG8q9T8ONI,865
48
52
  osi_dump/exporter/volume/volume_exporter.py,sha256=YoPvytC0ctWeWwVcG6pb0XwkF4N0QcGAoUHa3QldkEg,155
53
+ osi_dump/importer/external_port/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ osi_dump/importer/external_port/external_port_importer.py,sha256=mLFNwjaYiUNk3DO74GUCXC1eCaWbymGjKJKex3O2z-U,218
55
+ osi_dump/importer/external_port/openstack_external_port_importer.py,sha256=JhESn9ipAQBJiltscn417I8OUn9W-AfqYI62-3wyHvQ,3903
49
56
  osi_dump/importer/flavor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
57
  osi_dump/importer/flavor/flavor_importer.py,sha256=IfU2L8N8EO4eESnEDirwe9U-GXSTuTcsdrlDxD95tcQ,186
51
58
  osi_dump/importer/flavor/openstack_flavor_importer.py,sha256=y3uFCls7H-l1tu11T_PaEoWghhdxINsf7baRAShXC1w,1876
@@ -54,7 +61,7 @@ osi_dump/importer/floating_ip/floating_ip_importer.py,sha256=2_lCZYF-r2dgdL4Yzws
54
61
  osi_dump/importer/floating_ip/openstack_floating_ip_importer.py,sha256=xuALHyiyb4LdRgFN0hZvOx0pImKpGsLUtPWW_1q52gc,2286
55
62
  osi_dump/importer/hypervisor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
63
  osi_dump/importer/hypervisor/hypervisor_importer.py,sha256=JuoJBltqFYhH-Ql9TLUPHX2YurS0JFV7Augrc6bDJ5Q,206
57
- osi_dump/importer/hypervisor/openstack_hypervisor_importer.py,sha256=FGZSXpZtnEXvEmCSy4t-HX4evb4x6j6WlWK00tR2baQ,3103
64
+ osi_dump/importer/hypervisor/openstack_hypervisor_importer.py,sha256=82lSo5cMdvMQ9snU_eIVNOsHp5cT5v8Sf9xSEGZfBzg,2870
58
65
  osi_dump/importer/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
66
  osi_dump/importer/image/image_importer.py,sha256=6zwAMnS58S2HGwARwebqf4VE9IBQBv5Ot6nmcn9H4fY,181
60
67
  osi_dump/importer/image/openstack_image_importer.py,sha256=Tc2eZ4fU_2S-fp_vuDWutqPcyV6Erz17nDLjzjusihY,2413
@@ -63,7 +70,7 @@ osi_dump/importer/instance/instance_importer.py,sha256=TaaPgEFVVMRT3mSXrzQkSaSIB
63
70
  osi_dump/importer/instance/openstack_instance_importer.py,sha256=hTCdrTvY-hsjXb15gDmpKaKTjJJACUVSRahvHsDOi38,3445
64
71
  osi_dump/importer/load_balancer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
72
  osi_dump/importer/load_balancer/load_balancer_importer.py,sha256=fzInBlkscqlbhCATeQYXvufc-WHq2pbofTJJifN0zaY,218
66
- osi_dump/importer/load_balancer/openstack_load_balancer_importer.py,sha256=XwEfj7CaM1CwayYYuk6oahFr-jM1JptPXf7EIXVpkuI,2312
73
+ osi_dump/importer/load_balancer/openstack_load_balancer_importer.py,sha256=sX5ZMHT-QPIuAD4YBwitxj8l5fMvbOsA-BOQxLL84lU,2392
67
74
  osi_dump/importer/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
75
  osi_dump/importer/project/openstack_project_importer.py,sha256=K8Si2uaC88L2CxXi68A4ML9mlWKwnZp1ABDiufFUZ8g,2988
69
76
  osi_dump/importer/project/project_importer.py,sha256=jwEvxteFbSwyWMV8hKAtf5Lo2bZysWkQ1L_NVUE8XOQ,191
@@ -78,12 +85,13 @@ osi_dump/importer/volume/openstack_volume_importer.py,sha256=Tte9fX91oxEoRcUZPJd
78
85
  osi_dump/importer/volume/volume_importer.py,sha256=tmDTE9L9vtl75GR79blSxa_MVsRU6LDCbR0yJk0xKwo,186
79
86
  osi_dump/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
87
  osi_dump/model/authentication_info.py,sha256=02kXxtILfjh8t45_-bPM8rtyRk2cQcJK6l2d1bPih7k,257
88
+ osi_dump/model/external_port.py,sha256=4FlyG8ZmQO7nNdavmRBhK8ZMsNogmhMqEBa03okvqXM,477
81
89
  osi_dump/model/flavor.py,sha256=-G8FaH_qiVrgtRxAWhdpC1c9FRdXLRroG-WJ03-DRZ4,318
82
90
  osi_dump/model/floating_ip.py,sha256=CRJufC5ZaxxcbGvdot7Af-sO8uyKbyQK9zHljfBnyFA,427
83
91
  osi_dump/model/hypervisor.py,sha256=pToa-rg7LldKd-h3aNZDJQPy5dhYDIXehq-tr8_xv1I,336
84
- osi_dump/model/image.py,sha256=9QTBsAeXQ2ek8wCZgMIvAEcGWKAX5A5KIrEqxx-1sro,455
92
+ osi_dump/model/image.py,sha256=XidrVfSYEidgKP5Qh4auRAi1AgDagvTW-zMdhfwSenE,465
85
93
  osi_dump/model/instance.py,sha256=DSQ0F0CTHL0f_GMZ4GwH2D-Q_KvRmrNyCWTpCzDlqBs,494
86
- osi_dump/model/load_balancer.py,sha256=I53PZPa5v7q1fn-zknidAV7cKHvhLkTbghJy0ZHd7gw,291
94
+ osi_dump/model/load_balancer.py,sha256=T5RU6gm36ePYCh3KQ_OYO44FHMfxTcSNaiuKP5E_9CY,352
87
95
  osi_dump/model/project.py,sha256=3fNsDcWxuRVBS96W98C_Fia82qt14InjUM7n7rBCX6E,679
88
96
  osi_dump/model/role_assignment.py,sha256=fNt05y4aFF6b71Yps_EHzWavv8wF-jYx7gd3WAhqy6Y,310
89
97
  osi_dump/model/router.py,sha256=nO0XW0mpabr4ajM40Biuva63N8YWulZUrhH5kmPnKgI,363
@@ -96,10 +104,10 @@ osi_dump/util/excel_autosize_column.py,sha256=zzQ6uXkQhHAqVn9fUAgNjoCH_HiNEC9Dcj
96
104
  osi_dump/util/excel_sort_sheet.py,sha256=o4jXtP1ZFYtAGzkAP5S8Tym4h-SEoFBAI3j24y-24UM,1047
97
105
  osi_dump/util/export_data_excel.py,sha256=VYSxDBZ7dgSbTj3n_8RRPqe183tILNh6wJW-UnFvJUU,882
98
106
  osi_dump/util/extract_hostname.py,sha256=IpdklGHevmtRu67xeSRE_5n2mvWGI1sDsnJwExo_AR0,111
99
- osi_dump/util/panda_excel.py,sha256=TsQy-wTDv5uwfpA_fC3MaPzB6EpJfNKcUTZjjltvafo,639
107
+ osi_dump/util/panda_excel.py,sha256=GHHLguKLMm1sq4FHTPHABTjx7IqpOcGF_3OJT-cJORE,1011
100
108
  osi_dump/util/validate_dir_path.py,sha256=pL_OrY8JnNwk3vj6Zp6bsZtgHXhszSGRoqIt-1G5S90,507
101
- osi_dump-0.1.2.2.dist-info/METADATA,sha256=T13pAoVzlYg_3K3TDkm-kMhCSmAN2btQw5MX2gIWKuE,664
102
- osi_dump-0.1.2.2.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
103
- osi_dump-0.1.2.2.dist-info/entry_points.txt,sha256=ozm5sIBtXzLv6_FiUe26v1BgA3_xUReGLPhKQKZ56wQ,46
104
- osi_dump-0.1.2.2.dist-info/top_level.txt,sha256=OtAAwmJfcoPvlw_Cemo_H1aXIGV_7w0O2941KQt6faQ,9
105
- osi_dump-0.1.2.2.dist-info/RECORD,,
109
+ osi_dump-0.1.2.4.dist-info/METADATA,sha256=EWxn3aH4G1KtV19tQ5tly_4U-Mavb6NoB-a8D2bBndw,675
110
+ osi_dump-0.1.2.4.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
111
+ osi_dump-0.1.2.4.dist-info/entry_points.txt,sha256=ozm5sIBtXzLv6_FiUe26v1BgA3_xUReGLPhKQKZ56wQ,46
112
+ osi_dump-0.1.2.4.dist-info/top_level.txt,sha256=OtAAwmJfcoPvlw_Cemo_H1aXIGV_7w0O2941KQt6faQ,9
113
+ osi_dump-0.1.2.4.dist-info/RECORD,,