kubernator 1.0.14__py3-none-any.whl → 1.0.24.dev20251109010128__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.
@@ -15,7 +15,7 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
-
18
+ import json
19
19
  import logging
20
20
  import os
21
21
  import tempfile
@@ -35,6 +35,8 @@ proc_logger = logger.getChild("proc")
35
35
  stdout_logger = StripNL(proc_logger.info)
36
36
  stderr_logger = StripNL(proc_logger.warning)
37
37
 
38
+ MINIKUBE_MAX_VERSION_LEGACY = "1.36.0"
39
+
38
40
 
39
41
  class MinikubePlugin(KubernatorPlugin):
40
42
  logger = logger
@@ -89,7 +91,7 @@ class MinikubePlugin(KubernatorPlugin):
89
91
 
90
92
  def register(self, minikube_version=None, profile="default", k8s_version=None,
91
93
  keep_running=False, start_fresh=False,
92
- nodes=1, driver=None, cpus="no-limit", extra_args=None):
94
+ nodes=1, driver=None, cpus="no-limit", extra_args=None, extra_addons=None):
93
95
  context = self.context
94
96
 
95
97
  context.app.register_plugin("kubeconfig")
@@ -99,9 +101,17 @@ class MinikubePlugin(KubernatorPlugin):
99
101
  logger.critical(msg)
100
102
  raise RuntimeError(msg)
101
103
 
104
+ k8s_version_tuple = tuple(map(int, k8s_version.split(".")))
105
+
102
106
  if not minikube_version:
103
107
  minikube_version = self.get_latest_minikube_version()
104
108
  logger.info("No minikube version is specified, latest is %s", minikube_version)
109
+ if k8s_version_tuple < (1, 28, 0):
110
+ logger.info("While latest minikube version is %s, "
111
+ "the requested K8S version %s requires %s or earlier - choosing %s",
112
+ minikube_version, k8s_version, MINIKUBE_MAX_VERSION_LEGACY,
113
+ MINIKUBE_MAX_VERSION_LEGACY)
114
+ minikube_version = MINIKUBE_MAX_VERSION_LEGACY
105
115
 
106
116
  minikube_dl_file, _ = context.app.download_remote_file(logger,
107
117
  f"https://github.com/kubernetes/minikube/releases"
@@ -156,12 +166,14 @@ class MinikubePlugin(KubernatorPlugin):
156
166
  minikube_file=str(minikube_file),
157
167
  profile=profile,
158
168
  k8s_version=k8s_version,
169
+ k8s_version_tuple=k8s_version_tuple,
159
170
  start_fresh=start_fresh,
160
171
  keep_running=keep_running,
161
172
  nodes=nodes,
162
173
  driver=driver,
163
174
  cpus=cpus,
164
175
  extra_args=extra_args or [],
176
+ extra_addons=extra_addons or [],
165
177
  kubeconfig=str(self.kubeconfig_dir / "config"),
166
178
  cmd=self.cmd,
167
179
  cmd_out=self.cmd_out
@@ -192,6 +204,16 @@ class MinikubePlugin(KubernatorPlugin):
192
204
  "--wait", "apiserver",
193
205
  "--nodes", str(minikube.nodes)]
194
206
 
207
+ addons = []
208
+ if minikube.k8s_version_tuple >= (1, 28):
209
+ addons += ["volumesnapshots", "csi-hostpath-driver"]
210
+
211
+ if minikube.extra_addons:
212
+ addons += minikube.extra_addons
213
+
214
+ if addons:
215
+ args += ["--addons", ",".join(addons)]
216
+
195
217
  if minikube.driver == "docker":
196
218
  args.extend(["--cpus", str(minikube.cpus)])
197
219
 
@@ -202,11 +224,34 @@ class MinikubePlugin(KubernatorPlugin):
202
224
  logger.info("Updating minikube profile %r context", minikube.profile)
203
225
  self.cmd("update-context")
204
226
 
227
+ if minikube.k8s_version_tuple >= (1, 28):
228
+ logger.info("Disabling old storage addons")
229
+ self.cmd("addons", "disable", "storage-provisioner")
230
+ self.cmd("addons", "disable", "default-storageclass")
231
+
232
+ logger.info("Running initialization scripts for profile %r", minikube.profile)
233
+ self.context.app.register_plugin("kubectl", version=minikube.k8s_version)
234
+ if minikube.k8s_version_tuple >= (1, 28):
235
+ storage_class = self.context.kubectl.get("storageclass", "csi-hostpath-sc")
236
+ self.context.kubectl.run("delete", "storageclass", "csi-hostpath-sc")
237
+ storage_class["metadata"]["annotations"]["storageclass.kubernetes.io/is-default-class"] = "true"
238
+ storage_class["volumeBindingMode"] = "WaitForFirstConsumer"
239
+
240
+ def write_stdin():
241
+ return json.dumps(storage_class)
242
+
243
+ self.context.kubectl.run("create", "-f", "-", stdin=write_stdin)
244
+
205
245
  def minikube_stop(self):
