kubes 0.4.4 → 0.5.1

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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/README.md +1 -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/extra-env/dsl.md +2 -2
  9. data/docs/_docs/extra-env/yaml.md +1 -1
  10. data/docs/_docs/generators.md +41 -0
  11. data/docs/_docs/helpers.md +10 -3
  12. data/docs/_docs/helpers/aws.md +15 -0
  13. data/docs/_docs/helpers/aws/iam-role.md +91 -0
  14. data/docs/_docs/helpers/aws/secrets.md +129 -0
  15. data/docs/_docs/helpers/aws/ssm.md +76 -0
  16. data/docs/_docs/helpers/custom.md +40 -0
  17. data/docs/_docs/helpers/google.md +17 -0
  18. data/docs/_docs/helpers/google/secrets.md +76 -0
  19. data/docs/_docs/helpers/google/service-account.md +60 -0
  20. data/docs/_docs/intro.md +3 -1
  21. data/docs/_docs/intro/docker-image.md +66 -0
  22. data/docs/_docs/intro/how-kubes-works.md +7 -11
  23. data/docs/_docs/layering/merge.md +1 -1
  24. data/docs/_docs/learn/dsl/delete.md +10 -2
  25. data/docs/_docs/learn/dsl/review-project.md +2 -2
  26. data/docs/_docs/learn/yaml/delete.md +10 -2
  27. data/docs/_docs/learn/yaml/review-project.md +2 -2
  28. data/docs/_docs/patterns/clock-web-worker.md +3 -3
  29. data/docs/_docs/patterns/migrations.md +1 -1
  30. data/docs/_docs/patterns/secrets.md +0 -2
  31. data/docs/_docs/yaml.md +2 -2
  32. data/docs/_includes/commands.html +2 -2
  33. data/docs/_includes/helpers/base64.md +1 -0
  34. data/docs/_includes/sidebar.html +23 -1
  35. data/docs/_reference/kubes-delete.md +1 -1
  36. data/docs/_reference/kubes-exec.md +17 -1
  37. data/docs/_reference/kubes-init.md +2 -2
  38. data/docs/_reference/kubes-logs.md +2 -1
  39. data/docs/_reference/kubes-new.md +58 -0
  40. data/docs/_reference/kubes-prune.md +22 -0
  41. data/docs/reference.md +2 -0
  42. data/kubes.gemspec +1 -0
  43. data/lib/kubes.rb +2 -0
  44. data/lib/kubes/autoloader.rb +9 -0
  45. data/lib/kubes/cli.rb +9 -1
  46. data/lib/kubes/cli/build.rb +6 -0
  47. data/lib/kubes/cli/compile.rb +7 -0
  48. data/lib/kubes/cli/deploy.rb +1 -6
  49. data/lib/kubes/cli/exec.rb +5 -1
  50. data/lib/kubes/cli/help/exec.md +15 -0
  51. data/lib/kubes/cli/help/new.md +30 -0
  52. data/lib/kubes/cli/init.rb +1 -1
  53. data/lib/kubes/cli/new.rb +97 -0
  54. data/lib/kubes/cli/sequence.rb +1 -0
  55. data/lib/kubes/command.rb +7 -0
  56. data/lib/kubes/compiler.rb +19 -21
  57. data/lib/kubes/compiler/dsl/syntax/job.rb +217 -0
  58. data/lib/kubes/compiler/shared/custom_helpers.rb +17 -0
  59. data/lib/kubes/compiler/shared/helpers.rb +12 -3
  60. data/lib/kubes/compiler/shared/helpers/deprecated.rb +37 -0
  61. data/lib/kubes/compiler/strategy/base.rb +1 -0
  62. data/lib/kubes/compiler/strategy/dsl.rb +1 -0
  63. data/lib/kubes/compiler/strategy/erb.rb +2 -0
  64. data/lib/kubes/config.rb +1 -1
  65. data/lib/kubes/core.rb +6 -0
  66. data/lib/kubes/docker/strategy/image_name.rb +1 -1
  67. data/lib/kubes/kubectl.rb +5 -23
  68. data/lib/kubes/kubectl/batch.rb +27 -33
  69. data/lib/kubes/kubectl/ordering.rb +42 -0
  70. data/lib/kubes/version.rb +1 -1
  71. data/lib/templates/base/.kubes/config.rb.tt +1 -1
  72. data/lib/templates/base/.kubes/config/env/dev.rb +1 -1
  73. data/lib/templates/base/.kubes/config/env/prod.rb +1 -1
  74. data/lib/templates/dsl/.kubes/resources/web/deployment.rb +1 -1
  75. data/lib/templates/new/dsl/backend_config.rb +10 -0
  76. data/lib/templates/new/dsl/config_map.rb +5 -0
  77. data/lib/templates/new/dsl/daemon_set.rb +11 -0
  78. data/lib/templates/new/dsl/deployment.rb +4 -0
  79. data/lib/templates/new/dsl/ingress.rb +3 -0
  80. data/lib/templates/new/dsl/job.rb +2 -0
  81. data/lib/templates/new/dsl/managed_certificate.rb +2 -0
  82. data/lib/templates/new/dsl/namespace.rb +2 -0
  83. data/lib/templates/new/dsl/network_policy.rb +7 -0
  84. data/lib/templates/new/dsl/pod.rb +6 -0
  85. data/lib/templates/new/dsl/role.rb +4 -0
  86. data/lib/templates/new/dsl/role_binding.rb +7 -0
  87. data/lib/templates/new/dsl/secret.rb +5 -0
  88. data/lib/templates/new/dsl/service.rb +2 -0
  89. data/lib/templates/new/dsl/service_account.rb +1 -0
  90. data/lib/templates/new/yaml/backend_config.yaml +10 -0
  91. data/lib/templates/new/yaml/config_map.yaml +9 -0
  92. data/lib/templates/new/yaml/daemon_set.yaml +11 -0
  93. data/lib/templates/new/yaml/deployment.yaml +19 -0
  94. data/lib/templates/new/yaml/ingress.yaml +12 -0
  95. data/lib/templates/new/yaml/job.yaml +19 -0
  96. data/lib/templates/new/yaml/managed_certificate.yaml +7 -0
  97. data/lib/templates/new/yaml/namespace.yaml +6 -0
  98. data/lib/templates/new/yaml/network_policy.yaml +20 -0
  99. data/lib/templates/new/yaml/pod.yaml +11 -0
  100. data/lib/templates/new/yaml/role.yaml +13 -0
  101. data/lib/templates/new/yaml/role_binding.yaml +11 -0
  102. data/lib/templates/new/yaml/secret.yaml +9 -0
  103. data/lib/templates/new/yaml/service.yaml +14 -0
  104. data/lib/templates/new/yaml/service_account.yaml +4 -0
  105. data/lib/templates/yaml/.kubes/resources/base/all.yaml.tt +2 -0
  106. data/lib/templates/yaml/.kubes/resources/web/deployment.yaml.tt +1 -1
  107. data/spec/kubes/cli/prune_spec.rb +1 -0
  108. data/spec/kubes/compiler_spec.rb +5 -1
  109. metadata +65 -2
