kubes 0.4.6 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -0
  3. data/README.md +54 -1
  4. data/docs/_docs/config/reference.md +1 -0
  5. data/docs/_docs/config/skip.md +1 -1
  6. data/docs/_docs/dsl/multiple-resources.md +3 -3
  7. data/docs/_docs/dsl/resources/job.md +62 -0
  8. data/docs/_docs/dsl/resources/secret.md +19 -2
  9. data/docs/_docs/extra-env/dsl.md +2 -2
  10. data/docs/_docs/extra-env/yaml.md +1 -1
  11. data/docs/_docs/generators.md +41 -0
  12. data/docs/_docs/helpers.md +17 -3
  13. data/docs/_docs/helpers/aws.md +1 -0
  14. data/docs/_docs/helpers/aws/advanced.md +10 -0
  15. data/docs/_docs/helpers/aws/advanced/secrets.md +131 -0
  16. data/docs/_docs/helpers/aws/advanced/ssm.md +78 -0
  17. data/docs/_docs/helpers/aws/secrets.md +18 -88
  18. data/docs/_docs/helpers/aws/ssm.md +20 -38
  19. data/docs/_docs/helpers/google.md +1 -1
  20. data/docs/_docs/helpers/google/advanced.md +10 -0
  21. data/docs/_docs/helpers/google/advanced/secrets.md +78 -0
  22. data/docs/_docs/helpers/google/secrets.md +18 -27
  23. data/docs/_docs/helpers/google/service-account.md +8 -0
  24. data/docs/_docs/intro.md +2 -9
  25. data/docs/_docs/intro/docker-image.md +66 -0
  26. data/docs/_docs/intro/how-kubes-works.md +7 -11
  27. data/docs/_docs/layering.md +2 -0
  28. data/docs/_docs/layering/merge.md +1 -1
  29. data/docs/_docs/layering/mix.md +99 -0
  30. data/docs/_docs/learn/dsl/delete.md +10 -2
  31. data/docs/_docs/learn/dsl/review-project.md +2 -2
  32. data/docs/_docs/learn/yaml/delete.md +10 -2
  33. data/docs/_docs/learn/yaml/review-project.md +2 -2
  34. data/docs/_docs/patterns/clock-web-worker.md +3 -3
  35. data/docs/_docs/patterns/migrations.md +1 -1
  36. data/docs/_docs/patterns/multiple-envs.md +55 -0
  37. data/docs/_docs/patterns/secrets.md +0 -2
  38. data/docs/_docs/variables.md +23 -0
  39. data/docs/_docs/variables/advanced.md +62 -0
  40. data/docs/_docs/variables/basic.md +137 -0
  41. data/docs/_docs/vs.md +10 -0
  42. data/docs/_docs/vs/custom.md +109 -0
  43. data/docs/_docs/vs/helm.md +243 -0
  44. data/docs/_docs/vs/kustomize.md +167 -0
  45. data/docs/_docs/yaml.md +2 -2
  46. data/docs/_includes/commands.html +2 -2
  47. data/docs/_includes/intro/features.md +11 -0
  48. data/docs/_includes/layering/layers.md +2 -4
  49. data/docs/_includes/sidebar.html +41 -0
  50. data/docs/_includes/vs/article.md +1 -0
  51. data/docs/_includes/vs/kubes/layering.md +10 -0
  52. data/docs/_includes/vs/kubes/structure.md +24 -0
  53. data/docs/_reference/kubes-delete.md +1 -1
  54. data/docs/_reference/kubes-exec.md +17 -1
  55. data/docs/_reference/kubes-init.md +2 -2
  56. data/docs/_reference/kubes-logs.md +2 -1
  57. data/docs/_reference/kubes-new-help.md +15 -0
  58. data/docs/_reference/kubes-new-helper.md +25 -0
  59. data/docs/_reference/kubes-new-resource.md +56 -0
  60. data/docs/_reference/kubes-new-variable.md +20 -0
  61. data/docs/_reference/kubes-new.md +26 -0
  62. data/docs/_reference/kubes-prune.md +22 -0
  63. data/docs/reference.md +2 -0
  64. data/kubes.gemspec +2 -2
  65. data/lib/kubes.rb +5 -3
  66. data/lib/kubes/auth.rb +4 -1
  67. data/lib/kubes/auth/base.rb +21 -0
  68. data/lib/kubes/auth/ecr.rb +1 -15
  69. data/lib/kubes/auth/gcr.rb +24 -0
  70. data/lib/kubes/cli.rb +9 -1
  71. data/lib/kubes/cli/build.rb +6 -0
  72. data/lib/kubes/cli/compile.rb +7 -0
  73. data/lib/kubes/cli/deploy.rb +1 -6
  74. data/lib/kubes/cli/exec.rb +5 -1
  75. data/lib/kubes/cli/help/exec.md +15 -0
  76. data/lib/kubes/cli/help/new/helper.md +4 -0
  77. data/lib/kubes/cli/help/new/resource.md +30 -0
  78. data/lib/kubes/cli/init.rb +1 -1
  79. data/lib/kubes/cli/new.rb +15 -0
  80. data/lib/kubes/cli/new/helper.rb +24 -0
  81. data/lib/kubes/cli/new/resource.rb +97 -0
  82. data/lib/kubes/cli/new/variable.rb +16 -0
  83. data/lib/kubes/cli/sequence.rb +1 -0
  84. data/lib/kubes/command.rb +7 -0
  85. data/lib/kubes/compiler.rb +19 -21
  86. data/lib/kubes/compiler/decorator/base.rb +1 -1
  87. data/lib/kubes/compiler/dsl/core/base.rb +6 -9
  88. data/lib/kubes/compiler/dsl/syntax/job.rb +217 -0
  89. data/lib/kubes/compiler/layering.rb +21 -7
  90. data/lib/kubes/compiler/shared/custom_variables.rb +38 -0
  91. data/lib/kubes/compiler/shared/helpers.rb +11 -2
  92. data/lib/kubes/compiler/shared/helpers/deprecated.rb +37 -0
  93. data/lib/kubes/compiler/shared/plugin_helpers.rb +14 -0
  94. data/lib/kubes/compiler/strategy.rb +7 -6
  95. data/lib/kubes/compiler/strategy/base.rb +59 -2
  96. data/lib/kubes/compiler/strategy/dsl.rb +0 -29
  97. data/lib/kubes/compiler/strategy/erb.rb +10 -22
  98. data/lib/kubes/compiler/util/normalize.rb +6 -3
  99. data/lib/kubes/compiler/util/yaml_dump.rb +4 -4
  100. data/lib/kubes/config.rb +1 -1
  101. data/lib/kubes/core.rb +6 -0
  102. data/lib/kubes/docker/strategy/image_name.rb +1 -1
  103. data/lib/kubes/kubectl.rb +5 -23
  104. data/lib/kubes/kubectl/batch.rb +27 -33
  105. data/lib/kubes/kubectl/ordering.rb +42 -0
  106. data/lib/kubes/plugin.rb +14 -0
  107. data/lib/kubes/util/sh.rb +1 -1
  108. data/lib/kubes/version.rb +1 -1
  109. data/lib/templates/base/.kubes/config.rb.tt +1 -1
  110. data/lib/templates/base/.kubes/config/env/dev.rb +1 -1
  111. data/lib/templates/base/.kubes/config/env/prod.rb +1 -1
  112. data/lib/templates/dsl/.kubes/resources/web/deployment.rb +1 -1
  113. data/lib/templates/new/helper/file.rb +2 -0
  114. data/lib/templates/new/resource/dsl/backend_config.rb +10 -0
  115. data/lib/templates/new/resource/dsl/config_map.rb +5 -0
  116. data/lib/templates/new/resource/dsl/daemon_set.rb +11 -0
  117. data/lib/templates/new/resource/dsl/deployment.rb +4 -0
  118. data/lib/templates/new/resource/dsl/ingress.rb +3 -0
  119. data/lib/templates/new/resource/dsl/job.rb +2 -0
  120. data/lib/templates/new/resource/dsl/managed_certificate.rb +2 -0
  121. data/lib/templates/new/resource/dsl/namespace.rb +2 -0
  122. data/lib/templates/new/resource/dsl/network_policy.rb +7 -0
  123. data/lib/templates/new/resource/dsl/pod.rb +6 -0
  124. data/lib/templates/new/resource/dsl/role.rb +4 -0
  125. data/lib/templates/new/resource/dsl/role_binding.rb +7 -0
  126. data/lib/templates/new/resource/dsl/secret.rb +5 -0
  127. data/lib/templates/new/resource/dsl/service.rb +2 -0
  128. data/lib/templates/new/resource/dsl/service_account.rb +1 -0
  129. data/lib/templates/new/resource/yaml/backend_config.yaml +10 -0
  130. data/lib/templates/new/resource/yaml/config_map.yaml +9 -0
  131. data/lib/templates/new/resource/yaml/daemon_set.yaml +11 -0
  132. data/lib/templates/new/resource/yaml/deployment.yaml +19 -0
  133. data/lib/templates/new/resource/yaml/ingress.yaml +12 -0
  134. data/lib/templates/new/resource/yaml/job.yaml +19 -0
  135. data/lib/templates/new/resource/yaml/managed_certificate.yaml +7 -0
  136. data/lib/templates/new/resource/yaml/namespace.yaml +6 -0
  137. data/lib/templates/new/resource/yaml/network_policy.yaml +20 -0
  138. data/lib/templates/new/resource/yaml/pod.yaml +11 -0
  139. data/lib/templates/new/resource/yaml/role.yaml +13 -0
  140. data/lib/templates/new/resource/yaml/role_binding.yaml +11 -0
  141. data/lib/templates/new/resource/yaml/secret.yaml +9 -0
  142. data/lib/templates/new/resource/yaml/service.yaml +14 -0
  143. data/lib/templates/new/resource/yaml/service_account.yaml +4 -0
  144. data/lib/templates/new/variable/file.rb +1 -0
  145. data/lib/templates/yaml/.kubes/resources/base/all.yaml.tt +2 -0
  146. data/lib/templates/yaml/.kubes/resources/web/deployment.yaml.tt +1 -1
  147. data/spec/fixtures/multiple-files/{deployment-1.rb → .kubes/resources/web/deployment-1.rb} +0 -0
  148. data/spec/fixtures/multiple-files/{deployment-2.rb → .kubes/resources/web/deployment-2.rb} +0 -0
  149. data/spec/fixtures/project/.kubes/resources/{deployment.rb → web/deployment.rb} +0 -0
  150. data/spec/fixtures/project/.kubes/resources/{foobar.rb → web/empty.rb} +0 -0
  151. data/spec/fixtures/project/.kubes/resources/{service.rb → web/service.rb} +1 -1
  152. data/spec/fixtures/syntax/{network_policy.rb → .kubes/resources/web/network_policy.rb} +0 -0
  153. data/spec/fixtures/syntax/{pod.rb → .kubes/resources/web/pod.rb} +0 -0
  154. data/spec/kubes/cli/prune_spec.rb +1 -0
  155. data/spec/kubes/compiler/strategy/dsl_spec.rb +2 -2
  156. data/spec/kubes/compiler_spec.rb +6 -2
  157. data/spec/kubes/dsl/network_policy_spec.rb +1 -1
  158. data/spec/kubes/dsl/pod_spec.rb +1 -1
  159. metadata +97 -25
