kubes 0.3.2 → 0.4.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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/README.md +6 -5
  4. data/docs/_config.yml +1 -1
  5. data/docs/_docs/ci/cloudbuild.md +2 -0
  6. data/docs/_docs/config/args.md +10 -0
  7. data/docs/_docs/config/args/docker.md +19 -0
  8. data/docs/_docs/config/args/kubectl.md +19 -0
  9. data/docs/_docs/config/docker.md +4 -40
  10. data/docs/_docs/config/env.md +1 -1
  11. data/docs/_docs/config/hooks.md +10 -0
  12. data/docs/_docs/config/hooks/docker.md +70 -0
  13. data/docs/_docs/config/hooks/kubectl.md +83 -0
  14. data/docs/_docs/config/hooks/kubes.md +67 -0
  15. data/docs/_docs/config/hooks/ruby.md +74 -0
  16. data/docs/_docs/config/kubectl.md +3 -54
  17. data/docs/_docs/config/reference.md +20 -0
  18. data/docs/_docs/config/skip.md +58 -0
  19. data/docs/_docs/dsl/resources.md +1 -1
  20. data/docs/_docs/dsl/resources/backend_config.md +1 -1
  21. data/docs/_docs/intro.md +6 -3
  22. data/docs/_docs/learn/dsl/review-project.md +4 -2
  23. data/docs/_docs/learn/yaml/review-project.md +4 -2
  24. data/docs/_docs/{auto-context.md → misc/auto-context.md} +0 -0
  25. data/docs/_docs/{kustomize.md → misc/kustomize.md} +0 -0
  26. data/docs/_docs/misc/separate-steps.md +21 -0
  27. data/docs/_docs/patterns/migrations.md +121 -0
  28. data/docs/_includes/commands.html +2 -0
  29. data/docs/_includes/config/hooks/options.md +20 -0
  30. data/docs/_includes/sidebar.html +32 -10
  31. data/docs/_reference/kubes-exec.md +14 -6
  32. data/docs/_reference/kubes-init.md +1 -0
  33. data/docs/_reference/kubes-logs.md +1 -0
  34. data/docs/_sass/theme.scss +25 -1
  35. data/kubes.gemspec +3 -0
  36. data/lib/kubes.rb +3 -0
  37. data/lib/kubes/cli.rb +25 -6
  38. data/lib/kubes/cli/apply.rb +2 -1
  39. data/lib/kubes/cli/base.rb +11 -0
  40. data/lib/kubes/cli/compile.rb +8 -0
  41. data/lib/kubes/cli/delete.rb +1 -1
  42. data/lib/kubes/cli/exec.rb +37 -6
  43. data/lib/kubes/cli/get.rb +3 -2
  44. data/lib/kubes/cli/init.rb +39 -2
  45. data/lib/kubes/cli/logs.rb +50 -3
  46. data/lib/kubes/cli/prune.rb +95 -0
  47. data/lib/kubes/compiler.rb +11 -7
  48. data/lib/kubes/compiler/decorator/base.rb +7 -1
  49. data/lib/kubes/compiler/decorator/{resources/secret.rb → hashable.rb} +5 -4
  50. data/lib/kubes/compiler/decorator/hashable/field.rb +53 -0
  51. data/lib/kubes/compiler/decorator/hashable/storage.rb +19 -0
  52. data/lib/kubes/compiler/decorator/post.rb +77 -0
  53. data/lib/kubes/compiler/decorator/pre.rb +12 -0
  54. data/lib/kubes/compiler/strategy.rb +2 -2
  55. data/lib/kubes/compiler/strategy/base.rb +1 -1
  56. data/lib/kubes/compiler/strategy/result.rb +4 -6
  57. data/lib/kubes/config.rb +16 -11
  58. data/lib/kubes/docker/strategy/build/docker.rb +1 -1
  59. data/lib/kubes/docker/strategy/build/gcloud.rb +1 -1
  60. data/lib/kubes/docker/strategy/image_name.rb +1 -1
  61. data/lib/kubes/docker/strategy/push/docker.rb +1 -1
  62. data/lib/kubes/docker/strategy/push/gcloud.rb +1 -1
  63. data/lib/kubes/docker/strategy/utils.rb +1 -1
  64. data/lib/kubes/hooks/builder.rb +29 -15
  65. data/lib/kubes/hooks/concern.rb +10 -0
  66. data/lib/kubes/hooks/dsl.rb +2 -1
  67. data/lib/kubes/hooks/runner.rb +22 -0
  68. data/lib/kubes/kubectl.rb +21 -18
  69. data/lib/kubes/kubectl/batch.rb +8 -5
  70. data/lib/kubes/kubectl/{decider.rb → dispatcher.rb} +1 -1
  71. data/lib/kubes/kubectl/fetch/base.rb +13 -10
  72. data/lib/kubes/kubectl/fetch/deployment.rb +21 -11
  73. data/lib/kubes/kubectl/fetch/pods.rb +4 -15
  74. data/lib/kubes/kubectl/kustomize.rb +1 -1
  75. data/lib/kubes/kubectl/ordering.rb +12 -0
  76. data/lib/kubes/util/consider.rb +2 -1
  77. data/lib/kubes/util/sh.rb +1 -1
  78. data/lib/kubes/version.rb +1 -1
  79. data/lib/templates/dsl/.kubes/resources/base/all.rb.tt +6 -1
  80. data/lib/templates/dsl/.kubes/resources/shared/namespace.rb.tt +1 -1
  81. data/lib/templates/dsl/.kubes/resources/web/deployment.rb +1 -1
  82. data/lib/templates/yaml/.kubes/resources/base/all.yaml.tt +1 -1
  83. data/lib/templates/yaml/.kubes/resources/shared/namespace.yaml.tt +1 -1
  84. data/lib/templates/yaml/.kubes/resources/web/deployment.yaml.tt +1 -1
  85. data/spec/fixtures/decorators/deployment/both/envFrom.yaml +31 -0
  86. data/spec/fixtures/decorators/deployment/both/valueFrom.yaml +33 -0
  87. data/spec/fixtures/decorators/deployment/both/volumes.yaml +40 -0
  88. data/spec/fixtures/prune/capture.yaml +57 -0
  89. data/spec/fixtures/prune/fetch_items.yaml +268 -0
  90. data/spec/kubes/cli/prune_spec.rb +38 -0
  91. data/spec/kubes/compiler/decorator/{resources → post}/deployment_spec.rb +52 -6
  92. data/spec/kubes/compiler/decorator/{resources → post}/pod_spec.rb +2 -11
  93. metadata +56 -19
  94. data/lib/kubes/compiler/decorator.rb +0 -17
  95. data/lib/kubes/compiler/decorator/compile.rb +0 -12
  96. data/lib/kubes/compiler/decorator/resources/base.rb +0 -13
  97. data/lib/kubes/compiler/decorator/resources/container.rb +0 -76
  98. data/lib/kubes/compiler/decorator/resources/container/mapping.rb +0 -28
  99. data/lib/kubes/compiler/decorator/resources/deployment.rb +0 -10
  100. data/lib/kubes/compiler/decorator/resources/pod.rb +0 -10
  101. data/lib/kubes/compiler/decorator/write.rb +0 -14
  102. data/lib/kubes/docker/strategy/hooks.rb +0 -9
