kubes 0.5.1 → 0.6.0

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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/README.md +52 -0
  4. data/docs/_docs/dsl/resources/secret.md +19 -2
  5. data/docs/_docs/generators.md +4 -4
  6. data/docs/_docs/helpers/aws/advanced/secrets.md +131 -0
  7. data/docs/_docs/helpers/aws/advanced/ssm.md +78 -0
  8. data/docs/_docs/helpers/aws/advanced.md +10 -0
  9. data/docs/_docs/helpers/aws/secrets.md +18 -88
  10. data/docs/_docs/helpers/aws/ssm.md +20 -38
  11. data/docs/_docs/helpers/google/advanced/secrets.md +78 -0
  12. data/docs/_docs/helpers/google/advanced.md +10 -0
  13. data/docs/_docs/helpers/google/secrets.md +18 -27
  14. data/docs/_docs/helpers.md +16 -2
  15. data/docs/_docs/intro.md +2 -11
  16. data/docs/_docs/layering/mix.md +99 -0
  17. data/docs/_docs/layering.md +2 -0
  18. data/docs/_docs/patterns/multiple-envs.md +55 -0
  19. data/docs/_docs/variables/advanced.md +62 -0
  20. data/docs/_docs/variables/basic.md +137 -0
  21. data/docs/_docs/variables.md +23 -0
  22. data/docs/_docs/vs/custom.md +109 -0
  23. data/docs/_docs/vs/helm.md +243 -0
  24. data/docs/_docs/vs/kustomize.md +167 -0
  25. data/docs/_docs/vs.md +10 -0
  26. data/docs/_includes/intro/features.md +10 -0
  27. data/docs/_includes/layering/layers.md +2 -4
  28. data/docs/_includes/sidebar.html +39 -0
  29. data/docs/_includes/vs/article.md +1 -0
  30. data/docs/_includes/vs/kubes/layering.md +10 -0
  31. data/docs/_includes/vs/kubes/structure.md +24 -0
  32. data/docs/_reference/kubes-new-help.md +15 -0
  33. data/docs/_reference/kubes-new-helper.md +25 -0
  34. data/docs/_reference/kubes-new-resource.md +56 -0
  35. data/docs/_reference/kubes-new-variable.md +20 -0
  36. data/docs/_reference/kubes-new.md +6 -38
  37. data/kubes.gemspec +2 -2
  38. data/lib/kubes/auth/base.rb +21 -0
  39. data/lib/kubes/auth/ecr.rb +1 -15
  40. data/lib/kubes/auth/gcr.rb +24 -0
  41. data/lib/kubes/auth.rb +4 -1
  42. data/lib/kubes/cli/help/new/helper.md +4 -0
  43. data/lib/kubes/cli/help/{new.md → new/resource.md} +3 -3
  44. data/lib/kubes/cli/new/helper.rb +24 -0
  45. data/lib/kubes/cli/new/resource.rb +97 -0
  46. data/lib/kubes/cli/new/variable.rb +16 -0
  47. data/lib/kubes/cli/new.rb +12 -94
  48. data/lib/kubes/command.rb +1 -1
  49. data/lib/kubes/compiler/decorator/base.rb +1 -1
  50. data/lib/kubes/compiler/dsl/core/base.rb +6 -9
  51. data/lib/kubes/compiler/layering.rb +21 -7
  52. data/lib/kubes/compiler/shared/custom_variables.rb +38 -0
  53. data/lib/kubes/compiler/shared/plugin_helpers.rb +14 -0
  54. data/lib/kubes/compiler/strategy/base.rb +59 -2
  55. data/lib/kubes/compiler/strategy/dsl.rb +0 -29
  56. data/lib/kubes/compiler/strategy/erb.rb +10 -22
  57. data/lib/kubes/compiler/strategy.rb +7 -6
  58. data/lib/kubes/compiler/util/normalize.rb +6 -3
  59. data/lib/kubes/compiler/util/yaml_dump.rb +4 -4
  60. data/lib/kubes/plugin.rb +14 -0
  61. data/lib/kubes/util/sh.rb +1 -1
  62. data/lib/kubes/version.rb +1 -1
  63. data/lib/kubes.rb +4 -3
  64. data/lib/templates/new/helper/file.rb +2 -0
  65. data/lib/templates/new/{dsl → resource/dsl}/backend_config.rb +0 -0
  66. data/lib/templates/new/{dsl → resource/dsl}/config_map.rb +0 -0
  67. data/lib/templates/new/{dsl → resource/dsl}/daemon_set.rb +0 -0
  68. data/lib/templates/new/{dsl → resource/dsl}/deployment.rb +0 -0
  69. data/lib/templates/new/{dsl → resource/dsl}/ingress.rb +0 -0
  70. data/lib/templates/new/{dsl → resource/dsl}/job.rb +0 -0
  71. data/lib/templates/new/{dsl → resource/dsl}/managed_certificate.rb +0 -0
  72. data/lib/templates/new/{dsl → resource/dsl}/namespace.rb +0 -0
  73. data/lib/templates/new/{dsl → resource/dsl}/network_policy.rb +0 -0
  74. data/lib/templates/new/{dsl → resource/dsl}/pod.rb +0 -0
  75. data/lib/templates/new/{dsl → resource/dsl}/role.rb +0 -0
  76. data/lib/templates/new/{dsl → resource/dsl}/role_binding.rb +0 -0
  77. data/lib/templates/new/{dsl → resource/dsl}/secret.rb +0 -0
  78. data/lib/templates/new/{dsl → resource/dsl}/service.rb +0 -0
  79. data/lib/templates/new/{dsl → resource/dsl}/service_account.rb +0 -0
  80. data/lib/templates/new/{yaml → resource/yaml}/backend_config.yaml +0 -0
  81. data/lib/templates/new/{yaml → resource/yaml}/config_map.yaml +0 -0
  82. data/lib/templates/new/{yaml → resource/yaml}/daemon_set.yaml +0 -0
  83. data/lib/templates/new/{yaml → resource/yaml}/deployment.yaml +0 -0
  84. data/lib/templates/new/{yaml → resource/yaml}/ingress.yaml +0 -0
  85. data/lib/templates/new/{yaml → resource/yaml}/job.yaml +0 -0
  86. data/lib/templates/new/{yaml → resource/yaml}/managed_certificate.yaml +0 -0
  87. data/lib/templates/new/{yaml → resource/yaml}/namespace.yaml +0 -0
  88. data/lib/templates/new/{yaml → resource/yaml}/network_policy.yaml +0 -0
  89. data/lib/templates/new/{yaml → resource/yaml}/pod.yaml +0 -0
  90. data/lib/templates/new/{yaml → resource/yaml}/role.yaml +0 -0
  91. data/lib/templates/new/{yaml → resource/yaml}/role_binding.yaml +0 -0
  92. data/lib/templates/new/{yaml → resource/yaml}/secret.yaml +0 -0
  93. data/lib/templates/new/{yaml → resource/yaml}/service.yaml +0 -0
  94. data/lib/templates/new/{yaml → resource/yaml}/service_account.yaml +0 -0
  95. data/lib/templates/new/variable/file.rb +1 -0
  96. data/spec/fixtures/multiple-files/{deployment-1.rb → .kubes/resources/web/deployment-1.rb} +0 -0
  97. data/spec/fixtures/multiple-files/{deployment-2.rb → .kubes/resources/web/deployment-2.rb} +0 -0
  98. data/spec/fixtures/project/.kubes/resources/{deployment.rb → web/deployment.rb} +0 -0
  99. data/spec/fixtures/project/.kubes/resources/{foobar.rb → web/empty.rb} +0 -0
  100. data/spec/fixtures/project/.kubes/resources/{service.rb → web/service.rb} +1 -1
  101. data/spec/fixtures/syntax/{network_policy.rb → .kubes/resources/web/network_policy.rb} +0 -0
  102. data/spec/fixtures/syntax/{pod.rb → .kubes/resources/web/pod.rb} +0 -0
  103. data/spec/kubes/compiler/strategy/dsl_spec.rb +2 -2
  104. data/spec/kubes/compiler_spec.rb +1 -1
  105. data/spec/kubes/dsl/network_policy_spec.rb +1 -1
  106. data/spec/kubes/dsl/pod_spec.rb +1 -1
  107. metadata +81 -48