@@ -11,14 +11,26 @@ class Kubes::Compiler
11
11
  all = all.pluralize
12
12
  end
13
13
  layers = [
14
- "#{all}#{ext}",
15
- "#{all}/#{Kubes.env}#{ext}",
16
- "#{kind}#{ext}",
17
- "#{kind}/#{Kubes.env}#{ext}",
14
+ "#{all}",
15
+ "#{all}/#{Kubes.env}",
16
+ "#{kind}",
17
+ "#{kind}/#{Kubes.env}",
18
18
  ]
19
- layers.map do |layer|
19
+ layers = add_exts(layers)
20
+ layers.map! do |layer|
20
21
  "#{Kubes.root}/.kubes/resources/base/#{layer}"
21
22
  end
23
+ layers.select { |layer| File.exist?(layer) }
24
+ end
25
+
26
+ def add_exts(layers)
27
+ layers.map do |layer|
28
+ [
29
+ "#{layer}.rb",
30
+ "#{layer}.yaml",
31
+ "#{layer}.yml",
32
+ ]
33
+ end.flatten
22
34
  end
23
35
 
24
36
  def post_layers
@@ -31,9 +43,11 @@ class Kubes::Compiler
31
43
  "base",
32
44
  Kubes.env.to_s
33
45
  ]
