kubes 0.3.4 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -0
  3. data/README.md +6 -5
  4. data/docs/_docs/ci/cloudbuild.md +2 -0
  5. data/docs/_docs/config/args.md +10 -0
  6. data/docs/_docs/config/args/docker.md +19 -0
  7. data/docs/_docs/config/args/kubectl.md +19 -0
  8. data/docs/_docs/config/docker.md +4 -40
  9. data/docs/_docs/config/env.md +1 -1
  10. data/docs/_docs/config/hooks.md +10 -0
  11. data/docs/_docs/config/hooks/docker.md +70 -0
  12. data/docs/_docs/config/hooks/kubectl.md +83 -0
  13. data/docs/_docs/config/hooks/kubes.md +67 -0
  14. data/docs/_docs/config/hooks/ruby.md +76 -0
  15. data/docs/_docs/config/kubectl.md +3 -54
  16. data/docs/_docs/config/reference.md +20 -0
  17. data/docs/_docs/config/skip.md +58 -0
  18. data/docs/_docs/dsl/resources.md +1 -1
  19. data/docs/_docs/dsl/resources/backend_config.md +1 -1
  20. data/docs/_docs/helpers.md +3 -2
  21. data/docs/_docs/intro.md +6 -3
  22. data/docs/_docs/learn/dsl/review-project.md +4 -2
  23. data/docs/_docs/learn/yaml/review-project.md +4 -2
  24. data/docs/_docs/{auto-context.md → misc/auto-context.md} +0 -0
  25. data/docs/_docs/{kustomize.md → misc/kustomize.md} +0 -0
  26. data/docs/_docs/misc/separate-steps.md +21 -0
  27. data/docs/_docs/patterns.md +4 -1
  28. data/docs/_docs/patterns/clock-web-worker.md +2 -0
  29. data/docs/_docs/patterns/migrations.md +123 -0
  30. data/docs/_docs/patterns/secrets.md +82 -0
  31. data/docs/_includes/config/hooks/options.md +20 -0
  32. data/docs/_includes/sidebar.html +35 -11
  33. data/docs/_reference/kubes-exec.md +14 -6
  34. data/docs/_reference/kubes-init.md +1 -0
  35. data/docs/_reference/kubes-logs.md +1 -0
  36. data/docs/_sass/theme.scss +25 -1
  37. data/kubes.gemspec +3 -0
  38. data/lib/kubes.rb +3 -0
  39. data/lib/kubes/cli.rb +20 -5
  40. data/lib/kubes/cli/apply.rb +2 -1
  41. data/lib/kubes/cli/base.rb +11 -0
  42. data/lib/kubes/cli/compile.rb +8 -0
  43. data/lib/kubes/cli/delete.rb +1 -1
  44. data/lib/kubes/cli/exec.rb +37 -6
  45. data/lib/kubes/cli/get.rb +3 -2
  46. data/lib/kubes/cli/init.rb +7 -2
  47. data/lib/kubes/cli/logs.rb +27 -3
  48. data/lib/kubes/cli/prune.rb +95 -0
  49. data/lib/kubes/compiler.rb +11 -7
  50. data/lib/kubes/compiler/decorator/base.rb +7 -1
  51. data/lib/kubes/compiler/decorator/{resources/secret.rb → hashable.rb} +5 -4
  52. data/lib/kubes/compiler/decorator/hashable/field.rb +53 -0
  53. data/lib/kubes/compiler/decorator/hashable/storage.rb +19 -0
  54. data/lib/kubes/compiler/decorator/post.rb +77 -0
  55. data/lib/kubes/compiler/decorator/pre.rb +12 -0
  56. data/lib/kubes/compiler/shared/helpers.rb +7 -2
  57. data/lib/kubes/compiler/strategy.rb +2 -2
  58. data/lib/kubes/compiler/strategy/base.rb +1 -1
  59. data/lib/kubes/compiler/strategy/result.rb +4 -6
  60. data/lib/kubes/config.rb +16 -11
  61. data/lib/kubes/docker/strategy/build/docker.rb +1 -1
  62. data/lib/kubes/docker/strategy/build/gcloud.rb +1 -1
  63. data/lib/kubes/docker/strategy/image_name.rb +1 -1
  64. data/lib/kubes/docker/strategy/push/docker.rb +1 -1
  65. data/lib/kubes/docker/strategy/push/gcloud.rb +1 -1
  66. data/lib/kubes/docker/strategy/utils.rb +1 -1
  67. data/lib/kubes/hooks/builder.rb +29 -15
  68. data/lib/kubes/hooks/concern.rb +10 -0
  69. data/lib/kubes/hooks/dsl.rb +2 -1
  70. data/lib/kubes/hooks/runner.rb +22 -0
  71. data/lib/kubes/kubectl.rb +21 -18
  72. data/lib/kubes/kubectl/batch.rb +8 -5
  73. data/lib/kubes/kubectl/{decider.rb → dispatcher.rb} +1 -1
  74. data/lib/kubes/kubectl/fetch/base.rb +13 -10
  75. data/lib/kubes/kubectl/fetch/deployment.rb +12 -13
  76. data/lib/kubes/kubectl/fetch/pods.rb +4 -15
  77. data/lib/kubes/kubectl/kustomize.rb +1 -1
  78. data/lib/kubes/kubectl/ordering.rb +12 -0
  79. data/lib/kubes/util/consider.rb +2 -1
  80. data/lib/kubes/util/sh.rb +1 -1
  81. data/lib/kubes/version.rb +1 -1
  82. data/lib/templates/dsl/.kubes/resources/web/deployment.rb +1 -1
  83. data/lib/templates/yaml/.kubes/resources/web/deployment.yaml.tt +1 -1
  84. data/spec/fixtures/decorators/deployment/both/envFrom.yaml +31 -0
  85. data/spec/fixtures/decorators/deployment/both/valueFrom.yaml +33 -0
  86. data/spec/fixtures/decorators/deployment/both/volumes.yaml +40 -0
  87. data/spec/fixtures/prune/capture.yaml +57 -0
  88. data/spec/fixtures/prune/fetch_items.yaml +268 -0
  89. data/spec/kubes/cli/prune_spec.rb +38 -0
  90. data/spec/kubes/compiler/decorator/{resources → post}/deployment_spec.rb +52 -6
  91. data/spec/kubes/compiler/decorator/{resources → post}/pod_spec.rb +2 -11
  92. metadata +57 -19
  93. data/lib/kubes/compiler/decorator.rb +0 -17
  94. data/lib/kubes/compiler/decorator/compile.rb +0 -12
  95. data/lib/kubes/compiler/decorator/resources/base.rb +0 -13
  96. data/lib/kubes/compiler/decorator/resources/container.rb +0 -76
  97. data/lib/kubes/compiler/decorator/resources/container/mapping.rb +0 -28
  98. data/lib/kubes/compiler/decorator/resources/deployment.rb +0 -10
  99. data/lib/kubes/compiler/decorator/resources/pod.rb +0 -10
  100. data/lib/kubes/compiler/decorator/write.rb +0 -14
  101. data/lib/kubes/docker/strategy/hooks.rb +0 -9
