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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 844a7ee42c68f643fd43d0a365d497061cf79b9d6176612d9af17789676a32c9
4
- data.tar.gz: 0fa583609a29a99ab0019c46ab1a11f99f240477fce2ca5a8ce3c7017e1a3aa4
3
+ metadata.gz: 2c7feca84f2b9ee27f1334a5e52025d16fb1a368d9d728a7de6e771d59fd65cc
4
+ data.tar.gz: 9834cee7f2e2c660eb141b52717e4f797548c2f71ce5c6e45fbf1cd763f85315
5
5
  SHA512:
6
- metadata.gz: 9a9d89cbdb45952d3baec555ef373c16b8ca4f59fb3bd88d31335f0eb40ca5537995085c6973c58f08481782202c4371af0db57ae022f75470e547d872833005
7
- data.tar.gz: 42b22d628d97405b95c96b51fd7dee0c5b013682f7e482b5792ded5570d09cc97e0bd76d7cf08c922b87cc985d508a5e7af33df64341b9822c49b53f197d54a9
6
+ metadata.gz: 15dca87ecb11f965ff00ba8ec715887764f896e23ddc847b3ef1ada56b68c61e12f072d8efd3fe281bf7d8777b1d7c8c32a4f338bc61e6db3c9d0eac0b5f69a5
7
+ data.tar.gz: f52084f692bda7ab3406e7142caf3c9521f2b62f0ddd1d8dc3b96b2fd766dd17ccd81966ede965383308f5a4e8ab56d82a2b0173d8fe2a381df5e203415288d8
@@ -0,0 +1,180 @@
1
+ module Kerbi
2
+ module Cli
3
+
4
+ ##
5
+ # Superclass for all Thor CLI handlers.
6
+ class BaseHandler < Thor
7
+ include Kerbi::Mixins::CliStateHelpers
8
+
9
+ protected
10
+
11
+ ##
12
+ # Convenience method for instantiating (and memoizating) a state
13
+ # management backend.
14
+ # @param [String] namespace force a k8s ns, otherwise uses run option's
15
+ # @return [Kerbi::State::Backend]
16
+ def state_backend(namespace=nil)
17
+ @_state_backend ||= generate_state_backend(namespace)
18
+ end
19
+
20
+ ##
21
+ # Looks at the CLI options to determine which
22
+ # data serializer should be used.
23
+ # @param [Hash] options
24
+ # @return [Class<Kerbi::Cli::BaseSerializer>|null]
25
+ def resolve_serializer(options={})
26
+ if run_opts.output_json?
27
+ winner = options[:json_serializer]
28
+ elsif run_opts.output_yaml?
29
+ winner = options[:yaml_serializer]
30
+ elsif run_opts.output_table?
31
+ winner = options[:table_serializer]
32
+ else
33
+ raise "Unknown output format '#{run_opts.output_format}'"
34
+ end
35
+ winner || options[:serializer]
36
+ end
37
+
38
+ ##
39
+ # Pretty prints data to STDOUT selecting the right
40
+ # serializer, and coercing data if requested by the
41
+ # caller.
42
+ # @param [Hash|Array<Object>] dicts
43
+ def echo_data(items, **opts)
44
+ utils = Kerbi::Utils::Cli
45
+ serializer = resolve_serializer(opts)
46
+ items = utils.coerce_hash_or_array(items, opts)
47
+ if serializer
48
+ if items.is_a?(Array)
49
+ items = items.map{ |e| serializer.new(e).serialize }
50
+ else
51
+ items = serializer.new(items).serialize
52
+ end
53
+ end
54
+
55
+ if run_opts.output_yaml?
56
+ printable_str = utils.dicts_to_yaml(items)
57
+ elsif run_opts.output_json?
58
+ printable_str = utils.dicts_to_json(items)
59
+ elsif run_opts.output_table?
60
+ printable_str = utils.list_to_table(items, serializer)
61
+ else
62
+ raise "Unknown output format '#{run_opts.output_format}'"
63
+ end
64
+
65
+ echo(printable_str)
66
+ end
67
+
68
+ def echo(printable_str)
69
+ $stdout.puts printable_str
70
+ end
71
+
72
+ ##
73
+ # Returns single merged dict containing all values given or
74
+ # pointed to by the CLI args, plus the default values.yaml file.
75
+ # This includes values from files, inline expressions, and the
76
+ # state ConfigMap.
77
+ # @return [Hash] symbol-keyed dict of all loaded values
78
+ def compile_values
79
+ @_compiled_values ||=
80
+ begin
81
+ utils = Kerbi::Utils::Values
82
+
83
+ fname_exprs = run_opts.fname_exprs
84
+ fname_exprs = ["values", *fname_exprs] if run_opts.load_defaults?
85
+
86
+ file_values = utils.from_files(
87
+ fname_exprs,
88
+ root: run_opts.project_root
89
+ )
90
+
91
+ inline_values = utils.from_inlines(run_opts.inline_val_exprs)
92
+ state_values = read_state_values
93
+
94
+ file_values.
95
+ deep_merge(state_values).
96
+ deep_merge(inline_values)
97
+ end
98
+ end
99
+
100
+ ##
101
+ # Compiles the values from only the default values file,
102
+ # e.g values.yaml, or values/values.yaml.
103
+ # @return [Hash]
104
+ def compile_default_values
105
+ utils = Kerbi::Utils::Values
106
+ if run_opts.load_defaults?
107
+ utils.from_files(['values'], root: run_opts.project_root)
108
+ else
109
+ {}
110
+ end
111
+ end
112
+
113
+ ##
114
+ # Called by command-methods that need to start with a set
115
+ # of default options that is not the normal default,
116
+ # i.e that is not Kerbi::Consts::OptionDefaults::BASE.
117
+ # @param [Hash] defaults alternative defaults
118
+ def prep_opts(defaults)
119
+ @_options_obj = Kerbi::RunOpts.new(options, defaults)
120
+ end
121
+
122
+ ##
123
+ # Returns a re-usable instance of the CLI-args
124
+ # wrapper Kerbi::RunOpts
125
+ # @return [Kerbi::RunOpts] re-usable instance
126
+ def run_opts
127
+ @_options_obj ||= Kerbi::RunOpts.new(
128
+ options,
129
+ Kerbi::Consts::OptionDefaults::BASE
130
+ )
131
+ end
132
+
133
+ ##
134
+ # Convenience class method for declaring a Thor subcommand
135
+ # metadata bundle, in accordance with the schema in
136
+ # Kerbi::Consts::OptionSchemas.
137
+ # @param [Hash] _schema a dict from Kerbi::Consts::OptionSchemas
138
+ # @param [Class<Thor>] handler_cls the handler
139
+ def self.sub_cmd_meta(_schema, handler_cls)
140
+ schema = _schema.deep_dup
141
+ desc(schema[:name], schema[:desc])
142
+ subcommand schema[:name], handler_cls
143
+ end
144
+
145
+ def self.option_defaults_hash
146
+ @_option_defaults_hash ||= {}
147
+ end
148
+
149
+ # def self.set_default_options_for_next(defaults)
150
+ # defaults ||= Kerbi::Consts::OptionDefaults::BASE
151
+ # option_defaults_hash[:__next__] = defaults.deep_dup
152
+ # end
153
+
154
+ ##
155
+ # Convenience class method for declaring a Thor command
156
+ # metadata bundle, in accordance with the schema in
157
+ # Kerbi::Consts::OptionSchemas.
158
+ # @param [Hash] _schema a dict from Kerbi::Consts::OptionSchemas
159
+ def self.cmd_meta(_schema)
160
+ schema = _schema.deep_dup
161
+ desc(schema[:name], schema[:desc])
162
+ # set_default_options_for_next(schema[:defaults])
163
+ (schema[:options] || []).each do |opt_schema|
164
+ opt_key = opt_schema.delete(:key)
165
+ self.option opt_key, opt_schema
166
+ end
167
+ end
168
+
169
+ def self.exit_on_failure?
170
+ true
171
+ end
172
+
173
+ private
174
+
175
+ def utils
176
+ Kerbi::Utils
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,120 @@
1
+ module Kerbi
2
+ module Cli
3
+ class BaseSerializer
4
+
5
+ attr_reader :object
6
+ attr_reader :parent_object
7
+ attr_reader :context
8
+
9
+ def initialize(object, context={})
10
+ @object = object
11
+ @parent_object = context.delete(:parent_object)
12
+ @context = context
13
+ end
14
+
15
+ def serialize
16
+ flat_attrs = serialize_flat_attrs
17
+ assoc_attrs = serialize_associations
18
+ poss_attrs = serialize_possessions
19
+ flat_attrs.merge(assoc_attrs).merge(poss_attrs)
20
+ end
21
+
22
+ def serialize_flat_attrs
23
+ Hash[self.class.attributes.map do |attribute_name|
24
+ [attribute_name, attribute_value(attribute_name)]
25
+ end]
26
+ end
27
+
28
+ def serialize_possessions
29
+ Hash[self.class.possessions.map do |possession|
30
+ attr = possession[:attr] || possession[:name]
31
+ value = attribute_value(attr)
32
+ serialized_value = value && begin
33
+ serialized_relation_value(possession, value)
34
+ end
35
+ [attr, serialized_value]
36
+ end]
37
+ end
38
+
39
+ def serialize_associations
40
+ Hash[self.class.associations.map do |association|
41
+ attr = association[:attr] || association[:name]
42
+ values = attribute_value(attr)
43
+ values = limit_has_many(attr, values)
44
+ serialized_array = values.map do |value|
45
+ serialized_relation_value(association, value)
46
+ end
47
+ [attr, serialized_array]
48
+ end]
49
+ end
50
+
51
+ def serialized_relation_value(relation, value)
52
+ serializer = relation[:serializer]
53
+ new_context = context.merge(parent_object: object)
54
+ serializer.serialize(value, new_context)
55
+ end
56
+
57
+ def attribute_value(name)
58
+ receiver = self.respond_to?(name) ? self : object
59
+ receiver.send(name)
60
+ end
61
+
62
+ def limit_has_many(association_name, query_result)
63
+ limit_quantity = context["#{association_name}_limit".to_sym]
64
+ limit_quantity && query_result.limit(limit_quantity) || query_result
65
+ end
66
+
67
+ def key
68
+ object.id
69
+ end
70
+
71
+ def self.has_many(name, serializer, attr=nil)
72
+ @associations ||= []
73
+ @associations << {
74
+ name: name.to_sym,
75
+ serializer: serializer,
76
+ attr: attr
77
+ }
78
+ end
79
+
80
+ def self.has_one(name, serializer, attr=nil)
81
+ @possessions ||= []
82
+ @possessions << {
83
+ name: name.to_sym,
84
+ serializer: serializer,
85
+ attr: attr
86
+ }
87
+ end
88
+
89
+ def self.possessions
90
+ @possessions ||= []
91
+ end
92
+
93
+ def self.associations
94
+ @associations ||= []
95
+ end
96
+
97
+ def self.attributes
98
+ @attributes ||= []
99
+ end
100
+
101
+ def self.has_attributes(*attrs)
102
+ @attributes = attrs.map(&:to_sym)
103
+ end
104
+
105
+ def self.header_titles
106
+ attributes.map(&:to_s).map(&:upcase)
107
+ end
108
+
109
+ def self.serialize(object, context={})
110
+ instance = new(object, context)
111
+ instance.serialize
112
+ end
113
+
114
+ def self.serialize_many(objects, context={})
115
+ out = objects.map {|object| serialize(object, context)}
116
+ { data: out }
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,51 @@
1
+ module Kerbi
2
+ module Cli
3
+ class ConfigHandler < BaseHandler
4
+
5
+ cmd_meta Kerbi::Consts::CommandSchemas::CONFIG_LOCATION
6
+ def location
7
+ echo Kerbi::ConfigFile.file_path
8
+ end
9
+
10
+ cmd_meta Kerbi::Consts::CommandSchemas::CONFIG_SET
11
+ def set(key, new_value)
12
+ raise_if_bad_write(key)
13
+ old_value = run_opts.options[key]
14
+ Kerbi::ConfigFile.patch(key => new_value)
15
+
16
+ name = "config[#{key}]"
17
+ change_str = "from #{old_value} => #{new_value}"
18
+ echo "Updated #{name} #{change_str}".colorize(:green)
19
+ end
20
+
21
+ cmd_meta Kerbi::Consts::CommandSchemas::CONFIG_GET
22
+ def get(key)
23
+ echo run_opts.options[key]
24
+ end
25
+
26
+ cmd_meta Kerbi::Consts::CommandSchemas::CONFIG_SHOW
27
+ def show
28
+ echo_data(run_opts.options)
29
+ end
30
+
31
+ cmd_meta Kerbi::Consts::CommandSchemas::CONFIG_RESET
32
+ def reset
33
+ Kerbi::ConfigFile.reset
34
+ echo("Config reset".colorize(:green))
35
+ echo("See #{Kerbi::ConfigFile.file_path}")
36
+ end
37
+
38
+ private
39
+
40
+ def raise_if_bad_write(key)
41
+ unless legal_keys.include?(key)
42
+ raise Kerbi::IllegalConfigWrite.new(key)
43
+ end
44
+ end
45
+
46
+ def legal_keys
47
+ Kerbi::Consts::OptionKeys::LEGAL_CONFIG_FILE_KEYS
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,99 @@
1
+ module Kerbi
2
+ module Cli
3
+ module EntrySerializationHelpers
4
+ def defined_or_na(actual_value)
5
+ if !(value = actual_value).nil?
6
+ if block_given?
7
+ begin
8
+ yield(value)
9
+ rescue
10
+ "ERR"
11
+ end
12
+ else
13
+ value
14
+ end
15
+ else
16
+ "N/A"
17
+ end
18
+ end
19
+
20
+ def colored_tag
21
+ #noinspection RubyResolve
22
+ color = object.committed? ? :blue : :yellow
23
+ object.tag.colorize(color)
24
+ end
25
+
26
+ end
27
+
28
+ class EntryYamlJsonSerializer < Kerbi::Cli::BaseSerializer
29
+ include Kerbi::Cli::EntrySerializationHelpers
30
+
31
+ has_attributes(
32
+ :tag,
33
+ :message,
34
+ :created_at,
35
+ :values,
36
+ :default_values,
37
+ :overridden_keys
38
+ )
39
+ end
40
+
41
+ class FullEntryRowSerializer < Kerbi::Cli::BaseSerializer
42
+ include Kerbi::Cli::EntrySerializationHelpers
43
+
44
+ has_attributes(
45
+ :tag,
46
+ :message,
47
+ :created_at,
48
+ :values,
49
+ :default_values,
50
+ :overridden_keys
51
+ )
52
+
53
+ def tag
54
+ #noinspection RubyResolve
55
+ colored_tag.bold
56
+ end
57
+ end
58
+
59
+ class EntryRowSerializer < Kerbi::Cli::BaseSerializer
60
+ include Kerbi::Cli::EntrySerializationHelpers
61
+
62
+ has_attributes(
63
+ :tag,
64
+ :message,
65
+ :assignments,
66
+ :overrides,
67
+ :created_at
68
+ )
69
+
70
+ def tag
71
+ colored_tag
72
+ end
73
+
74
+ def message
75
+ (object.message || "").truncate(27)
76
+ end
77
+
78
+ def assignments
79
+ defined_or_na(object.values) do |values|
80
+ Kerbi::Utils::Misc.flatten_hash(values).count
81
+ end
82
+ end
83
+
84
+ def overrides
85
+ defined_or_na(object.overrides_delta) do |differences|
86
+ Kerbi::Utils::Misc.flatten_hash(differences).count
87
+ end
88
+ end
89
+
90
+ def created_at
91
+ if object.created_at
92
+ Kerbi::Utils::Misc.pretty_time_elapsed(object.created_at)
93
+ else
94
+ "N/A"
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -2,11 +2,11 @@ module Kerbi
2
2
  module Cli