34
- layers.map do |layer|
35
- "#{kind_path}/#{layer}#{ext}"
46
+ layers = add_exts(layers)
47
+ layers.map! do |layer|
48
+ "#{kind_path}/#{layer}"
36
49
  end
50
+ layers.select { |layer| File.exist?(layer) }
37
51
  end
38
52
  end
39
53
  end
@@ -0,0 +1,38 @@
1
+ module Kubes::Compiler::Shared
2
+ module CustomVariables
3
+ include DslEvaluator
4
+
5
+ # Load custom variables from project
6
+ @@custom_variables_loaded = false
7
+ def load_custom_variables
8
+ return if Kubes.kustomize?
9
+
10
+ ext = File.extname(@path)
11
+ role = @path.sub(%r{.*\.kubes/resources/},'').sub(ext,'').split('/').first # IE: web
12
+ kind = File.basename(@path).sub(ext,'') # IE: deployment
13
+ all = "all"
14
+ if @block_form
15
+ kind = kind.pluralize
16
+ all = all.pluralize
17
+ end
18
+
19
+ layers = [
20
+ "base.rb",
21
+ "#{Kubes.env}.rb",
22
+ "base/all.rb",
23
+ "base/all/#{Kubes.env}.rb",
24
+ "base/#{kind}.rb",
25
+ "base/#{kind}/base.rb",
26
+ "base/#{kind}/#{Kubes.env}.rb",
27
+ "#{role}/#{kind}.rb",
28
+ "#{role}/#{kind}/base.rb",
29
+ "#{role}/#{kind}/#{Kubes.env}.rb",
30
+ ]
31
+
32
+ layers.each do |layer|
33
+ path = "#{Kubes.root}/.kubes/variables/#{layer}"
34
+ evaluate_file(path)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -5,12 +5,21 @@ module Kubes::Compiler::Shared
5
5
  extend Kubes::Compiler::Dsl::Core::Fields