@@ -0,0 +1,20 @@
1
+ ## General Form
2
+
3
+ ```ruby
4
+ before(COMMAND_NAME, OPTIONS)
5
+ ````
6
+
7
+ The command name corresponds to the `{{ include.command }}` commands: apply, delete, etc.
8
+
9
+ ## Hook Options
10
+
11
+ Name | Description
12
+ ---|---
13
+ label | A human-friendly label so you can see what hooks is being run.
14
+ execute | The script or command to run. IE: path/to/some/script.sh
15
+ exit_on_fail | Whether or not to continue process if the script returns an failed exit code.
16
+ {% if include.command == "kubectl" %}on | What resource to run the hook on. IE: shared/namespace, web/deployment, web/service. Note: This option is only used by kubectl hooks.{% endif %}
17
+
18
+ ## Ruby Hooks
19
+
20
+ Instead of using a script for the hook `execute` option, you can also use a Ruby object. This provides some more control over the current process. See: [Ruby Hooks]({% link _docs/config/hooks/ruby.md %})
@@ -53,13 +53,37 @@
53
53
  </li>
54
54
  <li><a href="{% link _docs/config.md %}">Config</a>
55
55
  <ul>
56
+ <li><a href="{% link _docs/config/args.md %}">Args</a>
57
+ <ul>
58
+ {% assign docs = site.docs | where: "categories","args" %}
59
+ {% for doc in docs -%}
60
+ <li><a href="{{ doc.url }}">{{ doc.nav_text }}</a></li>
61
+ {% endfor %}
62
+ </ul>
63
+ </li>
64
+ <li><a href="{% link _docs/config/hooks.md %}">Hooks</a>
65
+ <ul>
66
+ {% assign docs = site.docs | where: "categories","hooks" %}
67
+ {% for doc in docs -%}
68
+ <li><a href="{{ doc.url }}">{{ doc.nav_text }}</a></li>
69
+ {% endfor %}
70
+ </ul>
71
+ </li>
56
72
  <li><a href="{% link _docs/config/docker.md %}">Docker</a></li>
57
73
  <li><a href="{% link _docs/config/env.md %}">Env</a></li>
58
- <li><a href="{% link _docs/config/kubectl.md %}">Kubectl</a></li>
59
74
  <li><a href="{% link _docs/config/builder.md %}">Builder</a></li>
75
+ <li><a href="{% link _docs/config/skip.md %}">Skip Option</a></li>
76
+ <li><a href="{% link _docs/config/reference.md %}">Reference</a></li>
60
77
  </ul>
61
78
  </li>
62
79
  <li><a href="{% link _docs/yaml.md %}">YAML</a></li>
80
+ <li><a href="{% link _docs/layering.md %}">Layering</a>
81
+ <ul>
82
+ <li><a href="{% link _docs/layering/yaml.md %}">YAML</a></li>
83
+ <li><a href="{% link _docs/layering/dsl.md %}">DSL</a></li>
84
+ <li><a href="{% link _docs/layering/merge.md %}">Merge Behavior</a></li>
85
+ </ul>
86
+ </li>
63
87
  <li><a href="{% link _docs/dsl.md %}">DSL</a>
64
88
  <ul>
65
89
  <li><a href="{% link _docs/dsl/resources.md %}">Resources</a>
@@ -73,17 +97,13 @@
73
97
  <li><a href="{% link _docs/dsl/multiple-resources.md %}">Multiple Resources</a>
74
98
  </ul>
75
99
  </li>
76
- <li><a href="{% link _docs/layering.md %}">Layering</a>
77
- <ul>
78
- <li><a href="{% link _docs/layering/yaml.md %}">YAML</a></li>
79
- <li><a href="{% link _docs/layering/dsl.md %}">DSL</a></li>
80
- <li><a href="{% link _docs/layering/merge.md %}">Merge Behavior</a></li>
81
- </ul>
82
- </li>
83
100
  <li><a href="{% link _docs/helpers.md %}">Helpers</a></li>
84
101
  <li><a href="{% link _docs/patterns.md %}">Patterns</a>
85
102
  <ul>
86
- <li><a href="{% link _docs/patterns/clock-web-worker.md %}">Clock Web Worker</a></li>
103
+ {% assign docs = site.docs | where: "categories","patterns" %}
104
+ {% for doc in docs -%}
105
+ <li><a href="{{ doc.url }}">{{ doc.nav_text }}</a></li>
106
+ {% endfor %}
87
107
  </ul>
88
108
  </li>
89
109
  <li><a href="{% link _docs/extra-env.md %}">Extra Env</a>
@@ -92,8 +112,12 @@
92
112
  <li><a href="{% link _docs/extra-env/dsl.md %}">DSL</a></li>
93
113
  </ul>
94
114
  </li>
95
- <li><a href="{% link _docs/kustomize.md %}">Kustomize Support</a></li>
96
- <li><a href="{% link _docs/auto-context.md %}">Auto Context</a></li>
115
+ <li>Misc
116
+ <ul>
117
+ <li><a href="{% link _docs/misc/kustomize.md %}">Kustomize Support</a></li>
118
+ <li><a href="{% link _docs/misc/separate-steps.md %}">Separate Steps</a></li>
119
+ <li><a href="{% link _docs/misc/auto-context.md %}">Auto Context</a></li>
120
+ </ul>
97
121
  <li>CI/CD
98
122
  <ul>
99
123
  <li><a href="{% link _docs/ci/cloudbuild.md %}">CloudBuild</a></li>
@@ -21,13 +21,20 @@ The exec command finds the latest pod from the deployment and runs `kubectl exec
21
21
 