3
3
  class ProjectHandler < BaseHandler
4
4
 
5
- thor_meta Kerbi::Consts::CommandSchemas::NEW_PROJECT
5
+ cmd_meta Kerbi::Consts::CommandSchemas::NEW_PROJECT
6
6
  def new_project(project_name)
7
7
  generator = Kerbi::CodeGen::ProjectGenerator.new(
8
8
  project_name: project_name,
9
- ruby_version: cli_opts.ruby_version,
9
+ ruby_version: run_opts.ruby_version,
10
10
  verbose: true
11
11
  )
12
12
  success = generator.run
@@ -2,6 +2,7 @@ module Kerbi
2
2
 
3
3
  class Console
4
4
  attr_reader :values
5
+
5
6
  def initialize(values)
6
7
  @values = values
7
8
  end
@@ -12,36 +13,54 @@ module Kerbi
12
13
  end
13
14
 
14
15
  module Cli
15
-
16
16
  ##
17
17
  # Top level CLI command handler with Thor.
18
18
  class RootHandler < BaseHandler
19
19
 
20
- cmd_schemas = Kerbi::Consts::CommandSchemas
20
+ ##
21
+ # Two things happen here:
22
+ # 1. Kerbi::Globals.reset is necessary for testing, because memory
23
+ # is not flushed.
24
+ def self.start(*args, **kwargs)
25
+ begin
26
+ Kerbi::Globals.reset
27
+ super
28
+ rescue Kerbi::Error => e
29
+ #noinspection RubyResolve
30
+ puts e.to_s.colorize(:red).bold
31
+ end
32
+ end
21
33
 