6
6
  fields "name"
7
7
 
8
- def built_image
8
+ def docker_image
9
9
  return @options[:image] if @options[:image] # override
10
+ return Kubes.config.image if Kubes.config.image
11
+ built_image_helper
12
+ end
13
+
14
+ def built_image
15
+ Deprecated.new.built_image
16
+ built_image_helper
17
+ end
10
18
 
19
+ def built_image_helper
11
20
  path = Kubes.config.state.docker_image_path
12
21
  unless File.exist?(path)
13
- raise "Missing file with docker image built by kubes: #{path}. Try first running: kubes docker build"
22
+ raise Kubes::MissingDockerImage.new("Missing file with docker image built by kubes: #{path}. Try first running: kubes docker build")
14
23
  end
15
24
  IO.read(path)
16
25
  end
@@ -0,0 +1,37 @@
1
+ module Kubes::Compiler::Shared::Helpers
2
+ class Deprecated
3
+ def built_image
4
+ puts "DEPRECATED: built_image is deprecated, use docker_image helper instead.".color(:yellow)
5
+ print_source
6
+ end
7
+
8
+ def error_info
9
+ error_info = caller.find { |l| l.include?('.kubes/resources') }
10
+ path, line_number, _ = error_info.split(':')
11
+ {path: path, line_number: line_number}
12
+ end
13
+
14
+ def print_source
15
+ info = error_info
16
+ path = info[:path]
17
+ line_number = info[:line_number].to_i
18
+
19
+ pretty_path = path.sub("#{Kubes.root}/",'')
20
+ puts "Here's the line in #{pretty_path} that calls built_image:\n\n"
21
+
22
+ contents = IO.read(path)
23
+ content_lines = contents.split("\n")
24
+ context = 5 # lines of context
25
+ top, bottom = [line_number-context-1, 0].max, line_number+context-1
26
+ lpad = content_lines.size.to_s.size
27
+ content_lines[top..bottom].each_with_index do |line_content, index|
28
+ current_line = top+index+1
29
+ if current_line == line_number
30
+ printf("%#{lpad}d %s\n".color(:red), current_line, line_content)
31
+ else
32
+ printf("%#{lpad}d %s\n", current_line, line_content)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,14 @@
1
+ module Kubes::Compiler::Shared
2
+ module PluginHelpers
3
+ # Load plugin helper methods from project
4
+ @@plugin_helpers_loaded = false
5
+ def load_plugin_helpers
6
+ return if @@plugin_helpers_loaded
7
+ Kubes::Plugin.plugins.each do |klass|
8
+ helpers_class = "#{klass}::Helpers".constantize
9
+ self.class.send :include, helpers_class
10
+ end
11
+ @@plugin_helpers_loaded = true
12
+ end
13
+ end
14
+ end
@@ -16,12 +16,13 @@ class Kubes::Compiler
16
16
  end
