kubernator 1.0.15__py3-none-any.whl → 1.0.16__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.
- kubernator/__init__.py +1 -1
- kubernator/api.py +10 -7
- kubernator/app.py +30 -23
- kubernator/plugins/k8s.py +38 -9
- {kubernator-1.0.15.dist-info → kubernator-1.0.16.dist-info}/METADATA +3 -3
- {kubernator-1.0.15.dist-info → kubernator-1.0.16.dist-info}/RECORD +11 -11
- {kubernator-1.0.15.dist-info → kubernator-1.0.16.dist-info}/WHEEL +0 -0
- {kubernator-1.0.15.dist-info → kubernator-1.0.16.dist-info}/entry_points.txt +0 -0
- {kubernator-1.0.15.dist-info → kubernator-1.0.16.dist-info}/namespace_packages.txt +0 -0
- {kubernator-1.0.15.dist-info → kubernator-1.0.16.dist-info}/top_level.txt +0 -0
- {kubernator-1.0.15.dist-info → kubernator-1.0.16.dist-info}/zip-safe +0 -0
kubernator/__init__.py
CHANGED
kubernator/api.py
CHANGED
|
@@ -38,7 +38,7 @@ from typing import Optional, Union, MutableSequence
|
|
|
38
38
|
|
|
39
39
|
import requests
|
|
40
40
|
import yaml
|
|
41
|
-
from
|
|
41
|
+
from platformdirs import user_cache_dir
|
|
42
42
|
from diff_match_patch import diff_match_patch
|
|
43
43
|
from jinja2 import (Environment,
|
|
44
44
|
ChainableUndefined,
|
|
@@ -118,17 +118,17 @@ def _download_remote_file(url, file_name, cache: dict):
|
|
|
118
118
|
|
|
119
119
|
|
|
120
120
|
def get_app_cache_dir():
|
|
121
|
-
return Path(
|
|
121
|
+
return Path(user_cache_dir("kubernator", "karellen"))
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
def get_cache_dir(category: str, sub_category: str = None):
|
|
125
|
-
|
|
125
|
+
cache_dir = get_app_cache_dir() / category
|
|
126
126
|
if sub_category:
|
|
127
|
-
|
|
128
|
-
if not
|
|
129
|
-
|
|
127
|
+
cache_dir = cache_dir / sub_category
|
|
128
|
+
if not cache_dir.exists():
|
|
129
|
+
cache_dir.mkdir(parents=True)
|
|
130
130
|
|
|
131
|
-
return
|
|
131
|
+
return cache_dir
|
|
132
132
|
|
|
133
133
|
|
|
134
134
|
def download_remote_file(logger, url: str, category: str = "k8s", sub_category: str = None,
|
|
@@ -747,6 +747,9 @@ class KubernatorPlugin:
|
|
|
747
747
|
def handle_shutdown(self):
|
|
748
748
|
pass
|
|
749
749
|
|
|
750
|
+
def handle_summary(self):
|
|
751
|
+
pass
|
|
752
|
+
|
|
750
753
|
|
|
751
754
|
def install_python_k8s_client(run, package_major, logger, logger_stdout, logger_stderr, disable_patching):
|
|
752
755
|
cache_dir = get_cache_dir("python")
|
kubernator/app.py
CHANGED
|
@@ -178,42 +178,49 @@ class App(KubernatorPlugin):
|
|
|
178
178
|
self.register_plugin(self)
|
|
179
179
|
|
|
180
180
|
try:
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
181
|
+
try:
|
|
182
|
+
while True:
|
|
183
|
+
cwd = self.next()
|
|
184
|
+
if not cwd:
|
|
185
|
+
logger.debug("No paths left to traverse")
|
|
186
|
+
break
|
|
186
187
|
|
|
187
|
-
|
|
188
|
+
context = self.context
|
|
188
189
|
|
|
189
|
-
|
|
190
|
-
|
|
190
|
+
logger.debug("Inspecting directory %s", self._display_path(cwd))
|
|
191
|
+
self._run_handlers(KubernatorPlugin.handle_before_dir, False, context, None, cwd)
|
|
191
192
|
|
|
192
|
-
|
|
193
|
-
|
|
193
|
+
if (ktor_py := (cwd / ".kubernator.py")).exists():
|
|
194
|
+
self._run_handlers(KubernatorPlugin.handle_before_script, False, context, None, cwd)
|
|
194
195
|
|
|
195
|
-
|
|
196
|
-
|
|
196
|
+
for h in self.context._plugins:
|
|
197
|
+
h.set_context(context)
|
|
197
198
|
|
|
198
|
-
|
|
199
|
+
self._exec_ktor(ktor_py)
|
|
199
200
|
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
for h in self.context._plugins:
|
|
202
|
+
h.set_context(None)
|
|
202
203
|
|
|
203
|
-
|
|
204
|
+
self._run_handlers(KubernatorPlugin.handle_after_script, True, context, None, cwd)
|
|
204
205
|
|
|
205
|
-
|
|
206
|
+
self._run_handlers(KubernatorPlugin.handle_after_dir, True, context, None, cwd)
|
|
206
207
|
|
|
207
|
-
|
|
208
|
-
|
|
208
|
+
self.context = self._top_dir_context
|
|
209
|
+
context = self.context
|
|
209
210
|
|
|
210
|
-
|
|
211
|
+
self._run_handlers(KubernatorPlugin.handle_apply, True, context, None)
|
|
211
212
|
|
|
212
|
-
|
|
213
|
-
|
|
213
|
+
self._run_handlers(KubernatorPlugin.handle_verify, True, context, None)
|
|
214
|
+
finally:
|
|
215
|
+
self.context = self._top_dir_context
|
|
216
|
+
context = self.context
|
|
217
|
+
self._run_handlers(KubernatorPlugin.handle_shutdown, True, context, None)
|
|
218
|
+
except: # noqa E722
|
|
219
|
+
raise
|
|
220
|
+
else:
|
|
214
221
|
self.context = self._top_dir_context
|
|
215
222
|
context = self.context
|
|
216
|
-
self._run_handlers(KubernatorPlugin.
|
|
223
|
+
self._run_handlers(KubernatorPlugin.handle_summary, True, context, None)
|
|
217
224
|
|
|
218
225
|
def discover_plugins(self):
|
|
219
226
|
importlib.invalidate_caches()
|
kubernator/plugins/k8s.py
CHANGED
|
@@ -68,6 +68,19 @@ def final_resource_validator(resources: Sequence[K8SResource],
|
|
|
68
68
|
resource, resource.source)
|
|
69
69
|
|
|
70
70
|
|
|
71
|
+
def normalize_pkg_version(v: str):
|
|
72
|
+
v_split = v.split(".")
|
|
73
|
+
rev = v_split[-1]
|
|
74
|
+
if not rev.isdigit():
|
|
75
|
+
new_rev = ""
|
|
76
|
+
for c in rev:
|
|
77
|
+
if not c.isdigit():
|
|
78
|
+
break
|
|
79
|
+
new_rev += c
|
|
80
|
+
v_split[-1] = new_rev
|
|
81
|
+
return tuple(map(int, v_split))
|
|
82
|
+
|
|
83
|
+
|
|
71
84
|
class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
72
85
|
logger = logger
|
|
73
86
|
|
|
@@ -81,6 +94,7 @@ class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
|
81
94
|
|
|
82
95
|
self._transformers = []
|
|
83
96
|
self._validators = []
|
|
97
|
+
self._summary = 0, 0, 0
|
|
84
98
|
|
|
85
99
|
def set_context(self, context):
|
|
86
100
|
self.context = context
|
|
@@ -192,7 +206,8 @@ class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
|
192
206
|
k8s.server_git_version = git_version
|
|
193
207
|
|
|
194
208
|
logger.info("Found Kubernetes %s on %s", k8s.server_git_version, k8s.client.configuration.host)
|
|
195
|
-
|
|
209
|
+
|
|
210
|
+
K8SResource._k8s_client_version = normalize_pkg_version(pkg_version("kubernetes"))
|
|
196
211
|
K8SResource._k8s_field_validation = k8s.field_validation
|
|
197
212
|
K8SResource._k8s_field_validation_patched = not k8s.disable_client_patches
|
|
198
213
|
K8SResource._logger = self.logger
|
|
@@ -248,6 +263,7 @@ class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
|
248
263
|
|
|
249
264
|
patch_field_excludes = [re.compile(e) for e in context.globals.k8s.patch_field_excludes]
|
|
250
265
|
dump_results = []
|
|
266
|
+
total_created, total_patched, total_deleted = 0, 0, 0
|
|
251
267
|
for resource in self.resources.values():
|
|
252
268
|
if dump:
|
|
253
269
|
resource_id = {"apiVersion": resource.api_version,
|
|
@@ -280,13 +296,17 @@ class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
|
280
296
|
create_func = partial(resource.create, dry_run=dry_run)
|
|
281
297
|
delete_func = partial(resource.delete, dry_run=dry_run)
|
|
282
298
|
|
|
283
|
-
self._apply_resource(dry_run,
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
299
|
+
created, patched, deleted = self._apply_resource(dry_run,
|
|
300
|
+
patch_field_excludes,
|
|
301
|
+
resource,
|
|
302
|
+
patch_func,
|
|
303
|
+
create_func,
|
|
304
|
+
delete_func,
|
|
305
|
+
status_msg)
|
|
306
|
+
|
|
307
|
+
total_created += created
|
|
308
|
+
total_patched += patched
|
|
309
|
+
total_deleted += deleted
|
|
290
310
|
|
|
291
311
|
if ((dump or dry_run) and
|
|
292
312
|
k8s.field_validation_warn_fatal and self.context.globals.k8s.field_validation_warnings):
|
|
@@ -301,6 +321,12 @@ class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
|
301
321
|
indent=4 if file_format == "json-pretty" else None)
|
|
302
322
|
else:
|
|
303
323
|
yaml.safe_dump(dump_results, file)
|
|
324
|
+
else:
|
|
325
|
+
self._summary = total_created, total_patched, total_deleted
|
|
326
|
+
|
|
327
|
+
def handle_summary(self):
|
|
328
|
+
total_created, total_patched, total_deleted = self._summary
|
|
329
|
+
logger.info("Created %d, patched %d, deleted %d resources", total_created, total_patched, total_deleted)
|
|
304
330
|
|
|
305
331
|
def api_load_resources(self, path: Path, file_type: str):
|
|
306
332
|
return self.add_local_resources(path, FileType[file_type.upper()])
|
|
@@ -422,6 +448,7 @@ class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
|
422
448
|
if e.status == 404:
|
|
423
449
|
try:
|
|
424
450
|
create()
|
|
451
|
+
return 1, 0, 0
|
|
425
452
|
except ApiException as e:
|
|
426
453
|
if not handle_400_strict_validation_error(e):
|
|
427
454
|
raise
|
|
@@ -459,7 +486,7 @@ class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
|
459
486
|
status_msg)
|
|
460
487
|
delete_func(propagation_policy=propagation_policy)
|
|
461
488
|
create(exists_ok=dry_run)
|
|
462
|
-
return
|
|
489
|
+
return 1, 0, 1
|
|
463
490
|
raise
|
|
464
491
|
else:
|
|
465
492
|
if not handle_400_strict_validation_error(e):
|
|
@@ -476,8 +503,10 @@ class KubernetesPlugin(KubernatorPlugin, K8SResourcePluginMixin):
|
|
|
476
503
|
if patch:
|
|
477
504
|
logger.info("Patching resource %s%s", resource, status_msg)
|
|
478
505
|
patch_func(patch)
|
|
506
|
+
return 0, 1, 0
|
|
479
507
|
else:
|
|
480
508
|
logger.info("Nothing to patch for resource %s", resource)
|
|
509
|
+
return 0, 0, 0
|
|
481
510
|
|
|
482
511
|
def _filter_resource_patch(self, patch: Iterable[Mapping], excludes: Iterable[re.compile]):
|
|
483
512
|
result = []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: kubernator
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.16
|
|
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.
|
|
@@ -31,7 +31,6 @@ Classifier: Intended Audience :: Developers
|
|
|
31
31
|
Classifier: Development Status :: 4 - Beta
|
|
32
32
|
Requires-Python: >=3.9
|
|
33
33
|
Description-Content-Type: text/markdown
|
|
34
|
-
Requires-Dist: appdirs ~=1.4
|
|
35
34
|
Requires-Dist: coloredlogs ~=15.0
|
|
36
35
|
Requires-Dist: diff-match-patch >2023.0
|
|
37
36
|
Requires-Dist: gevent >=21.1.2
|
|
@@ -43,7 +42,8 @@ Requires-Dist: jsonschema <4.0
|
|
|
43
42
|
Requires-Dist: kubernetes ~=29.0
|
|
44
43
|
Requires-Dist: openapi-schema-validator ~=0.1
|
|
45
44
|
Requires-Dist: openapi-spec-validator ~=0.3
|
|
46
|
-
Requires-Dist:
|
|
45
|
+
Requires-Dist: platformdirs ~=4.2
|
|
46
|
+
Requires-Dist: requests <=2.31.0
|
|
47
47
|
|
|
48
48
|
# Kubernator
|
|
49
49
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
kubernator/LICENSE,sha256=wKKdOCMTCPQRV5gDkVLAsXX8qSnRJ5owk7yWPO1KZNo,11387
|
|
2
|
-
kubernator/__init__.py,sha256=
|
|
2
|
+
kubernator/__init__.py,sha256=kM163cxCijR8n3EdwY1rtDuVdXDxAw5Wl7TnvirO8cY,915
|
|
3
3
|
kubernator/__main__.py,sha256=f0S60wgpLu--1UlOhzfWail-xt8zyIuODodX98_yPN0,707
|
|
4
4
|
kubernator/_json_path.py,sha256=pjQKXxgbpQWETYBIrIuJZHgugF92IbEAM19AC7JUmAQ,3162
|
|
5
5
|
kubernator/_k8s_client_patches.py,sha256=PEeWPInnW38NDyK7G24_Dmw-x7xHpN3vJWZeckdqgK0,76892
|
|
6
|
-
kubernator/api.py,sha256=
|
|
7
|
-
kubernator/app.py,sha256=
|
|
6
|
+
kubernator/api.py,sha256=sW_ou7CCsi2buLBdQI0x8xYfLq2LVz-2lnAB9sELumA,26701
|
|
7
|
+
kubernator/app.py,sha256=ZtQm60Cb1z2SkD338B6nue3wLOo_auRqZRW5ou_-d84,20949
|
|
8
8
|
kubernator/merge.py,sha256=eW5fajnDdI2n8aUqRfTmdG6GWDvDtcVKPKsp3fiB5Nk,5882
|
|
9
9
|
kubernator/proc.py,sha256=8YlgbppyHic_51fVTPD7OP8x5yuRuL8j1kThR8MJjNI,5119
|
|
10
10
|
kubernator/plugins/__init__.py,sha256=h9TLYK8UFEi53ipZSZsTBjp0ljKhisWsgPpt_PkWrO8,670
|
|
@@ -12,7 +12,7 @@ kubernator/plugins/awscli.py,sha256=S6X7-qFiaZ7NDVDl2Jg0t-ih9KAJ45cUjjzd5Qe93ZM,
|
|
|
12
12
|
kubernator/plugins/eks.py,sha256=xe7vyPHNwuP8gEYDSzPyBkm-RkAtP64wCOqs9U5I7xI,2273
|
|
13
13
|
kubernator/plugins/helm.py,sha256=3BYZBPoiMUtNgmhdcbYCVRTPtaQMYzhfnMqXWyZRJZc,10525
|
|
14
14
|
kubernator/plugins/istio.py,sha256=hD-VCNVGELt7cGFbE7S7dTiqKE7rfhzE8qA9X5tsllE,10532
|
|
15
|
-
kubernator/plugins/k8s.py,sha256=
|
|
15
|
+
kubernator/plugins/k8s.py,sha256=Zj3q_bUmbOADfjSHy2X0BhgrbXuH-fM8Vq75sYFy0nE,24496
|
|
16
16
|
kubernator/plugins/k8s_api.py,sha256=w2aB7CU0rPqRgzhI5mLMJUUSpWlJGCsX_bHl4SjfzM8,27594
|
|
17
17
|
kubernator/plugins/kops.py,sha256=QsrQJUF6wGJo2QRVqP92pG5vmOTYQIc25PD_DWCzrAA,9635
|
|
18
18
|
kubernator/plugins/kubeconfig.py,sha256=uwtHmF2I6LiTPrC3M88G5SfYxDWtuh0MqcMfrHHoNRA,2178
|
|
@@ -21,10 +21,10 @@ kubernator/plugins/minikube.py,sha256=kWPDIS4X1JnEoXw_rIOvgvFtjJMch39uL0mD7gQwtj
|
|
|
21
21
|
kubernator/plugins/template.py,sha256=KEiPfI7TbYXmF4a8ATWuFhxxWbcASHttFM_ekYEZ8Ps,8371
|
|
22
22
|
kubernator/plugins/terraform.py,sha256=a1MPl9G8Rznjd28uMRdYWrjpFDLlFAVmLFH4hFEsMsQ,5285
|
|
23
23
|
kubernator/plugins/terragrunt.py,sha256=-qN8tTqPUXJ9O7CEiJVUB0GSUQU3DUTkv-aWdIIsm7Q,5051
|
|
24
|
-
kubernator-1.0.
|
|
25
|
-
kubernator-1.0.
|
|
26
|
-
kubernator-1.0.
|
|
27
|
-
kubernator-1.0.
|
|
28
|
-
kubernator-1.0.
|
|
29
|
-
kubernator-1.0.
|
|
30
|
-
kubernator-1.0.
|
|
24
|
+
kubernator-1.0.16.dist-info/METADATA,sha256=LlHz8k2lx4hnHKVULshjY7ZM--WxvecEkik7FNq5Pew,10503
|
|
25
|
+
kubernator-1.0.16.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
26
|
+
kubernator-1.0.16.dist-info/entry_points.txt,sha256=IWDtHzyTleRqDSuVRXEr5GImrI7z_kh21t5DWZ8ldcQ,47
|
|
27
|
+
kubernator-1.0.16.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
28
|
+
kubernator-1.0.16.dist-info/top_level.txt,sha256=_z1CxWeKMI55ckf2vC8HqjbCn_E2Y_P5RdrhE_QWcIs,11
|
|
29
|
+
kubernator-1.0.16.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
30
|
+
kubernator-1.0.16.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|