kubes 0.3.5 → 0.4.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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/README.md +6 -5
  4. data/docs/_docs/config/args.md +10 -0
  5. data/docs/_docs/config/args/docker.md +19 -0
  6. data/docs/_docs/config/{kubectl/args.md → args/kubectl.md} +2 -0
  7. data/docs/_docs/config/docker.md +4 -40
  8. data/docs/_docs/config/hooks.md +10 -0
  9. data/docs/_docs/config/hooks/docker.md +70 -0
  10. data/docs/_docs/config/hooks/kubectl.md +83 -0
  11. data/docs/_docs/config/hooks/kubes.md +67 -0
  12. data/docs/_docs/config/hooks/ruby.md +74 -0
  13. data/docs/_docs/config/kubectl.md +2 -2
  14. data/docs/_docs/config/reference.md +20 -0
  15. data/docs/_docs/config/skip.md +58 -0
  16. data/docs/_docs/dsl/resources.md +1 -1
  17. data/docs/_docs/intro.md +3 -1
  18. data/docs/_docs/patterns/migrations.md +121 -0
  19. data/docs/_includes/config/hooks/options.md +20 -0
  20. data/docs/_includes/sidebar.html +25 -12
  21. data/docs/_sass/theme.scss +25 -1
  22. data/lib/kubes/cli.rb +20 -5
  23. data/lib/kubes/cli/apply.rb +2 -1
  24. data/lib/kubes/cli/base.rb +11 -0
  25. data/lib/kubes/cli/delete.rb +1 -1
  26. data/lib/kubes/cli/exec.rb +37 -6
  27. data/lib/kubes/cli/get.rb +1 -1
  28. data/lib/kubes/cli/logs.rb +27 -3
  29. data/lib/kubes/cli/prune.rb +95 -0
  30. data/lib/kubes/compiler.rb +18 -7
  31. data/lib/kubes/compiler/decorator/base.rb +7 -1
  32. data/lib/kubes/compiler/decorator/{resources/secret.rb → hashable.rb} +5 -4
  33. data/lib/kubes/compiler/decorator/hashable/field.rb +53 -0
  34. data/lib/kubes/compiler/decorator/hashable/storage.rb +19 -0
  35. data/lib/kubes/compiler/decorator/post.rb +77 -0
  36. data/lib/kubes/compiler/decorator/pre.rb +12 -0
  37. data/lib/kubes/compiler/strategy.rb +2 -2
  38. data/lib/kubes/compiler/strategy/base.rb +1 -1
  39. data/lib/kubes/compiler/strategy/result.rb +4 -6
  40. data/lib/kubes/config.rb +16 -11
  41. data/lib/kubes/docker/strategy/build/docker.rb +1 -1
  42. data/lib/kubes/docker/strategy/build/gcloud.rb +1 -1
  43. data/lib/kubes/docker/strategy/image_name.rb +1 -1
  44. data/lib/kubes/docker/strategy/push/docker.rb +1 -1
  45. data/lib/kubes/docker/strategy/push/gcloud.rb +1 -1
  46. data/lib/kubes/docker/strategy/utils.rb +1 -1
  47. data/lib/kubes/hooks/builder.rb +29 -15
  48. data/lib/kubes/hooks/concern.rb +10 -0
  49. data/lib/kubes/hooks/dsl.rb +2 -1
  50. data/lib/kubes/hooks/runner.rb +22 -0
  51. data/lib/kubes/kubectl.rb +21 -18
  52. data/lib/kubes/kubectl/batch.rb +8 -5
  53. data/lib/kubes/kubectl/{decider.rb → dispatcher.rb} +1 -1
  54. data/lib/kubes/kubectl/fetch/base.rb +12 -9
  55. data/lib/kubes/kubectl/fetch/deployment.rb +12 -13
  56. data/lib/kubes/kubectl/fetch/pods.rb +4 -15
  57. data/lib/kubes/kubectl/kustomize.rb +1 -1
  58. data/lib/kubes/kubectl/ordering.rb +12 -0
  59. data/lib/kubes/util/consider.rb +2 -1
  60. data/lib/kubes/util/sh.rb +1 -1
  61. data/lib/kubes/version.rb +1 -1
  62. data/spec/fixtures/decorators/deployment/both/envFrom.yaml +31 -0
  63. data/spec/fixtures/prune/capture.yaml +57 -0
  64. data/spec/fixtures/prune/fetch_items.yaml +268 -0
  65. data/spec/kubes/cli/prune_spec.rb +38 -0
  66. data/spec/kubes/compiler/decorator/{resources → post}/deployment_spec.rb +25 -6
  67. data/spec/kubes/compiler/decorator/{resources → post}/pod_spec.rb +2 -11
  68. metadata +35 -19
  69. data/docs/_docs/config/kubectl/hooks.md +0 -39
  70. data/lib/kubes/compiler/decorator.rb +0 -17
  71. data/lib/kubes/compiler/decorator/compile.rb +0 -12
  72. data/lib/kubes/compiler/decorator/resources/base.rb +0 -13
  73. data/lib/kubes/compiler/decorator/resources/container.rb +0 -76
  74. data/lib/kubes/compiler/decorator/resources/container/mapping.rb +0 -28
  75. data/lib/kubes/compiler/decorator/resources/deployment.rb +0 -10
  76. data/lib/kubes/compiler/decorator/resources/pod.rb +0 -10
  77. data/lib/kubes/compiler/decorator/write.rb +0 -14
  78. data/lib/kubes/docker/strategy/hooks.rb +0 -9