17
17
 
18
18
  def strategy_class
19
- ext = File.extname(@path)
20
- case ext
21
- when '.rb' then Dsl
22
- when '.yaml','.yml' then Erb
23
- else Pass
24
- end
19
+ ext = File.extname(@path).sub('.','').to_sym
20
+ map = {
21
+ rb: Dsl,
22
+ yaml: Erb,
23
+ yml: Erb,
24
+ }
25
+ map[ext]
25
26
  end
26
27
  end
27
28
  end
@@ -1,13 +1,70 @@
1
1
  class Kubes::Compiler::Strategy
2
2
  class Base
3
- include Kubes::Logging
3
+ include Kubes::Compiler::Layering
4
+ include Kubes::Compiler::Util::Normalize
4
5
  include Kubes::Compiler::Util::SaveFile
5
- include Kubes::Compiler::Shared::CustomHelpers
6
+ include Kubes::Logging
6
7
 
7
8
  def initialize(options={})
8
9
  @options = options
9
10
  @path = options[:path]
10
11
  @save_file = save_file(@path)
12
+ @data = @options[:data] || {}
13
+ end
14
+
15
+ def run
16
+ render_files(pre_layers)
17
+ render(@path) # main resource definition
18
+ render_files(post_layers)
19
+
20
+ Result.new(@save_file, @data)
21
+ end
22
+
23
+ def render_files(paths)
24
+ paths.each do |path|
25
+ next unless File.exist?(path) # layers may not exist
26
+ render(path)
27
+ end
28
+ end
29
+
30
+ # render and merge
31
+ def render(path)
32
+ result = render_strategy(path)
33
+ if result.is_a?(Kubes::Compiler::Dsl::Core::Blocks)
34
+ result = result.results
35
+ end
36
+ @data.deeper_merge!(result)
37
+ end
38
+
39
+ # Delegate to Dsl or Erb strategy again and pass @data down to allow rendering of a mix of yaml and rb files.
40
+ def render_strategy(path)
41
+ if path.include?('.rb')
42
+ dsl_class.new(@options.merge(path: path, data: @data)).run
43
+ else
44
+ Erb.new(@options.merge(data: @data)).render_result(path)
45
+ end
46
+ end
47
+
48
+ # Must be defined here in case coming from Kubes::Compiler::Strategy::Erb#render_strategy
49
+ def dsl_class
50
+ if block_form?
51
+ Kubes::Compiler::Dsl::Core::Blocks
52
+ else
53
+ syntax_class
54
+ end
55
+ end
56
+
57
+ def syntax_class
58
+ klass_name = normalize_kind(@save_file) # IE: @save_file: web/service.yaml
59
+ "Kubes::Compiler::Dsl::Syntax::#{klass_name}".constantize
60
+ rescue NameError
61
+ logger.debug "Using default resource for: #{klass_name}"
62
+ Kubes::Compiler::Dsl::Syntax::Resource # default
63
+ end
64
+
65
+ def block_form?
66
+ type = extract_type(@save_file)
67
+ type.pluralize == type
11
68
  end
