osi-dump 0.1.3.3.3.9__py3-none-any.whl → 0.1.3.3.4.0__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/batch_handler/network_batch_handler.py +51 -0
- osi_dump/cli.py +12 -0
- osi_dump/exporter/flavor/excel_flavor_exporter.py +1 -1
- osi_dump/exporter/network/__init__.py +0 -0
- osi_dump/exporter/network/excel_network_exporter.py +32 -0
- osi_dump/exporter/network/network_exporter.py +7 -0
- osi_dump/importer/hypervisor/openstack_hypervisor_importer.py +17 -0
- osi_dump/importer/network/__init__.py +0 -0
- osi_dump/importer/network/network_importer.py +9 -0
- osi_dump/importer/network/openstack_network_importer.py +94 -0
- osi_dump/model/network.py +26 -0
- {osi_dump-0.1.3.3.3.9.dist-info → osi_dump-0.1.3.3.4.0.dist-info}/METADATA +1 -1
- {osi_dump-0.1.3.3.3.9.dist-info → osi_dump-0.1.3.3.4.0.dist-info}/RECORD +16 -8
- {osi_dump-0.1.3.3.3.9.dist-info → osi_dump-0.1.3.3.4.0.dist-info}/WHEEL +0 -0
- {osi_dump-0.1.3.3.3.9.dist-info → osi_dump-0.1.3.3.4.0.dist-info}/entry_points.txt +0 -0
- {osi_dump-0.1.3.3.3.9.dist-info → osi_dump-0.1.3.3.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from openstack.connection import Connection
|
4
|
+
|
5
|
+
from osi_dump.exporter.network.network_exporter import NetworkExporter
|
6
|
+
from osi_dump.exporter.network.excel_network_exporter import (
|
7
|
+
ExcelNetworkExporter,
|
8
|
+
)
|
9
|
+
|
10
|
+
from osi_dump.importer.network.network_importer import NetworkImporter
|
11
|
+
from osi_dump.importer.network.openstack_network_importer import (
|
12
|
+
OpenStackNetworkImporter,
|
13
|
+
)
|
14
|
+
|
15
|
+
|
16
|
+
from osi_dump import util
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
class NetworkBatchHandler:
|
22
|
+
def __init__(self):
|
23
|
+
self._importer_exporter_list: list[tuple[NetworkImporter, NetworkExporter]] = []
|
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 = OpenStackNetworkImporter(connection)
|
30
|
+
|
31
|
+
sheet_name = f"{util.extract_hostname(connection.auth['auth_url'])}-network"
|
32
|
+
exporter = ExcelNetworkExporter(
|
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: NetworkImporter, exporter: NetworkExporter):
|
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
|
+
networks = importer.import_networks()
|
47
|
+
|
48
|
+
exporter.export_networks(networks=networks)
|
49
|
+
except Exception as e:
|
50
|
+
logger.warning(e)
|
51
|
+
logger.warning("Skipping...")
|
osi_dump/cli.py
CHANGED
@@ -19,6 +19,8 @@ app = typer.Typer()
|
|
19
19
|
|
20
20
|
|
21
21
|
from osi_dump.batch_handler.flavor_batch_handler import FlavorBatchHandler
|
22
|
+
from osi_dump.batch_handler.network_batch_handler import NetworkBatchHandler
|
23
|
+
|
22
24
|
from osi_dump.batch_handler.image_batch_handler import ImageBatchHandler
|
23
25
|
from osi_dump.batch_handler.volume_batch_handler import VolumeBatchHandler
|
24
26
|
from osi_dump.os_connection.get_connections import get_connections
|
@@ -149,6 +151,14 @@ def _external_port(connections, output_path: str):
|
|
149
151
|
|
150
152
|
_external_batch_handler.process()
|
151
153
|
|
154
|
+
def _network(connections, output_path: str):
|
155
|
+
_network_batch_handler = NetworkBatchHandler()
|
156
|
+
|
157
|
+
_network_batch_handler.add_importer_exporter_from_openstack_connections(
|
158
|
+
connections, output_file=output_path
|
159
|
+
)
|
160
|
+
|
161
|
+
_network_batch_handler.process()
|
152
162
|
|
153
163
|
def inner_main(file_path: str, output_path: str):
|
154
164
|
|
@@ -178,6 +188,8 @@ def inner_main(file_path: str, output_path: str):
|
|
178
188
|
|
179
189
|
_external_port(connections=connections, output_path=output_path)
|
180
190
|
|
191
|
+
_network(connections=connections, output_path=output_path)
|
192
|
+
|
181
193
|
util.excel_autosize_column(output_path)
|
182
194
|
|
183
195
|
util.excel_sort_sheet(output_path)
|
@@ -27,4 +27,4 @@ class ExcelFlavorExporter(FlavorExporter):
|
|
27
27
|
|
28
28
|
logger.info(f"Exported flavors for {self.sheet_name}")
|
29
29
|
except Exception as e:
|
30
|
-
logger.warning(f"Exporting
|
30
|
+
logger.warning(f"Exporting flavors for {self.sheet_name} error: {e}")
|
File without changes
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
|
4
|
+
import pandas as pd
|
5
|
+
|
6
|
+
|
7
|
+
from osi_dump.exporter.network.network_exporter import NetworkExporter
|
8
|
+
|
9
|
+
from osi_dump.model.network import Network
|
10
|
+
|
11
|
+
from osi_dump import util
|
12
|
+
|
13
|
+
logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
class ExcelNetworkExporter(NetworkExporter):
|
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_networks(self, networks: list[Network]):
|
22
|
+
df = pd.json_normalize([network.model_dump() for network in networks])
|
23
|
+
|
24
|
+
df = util.expand_list_column(df, "subnets")
|
25
|
+
|
26
|
+
logger.info(f"Exporting networks for {self.sheet_name}")
|
27
|
+
try:
|
28
|
+
util.export_data_excel(self.output_file, sheet_name=self.sheet_name, df=df)
|
29
|
+
|
30
|
+
logger.info(f"Exported networks for {self.sheet_name}")
|
31
|
+
except Exception as e:
|
32
|
+
logger.warning(f"Exporting networks for {self.sheet_name} error: {e}")
|
@@ -56,6 +56,23 @@ class OpenStackHypervisorImporter(HypervisorImporter):
|
|
56
56
|
|
57
57
|
return hypervisors
|
58
58
|
|
59
|
+
|
60
|
+
def _normalize_hypervisor_aggregate(self, hypervisors: list[Hypervisor]):
|
61
|
+
|
62
|
+
aggregate_id_map = {
|
63
|
+
|
64
|
+
}
|
65
|
+
|
66
|
+
aggregates: list[list[dict]] = [
|
67
|
+
|
68
|
+
]
|
69
|
+
|
70
|
+
for hypervisor in hypervisors:
|
71
|
+
aggregates.append(hypervisor.aggregates)
|
72
|
+
|
73
|
+
def _swap_element(array, i, j):
|
74
|
+
array[i], array[j] = array[j], array[i]
|
75
|
+
|
59
76
|
def _get_hypervisor_info(
|
60
77
|
self, hypervisor: OSHypervisor, aggregates: list[OSAggregate]
|
61
78
|
) -> Hypervisor:
|
File without changes
|
@@ -0,0 +1,94 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
import concurrent
|
4
|
+
|
5
|
+
from openstack.network.v2.network import Network as OSNetwork
|
6
|
+
from openstack.network.v2.subnet import Subnet as OSSubnet
|
7
|
+
|
8
|
+
from openstack.connection import Connection
|
9
|
+
|
10
|
+
from osi_dump.importer.network.network_importer import NetworkImporter
|
11
|
+
from osi_dump.model.network import Network
|
12
|
+
|
13
|
+
|
14
|
+
logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
class OpenStackNetworkImporter(NetworkImporter):
|
18
|
+
def __init__(self, connection: Connection):
|
19
|
+
self.connection = connection
|
20
|
+
|
21
|
+
def import_networks(self) -> list[Network]:
|
22
|
+
"""Import networks information from Openstack
|
23
|
+
|
24
|
+
Raises:
|
25
|
+
Exception: Raises exception if fetching networks failed
|
26
|
+
|
27
|
+
Returns:
|
28
|
+
list[Network]: _description_
|
29
|
+
"""
|
30
|
+
|
31
|
+
try:
|
32
|
+
os_networks: list[OSNetwork] = list(self.connection.list_networks())
|
33
|
+
except Exception as e:
|
34
|
+
raise Exception(
|
35
|
+
f"Can not fetch hypervisor for {self.connection.auth['auth_url']}"
|
36
|
+
) from e
|
37
|
+
|
38
|
+
networks: list[Network] = []
|
39
|
+
|
40
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
41
|
+
futures = [
|
42
|
+
executor.submit(self._get_network_info, network)
|
43
|
+
for network in os_networks
|
44
|
+
]
|
45
|
+
for future in concurrent.futures.as_completed(futures):
|
46
|
+
networks.append(future.result())
|
47
|
+
|
48
|
+
logger.info(f"Imported networks for {self.connection.auth['auth_url']}")
|
49
|
+
|
50
|
+
return networks
|
51
|
+
|
52
|
+
|
53
|
+
def _get_network_info(
|
54
|
+
self, network: OSNetwork,
|
55
|
+
) -> Network:
|
56
|
+
|
57
|
+
subnets = self._get_subnets_info(subnet_ids=network.subnet_ids)
|
58
|
+
|
59
|
+
return Network(
|
60
|
+
network_id=network.id,
|
61
|
+
project_id=network.project_id,
|
62
|
+
name=network.name,
|
63
|
+
mtu=network.mtu,
|
64
|
+
port_security_enabled=network.is_port_security_enabled,
|
65
|
+
network_type=network.provider_network_type,
|
66
|
+
physical_network=network.provider_physical_network,
|
67
|
+
segmentation_id=network.provider_segmentation_id,
|
68
|
+
status=network.status,
|
69
|
+
shared=network.is_shared,
|
70
|
+
created_at=network.created_at,
|
71
|
+
updated_at=network.updated_at,
|
72
|
+
subnets=subnets
|
73
|
+
)
|
74
|
+
|
75
|
+
|
76
|
+
def _get_subnets_info(self, subnet_ids: list[str]) -> list[dict]:
|
77
|
+
subnets = []
|
78
|
+
|
79
|
+
for subnet_id in subnet_ids:
|
80
|
+
os_subnet: OSSubnet = self.connection.get_subnet(name_or_id=subnet_id)
|
81
|
+
|
82
|
+
if not os_subnet:
|
83
|
+
continue
|
84
|
+
|
85
|
+
subnets.append({
|
86
|
+
"id": os_subnet.id,
|
87
|
+
"cidr": os_subnet.cidr
|
88
|
+
})
|
89
|
+
|
90
|
+
return subnets
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
from pydantic import BaseModel, ConfigDict
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
class Network(BaseModel):
|
7
|
+
model_config = ConfigDict(strict=True)
|
8
|
+
|
9
|
+
network_id: str
|
10
|
+
project_id: str
|
11
|
+
name: Optional[str]
|
12
|
+
|
13
|
+
subnets: Optional[list[dict]] # {"id": str, "cidr": "str"}
|
14
|
+
mtu: int
|
15
|
+
|
16
|
+
port_security_enabled: Optional[bool]
|
17
|
+
|
18
|
+
network_type: str
|
19
|
+
segmentation_id: Optional[int]
|
20
|
+
physical_network: Optional[str]
|
21
|
+
|
22
|
+
status: Optional[str]
|
23
|
+
shared: Optional[bool]
|
24
|
+
|
25
|
+
created_at: Optional[str]
|
26
|
+
updated_at: Optional[str]
|
@@ -1,6 +1,6 @@
|
|
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=
|
3
|
+
osi_dump/cli.py,sha256=uvVOikUVa4Ly5x9_xORLNsYy3VNt664Iig7nlNIUVrQ,6784
|
4
4
|
osi_dump/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
osi_dump/api/keystone.py,sha256=3oCqzf1cHKs3THOiq6t39_OXNHHTVK9hwCnLVlP8FYg,1446
|
6
6
|
osi_dump/api/neutron.py,sha256=pag_d6MsxA1gOUit4bvVUaTiTrPqLJjwz9KU_QSpxwM,1788
|
@@ -14,6 +14,7 @@ osi_dump/batch_handler/hypervisor_batch_handler.py,sha256=vkv6SAx1arPNVvFJ6RyvbJ
|
|
14
14
|
osi_dump/batch_handler/image_batch_handler.py,sha256=aGF_jnHXuBc7IRFoLLCrSFD8h4TP0g98T_NtBXkZjd4,1564
|
15
15
|
osi_dump/batch_handler/instance_batch_handler.py,sha256=tiHAdhH76BT9-ymnTmTr962cMUTqpPpAQyPSePKEgSM,1761
|
16
16
|
osi_dump/batch_handler/load_balancer_batch_handler.py,sha256=rpbi-n-KsYPGDmlRND5zqcVW6DYVgffmE5najUf2wT4,1796
|
17
|
+
osi_dump/batch_handler/network_batch_handler.py,sha256=Ra4Sz3IpjG7-k5-VGHL1W7pIsrfdMOo6dR35CozGcOs,1614
|
17
18
|
osi_dump/batch_handler/project_batch_handler.py,sha256=uMHx_s-Z4tO1MBah5X-T5d6tLr0qUJuPIR_7RHJ64ck,1626
|
18
19
|
osi_dump/batch_handler/role_assignment_batch_handler.py,sha256=45TtVDDRjp9scpW9GCxbl-b6MoTm_kp0YHchEz630Zk,1882
|
19
20
|
osi_dump/batch_handler/router_batch_handler.py,sha256=XelVNw_2u00Rdnz20SI2HIPPJKwz3623BbceMGnDS8Q,1587
|
@@ -23,7 +24,7 @@ osi_dump/exporter/external_port/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
23
24
|
osi_dump/exporter/external_port/excel_external_port_exporter.py,sha256=FgLQersxmb-g2el02PxMFWSO0Chn5YdxEMXfDM_Jtn4,1108
|
24
25
|
osi_dump/exporter/external_port/external_port_exporter.py,sha256=LK7r_Do87ZONgmlH8FdtB-k1C_tT0ie3I0dCQyb6OUA,169
|
25
26
|
osi_dump/exporter/flavor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
|
-
osi_dump/exporter/flavor/excel_flavor_exporter.py,sha256=
|
27
|
+
osi_dump/exporter/flavor/excel_flavor_exporter.py,sha256=1-RJTG-fY2faK1L4B1nHTl1PRPWKgiX_c_CKPXIvbnA,871
|
27
28
|
osi_dump/exporter/flavor/flavor_exporter.py,sha256=-zQ8776yk7vHpiZUOcX61V8KxA40AAq8foV7fD0i1g0,155
|
28
29
|
osi_dump/exporter/floating_ip/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
29
30
|
osi_dump/exporter/floating_ip/excel_floating_ip_exporter.py,sha256=Bn1yZTvZ8dP3EhVHW-Pr4O9TC2Cz2RbJaz_vRE66xTQ,975
|
@@ -40,6 +41,9 @@ osi_dump/exporter/instance/instance_exporter.py,sha256=5CuKKvTa5S2_Ds7fap6tle4go
|
|
40
41
|
osi_dump/exporter/load_balancer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
41
42
|
osi_dump/exporter/load_balancer/excel_load_balancer_exporter.py,sha256=gffLcLr8uvSbaf7rwZDgNRCPKh8bMIs2ShHtyotpKmw,1105
|
42
43
|
osi_dump/exporter/load_balancer/load_balancer_exporter.py,sha256=Z5uvEKz1UG_dpAw5KVh-IX5PWLzlPt7pV9773bkgjXs,175
|
44
|
+
osi_dump/exporter/network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
|
+
osi_dump/exporter/network/excel_network_exporter.py,sha256=O007PFFPSmDzOagsGGv-zcSEZQVVLRIBLIOSuMl4vYY,950
|
46
|
+
osi_dump/exporter/network/network_exporter.py,sha256=IprGl-jTLKxslEd1skiMzEQ2Qvl9Yu5yNm2uijqlFnA,158
|
43
47
|
osi_dump/exporter/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
48
|
osi_dump/exporter/project/excel_project_exporter.py,sha256=2U3Tvn_Bk4xEQk3Tmh-oj5WXAG1bfxI6m7WVPF1upQw,916
|
45
49
|
osi_dump/exporter/project/project_exporter.py,sha256=q3VAmtmBP4iq9YEW9Eescm3vjAVM4Ev3BDjzkGz9Pgo,158
|
@@ -63,7 +67,7 @@ osi_dump/importer/floating_ip/floating_ip_importer.py,sha256=2_lCZYF-r2dgdL4Yzws
|
|
63
67
|
osi_dump/importer/floating_ip/openstack_floating_ip_importer.py,sha256=xuALHyiyb4LdRgFN0hZvOx0pImKpGsLUtPWW_1q52gc,2286
|
64
68
|
osi_dump/importer/hypervisor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
65
69
|
osi_dump/importer/hypervisor/hypervisor_importer.py,sha256=JuoJBltqFYhH-Ql9TLUPHX2YurS0JFV7Augrc6bDJ5Q,206
|
66
|
-
osi_dump/importer/hypervisor/openstack_hypervisor_importer.py,sha256=
|
70
|
+
osi_dump/importer/hypervisor/openstack_hypervisor_importer.py,sha256=Y5JYSfmkwXMljdqhDyFk2LHGL7kHN9YDKjHnlhaiG-o,4284
|
67
71
|
osi_dump/importer/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
68
72
|
osi_dump/importer/image/image_importer.py,sha256=6zwAMnS58S2HGwARwebqf4VE9IBQBv5Ot6nmcn9H4fY,181
|
69
73
|
osi_dump/importer/image/openstack_image_importer.py,sha256=dqQAsNDPljTDN82YPEjBbPDjvLOCtad_hgRWhIpCWXw,2585
|
@@ -73,6 +77,9 @@ osi_dump/importer/instance/openstack_instance_importer.py,sha256=HvA1hYLAneY0KtD
|
|
73
77
|
osi_dump/importer/load_balancer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
74
78
|
osi_dump/importer/load_balancer/load_balancer_importer.py,sha256=fzInBlkscqlbhCATeQYXvufc-WHq2pbofTJJifN0zaY,218
|
75
79
|
osi_dump/importer/load_balancer/openstack_load_balancer_importer.py,sha256=ocZ8JcjXoxPL_6esNetapaeOrXUVs5tNqb83hL6ih-U,4033
|
80
|
+
osi_dump/importer/network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
81
|
+
osi_dump/importer/network/network_importer.py,sha256=LVak9W8NEu3cWHytttaJlmJ8FrtwaLerY85ZSzAAxOc,191
|
82
|
+
osi_dump/importer/network/openstack_network_importer.py,sha256=1Z74Yb3dA8Z0UmFUHMna2suwB8GZxQ06O5Vfpx0usxo,2703
|
76
83
|
osi_dump/importer/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
77
84
|
osi_dump/importer/project/openstack_project_importer.py,sha256=nQRInUb0vtm57dQNLxSoUFnGrNbAytK2Zl0FaUMPqBc,4964
|
78
85
|
osi_dump/importer/project/project_importer.py,sha256=jwEvxteFbSwyWMV8hKAtf5Lo2bZysWkQ1L_NVUE8XOQ,191
|
@@ -94,6 +101,7 @@ osi_dump/model/hypervisor.py,sha256=6dWEMVrrjOQolX936FqY994S7RAXpMPATpsLPVNeCyk,
|
|
94
101
|
osi_dump/model/image.py,sha256=JUr90XQgA6d3EyoZyV-Cyz4Y1GkEBIDhALsf-_eoR-Y,524
|
95
102
|
osi_dump/model/instance.py,sha256=8puhIKWWfoAaTURXb7XUpjG0lQ4nb0UwrsrTQdDaFbs,639
|
96
103
|
osi_dump/model/load_balancer.py,sha256=3v4j949FM8jAwroWKE1ubaii2eM2XW9DWKl7HjtCdno,571
|
104
|
+
osi_dump/model/network.py,sha256=xwLwayfZ_7Ql8ZDHQhgTFC8LA8yjydtL8uefo-AXMuE,540
|
97
105
|
osi_dump/model/project.py,sha256=S5BtjeMoxZfiJ7z7G_5jYfp5mMTzlPi7DWT5fuBGCTw,749
|
98
106
|
osi_dump/model/role_assignment.py,sha256=fNt05y4aFF6b71Yps_EHzWavv8wF-jYx7gd3WAhqy6Y,310
|
99
107
|
osi_dump/model/router.py,sha256=K8B6w97DYcFNRPmXN6CAZatm_0XSo2qIFVTvgdMfufY,417
|
@@ -109,8 +117,8 @@ osi_dump/util/extract_hostname.py,sha256=IpdklGHevmtRu67xeSRE_5n2mvWGI1sDsnJwExo
|
|
109
117
|
osi_dump/util/openstack_util.py,sha256=_o8LiRmQKtxQ8hU3rbrMNwIAxt0-aWD2rjq-NvVdK9E,1299
|
110
118
|
osi_dump/util/panda_excel.py,sha256=owr8AffIxqN3yY8kIv55Ox4j2dRz7kXZvSZFZeft8dw,734
|
111
119
|
osi_dump/util/validate_dir_path.py,sha256=pL_OrY8JnNwk3vj6Zp6bsZtgHXhszSGRoqIt-1G5S90,507
|
112
|
-
osi_dump-0.1.3.3.
|
113
|
-
osi_dump-0.1.3.3.
|
114
|
-
osi_dump-0.1.3.3.
|
115
|
-
osi_dump-0.1.3.3.
|
116
|
-
osi_dump-0.1.3.3.
|
120
|
+
osi_dump-0.1.3.3.4.0.dist-info/METADATA,sha256=qqAyBU1anhTUZHyK4nXj9rWII9w9I-au2vmNdatdf3k,685
|
121
|
+
osi_dump-0.1.3.3.4.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
122
|
+
osi_dump-0.1.3.3.4.0.dist-info/entry_points.txt,sha256=ozm5sIBtXzLv6_FiUe26v1BgA3_xUReGLPhKQKZ56wQ,46
|
123
|
+
osi_dump-0.1.3.3.4.0.dist-info/top_level.txt,sha256=OtAAwmJfcoPvlw_Cemo_H1aXIGV_7w0O2941KQt6faQ,9
|
124
|
+
osi_dump-0.1.3.3.4.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|