22
- thor_meta cmd_schemas::TEMPLATE
34
+ cmd_meta Kerbi::Consts::CommandSchemas::TEMPLATE
23
35
  # @param [String] release_name helm-like Kubernetes release name
24
- # @param [String] path root dir from which to search for kerbifile.rb
25
- def template(release_name, path)
26
- utils::Cli.load_kerbifile(path)
27
- values = self.compile_values
36
+ def template(release_name)
37
+ utils::Cli.load_kerbifile(run_opts.project_root)
38
+ values = compile_values
39
+ persist_compiled_values
28
40
  mixer_classes = Kerbi::Globals.mixers
29
41
  res_dicts = utils::Cli.run_mixers(mixer_classes, values, release_name)
30
- print_dicts(res_dicts)
42
+ echo_data(res_dicts, coerce_type: "Array")
31
43
  end
32
44
 
33
- thor_meta cmd_schemas::CONSOLE
45
+ cmd_meta Kerbi::Consts::CommandSchemas::CONSOLE
34
46
  def console
35
- utils::Cli.load_kerbifile(".")
36
- values = self.compile_values
47
+ utils::Cli.load_kerbifile(run_opts.project_root)
48
+ values = compile_values
37
49
  ARGV.clear
38
50
  IRB.setup(eval("__FILE__"), argv: [])