206
246
  minikube = self.context.minikube
207
247
  if self.minikube_is_running():
208
248
  logger.info("Shutting down minikube profile %r...", minikube.profile)
209
- self.cmd("stop", "-o", "json")
249
+ try:
250
+ self.cmd("stop", "-o", "json")
251
+ except CalledProcessError as e:
252
+ # Workaround for minikube 1.35.0 https://github.com/kubernetes/minikube/issues/20302
253
+ if e.returncode != 82:
254
+ raise
210
255
 
211
256
  def minikube_delete(self):
212
257
  minikube = self.context.minikube
@@ -20,7 +20,7 @@ import logging
20
20
  from collections.abc import Mapping
21
21
  from pathlib import Path
22
22
 
23
- from jsonschema import Draft7Validator, draft7_format_checker
23
+ from jsonschema import Draft7Validator
24
24
 
25
25
  from kubernator.api import (KubernatorPlugin, Globs, scan_dir, load_file, FileType, calling_frame_source,
26
26
  validator_with_defaults, TemplateEngine, Template)
@@ -86,7 +86,7 @@ TEMPLATE_SCHEMA = {
86
86
 
87
87
  Draft7Validator.check_schema(TEMPLATE_SCHEMA)
88
88
  TEMPLATE_VALIDATOR_CLS: type[Draft7Validator] = validator_with_defaults(Draft7Validator)
89
- TEMPLATE_VALIDATOR: Draft7Validator = TEMPLATE_VALIDATOR_CLS(TEMPLATE_SCHEMA, format_checker=draft7_format_checker)
89
+ TEMPLATE_VALIDATOR: Draft7Validator = TEMPLATE_VALIDATOR_CLS(TEMPLATE_SCHEMA, format_checker=Draft7Validator.FORMAT_CHECKER)
90
90
 
91
91
 
92
92
  class TemplatePlugin(KubernatorPlugin):
kubernator/proc.py CHANGED
@@ -108,7 +108,7 @@ class ProcessRunner:
108
108
  raise RuntimeError("not available")
109
109
  return self._proc.stdin
110
110
 
111
- def wait(self, fail=True, timeout=None, _out_func=None):
111
+ def wait(self, fail=True, timeout=None, _out_func=None, _stderr_func=None):
112
112
  with Timeout(timeout, TimeoutExpired):
113
113
  retcode = self._proc.wait()
114
114
  if self._stdin_writer:
@@ -119,9 +119,12 @@ class ProcessRunner:
119
119
  self._stderr_reader.join()
120
120
  if fail and retcode:
121
121
  output = None
122
+ stderr = None
122
123
  if _out_func:
123
124
  output = _out_func()
124
- raise CalledProcessError(retcode, self._safe_args, output=output)
125
+ if _stderr_func:
126
+ stderr = _stderr_func()
127
+ raise CalledProcessError(retcode, self._safe_args, output=output, stderr=stderr)
125
128
  return retcode
126
129
 
127
130
  def terminate(self):
@@ -134,6 +137,25 @@ class ProcessRunner:
134
137
  run = ProcessRunner
135
138
 
136
139
 
140
+ def run_pass_through_capturing(args, stdout_logger, stderr_logger, stdin=DEVNULL, *, safe_args=None,
141
+ universal_newlines=True, **kwargs):
142
+ out = StringIO(trimmed=False) if universal_newlines else BytesIO()
143
+ err = StringIO(trimmed=False) if universal_newlines else BytesIO()
144
+
145
+ def write_out(data):
146
+ out.write(data)
147
+ stdout_logger(data)
148
+
149
+ def write_err(data):
150
+ err.write(data)
151
+ stderr_logger(data)
152
+
153
+ proc = run(args, write_out, write_err, stdin, safe_args=safe_args, universal_newlines=universal_newlines,
154
+ **kwargs)
155
+ proc.wait(_out_func=lambda: out.getvalue(), _stderr_func=lambda: err.getvalue())
156
+ return out.getvalue(), err.getvalue()
157
+
158
+
137
159
  def run_capturing_out(args, stderr_logger, stdin=DEVNULL, *, safe_args=None, universal_newlines=True, **kwargs):
138
160
  out = StringIO(trimmed=False) if universal_newlines else BytesIO()
139
161
  proc = run(args, out.write, stderr_logger, stdin, safe_args=safe_args, universal_newlines=universal_newlines,
@@ -1,22 +1,23 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: kubernator
3
- Version: 1.0.14
3
+ Version: 1.0.24.dev20251109010128
4
4
  Summary: Kubernator is the a pluggable framework for K8S provisioning
5
5
  Home-page: https://github.com/karellen/kubernator
6
6
  Author: Express Systems USA, Inc.
7
7
  Author-email:
8
8
  Maintainer: Karellen, Inc., Arcadiy Ivanov
9
9
  Maintainer-email: supervisor@karellen.co,arcadiy@karellen.co
10
- License: Apache License, Version 2.0
10
+ License: Apache-2.0
11
11
  Project-URL: Bug Tracker, https://github.com/karellen/kubernator/issues
12
12
  Project-URL: Documentation, https://github.com/karellen/kubernator/
13
13
  Project-URL: Source Code, https://github.com/karellen/kubernator/
14
14
  Keywords: kubernetes k8s kube top provisioning kOps terraform tf AWS
15
- Classifier: License :: OSI Approved :: Apache Software License
16
15
  Classifier: Programming Language :: Python :: 3.9
17
16
  Classifier: Programming Language :: Python :: 3.10
18
17
  Classifier: Programming Language :: Python :: 3.11
19
18
  Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
20
21
  Classifier: Operating System :: MacOS :: MacOS X
21
22
  Classifier: Operating System :: POSIX
22
23
  Classifier: Operating System :: POSIX :: Linux
@@ -31,19 +32,33 @@ Classifier: Intended Audience :: Developers
31
32
  Classifier: Development Status :: 4 - Beta
32
33
  Requires-Python: >=3.9
33
34
  Description-Content-Type: text/markdown
34
- Requires-Dist: appdirs ~=1.4
35
- Requires-Dist: coloredlogs ~=15.0
36
- Requires-Dist: diff-match-patch >2023.0
37
- Requires-Dist: gevent >=21.1.2
38
- Requires-Dist: jinja2 ~=3.1
39
- Requires-Dist: json-log-formatter ~=0.3
40
- Requires-Dist: jsonpatch ~=1.32
41
- Requires-Dist: jsonpath-ng ~=1.6.1
42
- Requires-Dist: jsonschema <4.0
43
- Requires-Dist: kubernetes ~=29.0
44
- Requires-Dist: openapi-schema-validator ~=0.1
45
- Requires-Dist: openapi-spec-validator ~=0.3
46
- Requires-Dist: requests ~=2.25
35
+ Requires-Dist: coloredlogs~=15.0
36
+ Requires-Dist: diff-match-patch>2023.0
37
+ Requires-Dist: durationpy>=0.7
38
+ Requires-Dist: gevent>=21.1.2
39
+ Requires-Dist: jinja2~=3.1
40
+ Requires-Dist: json-log-formatter~=0.3
41
+ Requires-Dist: jsonpatch~=1.33
42
+ Requires-Dist: jsonpath-ng~=1.7.0
43
+ Requires-Dist: jsonschema~=4.23
44
+ Requires-Dist: kubernetes~=32.0
45
+ Requires-Dist: openapi-schema-validator~=0.1
46
+ Requires-Dist: openapi-spec-validator~=0.3
47
+ Requires-Dist: platformdirs~=4.2
48
+ Requires-Dist: requests>=2.31.0
49
+ Dynamic: author
50
+ Dynamic: classifier
51
+ Dynamic: description
52
+ Dynamic: description-content-type
53
+ Dynamic: home-page
54
+ Dynamic: keywords
55
+ Dynamic: license
56
+ Dynamic: maintainer
57
+ Dynamic: maintainer-email
58
+ Dynamic: project-url
59
+ Dynamic: requires-dist
60
+ Dynamic: requires-python
61
+ Dynamic: summary
47
62
 
48
63
  # Kubernator
49
64
 
@@ -0,0 +1,31 @@
1
+ kubernator/LICENSE,sha256=wKKdOCMTCPQRV5gDkVLAsXX8qSnRJ5owk7yWPO1KZNo,11387
2
+ kubernator/__init__.py,sha256=6ZQDZlzA65nqVQqVV-dQHp6yy2a8ZEFUX7rV2KaenYk,933
3
+ kubernator/__main__.py,sha256=f0S60wgpLu--1UlOhzfWail-xt8zyIuODodX98_yPN0,707
4
+ kubernator/_json_path.py,sha256=pjQKXxgbpQWETYBIrIuJZHgugF92IbEAM19AC7JUmAQ,3162
5
+ kubernator/_k8s_client_patches.py,sha256=PEeWPInnW38NDyK7G24_Dmw-x7xHpN3vJWZeckdqgK0,76892
6
+ kubernator/api.py,sha256=LaiE8VhoqU-jHWT6G1DnBkzC9OvrkcDiLS8jiDhIGIg,31441
7
+ kubernator/app.py,sha256=ETgysPcIKEDsMTbdIw00-enSLip7Z2cECJrRxjf9ciw,21214
8
+ kubernator/merge.py,sha256=eW5fajnDdI2n8aUqRfTmdG6GWDvDtcVKPKsp3fiB5Nk,5882
9
+ kubernator/proc.py,sha256=43jrpTe1FCdhDIK0b6hnB6XqU_m7iYu3wbzJyzO3pl0,5979
10
+ kubernator/plugins/__init__.py,sha256=h9TLYK8UFEi53ipZSZsTBjp0ljKhisWsgPpt_PkWrO8,670
11
+ kubernator/plugins/awscli.py,sha256=S6X7-qFiaZ7NDVDl2Jg0t-ih9KAJ45cUjjzd5Qe93ZM,4252
12
+ kubernator/plugins/eks.py,sha256=xe7vyPHNwuP8gEYDSzPyBkm-RkAtP64wCOqs9U5I7xI,2273
13
+ kubernator/plugins/gke.py,sha256=HZc-Bu2W8MvF50EgoAcZ8W-CAVEWJ4y8f4yG_3s8C1w,3429
14
+ kubernator/plugins/helm.py,sha256=3y1Wr7v-Dn1twro4j2OpVFZOEXdhQmlXP9qL1l7L5kg,15156
15
+ kubernator/plugins/istio.py,sha256=UFSBJo-I2x4F-ZO5WCSMpConOr_oYNZZb66DNOI_nME,15399
16
+ kubernator/plugins/k8s.py,sha256=Y9QSaRzX5BDE_-nmlwjHYgVOEZK4Zs_hvnJIZ8PxZyQ,28030
17
+ kubernator/plugins/k8s_api.py,sha256=dP4W8AFgH6mTvsbwd10EGfmG55wG3E0SZ7RGQpDgpdw,27897
18
+ kubernator/plugins/kops.py,sha256=-yhpEjydz9E7Ep24WtEs93rLTXtw4yakdgVqXlIj1ww,9688
19
+ kubernator/plugins/kubeconfig.py,sha256=uwtHmF2I6LiTPrC3M88G5SfYxDWtuh0MqcMfrHHoNRA,2178
20
+ kubernator/plugins/kubectl.py,sha256=kz2BKJrg0M2yRJ4Tug9rZgjSEURbT5ybVx4fScDZt58,5102
21
+ kubernator/plugins/minikube.py,sha256=zbboER1VsCvIsh-yUE3_XpzPNcT4c6vh1LigDonEm3U,12384
22
+ kubernator/plugins/template.py,sha256=542nyS4ZNgdwJHEoIA5aLP1d4C312ydd7sPM9ZFbHuI,8357
23
+ kubernator/plugins/terraform.py,sha256=a1MPl9G8Rznjd28uMRdYWrjpFDLlFAVmLFH4hFEsMsQ,5285
24
+ kubernator/plugins/terragrunt.py,sha256=-qN8tTqPUXJ9O7CEiJVUB0GSUQU3DUTkv-aWdIIsm7Q,5051
25
+ kubernator-1.0.24.dev20251109010128.dist-info/METADATA,sha256=zYKRkX29fX8D5DNRZg5OmWpD0wVsmV8APYHFDoioTxg,10840
26
+ kubernator-1.0.24.dev20251109010128.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
+ kubernator-1.0.24.dev20251109010128.dist-info/entry_points.txt,sha256=IWDtHzyTleRqDSuVRXEr5GImrI7z_kh21t5DWZ8ldcQ,47
28
+ kubernator-1.0.24.dev20251109010128.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
29
+ kubernator-1.0.24.dev20251109010128.dist-info/top_level.txt,sha256=_z1CxWeKMI55ckf2vC8HqjbCn_E2Y_P5RdrhE_QWcIs,11
30
+ kubernator-1.0.24.dev20251109010128.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
31
+ kubernator-1.0.24.dev20251109010128.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,30 +0,0 @@
1
- kubernator/LICENSE,sha256=wKKdOCMTCPQRV5gDkVLAsXX8qSnRJ5owk7yWPO1KZNo,11387
2
- kubernator/__init__.py,sha256=dbzk7sCGIv4bkLEUq_3zNacruzzs7fFbdNAza9DnRoE,915
3
- kubernator/__main__.py,sha256=f0S60wgpLu--1UlOhzfWail-xt8zyIuODodX98_yPN0,707
4
- kubernator/_json_path.py,sha256=pjQKXxgbpQWETYBIrIuJZHgugF92IbEAM19AC7JUmAQ,3162
5
- kubernator/_k8s_client_patches.py,sha256=PEeWPInnW38NDyK7G24_Dmw-x7xHpN3vJWZeckdqgK0,76892
6
- kubernator/api.py,sha256=O1wJ2K_u8CoFDMzSood5_VkP4L1Hmo4VWQQxn9D1T4A,26648
7
- kubernator/app.py,sha256=FQVWQydYPendvI6n5yJjacrD6DN85ex_4-d0Enb1xLg,20496
8
- kubernator/merge.py,sha256=eW5fajnDdI2n8aUqRfTmdG6GWDvDtcVKPKsp3fiB5Nk,5882
9
- kubernator/proc.py,sha256=8YlgbppyHic_51fVTPD7OP8x5yuRuL8j1kThR8MJjNI,5119
10
- kubernator/plugins/__init__.py,sha256=h9TLYK8UFEi53ipZSZsTBjp0ljKhisWsgPpt_PkWrO8,670
11
- kubernator/plugins/awscli.py,sha256=S6X7-qFiaZ7NDVDl2Jg0t-ih9KAJ45cUjjzd5Qe93ZM,4252
12
- kubernator/plugins/eks.py,sha256=xe7vyPHNwuP8gEYDSzPyBkm-RkAtP64wCOqs9U5I7xI,2273
13
- kubernator/plugins/helm.py,sha256=3BYZBPoiMUtNgmhdcbYCVRTPtaQMYzhfnMqXWyZRJZc,10525
14
- kubernator/plugins/istio.py,sha256=hD-VCNVGELt7cGFbE7S7dTiqKE7rfhzE8qA9X5tsllE,10532
15
- kubernator/plugins/k8s.py,sha256=w_Uw8tvbeGgJ35jZs6BahWkVIlX6gxcX5-bOskudIfw,23387
16
- kubernator/plugins/k8s_api.py,sha256=w2aB7CU0rPqRgzhI5mLMJUUSpWlJGCsX_bHl4SjfzM8,27594
17
- kubernator/plugins/kops.py,sha256=QsrQJUF6wGJo2QRVqP92pG5vmOTYQIc25PD_DWCzrAA,9635
18
- kubernator/plugins/kubeconfig.py,sha256=uwtHmF2I6LiTPrC3M88G5SfYxDWtuh0MqcMfrHHoNRA,2178
19
- kubernator/plugins/kubectl.py,sha256=IgNghW1Q6s8V2o08eNY2NWfkkdV9Z6X2A3YFQinFr4g,4028
20
- kubernator/plugins/minikube.py,sha256=kWPDIS4X1JnEoXw_rIOvgvFtjJMch39uL0mD7gQwtjE,10162
21
- kubernator/plugins/template.py,sha256=KEiPfI7TbYXmF4a8ATWuFhxxWbcASHttFM_ekYEZ8Ps,8371
22
- kubernator/plugins/terraform.py,sha256=a1MPl9G8Rznjd28uMRdYWrjpFDLlFAVmLFH4hFEsMsQ,5285
23
- kubernator/plugins/terragrunt.py,sha256=-qN8tTqPUXJ9O7CEiJVUB0GSUQU3DUTkv-aWdIIsm7Q,5051
24
- kubernator-1.0.14.dist-info/METADATA,sha256=Okk4ZOG_aAcheDnkoZBH5uM80bsoyUnVoq1QkO2X4UA,10496
25
- kubernator-1.0.14.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
26
- kubernator-1.0.14.dist-info/entry_points.txt,sha256=IWDtHzyTleRqDSuVRXEr5GImrI7z_kh21t5DWZ8ldcQ,47
27
- kubernator-1.0.14.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
28
- kubernator-1.0.14.dist-info/top_level.txt,sha256=_z1CxWeKMI55ckf2vC8HqjbCn_E2Y_P5RdrhE_QWcIs,11
29
- kubernator-1.0.14.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
30
- kubernator-1.0.14.dist-info/RECORD,,