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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cli/base_handler.rb +180 -0
  3. data/lib/cli/base_serializer.rb +120 -0
  4. data/lib/cli/config_handler.rb +51 -0
  5. data/lib/cli/entry_serializers.rb +99 -0
  6. data/lib/cli/project_handler.rb +2 -2
  7. data/lib/cli/root_handler.rb +32 -13
  8. data/lib/cli/state_handler.rb +95 -0
  9. data/lib/cli/values_handler.rb +4 -3
  10. data/lib/config/cli_schema.rb +299 -27
  11. data/lib/config/config_file.rb +60 -0
  12. data/lib/config/globals.rb +4 -0
  13. data/lib/config/run_opts.rb +150 -0
  14. data/lib/config/state_consts.rb +10 -0
  15. data/lib/kerbi.rb +31 -9
  16. data/lib/main/errors.rb +109 -0
  17. data/lib/main/mixer.rb +12 -8
  18. data/lib/mixins/cli_state_helpers.rb +136 -0
  19. data/lib/mixins/cm_backend_testing.rb +95 -0
  20. data/lib/mixins/entry_tag_logic.rb +183 -0
  21. data/lib/state/base_backend.rb +59 -0
  22. data/lib/state/config_map_backend.rb +119 -0
  23. data/lib/state/entry.rb +173 -0
  24. data/lib/state/entry_set.rb +137 -0
  25. data/lib/state/metadata.yaml.erb +11 -0
  26. data/lib/state/mixers.rb +23 -0
  27. data/lib/state/resources.yaml.erb +17 -0
  28. data/lib/utils/cli.rb +77 -10
  29. data/lib/utils/helm.rb +10 -12
  30. data/lib/utils/k8s_auth.rb +87 -0
  31. data/lib/utils/misc.rb +36 -1
  32. data/lib/utils/mixing.rb +1 -1
  33. data/lib/utils/values.rb +13 -22
  34. data/spec/cli/config_handler_spec.rb +38 -0
  35. data/spec/cli/root_handler_spec.rb +99 -0
  36. data/spec/cli/state_handler_spec.rb +139 -0
  37. data/spec/cli/values_handler_spec.rb +17 -0
  38. data/spec/expectations/common/bad-tag.txt +1 -0
  39. data/spec/expectations/config/bad-set.txt +1 -0
  40. data/spec/expectations/config/set.txt +1 -0
  41. data/spec/expectations/config/show-default.yaml +6 -0
  42. data/spec/expectations/root/template-inlines.yaml +31 -0
  43. data/spec/expectations/root/template-production.yaml +31 -0
  44. data/spec/expectations/root/template-read-inlines.yaml +31 -0
  45. data/spec/expectations/root/template-read.yaml +31 -0
  46. data/spec/expectations/root/template-write.yaml +31 -0
  47. data/spec/expectations/root/template.yaml +31 -0
  48. data/spec/expectations/root/values.json +28 -0
  49. data/spec/expectations/state/delete.txt +1 -0
  50. data/spec/expectations/state/demote.txt +1 -0
  51. data/spec/expectations/state/init-already-existed.txt +2 -0
  52. data/spec/expectations/state/init-both-created.txt +2 -0
  53. data/spec/expectations/state/list.json +51 -0
  54. data/spec/expectations/state/list.txt +6 -0
  55. data/spec/expectations/state/list.yaml +35 -0
  56. data/spec/expectations/state/promote.txt +1 -0
  57. data/spec/expectations/state/prune-candidates.txt +1 -0
  58. data/spec/expectations/state/retag.txt +1 -0
  59. data/spec/expectations/state/set.txt +1 -0
  60. data/spec/expectations/state/show.json +13 -0
  61. data/spec/expectations/state/show.txt +13 -0
  62. data/spec/expectations/state/show.yaml +8 -0
  63. data/spec/expectations/state/status-all-working.txt +4 -0
  64. data/spec/expectations/state/status-not-provisioned.txt +4 -0
  65. data/spec/expectations/values/order-of-precedence.yaml +4 -0
  66. data/spec/main/configmap_backend_spec.rb +109 -0
  67. data/spec/main/state_entry_set_spec.rb +112 -0
  68. data/spec/main/state_entry_spec.rb +109 -0
  69. data/spec/spec_helper.rb +87 -1
  70. data/spec/utils/helm_spec.rb +1 -21
  71. data/spec/utils/k8s_auth_spec.rb +32 -0
  72. data/spec/utils/misc_utils_spec.rb +9 -0
  73. data/spec/utils/values_utils_spec.rb +12 -19
  74. metadata +114 -13
  75. data/lib/cli/base.rb +0 -83
  76. data/lib/config/cli_opts.rb +0 -50
  77. data/lib/config/manager.rb +0 -36
  78. data/lib/main/state_manager.rb +0 -47
  79. data/lib/utils/kubectl.rb +0 -58
  80. data/spec/main/examples_spec.rb +0 -12
  81. data/spec/main/state_manager_spec.rb +0 -84
  82. data/spec/utils/state_utils.rb +0 -15
@@ -2,51 +2,178 @@ module Kerbi
2
2
  module Consts
3
3
 
4
4
  module OptionKeys
5
- OUTPUT_FMT = "output"
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
- USE_STATE_VALUES = "use-state-values"
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
- USE_STATE_VALUES = {
21
- key: OptionKeys::USE_STATE_VALUES,
22
- desc: "If true, merges in values loaded from state ConfigMap",
23
- type: "boolean"
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::VALUE_FNAMES,
70
- OptionSchemas::INLINE_ASSIGNMENT
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::VALUE_FNAMES,
98
- OptionSchemas::INLINE_ASSIGNMENT
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
@@ -3,5 +3,9 @@ module Kerbi
3
3
  def self.mixers
4
4
  $_mixers ||= []
5
5
  end
6
+
7
+ def self.reset
8
+ $_mixers = []
9
+ end
6
10
  end
7
11
  end
@@ -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
@@ -0,0 +1,10 @@
1
+ module Kerbi
2
+ module State
3
+ module Consts
4
+ CREATOR_ATTR = :creator
5
+ CREATOR_VAL = "kerbi"
6
+ ENTRIES_ATTR = :entries
7
+ RESOURCE_NAME = "kerbi-state-tracker"
8
+ end
9
+ end
10
+ 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/manager'
33
+ require_relative './config/state_consts'
34
+ require_relative './config/config_file'
27
35
  require_relative './config/globals'
28
- require_relative './config/cli_opts'
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 './cli/base'
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/root_handler'
43
- require_relative './main/mixer'
64
+ require_relative './cli/state_handler'
65
+ require_relative './cli/root_handler'