kubes 0.2.3 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +4 -0
  3. data/CHANGELOG.md +17 -0
  4. data/Dockerfile +14 -0
  5. data/docs/_docs/auto-context.md +4 -4
  6. data/docs/_docs/ci/cloudbuild.md +69 -0
  7. data/docs/_docs/config/builder.md +46 -0
  8. data/docs/_docs/config/env.md +3 -3
  9. data/docs/_docs/dsl/resources/service.md +21 -5
  10. data/docs/_docs/learn/dsl/deploy.md +2 -0
  11. data/docs/_docs/learn/dsl/new-project.md +1 -2
  12. data/docs/_docs/learn/yaml/deploy.md +2 -0
  13. data/docs/_docs/learn/yaml/new-project.md +1 -1
  14. data/docs/_includes/intro/install.md +5 -1
  15. data/docs/_includes/learn/cluster.md +21 -4
  16. data/docs/_includes/learn/repo +0 -0
  17. data/docs/_includes/learn/repos.md +10 -0
  18. data/docs/_includes/learn/review.md +2 -2
  19. data/docs/_includes/sidebar.html +6 -0
  20. data/docs/_reference/kubes-apply.md +2 -2
  21. data/docs/_reference/kubes-delete.md +1 -1
  22. data/docs/_reference/kubes-deploy.md +1 -1
  23. data/docs/_reference/kubes-describe.md +24 -0
  24. data/docs/_reference/kubes-exec.md +42 -0
  25. data/docs/_reference/kubes-get.md +27 -0
  26. data/docs/_reference/kubes-init.md +1 -1
  27. data/docs/_reference/kubes-logs.md +26 -0
  28. data/docs/bin/web +1 -1
  29. data/docs/reference.md +4 -0
  30. data/lib/kubes/cli.rb +22 -0
  31. data/lib/kubes/cli/apply.rb +1 -1
  32. data/lib/kubes/cli/base.rb +4 -0
  33. data/lib/kubes/cli/build.rb +2 -2
  34. data/lib/kubes/cli/delete.rb +7 -2
  35. data/lib/kubes/cli/describe.rb +1 -1
  36. data/lib/kubes/cli/docker.rb +2 -2
  37. data/lib/kubes/cli/exec.rb +34 -0
  38. data/lib/kubes/cli/get.rb +3 -1
  39. data/lib/kubes/cli/help/exec.md +24 -0
  40. data/lib/kubes/cli/logs.rb +13 -0
  41. data/lib/kubes/compiler/dsl/syntax/deployment.rb +85 -2
  42. data/lib/kubes/compiler/dsl/syntax/service.rb +11 -0
  43. data/lib/kubes/compiler/shared/helpers.rb +2 -1
  44. data/lib/kubes/config.rb +2 -0
  45. data/lib/kubes/docker.rb +19 -0
  46. data/lib/kubes/docker/strategy/build/base.rb +24 -0
  47. data/lib/kubes/docker/strategy/build/docker.rb +11 -0
  48. data/lib/kubes/docker/strategy/build/gcloud.rb +10 -0
  49. data/lib/kubes/docker/strategy/hooks.rb +9 -0
  50. data/lib/kubes/docker/{base.rb → strategy/image_name.rb} +19 -32
  51. data/lib/kubes/docker/strategy/push/base.rb +9 -0
  52. data/lib/kubes/docker/{push.rb → strategy/push/docker.rb} +2 -5
  53. data/lib/kubes/docker/strategy/push/gcloud.rb +9 -0
  54. data/lib/kubes/docker/strategy/utils.rb +9 -0
  55. data/lib/kubes/hooks/builder.rb +2 -1
  56. data/lib/kubes/kubectl.rb +15 -3
  57. data/lib/kubes/kubectl/batch.rb +8 -1
  58. data/lib/kubes/kubectl/fetch/base.rb +24 -0
  59. data/lib/kubes/kubectl/fetch/deployment.rb +34 -0
  60. data/lib/kubes/kubectl/fetch/pods.rb +21 -0
  61. data/lib/kubes/util/sh.rb +1 -0
  62. data/lib/kubes/version.rb +1 -1
  63. data/lib/templates/dsl/.kubes/resources/web/deployment.rb +2 -1
  64. data/lib/templates/dsl/.kubes/resources/web/service.rb +1 -1
  65. metadata +28 -5
  66. data/lib/kubes/docker/build.rb +0 -22
@@ -33,8 +33,19 @@ module Kubes::Compiler::Dsl::Syntax
33
33
 