@@ -1,21 +1,10 @@
1
1
  module Kubes::Kubectl::Fetch
2
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
3
+ extend Memoist
13
4
 
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}")
5
+ def show
6
+ return unless namespace
7
+ sh("kubectl get pod -n #{namespace}")
19
8
  end
20
9
  end
21
10
  end
@@ -5,7 +5,7 @@ class Kubes::Kubectl
5
5
 
6
6
  def detect?
7
7
  expr = "#{Kubes.root}/.kubes/resources/**/*"
8
- !!Dir.glob(expr).detect { |p| p.include?("kustomization.yaml") }
8
+ !!Dir.glob(expr).detect { |p| p.include?("kustomization.y") } # allow for both .yml and .yaml to work
9
9
  end
10
10
  memoize :detect?
11
11
  end
@@ -12,9 +12,21 @@ class Kubes::Kubectl
12
12
 
13
13
  "#{role_i}/#{kind_i}"
14
14
  end
15
+
16
+ sorted = filter_files(sorted)
17
+
15
18
  @name == "delete" ? sorted.reverse : sorted
16
19
  end
17
20
 
21
+ def filter_files(sorted)
22
+ skip = Kubes.config.skip
23
+ skip += ENV['KUBES_SKIP'].split(' ') if ENV['KUBES_SKIP']
24
+ return sorted if skip.empty?
25
+ sorted.reject do |file|
26
+ skip.detect { |text| file.include?(text) }
27
+ end
28
+ end
29
+
18
30
  # type: kinds or roles
19
31
  # value: Examples: kind: deployment, role: web
20
32
  def index_for(type, value)
@@ -3,7 +3,8 @@ module Kubes::Util
3
3
  def consider?(path)
4
4
  File.file?(path) &&
5
5
  !path.include?('/resources/base') &&
6
- !path.include?('/base.yaml')
6
+ !path.include?('/base.yaml') &&
7
+ !path.include?('/base.yml')
7
8
  end
8
9
  end
9
10
  end
@@ -30,7 +30,7 @@ module Kubes::Util
30
30
  success
31
31
  end
32
32
 
33
- def capture(command, options={})
33
+ def sh_capture(command, options={})
34
34
  exit_on_fail = options[:exit_on_fail].nil? ? true : options[:exit_on_fail]
35
35
  logger.info "=> #{command}" if options[:show_command]
36
36
  out = `#{command}`.strip
@@ -1,3 +1,3 @@
1
1
  module Kubes
