kubes 0.2.4 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/docs/_docs/auto-context.md +4 -4
  4. data/docs/_docs/config/builder.md +46 -0
  5. data/docs/_docs/config/env.md +3 -3
  6. data/docs/_docs/dsl/resources/service.md +21 -5
  7. data/docs/_docs/learn/dsl/deploy.md +2 -0
  8. data/docs/_docs/learn/dsl/new-project.md +1 -2
  9. data/docs/_docs/learn/yaml/deploy.md +2 -0
  10. data/docs/_docs/learn/yaml/new-project.md +1 -2
  11. data/docs/_includes/intro/install.md +5 -1
  12. data/docs/_includes/learn/cluster.md +21 -4
  13. data/docs/_includes/learn/repo +0 -0
  14. data/docs/_includes/learn/repos.md +10 -0
  15. data/docs/_includes/learn/review.md +2 -2
  16. data/docs/_includes/sidebar.html +1 -0
  17. data/docs/_reference/kubes-apply.md +2 -2
  18. data/docs/_reference/kubes-delete.md +1 -1
  19. data/docs/_reference/kubes-deploy.md +1 -1
  20. data/docs/_reference/kubes-describe.md +24 -0
  21. data/docs/_reference/kubes-exec.md +42 -0
  22. data/docs/_reference/kubes-get.md +27 -0
  23. data/docs/_reference/kubes-init.md +1 -1
  24. data/docs/_reference/kubes-logs.md +26 -0
  25. data/docs/_sass/theme.scss +2 -1
  26. data/docs/bin/web +1 -1
  27. data/docs/img/logos/kubes-white.png +0 -0
  28. data/docs/index.html +2 -2
  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 +15 -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/config.rb +2 -0
  44. data/lib/kubes/docker.rb +19 -0
  45. data/lib/kubes/docker/strategy/build/base.rb +24 -0
  46. data/lib/kubes/docker/strategy/build/docker.rb +11 -0
  47. data/lib/kubes/docker/strategy/build/gcloud.rb +10 -0
  48. data/lib/kubes/docker/strategy/hooks.rb +9 -0
  49. data/lib/kubes/docker/{base.rb → strategy/image_name.rb} +19 -32
  50. data/lib/kubes/docker/strategy/push/base.rb +9 -0
  51. data/lib/kubes/docker/{push.rb → strategy/push/docker.rb} +2 -5
  52. data/lib/kubes/docker/strategy/push/gcloud.rb +9 -0
  53. data/lib/kubes/docker/strategy/utils.rb +9 -0
  54. data/lib/kubes/hooks/builder.rb +2 -1
  55. data/lib/kubes/kubectl.rb +15 -3
  56. data/lib/kubes/kubectl/batch.rb +8 -1
  57. data/lib/kubes/kubectl/fetch/base.rb +24 -0
  58. data/lib/kubes/kubectl/fetch/deployment.rb +34 -0
  59. data/lib/kubes/kubectl/fetch/pods.rb +21 -0
  60. data/lib/kubes/util/sh.rb +1 -0
  61. data/lib/kubes/version.rb +1 -1
  62. data/lib/templates/dsl/.kubes/resources/web/deployment.rb +2 -1
  63. data/lib/templates/dsl/.kubes/resources/web/service.rb +1 -1
  64. metadata +26 -5
  65. data/lib/kubes/docker/build.rb +0 -22
@@ -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.4"
2
+ VERSION = "0.3.2"
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.4
4
+ version: 0.3.2
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-26 00:00:00.000000000 Z
11
+ date: 2020-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -235,6 +235,7 @@ files:
235
235
  - docs/_docs/auto-context.md
236
236
  - docs/_docs/ci/cloudbuild.md
237
237
  - docs/_docs/config.md
238
+ - docs/_docs/config/builder.md
238
239
  - docs/_docs/config/docker.md
239
240
  - docs/_docs/config/env.md
240
241
  - docs/_docs/config/kubectl.md
@@ -316,6 +317,8 @@ files:
316
317
  - docs/_includes/layering/layers.md
317
318
  - docs/_includes/learn/cluster.md
318
319
  - docs/_includes/learn/next-steps.md