34
34
  def default_spec
35
35
  {
36
+ clusterIP: clusterIP,
37
+ externalIPs: externalIPs,
38
+ externalName: externalName,
39
+ externalTrafficPolicy: externalTrafficPolicy,
40
+ healthCheckNodePort: healthCheckNodePort,
41
+ ipFamily: ipFamily,
42
+ loadBalancerIP: loadBalancerIP,
43
+ loadBalancerSourceRanges: loadBalancerSourceRanges,
36
44
  ports: ports,
45
+ publishNotReadyAddresses: publishNotReadyAddresses,
37
46
  selector: selector,
47
+ sessionAffinity: sessionAffinity,
48
+ sessionAffinityConfig: sessionAffinityConfig,
38
49
  type: type,
39
50
  }
40
51
  end
@@ -20,7 +20,8 @@ module Kubes::Compiler::Shared
20
20
  end
21
21
 
22
22
  def extra
23
- ENV['KUBES_EXTRA']
23
+ extra = ENV['KUBES_EXTRA']
24
+ extra&.strip&.empty? ? nil : extra # if blank string then also return nil
24
25
  end
25
26
 
26
27
  def base64(v)
@@ -35,6 +35,8 @@ module Kubes
35
35
 
36
36
  config.repo = nil # expected to be set by .kubes/config.rb
37
37
 
38
+ config.builder = "docker" # IE: docker or gcloud
39
+
38
40
  config
39
41
  end
40
42
 
@@ -0,0 +1,19 @@
1
+ module Kubes
2
+ class Docker
3
+ def initialize(options, name)
4
+ @options = options
5
+ @name = name
6
+ end
7
+
8
+ def run
9
+ strategy = strategy_class.new(@options, @name) # @name: docker or push
10
+ strategy.run
11
+ end
12
+
13
+ def strategy_class
14
+ strategy = Kubes.config.builder.to_s.camelize # IE: Docker or Gcloud
15
+ klass_name = "Kubes::Docker::Strategy::#{@name.camelize}::#{strategy}"
16
+ klass_name.constantize
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module Kubes::Docker::Strategy::Build
2
+ class Base
3
+ extend Memoist
4
+ include Kubes::Docker::Strategy::Utils
5
+
6
+ def initialize(options, name)
7
+ @options, @name = options, name
8
+ end
9
+
10
+ def run
11
+ reserve_image_name
12
+ check_dockerfile!
13
+ perform
14
+ store_image_name
15
+ end
16
+
17
+ def check_dockerfile!
18
+ # Dockerfile is also used in args/default.rb, will have to combine if Dockerfile is made configurable
19
+ return if File.exist?("Dockerfile")
20
+ logger.error "ERROR: The Dockerfile does not exist. Cannot build the docker image without a Dockerfile".color(:red)
21
+ exit 1
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ module Kubes::Docker::Strategy::Build
2
+ class Docker < Base
3
+ def perform
4
+ params = args.flatten.join(' ')
5
+ command = "docker build #{params}"
6
+ run_hooks "build" do
7
+ sh(command)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module Kubes::Docker::Strategy::Build
2
+ class Gcloud < Base
3
+ def perform
4
+ command = "gcloud builds submit --tag #{@@image_name}"
5
+ run_hooks "build" do
6
+ sh(command)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Kubes::Docker::Strategy
2
+ module Hooks
3
+ def run_hooks(name, &block)
4
+ hooks = Kubes::Hooks::Builder.new(name, "#{Kubes.root}/.kubes/config/docker/hooks.rb")
5
+ hooks.build # build hooks
6
+ hooks.run_hooks(&block)
7
+ end
8
+ end
9
+ end
@@ -1,36 +1,6 @@
1
- module Kubes::Docker
2
- class Base
1
+ module Kubes::Docker::Strategy
2
+ module ImageName
3
3
  extend Memoist
4
- include Kubes::Logging
5
- include Kubes::Util::Sh
6
-
7
- def initialize(options={})
8
- @options = options
9
- @name = self.class.name.split('::').last.underscore
10
- end
11
-
12
- def run_hooks(name, &block)
13
- hooks = Kubes::Hooks::Builder.new(name, "#{Kubes.root}/.kubes/config/docker/hooks.rb")
14
- hooks.build # build hooks
15
- hooks.run_hooks(&block)
16
- end
17
-
18
- def args
19
- # base at end in case of redirection. IE: command > /path
20
- custom.args + default.args
21
- end
22
-
23
- def custom
24
- custom = Kubes::Args::Custom.new(@name, "#{Kubes.root}/.kubes/config/docker/args.rb")
25
- custom.build
26
- custom
27
- end
28
- memoize :custom
29
-
30
- def default
31
- Args::Default.new(@name, image_name, @options)
32
- end
33
- memoize :default
34
4
 