12
69
  end
13
70
  end
@@ -1,33 +1,4 @@
1
1
  class Kubes::Compiler::Strategy
2
2
  class Dsl < Base
3
- include Kubes::Compiler::Util::Normalize
4
-
5
- def run
6
- load_custom_helpers
7
- dsl = dsl_class.new(@options) # Deployment, Service, etc
8
- data = dsl.run
9
- Result.new(@save_file, data)
10
- end
11
-
12
- def dsl_class
13
- if block_form?
14
- Kubes::Compiler::Dsl::Core::Blocks
15
- else
16
- syntax_class
17
- end
18
- end
19
-
20
- def syntax_class
21
- klass_name = normalize_kind(@save_file)
22
- "Kubes::Compiler::Dsl::Syntax::#{klass_name}".constantize
23
- rescue NameError
24
- logger.debug "Using default resource for: #{klass_name}"
25
- Kubes::Compiler::Dsl::Syntax::Resource # default
26
- end
27
-
28
- def block_form?
29
- type = extract_type(@save_file)
30
- type.pluralize == type
31
- end
32
3
  end
33
4
  end
@@ -4,31 +4,19 @@ class Kubes::Compiler::Strategy
4
4
  class Erb < Base
5
5
  extend Kubes::Compiler::Dsl::Core::Fields
6
6
  include Kubes::Compiler::Dsl::Core::Helpers
7
+ include Kubes::Compiler::Layering
7
8
  include Kubes::Compiler::Shared::CustomHelpers
9
+ include Kubes::Compiler::Shared::CustomVariables
8
10
  include Kubes::Compiler::Shared::Helpers
9
- include Kubes::Compiler::Layering
10
-
11
- def run
11
+ include Kubes::Compiler::Shared::PluginHelpers
12
+
13
+ def initialize(options={})
14
+ super
15
+ # For ERB scope is in this same Strategy::Erb class
16
+ # For DSL scope is within the each for the Resource classes. IE: kubes/compile/dsl/core/base.rb
17
+ load_plugin_helpers
18
+ load_custom_variables
12
19
  load_custom_helpers
13
- @data = {}
14
-
15
- render_files(pre_layers)
16
- render(@path) # main resource definition
17
- render_files(post_layers)
18
-
19
- Result.new(@save_file, @data)
20
- end
21
-
22
- def render_files(paths)
23
- paths.each do |path|
24
- render(path)
25
- end
26
- end
27
-
28
- # render and merge
29
- def render(path)
30
- result = render_result(path)
31
- @data.deeper_merge!(result)
32
20
  end