@@ -11,48 +11,16 @@ reference: true
11
11
 
12
12
  Generates new resource.
13
13
 
14
- ## Examples
15
-
16
- $ kubes new ingress
17
- create .kubes/resources/web/ingress.yaml
18
- $ kubes new service_account
19
- create .kubes/resources/shared/service_account.yaml
20
- $
21
-
22
- ## Supported Resources
23
-
24
- Here's a list of some of the supported resources.
25
-
26
- backend_config
27
- config_map
28
- daemon_set
29
- deployment
30
- ingress
31
- job
32
- managed_certificate
33
- namespace
34
- network_policy
35
- pod
36
- role_binding
37
- role
38
- secret
39
- service_account
40
- service
41
-
42
- Refer to the source code to all the resources that the generator supports:
43
- https://github.com/boltops-tools/kubes/blob/master/lib/templates/new/yaml
14
+ ## Subcommands
44
15
 
16
+ * [kubes new helper]({% link _reference/kubes-new-helper.md %}) - Generates kubes helper file.
17
+ * [kubes new resource]({% link _reference/kubes-new-resource.md %}) - Generates Kubes Kubernetes resource definition.
18
+ * [kubes new variable]({% link _reference/kubes-new-variable.md %}) - Generates kubes variable file.
45
19
 