35
5
  @@image_name = nil
36
6
  def reserve_image_name
@@ -84,5 +54,22 @@ module Kubes::Docker
84
54
  @git_sha = `cd #{Kubes.root} && git rev-parse --short HEAD`
85
55
  @git_sha.strip!
86
56
  end
57
+
58
+ def args
59
+ # base at end in case of redirection. IE: command > /path
60
+ custom.args + default.args
61
+ end
62
+
63
+ def custom
64
+ custom = Kubes::Args::Custom.new(@name, "#{Kubes.root}/.kubes/config/docker/args.rb")
65
+ custom.build
66
+ custom
67
+ end
68
+ memoize :custom
69
+
70
+ def default
71
+ Kubes::Docker::Args::Default.new(@name, image_name, @options)
72
+ end
73
+ memoize :default
87
74
  end
88
75
  end
@@ -0,0 +1,9 @@
1
+ module Kubes::Docker::Strategy::Push
2
+ class Base
3
+ include Kubes::Docker::Strategy::Utils
4
+
5
+ def initialize(options, name)
6
+ @options, @name = options, name
7
+ end
8
+ end
9
+ end
@@ -1,8 +1,5 @@
1
- module Kubes::Docker
2
- class Push < Base
3
- include Kubes::Logging
4
- include Kubes::Util::Time
5
-
1
+ module Kubes::Docker::Strategy::Push
2
+ class Docker < Base
6
3
  def run
7
4
  update_auth_token
8
5
  start_time = Time.now
@@ -0,0 +1,9 @@
1
+ module Kubes::Docker::Strategy::Push
2
+ class Gcloud < Base
3
+ def run
4
+ run_hooks "push" do
5
+ # noop, gcloud builds submit already pushes the image
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Kubes::Docker::Strategy
2
+ module Utils
3
+ include Kubes::Logging
4
+ include Kubes::Util::Sh
5
+ include Kubes::Util::Time
6
+ include Kubes::Docker::Strategy::ImageName
7
+ include Kubes::Docker::Strategy::Hooks
8
+ end
9
+ end
@@ -23,8 +23,9 @@ module Kubes::Hooks
23
23
  def run_hooks
24
24
  build
25
25
  run_hook("before")
26
- yield if block_given?
26
+ out = yield if block_given?
27
27
  run_hook("after")
28
+ out
28
29
  end
29
30
 
30
31
  def run_hook(type)
@@ -9,17 +9,29 @@ module Kubes
9
9
 
10
10
  def run
11
11
  validate!
12
+
13
+ options = @options.dup
14
+ options[:exit_on_fail] = exit_on_fail unless exit_on_fail.nil?
15
+
12
16
  params = args.flatten.join(' ')
13
17
  command = "kubectl #{@name} #{params}" # @name: apply or delete
14
- options = {}
15
- options[:exit_on_fail] = exit_on_fail unless exit_on_fail.nil?
18
+
16
19
  switch_context do
17
20
  run_hooks(@name) do
18
- sh(command, options)
21
+ if options[:capture]
22
+ capture(command, options)
23
+ else
24
+ sh(command, options)
25
+ end
19
26
  end
20
27
  end
21
28
  end
22
29
 
30
+ def execute(args, options={})
31
+ command = "kubectl #{args}"
32
+ capture(command)
33
+ end
34
+
23
35
  # Useful for kustomize mode
24
36
  def validate!
25
37
  return true unless Kubes.kustomize?
@@ -1,5 +1,6 @@
1
1
  class Kubes::Kubectl
2
2
  class Batch
3
+ include Kubes::Logging
3
4
  include Kubes::Util::Consider
4
5
  include Ordering
5
6
 
@@ -8,8 +9,14 @@ class Kubes::Kubectl
8
9
  end
9
10
 
10
11
  def run
12
+ # @options[:preview] is really only used for kubectl delete
13
+ logger.info "Will run:" if @options[:preview]
11
14
  sorted_files.each do |file|
12
- Kubes::Kubectl.run(@name, @options.merge(file: file))
15
+ if @options[:preview]
16
+ logger.info " kubectl #{@name} -f #{file}"
17
+ else
18
+ Kubes::Kubectl.run(@name, @options.merge(file: file))
19
+ end
13
20
  end