@@ -0,0 +1,30 @@
1
+ ## Examples
2
+
3
+ $ kubes new ingress
4
+ create .kubes/resources/web/ingress.yaml
5
+ $ kubes new service_account
6
+ create .kubes/resources/shared/service_account.yaml
7
+ $
8
+
9
+ ## Supported Resources
10
+
11
+ Here's a list of some of the supported resources.
12
+
13
+ backend_config
14
+ config_map
15
+ daemon_set
16
+ deployment
17
+ ingress
18
+ job
19
+ managed_certificate
20
+ namespace
21
+ network_policy
22
+ pod
23
+ role_binding
24
+ role
25
+ secret
26
+ service_account
27
+ service
28
+
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
@@ -3,7 +3,7 @@ class Kubes::CLI
3
3
  def self.options
4
4
  [
5
5
  [:app, aliases: ["a"], required: true, desc: "Docker repo name. Example: web. Generates .kubes/APP/resources folder"],
6
- [:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
6
+ [:force, aliases: ["y"], 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
9
  [:namespace, aliases: ["n"], desc: "Namespace to use, defaults to APP-ENV. IE: demo-dev"],
@@ -0,0 +1,97 @@
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
96
+ end
97
+ end
@@ -3,6 +3,7 @@ require 'thor'
3
3
  class Kubes::CLI
4
4
  class Sequence < Thor::Group
5
5
  include Thor::Actions
6
+ include Kubes::Logging
6
7
 
7
8
  private
8
9
  def logger
@@ -28,6 +28,8 @@ module Kubes
28
28
  class Command < Thor
29
29
  class << self
30
30
  def dispatch(m, args, options, config)
31
+ check_project!(args.first)
32
+
31
33
  # Allow calling for help via:
32
34
  # kubes command help
33
35
  # kubes command -h
@@ -54,6 +56,11 @@ module Kubes
54
56
  super
55
57
  end
56
58
 
59
+ def check_project!(command_name)
60
+ return if %w[init new].include?(command_name)
61
+ Kubes.check_project!
62
+ end
63
+
57
64
  # Override command_help to include the description at the top of the
58
65
  # long_description.
59
66
  def command_help(shell, command_name)
@@ -3,6 +3,7 @@ module Kubes
3
3
  include Kubes::Hooks::Concern
4
4
  include Kubes::Logging
5
5
  include Kubes::Util::Consider
6
+ include Kubes::Kubectl::Ordering
6
7
 
7
8
  def initialize(options={})
8
9
  @options = options
@@ -21,7 +22,9 @@ module Kubes
21
22
  end
22
23
  end
23
24
 
24
- puts "Compiled .kubes/resources files to .kubes/output" if show_compiled_message?
25
+ write_full
26
+
27
+ logger.info "Compiled .kubes/resources files to .kubes/output" if show_compiled_message?
25
28
  end
26
29
 
27
30
  def resources
@@ -34,24 +37,6 @@ module Kubes
34
37
  paths
35
38
  end
36
39
 
37
- # Only considering files 2 layers deep. So:
38
- #
39
- # Yes = web/deployment.yaml
40
- # No = web/deployment/dev.yaml
41
- #
42
- def process?(path)
43
- if Kubes.kustomize?
44
- File.file?(path)
45
- else
46
- consider?(path) && two_levels_deep?(path)
47
- end
48
- end
49
-
50
- def two_levels_deep?(path)
51
- rel_path = path.sub(%r{.*\.kubes/resources/},'')
52
- rel_path.split('/').size == 2
53
- end
54
-
55
40
  def write(result)
56
41
  result.decorate!(:post)
57
42
  filename, content = result.filename, result.content
@@ -64,12 +49,25 @@ module Kubes
64
49
  IO.write(dest, content)
65
50
  end
66
51
 
67
- pretty_dest = dest.sub("#{Kubes.root}/",'')
68
- logger.debug "Compiled #{pretty_dest}"
52
+ logger.debug "Compiled #{pretty(dest)}"
53
+ end
54
+
55
+ def write_full
56
+ full = sorted_files.inject([]) do |acc, file|
57
+ acc << IO.read(file)
58
+ end
59
+ content = full.join("\n")
60
+ path = "#{Kubes.root}/.kubes/output/full.yaml"
61
+ IO.write(path, content)
62
+ logger.debug "Compiled #{pretty(path)}"
69
63
  end
70
64
 
71
65
  def show_compiled_message?
72
66
  !%w[g ge get].include?(ARGV.first)
73
67
  end
68
+
69
+ def pretty(path)
70
+ path.sub("#{Kubes.root}/",'')
71
+ end
74
72
  end
75
73
  end
@@ -0,0 +1,217 @@
1
+ module Kubes::Compiler::Dsl::Syntax
2
+ class Job < Resource
3
+ fields :container, # <Object>
4
+ "matchLabels:hash", # <map[string]string>
5
+ :sidecar, # <Object>
6
+ :sidecar_name, # <string>
7
+ :sidecar_image, # <string>
8
+ :templateMetadata, # <Object>
9
+ :templateSpec # <Object>
10
+
11
+ # kubectl explain job.spec
12
+ fields :activeDeadlineSeconds, # <integer>
13
+ :backoffLimit, # <integer>
14
+ :completions, # <integer>
15
+ :manualSelector, # <boolean>
16
+ :parallelism, # <integer>
17
+ :selector, # <Object>
18
+ :template, # <Object> -required-
19
+ :ttlSecondsAfterFinished # <integer>
20
+
21
+
22
+ # kubectl explain job.spec.template.spec
23
+ fields :activeDeadlineSeconds, # <integer>
24
+ :affinity, # <Object>
25
+ :automountServiceAccountToken, # <boolean>
26
+ :containers, # <[]Object> -required-
27
+ :dnsConfig, # <Object>
28
+ :dnsPolicy, # <string>
29
+ :enableServiceLinks, # <boolean>
30
+ :ephemeralContainers, # <[]Object>
31
+ :hostAliases, # <[]Object>
32
+ :hostIPC, # <boolean>
33
+ :hostNetwork, # <boolean>
34
+ :hostPID, # <boolean>
35
+ :hostname, # <string>
36
+ :imagePullSecrets, # <[]Object>
37
+ :initContainers, # <[]Object>
38
+ :nodeName, # <string>
39
+ :nodeSelector, # <map[string]string>
40
+ :overhead, # <map[string]string>
41
+ :preemptionPolicy, # <string>
42
+ :priority, # <integer>
43
+ :priorityClassName, # <string>
44
+ :readinessGates, # <[]Object>
45
+ :restartPolicy, # <string>
46
+ :runtimeClassName, # <string>
47
+ :schedulerName, # <string>
48
+ :securityContext, # <Object>
49
+ :serviceAccount, # <string>
50
+ :serviceAccountName, # <string>
51
+ :shareProcessNamespace, # <boolean>
52
+ :subdomain, # <string>
53
+ :terminationGracePeriodSeconds,# <integer>
54
+ :tolerations, # <[]Object>
55
+ :topologySpreadConstraints, # <[]Object>
56
+ :volumes # <[]Object>
57
+
58
+ # kubectl explain deployment.spec.template.spec.containers
59
+ fields :args, # <[]string>
60
+ :command, # <[]string>
61
+ :env, # <[]Object>
62
+ :envFrom, # <[]Object>
63
+ :image, # <string>
64
+ :imagePullPolicy, # <string>
65
+ :lifecycle, # <Object>
66
+ :livenessProbe, # <Object>
67
+ :containerName, # <string> -required- (originally called name)
68
+ :ports, # <[]Object>
69
+ :readinessProbe, # <Object>
70
+ :resources, # <Object>
71
+ :securityContext, # <Object>
72
+ :startupProbe, # <Object>
73
+ :stdin, # <boolean>
74
+ :stdinOnce, # <boolean>
75
+ :terminationMessagePath, # <string>
76
+ :terminationMessagePolicy, # <string>
77
+ :tty, # <boolean>
78
+ :volumeDevices, # <[]Object>
79
+ :volumeMounts, # <[]Object>
80
+ :workingDir # <string>
81
+
82
+ # kubectl explain deployment.spec.template.spec.containers.ports
83
+ fields :containerPort, # <integer> -required-
84
+ :hostIP, # <string>
85
+ :hostPort, # <integer>
86
+ :portName, # <string> (originally called name)
87
+ :protocol # <string>
88
+
89
+ def default_apiVersion
90
+ "batch/v1"
91
+ end
92
+
93
+ def default_spec
94
+ {
95
+ activeDeadlineSeconds: activeDeadlineSeconds,
96
+ backoffLimit: backoffLimit,
97
+ completions: completions,
98
+ manualSelector: manualSelector,
99
+ parallelism: parallelism,
100
+ selector: selector,
101
+ template: template,
102
+ ttlSecondsAfterFinished: ttlSecondsAfterFinished,
103
+ }
104
+ end
105
+
106
+ def default_matchLabels
107
+ labels
108
+ end
109
+
110
+ def default_template
111
+ {
112
+ metadata: templateMetadata,
113
+ spec: templateSpec,
114
+ }
115
+ end
116
+
117
+ def default_templateSpec
118
+ {
119
+ activeDeadlineSeconds: activeDeadlineSeconds,
120
+ affinity: affinity,
121
+ automountServiceAccountToken: automountServiceAccountToken,
122
+ containers: containers,
123
+ dnsConfig: dnsConfig,
124
+ dnsPolicy: dnsPolicy,
125
+ enableServiceLinks: enableServiceLinks,
126
+ ephemeralContainers: ephemeralContainers,
127
+ hostAliases: hostAliases,
128
+ hostIPC: hostIPC,
129
+ hostNetwork: hostNetwork,
130
+ hostPID: hostPID,
131
+ hostname: hostname,
132
+ imagePullSecrets: imagePullSecrets,
133
+ initContainers: initContainers,
134
+ nodeName: nodeName,
135
+ nodeSelector: nodeSelector,
136
+ overhead: overhead,
137
+ preemptionPolicy: preemptionPolicy,
138
+ priority: priority,
139
+ priorityClassName: priorityClassName,
140
+ readinessGates: readinessGates,
141
+ restartPolicy: restartPolicy,
142
+ runtimeClassName: runtimeClassName,
143
+ schedulerName: schedulerName,
144
+ securityContext: securityContext,
145
+ serviceAccount: serviceAccount,
146
+ serviceAccountName: serviceAccountName,
147
+ shareProcessNamespace: shareProcessNamespace,
148
+ subdomain: subdomain,
149
+ terminationGracePeriodSeconds: terminationGracePeriodSeconds,
150
+ tolerations: tolerations,
151
+ topologySpreadConstraints: topologySpreadConstraints,
152
+ volumes: volumes,
153
+ }
154
+ end
155
+
156
+ def default_templateMetadata
157
+ { labels: labels }
158
+ end
159
+
160
+ def default_containers
161
+ [container, sidecar].compact
162
+ end
163
+
164
+ def default_sidecar
165
+ {
166
+ name: sidecar_name,
167
+ image: sidecar_image,
168
+ }
169
+ end
170
+
171
+ def default_sidecar_name
172
+ "sidecar" if sidecar_image # othewise will create invalid sidecar field w/o image
173
+ end
174
+
175
+ def default_container
176
+ {
177
+ args: args,
178
+ command: command,
179
+ env: env,
180
+ envFrom: envFrom,
181
+ image: image,
182
+ imagePullPolicy: imagePullPolicy,
183
+ lifecycle: lifecycle,
184
+ livenessProbe: livenessProbe,
185
+ name: containerName || name,
186
+ ports: ports,
187
+ readinessProbe: readinessProbe,
188
+ resources: resources,
189
+ securityContext: securityContext,
190
+ startupProbe: startupProbe,
191
+ stdin: stdin,
192
+ stdinOnce: stdinOnce,
193
+ terminationMessagePath: terminationMessagePath,
194
+ terminationMessagePolicy: terminationMessagePolicy,
195
+ tty: tty,
196
+ volumeDevices: volumeDevices,
197
+ volumeMounts: volumeMounts,
198
+ workingDir: workingDir,
199
+ }
200
+ end
201
+
202
+ def default_ports
203
+ [
204
+ containerPort: containerPort,
205
+ hostIP: hostIP,
206
+ hostPort: hostPort,
207
+ name: portName,
208
+ protocol: protocol,
209
+ ]
210
+ end
211
+
212
+ # Override command instead of default_command since we want to change a String to an Array
213
+ def command_reader
214
+ @command.is_a?(String) ? @command.split(' ') : @command # else assume Array
215
+ end
216
+ end
217
+ end