kerbi 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/lib/cli/base_handler.rb +180 -0
- data/lib/cli/base_serializer.rb +120 -0
- data/lib/cli/config_handler.rb +51 -0
- data/lib/cli/entry_serializers.rb +99 -0
- data/lib/cli/project_handler.rb +2 -2
- data/lib/cli/root_handler.rb +32 -13
- data/lib/cli/state_handler.rb +95 -0
- data/lib/cli/values_handler.rb +4 -3
- data/lib/config/cli_schema.rb +299 -27
- data/lib/config/config_file.rb +60 -0
- data/lib/config/globals.rb +4 -0
- data/lib/config/run_opts.rb +150 -0
- data/lib/config/state_consts.rb +10 -0
- data/lib/kerbi.rb +31 -9
- data/lib/main/errors.rb +109 -0
- data/lib/main/mixer.rb +12 -8
- data/lib/mixins/cli_state_helpers.rb +136 -0
- data/lib/mixins/cm_backend_testing.rb +95 -0
- data/lib/mixins/entry_tag_logic.rb +183 -0
- data/lib/state/base_backend.rb +59 -0
- data/lib/state/config_map_backend.rb +119 -0
- data/lib/state/entry.rb +173 -0
- data/lib/state/entry_set.rb +137 -0
- data/lib/state/metadata.yaml.erb +11 -0
- data/lib/state/mixers.rb +23 -0
- data/lib/state/resources.yaml.erb +17 -0
- data/lib/utils/cli.rb +77 -10
- data/lib/utils/helm.rb +10 -12
- data/lib/utils/k8s_auth.rb +87 -0
- data/lib/utils/misc.rb +36 -1
- data/lib/utils/mixing.rb +1 -1
- data/lib/utils/values.rb +13 -22
- data/spec/cli/config_handler_spec.rb +38 -0
- data/spec/cli/root_handler_spec.rb +99 -0
- data/spec/cli/state_handler_spec.rb +139 -0
- data/spec/cli/values_handler_spec.rb +17 -0
- data/spec/expectations/common/bad-tag.txt +1 -0
- data/spec/expectations/config/bad-set.txt +1 -0
- data/spec/expectations/config/set.txt +1 -0
- data/spec/expectations/config/show-default.yaml +6 -0
- data/spec/expectations/root/template-inlines.yaml +31 -0
- data/spec/expectations/root/template-production.yaml +31 -0
- data/spec/expectations/root/template-read-inlines.yaml +31 -0
- data/spec/expectations/root/template-read.yaml +31 -0
- data/spec/expectations/root/template-write.yaml +31 -0
- data/spec/expectations/root/template.yaml +31 -0
- data/spec/expectations/root/values.json +28 -0
- data/spec/expectations/state/delete.txt +1 -0
- data/spec/expectations/state/demote.txt +1 -0
- data/spec/expectations/state/init-already-existed.txt +2 -0
- data/spec/expectations/state/init-both-created.txt +2 -0
- data/spec/expectations/state/list.json +51 -0
- data/spec/expectations/state/list.txt +6 -0
- data/spec/expectations/state/list.yaml +35 -0
- data/spec/expectations/state/promote.txt +1 -0
- data/spec/expectations/state/prune-candidates.txt +1 -0
- data/spec/expectations/state/retag.txt +1 -0
- data/spec/expectations/state/set.txt +1 -0
- data/spec/expectations/state/show.json +13 -0
- data/spec/expectations/state/show.txt +13 -0
- data/spec/expectations/state/show.yaml +8 -0
- data/spec/expectations/state/status-all-working.txt +4 -0
- data/spec/expectations/state/status-not-provisioned.txt +4 -0
- data/spec/expectations/values/order-of-precedence.yaml +4 -0
- data/spec/main/configmap_backend_spec.rb +109 -0
- data/spec/main/state_entry_set_spec.rb +112 -0
- data/spec/main/state_entry_spec.rb +109 -0
- data/spec/spec_helper.rb +87 -1
- data/spec/utils/helm_spec.rb +1 -21
- data/spec/utils/k8s_auth_spec.rb +32 -0
- data/spec/utils/misc_utils_spec.rb +9 -0
- data/spec/utils/values_utils_spec.rb +12 -19
- metadata +114 -13
- data/lib/cli/base.rb +0 -83
- data/lib/config/cli_opts.rb +0 -50
- data/lib/config/manager.rb +0 -36
- data/lib/main/state_manager.rb +0 -47
- data/lib/utils/kubectl.rb +0 -58
- data/spec/main/examples_spec.rb +0 -12
- data/spec/main/state_manager_spec.rb +0 -84
- data/spec/utils/state_utils.rb +0 -15
data/lib/config/cli_schema.rb
CHANGED
@@ -2,51 +2,178 @@ module Kerbi
|
|
2
2
|
module Consts
|
3
3
|
|
4
4
|
module OptionKeys
|
5
|
-
|
5
|
+
PROJECT_ROOT = "project-root"
|
6
|
+
|
7
|
+
OUTPUT_FMT = "output-format"
|
6
8
|
INLINE_ASSIGNMENT = "inline-value"
|
9
|
+
LOAD_DEFAULT_VALUES = "load-defaults"
|
7
10
|
VALUE_FNAMES = "values-file"
|
8
|
-
|
11
|
+
|
9
12
|
RUBY_VER = "ruby-version"
|
10
13
|
VERBOSE = "verbose"
|
14
|
+
|
15
|
+
STATE_BACKEND_TYPE = "state-backend"
|
16
|
+
READ_STATE = "read-state"
|
17
|
+
STRICT_READ_STATE = "strict-read"
|
18
|
+
WRITE_STATE = "write-state"
|
19
|
+
NAMESPACE = "namespace"
|
20
|
+
WRITE_STATE_MESSAGE = "message"
|
21
|
+
|
22
|
+
K8S_AUTH_TYPE = "auth-type"
|
23
|
+
KUBE_CONFIG_PATH = "kube-config-path"
|
24
|
+
KUBE_CONFIG_CONTEXT = "kube-config-context"
|
25
|
+
K8S_USERNAME = "username"
|
26
|
+
K8S_PASSWORD = "password"
|
27
|
+
K8S_TOKEN = "token"
|
28
|
+
|
29
|
+
LEGAL_CONFIG_FILE_KEYS = [
|
30
|
+
STATE_BACKEND_TYPE,
|
31
|
+
NAMESPACE,
|
32
|
+
K8S_AUTH_TYPE,
|
33
|
+
KUBE_CONFIG_CONTEXT,
|
34
|
+
K8S_USERNAME,
|
35
|
+
K8S_PASSWORD,
|
36
|
+
K8S_TOKEN
|
37
|
+
]
|
38
|
+
end
|
39
|
+
|
40
|
+
module OptionDefaults
|
41
|
+
BASE = {
|
42
|
+
OptionKeys::LOAD_DEFAULT_VALUES => true,
|
43
|
+
OptionKeys::INLINE_ASSIGNMENT => [],
|
44
|
+
OptionKeys::VALUE_FNAMES => [],
|
45
|
+
OptionKeys::OUTPUT_FMT => "yaml",
|
46
|
+
OptionKeys::STATE_BACKEND_TYPE => "configmap",
|
47
|
+
OptionKeys::K8S_AUTH_TYPE => "kube-config"
|
48
|
+
}.freeze
|
49
|
+
|
50
|
+
LIST_STATE = BASE.merge(
|
51
|
+
OptionKeys::OUTPUT_FMT => "table"
|
52
|
+
).freeze
|
11
53
|
end
|
12
54
|
|
13
55
|
module OptionSchemas
|
14
|
-
OUTPUT_FMT = {
|
15
|
-
key: OptionKeys::OUTPUT_FMT,
|
16
|
-
desc: "Specify YAML or JSON. Defaults to YAML",
|
17
|
-
enum: %w[yaml json]
|
18
|
-
}
|
19
56
|
|
20
|
-
|
21
|
-
key: OptionKeys::
|
22
|
-
desc: "
|
23
|
-
|
57
|
+
PROJECT_ROOT = {
|
58
|
+
key: OptionKeys::PROJECT_ROOT,
|
59
|
+
desc: "Project root. An abs path, a rel path, or remote (/foo, foo, @foo/bar)",
|
60
|
+
aliases: "-p"
|
24
61
|
}
|
25
62
|
|
63
|
+
K8S_AUTH_TYPE = {
|
64
|
+
key: OptionKeys::K8S_AUTH_TYPE,
|
65
|
+
desc: "Strategy for connecting to target cluster (defaults to kube-config)",
|
66
|
+
enum: %w[kube-config in-cluster basic token]
|
67
|
+
}.freeze
|
68
|
+
|
69
|
+
KUBE_CONFIG_PATH = {
|
70
|
+
key: OptionKeys::KUBE_CONFIG_PATH,
|
71
|
+
desc: "path to your kube-config file, defaults to ~/.kube/config"
|
72
|
+
}.freeze
|
73
|
+
|
74
|
+
KUBE_CONFIG_CONTEXT = {
|
75
|
+
key: OptionKeys::KUBE_CONFIG_CONTEXT,
|
76
|
+
desc: "context to use in your kube config,
|
77
|
+
defaults to $(kubectl config current-context)"
|
78
|
+
}.freeze
|
79
|
+
|
80
|
+
K8S_USERNAME = {
|
81
|
+
key: OptionKeys::K8S_USERNAME,
|
82
|
+
desc: "Kubernetes auth username for basic password auth"
|
83
|
+
}.freeze
|
84
|
+
|
85
|
+
K8S_PASSWORD = {
|
86
|
+
key: OptionKeys::K8S_PASSWORD,
|
87
|
+
desc: "Kubernetes auth password for basic password auth"
|
88
|
+
}.freeze
|
89
|
+
|
90
|
+
LOAD_DEFAULT_VALUES = {
|
91
|
+
key: OptionKeys::LOAD_DEFAULT_VALUES,
|
92
|
+
desc: "Automatically load values.yaml. Defaults to true.",
|
93
|
+
type: "boolean",
|
94
|
+
default: true
|
95
|
+
}.freeze
|
96
|
+
|
97
|
+
K8S_TOKEN = {
|
98
|
+
key: OptionKeys::K8S_TOKEN,
|
99
|
+
desc: "Kubernetes auth bearer token for token auth"
|
100
|
+
}.freeze
|
101
|
+
|
102
|
+
STATE_BACKEND_TYPE = {
|
103
|
+
key: OptionKeys::STATE_BACKEND_TYPE,
|
104
|
+
desc: "Persistent store to keep track of applied values (configmap, secret)",
|
105
|
+
enum: %w[configmap secret]
|
106
|
+
}.freeze
|
107
|
+
|
108
|
+
OUTPUT_FMT = {
|
109
|
+
key: OptionKeys::OUTPUT_FMT,
|
110
|
+
aliases: "-o",
|
111
|
+
desc: "Specify YAML, JSON, or table",
|
112
|
+
enum: %w[yaml json table]
|
113
|
+
}.freeze
|
114
|
+
|
26
115
|
INLINE_ASSIGNMENT = {
|
27
116
|
key: OptionKeys::INLINE_ASSIGNMENT,
|
28
117
|
aliases: "--set",
|
29
118
|
desc: "An inline variable assignment, e.g --set x.y=foo --set x.z=bar",
|
30
119
|
repeatable: true
|
31
|
-
}
|
120
|
+
}.freeze
|
121
|
+
|
122
|
+
READ_STATE = {
|
123
|
+
key: OptionKeys::READ_STATE,
|
124
|
+
desc: "Merge values from given state record into final values.",
|
125
|
+
}.freeze
|
126
|
+
|
127
|
+
STRICT_READ_STATE = {
|
128
|
+
key: OptionKeys::STRICT_READ_STATE,
|
129
|
+
desc: "Makes read-state operations fail if the state does not exist for the given tag",
|
130
|
+
}.freeze
|
131
|
+
|
132
|
+
WRITE_STATE = {
|
133
|
+
key: OptionKeys::WRITE_STATE,
|
134
|
+
desc: "write compiled values into given state record"
|
135
|
+
}.freeze
|
136
|
+
|
137
|
+
NAMESPACE = {
|
138
|
+
key: OptionKeys::NAMESPACE,
|
139
|
+
aliases: "-n",
|
140
|
+
desc: "for state operations, tell kerbi that the state
|
141
|
+
configmap/secret is in this namespace"
|
142
|
+
}.freeze
|
32
143
|
|
33
144
|
VALUE_FNAMES = {
|
34
145
|
key: OptionKeys::VALUE_FNAMES,
|
35
146
|
aliases: "-f",
|
36
147
|
desc: "Name of a values file to be loaded.",
|
37
148
|
repeatable: true
|
38
|
-
}
|
149
|
+
}.freeze
|
39
150
|
|
40
151
|
RUBY_VER = {
|
41
152
|
key: OptionKeys::RUBY_VER,
|
42
153
|
desc: "Specify ruby version for Gemfile in a new project"
|
43
|
-
}
|
154
|
+
}.freeze
|
44
155
|
|
45
156
|
VERBOSE = {
|
46
157
|
key: OptionKeys::VERBOSE,
|
47
158
|
desc: "Run in verbose mode",
|
48
159
|
enum: %w[true false]
|
49
|
-
}
|
160
|
+
}.freeze
|
161
|
+
|
162
|
+
KUBERNETES_OPTIONS = [
|
163
|
+
NAMESPACE,
|
164
|
+
STATE_BACKEND_TYPE,
|
165
|
+
READ_STATE,
|
166
|
+
WRITE_STATE,
|
167
|
+
K8S_AUTH_TYPE,
|
168
|
+
KUBE_CONFIG_PATH,
|
169
|
+
KUBE_CONFIG_CONTEXT
|
170
|
+
].freeze
|
171
|
+
|
172
|
+
VALUES_OPTIONS = [
|
173
|
+
VALUE_FNAMES,
|
174
|
+
INLINE_ASSIGNMENT,
|
175
|
+
LOAD_DEFAULT_VALUES,
|
176
|
+
].freeze
|
50
177
|
end
|
51
178
|
|
52
179
|
module CommandSchemas
|
@@ -54,31 +181,49 @@ module Kerbi
|
|
54
181
|
VALUES_SUPER = {
|
55
182
|
name: "values",
|
56
183
|
desc: "Command group for values actions: show, get"
|
57
|
-
}
|
184
|
+
}.freeze
|
58
185
|
|
59
186
|
PROJECT_SUPER = {
|
60
187
|
name: "project",
|
61
188
|
desc: "Command group for project actions: new, info"
|
62
|
-
}
|
189
|
+
}.freeze
|
190
|
+
|
191
|
+
STATE_SUPER = {
|
192
|
+
name: "state",
|
193
|
+
desc: "Command group for state actions: test, list, show"
|
194
|
+
}.freeze
|
195
|
+
|
196
|
+
CONFIG_SUPER = {
|
197
|
+
name: "config",
|
198
|
+
desc: "Command group for config actions: set, get, show"
|
199
|
+
}.freeze
|
63
200
|
|
64
201
|
TEMPLATE = {
|
65
202
|
name: "template [KERBIFILE] [RELEASE_NAME]",
|
66
203
|
desc: "Runs mixers for RELEASE_NAME",
|
67
204
|
options: [
|
205
|
+
OptionSchemas::PROJECT_ROOT,
|
68
206
|
OptionSchemas::OUTPUT_FMT,
|
69
|
-
OptionSchemas::
|
70
|
-
OptionSchemas::
|
207
|
+
*OptionSchemas::VALUES_OPTIONS,
|
208
|
+
*OptionSchemas::KUBERNETES_OPTIONS
|
71
209
|
]
|
72
|
-
}
|
210
|
+
}.freeze
|
73
211
|
|
74
212
|
CONSOLE = {
|
75
213
|
name: "console",
|
76
214
|
desc: "Opens an IRB console so you can play with your mixers",
|
77
215
|
options: [
|
216
|
+
OptionSchemas::PROJECT_ROOT,
|
78
217
|
OptionSchemas::VALUE_FNAMES,
|
79
218
|
OptionSchemas::INLINE_ASSIGNMENT
|
80
219
|
]
|
81
|
-
}
|
220
|
+
}.freeze
|
221
|
+
|
222
|
+
VERSION = {
|
223
|
+
name: "version",
|
224
|
+
desc: "Prints the version of this RubyGem",
|
225
|
+
options: []
|
226
|
+
}.freeze
|
82
227
|
|
83
228
|
NEW_PROJECT = {
|
84
229
|
name: "new",
|
@@ -87,18 +232,145 @@ module Kerbi
|
|
87
232
|
OptionSchemas::RUBY_VER,
|
88
233
|
OptionSchemas::VERBOSE
|
89
234
|
]
|
90
|
-
}
|
235
|
+
}.freeze
|
236
|
+
|
237
|
+
STATE_STATUS = {
|
238
|
+
name: "status",
|
239
|
+
desc: "Verbosely assesses the readiness of your state-tracking backend.",
|
240
|
+
options: [
|
241
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
242
|
+
OptionSchemas::VERBOSE
|
243
|
+
]
|
244
|
+
}.freeze
|
245
|
+
|
246
|
+
LIST_STATE = {
|
247
|
+
name: "list",
|
248
|
+
desc: "Print all recorded states for this namespace",
|
249
|
+
options: [
|
250
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
251
|
+
OptionSchemas::OUTPUT_FMT
|
252
|
+
],
|
253
|
+
defaults: OptionDefaults::LIST_STATE
|
254
|
+
}.freeze
|
255
|
+
|
256
|
+
INIT_STATE = {
|
257
|
+
name: "init [NAMESPACE]",
|
258
|
+
desc: "Provision the resources for persisting the state",
|
259
|
+
options: [
|
260
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
261
|
+
OptionSchemas::VERBOSE
|
262
|
+
]
|
263
|
+
}.freeze
|
264
|
+
|
265
|
+
SHOW_STATE = {
|
266
|
+
name: "show [TAG]",
|
267
|
+
desc: "Print summary of state identified by [TAG]",
|
268
|
+
options: [
|
269
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
270
|
+
OptionSchemas::OUTPUT_FMT
|
271
|
+
],
|
272
|
+
defaults: OptionDefaults::LIST_STATE
|
273
|
+
}.freeze
|
274
|
+
|
275
|
+
RETAG_STATE = {
|
276
|
+
name: "retag [OLD_TAG] [NEW_TAG]",
|
277
|
+
desc: "Updates entry's tag given by [OLD_TAG] to [NEW_TAG]",
|
278
|
+
options: [
|
279
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
280
|
+
OptionSchemas::OUTPUT_FMT
|
281
|
+
],
|
282
|
+
defaults: OptionDefaults::LIST_STATE
|
283
|
+
}.freeze
|
284
|
+
|
285
|
+
PROMOTE_STATE = {
|
286
|
+
name: "promote [TAG]",
|
287
|
+
desc: "Removes the [cand]- prefix from the given entry,
|
288
|
+
removing its candidate status.",
|
289
|
+
options: [
|
290
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
291
|
+
],
|
292
|
+
defaults: OptionDefaults::LIST_STATE
|
293
|
+
}.freeze
|
294
|
+
|
295
|
+
DEMOTE_STATE = {
|
296
|
+
name: "promote [TAG]",
|
297
|
+
desc: "Adds the [cand]- prefix from the given entry,
|
298
|
+
giving it candidate status.",
|
299
|
+
options: [
|
300
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
301
|
+
],
|
302
|
+
defaults: OptionDefaults::LIST_STATE
|
303
|
+
}.freeze
|
304
|
+
|
305
|
+
DELETE_STATE = {
|
306
|
+
name: "delete [TAG]",
|
307
|
+
desc: "Deletes the state entry given by [TAG]",
|
308
|
+
options: [
|
309
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
310
|
+
]
|
311
|
+
}.freeze
|
312
|
+
|
313
|
+
SET_STATE_ATTR = {
|
314
|
+
name: "set [TAG] [ATTR_NAME] [NEW_VALUE]",
|
315
|
+
desc: "Updates state entry [TAG], attribute [ATTR_NAME] to value [NEW_VALUE]",
|
316
|
+
options: [
|
317
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
318
|
+
]
|
319
|
+
}.freeze
|
320
|
+
|
321
|
+
PRUNE_CANDIDATES_STATE = {
|
322
|
+
name: "prune-candidates",
|
323
|
+
desc: "Deletes all state entries flagged as candidates",
|
324
|
+
options: [
|
325
|
+
*OptionSchemas::KUBERNETES_OPTIONS,
|
326
|
+
]
|
327
|
+
}.freeze
|
328
|
+
|
329
|
+
SHOW_VERSION = {
|
330
|
+
name: "version",
|
331
|
+
desc: "Print kerbi version",
|
332
|
+
options: []
|
333
|
+
}.freeze
|
91
334
|
|
92
335
|
SHOW_VALUES = {
|
93
336
|
name: "show",
|
94
337
|
desc: "Print out loaded values as YAML",
|
95
338
|
options: [
|
339
|
+
OptionSchemas::PROJECT_ROOT,
|
96
340
|
OptionSchemas::OUTPUT_FMT,
|
97
|
-
OptionSchemas::
|
98
|
-
OptionSchemas::
|
341
|
+
*OptionSchemas::VALUES_OPTIONS,
|
342
|
+
*OptionSchemas::KUBERNETES_OPTIONS
|
99
343
|
]
|
100
|
-
}
|
344
|
+
}.freeze
|
345
|
+
|
346
|
+
CONFIG_LOCATION = {
|
347
|
+
name: "location",
|
348
|
+
desc: "Prints out filesystem path for global Kerbi config"
|
349
|
+
}.freeze
|
350
|
+
|
351
|
+
CONFIG_SET = {
|
352
|
+
name: "set [KEY] [VALUE]",
|
353
|
+
desc: "Writes an x=y configuration to the global kerbi config"
|
354
|
+
}.freeze
|
355
|
+
|
356
|
+
CONFIG_GET = {
|
357
|
+
name: "get [KEY]",
|
358
|
+
desc: "Prints out the value of KEY as loaded into the options"
|
359
|
+
}.freeze
|
360
|
+
|
361
|
+
CONFIG_SHOW = {
|
362
|
+
name: "show",
|
363
|
+
desc: "Prints out the value of KEY as loaded into the options",
|
364
|
+
options: [
|
365
|
+
OptionSchemas::OUTPUT_FMT
|
366
|
+
]
|
367
|
+
}.freeze
|
368
|
+
|
369
|
+
CONFIG_RESET = {
|
370
|
+
name: "reset",
|
371
|
+
desc: "Resets the config file to its default state",
|
372
|
+
options: []
|
373
|
+
}.freeze
|
101
374
|
end
|
102
375
|
end
|
103
|
-
end
|
104
|
-
|
376
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Kerbi
|
2
|
+
|
3
|
+
module ConfigFile
|
4
|
+
|
5
|
+
DIR_NAME = ".kerbi"
|
6
|
+
FILE_NAME = "config.yaml"
|
7
|
+
|
8
|
+
def self.file_path
|
9
|
+
"#{Dir.home}/#{DIR_NAME}/#{FILE_NAME}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.dir_path
|
13
|
+
"#{Dir.home}/#{DIR_NAME}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.create_file_if_missing
|
17
|
+
unless File.exists?(file_path)
|
18
|
+
unless Dir.exists?(dir_path)
|
19
|
+
Dir.mkdir(dir_path)
|
20
|
+
end
|
21
|
+
write({}, skip_check: true)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Hash{Symbol, String}]
|
26
|
+
def self.read
|
27
|
+
begin
|
28
|
+
create_file_if_missing
|
29
|
+
contents = YAML.load_file(file_path)
|
30
|
+
contents.slice(*legal_keys)
|
31
|
+
rescue StandardError => e
|
32
|
+
puts "[WARN] failed to read config #{file_path} (#{e})"
|
33
|
+
{}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param [Hash] config
|
38
|
+
def self.write(config, skip_check: false)
|
39
|
+
create_file_if_missing unless skip_check
|
40
|
+
config = config.deep_dup.stringify_keys.slice(*legal_keys)
|
41
|
+
File.write(file_path, YAML.dump(config))
|
42
|
+
end
|
43
|
+
|
44
|
+
# @param [Hash] config
|
45
|
+
def self.patch(config)
|
46
|
+
existing_config = read
|
47
|
+
new_config = existing_config.merge(config)
|
48
|
+
write(new_config)
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.reset
|
52
|
+
create_file_if_missing
|
53
|
+
write({})
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.legal_keys
|
57
|
+
Kerbi::Consts::OptionKeys::LEGAL_CONFIG_FILE_KEYS
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/config/globals.rb
CHANGED
@@ -0,0 +1,150 @@
|
|
1
|
+
module Kerbi
|
2
|
+
|
3
|
+
##
|
4
|
+
# Convenience accessor struct for getting values from
|
5
|
+
# the CLI args.
|
6
|
+
#noinspection RubyTooManyMethodsInspection
|
7
|
+
class RunOpts
|
8
|
+
|
9
|
+
attr_reader :options
|
10
|
+
|
11
|
+
# @param [Hash{Symbol, Object}] cli_opts CLI args as a hash via Thor
|
12
|
+
# @param [Hash{Symbol, Object}] defaults contextual defaults (per cmd)
|
13
|
+
# @return [Kerbi::RunOpts]
|
14
|
+
def initialize(cli_opts, defaults)
|
15
|
+
@options = defaults.deep_dup.
|
16
|
+
merge(Kerbi::ConfigFile.read.deep_dup).
|
17
|
+
merge(cli_opts.deep_dup).
|
18
|
+
freeze
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [String]
|
22
|
+
def output_format
|
23
|
+
value = options[consts::OUTPUT_FMT]
|
24
|
+
value || default
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [TrueClass, FalseClass]
|
28
|
+
def output_yaml?
|
29
|
+
self.output_format == 'yaml'
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [TrueClass, FalseClass]
|
33
|
+
def output_table?
|
34
|
+
self.output_format == 'table'
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [TrueClass, FalseClass]
|
38
|
+
def output_json?
|
39
|
+
self.output_format == 'json'
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [String]
|
43
|
+
def ruby_version
|
44
|
+
options[consts::RUBY_VER]
|
45
|
+
end
|
46
|
+
|
47
|
+
# @return [Array<String>]
|
48
|
+
def fname_exprs
|
49
|
+
options[consts::VALUE_FNAMES]
|
50
|
+
end
|
51
|
+
|
52
|
+
# @return [Array<String>]
|
53
|
+
def inline_val_exprs
|
54
|
+
options[consts::INLINE_ASSIGNMENT]
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [TrueClass, FalseClass]
|
58
|
+
def load_defaults?
|
59
|
+
options[consts::LOAD_DEFAULT_VALUES].present?
|
60
|
+
end
|
61
|
+
|
62
|
+
# @return [String]
|
63
|
+
def read_state_from
|
64
|
+
options[consts::READ_STATE].presence
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [String]
|
68
|
+
def write_state_to
|
69
|
+
options[consts::WRITE_STATE].presence
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [TrueClass, FalseClass]
|
73
|
+
def verbose?
|
74
|
+
options[consts::VERBOSE].present?
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [TrueClass, FalseClass]
|
78
|
+
def reads_state?
|
79
|
+
read_state_from.present?
|
80
|
+
end
|
81
|
+
|
82
|
+
# @return [TrueClass, FalseClass]
|
83
|
+
def reads_state_strictly?
|
84
|
+
options[consts::STRICT_READ_STATE]
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [TrueClass, FalseClass]
|
88
|
+
def writes_state?
|
89
|
+
write_state_to.present?
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [String]
|
93
|
+
def k8s_auth_type
|
94
|
+
options[consts::K8S_AUTH_TYPE]
|
95
|
+
end
|
96
|
+
|
97
|
+
# @return [String]
|
98
|
+
def kube_config_path
|
99
|
+
options[consts::KUBE_CONFIG_PATH]
|
100
|
+
end
|
101
|
+
|
102
|
+
# @return [String]
|
103
|
+
def kube_context_name
|
104
|
+
options[consts::KUBE_CONFIG_CONTEXT]
|
105
|
+
end
|
106
|
+
|
107
|
+
# @return [String]
|
108
|
+
def cluster_namespace
|
109
|
+
options[consts::NAMESPACE]
|
110
|
+
end
|
111
|
+
|
112
|
+
# @return [String]
|
113
|
+
def state_backend_type
|
114
|
+
options[consts::STATE_BACKEND_TYPE]
|
115
|
+
end
|
116
|
+
|
117
|
+
# @return [String]
|
118
|
+
def k8s_auth_username
|
119
|
+
options[consts::K8S_USERNAME]
|
120
|
+
end
|
121
|
+
|
122
|
+
# @return [String]
|
123
|
+
def k8s_auth_password
|
124
|
+
options[consts::K8S_PASSWORD]
|
125
|
+
end
|
126
|
+
|
127
|
+
# @return [String]
|
128
|
+
def k8s_auth_token
|
129
|
+
options[consts::K8S_TOKEN]
|
130
|
+
end
|
131
|
+
|
132
|
+
# @return [String]
|
133
|
+
def write_state_msg
|
134
|
+
options[consts::WRITE_STATE_MESSAGE]
|
135
|
+
end
|
136
|
+
|
137
|
+
# @return [String]
|
138
|
+
def project_root
|
139
|
+
options[consts::PROJECT_ROOT].presence
|
140
|
+
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
# @return [Module<Kerbi::Consts::OptionKeys>]
|
145
|
+
def consts
|
146
|
+
Kerbi::Consts::OptionKeys
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
data/lib/kerbi.rb
CHANGED
@@ -3,41 +3,63 @@
|
|
3
3
|
#
|
4
4
|
require 'erb'
|
5
5
|
require "irb"
|
6
|
-
require 'open3'
|
7
|
-
require "http"
|
8
6
|
require 'json'
|
9
7
|
require 'yaml'
|
8
|
+
require 'time'
|
10
9
|
require "thor"
|
10
|
+
require 'open3'
|
11
11
|
require "base64"
|
12
12
|
require 'optparse'
|
13
13
|
require 'colorize'
|
14
|
+
require 'kubeclient'
|
15
|
+
require 'spicy-proton'
|
16
|
+
require 'terminal-table'
|
14
17
|
|
15
|
-
require 'active_support/concern'
|
16
18
|
require 'active_support/inflector'
|
17
19
|
require 'active_support/core_ext/object/deep_dup'
|
18
20
|
require 'active_support/core_ext/hash/keys'
|
19
21
|
require 'active_support/core_ext/hash/deep_merge'
|
20
22
|
require 'active_support/core_ext/object/blank'
|
21
23
|
require 'active_support/core_ext/string/indent.rb'
|
24
|
+
require 'active_support/core_ext/string/filters'
|
25
|
+
require 'active_support/callbacks'
|
22
26
|
|
23
27
|
require_relative './utils/misc'
|
28
|
+
require_relative './utils/k8s_auth'
|
29
|
+
require_relative './state/entry'
|
30
|
+
require_relative './cli/base_serializer'
|
24
31
|
|
25
32
|
require_relative './config/cli_schema'
|
26
|
-
require_relative './config/
|
33
|
+
require_relative './config/state_consts'
|
34
|
+
require_relative './config/config_file'
|
27
35
|
require_relative './config/globals'
|
28
|
-
require_relative './config/
|
36
|
+
require_relative './config/run_opts'
|
29
37
|
|
30
38
|
require_relative './mixins/mixer'
|
39
|
+
require_relative './mixins/cm_backend_testing'
|
40
|
+
require_relative './mixins/cli_state_helpers'
|
31
41
|
|
32
42
|
require_relative './utils/mixing'
|
33
43
|
require_relative './utils/helm'
|
34
|
-
require_relative './utils/kubectl'
|
35
44
|
require_relative './utils/cli'
|
36
45
|
require_relative './utils/values'
|
37
46
|
require_relative './main/code_gen'
|
38
47
|
|
39
|
-
require_relative './
|
48
|
+
require_relative './main/mixer'
|
49
|
+
|
50
|
+
require_relative './cli/entry_serializers'
|
51
|
+
|
52
|
+
require_relative './mixins/entry_tag_logic'
|
53
|
+
require_relative './state/entry_set'
|
54
|
+
|
55
|
+
require_relative './state/base_backend'
|
56
|
+
require_relative './state/mixers'
|
57
|
+
require_relative './state/config_map_backend'
|
58
|
+
|
59
|
+
require_relative './main/errors'
|
60
|
+
require_relative './cli/base_handler'
|
61
|
+
require_relative './cli/config_handler'
|
40
62
|
require_relative './cli/values_handler'
|
41
63
|
require_relative './cli/project_handler'
|
42
|
-
require_relative './cli/
|
43
|
-
require_relative './
|
64
|
+
require_relative './cli/state_handler'
|
65
|
+
require_relative './cli/root_handler'
|