33
21
 
34
22
  def render_result(path)
@@ -1,11 +1,14 @@
1
1
  module Kubes::Compiler::Util
2
2
  module Normalize
3
3
  def normalize_kind(path)
4
- extract_type(path).underscore.camelize # Deployment, Service, Ingress, ManagedCertificate, etc
4
+ info = path.sub(%r{.*/.kubes/resources/}, '')
5
+ extract_type(info).underscore.camelize # Deployment, Service, Ingress, ManagedCertificate, etc
5
6
  end
6
7
 
7
- def extract_type(path)
8
- File.basename(path).sub('.yaml','').sub('.yml','').sub('.rb','').sub(/-.*/,'')
8
+ # info: web/service.yaml
9
+ def extract_type(info)
10
+ _, kind = info.split('/')
11
+ kind.sub('.yaml','').sub('.yml','').sub('.rb','').sub(/-.*/,'')
9
12
  end
10
13
  end
11
14
  end
@@ -4,12 +4,12 @@ require "yaml"
4
4
  module Kubes::Compiler::Util
5
5
  module YamlDump
6
6
  def yaml_dump(data)
7
- if data.is_a?(Kubes::Compiler::Dsl::Core::Blocks)
8
- items = data.results.map { |k,v| standardize_yaml(v) }
9
- items.map(&:to_yaml).join("")
10
- else
7
+ if data.key?("kind") # single resource in YAML
11
8
  data = standardize_yaml(data)
12
9
  data.to_yaml
10
+ else
11
+ items = data.map { |k,v| standardize_yaml(v) }
12
+ items.map(&:to_yaml).join("")
13
13
  end
14
14
  end
15
15
 
@@ -32,7 +32,7 @@ module Kubes
32
32
 
33
33
  config.repo = nil # expected to be set by .kubes/config.rb
34
34
 
35
- config.logger = Logger.new($stdout)
35
+ config.logger = Logger.new($stderr)
36
36
  config.logger.level = ENV['KUBES_LOG_LEVEL'] || :info
37
37
 
38
38
  config.skip = []
@@ -28,5 +28,11 @@ module Kubes
28
28
  def kustomize?
29
29
  Kubectl::Kustomize.detect?
30
30
  end
31
+
32
+ def check_project!
33
+ return if File.exist?("#{Kubes.root}/.kubes/config.rb")
34
+ logger.error "ERROR: It doesnt look like this is a kubes project. Are you sure you are in a kubes project?".color(:red)
35
+ ENV['TS_TEST'] ? raise : exit(1)
36
+ end
31
37
  end
32
38
  end
@@ -30,7 +30,7 @@ module Kubes::Docker::Strategy
30
30
  return "tongueroo/demo-kubes:kubes-12345678" if ENV['TEST']
31
31
 
32
32
  unless File.exist?(image_state_path)
33
- puts "Unable to find #{image_state_path} which contains the last docker image name built with kubes build. Please run `kubes docker build` first."
33
+ logger.error "ERROR: Unable to find #{image_state_path} which contains the last docker image name built with kubes build. Please run `kubes docker build` first."
34
34
  exit 1
35
35
  end
36
36
  IO.read(image_state_path).strip
@@ -17,13 +17,11 @@ module Kubes
17
17
  params = args.flatten.join(' ')
18
18
  args = "#{@name} #{params}" # @name: apply or delete
19
19
 
20
- switch_context do
21
- run_hooks("kubectl.rb", name: @name, file: @options[:file]) do
22
- if options[:capture]
23
- self.class.capture(args, options) # already includes kubectl
24
- else
25
- self.class.execute(args, options)
26
- end
20
+ run_hooks("kubectl.rb", name: @name, file: @options[:file]) do
21
+ if options[:capture]
22
+ self.class.capture(args, options) # already includes kubectl
23
+ else
24
+ self.class.execute(args, options)
27
25
  end
