portforward 0.6.1__cp310-none-win32.whl → 0.7.0__cp310-none-win32.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.

Potentially problematic release.


This version of portforward might be problematic. Click here for more details.

portforward/__init__.py CHANGED
@@ -2,14 +2,15 @@
2
2
  Easy Kubernetes Port-Forward For Python
3
3
  """
4
4
 
5
- __version__ = "0.6.1"
5
+ __version__ = "0.7.0"
6
6
 
7
7
  import asyncio
8
8
  import contextlib
9
+ import ipaddress
9
10
  import os
10
11
  from enum import Enum
11
12
  from pathlib import Path
12
- from typing import Generator, Optional
13
+ from typing import Generator, Optional, Union
13
14
 
14
15
  from portforward import _portforward
15
16
 
@@ -36,6 +37,7 @@ def forward(
36
37
  waiting: float = 0.1,
37
38
  log_level: LogLevel = LogLevel.INFO,
38
39
  kube_context: str = "",
40
+ bind_ip: Union[ipaddress.IPv4Address, ipaddress.IPv6Address, str, None] = None,
39
41
  ) -> Generator["PortForwarder", None, None]:
40
42
  """
41
43
  Connects to a **pod or service** and tunnels traffic from a local port to
@@ -55,12 +57,13 @@ def forward(
55
57
 
56
58
  :param namespace: Target namespace
57
59
  :param pod_or_service: Name of target Pod or service
58
- :param from_port: Local port
60
+ :param from_port: Local port, or 0 to use any free port
59
61
  :param to_port: Port inside the pod
60
62
  :param config_path: Path for loading kube config
61
63
  :param waiting: Delay in seconds
62
64
  :param log_level: Level of logging
63
65
  :param kube_context: Target kubernetes context (fallback is current context)
66
+ :param bind_ip: To which IP shall the portforward be bind
64
67
  :return: forwarder to manual stop the forwarding
65
68
  """
66
69
 
@@ -73,6 +76,7 @@ def forward(
73
76
  waiting,
74
77
  log_level,
75
78
  kube_context,
79
+ bind_ip,
76
80
  )
77
81
 
78
82
  try:
@@ -101,6 +105,7 @@ class PortForwarder:
101
105
  waiting: float = 0.1,
102
106
  log_level: LogLevel = LogLevel.INFO,
103
107
  kube_context: str = "",
108
+ bind_ip: Union[ipaddress.IPv4Address, ipaddress.IPv6Address, str, None] = None,
104
109
  ) -> None:
105
110
  self._async_forwarder = AsyncPortForwarder(
106
111
  namespace,
@@ -111,6 +116,7 @@ class PortForwarder:
111
116
  waiting,
112
117
  log_level,
113
118
  kube_context,
119
+ bind_ip,
114
120
  )
115
121
 
116
122
  def forward(self):
@@ -123,6 +129,11 @@ class PortForwarder:
123
129
  def is_stopped(self):
124
130
  return self._async_forwarder.is_stopped
125
131
 
132
+ @property
133
+ def from_port(self):
134
+ """The local port that was actually used for the portforward."""
135
+ return self._async_forwarder.from_port
136
+
126
137
 
127
138
  class AsyncPortForwarder:
128
139
  """Use the same args as the `portforward.forward` method."""
@@ -137,10 +148,10 @@ class AsyncPortForwarder:
137
148
  waiting: float = 0.1,
138
149
  log_level: LogLevel = LogLevel.INFO,
139
150
  kube_context: str = "",
151
+ bind_ip: Union[ipaddress.IPv4Address, ipaddress.IPv6Address, str, None] = None,
140
152
  ) -> None:
141
153
  self.namespace: str = _validate_str("namespace", namespace)
142
154
  self.pod_or_service: str = _validate_str("pod_or_service", pod_or_service)
143
- self.from_port: int = _validate_port("from_port", from_port)
144
155
  self.to_port: int = _validate_port("to_port", to_port)
145
156
  self.log_level: LogLevel = _validate_log(log_level)
146
157
  self.waiting: float = waiting
@@ -148,14 +159,19 @@ class AsyncPortForwarder:
148
159
  self.config_path: str = _config_path(config_path)
149
160
  self.kube_context: str = _kube_context(kube_context)
150
161
 
162
+ _validate_port("from_port", from_port)
163
+ bind_ip = _validate_ip_address(bind_ip)
164
+
151
165
  self.actual_pod_name: str = ""
166
+ self.from_port: int = 0
152
167
  self._is_stopped: bool = False
168
+ self.bind_address: str = f"{bind_ip}:{from_port}"
153
169
 
154
170
  async def forward(self):
155
- self.actual_pod_name = await _portforward.forward(
171
+ (self.actual_pod_name, self.from_port) = await _portforward.forward(
156
172
  self.namespace,
157
173
  self.pod_or_service,
158
- self.from_port,
174
+ self.bind_address,
159
175
  self.to_port,
160
176
  self.config_path,
161
177
  self.log_level.value,
@@ -190,7 +206,7 @@ def _validate_str(arg_name, arg) -> str:
190
206
 
191
207
 
192
208
  def _validate_port(arg_name, arg) -> int:
193
- in_range = arg and 0 < arg < 65536
209
+ in_range = arg is not None and 0 <= arg < 65536
194
210
  if arg is None or not isinstance(arg, int) or not in_range:
195
211
  raise ValueError(f"{arg_name}={arg} is not a valid port")
196
212
 
@@ -204,6 +220,18 @@ def _validate_log(log_level):
204
220
  return log_level
205
221
 
206
222
 
223
+ def _validate_ip_address(ip_address):
224
+ if not ip_address:
225
+ return "127.0.0.1"
226
+
227
+ if isinstance(ip_address, ipaddress.IPv4Address) or isinstance(
228
+ ip_address, ipaddress.IPv4Address
229
+ ):
230
+ return str(ip_address)
231
+
232
+ return str(ipaddress.ip_address(ip_address))
233
+
234
+
207
235
  def _config_path(config_path_arg) -> str:
208
236
  if config_path_arg and not isinstance(config_path_arg, str):
209
237
  raise ValueError(f"config_path={config_path_arg} is not a valid str")
Binary file
@@ -5,7 +5,7 @@ Rust native module / Python C Extension
5
5
  async def forward(
6
6
  namespace: str,
7
7
  pod_or_service: str,
8
- from_port: int,
8
+ bind_address: str,
9
9
  to_port: int,
10
10
  config_path: str,
11
11
  log_level: int,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: portforward
3
- Version: 0.6.1
3
+ Version: 0.7.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -58,9 +58,9 @@ Installation
58
58
 
59
59
  Wheels are available for:
60
60
 
61
- * Windows
62
- * MacOS X
63
- * Linux
61
+ * Windows (architectures: x64, x86)
62
+ * MacOS X (architectures: x86_64, aarch64)
63
+ * Linux (architectures: x86_64, x86, aarch64)
64
64
 
65
65
  with Python versions:
66
66
 
@@ -70,11 +70,6 @@ with Python versions:
70
70
  * 3.11
71
71
  * 3.12
72
72
 
73
- and architectures:
74
-
75
- * x84_64
76
- * arm64 (known as M1/Apple Chip - MacOS only)
77
-
78
73
  **Requirements for installation from source**
79
74
 
80
75
  The following things are required when there is no wheel available for the target system.
@@ -0,0 +1,9 @@
1
+ portforward-0.7.0.dist-info/METADATA,sha256=i-2BU1didFSYehAwiCFrG1JQ937XKZhPpwiKiJZLues,3844
2
+ portforward-0.7.0.dist-info/WHEEL,sha256=AnBiw1HqI1cEmqZe7uv9-3FVnQbAwERtJW_PC-t8DDw,93
3
+ portforward-0.7.0.dist-info/license_files/LICENSE,sha256=_-nf_xCZIwUkKBXXiYR-fjbXGhmx6V-7b3jSKoolnO4,1096
4
+ portforward-0.7.0.dist-info/license_files/AUTHORS.rst,sha256=mskf9O-AvJL9NxWUYX0nJRuLfBw7SH-T-H-pPYLW-xI,176
5
+ portforward/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ portforward/_portforward.pyi,sha256=UDGuRjzq4fFH2vyVMKGpsBQvYq8MK0LfFsM1FxljTX4,353
7
+ portforward/__init__.py,sha256=k5ue6jwiYqPBRzulv2BdfWiTHj05Qg4jlY0WtEJeV8M,7318
8
+ portforward/_portforward.cp310-win32.pyd,sha256=Nl3qAsplElF9dQnU4vm1e99TnZGcXsoBhbfUtaZXLuU,6578176
9
+ portforward-0.7.0.dist-info/RECORD,,
@@ -1,9 +0,0 @@
1
- portforward-0.6.1.dist-info/METADATA,sha256=xXLmrD7F0DZBgpBYyc0ZPEmza3is1z6V-KxpnfdN340,3828
2
- portforward-0.6.1.dist-info/WHEEL,sha256=AnBiw1HqI1cEmqZe7uv9-3FVnQbAwERtJW_PC-t8DDw,93
3
- portforward-0.6.1.dist-info/license_files/LICENSE,sha256=_-nf_xCZIwUkKBXXiYR-fjbXGhmx6V-7b3jSKoolnO4,1096
4
- portforward-0.6.1.dist-info/license_files/AUTHORS.rst,sha256=mskf9O-AvJL9NxWUYX0nJRuLfBw7SH-T-H-pPYLW-xI,176
5
- portforward/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- portforward/_portforward.pyi,sha256=iZTDdh3rwEtEfNOcVV69xgiqyPOV7n6LUNAiKPSAbII,350
7
- portforward/__init__.py,sha256=o4WIA6da3jj768ZkjHMTIzieHVjfRf1-uyAH84xoTfI,6279
8
- portforward/_portforward.cp310-win32.pyd,sha256=sF3rPkjqK8zUn3Zmbo2NlItWp1SMgEuyxvQkXzhUf7s,6656000
9
- portforward-0.6.1.dist-info/RECORD,,