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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c7feca84f2b9ee27f1334a5e52025d16fb1a368d9d728a7de6e771d59fd65cc
|
4
|
+
data.tar.gz: 9834cee7f2e2c660eb141b52717e4f797548c2f71ce5c6e45fbf1cd763f85315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/cli/project_handler.rb
CHANGED
@@ -2,11 +2,11 @@ module Kerbi
|
|
2
2
|
module Cli
|
3
3
|
class ProjectHandler < BaseHandler
|
4
4
|
|
5
|
-
|
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:
|
9
|
+
ruby_version: run_opts.ruby_version,
|
10
10
|
verbose: true
|
11
11
|
)
|
12
12
|
success = generator.run
|
data/lib/cli/root_handler.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
34
|
+
cmd_meta Kerbi::Consts::CommandSchemas::TEMPLATE
|
23
35
|
# @param [String] release_name helm-like Kubernetes release name
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
-
|
42
|
+
echo_data(res_dicts, coerce_type: "Array")
|
31
43
|
end
|
32
44
|
|
33
|
-
|
45
|
+
cmd_meta Kerbi::Consts::CommandSchemas::CONSOLE
|
34
46
|
def console
|
35
|
-
utils::Cli.load_kerbifile(
|
36
|
-
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
|
-
|
44
|
-
|
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
|
data/lib/cli/values_handler.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Kerbi
|
2
2
|
module Cli
|
3
3
|
class ValuesHandler < BaseHandler
|
4
|
-
|
4
|
+
cmd_meta Kerbi::Consts::CommandSchemas::SHOW_VALUES
|
5
5
|
def show
|
6
|
-
values =
|
7
|
-
|
6
|
+
values = compile_values
|
7
|
+
persist_compiled_values
|
8
|
+
echo_data(values, coerce_type: "Hash")
|
8
9
|
end
|
9
10
|
end
|
10
11
|
end
|