39
51
  workspace = IRB::WorkSpace.new(Console.new(values))
40
52
  IRB::Irb.new(workspace).run(IRB.conf)
41
53
  end
42
54
 
43
- thor_sub_meta cmd_schemas::VALUES_SUPER, ValuesHandler
44
- thor_sub_meta cmd_schemas::PROJECT_SUPER, ProjectHandler
55
+ cmd_meta Kerbi::Consts::CommandSchemas::SHOW_VERSION
56
+ def version
57
+ puts "1"
58
+ end
59
+
60
+ sub_cmd_meta Kerbi::Consts::CommandSchemas::VALUES_SUPER, ValuesHandler
61
+ sub_cmd_meta Kerbi::Consts::CommandSchemas::PROJECT_SUPER, ProjectHandler
62
+ sub_cmd_meta Kerbi::Consts::CommandSchemas::STATE_SUPER, StateHandler
63
+ sub_cmd_meta Kerbi::Consts::CommandSchemas::CONFIG_SUPER, ConfigHandler
45
64
  end
46
65
  end
47
66
  end
@@ -0,0 +1,95 @@
1
+ module Kerbi
2
+ module Cli
3
+ class StateHandler < BaseHandler
4
+ cmd_meta Kerbi::Consts::CommandSchemas::INIT_STATE
5
+ # @param [String] namespace refers to a Kubernetes namespace
6
+ def init(namespace)
7
+ state_backend(namespace).provision_missing_resources(
8
+ verbose: run_opts.verbose?
9
+ )
10
+ ns_key = Kerbi::Consts::OptionSchemas::NAMESPACE
11
+ Kerbi::ConfigFile.patch({ns_key => namespace})
12
+ end
13
+
14
+ cmd_meta Kerbi::Consts::CommandSchemas::STATE_STATUS
15
+ def status
16
+ state_backend.test_connection(verbose: run_opts.verbose?)
17
+ end
18
+
19
+ cmd_meta Kerbi::Consts::CommandSchemas::LIST_STATE
20
+ def list
21
+ prep_opts(Kerbi::Consts::OptionDefaults::LIST_STATE)
22
+ echo_data(
23
+ state_backend.entries,
24
+ table_serializer: Kerbi::Cli::EntryRowSerializer,
25
+ serializer: Kerbi::Cli::EntryYamlJsonSerializer
26
+ )
27
+ end
28
+
29
+ cmd_meta Kerbi::Consts::CommandSchemas::SHOW_STATE
30
+ # @param [String] tag_expr e.g 1.9.1, @latest
31
+ def show(tag_expr)
32
+ prep_opts(Kerbi::Consts::OptionDefaults::LIST_STATE)
33
+ entry = find_readable_entry(tag_expr)
34
+ echo_data(
35
+ entry,
36
+ table_serializer: Kerbi::Cli::FullEntryRowSerializer,
37
+ serializer: Kerbi::Cli::EntryYamlJsonSerializer
38
+ )
39
+ end
40
+
41
+ cmd_meta Kerbi::Consts::CommandSchemas::RETAG_STATE
42
+ # @param [String] old_tag_expr e.g 1.9.1, @latest
43
+ # @param [String] new_tag_expr e.g 1.9.1, @latest
44
+ def retag(old_tag_expr, new_tag_expr)
45
+ entry = find_readable_entry(old_tag_expr)
46
+ old_tag = entry.retag(new_tag_expr)
47
+ touch_and_save_entry(entry, tag: old_tag)
48
+ end
49
+
50
+ cmd_meta Kerbi::Consts::CommandSchemas::PROMOTE_STATE
51
+ # @param [String] tag_expr e.g 1.9.1, @latest
52
+ def promote(tag_expr)
53
+ entry = find_readable_entry(tag_expr)
54
+ old_name = entry.promote
55
+ touch_and_save_entry(entry, tag: old_name)
56
+ end
57
+
58
+ cmd_meta Kerbi::Consts::CommandSchemas::DEMOTE_STATE
59
+ # @param [String] tag_expr e.g 1.9.1, @latest
60
+ def demote(tag_expr)
61
+ entry = find_readable_entry(tag_expr)
62
+ old_name = entry.demote
63
+ touch_and_save_entry(entry, tag: old_name)
64
+ end
65
+
66
+ cmd_meta Kerbi::Consts::CommandSchemas::SET_STATE_ATTR
67
+ # @param [String] tag_expr e.g 1.9.1, @latest
68
+ # @param [String] attr_name e.g message
69
+ # @param [String] new_value e.g i am a new message
70
+ def set(tag_expr, attr_name, new_value)
71
+ entry = find_readable_entry(tag_expr)
72
+ old_value = entry.assign_attr(attr_name, new_value)
73
+ touch_and_save_entry(entry, attr_name => old_value)
74
+ end
75
+
76
+ cmd_meta Kerbi::Consts::CommandSchemas::DELETE_STATE
77
+ # @param [String] tag_expr e.g 1.9.1, @latest
78
+ def delete(tag_expr)
79
+ entry = find_readable_entry(tag_expr)
80
+ state_backend.delete_entry(entry)
81
+ new_count = state_backend.entries.count
82
+ puts "Deleted state[#{entry.tag}]. Remaining entries: #{new_count}"
83
+ end
84
+
85
+ cmd_meta Kerbi::Consts::CommandSchemas::PRUNE_CANDIDATES_STATE
86
+ def prune_candidates
87
+ old_count = entry_set.entries.count
88
+ entry_set.prune_candidates
89
+ state_backend.save
90
+ new_count = entry_set.entries.count
91
+ puts "Pruned #{old_count - new_count} state entries"
92
+ end
93
+ end
94
+ end
95
+ end
@@ -1,10 +1,11 @@
1
1
  module Kerbi
2
2
  module Cli
3
3
  class ValuesHandler < BaseHandler
4
- thor_meta Kerbi::Consts::CommandSchemas::SHOW_VALUES
4
+ cmd_meta Kerbi::Consts::CommandSchemas::SHOW_VALUES
5
5
  def show
6
- values = self.compile_values
7
- print_dicts(values)
6
+ values = compile_values
7
+ persist_compiled_values
8
+ echo_data(values, coerce_type: "Hash")
8
9
  end
9
10
  end
10
11
  end