14
21
  end
15
22
 
@@ -0,0 +1,24 @@
1
+ require "json"
2
+
3
+ module Kubes::Kubectl::Fetch
4
+ class Base
5
+ include Kubes::Logging
6
+ include Kubes::Util::Sh
7
+
8
+ def initialize(options={})
9
+ @options = options
10
+ end
11
+
12
+ def fetch_items
13
+ o = {
14
+ capture: true,
15
+ output: "json",
16
+ show_command: false,
17
+ }
18
+ kubectl = Kubes::Kubectl.new(:get, @options.merge(o)) # kubes get -f .kubes/output
19
+ resp = kubectl.run
20
+ data = JSON.load(resp)
21
+ data['items']
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,34 @@
1
+ module Kubes::Kubectl::Fetch
2
+ class Deployment < Base
3
+ def metadata
4
+ items = fetch_items
5
+ # Not checking if deployment exists because kubes will error on `kubes get` from missing deployments already
6
+ deployments = items.select { |i| i['kind'] == "Deployment" }
7
+
8
+ if deployments.size > 1 && !@options[:name]
9
+ names = deployments.map { |d| d['metadata']['name'] }
10
+ logger.info <<~EOL
11
+ INFO: More than one deployment found.
12
+ Deployment names: #{names.join(', ')}
13
+ Using #{names.first}
14
+ Note: You can specify the deployment to use with --name or -n
15
+ EOL
16
+ end
17
+
18
+ deployment = find_deployment(deployments)
19
+ unless deployment
20
+ logger.error "ERROR: No deployment found".color(:red)
21
+ exit 1
22
+ end
23
+ deployment['metadata']
24
+ end
25
+
26
+ def find_deployment(deployments)
27
+ if @options[:name]
28
+ deployments.find { |d| d['metadata']['name'] == @options[:name] }
29
+ else
30
+ deployments.first
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ module Kubes::Kubectl::Fetch
2
+ class Pods < Base
3
+ def show
4
+ items = fetch_items
5
+ # Not checking if deployment exists because kubes will error on `kubes get` from missing deployments already
6
+ deployments = items.select { |i| i['kind'] == "Deployment" }
7
+
8
+ deployments.each do |deployment|
9
+ logger.info "Pods for deployment #{deployment['metadata']['name']}:".color(:green)
10
+ show_for(deployment)
11
+ end
12
+ end
13
+
14
+ def show_for(deployment)
15
+ metadata = deployment['metadata']
16
+ labels = metadata['labels'].map { |k,v| "#{k}=#{v}" }.join(',')
17
+ ns = metadata['namespace']
18
+ sh("kubectl get pod -l #{labels} -n #{ns}")
19
+ end
20
+ end
21
+ end
@@ -32,6 +32,7 @@ module Kubes::Util
32
32
 
33
33
  def capture(command, options={})
34
34
  exit_on_fail = options[:exit_on_fail].nil? ? true : options[:exit_on_fail]
35
+ logger.info "=> #{command}" if options[:show_command]
35
36
  out = `#{command}`.strip
36
37
  unless $?.success?
37
38
  logger.error "ERROR: running #{command}".color(:red)
@@ -1,3 +1,3 @@
1
1
  module Kubes
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -7,4 +7,5 @@ image built_image # IE: user/<%= app %>:kubes-2020-06-13T19-55-16-43afc6e
7
7
  # revisionHistoryLimit 1 # uncomment to reduce old ReplicaSets, default is 10 https://bit.ly/3hqrzyP
8
8
  # maxUnavailable 25
9
9
 
10
- # More docs: kubes.guru/docs/dsl/deployment/
10
+ # More docs: kubes.guru/docs/dsl/resources/deployment/
11
+
@@ -5,4 +5,4 @@ labels(role: "web")
5
5
  # port 80
6
6
  targetPort dockerfile_port # expose port in Dockerfile
7
7
 
8
- # More docs: kubes.guru/docs/dsl/service/
8
+ # More docs: kubes.guru/docs/dsl/resources/service/
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-25 00:00:00.000000000 Z
11
+ date: 2020-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -214,9 +214,11 @@ executables:
214
214
  extensions: []
215
215
  extra_rdoc_files: []
216
216
  files:
217
+ - ".dockerignore"
217
218
  - ".gitignore"
218
219
  - ".rspec"
219
220
  - CHANGELOG.md
221
+ - Dockerfile
220
222
  - Gemfile
221
223
  - Guardfile
222
224
  - LICENSE.txt
