osi-dump 0.1.3.3.3.8__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/api/octavia.py CHANGED
@@ -7,6 +7,10 @@ import osi_dump.util.openstack_util as os_util
7
7
 
8
8
 
9
9
  def get_load_balancer_flavor(connection: Connection, flavor_id: str) -> dict:
10
+
11
+ if not flavor_id:
12
+ return None
13
+
10
14
  octavia_endpoints = os_util.get_endpoints(
11
15
  connection=connection, service_type="load-balancer", interface="public"
12
16
  )
@@ -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 floating ips for {self.sheet_name} error: {e}")
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}")
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class NetworkExporter(ABC):
5
+ @abstractmethod
6
+ def export_networks(self, networks, output_file: str):
7
+ pass
@@ -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:
@@ -72,8 +72,11 @@ class OpenStackLoadBalancerImporter(LoadBalancerImporter):
72
72
  flavor_id=load_balancer["flavor_id"]
73
73
  )
74
74
 
75
- lb_flavor_name = lb_flavor["name"]
76
- lb_flavor_description = lb_flavor["description"]
75
+ if lb_flavor:
76
+ lb_flavor_name = lb_flavor["name"]
77
+ lb_flavor_description = lb_flavor["description"]
78
+ else:
79
+ raise Exception(f'No flavor id found for {load_balancer["id"]}')
77
80
  except Exception as e:
78
81
  logger.warning(f"Get load balancer flavor failed {e}")
79
82
 
File without changes
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from osi_dump.model.network import Network
4
+
5
+
6
+ class NetworkImporter(ABC):
7
+ @abstractmethod
8
+ def import_networks(self) -> list[Network]:
9
+ pass
@@ -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
  Metadata-Version: 2.1
2
2
  Name: osi-dump
3
- Version: 0.1.3.3.3.8
3
+ Version: 0.1.3.3.4.0
4
4
  Summary: OpenStack information dump tool
5
5
  Author: TVKain
6
6
  License: Apache-2.0
@@ -1,10 +1,10 @@
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=vLijmcrWieCVK4cSLN2sK9ltWlercw9Zg6yBEvZtPkg,6379
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
7
- osi_dump/api/octavia.py,sha256=rn7KJNb6X3O_JNFvDDb3cc3B94NmaTtCFiDvG9j7QHc,2541
7
+ osi_dump/api/octavia.py,sha256=XqG406SuoJUGohAtREsTcBatLCANUM-dFSdXvdQ740I,2586
8
8
  osi_dump/api/placement.py,sha256=yoWzg39b8nK2E1nrxDhLxLsa7FcBTw57gfy8b5F5ijc,1096
9
9
  osi_dump/batch_handler/__init__.py,sha256=wsiE42GCjbKgXBzpiahWEDF_-IXCKzr6PyrLn0oEKSc,288
10
10
  osi_dump/batch_handler/external_port_batch_handler.py,sha256=iGm0htGbLkpTX5RFPcrvXrVVn0eeTpavN3u4s58Z_pE,1783
@@ -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=_wNVToj0FsIkaLbqn7-TWETrtUftBM1Pjr-0WaBJtBI,876
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=lVxVGWKNlNAPhEHC_nWg9cxIGz8Lv6AVQXwIgQsWnP0,3923
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
@@ -72,7 +76,10 @@ osi_dump/importer/instance/instance_importer.py,sha256=TaaPgEFVVMRT3mSXrzQkSaSIB
72
76
  osi_dump/importer/instance/openstack_instance_importer.py,sha256=HvA1hYLAneY0KtDTk7nz6TWXNGO5s6EOp7Hrm7-FxHI,4249
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
- osi_dump/importer/load_balancer/openstack_load_balancer_importer.py,sha256=jK7VZd_-5A6lUipFCwyO_n0KUUuZLfIw_DQaJPV2oMI,3899
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.3.8.dist-info/METADATA,sha256=ujHSymvjyIy7-jQZQYR7SjM5s6AiJfNIbIXyBb4FM4s,685
113
- osi_dump-0.1.3.3.3.8.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
114
- osi_dump-0.1.3.3.3.8.dist-info/entry_points.txt,sha256=ozm5sIBtXzLv6_FiUe26v1BgA3_xUReGLPhKQKZ56wQ,46
115
- osi_dump-0.1.3.3.3.8.dist-info/top_level.txt,sha256=OtAAwmJfcoPvlw_Cemo_H1aXIGV_7w0O2941KQt6faQ,9
116
- osi_dump-0.1.3.3.3.8.dist-info/RECORD,,
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,,