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 CHANGED
@@ -16,7 +16,7 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- __version__ = "1.0.15"
19
+ __version__ = "1.0.16"
20
20
 
21
21
 
22
22
  def _main():
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 appdirs import user_config_dir
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(user_config_dir("kubernator"))
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
- config_dir = get_app_cache_dir() / category
125
+ cache_dir = get_app_cache_dir() / category
126
126
  if sub_category:
127
- config_dir = config_dir / sub_category
128
- if not config_dir.exists():
129
- config_dir.mkdir(parents=True)
127
+ cache_dir = cache_dir / sub_category
128
+ if not cache_dir.exists():
129
+ cache_dir.mkdir(parents=True)
130
130
 
131
- return config_dir
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
- while True:
182
- cwd = self.next()
183
- if not cwd:
184
- logger.debug("No paths left to traverse")
185
- break
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
- context = self.context
188
+ context = self.context
188
189
 
189
- logger.debug("Inspecting directory %s", self._display_path(cwd))
190
- self._run_handlers(KubernatorPlugin.handle_before_dir, False, context, None, cwd)
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
- if (ktor_py := (cwd / ".kubernator.py")).exists():
193
- self._run_handlers(KubernatorPlugin.handle_before_script, False, context, None, cwd)
193
+ if (ktor_py := (cwd / ".kubernator.py")).exists():
194
+ self._run_handlers(KubernatorPlugin.handle_before_script, False, context, None, cwd)
194
195
 
195
- for h in self.context._plugins:
196
- h.set_context(context)
196
+ for h in self.context._plugins:
197
+ h.set_context(context)
197
198
 
198
- self._exec_ktor(ktor_py)
199
+ self._exec_ktor(ktor_py)
199
200
 
200
- for h in self.context._plugins:
201
- h.set_context(None)
201
+ for h in self.context._plugins:
202
+ h.set_context(None)
202
203
 
203
- self._run_handlers(KubernatorPlugin.handle_after_script, True, context, None, cwd)
204
+ self._run_handlers(KubernatorPlugin.handle_after_script, True, context, None, cwd)
204
205
 
205
- self._run_handlers(KubernatorPlugin.handle_after_dir, True, context, None, cwd)
206
+ self._run_handlers(KubernatorPlugin.handle_after_dir, True, context, None, cwd)
206
207
 
207
- self.context = self._top_dir_context
208
- context = self.context
208
+ self.context = self._top_dir_context
209
+ context = self.context
209
210
 
210
- self._run_handlers(KubernatorPlugin.handle_apply, True, context, None)
211
+ self._run_handlers(KubernatorPlugin.handle_apply, True, context, None)
211
212
 
212
- self._run_handlers(KubernatorPlugin.handle_verify, True, context, None)
213
- finally:
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.handle_shutdown, True, context, None)
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
- K8SResource._k8s_client_version = tuple(map(int, pkg_version("kubernetes").split(".")))
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
- patch_field_excludes,
285
- resource,
286
- patch_func,
287
- create_func,
288
- delete_func,
289
- status_msg)
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.15
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: requests ~=2.25
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=4O0v8eOlw-yy8RhmTF4gZN-X6QzRItdYc7qeW_2dOms,915
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=O1wJ2K_u8CoFDMzSood5_VkP4L1Hmo4VWQQxn9D1T4A,26648
7
- kubernator/app.py,sha256=xY1zH3sGpEY0p542S7NZM4TszM5Oac658zZAJhCj8B8,20603
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=w_Uw8tvbeGgJ35jZs6BahWkVIlX6gxcX5-bOskudIfw,23387
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.15.dist-info/METADATA,sha256=soZKwIiDi46ShjpnJSH_9_Anu9hvbZUeUIDsIIMqOa8,10496
25
- kubernator-1.0.15.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
26
- kubernator-1.0.15.dist-info/entry_points.txt,sha256=IWDtHzyTleRqDSuVRXEr5GImrI7z_kh21t5DWZ8ldcQ,47
27
- kubernator-1.0.15.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
28
- kubernator-1.0.15.dist-info/top_level.txt,sha256=_z1CxWeKMI55ckf2vC8HqjbCn_E2Y_P5RdrhE_QWcIs,11
29
- kubernator-1.0.15.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
30
- kubernator-1.0.15.dist-info/RECORD,,
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,,