@@ -231,7 +233,9 @@ files:
231
233
  - docs/Rakefile
232
234
  - docs/_config.yml
233
235
  - docs/_docs/auto-context.md
236
+ - docs/_docs/ci/cloudbuild.md
234
237
  - docs/_docs/config.md
238
+ - docs/_docs/config/builder.md
235
239
  - docs/_docs/config/docker.md
236
240
  - docs/_docs/config/env.md
237
241
  - docs/_docs/config/kubectl.md
@@ -313,6 +317,8 @@ files:
313
317
  - docs/_includes/layering/layers.md
314
318
  - docs/_includes/learn/cluster.md
315
319
  - docs/_includes/learn/next-steps.md
320
+ - docs/_includes/learn/repo
321
+ - docs/_includes/learn/repos.md
316
322
  - docs/_includes/learn/review.md
317
323
  - docs/_includes/learn/start.md
318
324
  - docs/_includes/reference.md
@@ -325,11 +331,15 @@ files:
325
331
  - docs/_reference/kubes-completion_script.md
326
332
  - docs/_reference/kubes-delete.md
327
333
  - docs/_reference/kubes-deploy.md
334
+ - docs/_reference/kubes-describe.md
328
335
  - docs/_reference/kubes-docker-build.md
329
336
  - docs/_reference/kubes-docker-help.md
330
337
  - docs/_reference/kubes-docker-push.md
331
338
  - docs/_reference/kubes-docker.md
339
+ - docs/_reference/kubes-exec.md
340
+ - docs/_reference/kubes-get.md
332
341
  - docs/_reference/kubes-init.md
342
+ - docs/_reference/kubes-logs.md
333
343
  - docs/_reference/kubes-version.md
334
344
  - docs/_sass/bootstrap-overrides.scss
335
345
  - docs/_sass/buttons.scss
@@ -453,12 +463,15 @@ files:
453
463
  - lib/kubes/cli/deploy.rb
454
464
  - lib/kubes/cli/describe.rb
455
465
  - lib/kubes/cli/docker.rb
466
+ - lib/kubes/cli/exec.rb
456
467
  - lib/kubes/cli/get.rb
457
468
  - lib/kubes/cli/help.rb
458
469
  - lib/kubes/cli/help/completion.md
459
470
  - lib/kubes/cli/help/completion_script.md
460
471
  - lib/kubes/cli/help/deploy.md
472
+ - lib/kubes/cli/help/exec.md
461
473
  - lib/kubes/cli/init.rb
474
+ - lib/kubes/cli/logs.rb
462
475
  - lib/kubes/cli/sequence.rb
463
476
  - lib/kubes/command.rb
464
477
  - lib/kubes/compiler.rb
@@ -510,10 +523,17 @@ files:
510
523
  - lib/kubes/completer/script.sh
511
524
  - lib/kubes/config.rb
512
525
  - lib/kubes/core.rb
526
+ - lib/kubes/docker.rb
513
527
  - lib/kubes/docker/args/default.rb
514
- - lib/kubes/docker/base.rb
515
- - lib/kubes/docker/build.rb
516
- - lib/kubes/docker/push.rb
528
+ - lib/kubes/docker/strategy/build/base.rb
529
+ - lib/kubes/docker/strategy/build/docker.rb
530
+ - lib/kubes/docker/strategy/build/gcloud.rb
531
+ - lib/kubes/docker/strategy/hooks.rb
532
+ - lib/kubes/docker/strategy/image_name.rb
533
+ - lib/kubes/docker/strategy/push/base.rb
534
+ - lib/kubes/docker/strategy/push/docker.rb
535
+ - lib/kubes/docker/strategy/push/gcloud.rb
536
+ - lib/kubes/docker/strategy/utils.rb
517
537
  - lib/kubes/hooks/builder.rb
518
538
  - lib/kubes/hooks/dsl.rb
519
539
  - lib/kubes/kubectl.rb
@@ -522,6 +542,9 @@ files:
522
542
  - lib/kubes/kubectl/args/standard.rb
523
543
  - lib/kubes/kubectl/batch.rb
524
544
  - lib/kubes/kubectl/decider.rb
545
+ - lib/kubes/kubectl/fetch/base.rb
546
+ - lib/kubes/kubectl/fetch/deployment.rb
547
+ - lib/kubes/kubectl/fetch/pods.rb
525
548
  - lib/kubes/kubectl/kustomize.rb
526
549
  - lib/kubes/kubectl/ordering.rb
527
550
  - lib/kubes/logger.rb