46
20
  ## Options
47
21
 
48
22
  ```
49
- a, [--app=APP] # App name
50
- # Default: demo
51
- y, [--force] # Bypass overwrite are you sure prompt for existing files
52
- r, [--role=ROLE] # Role. IE: web, clock, worker, migrate, etc. Defaults to convention: web or shared when not set
53
- t, [--type=TYPE] # Type: dsl or yaml
54
- # Default: yaml
55
- [--verbose], [--no-verbose]
56
- [--noop], [--no-noop]
23
+ [--verbose], [--no-verbose]
24
+ [--noop], [--no-noop]
57
25
  ```
58
26
 
data/kubes.gemspec CHANGED
@@ -29,8 +29,8 @@ Gem::Specification.new do |spec|
29
29
  spec.add_dependency "zeitwerk"
30
30
 
31
31
  # core helper libs
32
- spec.add_dependency "kubes_aws"
33
- spec.add_dependency "kubes_google"
32
+ spec.add_dependency "kubes_aws" # , "~> 0.2.0"
33
+ spec.add_dependency "kubes_google" # , "~> 0.2.0"
34
34
 
35
35
  spec.add_development_dependency "bundler"
36
36
  spec.add_development_dependency "byebug"
@@ -0,0 +1,21 @@
1
+ require "json"
2
+
3
+ class Kubes::Auth
4
+ class Base
5
+ include Kubes::Logging
6
+
7
+ def initialize(image)
8
+ @image = image
9
+ @repo_domain = "#{image.split('/').first}"
10
+ end
11
+
12
+ def ensure_dotdocker_exists
13
+ dirname = File.dirname(docker_config)
14
+ FileUtils.mkdir_p(dirname) unless File.exist?(dirname)
15
+ end
16
+
17
+ def docker_config
18
+ "#{ENV['HOME']}/.docker/config.json"
19
+ end
20
+ end
21
+ end
@@ -14,14 +14,9 @@
14
14
  # If that format changes, the update will need to be updated.
15
15
  #
16
16
  class Kubes::Auth
17
- class Ecr
17
+ class Ecr < Base
18
18
  include Kubes::AwsServices
19
19
 
20
- def initialize(image)
21
- @image = image
22
- @repo_domain = "#{image.split('/').first}"
23
- end
24
-
25
20
  def run
26
21
  auth_token = fetch_auth_token
27
22
  if File.exist?(docker_config)
@@ -42,14 +37,5 @@ class Kubes::Auth
42
37
  def fetch_auth_token
43
38
  ecr.get_authorization_token.authorization_data.first.authorization_token
44
39
  end
45
-
46
- def docker_config
47
- "#{ENV['HOME']}/.docker/config.json"
48
- end
49
-
50
- def ensure_dotdocker_exists
51
- dirname = File.dirname(docker_config)
52
- FileUtils.mkdir_p(dirname) unless File.exist?(dirname)
53
- end
54
40
  end