28
26
  end
29
27
  end
@@ -44,22 +42,6 @@ module Kubes
44
42
  Kubes.config.kubectl.exit_on_fail[@name]
45
43
  end
46
44
 
47
- def switch_context(&block)
48
- kubectl = Kubes.config.kubectl
49
- context = kubectl.context
50
- if context
51
- previous_context = capture("kubectl config current-context")
52
- sh("kubectl config use-context #{context}", mute: true)
53
- result = block.call
54
- if !previous_context.blank? && !kubectl.context_keep
55
- sh("kubectl config use-context #{previous_context}", mute: true)
56
- end
57
- result
58
- else
59
- block.call
60
- end
61
- end
62
-
63
45
  def args
64
46
  # base at end in case of redirection. IE: command > /path
65
47
  custom.args + default.args
@@ -3,6 +3,7 @@ class Kubes::Kubectl
3
3
  include Kubes::Hooks::Concern
4
4
  include Kubes::Logging
5
5
  include Kubes::Util::Consider
6
+ include Kubes::Util::Sh
6
7
  include Ordering
7
8
 
8
9
  def initialize(name, options={})
@@ -12,48 +13,41 @@ class Kubes::Kubectl
12
13
  def run
13
14
  # @options[:preview] is really only used for kubectl delete
14
15
  logger.info "Will run:" if @options[:preview]
15
- run_hooks("kubes.rb", name: @name) do
16
- sorted_files.each do |file|
17
- if @options[:preview]
18
- logger.info " kubectl #{@name} -f #{file}"
19
- else
20
- Kubes::Kubectl.run(@name, @options.merge(file: file))
16
+ switch_context do
17
+ run_hooks("kubes.rb", name: @name) do
18
+ sorted_files.each do |file|
19
+ if @options[:preview]
20
+ logger.info " kubectl #{@name} -f #{file}"
21
+ else
22
+ Kubes::Kubectl.run(@name, @options.merge(file: file))
23
+ end
21
24
  end
22
25
  end
23
26
  end
24
27
  end
25
28
 
26
- # kubes apply # {role: nil, resource: nil}
27
- # kubes apply clock # {role: "clock", resource: nil}
28
- # kubes apply clock deployment # {role: "clock", resource: "deployment"}
29
- def search_expr
30
- role, resource = @options[:role], @options[:resource]
31
- if role && resource
32
- "#{Kubes.root}/.kubes/output/#{role}/#{resource}.yaml"
33
- elsif role
34
- "#{Kubes.root}/.kubes/output/#{role}/*.yaml"
35
- else
36
- "#{Kubes.root}/.kubes/output/**/*.yaml"
37
- end
38
- end
29
+ def switch_context(&block)
30
+ kubectl = Kubes.config.kubectl
31
+ context = kubectl.context
39
32
 
40
- def files
41
- files = []
42
- Dir.glob(search_expr).each do |path|
43
- next unless process?(path)
44
- file = path.sub("#{Kubes.root}/", '')
45
- files << file
33
+ unless context
34
+ block.call
35
+ return
46
36
  end
47
- files
48
- end
49
37
 
50
- def process?(path)
51
- consider?(path) && two_levels_deep?(path)
52
- end
38
+ previous_context = sh_capture("kubectl config current-context")
39
+ if previous_context == context
40
+ block.call
41
+ return
42
+ end
53
43
 
54
- def two_levels_deep?(path)
55
- rel_path = path.sub(%r{.*\.kubes/output/},'')
56
- rel_path.split('/').size == 2
44
+ logger.debug "Switching kubectl context to: #{context}"
45
+ sh("kubectl config use-context #{context}", mute: true)
46
+ result = block.call
47
+ if !previous_context.blank? && !kubectl.context_keep
48
+ sh("kubectl config use-context #{previous_context}", mute: true)
49
+ end
50
+ result
57
51
  end
58
52
  end
59
53
  end