@@ -0,0 +1,40 @@
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
+ volumeMounts:
23
+ - mountPath: /config-map
24
+ name: config-map-volume
25
+ volumes:
26
+ - configMap:
27
+ name: demo-config-map
28
+ items:
29
+ - key: k1
30
+ path: config-map.conf
31
+ name: config-map-volume
32
+ - secret:
33
+ secretName: demo-secret
34
+ items:
35
+ - key: k1
36
+ path: secrets.conf
37
+ name: secrets-volume
38
+ replicas: 1
39
+ apiVersion: apps/v1
40
+ kind: Pod
@@ -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
@@ -1,11 +1,14 @@
1
- describe Kubes::Compiler::Decorator::Resources::Deployment do
1
+ describe Kubes::Compiler::Decorator::Post do
2
2
  let(:decorator) { described_class.new(data) }
3
3
 
4
4
  def fixture(name)
5
5
  YAML.load_file("spec/fixtures/decorators/deployment/#{name}.yaml")
6
6
  end
7
7
  before(:each) do
8
- allow(Kubes::Compiler::Decorator).to receive(:fetch).and_return("fakehash")
8
+ allow(Kubes::Compiler::Decorator::Hashable::Storage).to receive(:fetch).and_return("fakehash")
9
+ allow(Kubes::Compiler::Decorator::Hashable::Storage).to receive(:fetch).with("Secret", "demo-secret").and_return("fakehash")
10
+ allow(Kubes::Compiler::Decorator::Hashable::Storage).to receive(:fetch).with("ConfigMap", "demo-config-map").and_return("fakehash-config")
11
+ allow(Kubes::Compiler::Decorator::Hashable::Storage).to receive(:fetch).with("ConfigMap", "demo-config-map-2").and_return("fakehash-config2")
9
12
  end