2
- VERSION = "0.3.5"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -0,0 +1,31 @@
1
+ ---
2
+ metadata:
3
+ namespace: default
4
+ labels:
5
+ app: demo
6
+ role: web
7
+ name: demo-web
8
+ spec:
9
+ selector:
10
+ matchLabels:
11
+ app: demo
12
+ role: web
13
+ template:
14
+ metadata:
15
+ labels:
16
+ app: demo
17
+ role: web
18
+ spec:
19
+ containers:
20
+ - name: demo-web
21
+ image: gcr.io/project/demo-web:kubes-2020-06-23T00-07-54
22
+ envFrom:
23
+ - secretRef:
24
+ name: demo-secret
25
+ - configMapRef:
26
+ name: demo-config-map
27
+ - configMapRef:
28
+ name: demo-config-map-2
29
+ replicas: 1
30
+ apiVersion: apps/v1
31
+ kind: Deployment
@@ -0,0 +1,57 @@
1
+ ---
2
+ - apiVersion: v1
3
+ data:
4
+ ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLekNDQWhPZ0F3SUJBZ0lSQUw5UTRFZXFyS0t2ZXYwWFhaMCtMOFV3RFFZSktvWklodmNOQVFFTEJRQXcKTHpFdE1Dc0dBMVVFQXhNa05UUXpPVGczWXpBdE5qRTRaaTAwTlRRMkxXRTRNemt0WmpBd016WmlaR0ZrTURRMgpNQjRYRFRJd01UQXdOakl4TkRNeE5Gb1hEVEkxTVRBd05USXlORE14TkZvd0x6RXRNQ3NHQTFVRUF4TWtOVFF6Ck9UZzNZekF0TmpFNFppMDBOVFEyTFdFNE16a3RaakF3TXpaaVpHRmtNRFEyTUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdGhoK2xLbTRjNm4zSjl3ZWFxQTdYRFFPSFNlOUw1VmRYOUJiem5lcQpLR21nM0pFWkVQWHJvZ3B5YmpYNFU5NXJuTUNWM2JPQkhYaFJaaGZibE5wdlVJTlZVdnl0Y1ZpMDkzU1JaUFB6CkgwTmV4Z0YxVFUrWi85VlRWWDhZNHBoaURiR0pCdnFGV1JxWTV3OGpTSUhad2lOd04vSlQ1VFIxZEJNWC9CN1cKNGNxMHRjQjNwVkxnZDJPcThSODdhdm9rZzQ5a1BHd3J1WUZJTVppTTM2VldmOWNFV3duVnp5WEV3UDhhT21kZApmaDFEL2oydk1obmg3THZjS09NbVRaQWJrSy80YjlqMjVjTU1TNTdoZDFwU0hCdFRCcmRrNnA5Tjcxd2MyeUkzCm5KektBQ1U0WG1NRzRodGlzQlFTTjRzUGxlNHZhT1FLSGtlSFY1aFVGZkhFYXdJREFRQUJvMEl3UURBT0JnTlYKSFE4QkFmOEVCQU1DQWdRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUxiWU82S1drVnVHVgpkSTE3c3dRQkpORC9NTGN3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUhqc1lXZUhzU2VOc01XTzl4SGxsVWpUCjBHU0I5USt2aXNQejNBVWdUNy9uQU0wRW1kREdIQjFhVzVPQ2FTTXVtRWFhMHVkQjVkbTV1c1pQUEN5cDFrckUKdS90UUxmVStPQmtmZE1keTZFREdEcHJtVmsxWW1xa2FvWjFGUWZKQXI0WGRGQVB1OWM4WVJqaUlxMFV0c1c3cQo1dDc4SjBhYmtpdGxncW5kcWI5WHpkWEI5NUZmajF2Sk9hbnFWWGlYQzBIeVExNlJWUEtCOG5tajYzL1pjeFdECkIzdGlOUG9hUmF0cVhoL293MDYxRlRGWHQzNUZnV01QeWlWWXMzTG5HNFZQRHRibFBqSXRxaC9BSTl3ZXNEbUoKdCt4TkgreHk2L3JPTmY3YldvZjM1cWxXVnVBQjdIOXk0NTFGd3VBd3ZNY3B1cHNIenNrTGNCY3UvYUxmT0prPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
5
+ namespace: Z2FyZGVu
6
+ token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNkluWlNRMTlTWlhoMWVqSnRlbnBYVTNwdFRETmhXa1UxWjJsU1NGQTNVVFZ1Um5KM1dubE1TR3czUzI4aWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpuWVhKa1pXNGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObFkzSmxkQzV1WVcxbElqb2laR1ZtWVhWc2RDMTBiMnRsYmkxeGR6ZHVjQ0lzSW10MVltVnlibVYwWlhNdWFXOHZjMlZ5ZG1salpXRmpZMjkxYm5RdmMyVnlkbWxqWlMxaFkyTnZkVzUwTG01aGJXVWlPaUprWldaaGRXeDBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5elpYSjJhV05sTFdGalkyOTFiblF1ZFdsa0lqb2lZekE0T1RWalpUSXRZV00xWlMwME5HUmtMV0UxTlRZdFpEY3lOR1pqTlRkaE1qSTJJaXdpYzNWaUlqb2ljM2x6ZEdWdE9uTmxjblpwWTJWaFkyTnZkVzUwT21kaGNtUmxianBrWldaaGRXeDBJbjAuRFpFTDNFZURHa182WEhlVWJ2QWJGanZ1aDBROHdKMmFpWTI2YWk2UVdPQTVSVlV1Ulcwbkx6c2VnVVBvN0dkR1g0ejAtUGpKNGY3bzJGRjMxVHh1ZVF0MkJUMW1nZGdONVVDR1ZCY0xuVVRURzdZZVJPUzFhd3FUQ2pYWDgzTG03VDQ2R3Fmbi1tVWkxUnVNdUlvUm1KRWVTYUxaekdPNFFPOGhBVTVOaTJJNTBYblRUQXJ3TW84TS1mZjI0N3U1RmMyaFVWUndmZW9DdVAxNVJEU05DUk1rSVBYaGMxOEFxUkZLc1l5T3JJRHNWcGFuNFIwRXQwM3pUOTVjeE8wZEowd1dBeXFiVUw0M3VvaTZaa0NnNmRrb191Z1FuNWgtcEFlYjJybGNIbDNFUUdNcl9QTndVWDI0OVNyeG02MW1Pa25fMHlZMS1DQkVUWG5CUEtHRW5R
7
+ kind: Secret
8
+ metadata:
9
+ annotations:
10
+ kubernetes.io/service-account.name: default
11
+ kubernetes.io/service-account.uid: c0895ce2-ac5e-44dd-a556-d724fc57a226
12
+ creationTimestamp: '2020-10-07T19:04:11Z'
13
+ name: default-token-qw7np
14
+ namespace: garden
15
+ resourceVersion: '486470'
16
+ selfLink: "/api/v1/namespaces/garden/secrets/default-token-qw7np"
17
+ uid: ec42ba8b-7c03-4ab2-9e95-5a144b3f5938
18
+ type: kubernetes.io/service-account-token
19
+ - apiVersion: v1
20
+ data:
21
+ foo: Zm9vCg==
22
+ password: cGFzcw==
23
+ username: dXNlcg==
24
+ kind: Secret
25
+ metadata:
26
+ annotations:
27
+ kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"v1","data":{"foo":"Zm9vCg==","password":"cGFzcw==","username":"dXNlcg=="},"kind":"Secret","metadata":{"annotations":{},"labels":{"app":"garden"},"name":"demo-secret-CURRENT111","namespace":"garden"}}
28
+
29
+ '
30
+ creationTimestamp: '2020-10-08T19:42:41Z'
31
+ labels:
32
+ app: garden
33
+ name: demo-secret-CURRENT111
34
+ namespace: garden
35
+ resourceVersion: '1075012'
36
+ selfLink: "/api/v1/namespaces/garden/secrets/demo-secret-CURRENT111"
37
+ uid: 63c386ad-0069-4767-b0b8-e70dbafb7c9c
38
+ type: Opaque
39
+ - apiVersion: v1
40
+ data:
41
+ password: cGFzcw==
42
+ username: dXNlcg==
43
+ kind: Secret
44
+ metadata:
45
+ annotations:
46
+ kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"v1","data":{"password":"cGFzcw==","username":"dXNlcg=="},"kind":"Secret","metadata":{"annotations":{},"labels":{"app":"garden"},"name":"demo-secret-OLD1111111","namespace":"garden"}}
47
+
48
+ '
49
+ creationTimestamp: '2020-10-07T19:04:12Z'
50
+ labels:
51
+ app: garden
52
+ name: demo-secret-OLD1111111
53
+ namespace: garden
54
+ resourceVersion: '486474'
55
+ selfLink: "/api/v1/namespaces/garden/secrets/demo-secret-OLD1111111"
56
+ uid: a45afce3-a418-478e-8e13-b6e6041ad2e1
57
+ type: Opaque
@@ -0,0 +1,268 @@
1
+ ---
2
+ - apiVersion: apps/v1
3
+ kind: Deployment
4
+ metadata:
5
+ annotations:
6
+ deployment.kubernetes.io/revision: '2'
7
+ kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"garden","role":"clock"},"name":"clock","namespace":"garden"},"spec":{"replicas":1,"revisionHistoryLimit":0,"selector":{"matchLabels":{"app":"garden","role":"clock"}},"template":{"metadata":{"labels":{"app":"garden","role":"clock"}},"spec":{"containers":[{"envFrom":[{"secretRef":{"name":"demo-secret-OLD1111111"}}],"image":"gcr.io/PROJECT/secret:kubes-2020-10-08T19-42-34-a428e44","name":"clock"}]}}}}
8
+
9
+ '
10
+ creationTimestamp: '2020-10-08T02:24:30Z'
11
+ generation: 3
12
+ labels:
13
+ app: garden
14
+ role: clock
15
+ name: clock
16
+ namespace: garden
17
+ resourceVersion: '1076690'
18
+ selfLink: "/apis/apps/v1/namespaces/garden/deployments/clock"
19
+ uid: 6c6234bd-e7e8-421c-856d-10e6f0ae18df
20
+ spec:
21
+ progressDeadlineSeconds: 600
22
+ replicas: 1
23
+ revisionHistoryLimit: 0
24
+ selector:
25
+ matchLabels:
26
+ app: garden
27
+ role: clock
28
+ strategy:
29
+ rollingUpdate:
30
+ maxSurge: 25%
31
+ maxUnavailable: 25%
32
+ type: RollingUpdate
33
+ template:
34
+ metadata:
35
+ creationTimestamp:
36
+ labels:
37
+ app: garden
38
+ role: clock
39
+ spec:
40
+ containers:
41
+ - envFrom:
42
+ - secretRef:
43
+ name: demo-secret-OLD1111111
44
+ image: gcr.io/PROJECT/secret:kubes-2020-10-08T19-42-34-a428e44
45
+ imagePullPolicy: IfNotPresent
46
+ name: clock
47
+ resources: {}
48
+ terminationMessagePath: "/dev/termination-log"
49
+ terminationMessagePolicy: File
50
+ dnsPolicy: ClusterFirst
51
+ restartPolicy: Always
52
+ schedulerName: default-scheduler
53
+ securityContext: {}
54
+ terminationGracePeriodSeconds: 30
55
+ status:
56
+ availableReplicas: 1
57
+ conditions:
58
+ - lastTransitionTime: '2020-10-08T02:24:31Z'
59
+ lastUpdateTime: '2020-10-08T19:42:45Z'
60
+ message: ReplicaSet "clock-6f9f9d47cb" has successfully progressed.
61
+ reason: NewReplicaSetAvailable
62
+ status: 'True'
63
+ type: Progressing
64
+ - lastTransitionTime: '2020-10-08T19:46:34Z'
65
+ lastUpdateTime: '2020-10-08T19:46:34Z'
66
+ message: Deployment has minimum availability.
67
+ reason: MinimumReplicasAvailable
68
+ status: 'True'
69
+ type: Available
70
+ observedGeneration: 3
71
+ readyReplicas: 1
72
+ replicas: 1
73
+ updatedReplicas: 1
74
+ - apiVersion: batch/v1
75
+ kind: Job
76
+ metadata:
77
+ annotations:
78
+ kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"migrate","namespace":"garden"},"spec":{"backoffLimit":4,"template":{"spec":{"containers":[{"command":["sleep","60"],"envFrom":[{"secretRef":{"name":"demo-secret-CURRENT111"}}],"image":"gcr.io/PROJECT/secret:kubes-2020-10-07T20-12-16-84dbc4e","name":"migrate"}],"restartPolicy":"Never"}}}}
79
+
80
+ '
81
+ creationTimestamp: '2020-10-07T20:12:29Z'
82
+ labels:
83
+ controller-uid: a5dbf73c-a49f-4eca-993e-7ab6db0946c8
84
+ job-name: migrate
85
+ name: migrate
86
+ namespace: garden
87
+ resourceVersion: '514227'
88
+ selfLink: "/apis/batch/v1/namespaces/garden/jobs/migrate"
89
+ uid: a5dbf73c-a49f-4eca-993e-7ab6db0946c8
90
+ spec:
91
+ backoffLimit: 4
92
+ completions: 1
93
+ parallelism: 1
94
+ selector:
95
+ matchLabels:
96
+ controller-uid: a5dbf73c-a49f-4eca-993e-7ab6db0946c8
97
+ template:
98
+ metadata:
99
+ creationTimestamp:
100
+ labels:
101
+ controller-uid: a5dbf73c-a49f-4eca-993e-7ab6db0946c8
102
+ job-name: migrate
103
+ spec:
104
+ containers:
105
+ - command:
106
+ - sleep
107
+ - '60'
108
+ envFrom:
109
+ - secretRef:
110
+ name: demo-secret-CURRENT111
111
+ image: gcr.io/PROJECT/secret:kubes-2020-10-07T20-12-16-84dbc4e
112
+ imagePullPolicy: IfNotPresent
113
+ name: migrate
114
+ resources: {}
115
+ terminationMessagePath: "/dev/termination-log"
116
+ terminationMessagePolicy: File
117
+ dnsPolicy: ClusterFirst
118
+ restartPolicy: Never
119
+ schedulerName: default-scheduler
120
+ securityContext: {}
121
+ terminationGracePeriodSeconds: 30
122
+ status:
123
+ completionTime: '2020-10-07T20:13:31Z'
124
+ conditions:
125
+ - lastProbeTime: '2020-10-07T20:13:31Z'
126
+ lastTransitionTime: '2020-10-07T20:13:31Z'
127
+ status: 'True'
128
+ type: Complete
129
+ startTime: '2020-10-07T20:12:29Z'
130
+ succeeded: 1
131
+ - apiVersion: v1
132
+ kind: Namespace
133
+ metadata:
134
+ annotations:
135
+ kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"labels":{"app":"garden"},"name":"garden"}}
136
+
137
+ '
138
+ creationTimestamp: '2020-10-07T19:04:11Z'
139
+ labels:
140
+ app: garden
141
+ name: garden
142
+ resourceVersion: '486464'
143
+ selfLink: "/api/v1/namespaces/garden"
144
+ uid: 3db2c4cf-40b9-42cd-96f4-7f0aebff80e1
145
+ spec:
146
+ finalizers:
147
+ - kubernetes
148
+ status:
149
+ phase: Active
150
+ - apiVersion: v1
151
+ data:
152
+ foo: Zm9vCg==
153
+ password: cGFzcw==
154
+ username: dXNlcg==
155
+ kind: Secret
156
+ metadata:
157
+ annotations:
158
+ kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"v1","data":{"foo":"Zm9vCg==","password":"cGFzcw==","username":"dXNlcg=="},"kind":"Secret","metadata":{"annotations":{},"labels":{"app":"garden"},"name":"demo-secret-OLD1111111","namespace":"garden"}}
159
+
160
+ '
161
+ creationTimestamp: '2020-10-08T19:42:41Z'
162
+ labels:
163
+ app: garden
164
+ name: demo-secret-OLD1111111
165
+ namespace: garden
166
+ resourceVersion: '1075012'
167
+ selfLink: "/api/v1/namespaces/garden/secrets/demo-secret-OLD1111111"
168
+ uid: 63c386ad-0069-4767-b0b8-e70dbafb7c9c
169
+ type: Opaque
170
+ - apiVersion: apps/v1
171
+ kind: Deployment
172
+ metadata:
173
+ annotations:
174
+ deployment.kubernetes.io/revision: '5'
175
+ kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"garden","role":"web"},"name":"web","namespace":"garden"},"spec":{"replicas":1,"revisionHistoryLimit":0,"selector":{"matchLabels":{"app":"garden","role":"web"}},"template":{"metadata":{"labels":{"app":"garden","role":"web"}},"spec":{"containers":[{"envFrom":[{"secretRef":{"name":"demo-secret-OLD1111111"}}],"image":"gcr.io/PROJECT/secret:kubes-2020-10-08T19-42-34-a428e44","name":"web"}]}}}}
176
+
177
+ '
178
+ creationTimestamp: '2020-10-07T19:04:14Z'
179
+ generation: 6
180
+ labels:
181
+ app: garden
182
+ role: web
183
+ name: web
184
+ namespace: garden
185
+ resourceVersion: '1076735'
186
+ selfLink: "/apis/apps/v1/namespaces/garden/deployments/web"
187
+ uid: 31b562a8-1a35-4bf6-972d-f2d44a47e149
188
+ spec:
189
+ progressDeadlineSeconds: 600
190
+ replicas: 1
191
+ revisionHistoryLimit: 0
192
+ selector:
193
+ matchLabels:
194
+ app: garden
195
+ role: web
196
+ strategy:
197
+ rollingUpdate:
198
+ maxSurge: 25%
199
+ maxUnavailable: 25%
200
+ type: RollingUpdate
201
+ template:
202
+ metadata:
203
+ creationTimestamp:
204
+ labels:
205
+ app: garden
206
+ role: web
207
+ spec:
208
+ containers:
209
+ - envFrom:
210
+ - secretRef:
211
+ name: demo-secret-OLD1111111
212
+ image: gcr.io/PROJECT/secret:kubes-2020-10-08T19-42-34-a428e44
213
+ imagePullPolicy: IfNotPresent
214
+ name: web
215
+ resources: {}
216
+ terminationMessagePath: "/dev/termination-log"
217
+ terminationMessagePolicy: File
218
+ dnsPolicy: ClusterFirst
219
+ restartPolicy: Always
220
+ schedulerName: default-scheduler
221
+ securityContext: {}
222
+ terminationGracePeriodSeconds: 30
223
+ status:
224
+ availableReplicas: 1
225
+ conditions:
226
+ - lastTransitionTime: '2020-10-07T19:04:14Z'
227
+ lastUpdateTime: '2020-10-08T19:42:46Z'
228
+ message: ReplicaSet "web-9c4796f88" has successfully progressed.
229
+ reason: NewReplicaSetAvailable
230
+ status: 'True'
231
+ type: Progressing
232
+ - lastTransitionTime: '2020-10-08T19:46:40Z'
233
+ lastUpdateTime: '2020-10-08T19:46:40Z'
234
+ message: Deployment has minimum availability.
235
+ reason: MinimumReplicasAvailable
236
+ status: 'True'
237
+ type: Available
238
+ observedGeneration: 6
239
+ readyReplicas: 1
240
+ replicas: 1
241
+ updatedReplicas: 1
242
+ - apiVersion: v1
243
+ kind: Service
244
+ metadata:
245
+ annotations:
246
+ kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"role":"web"},"name":"web","namespace":"garden"},"spec":{"ports":[{"port":80,"protocol":"TCP","targetPort":80}],"selector":{"role":"web"},"type":"ClusterIP"}}
247
+
248
+ '
249
+ creationTimestamp: '2020-10-07T19:04:13Z'
250
+ labels:
251
+ role: web
252
+ name: web
253
+ namespace: garden
254
+ resourceVersion: '486485'
255
+ selfLink: "/api/v1/namespaces/garden/services/web"
256
+ uid: 51eb23f5-d107-4554-b096-a4a081dfee5d
257
+ spec:
258
+ clusterIP: 10.12.10.177
259
+ ports:
260
+ - port: 80
261
+ protocol: TCP
262
+ targetPort: 80
263
+ selector:
264
+ role: web
265
+ sessionAffinity: None
266
+ type: ClusterIP
267
+ status:
268
+ loadBalancer: {}
@@ -0,0 +1,38 @@
1
+ describe Kubes::CLI::Prune do
2
+ let(:prune) do
3
+ prune = described_class.new
4
+ allow(prune).to receive(:sure?)
5
+ allow(prune).to receive(:capture_items).and_return(capture)
6
+ allow(prune).to receive(:logger).and_return(null)
7
+ prune
8
+ end
9
+ let(:null) { double(:null).as_null_object }
10
+
11
+ let(:fetcher) do
12
+ fetcher = double(:fetcher).as_null_object
13
+ allow(fetcher).to receive(:fetch_items).and_return(fetch_items)
14
+ fetcher
15
+ end
16
+ before(:each) do
17
+ allow(Kubes::Kubectl::Fetch::Base).to receive(:new).and_return(fetcher)
18
+ allow(Kubes::Compiler::Decorator::Hashable::Storage).to receive(:md5s).and_return(built_kinds)
19
+ end
20
+
21
+ context("old resources") do
22
+ let(:fetch_items) { fixture("fetch_items.yaml") }
23
+ let(:capture) { fixture("capture.yaml") }
24
+ let(:built_kinds) do
25
+ {"Secret"=>{"demo-secret"=>"CURRENT111"}}
26
+ end
27
+
28
+ it "run" do
29
+ allow(Kubes::Kubectl).to receive(:execute)
30
+ prune.run
31
+ expect(Kubes::Kubectl).to have_received(:execute).at_least(:once)
32
+ end
33
+ end
34
+
35
+ def fixture(file)
36
+ YAML.load_file("spec/fixtures/prune/#{file}")
37
+ end
38
+ end