kubes 0.3.5 → 0.4.4
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/CHANGELOG.md +29 -0
- data/README.md +6 -5
- data/docs/_docs/config/args.md +10 -0
- data/docs/_docs/config/args/docker.md +19 -0
- data/docs/_docs/config/{kubectl/args.md → args/kubectl.md} +2 -0
- data/docs/_docs/config/docker.md +4 -40
- data/docs/_docs/config/hooks.md +10 -0
- data/docs/_docs/config/hooks/docker.md +70 -0
- data/docs/_docs/config/hooks/kubectl.md +83 -0
- data/docs/_docs/config/hooks/kubes.md +67 -0
- data/docs/_docs/config/hooks/ruby.md +76 -0
- data/docs/_docs/config/kubectl.md +2 -2
- data/docs/_docs/config/reference.md +20 -0
- data/docs/_docs/config/skip.md +58 -0
- data/docs/_docs/dsl/resources.md +1 -1
- data/docs/_docs/helpers.md +3 -2
- data/docs/_docs/intro.md +3 -1
- data/docs/_docs/learn/dsl/review-project.md +4 -2
- data/docs/_docs/learn/yaml/review-project.md +4 -2
- data/docs/_docs/patterns.md +4 -1
- data/docs/_docs/patterns/clock-web-worker.md +2 -0
- data/docs/_docs/patterns/migrations.md +123 -0
- data/docs/_docs/patterns/secrets.md +82 -0
- data/docs/_includes/config/hooks/options.md +20 -0
- data/docs/_includes/layering/layers.md +1 -1
- data/docs/_includes/sidebar.html +28 -13
- data/docs/_sass/theme.scss +25 -1
- data/kubes.gemspec +3 -0
- data/lib/kubes.rb +4 -1
- data/lib/kubes/cli.rb +20 -5
- data/lib/kubes/cli/apply.rb +2 -1
- data/lib/kubes/cli/base.rb +11 -0
- data/lib/kubes/cli/compile.rb +8 -0
- data/lib/kubes/cli/delete.rb +1 -1
- data/lib/kubes/cli/exec.rb +37 -6
- data/lib/kubes/cli/get.rb +1 -1
- data/lib/kubes/cli/init.rb +7 -2
- data/lib/kubes/cli/logs.rb +27 -3
- data/lib/kubes/cli/prune.rb +95 -0
- data/lib/kubes/compiler.rb +11 -7
- data/lib/kubes/compiler/decorator/base.rb +7 -1
- data/lib/kubes/compiler/decorator/{resources/secret.rb → hashable.rb} +5 -4
- data/lib/kubes/compiler/decorator/hashable/field.rb +53 -0
- data/lib/kubes/compiler/decorator/hashable/storage.rb +19 -0
- data/lib/kubes/compiler/decorator/post.rb +77 -0
- data/lib/kubes/compiler/decorator/pre.rb +12 -0
- data/lib/kubes/compiler/shared/helpers.rb +7 -2
- data/lib/kubes/compiler/strategy.rb +2 -2
- data/lib/kubes/compiler/strategy/base.rb +2 -3
- data/lib/kubes/compiler/strategy/dsl.rb +2 -2
- data/lib/kubes/compiler/strategy/erb.rb +8 -1
- data/lib/kubes/compiler/strategy/erb/yaml_error.rb +60 -0
- data/lib/kubes/compiler/strategy/result.rb +4 -6
- data/lib/kubes/compiler/util/normalize.rb +1 -1
- data/lib/kubes/compiler/util/save_file.rb +8 -0
- data/lib/kubes/config.rb +16 -11
- data/lib/kubes/docker/strategy/build/docker.rb +1 -1
- data/lib/kubes/docker/strategy/build/gcloud.rb +1 -1
- data/lib/kubes/docker/strategy/image_name.rb +1 -1
- data/lib/kubes/docker/strategy/push/docker.rb +1 -1
- data/lib/kubes/docker/strategy/push/gcloud.rb +1 -1
- data/lib/kubes/docker/strategy/utils.rb +1 -1
- data/lib/kubes/hooks/builder.rb +29 -15
- data/lib/kubes/hooks/concern.rb +10 -0
- data/lib/kubes/hooks/dsl.rb +2 -1
- data/lib/kubes/hooks/runner.rb +22 -0
- data/lib/kubes/kubectl.rb +21 -18
- data/lib/kubes/kubectl/batch.rb +8 -5
- data/lib/kubes/kubectl/{decider.rb → dispatcher.rb} +1 -1
- data/lib/kubes/kubectl/fetch/base.rb +12 -9
- data/lib/kubes/kubectl/fetch/deployment.rb +12 -13
- data/lib/kubes/kubectl/fetch/pods.rb +4 -15
- data/lib/kubes/kubectl/kustomize.rb +1 -1
- data/lib/kubes/kubectl/ordering.rb +12 -0
- data/lib/kubes/util/consider.rb +2 -1
- data/lib/kubes/util/sh.rb +1 -1
- data/lib/kubes/version.rb +1 -1
- data/spec/fixtures/decorators/deployment/both/envFrom.yaml +31 -0
- data/spec/fixtures/decorators/deployment/both/valueFrom.yaml +33 -0
- data/spec/fixtures/decorators/deployment/both/volumes.yaml +40 -0
- data/spec/fixtures/prune/capture.yaml +57 -0
- data/spec/fixtures/prune/fetch_items.yaml +268 -0
- data/spec/kubes/cli/prune_spec.rb +38 -0
- data/spec/kubes/compiler/decorator/{resources → post}/deployment_spec.rb +52 -6
- data/spec/kubes/compiler/decorator/{resources → post}/pod_spec.rb +2 -11
- metadata +56 -19
- data/docs/_docs/config/kubectl/hooks.md +0 -39
- data/lib/kubes/compiler/decorator.rb +0 -17
- data/lib/kubes/compiler/decorator/compile.rb +0 -12
- data/lib/kubes/compiler/decorator/resources/base.rb +0 -13
- data/lib/kubes/compiler/decorator/resources/container.rb +0 -76
- data/lib/kubes/compiler/decorator/resources/container/mapping.rb +0 -28
- data/lib/kubes/compiler/decorator/resources/deployment.rb +0 -10
- data/lib/kubes/compiler/decorator/resources/pod.rb +0 -10
- data/lib/kubes/compiler/decorator/write.rb +0 -14
- data/lib/kubes/docker/strategy/hooks.rb +0 -9
data/docs/_sass/theme.scss
CHANGED
|
@@ -290,4 +290,28 @@ ul.toc {
|
|
|
290
290
|
text-align: center;
|
|
291
291
|
padding: 20px;
|
|
292
292
|
}
|
|
293
|
-
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// https://coolestguidesontheplanet.com/videodrome/youtube/
|
|
296
|
+
// I added another box wrapper to control the width
|
|
297
|
+
.video-box {
|
|
298
|
+
max-width: 600px;
|
|
299
|
+
text-align: left;
|
|
300
|
+
margin: 0 auto 0 0;
|
|
301
|
+
padding-bottom: 20px;
|
|
302
|
+
.video-container {
|
|
303
|
+
position:relative;
|
|
304
|
+
padding-bottom:56.25%;
|
|
305
|
+
padding-top:30px;
|
|
306
|
+
height:0;
|
|
307
|
+
overflow:hidden;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.video-container iframe, .video-container object, .video-container embed {
|
|
311
|
+
position:absolute;
|
|
312
|
+
top:0;
|
|
313
|
+
left:0;
|
|
314
|
+
width:100%;
|
|
315
|
+
height:100%;
|
|
316
|
+
}
|
|
317
|
+
}
|
data/kubes.gemspec
CHANGED
|
@@ -28,6 +28,9 @@ Gem::Specification.new do |spec|
|
|
|
28
28
|
spec.add_dependency "thor"
|
|
29
29
|
spec.add_dependency "zeitwerk"
|
|
30
30
|
|
|
31
|
+
# core helper libs
|
|
32
|
+
spec.add_dependency "kubes_google"
|
|
33
|
+
|
|
31
34
|
spec.add_development_dependency "bundler"
|
|
32
35
|
spec.add_development_dependency "byebug"
|
|
33
36
|
spec.add_development_dependency "cli_markdown"
|
data/lib/kubes.rb
CHANGED
|
@@ -14,7 +14,10 @@ require "memoist"
|
|
|
14
14
|
require "rainbow/ext/string"
|
|
15
15
|
require "yaml"
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
# core helper libraries
|
|
18
|
+
require "kubes_google"
|
|
19
|
+
|
|
20
|
+
DslEvaluator.backtrace_reject = "lib/kubes"
|
|
18
21
|
|
|
19
22
|
require "kubes/autoloader"
|
|
20
23
|
Kubes::Autoloader.setup
|
data/lib/kubes/cli.rb
CHANGED
|
@@ -9,12 +9,18 @@ module Kubes
|
|
|
9
9
|
compile_option = Proc.new {
|
|
10
10
|
option :compile, type: :boolean, default: true, desc: "whether or not to compile the .kube/resources"
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
option :
|
|
12
|
+
pod_option = Proc.new {
|
|
13
|
+
option :pod, aliases: %w[p], desc: "pod to use. IE: web"
|
|
14
|
+
}
|
|
15
|
+
deployment_option = Proc.new {
|
|
16
|
+
option :deployment, aliases: %w[d], desc: "deployment name to use. IE: demo-web"
|
|
14
17
|
}
|
|
15
18
|
container_option = Proc.new {
|
|
16
19
|
option :container, aliases: %w[c], desc: "Container name. If omitted, the first container in the pod will be chosen"
|
|
17
20
|
}
|
|
21
|
+
yes_option = Proc.new {
|
|
22
|
+
option :yes, aliases: %w[y], type: :boolean, desc: "Skip are you sure prompt"
|
|
23
|
+
}
|
|
18
24
|
|
|
19
25
|
desc "docker SUBCOMMAND", "Docker subcommands"
|
|
20
26
|
long_desc Help.text(:docker)
|
|
@@ -45,7 +51,7 @@ module Kubes
|
|
|
45
51
|
desc "delete [ROLE] [RESOURCE]", "Delete Kubernetes resources within the app folder"
|
|
46
52
|
long_desc Help.text(:delete)
|
|
47
53
|
image_option.call
|
|
48
|
-
|
|
54
|
+
yes_option.call
|
|
49
55
|
def delete(role=nil, resource=nil)
|
|
50
56
|
Delete.new(options.merge(role: role, resource: resource)).run
|
|
51
57
|
end
|
|
@@ -69,7 +75,8 @@ module Kubes
|
|
|
69
75
|
desc "exec", "Exec into the latest container from the deployment"
|
|
70
76
|
long_desc Help.text(:exec)
|
|
71
77
|
compile_option.call
|
|
72
|
-
|
|
78
|
+
pod_option.call
|
|
79
|
+
deployment_option.call
|
|
73
80
|
container_option.call
|
|
74
81
|
def exec(*cmd)
|
|
75
82
|
Exec.new(options.merge(cmd: cmd)).run
|
|
@@ -88,13 +95,21 @@ module Kubes
|
|
|
88
95
|
desc "logs", "logs from all deployment pods"
|
|
89
96
|
long_desc Help.text(:logs)
|
|
90
97
|
compile_option.call
|
|
91
|
-
|
|
98
|
+
pod_option.call
|
|
99
|
+
deployment_option.call
|
|
92
100
|
container_option.call
|
|
93
101
|
option :follow, aliases: %w[f], type: :boolean, default: true, desc: "Follow logs"
|
|
94
102
|
def logs(*cmd)
|
|
95
103
|
Logs.new(options.merge(cmd: cmd)).run
|
|
96
104
|
end
|
|
97
105
|
|
|
106
|
+
desc "prune", "Prune old resources like secret and config maps"
|
|
107
|
+
long_desc Help.text(:prune)
|
|
108
|
+
yes_option.call
|
|
109
|
+
def prune
|
|
110
|
+
Prune.new(options).run
|
|
111
|
+
end
|
|
112
|
+
|
|
98
113
|
long_desc Help.text(:init)
|
|
99
114
|
Init.options.each { |args| option(*args) }
|
|
100
115
|
register(Init, "init", "init", "Init project")
|
data/lib/kubes/cli/apply.rb
CHANGED
|
@@ -3,7 +3,8 @@ class Kubes::CLI
|
|
|
3
3
|
def run
|
|
4
4
|
compile
|
|
5
5
|
logger.info "Deploying kubes resources"
|
|
6
|
-
Kubes::Kubectl::
|
|
6
|
+
Kubes::Kubectl::Dispatcher.new(:apply, @options).run
|
|
7
|
+
Prune.new(@options.merge(yes: true, quiet: true)).run if Kubes.config.auto_prune # prune old secrets and config maps
|
|
7
8
|
end
|
|
8
9
|
end
|
|
9
10
|
end
|
data/lib/kubes/cli/base.rb
CHANGED
|
@@ -9,5 +9,16 @@ class Kubes::CLI
|
|
|
9
9
|
def compile
|
|
10
10
|
Compile.new(@options).run unless @options[:compile] == false
|
|
11
11
|
end
|
|
12
|
+
|
|
13
|
+
def pod_name
|
|
14
|
+
return unless @options[:pod]
|
|
15
|
+
|
|
16
|
+
pods = Kubes::Kubectl::Fetch::Pods.new(@options)
|
|
17
|
+
items = pods.fetch(:pod)
|
|
18
|
+
metas = items.map { |i| i['metadata'] }
|
|
19
|
+
metas.select! { |i| i['name'].include?(@options[:pod]) }
|
|
20
|
+
meta = metas.sort { i['creationTimestamp'] }.last
|
|
21
|
+
meta['name'] if meta
|
|
22
|
+
end
|
|
12
23
|
end
|
|
13
24
|
end
|
data/lib/kubes/cli/compile.rb
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
class Kubes::CLI
|
|
2
2
|
class Compile < Base
|
|
3
|
+
# Separate command like prune can call compile. Apply also calls Prune.
|
|
4
|
+
# Instead of moving Compile out of Prune, will use this class variable.
|
|
5
|
+
# In case we have other cases where compile is called in another area.
|
|
6
|
+
# We only want compiled to be called once so hooks only fire once.
|
|
7
|
+
# Done here so we don't clean and remove the .kubes/output folder.
|
|
8
|
+
@@compiled = false
|
|
3
9
|
def run
|
|
10
|
+
return if @@compiled
|
|
4
11
|
Clean.new(@options.merge(mute: true)).run
|
|
5
12
|
Kubes::Compiler.new(@options).run
|
|
13
|
+
@@compiled = true
|
|
6
14
|
end
|
|
7
15
|
end
|
|
8
16
|
end
|
data/lib/kubes/cli/delete.rb
CHANGED
data/lib/kubes/cli/exec.rb
CHANGED
|
@@ -1,15 +1,49 @@
|
|
|
1
1
|
class Kubes::CLI
|
|
2
2
|
class Exec < Base
|
|
3
|
+
extend Memoist
|
|
4
|
+
include Kubes::Logging
|
|
3
5
|
include Kubes::Util::Sh
|
|
4
6
|
|
|
5
7
|
def run
|
|
6
8
|
compile
|
|
7
|
-
|
|
9
|
+
pod = find_pod
|
|
8
10
|
|
|
11
|
+
unless pod
|
|
12
|
+
logger.info <<~EOL
|
|
13
|
+
Unable to find a pod to exec into. This means there was no deployment found.
|
|
14
|
+
You can also try using the -p option and specifying enough of the pod name. Example:
|
|
15
|
+
|
|
16
|
+
kubes exec -p web
|
|
17
|
+
|
|
18
|
+
EOL
|
|
19
|
+
exit 1
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
container = " -c #{@options[:container]}" unless @options[:container].nil?
|
|
23
|
+
cmd = @options[:cmd].empty? ? "bash" : @options[:cmd].join(' ')
|
|
24
|
+
sh("kubectl exec #{ns} -ti #{pod}#{container} -- #{cmd}")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def find_pod
|
|
28
|
+
pod_name || deployment_pod
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def ns
|
|
32
|
+
"-n #{metadata['namespace']}" if metadata
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def metadata
|
|
36
|
+
deployment = Kubes::Kubectl::Fetch::Deployment.new(@options)
|
|
37
|
+
deployment.metadata if deployment.found
|
|
38
|
+
end
|
|
39
|
+
memoize :metadata
|
|
40
|
+
|
|
41
|
+
def deployment_pod
|
|
42
|
+
return unless metadata
|
|
9
43
|
labels = metadata['labels'].map { |k,v| "#{k}=#{v}" }.join(',')
|
|
10
44
|
ns = metadata['namespace']
|
|
11
45
|
|
|
12
|
-
resp =
|
|
46
|
+
resp = sh_capture("kubectl get pod -l #{labels} -n #{ns} -o json")
|
|
13
47
|
data = JSON.load(resp)
|
|
14
48
|
pod = latest_pod(data['items'])
|
|
15
49
|
|
|
@@ -18,10 +52,7 @@ class Kubes::CLI
|
|
|
18
52
|
exit 1
|
|
19
53
|
end
|
|
20
54
|
|
|
21
|
-
|
|
22
|
-
container = " -c #{@options[:container]}" unless @options[:container].nil?
|
|
23
|
-
cmd = @options[:cmd].empty? ? "bash" : @options[:cmd].join(' ')
|
|
24
|
-
sh("kubectl exec -n #{ns} -ti #{name}#{container} -- #{cmd}")
|
|
55
|
+
pod['metadata']['name']
|
|
25
56
|
end
|
|
26
57
|
|
|
27
58
|
# get latest running pod
|
data/lib/kubes/cli/get.rb
CHANGED
data/lib/kubes/cli/init.rb
CHANGED
|
@@ -6,7 +6,7 @@ class Kubes::CLI
|
|
|
6
6
|
[:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
|
|
7
7
|
[:type, aliases: ["t"], default: "yaml", desc: "Type: dsl or yaml"],
|
|
8
8
|
[:repo, required: true, desc: "Docker repo name. Example: user/repo. Configures .kubes/config.rb"],
|
|
9
|
-
[:namespace, aliases: ["n"], desc: "Namespace to use, defaults to
|
|
9
|
+
[:namespace, aliases: ["n"], desc: "Namespace to use, defaults to APP-ENV. IE: demo-dev"],
|
|
10
10
|
]
|
|
11
11
|
end
|
|
12
12
|
|
|
@@ -19,7 +19,12 @@ class Kubes::CLI
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def namespace
|
|
22
|
-
@options[:namespace] ||
|
|
22
|
+
@options[:namespace] || default_namespace
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def default_namespace
|
|
26
|
+
env = @options[:type] == "yaml" ? '<%= Kubes.env %>' : '#{Kubes.env}'
|
|
27
|
+
"#{app}-#{env}"
|
|
23
28
|
end
|
|
24
29
|
|
|
25
30
|
def excludes
|
data/lib/kubes/cli/logs.rb
CHANGED
|
@@ -1,21 +1,45 @@
|
|
|
1
1
|
class Kubes::CLI
|
|
2
2
|
class Logs < Base
|
|
3
|
+
include Kubes::Logging
|
|
3
4
|
include Kubes::Util::Sh
|
|
4
5
|
|
|
5
6
|
def run
|
|
6
7
|
compile
|
|
8
|
+
sh("kubectl logs #{args}")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
def args
|
|
13
|
+
args = pod_name || deployment_args
|
|
14
|
+
|
|
15
|
+
unless args
|
|
16
|
+
logger.info <<~EOL
|
|
17
|
+
Unable to find a pod to show logs for. This means there was no deployment found.
|
|
18
|
+
You can also try using the -p option and specifying enough of the pod name. Example:
|
|
19
|
+
|
|
20
|
+
kubes logs -p web
|
|
21
|
+
|
|
22
|
+
EOL
|
|
23
|
+
exit 1
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
follow = " -f" if @options[:follow]
|
|
27
|
+
"#{args}#{follow}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def deployment_args
|
|
7
31
|
deployment = Kubes::Kubectl::Fetch::Deployment.new(@options)
|
|
8
32
|
metadata = deployment.metadata
|
|
33
|
+
return unless metadata
|
|
34
|
+
|
|
9
35
|
name = metadata['name']
|
|
10
36
|
ns = metadata['namespace']
|
|
11
37
|
|
|
12
|
-
follow = " -f" if @options[:follow]
|
|
13
38
|
container = container(deployment)
|
|
14
39
|
c = " -c #{container}" if container
|
|
15
|
-
|
|
40
|
+
"deployment/#{name} -n #{ns}#{c}"
|
|
16
41
|
end
|
|
17
42
|
|
|
18
|
-
private
|
|
19
43
|
def container(deployment)
|
|
20
44
|
container = @options[:container]
|
|
21
45
|
return container if container
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
class Kubes::CLI
|
|
2
|
+
class Prune < Base
|
|
3
|
+
KINDS = %w[ConfigMap Secret]
|
|
4
|
+
extend Memoist
|
|
5
|
+
include Kubes::Util::Sure
|
|
6
|
+
|
|
7
|
+
def run
|
|
8
|
+
return unless anything_to_prune?
|
|
9
|
+
logger.info "Pruning old resources: #{KINDS.join(', ')}"
|
|
10
|
+
|
|
11
|
+
perform(preview: true) unless @options[:yes]
|
|
12
|
+
sure?("This will prune/delete resources. Are you sure?")
|
|
13
|
+
perform(preview: false)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def fetcher
|
|
17
|
+
Kubes::Kubectl::Fetch::Base.new(@options)
|
|
18
|
+
end
|
|
19
|
+
memoize :fetcher
|
|
20
|
+
|
|
21
|
+
def namespace
|
|
22
|
+
fetcher.namespace
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def anything_to_prune?
|
|
26
|
+
items = []
|
|
27
|
+
return unless namespace
|
|
28
|
+
|
|
29
|
+
with_old_items { |i| items << i }
|
|
30
|
+
if items.empty?
|
|
31
|
+
logger.info("There are no old resources that need pruning.") unless @options[:quiet]
|
|
32
|
+
end
|
|
33
|
+
!items.empty?
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def perform(preview:)
|
|
37
|
+
with_old_items do |item|
|
|
38
|
+
prune(item, preview)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def with_old_items
|
|
43
|
+
items = get_all_items
|
|
44
|
+
items.each do |i|
|
|
45
|
+
next unless old?(i)
|
|
46
|
+
yield(i)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def old?(item)
|
|
51
|
+
name = item['metadata']['name']
|
|
52
|
+
kind = item['kind']
|
|
53
|
+
built = built_kinds[kind] || [] # IE: {"demo-secret"=>"ebd93b58dd"}
|
|
54
|
+
built.each do |original_name,hash|
|
|
55
|
+
return false unless name.include?(original_name)
|
|
56
|
+
current = "#{original_name}-#{hash}"
|
|
57
|
+
return false if name == current
|
|
58
|
+
# Spec cover the tricky regexp logic
|
|
59
|
+
regexp = Regexp.new("#{original_name}-\\w{10}$") # IE: # demo-secret-\w{10}$
|
|
60
|
+
return true if name.match(regexp)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
false
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def get_all_items
|
|
67
|
+
secrets = capture_items('secret')
|
|
68
|
+
config_maps = capture_items('configmap')
|
|
69
|
+
secrets + config_maps
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def capture_items(kind)
|
|
73
|
+
data = Kubes::Kubectl.capture("get #{kind} -o json -n #{namespace}")
|
|
74
|
+
data['items'] || []
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# IE: {"Secret"=>{"demo-secret"=>"ebd93b58dd"}}
|
|
78
|
+
def built_kinds
|
|
79
|
+
compile # compile so built kinds are in memory
|
|
80
|
+
Kubes::Compiler::Decorator::Hashable::Storage.md5s
|
|
81
|
+
end
|
|
82
|
+
memoize :built_kinds
|
|
83
|
+
|
|
84
|
+
def prune(item, preview=false)
|
|
85
|
+
kind = item['kind']
|
|
86
|
+
name = item['metadata']['name']
|
|
87
|
+
args = "delete #{kind} #{name} -n #{namespace}"
|
|
88
|
+
if preview
|
|
89
|
+
logger.info " kubectl #{args}"
|
|
90
|
+
else
|
|
91
|
+
Kubes::Kubectl.execute(args)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
data/lib/kubes/compiler.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
module Kubes
|
|
2
2
|
class Compiler
|
|
3
|
+
include Kubes::Hooks::Concern
|
|
3
4
|
include Kubes::Logging
|
|
4
5
|
include Kubes::Util::Consider
|
|
5
6
|
|
|
@@ -8,13 +9,16 @@ module Kubes
|
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def run
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
Kubes.config # trigger config load. So can set ENV['VAR'] in config/envs/dev.rb etc
|
|
13
|
+
run_hooks("kubes.rb", name: "compile") do
|
|
14
|
+
results = resources.map do |path|
|
|
15
|
+
strategy = Strategy.new(@options.merge(path: path))
|
|
16
|
+
strategy.compile
|
|
17
|
+
end.compact
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
results.each do |result|
|
|
20
|
+
write(result)
|
|
21
|
+
end
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
puts "Compiled .kubes/resources files to .kubes/output" if show_compiled_message?
|
|
@@ -49,7 +53,7 @@ module Kubes
|
|
|
49
53
|
end
|
|
50
54
|
|
|
51
55
|
def write(result)
|
|
52
|
-
result.
|
|
56
|
+
result.decorate!(:post)
|
|
53
57
|
filename, content = result.filename, result.content
|
|
54
58
|
dest = "#{Kubes.root}/.kubes/output/#{filename}"
|
|
55
59
|
|