22
22
  ## Multiple Deployments
23
23
 
24
- If you have have multiple deployments in your `.kubes/resources` then the command will use the first deployment by default. You can specify the specfic deployment with the `--name` option. Examples:
24
+ If you have have multiple deployments in your `.kubes/resources` then the command will use the first deployment by default. You can specify the specfic deployment with the `--name` or `-n` option. Examples:
25
25
 
26
- kubes exec --name demo-web
27
- kubes exec --name demo-clock
28
- kubes exec --name demo-worker
29
- kubes exec --name demo-web sh
30
- kubes exec --name demo-web ls -l
26
+ kubes exec --name web
27
+ kubes exec -n web
28
+ kubes exec -n clock
29
+ kubes exec -n worker
30
+ kubes exec -n web sh
31
+ kubes exec -n web ls -l
32
+
33
+ ## Multiple Pod Containers
34
+
35
+ If you have have multiple containers in your pod. You can specify the specfic container with the `--container` or `-c` option. Examples:
36
+
37
+ kubes exec --name web
31
38
 
32
39
 
33
40
  ## Options
@@ -36,6 +43,7 @@ If you have have multiple deployments in your `.kubes/resources` then the comman
36
43
  [--compile], [--no-compile] # whether or not to compile the .kube/resources
37
44
  # Default: true