10
13
 
11
14
  context "secret" do
@@ -56,7 +59,7 @@ describe Kubes::Compiler::Decorator::Resources::Deployment do
56
59
  decorator.run
57
60
  data = decorator.data
58
61
  name = data['spec']['template']['spec']['containers'][0]['envFrom'][0]['configMapRef']['name']
59
- expect(name).to eq("demo-config-map-fakehash")
62
+ expect(name).to eq("demo-config-map-fakehash-config")
60
63
  end
61
64
  end
62
65
 
@@ -66,7 +69,7 @@ describe Kubes::Compiler::Decorator::Resources::Deployment do
66
69
  decorator.run
67
70
  data = decorator.data
68
71
  name = data['spec']['template']['spec']['containers'][0]['env'][0]['valueFrom']['configMapKeyRef']['name']
69
- expect(name).to eq("demo-config-map-fakehash")
72
+ expect(name).to eq("demo-config-map-fakehash-config")
70
73
  end
71
74
  end
72
75
 
@@ -76,7 +79,7 @@ describe Kubes::Compiler::Decorator::Resources::Deployment do
76
79
  decorator.run
77
80
  data = decorator.data
78
81
  name = data['spec']['template']['spec']['volumes'][0]['configMap']['name']
79
- expect(name).to eq("demo-config-map-fakehash")
82
+ expect(name).to eq("demo-config-map-fakehash-config")
80
83
  end
81
84
  end
82
85
 
@@ -85,7 +88,50 @@ describe Kubes::Compiler::Decorator::Resources::Deployment do
85
88
  it "data" do
86
89
  decorator.run
87
90
  name = data['spec']['template']['spec']['containers'][0]['envFrom'][0]['configMapRef']['name']
88
- expect(name).to eq("demo-config-map-fakehash")
91
+ expect(name).to eq("demo-config-map-fakehash-config")
92
+ end
93
+ end
94
+ end
95
+
96
+ context "both" do
97
+ describe "envFrom" do
98
+ let(:data) { fixture("both/envFrom") }
99
+ it "run" do
100
+ decorator.run
101
+ data = decorator.data
102
+ envFrom = data['spec']['template']['spec']['containers'][0]['envFrom']
103
+ name = envFrom[0]['secretRef']['name']
104
+ expect(name).to eq("demo-secret-fakehash")
105
+ name = envFrom[1]['configMapRef']['name']
106
+ expect(name).to eq("demo-config-map-fakehash-config")
107
+ name = envFrom[2]['configMapRef']['name']
108
+ expect(name).to eq("demo-config-map-2-fakehash-config2")
109
+ end
110
+ end
111
+
112
+ describe "valueFrom" do
113
+ let(:data) { fixture("both/valueFrom") }
114
+ it "run" do
115
+ decorator.run
116
+ data = decorator.data
117
+ valueFrom = data['spec']['template']['spec']['containers'][0]['env'][0]['valueFrom']
118
+ name = valueFrom['configMapKeyRef']['name']
119
+ expect(name).to eq("demo-config-map-fakehash-config")
120
+ name = valueFrom['secretKeyRef']['name']
121
+ expect(name).to eq("demo-secret-fakehash")
122
+ end
123
+ end
124
+
125
+ describe "volumes" do
126
+ let(:data) { fixture("both/volumes") }
127
+ it "run" do
128
+ decorator.run
129
+ data = decorator.data
130
+ volumes = data['spec']['template']['spec']['volumes']
131
+ name = volumes[0]['configMap']['name']
132
+ expect(name).to eq("demo-config-map-fakehash-config")
133
+ name = volumes[1]['secret']['secretName']
134
+ expect(name).to eq("demo-secret-fakehash")
89
135
  end
90
136
  end
91
137
  end