55
41
  end
@@ -0,0 +1,24 @@
1
+ class Kubes::Auth
2
+ class Gcr < Base
3
+ def run
4
+ authorize! unless authorized?
5
+ end
6
+
7
+ def authorize!
8
+ command = "gcloud auth configure-docker"
9
+ logger.debug "Authorizing GCR with: #{command}"
10
+ success = system(command)
11
+ unless success
12
+ logger.error "ERROR: running #{command}".color(:red)
13
+ exit $?.exitstatus if exit_on_fail
14
+ end
15
+ success
16
+ end
17
+
18
+ def authorized?
19
+ return false unless File.exist?(docker_config)
20
+ data = JSON.load(IO.read(docker_config))
21
+ !!data.dig('credHelpers', 'gcr.io')
22
+ end
23
+ end
24
+ end
data/lib/kubes/auth.rb CHANGED
@@ -10,11 +10,14 @@ module Kubes
10
10
  klass.new(@image).run
11
11
  end
12
12
 
13
- # Currently only support ECR
13
+ # Currently only support ECR and GCR
14
+ # TODO: consider moving this to plugin gems
14
15
  def strategy_class
15
16
  case @image
16
17
  when /\.amazonaws\.com/ # IE: 112233445566.dkr.ecr.us-west-2.amazonaws.com/demo/sinatra
17
18
  Ecr
19
+ when /gcr\.io/
20
+ Gcr
18
21
  end
19
22
  end
20
23
  end
@@ -0,0 +1,4 @@
1
+ ## Examples
2
+
3
+ $ kubes new helper custom
4
+ create .kubes/helpers/custom_helper.rb
@@ -1,8 +1,8 @@
1
1
  ## Examples
2
2
 
3
- $ kubes new ingress
3
+ $ kubes new resource ingress
4
4
  create .kubes/resources/web/ingress.yaml
5
- $ kubes new service_account
5
+ $ kubes new resource service_account
6
6
  create .kubes/resources/shared/service_account.yaml
7
7
  $
8
8
 
@@ -27,4 +27,4 @@ Here's a list of some of the supported resources.
27
27
  service
28
28
 
29
29
  Refer to the source code to all the resources that the generator supports:
30
- https://github.com/boltops-tools/kubes/blob/master/lib/templates/new/yaml
30
+ https://github.com/boltops-tools/kubes/blob/master/lib/templates/new/resource/yaml
@@ -0,0 +1,24 @@
1
+ class Kubes::CLI::New
2
+ class Helper < Kubes::CLI::Sequence
3
+ argument :name, default: "custom"
4
+
5
+ def self.options
6
+ [
7
+ [:force, aliases: ["y"], type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
8
+ ]
9
+ end
10
+ options.each { |args| class_option(*args) }
11
+
12
+ private
13
+ def underscored_name
14
+ name.include?("_helper") ? name : "#{name}_helper"
15
+ end
16
+
17
+ public
18
+ def create_helper
19
+ set_source("new/helper")
20
+ file = "#{underscored_name}.rb"
21
+ template "file.rb", ".kubes/helpers/#{file}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,97 @@
1
+ class Kubes::CLI::New
2
+ class Resource < Kubes::CLI::Sequence
3
+ argument :kind
4
+
5
+ def self.options
6
+ [
7
+ [:app, aliases: ["a"], default: "demo", desc: "App name"],
8
+ [:force, aliases: ["y"], type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
9
+ [:role, aliases: ["r"], desc: "Role. IE: web, clock, worker, migrate, etc. Defaults to convention: web or shared when not set"],
10
+ [:type, aliases: ["t"], default: "yaml", desc: "Type: dsl or yaml"],
11
+ ]
12
+ end
13
+ options.each { |args| class_option(*args) }
14
+
15
+ private
16
+ def app
17
+ options[:app]
18
+ end
19
+
20
+ def role
21
+ role = options[:role]
22
+ return role if role
23
+ shared = %w[
24
+ config_map
25
+ namespace
26
+ network_policy
27
+ persistent_volume
28
+ persistent_volume_claim
29
+ secret
30
+ service_account
31
+ ]
32
+ if shared.include?(full_kind)
33
+ "shared"
34
+ elsif full_kind == "job"
35
+ "migrate"
36
+ else
37
+ "web"
38
+ end
39
+ end
40
+
41
+ def full_kind
42
+ # shorthands
43
+ map = {
44
+ cj: "cron_job",
45
+ cm: "config_map",
46
+ crd: "custom_resource_definition",
47
+ crds: "custom_resource_definition",
48
+ cs: "component_statuses",
49
+ csr: "certificate_signing_request",
50
+ deploy: "deployment",
51
+ ds: "daemonset",
52
+ ep: "endpoints",
53
+ ev: "event",
54
+ hpa: "horizontal_pod_autoscaler",
55
+ ing: "ingress",
56
+ limits: "limit_range",
57
+ netpol: "network_policy",
58
+ no: "node",
59
+ ns: "namespace",
60
+ pc: "priority_class",
61
+ pdb: "pod_disruption_budget",
62
+ po: "pod",
63
+ psp: "pods_ecurity_policy",
64
+ pv: "persistent_volume",
65
+ pvc: "persistent_volume_claim",
66
+ quota: "resource_quota",
67
+ rc: "replication_controller",
68
+ rs: "replica_set",
69
+ sa: "service_account",
70
+ sc: "storage_classes",
71
+ sgp: "security_group_policy",
72
+ sts: "stateful_set",
73
+ svc: "service",
74
+ }.stringify_keys!
75
+ map[kind] || kind
76
+ end
77
+
78
+ def file
79
+ ext = options[:type] == "yaml" ? "yaml" : "rb"
80
+ "#{full_kind}.#{ext}"
81
+ end
82
+
83
+ public
84
+ def set_template_source
85
+ path = File.expand_path("../../../templates/new/resource/#{options[:type]}/#{file}", __dir__)
86
+ unless File.exist?(path)
87
+ logger.info "ERROR: Generator for #{file} not supported".color(:red)
88
+ exit 1
89
+ end
90
+ set_source("new/resource/#{options[:type]}")
91
+ end
92
+
93
+ def create_resource
94
+ template file, ".kubes/resources/#{role}/#{file}"
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,16 @@
1
+ class Kubes::CLI::New
2
+ class Variable < Kubes::CLI::Sequence
3
+ def self.options
4
+ [
5
+ [:force, aliases: ["y"], type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
6
+ ]
7
+ end
8
+ options.each { |args| class_option(*args) }
9
+
10
+ def create_helper
11
+ set_source("new/variable")
12
+ file = "#{Kubes.env}.rb"
13
+ template "file.rb", ".kubes/variables/#{file}"
14
+ end
15
+ end
16
+ end
data/lib/kubes/cli/new.rb CHANGED
@@ -1,97 +1,15 @@
1
1
  class Kubes::CLI
2
- class New < Sequence
3
- argument :kind
4
-
5
- def self.options
6
- [
7
- [:app, aliases: ["a"], default: "demo", desc: "App name"],
8
- [:force, aliases: ["y"], type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
9
- [:role, aliases: ["r"], desc: "Role. IE: web, clock, worker, migrate, etc. Defaults to convention: web or shared when not set"],
10
- [:type, aliases: ["t"], default: "yaml", desc: "Type: dsl or yaml"],
11
- ]
12
- end
13
- options.each { |args| class_option(*args) }
14
-
15
- private
16
- def app
17
- options[:app]
18
- end
19
-
20
- def role
21
- role = options[:role]
22
- return role if role
23
- shared = %w[
24
- config_map
25
- namespace
26
- network_policy
27
- persistent_volume
28
- persistent_volume_claim
29
- secret
30
- service_account
31
- ]
32
- if shared.include?(full_kind)
33
- "shared"
34
- elsif full_kind == "job"
35
- "migrate"
36
- else
37
- "web"
38
- end
39
- end
40
-
41
- def full_kind
42
- # shorthands
43
- map = {
44
- cj: "cron_job",
45
- cm: "config_map",
46
- crd: "custom_resource_definition",
47
- crds: "custom_resource_definition",
48
- cs: "component_statuses",
49
- csr: "certificate_signing_request",
50
- deploy: "deployment",
51
- ds: "daemonset",
52
- ep: "endpoints",
53
- ev: "event",
54
- hpa: "horizontal_pod_autoscaler",
55
- ing: "ingress",
56
- limits: "limit_range",
57
- netpol: "network_policy",
58
- no: "node",
59
- ns: "namespace",
60
- pc: "priority_class",
61
- pdb: "pod_disruption_budget",
62
- po: "pod",
63
- psp: "pods_ecurity_policy",
64
- pv: "persistent_volume",
65
- pvc: "persistent_volume_claim",
66
- quota: "resource_quota",
67
- rc: "replication_controller",
68
- rs: "replica_set",
69
- sa: "service_account",
70
- sc: "storage_classes",
71
- sgp: "security_group_policy",
72
- sts: "stateful_set",
73
- svc: "service",
74
- }.stringify_keys!
75
- map[kind] || kind
76
- end
77
-
78
- def file
79
- ext = options[:type] == "yaml" ? "yaml" : "rb"
80
- "#{full_kind}.#{ext}"
81
- end
82
-
83
- public
84
- def set_template_source
85
- path = File.expand_path("../../templates/new/#{options[:type]}/#{file}", __dir__)
86
- unless File.exist?(path)
87
- logger.info "ERROR: Generator for #{file} not supported".color(:red)
88
- exit 1
89
- end
90
- set_source("new/#{options[:type]}")
91
- end
92
-
93
- def create_resource
94
- template file, ".kubes/resources/#{role}/#{file}"
95
- end
2
+ class New < Kubes::Command
3
+ long_desc Help.text("new/resource")
4
+ Resource.options.each { |args| option(*args) }
5
+ register(Resource, "resource", "resource", "Generates Kubes Kubernetes resource definition.")
6
+
7
+ long_desc Help.text("new/helper")
8
+ Helper.options.each { |args| option(*args) }
9
+ register(Helper, "helper", "helper", "Generates kubes helper file.")
10
+
11
+ long_desc Help.text("new/variable")
12
+ Variable.options.each { |args| option(*args) }
13
+ register(Variable, "variable", "variable", "Generates kubes variable file.")
96
14
  end
97
15
  end
data/lib/kubes/command.rb CHANGED
@@ -57,7 +57,7 @@ module Kubes
57
57
  end
58
58
 
59
59
  def check_project!(command_name)
60
- return if %w[init new].include?(command_name)
60
+ return if %w[-h help init new].include?(command_name)
61
61
  Kubes.check_project!
62
62
  end
63
63
 
@@ -11,7 +11,7 @@ module Kubes::Compiler::Decorator
11
11
  end
12
12
 
13
13
  def result
14
- if @data.is_a?(Kubes::Compiler::Dsl::Core::Blocks)
14
+ if @data.key?(Kubes::Compiler::Dsl::Core::Blocks)
15
15
  @data.results.each { |k,v| process(v) } # returns nil
16
16
  else
17
17
  process # processes and returns @data
@@ -3,25 +3,22 @@ module Kubes::Compiler::Dsl::Core
3
3
  extend Fields
4
4
  include DslEvaluator
5
5
  include Helpers
6
- include Kubes::Compiler::Layering
6
+ include Kubes::Compiler::Shared::CustomHelpers
7
+ include Kubes::Compiler::Shared::CustomVariables
8
+ include Kubes::Compiler::Shared::PluginHelpers
7
9
 
8
10
  def initialize(options={})
9
11
  @options = options
10
12
  @name = options[:name]
11
13
  @path = options[:path]
14
+ load_plugin_helpers
15
+ load_custom_variables
16
+ load_custom_helpers
12
17
  end
13
18
 
14
19
  def run
15
- evaluate_files(pre_layers)
16
20
  evaluate_file(@path) # main resource definition
17
- evaluate_files(post_layers)
18
21
  result if respond_to?(:result) # block form doesnt have result
19
22
  end
20
-
21
- def evaluate_files(paths)
22
- paths.each do |path|
23
- evaluate_file(path)
24
- end
25
- end
26
23
  end
27
24
  end
@@ -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
@@ -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
@@ -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