320
+ - docs/_includes/learn/repo
321
+ - docs/_includes/learn/repos.md
319
322
  - docs/_includes/learn/review.md
320
323
  - docs/_includes/learn/start.md
321
324
  - docs/_includes/reference.md
@@ -328,11 +331,15 @@ files:
328
331
  - docs/_reference/kubes-completion_script.md
329
332
  - docs/_reference/kubes-delete.md
330
333
  - docs/_reference/kubes-deploy.md
334
+ - docs/_reference/kubes-describe.md
331
335
  - docs/_reference/kubes-docker-build.md
332
336
  - docs/_reference/kubes-docker-help.md
333
337
  - docs/_reference/kubes-docker-push.md
334
338
  - docs/_reference/kubes-docker.md
339
+ - docs/_reference/kubes-exec.md
340
+ - docs/_reference/kubes-get.md
335
341
  - docs/_reference/kubes-init.md
342
+ - docs/_reference/kubes-logs.md
336
343
  - docs/_reference/kubes-version.md
337
344
  - docs/_sass/bootstrap-overrides.scss
338
345
  - docs/_sass/buttons.scss
@@ -359,6 +366,7 @@ files:
359
366
  - docs/img/logos/filler-logo.png
360
367
  - docs/img/logos/kubes-black.png
361
368
  - docs/img/logos/kubes-sign.png
369
+ - docs/img/logos/kubes-white.png
362
370
  - docs/index.html
363
371
  - docs/js/app.js
364
372
  - docs/opal/app.rb
@@ -456,12 +464,15 @@ files:
456
464
  - lib/kubes/cli/deploy.rb
457
465
  - lib/kubes/cli/describe.rb
458
466
  - lib/kubes/cli/docker.rb
467
+ - lib/kubes/cli/exec.rb
459
468
  - lib/kubes/cli/get.rb
460
469
  - lib/kubes/cli/help.rb
461
470
  - lib/kubes/cli/help/completion.md
462
471
  - lib/kubes/cli/help/completion_script.md
463
472
  - lib/kubes/cli/help/deploy.md
473
+ - lib/kubes/cli/help/exec.md
464
474
  - lib/kubes/cli/init.rb
475
+ - lib/kubes/cli/logs.rb
465
476
  - lib/kubes/cli/sequence.rb
466
477
  - lib/kubes/command.rb
467
478
  - lib/kubes/compiler.rb
@@ -513,10 +524,17 @@ files:
513
524
  - lib/kubes/completer/script.sh
514
525
  - lib/kubes/config.rb
515
526
  - lib/kubes/core.rb
527
+ - lib/kubes/docker.rb
516
528
  - lib/kubes/docker/args/default.rb
517
- - lib/kubes/docker/base.rb
518
- - lib/kubes/docker/build.rb
519
- - lib/kubes/docker/push.rb
529
+ - lib/kubes/docker/strategy/build/base.rb
530
+ - lib/kubes/docker/strategy/build/docker.rb
531
+ - lib/kubes/docker/strategy/build/gcloud.rb
532
+ - lib/kubes/docker/strategy/hooks.rb
533
+ - lib/kubes/docker/strategy/image_name.rb
534
+ - lib/kubes/docker/strategy/push/base.rb
535
+ - lib/kubes/docker/strategy/push/docker.rb
536
+ - lib/kubes/docker/strategy/push/gcloud.rb
537
+ - lib/kubes/docker/strategy/utils.rb
520
538
  - lib/kubes/hooks/builder.rb
521
539
  - lib/kubes/hooks/dsl.rb
522
540
  - lib/kubes/kubectl.rb
@@ -525,6 +543,9 @@ files:
525
543
  - lib/kubes/kubectl/args/standard.rb
526
544
  - lib/kubes/kubectl/batch.rb
527
545
  - lib/kubes/kubectl/decider.rb
546
+ - lib/kubes/kubectl/fetch/base.rb
547
+ - lib/kubes/kubectl/fetch/deployment.rb
548
+ - lib/kubes/kubectl/fetch/pods.rb
528
549
  - lib/kubes/kubectl/kustomize.rb
529
550
  - lib/kubes/kubectl/ordering.rb
530
551
  - lib/kubes/logger.rb