38
45
  n, [--name=NAME] # deployment name to use. IE: demo-web
46
+ c, [--container=CONTAINER] # Container name. If omitted, the first container in the pod will be chosen
39
47
  [--verbose], [--no-verbose]
40
48
  [--noop], [--no-noop]
41
49
  ```
@@ -20,6 +20,7 @@ a, --app=APP # Docker repo name. Example: web. Generates .ku
20
20
  t, [--type=TYPE] # Type: dsl or yaml
21
21
  # Default: yaml
22
22
  --repo=REPO # Docker repo name. Example: user/repo. Configures .kubes/config.rb
23
+ n, [--namespace=NAMESPACE] # Namespace to use, defaults to the app option
23
24
  [--verbose], [--no-verbose]
24
25
  [--noop], [--no-noop]
25
26
  ```
@@ -18,6 +18,7 @@ logs from all deployment pods
18
18
  [--compile], [--no-compile] # whether or not to compile the .kube/resources
19
19
  # Default: true
20
20
  n, [--name=NAME] # deployment name to use. IE: demo-web
21
+ c, [--container=CONTAINER] # Container name. If omitted, the first container in the pod will be chosen
21
22
  f, [--follow], [--no-follow] # Follow logs
22
23
  # Default: true
23
24
  [--verbose], [--no-verbose]
@@ -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
+ }
@@ -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"
@@ -14,6 +14,9 @@ require "memoist"
14
14
  require "rainbow/ext/string"
15
15
  require "yaml"
16
16
 
17
+ # core helper libraries
18
+ require "kubes_google"
19
+
17
20
  DslEvaluator.backtrace_reject = ".kubes"
18
21
 
19
22
  require "kubes/autoloader"
@@ -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
- name_option = Proc.new {
13
- option :name, aliases: %w[n], desc: "deployment name to use. IE: demo-web"
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
- option :yes, aliases: %w[y], type: :boolean, desc: "Skip are you sure prompt"
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
- name_option.call
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
- name_option.call
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")
@@ -3,7 +3,8 @@ class Kubes::CLI
3
3
  def run
4
4
  compile
5
5
  logger.info "Deploying kubes resources"
6
- Kubes::Kubectl::Decider.new(:apply, @options).run
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
@@ -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
@@ -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
@@ -10,7 +10,7 @@ class Kubes::CLI
10
10
  end
11
11
 
12
12
  def perform(preview: false)
13
- Kubes::Kubectl::Decider.new(:delete, @options.merge(preview: preview)).run
13
+ Kubes::Kubectl::Dispatcher.new(:delete, @options.merge(preview: preview)).run
14
14
  end
15
15
  end
16
16
  end
@@ -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
- metadata = Kubes::Kubectl::Fetch::Deployment.new(@options).metadata
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 = capture("kubectl get pod -l #{labels} -n #{ns} -o json")
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
- name = pod['metadata']['name']
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
@@ -2,9 +2,10 @@ class Kubes::CLI
2
2
  class Get < Base
3
3
  def run
4
4
  compile
5
- Kubes::Kubectl.run(:get, @options)
5
+ Kubes::Kubectl.run(:get, @options.merge(exit_on_fail: false))
6
+ return unless @options[:show_pods]
6
7
  pods = Kubes::Kubectl::Fetch::Pods.new(@options)
7
- pods.show if @options[:show_pods]
8
+ pods.show
8
9
  end
9
10
  end
10
11
  end
@@ -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 the app option"],
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] || @options[:app]
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
@@ -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
- sh("kubectl logs deployment/#{name}#{follow} -n #{ns}#{c}")
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