kubes 0.2.2 → 0.3.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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +4 -0
  3. data/CHANGELOG.md +18 -1
  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/deployment.md +0 -5
  10. data/docs/_docs/dsl/resources/network_policy.md +1 -1
  11. data/docs/_docs/dsl/resources/service.md +21 -5
  12. data/docs/_docs/helpers.md +2 -2
  13. data/docs/_docs/learn/dsl/deploy.md +2 -0
  14. data/docs/_docs/learn/dsl/new-project.md +1 -2
  15. data/docs/_docs/learn/yaml/deploy.md +2 -0
  16. data/docs/_docs/learn/yaml/new-project.md +1 -1
  17. data/docs/_docs/learn/yaml/review-project.md +0 -5
  18. data/docs/_docs/yaml.md +0 -5
  19. data/docs/_includes/intro/install.md +5 -1
  20. data/docs/_includes/learn/cluster.md +21 -4
  21. data/docs/_includes/learn/repo +0 -0
  22. data/docs/_includes/learn/repos.md +10 -0
  23. data/docs/_includes/learn/review.md +2 -2
  24. data/docs/_includes/sidebar.html +6 -0
  25. data/docs/_reference/kubes-apply.md +2 -2
  26. data/docs/_reference/kubes-delete.md +1 -1
  27. data/docs/_reference/kubes-deploy.md +1 -1
  28. data/docs/_reference/kubes-describe.md +24 -0
  29. data/docs/_reference/kubes-exec.md +42 -0
  30. data/docs/_reference/kubes-get.md +27 -0
  31. data/docs/_reference/kubes-init.md +1 -1
  32. data/docs/_reference/kubes-logs.md +26 -0
  33. data/docs/bin/web +1 -1
  34. data/docs/reference.md +4 -0
  35. data/lib/kubes/cli.rb +21 -0
  36. data/lib/kubes/cli/apply.rb +1 -1
  37. data/lib/kubes/cli/base.rb +4 -0
  38. data/lib/kubes/cli/build.rb +2 -2
  39. data/lib/kubes/cli/delete.rb +7 -2
  40. data/lib/kubes/cli/describe.rb +1 -1
  41. data/lib/kubes/cli/docker.rb +2 -2
  42. data/lib/kubes/cli/exec.rb +33 -0
  43. data/lib/kubes/cli/get.rb +3 -1
  44. data/lib/kubes/cli/help/exec.md +17 -0
  45. data/lib/kubes/cli/logs.rb +13 -0
  46. data/lib/kubes/compiler/dsl/syntax/deployment.rb +77 -10
  47. data/lib/kubes/compiler/dsl/syntax/service.rb +11 -0
  48. data/lib/kubes/compiler/shared/helpers.rb +2 -1
  49. data/lib/kubes/config.rb +2 -0
  50. data/lib/kubes/docker.rb +19 -0
  51. data/lib/kubes/docker/strategy/build/base.rb +24 -0
  52. data/lib/kubes/docker/strategy/build/docker.rb +11 -0
  53. data/lib/kubes/docker/strategy/build/gcloud.rb +10 -0
  54. data/lib/kubes/docker/strategy/hooks.rb +9 -0
  55. data/lib/kubes/docker/{base.rb → strategy/image_name.rb} +19 -32
  56. data/lib/kubes/docker/strategy/push/base.rb +9 -0
  57. data/lib/kubes/docker/{push.rb → strategy/push/docker.rb} +2 -5
  58. data/lib/kubes/docker/strategy/push/gcloud.rb +9 -0
  59. data/lib/kubes/docker/strategy/utils.rb +9 -0
  60. data/lib/kubes/hooks/builder.rb +2 -1
  61. data/lib/kubes/kubectl.rb +15 -3
  62. data/lib/kubes/kubectl/batch.rb +8 -1
  63. data/lib/kubes/kubectl/fetch/base.rb +24 -0
  64. data/lib/kubes/kubectl/fetch/deployment.rb +34 -0
  65. data/lib/kubes/kubectl/fetch/pods.rb +21 -0
  66. data/lib/kubes/util/sh.rb +1 -0
  67. data/lib/kubes/version.rb +1 -1
  68. data/lib/templates/dsl/.kubes/resources/web/deployment.rb +3 -1
  69. data/lib/templates/dsl/.kubes/resources/web/service.rb +1 -1
  70. data/lib/templates/yaml/.kubes/resources/web/deployment.yaml.tt +0 -5
  71. metadata +28 -5
  72. 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
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.2"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -5,5 +5,7 @@ replicas 1
5
5
  image built_image # IE: user/<%= app %>:kubes-2020-06-13T19-55-16-43afc6e
6
6
 
7
7
  # revisionHistoryLimit 1 # uncomment to reduce old ReplicaSets, default is 10 https://bit.ly/3hqrzyP
8
+ # maxUnavailable 25
9
+
10
+ # More docs: kubes.guru/docs/dsl/resources/deployment/
8
11
 
9
- # More docs: kubes.guru/docs/dsl/deployment/
@@ -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/
@@ -9,11 +9,6 @@ spec:
9
9
  selector:
10
10
  matchLabels:
11
11
  role: web
12
- strategy:
13
- rollingUpdate:
14
- maxSurge: 25
15
- maxUnavailable: 25
16
- type: RollingUpdate
17
12
  template:
18
13
  metadata:
19
14
  labels:
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.2
4
+ version: 0.3.0
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-18 00:00:00.000000000 Z
11
+ date: 2020-08-01 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