kustomizer 0.1.1 → 0.1.6
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/lib/kustomize.rb +12 -8
- data/lib/kustomize/builtin_plugins/kustomizer.covalenthq.com/v1/test_generator.rb +15 -0
- data/lib/kustomize/builtin_plugins/kustomizer.covalenthq.com/v1/test_transformer.rb +15 -0
- data/lib/kustomize/emitter.rb +4 -0
- data/lib/kustomize/emitter/document_emitter/kustomization_document_emitter.rb +37 -14
- data/lib/kustomize/emitter/finalizer_emitter.rb +31 -0
- data/lib/kustomize/emitter/generator_plugins_emitter.rb +26 -0
- data/lib/kustomize/generator_plugin.rb +16 -0
- data/lib/kustomize/plugin.rb +30 -5
- data/lib/kustomize/plugin_manager.rb +31 -16
- data/lib/kustomize/plugin_registry.rb +39 -0
- data/lib/kustomize/session.rb +10 -7
- data/lib/kustomize/target_spec.rb +4 -4
- data/lib/kustomize/transform.rb +9 -1
- data/lib/kustomize/transform/fingerprint_suffix_transform.rb +57 -0
- data/lib/kustomize/transform/image_transform.rb +1 -1
- data/lib/kustomize/transform/json_6902_patch_transform.rb +1 -1
- data/lib/kustomize/transform/namespace_transform.rb +1 -1
- data/lib/kustomize/transform/purge_internal_annotations_transform.rb +31 -0
- data/lib/kustomize/transform/ref_fixup_transform.rb +59 -0
- data/lib/kustomize/transform/transformer_plugins_transform.rb +28 -0
- data/lib/kustomize/transformer_plugin.rb +16 -0
- data/lib/kustomize/version.rb +1 -1
- metadata +13 -4
- data/lib/kustomize/emitter/plugin_emitter.rb +0 -30
- data/lib/kustomize/transform/name_digest_autosuffix_transform.rb +0 -83
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4521fc26d8bce0f3a4d5e0a540157bc4db6471ee052870122147d7c4c08e304e
|
4
|
+
data.tar.gz: 1a4826b18c76af8e8171ca7a1d46175b73f53f231d457860d1dfc39535a75fee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e4ee25d6000af75bcd3062feea249af2f56a3245f6e341f0c85e4f3b7c6bed66803753ea5adbd45e377b2ee553039cc9ddbb09ef1bbcde70cc8c2256e5aa015
|
7
|
+
data.tar.gz: 7e3060f016cb2852e05cd564fef1093442fb68536babd435c5d0057b17aeaa3da726b0127bacf47eb5c83290e49494563d57e848a2249240ac33a1b59fc177cc
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
kustomizer (0.1.
|
4
|
+
kustomizer (0.1.6)
|
5
5
|
accessory (~> 0.1.9)
|
6
6
|
base32-multi
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
accessory (0.1.
|
11
|
+
accessory (0.1.10)
|
12
12
|
base32-multi (0.1.1)
|
13
13
|
diff-lcs (1.4.4)
|
14
14
|
rake (13.0.3)
|
@@ -35,4 +35,4 @@ DEPENDENCIES
|
|
35
35
|
rspec (~> 3.0)
|
36
36
|
|
37
37
|
BUNDLED WITH
|
38
|
-
2.2.
|
38
|
+
2.2.7
|
data/lib/kustomize.rb
CHANGED
@@ -5,18 +5,22 @@ require 'kustomize/session'
|
|
5
5
|
|
6
6
|
require 'kustomize/emitter/file_emitter'
|
7
7
|
require 'kustomize/emitter/directory_emitter'
|
8
|
+
require 'kustomize/emitter/finalizer_emitter'
|
8
9
|
require 'kustomize/emitter/document_emitter/kustomization_document_emitter'
|
9
10
|
|
10
11
|
module Kustomize
|
11
12
|
def self.load(rel_path_or_rc, session: Kustomize::Session.new, source_path: nil)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
base_emitter =
|
14
|
+
case rel_path_or_rc
|
15
|
+
when String, Pathname
|
16
|
+
load_path(rel_path_or_rc, session: session)
|
17
|
+
when Hash
|
18
|
+
load_doc(rel_path_or_rc, session: session, source_path: source_path)
|
19
|
+
else
|
20
|
+
raise ArgumentError, "must be a kustomization document or a path to one, instead got: #{rel_path_or_rc.inspect}"
|
21
|
+
end
|
22
|
+
|
23
|
+
Kustomize::Emitter::FinalizerEmitter.new(base_emitter)
|
20
24
|
end
|
21
25
|
|
22
26
|
def self.load_doc(rc, session: Kustomize::Session.new, source_path:)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'kustomize/generator_plugin'
|
2
|
+
|
3
|
+
module CovalentKustomizer; end
|
4
|
+
|
5
|
+
class CovalentKustomizer::TestGenerator < Kustomize::GeneratorPlugin
|
6
|
+
match_on api_version: 'kustomizer.covalenthq.com/v1'
|
7
|
+
|
8
|
+
def initialize(rc)
|
9
|
+
@docs = rc['emit'] || []
|
10
|
+
end
|
11
|
+
|
12
|
+
def emit
|
13
|
+
@docs
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'kustomize/transformer_plugin'
|
2
|
+
|
3
|
+
module CovalentKustomizer; end
|
4
|
+
|
5
|
+
class CovalentKustomizer::TestTransformer < Kustomize::TransformerPlugin
|
6
|
+
match_on api_version: 'kustomizer.covalenthq.com/v1'
|
7
|
+
|
8
|
+
def initialize(rc)
|
9
|
+
@insertions = rc['insert'] || {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def rewrite(rc)
|
13
|
+
rc.merge(@insertions)
|
14
|
+
end
|
15
|
+
end
|
data/lib/kustomize/emitter.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
require 'kustomize/emitter/document_emitter'
|
2
2
|
require 'kustomize/emitter/file_emitter'
|
3
3
|
require 'kustomize/emitter/directory_emitter'
|
4
|
-
require 'kustomize/emitter/
|
4
|
+
require 'kustomize/emitter/generator_plugins_emitter'
|
5
5
|
|
6
6
|
require 'kustomize/transform/json_6902_patch_transform'
|
7
7
|
require 'kustomize/transform/image_transform'
|
8
8
|
require 'kustomize/transform/namespace_transform'
|
9
|
-
require 'kustomize/transform/
|
9
|
+
require 'kustomize/transform/fingerprint_suffix_transform'
|
10
|
+
require 'kustomize/transform/ref_fixup_transform'
|
11
|
+
require 'kustomize/transform/purge_internal_annotations_transform'
|
12
|
+
require 'kustomize/transform/transformer_plugins_transform'
|
10
13
|
|
11
14
|
class Kustomize::Emitter::DocumentEmitter::KustomizationDocumentEmitter < Kustomize::Emitter::DocumentEmitter
|
12
15
|
def source_directory
|
@@ -20,18 +23,24 @@ class Kustomize::Emitter::DocumentEmitter::KustomizationDocumentEmitter < Kustom
|
|
20
23
|
(@doc['bases'] || []) +
|
21
24
|
(@doc['resources'] || [])
|
22
25
|
|
23
|
-
|
26
|
+
gen_plugin_pathspecs =
|
24
27
|
(@doc['generators'] || [])
|
25
28
|
|
26
29
|
input_emitters = rc_pathspecs.map do |rel_path|
|
27
30
|
build_input_emitter(rel_path)
|
28
31
|
end
|
29
32
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
gen_plugin_rc_emitters = gen_plugin_pathspecs.map do |rel_path|
|
34
|
+
build_input_emitter(rel_path)
|
35
|
+
end
|
36
|
+
|
37
|
+
unless gen_plugin_rc_emitters.empty?
|
38
|
+
gen_plugins_emitter = Kustomize::Emitter::GeneratorPluginsEmitter.new(
|
39
|
+
gen_plugin_rc_emitters,
|
33
40
|
session: @session
|
34
41
|
)
|
42
|
+
|
43
|
+
input_emitters.push(gen_plugins_emitter)
|
35
44
|
end
|
36
45
|
|
37
46
|
@input_emitters = input_emitters
|
@@ -66,6 +75,24 @@ class Kustomize::Emitter::DocumentEmitter::KustomizationDocumentEmitter < Kustom
|
|
66
75
|
end
|
67
76
|
end
|
68
77
|
|
78
|
+
def transformer_plugin_transforms
|
79
|
+
xformer_plugin_rc_emitters =
|
80
|
+
(@doc['transformers'] || []).map do |rel_path|
|
81
|
+
build_input_emitter(rel_path)
|
82
|
+
end
|
83
|
+
|
84
|
+
if xformer_plugin_rc_emitters.length > 0
|
85
|
+
xform = Kustomize::Transform::TransformerPluginsTransform.create(
|
86
|
+
xformer_plugin_rc_emitters,
|
87
|
+
session: @session
|
88
|
+
)
|
89
|
+
|
90
|
+
[xform]
|
91
|
+
else
|
92
|
+
[]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
69
96
|
def namespace_transforms
|
70
97
|
if new_ns = @doc['namespace']
|
71
98
|
[Kustomize::Transform::NamespaceTransform.create(new_ns)]
|
@@ -74,24 +101,20 @@ class Kustomize::Emitter::DocumentEmitter::KustomizationDocumentEmitter < Kustom
|
|
74
101
|
end
|
75
102
|
end
|
76
103
|
|
77
|
-
def name_digest_autosuffix_transforms
|
78
|
-
[Kustomize::Transform::NameDigestAutosuffixTransform.create(self)]
|
79
|
-
end
|
80
|
-
|
81
104
|
def transforms
|
82
105
|
return @transforms if @transforms
|
83
106
|
|
84
107
|
@transforms = [
|
85
108
|
self.namespace_transforms,
|
86
109
|
self.image_transforms,
|
87
|
-
self.
|
88
|
-
self.
|
110
|
+
self.json_6902_patch_transforms,
|
111
|
+
self.transformer_plugin_transforms
|
89
112
|
].flatten
|
90
113
|
end
|
91
114
|
|
92
115
|
def emit
|
93
|
-
self.input_resources
|
94
|
-
|
116
|
+
self.transforms.inject(self.input_resources) do |rcs, xform|
|
117
|
+
xform.rewrite_all(rcs)
|
95
118
|
end
|
96
119
|
end
|
97
120
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'kustomize/emitter'
|
2
|
+
|
3
|
+
require 'kustomize/transform/fingerprint_suffix_transform'
|
4
|
+
require 'kustomize/transform/ref_fixup_transform'
|
5
|
+
require 'kustomize/transform/purge_internal_annotations_transform'
|
6
|
+
|
7
|
+
class Kustomize::Emitter::FinalizerEmitter < Kustomize::Emitter
|
8
|
+
def initialize(input_emitter)
|
9
|
+
@input_emitter = input_emitter
|
10
|
+
end
|
11
|
+
|
12
|
+
def input_emitters
|
13
|
+
[@input_emitter]
|
14
|
+
end
|
15
|
+
|
16
|
+
def transforms
|
17
|
+
return @transforms if @transforms
|
18
|
+
|
19
|
+
@transforms = [
|
20
|
+
Kustomize::Transform::FingerprintSuffixTransform.instance,
|
21
|
+
Kustomize::Transform::RefFixupTransform.instance,
|
22
|
+
Kustomize::Transform::PurgeInternalAnnotationsTransform.instance
|
23
|
+
].flatten
|
24
|
+
end
|
25
|
+
|
26
|
+
def emit
|
27
|
+
self.transforms.inject(self.input_resources) do |rcs, xform|
|
28
|
+
xform.rewrite_all(rcs)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'kustomize/emitter'
|
2
|
+
|
3
|
+
class Kustomize::Emitter::GeneratorPluginsEmitter < Kustomize::Emitter
|
4
|
+
def initialize(plugin_rc_emitters, session:)
|
5
|
+
@session = session
|
6
|
+
@plugin_rc_emitters = plugin_rc_emitters
|
7
|
+
end
|
8
|
+
|
9
|
+
def plugin_rcs
|
10
|
+
@plugin_rc_emitters.flat_map(&:emit)
|
11
|
+
end
|
12
|
+
|
13
|
+
def plugin_instances
|
14
|
+
return @plugin_instances if @plugin_instances
|
15
|
+
|
16
|
+
@plugin_instances =
|
17
|
+
self.plugin_rcs.map do |rc|
|
18
|
+
plugin_klass = @session.plugin_manager.get(api_version: rc['apiVersion'], kind: rc['kind'])
|
19
|
+
plugin_klass.create(rc, session: @session)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def emit
|
24
|
+
self.plugin_instances.flat_map(&:emit)
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'kustomize/plugin'
|
2
|
+
|
3
|
+
class Kustomize::GeneratorPlugin < Kustomize::Plugin
|
4
|
+
def self.inherited(subklass)
|
5
|
+
reg = Kustomize::PluginRegistry.instance
|
6
|
+
reg.probe_queue.push(subklass)
|
7
|
+
end
|
8
|
+
|
9
|
+
def emit
|
10
|
+
[]
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_yaml_stream
|
14
|
+
self.emit.map(&:to_yaml).join("")
|
15
|
+
end
|
16
|
+
end
|
data/lib/kustomize/plugin.rb
CHANGED
@@ -1,11 +1,36 @@
|
|
1
|
-
|
1
|
+
require 'pathname'
|
2
2
|
|
3
3
|
class Kustomize::Plugin
|
4
|
-
def
|
5
|
-
|
4
|
+
def self.create(rc, session:)
|
5
|
+
inst = new(rc)
|
6
|
+
inst.session = session
|
7
|
+
inst
|
6
8
|
end
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
+
class << self
|
11
|
+
private :new
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :session
|
15
|
+
|
16
|
+
def self.match_on(kind: nil, api_version: nil)
|
17
|
+
if kind
|
18
|
+
@kustomize_plugin_match_kind = kind
|
19
|
+
end
|
20
|
+
|
21
|
+
if api_version
|
22
|
+
@kustomize_plugin_match_api_version = api_version
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.kustomize_plugin_match_kind
|
27
|
+
return @kustomize_plugin_match_kind if @kustomize_plugin_match_kind
|
28
|
+
self.name.split('::').last
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.kustomize_plugin_match_api_version
|
32
|
+
return @kustomize_plugin_match_api_version if @kustomize_plugin_match_api_version
|
33
|
+
api_dir = Pathname.new(__FILE__).parent
|
34
|
+
api_dir.relative_path_from(api_dir.parent.parent).to_s
|
10
35
|
end
|
11
36
|
end
|
@@ -1,31 +1,46 @@
|
|
1
|
-
require '
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
require 'kustomize/plugin_registry'
|
2
4
|
|
3
5
|
class Kustomize::PluginManager
|
4
6
|
def initialize(session:)
|
5
7
|
@session = session
|
6
|
-
@
|
8
|
+
@registry = Kustomize::PluginRegistry.instance
|
7
9
|
end
|
8
10
|
|
9
|
-
def get(api_version
|
10
|
-
|
11
|
-
|
12
|
-
return cached_inst if cached_inst
|
11
|
+
def get(api_version:, kind:)
|
12
|
+
plugin_klass = @registry.get(api_version: api_version, kind: kind)
|
13
|
+
return plugin_klass if plugin_klass
|
13
14
|
|
14
|
-
|
15
|
+
try_loading(api_version, kind)
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
private
|
19
|
+
def try_loading(api_version, kind)
|
20
|
+
rel_load_path = Pathname.new(api_version) / "#{underscore(kind)}.rb"
|
20
21
|
|
21
|
-
|
22
|
-
@session.
|
23
|
-
.map{ |prefix| prefix /
|
22
|
+
abs_load_path =
|
23
|
+
@session.effective_load_paths
|
24
|
+
.map{ |prefix| prefix / rel_load_path }
|
24
25
|
.find{ |f| f.file? }
|
25
26
|
|
26
|
-
raise
|
27
|
+
raise LoadError, "could not find kustomize plugin to load" unless abs_load_path
|
28
|
+
|
29
|
+
Kernel.require(abs_load_path)
|
30
|
+
|
31
|
+
plugin_klass = @registry.get(api_version: api_version, kind: kind)
|
32
|
+
|
33
|
+
raise LoadError, "#{abs_load_path} did not define expected plugin" unless plugin_klass
|
34
|
+
|
35
|
+
plugin_klass
|
36
|
+
end
|
27
37
|
|
28
|
-
|
29
|
-
|
38
|
+
private
|
39
|
+
def underscore(str)
|
40
|
+
str
|
41
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
42
|
+
.gsub(/([a-z\d])([A-Z])/,'\1_\2')
|
43
|
+
.tr("-", "_")
|
44
|
+
.downcase
|
30
45
|
end
|
31
46
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Kustomize; end
|
4
|
+
|
5
|
+
class Kustomize::PluginRegistry
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@klasses = {}
|
10
|
+
@probe_queue = []
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :probe_queue
|
14
|
+
|
15
|
+
def get(api_version:, kind:)
|
16
|
+
drain_probe_queue!
|
17
|
+
|
18
|
+
rc_target_id = make_rc_target_id(api_version, kind)
|
19
|
+
@klasses[rc_target_id]
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def drain_probe_queue!
|
24
|
+
return if @probe_queue.empty?
|
25
|
+
|
26
|
+
while plugin_klass = @probe_queue.shift
|
27
|
+
rc_target_id = make_rc_target_id(
|
28
|
+
plugin_klass.kustomize_plugin_match_api_version,
|
29
|
+
plugin_klass.kustomize_plugin_match_kind
|
30
|
+
)
|
31
|
+
@klasses[rc_target_id] = plugin_klass
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def make_rc_target_id(api_version, kind)
|
37
|
+
[api_version, kind].join('/').to_s.intern
|
38
|
+
end
|
39
|
+
end
|
data/lib/kustomize/session.rb
CHANGED
@@ -3,15 +3,18 @@ module Kustomize; end
|
|
3
3
|
require 'kustomize/plugin_manager'
|
4
4
|
|
5
5
|
class Kustomize::Session
|
6
|
-
def
|
7
|
-
|
6
|
+
def initialize(load_paths: [])
|
7
|
+
@load_paths = load_paths
|
8
8
|
@plugin_manager = Kustomize::PluginManager.new(session: self)
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
attr_reader :plugin_manager
|
12
|
+
|
13
|
+
def builtin_load_paths
|
14
|
+
[Pathname.new(__FILE__).expand_path.parent / 'builtin_plugins']
|
15
|
+
end
|
16
|
+
|
17
|
+
def effective_load_paths
|
18
|
+
@load_paths + self.builtin_load_paths
|
16
19
|
end
|
17
20
|
end
|
@@ -22,11 +22,11 @@ class Kustomize::TargetSpec
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def get_name(rc)
|
25
|
-
rc.dig('
|
25
|
+
rc.dig('metadata', 'name')
|
26
26
|
end
|
27
27
|
|
28
28
|
def get_namespace(rc)
|
29
|
-
rc.dig('
|
29
|
+
rc.dig('metadata', 'namespace') || 'default'
|
30
30
|
end
|
31
31
|
|
32
32
|
def match?(rc)
|
@@ -37,8 +37,8 @@ class Kustomize::TargetSpec
|
|
37
37
|
end
|
38
38
|
|
39
39
|
return false if @match_kind and (rc['kind'] != @match_kind)
|
40
|
-
return false if @match_name and get_name(
|
41
|
-
return false if @match_namespace and get_namespace(
|
40
|
+
return false if @match_name and get_name(rc) != @match_name
|
41
|
+
return false if @match_namespace and get_namespace(rc) != @match_namespace
|
42
42
|
|
43
43
|
true
|
44
44
|
end
|
data/lib/kustomize/transform.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'digest'
|
3
|
+
require 'set'
|
4
|
+
require 'singleton'
|
5
|
+
|
6
|
+
require 'accessory'
|
7
|
+
require 'digest/base32'
|
8
|
+
|
9
|
+
require 'kustomize/transform'
|
10
|
+
|
11
|
+
class Kustomize::Transform::FingerprintSuffixTransform < Kustomize::Transform
|
12
|
+
include Accessory
|
13
|
+
include Singleton
|
14
|
+
|
15
|
+
SUFFIX_JOINER = "-"
|
16
|
+
|
17
|
+
APPLICABLE_KINDS = Set[
|
18
|
+
'Secret',
|
19
|
+
'SealedSecret',
|
20
|
+
'ConfigMap'
|
21
|
+
]
|
22
|
+
|
23
|
+
NAME_LENS = Lens["metadata", "name"]
|
24
|
+
|
25
|
+
CONTENT_LENS_BY_KIND = {
|
26
|
+
"Secret" => Lens["data"],
|
27
|
+
"ConfigMap" => Lens["data"],
|
28
|
+
"SealedSecret" => Lens["spec", "encryptedData"]
|
29
|
+
}
|
30
|
+
|
31
|
+
FINGERPRINT_LENS = Lens['metadata', 'annotations', 'kustomizer.covalenthq.com/effective-fingerprint']
|
32
|
+
|
33
|
+
def rewrite(rc)
|
34
|
+
rc_kind = rc['kind']
|
35
|
+
return rc unless APPLICABLE_KINDS.member?(rc_kind)
|
36
|
+
|
37
|
+
FINGERPRINT_LENS.update_in(rc) do |orig_value|
|
38
|
+
next(:keep) if orig_value
|
39
|
+
|
40
|
+
content_part = CONTENT_LENS_BY_KIND[rc_kind].get_in(rc)
|
41
|
+
content_ser = content_part.to_json
|
42
|
+
fingerprint = Digest::SHA256.base32digest(content_ser, :zbase32)[0, 6]
|
43
|
+
|
44
|
+
[:set, fingerprint]
|
45
|
+
end
|
46
|
+
|
47
|
+
base_name = NAME_LENS.get_in(rc)
|
48
|
+
fingerprint = FINGERPRINT_LENS.get_in(rc)
|
49
|
+
|
50
|
+
NAME_LENS.update_in(rc) do |base_name|
|
51
|
+
suffixed_name = [base_name, fingerprint].join(SUFFIX_JOINER)
|
52
|
+
[:set, suffixed_name]
|
53
|
+
end
|
54
|
+
|
55
|
+
rc
|
56
|
+
end
|
57
|
+
end
|
@@ -27,7 +27,7 @@ class Kustomize::Transform::ImageTransform < Kustomize::Transform
|
|
27
27
|
"Deployment" => Lens["spec", "template", "spec", "containers", Access.all, "image"]
|
28
28
|
}
|
29
29
|
|
30
|
-
def
|
30
|
+
def rewrite(rc_doc)
|
31
31
|
lens = LENS_BY_KIND[rc_doc['kind']]
|
32
32
|
return rc_doc unless lens
|
33
33
|
|
@@ -44,7 +44,7 @@ class Kustomize::Transform::Json6902PatchTransform < Kustomize::Transform
|
|
44
44
|
attr_reader :target
|
45
45
|
attr_reader :patches
|
46
46
|
|
47
|
-
def
|
47
|
+
def rewrite(resource_doc)
|
48
48
|
if @target.match?(resource_doc)
|
49
49
|
@patches.inject(resource_doc){ |doc, patch| patch.apply(doc) }
|
50
50
|
else
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
require 'accessory'
|
4
|
+
|
5
|
+
require 'kustomize/transform'
|
6
|
+
|
7
|
+
class Kustomize::Transform::PurgeInternalAnnotationsTransform < Kustomize::Transform
|
8
|
+
include Accessory
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
ANNOTS_LENS = Lens['metadata', 'annotations']
|
12
|
+
|
13
|
+
INTERNAL_ANNOT_PATTERN = /^kustomizer\.covalenthq\.com\//
|
14
|
+
|
15
|
+
def rewrite(rc)
|
16
|
+
ANNOTS_LENS.update_in(rc) do |orig_annots|
|
17
|
+
next(:keep) unless orig_annots and orig_annots.length.nonzero?
|
18
|
+
|
19
|
+
new_annots =
|
20
|
+
orig_annots.reject{ |k, v| INTERNAL_ANNOT_PATTERN.match?(k) }
|
21
|
+
|
22
|
+
if new_annots.length == orig_annots.length
|
23
|
+
:keep
|
24
|
+
elsif new_annots.empty?
|
25
|
+
:pop
|
26
|
+
else
|
27
|
+
[:set, new_annots]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
require 'accessory'
|
4
|
+
|
5
|
+
require 'kustomize/transform'
|
6
|
+
|
7
|
+
class Kustomize::Transform::RefFixupTransform < Kustomize::Transform
|
8
|
+
include Accessory
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
SUFFIX_JOINER = "-"
|
12
|
+
|
13
|
+
NAME_LENS = Lens["metadata", "name"]
|
14
|
+
|
15
|
+
FINGERPRINT_LENS = Lens['metadata', 'annotations', 'kustomizer.covalenthq.com/effective-fingerprint']
|
16
|
+
|
17
|
+
POD_TEMPLATE_LENSES = [
|
18
|
+
Lens["spec", "template", "spec", "containers", Access.all, "envFrom", Access.all, "configMapRef", "name"],
|
19
|
+
Lens["spec", "template", "spec", "containers", Access.all, "env", Access.all, "valueFrom", "configMapKeyRef", "name"],
|
20
|
+
Lens["spec", "template", "spec", "volumes", Access.all, "configMap", "name"],
|
21
|
+
|
22
|
+
Lens["spec", "template", "spec", "containers", Access.all, "env", Access.all, "valueFrom", "secretKeyRef", "name"],
|
23
|
+
Lens["spec", "template", "spec", "volumes", Access.all, "secret", "name"],
|
24
|
+
Lens["spec", "template", "spec", "volumes", Access.all, "secret", "secretName"]
|
25
|
+
]
|
26
|
+
|
27
|
+
KEY_REF_LENSES_BY_KIND = {
|
28
|
+
"Deployment" => POD_TEMPLATE_LENSES,
|
29
|
+
"StatefulSet" => POD_TEMPLATE_LENSES,
|
30
|
+
"DaemonSet" => POD_TEMPLATE_LENSES
|
31
|
+
}
|
32
|
+
|
33
|
+
def rewrite_all(rcs)
|
34
|
+
ref_fixups =
|
35
|
+
rcs.flat_map do |rc|
|
36
|
+
fingerprint = FINGERPRINT_LENS.get_in(rc)
|
37
|
+
next([]) unless fingerprint
|
38
|
+
|
39
|
+
suffixed_name = NAME_LENS.get_in(rc)
|
40
|
+
base_name = suffixed_name.gsub(/-#{fingerprint}$/, '')
|
41
|
+
[[base_name, suffixed_name]]
|
42
|
+
end.to_h
|
43
|
+
|
44
|
+
rcs.map do |rc|
|
45
|
+
key_ref_lenses = KEY_REF_LENSES_BY_KIND[rc['kind']]
|
46
|
+
next(rc) unless key_ref_lenses
|
47
|
+
|
48
|
+
key_ref_lenses.inject(rc) do |doc, lens|
|
49
|
+
lens.update_in(doc) do |base_name|
|
50
|
+
if suffixed_name = ref_fixups[base_name]
|
51
|
+
[:set, suffixed_name]
|
52
|
+
else
|
53
|
+
:keep
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'kustomize/transform'
|
2
|
+
|
3
|
+
class Kustomize::Transform::TransformerPluginsTransform < Kustomize::Transform
|
4
|
+
def initialize(plugin_rc_emitters, session:)
|
5
|
+
@session = session
|
6
|
+
@plugin_rc_emitters = plugin_rc_emitters
|
7
|
+
end
|
8
|
+
|
9
|
+
def plugin_rcs
|
10
|
+
@plugin_rc_emitters.flat_map(&:emit)
|
11
|
+
end
|
12
|
+
|
13
|
+
def plugin_instances
|
14
|
+
return @plugin_instances if @plugin_instances
|
15
|
+
|
16
|
+
@plugin_instances =
|
17
|
+
self.plugin_rcs.map do |rc|
|
18
|
+
plugin_klass = @session.plugin_manager.get(api_version: rc['apiVersion'], kind: rc['kind'])
|
19
|
+
plugin_klass.create(rc, session: @session)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def rewrite_all(rcs)
|
24
|
+
self.plugin_instances.inject(rcs) do |docs, plugin_inst|
|
25
|
+
plugin_inst.rewrite_all(rcs)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'kustomize/plugin'
|
2
|
+
|
3
|
+
class Kustomize::TransformerPlugin < Kustomize::Plugin
|
4
|
+
def self.inherited(subklass)
|
5
|
+
reg = Kustomize::PluginRegistry.instance
|
6
|
+
reg.probe_queue.push(subklass)
|
7
|
+
end
|
8
|
+
|
9
|
+
def rewrite_all(rcs)
|
10
|
+
rcs.map{ |rc| rewrite(rc) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def rewrite(rc)
|
14
|
+
rc
|
15
|
+
end
|
16
|
+
end
|
data/lib/kustomize/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kustomizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Levi Aul
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: accessory
|
@@ -56,12 +56,16 @@ files:
|
|
56
56
|
- bin/setup
|
57
57
|
- kustomizer.gemspec
|
58
58
|
- lib/kustomize.rb
|
59
|
+
- lib/kustomize/builtin_plugins/kustomizer.covalenthq.com/v1/test_generator.rb
|
60
|
+
- lib/kustomize/builtin_plugins/kustomizer.covalenthq.com/v1/test_transformer.rb
|
59
61
|
- lib/kustomize/emitter.rb
|
60
62
|
- lib/kustomize/emitter/directory_emitter.rb
|
61
63
|
- lib/kustomize/emitter/document_emitter.rb
|
62
64
|
- lib/kustomize/emitter/document_emitter/kustomization_document_emitter.rb
|
63
65
|
- lib/kustomize/emitter/file_emitter.rb
|
64
|
-
- lib/kustomize/emitter/
|
66
|
+
- lib/kustomize/emitter/finalizer_emitter.rb
|
67
|
+
- lib/kustomize/emitter/generator_plugins_emitter.rb
|
68
|
+
- lib/kustomize/generator_plugin.rb
|
65
69
|
- lib/kustomize/json_6902_patch.rb
|
66
70
|
- lib/kustomize/json_6902_patch/add_op.rb
|
67
71
|
- lib/kustomize/json_6902_patch/gsub_op.rb
|
@@ -70,13 +74,18 @@ files:
|
|
70
74
|
- lib/kustomize/pathname_refinements.rb
|
71
75
|
- lib/kustomize/plugin.rb
|
72
76
|
- lib/kustomize/plugin_manager.rb
|
77
|
+
- lib/kustomize/plugin_registry.rb
|
73
78
|
- lib/kustomize/session.rb
|
74
79
|
- lib/kustomize/target_spec.rb
|
75
80
|
- lib/kustomize/transform.rb
|
81
|
+
- lib/kustomize/transform/fingerprint_suffix_transform.rb
|
76
82
|
- lib/kustomize/transform/image_transform.rb
|
77
83
|
- lib/kustomize/transform/json_6902_patch_transform.rb
|
78
|
-
- lib/kustomize/transform/name_digest_autosuffix_transform.rb
|
79
84
|
- lib/kustomize/transform/namespace_transform.rb
|
85
|
+
- lib/kustomize/transform/purge_internal_annotations_transform.rb
|
86
|
+
- lib/kustomize/transform/ref_fixup_transform.rb
|
87
|
+
- lib/kustomize/transform/transformer_plugins_transform.rb
|
88
|
+
- lib/kustomize/transformer_plugin.rb
|
80
89
|
- lib/kustomize/version.rb
|
81
90
|
homepage: https://github.com/tsutsu/kustomize
|
82
91
|
licenses:
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'kustomize/emitter'
|
2
|
-
|
3
|
-
class Kustomize::Emitter::PluginEmitter < Kustomize::Emitter
|
4
|
-
def initialize(input_emitter, session:)
|
5
|
-
@session = session
|
6
|
-
@input_emitter = input_emitter
|
7
|
-
end
|
8
|
-
|
9
|
-
def source_directory
|
10
|
-
@source_path.parent
|
11
|
-
end
|
12
|
-
|
13
|
-
def input_emitters
|
14
|
-
[@input_emitter]
|
15
|
-
end
|
16
|
-
|
17
|
-
def plugin_instances
|
18
|
-
return @plugin_instances if @plugin_instances
|
19
|
-
|
20
|
-
@plugin_instances =
|
21
|
-
self.input_resources.map do |rc|
|
22
|
-
plugin_klass = @session.plugin_manager.get(rc['apiVersion'], rc['kind'])
|
23
|
-
plugin_klass.new(rc)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def emit
|
28
|
-
self.plugin_instances.flat_map(&:emit)
|
29
|
-
end
|
30
|
-
end
|
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'digest'
|
3
|
-
require 'set'
|
4
|
-
|
5
|
-
require 'accessory'
|
6
|
-
require 'digest/base32'
|
7
|
-
|
8
|
-
require 'kustomize/transform'
|
9
|
-
require 'kustomize/emitter/document_emitter/kustomization_document_emitter'
|
10
|
-
|
11
|
-
class Kustomize::Transform::NameDigestAutosuffixTransform < Kustomize::Transform
|
12
|
-
include Accessory
|
13
|
-
|
14
|
-
SUFFIX_JOINER = "-"
|
15
|
-
|
16
|
-
def self.create(kustomize_doc)
|
17
|
-
raise ArgumentError unless kustomize_doc.kind_of?(Kustomize::Emitter::DocumentEmitter::KustomizationDocumentEmitter)
|
18
|
-
self.new(kustomize_doc)
|
19
|
-
end
|
20
|
-
|
21
|
-
def initialize(kustomize_doc)
|
22
|
-
@kustomize_doc = kustomize_doc
|
23
|
-
end
|
24
|
-
|
25
|
-
SECRET_KINDS = Set[
|
26
|
-
'Secret',
|
27
|
-
'SealedSecret'
|
28
|
-
]
|
29
|
-
|
30
|
-
def suffixes
|
31
|
-
return @suffixes if @suffixes
|
32
|
-
|
33
|
-
secret_docs =
|
34
|
-
@kustomize_doc.input_resources
|
35
|
-
.filter{ |rc| SECRET_KINDS.member?(rc['kind']) }
|
36
|
-
|
37
|
-
@suffixes =
|
38
|
-
secret_docs.map do |rc|
|
39
|
-
rc_kind = rc['kind']
|
40
|
-
|
41
|
-
secret_name = NAME_LENSES_BY_KIND[rc_kind].first.get_in(rc)
|
42
|
-
secret_content = CONTENT_LENSES_BY_KIND[rc_kind].get_in(rc)
|
43
|
-
content_hash_suffix = Digest::SHA256.base32digest(secret_content.to_json, :zbase32)[0, 8]
|
44
|
-
|
45
|
-
[secret_name, content_hash_suffix]
|
46
|
-
end.to_h
|
47
|
-
end
|
48
|
-
|
49
|
-
CONTENT_LENSES_BY_KIND = {
|
50
|
-
"Secret" => Lens["data"],
|
51
|
-
"SealedSecret" => Lens["spec", "encryptedData"]
|
52
|
-
}
|
53
|
-
|
54
|
-
NAME_LENSES_BY_KIND = {
|
55
|
-
"Deployment" => [
|
56
|
-
Lens["spec", "template", "spec", "containers", Access.all, "env", Access.all, "valueFrom", "secretKeyRef", "name"]
|
57
|
-
],
|
58
|
-
|
59
|
-
"Secret" => [
|
60
|
-
Lens["metadata", "name"]
|
61
|
-
],
|
62
|
-
|
63
|
-
"SealedSecret" => [
|
64
|
-
Lens["spec", "template", "metadata", "name"]
|
65
|
-
]
|
66
|
-
}
|
67
|
-
|
68
|
-
def apply(rc_doc)
|
69
|
-
name_lenses = NAME_LENSES_BY_KIND[rc_doc['kind']]
|
70
|
-
return rc_doc unless name_lenses
|
71
|
-
|
72
|
-
name_lenses.inject(rc_doc) do |doc, lens|
|
73
|
-
lens.update_in(doc) do |orig_name|
|
74
|
-
if self.suffixes.has_key?(orig_name)
|
75
|
-
new_name = [orig_name, self.suffixes[orig_name]].join('-')
|
76
|
-
[:set, new_name]
|
77
|
-
else
|
78
|
-
:keep
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|