kuber_kit 0.4.4 → 0.4.5
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/Gemfile.lock +17 -3
- data/TODO.md +1 -2
- data/kuber_kit.gemspec +1 -0
- data/lib/kuber_kit.rb +1 -0
- data/lib/kuber_kit/actions/configuration_loader.rb +19 -18
- data/lib/kuber_kit/actions/kubectl_describe.rb +56 -0
- data/lib/kuber_kit/actions/service_deployer.rb +22 -13
- data/lib/kuber_kit/cli.rb +12 -3
- data/lib/kuber_kit/container.rb +4 -0
- data/lib/kuber_kit/core/configuration.rb +4 -2
- data/lib/kuber_kit/core/configuration_factory.rb +1 -0
- data/lib/kuber_kit/service_deployer/service_list_resolver.rb +11 -4
- data/lib/kuber_kit/shell/commands/kubectl_commands.rb +11 -10
- data/lib/kuber_kit/ui/interactive.rb +5 -11
- data/lib/kuber_kit/ui/simple.rb +2 -3
- data/lib/kuber_kit/version.rb +1 -1
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dfc1d29b7283361acaed01c9ddd08a29d121020c75af2d6ec7e4245d347021fb
|
4
|
+
data.tar.gz: 7e9063497954963223629beaa6d6ec914851c5e8c9633fa35d50986a95149aec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0dd8904d21b8ca6648111856a6a5d8b4b3d1950a5db786f108f2906bdfc2388c6f515b4d833ce87f30f3c5098ebd1807aa0e3ef832903a4bec180b66788f3dc
|
7
|
+
data.tar.gz: b9cb8446b31460a27571b8a91defbf7882ff0ecf1d8d97dd581edaa496d2f60dae58b4bd8bd6fad091c5448a16830cee48259821751211e4e6751d2128d88fe2
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
kuber_kit (0.4.
|
4
|
+
kuber_kit (0.4.5)
|
5
5
|
cli-ui
|
6
6
|
contracts-lite
|
7
7
|
dry-auto_inject
|
8
8
|
net-ssh
|
9
9
|
thor
|
10
|
+
tty-prompt
|
10
11
|
|
11
12
|
GEM
|
12
13
|
remote: https://rubygems.org/
|
13
14
|
specs:
|
14
15
|
cli-ui (1.4.0)
|
15
16
|
coderay (1.1.3)
|
16
|
-
concurrent-ruby (1.1.
|
17
|
+
concurrent-ruby (1.1.8)
|
17
18
|
contracts-lite (0.15.0)
|
18
19
|
diff-lcs (1.4.4)
|
19
20
|
docile (1.3.2)
|
@@ -29,6 +30,8 @@ GEM
|
|
29
30
|
concurrent-ruby (~> 1.0)
|
30
31
|
method_source (1.0.0)
|
31
32
|
net-ssh (6.1.0)
|
33
|
+
pastel (0.8.0)
|
34
|
+
tty-color (~> 0.5)
|
32
35
|
pry (0.13.1)
|
33
36
|
coderay (~> 1.1)
|
34
37
|
method_source (~> 1.0)
|
@@ -52,7 +55,18 @@ GEM
|
|
52
55
|
simplecov_json_formatter (~> 0.1)
|
53
56
|
simplecov-html (0.12.3)
|
54
57
|
simplecov_json_formatter (0.1.2)
|
55
|
-
thor (1.0
|
58
|
+
thor (1.1.0)
|
59
|
+
tty-color (0.6.0)
|
60
|
+
tty-cursor (0.7.1)
|
61
|
+
tty-prompt (0.23.0)
|
62
|
+
pastel (~> 0.8)
|
63
|
+
tty-reader (~> 0.8)
|
64
|
+
tty-reader (0.9.0)
|
65
|
+
tty-cursor (~> 0.7)
|
66
|
+
tty-screen (~> 0.8)
|
67
|
+
wisper (~> 2.0)
|
68
|
+
tty-screen (0.8.1)
|
69
|
+
wisper (2.0.1)
|
56
70
|
|
57
71
|
PLATFORMS
|
58
72
|
ruby
|
data/TODO.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
-
|
1
|
+
- add kit get method for interactive kubernetes
|
2
2
|
- do not show result for images list, if list is too large
|
3
3
|
- kit status should show the list of services and their status, with ability to select & view logs
|
4
|
-
- allow deploying only services enabled for specific configuration
|
5
4
|
- find a way to always deploy some service, e.g. for migrations and env_files
|
6
5
|
- template should be able to set default attributes
|
7
6
|
- template should be able to depend on image?
|
data/kuber_kit.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_dependency "thor"
|
29
29
|
spec.add_dependency "cli-ui"
|
30
30
|
spec.add_dependency "net-ssh"
|
31
|
+
spec.add_dependency "tty-prompt"
|
31
32
|
|
32
33
|
spec.add_development_dependency "bundler", "~> 1.17"
|
33
34
|
spec.add_development_dependency "rake", "~> 10.0"
|
data/lib/kuber_kit.rb
CHANGED
@@ -167,6 +167,7 @@ module KuberKit
|
|
167
167
|
autoload :KubectlApplier, 'actions/kubectl_applier'
|
168
168
|
autoload :KubectlAttacher, 'actions/kubectl_attacher'
|
169
169
|
autoload :KubectlConsole, 'actions/kubectl_console'
|
170
|
+
autoload :KubectlDescribe, 'actions/kubectl_describe'
|
170
171
|
autoload :KubectlLogs, 'actions/kubectl_logs'
|
171
172
|
end
|
172
173
|
|
@@ -18,6 +18,7 @@ class KuberKit::Actions::ConfigurationLoader
|
|
18
18
|
infra_path = options[:infra_path] || File.join(root_path, configs.infra_dirname)
|
19
19
|
configurations_path = options[:configurations_path] || File.join(root_path, configs.configurations_dirname)
|
20
20
|
configuration_name = options[:configuration] || ENV["KUBER_KIT_CONFIGURATION"]
|
21
|
+
load_inventory = options.fetch(:load_inventory, true)
|
21
22
|
|
22
23
|
ui.print_debug "ConfigurationLoader", "Launching kuber_kit with:"
|
23
24
|
ui.print_debug "ConfigurationLoader", " Root path: #{root_path.to_s.yellow}"
|
@@ -40,25 +41,27 @@ class KuberKit::Actions::ConfigurationLoader
|
|
40
41
|
load_configurations(configurations_path, configuration_name)
|
41
42
|
load_infrastructure(infra_path)
|
42
43
|
|
43
|
-
|
44
|
-
artifacts
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
if load_inventory
|
45
|
+
ui.create_task("Updating artifacts") do |task|
|
46
|
+
artifacts = KuberKit.current_configuration.artifacts.values
|
47
|
+
artifacts_updater.update(local_shell, artifacts)
|
48
|
+
task.update_title("Updated #{artifacts.count} artifacts")
|
49
|
+
end
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
+
ui.create_task("Loading image definitions") do |task|
|
52
|
+
files = image_store.load_definitions(images_path)
|
51
53
|
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
configs.additional_images_paths.each do |path|
|
55
|
+
files += image_store.load_definitions(path)
|
56
|
+
end
|
55
57
|
|
56
|
-
|
57
|
-
|
58
|
+
task.update_title("Loaded #{files.count} image definitions")
|
59
|
+
end
|
58
60
|
|
59
|
-
|
60
|
-
|
61
|
-
|
61
|
+
ui.create_task("Loading service definitions") do |task|
|
62
|
+
files = service_store.load_definitions(services_path)
|
63
|
+
task.update_title("Loaded #{files.count} service definitions")
|
64
|
+
end
|
62
65
|
end
|
63
66
|
|
64
67
|
true
|
@@ -84,9 +87,7 @@ class KuberKit::Actions::ConfigurationLoader
|
|
84
87
|
|
85
88
|
if configuration_store.count > 1 && configuration_name.nil?
|
86
89
|
options = all_configurations.map(&:configuration_name).map(&:to_s)
|
87
|
-
ui.prompt("Please select configuration name (or set it using -C option)", options)
|
88
|
-
configuration_name = selection
|
89
|
-
end
|
90
|
+
configuration_name = ui.prompt("Please select configuration name (or set it using -C option)", options)
|
90
91
|
end
|
91
92
|
|
92
93
|
KuberKit.set_configuration_name(configuration_name)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class KuberKit::Actions::KubectlDescribe
|
2
|
+
include KuberKit::Import[
|
3
|
+
"shell.kubectl_commands",
|
4
|
+
"shell.local_shell",
|
5
|
+
"ui"
|
6
|
+
]
|
7
|
+
|
8
|
+
Contract Maybe[String], Hash => Any
|
9
|
+
def call(resource_name, options)
|
10
|
+
kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
|
11
|
+
deployer_namespace = KuberKit.current_configuration.deployer_namespace
|
12
|
+
|
13
|
+
if !resource_name
|
14
|
+
resource_name = get_resource_name
|
15
|
+
end
|
16
|
+
|
17
|
+
args = nil
|
18
|
+
if options[:follow]
|
19
|
+
args = "-f"
|
20
|
+
end
|
21
|
+
|
22
|
+
kubectl_commands.describe(
|
23
|
+
local_shell, resource_name,
|
24
|
+
args: args,
|
25
|
+
kubeconfig_path: kubeconfig_path,
|
26
|
+
namespace: deployer_namespace
|
27
|
+
)
|
28
|
+
|
29
|
+
true
|
30
|
+
rescue KuberKit::Error => e
|
31
|
+
ui.print_error("Error", e.message)
|
32
|
+
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_resource_name
|
37
|
+
deployments = kubectl_commands.get_resources(local_shell, "deployments", jsonpath: ".items[*].metadata.name")
|
38
|
+
options = deployments.split(" ").map{|d| "deploy/#{d}" }
|
39
|
+
options += ["ingresses", "pods"]
|
40
|
+
option = ui.prompt("Please select resource to describe", options)
|
41
|
+
|
42
|
+
if option == "ingresses"
|
43
|
+
ingresses = kubectl_commands.get_resources(local_shell, "ingresses", jsonpath: ".items[*].metadata.name")
|
44
|
+
options = ingresses.split(" ").map{|d| "ingresses/#{d}" }
|
45
|
+
return ui.prompt("Please select ingress to describe", options)
|
46
|
+
end
|
47
|
+
|
48
|
+
if option == "pods"
|
49
|
+
ingresses = kubectl_commands.get_resources(local_shell, "pods", jsonpath: ".items[*].metadata.name")
|
50
|
+
options = ingresses.split(" ").map{|d| "pods/#{d}" }
|
51
|
+
return ui.prompt("Please select pod to describe", options)
|
52
|
+
end
|
53
|
+
|
54
|
+
option
|
55
|
+
end
|
56
|
+
end
|
@@ -20,8 +20,9 @@ class KuberKit::Actions::ServiceDeployer
|
|
20
20
|
end
|
21
21
|
|
22
22
|
service_names = service_list_resolver.resolve(
|
23
|
-
services:
|
24
|
-
tags:
|
23
|
+
services: services || [],
|
24
|
+
tags: tags || [],
|
25
|
+
enabled_services: KuberKit.current_configuration.enabled_services.map(&:to_s)
|
25
26
|
)
|
26
27
|
|
27
28
|
unless service_names.any?
|
@@ -34,7 +35,7 @@ class KuberKit::Actions::ServiceDeployer
|
|
34
35
|
|
35
36
|
if require_confirmation
|
36
37
|
result = ui.prompt("Please confirm to continue deployment", ["confirm".green, "cancel".red])
|
37
|
-
return false unless
|
38
|
+
return false unless ["confirm".green, "confirm", "yes"].include?(result)
|
38
39
|
end
|
39
40
|
|
40
41
|
services = service_names.map do |service_name|
|
@@ -43,7 +44,11 @@ class KuberKit::Actions::ServiceDeployer
|
|
43
44
|
|
44
45
|
images_names = services.map(&:images).flatten.uniq
|
45
46
|
|
46
|
-
|
47
|
+
unless skip_compile
|
48
|
+
compile_result = compile_images(images_names)
|
49
|
+
return false unless compile_result
|
50
|
+
end
|
51
|
+
|
47
52
|
deployment_result = deploy_services(service_names)
|
48
53
|
|
49
54
|
{ services: service_names, deployment: deployment_result }
|
@@ -75,7 +80,8 @@ class KuberKit::Actions::ServiceDeployer
|
|
75
80
|
end
|
76
81
|
|
77
82
|
def compile_images(images_names)
|
78
|
-
|
83
|
+
return true if images_names.empty?
|
84
|
+
image_compiler.call(images_names, {})
|
79
85
|
end
|
80
86
|
|
81
87
|
def show_tags_selection()
|
@@ -92,12 +98,12 @@ class KuberKit::Actions::ServiceDeployer
|
|
92
98
|
.sort
|
93
99
|
.map(&:to_s)
|
94
100
|
|
95
|
-
ui.prompt("Please select which tag to deploy", tags)
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
+
selected_tag = ui.prompt("Please select which tag to deploy", tags)
|
102
|
+
|
103
|
+
if selected_tag == specific_service_option
|
104
|
+
show_service_selection
|
105
|
+
else
|
106
|
+
[[], [selected_tag]]
|
101
107
|
end
|
102
108
|
end
|
103
109
|
|
@@ -110,8 +116,11 @@ class KuberKit::Actions::ServiceDeployer
|
|
110
116
|
.sort
|
111
117
|
.map(&:to_s)
|
112
118
|
|
113
|
-
|
114
|
-
return [[
|
119
|
+
if services.empty?
|
120
|
+
return [[], []]
|
115
121
|
end
|
122
|
+
|
123
|
+
selected_service = ui.prompt("Please select which service to deploy", services)
|
124
|
+
[[selected_service], []]
|
116
125
|
end
|
117
126
|
end
|
data/lib/kuber_kit/cli.rb
CHANGED
@@ -30,7 +30,7 @@ class KuberKit::CLI < Thor
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
desc "deploy CONTEXT_NAME", "Deploy CONTEXT_NAME with kubectl"
|
33
|
+
desc "deploy -t CONTEXT_NAME", "Deploy CONTEXT_NAME with kubectl"
|
34
34
|
method_option :services, :type => :array, aliases: ["-s"], repeatable: true
|
35
35
|
method_option :tags, :type => :array, aliases: ["-t"], repeatable: true
|
36
36
|
method_option :skip_compile, :type => :boolean, aliases: ["-B"]
|
@@ -108,7 +108,7 @@ class KuberKit::CLI < Thor
|
|
108
108
|
def console(pod_name = nil)
|
109
109
|
setup(options)
|
110
110
|
|
111
|
-
if KuberKit::Container['actions.configuration_loader'].call(options)
|
111
|
+
if KuberKit::Container['actions.configuration_loader'].call(options.merge(load_inventory: false))
|
112
112
|
KuberKit::Container['actions.kubectl_console'].call(pod_name, options)
|
113
113
|
end
|
114
114
|
end
|
@@ -118,11 +118,20 @@ class KuberKit::CLI < Thor
|
|
118
118
|
def logs(pod_name = nil)
|
119
119
|
setup(options)
|
120
120
|
|
121
|
-
if KuberKit::Container['actions.configuration_loader'].call(options)
|
121
|
+
if KuberKit::Container['actions.configuration_loader'].call(options.merge(load_inventory: false))
|
122
122
|
KuberKit::Container['actions.kubectl_logs'].call(pod_name, options)
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
+
desc "describe RESOURCE_NAME", "Show description for RESOURCE_NAME using kubectl"
|
127
|
+
def describe(pod_name = nil)
|
128
|
+
setup(options)
|
129
|
+
|
130
|
+
if KuberKit::Container['actions.configuration_loader'].call(options.merge(load_inventory: false))
|
131
|
+
KuberKit::Container['actions.kubectl_describe'].call(pod_name, options)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
126
135
|
desc "version", "Print current version"
|
127
136
|
def version
|
128
137
|
puts KuberKit::VERSION
|
data/lib/kuber_kit/container.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class KuberKit::Core::Configuration
|
2
2
|
attr_reader :name, :artifacts, :registries, :env_files, :templates, :kubeconfig_path,
|
3
|
-
:services_attributes, :build_servers, :global_build_vars,
|
3
|
+
:services_attributes, :enabled_services, :build_servers, :global_build_vars,
|
4
4
|
:deployer_strategy, :deployer_namespace, :deployer_require_confirimation
|
5
5
|
|
6
6
|
Contract KeywordArgs[
|
@@ -11,6 +11,7 @@ class KuberKit::Core::Configuration
|
|
11
11
|
templates: Hash,
|
12
12
|
kubeconfig_path: Maybe[String],
|
13
13
|
services_attributes: HashOf[Symbol => Hash],
|
14
|
+
enabled_services: ArrayOf[Symbol],
|
14
15
|
build_servers: ArrayOf[KuberKit::Core::BuildServers::AbstractBuildServer],
|
15
16
|
global_build_vars: HashOf[Symbol => Any],
|
16
17
|
deployer_strategy: Symbol,
|
@@ -18,7 +19,7 @@ class KuberKit::Core::Configuration
|
|
18
19
|
deployer_require_confirimation: Bool,
|
19
20
|
] => Any
|
20
21
|
def initialize(name:, artifacts:, registries:, env_files:, templates:, kubeconfig_path:,
|
21
|
-
services_attributes:, build_servers:, global_build_vars:,
|
22
|
+
services_attributes:, enabled_services:, build_servers:, global_build_vars:,
|
22
23
|
deployer_strategy:, deployer_namespace:, deployer_require_confirimation:)
|
23
24
|
@name = name
|
24
25
|
@artifacts = artifacts
|
@@ -28,6 +29,7 @@ class KuberKit::Core::Configuration
|
|
28
29
|
@kubeconfig_path = kubeconfig_path
|
29
30
|
@build_servers = build_servers
|
30
31
|
@services_attributes = services_attributes
|
32
|
+
@enabled_services = enabled_services
|
31
33
|
@global_build_vars = global_build_vars
|
32
34
|
@deployer_strategy = deployer_strategy
|
33
35
|
@deployer_namespace = deployer_namespace
|
@@ -28,6 +28,7 @@ class KuberKit::Core::ConfigurationFactory
|
|
28
28
|
kubeconfig_path: configuration_attrs.kubeconfig_path,
|
29
29
|
build_servers: build_servers,
|
30
30
|
services_attributes: configuration_attrs.services_attributes,
|
31
|
+
enabled_services: configuration_attrs.enabled_services,
|
31
32
|
global_build_vars: configuration_attrs.global_build_vars || {},
|
32
33
|
deployer_strategy: configuration_attrs.deployer_strategy || configs.deployer_strategy,
|
33
34
|
deployer_namespace: configuration_attrs.deployer_namespace,
|
@@ -4,10 +4,11 @@ class KuberKit::ServiceDeployer::ServiceListResolver
|
|
4
4
|
]
|
5
5
|
|
6
6
|
Contract KeywordArgs[
|
7
|
-
services:
|
8
|
-
tags:
|
7
|
+
services: Optional[ArrayOf[String]],
|
8
|
+
tags: Optional[ArrayOf[String]],
|
9
|
+
enabled_services: Optional[ArrayOf[String]]
|
9
10
|
] => ArrayOf[String]
|
10
|
-
def resolve(services: [], tags: [])
|
11
|
+
def resolve(services: [], tags: [], enabled_services: [])
|
11
12
|
all_definitions = service_store.all_definitions.values
|
12
13
|
|
13
14
|
included_services, excluded_services = split_by_inclusion(services)
|
@@ -29,7 +30,13 @@ class KuberKit::ServiceDeployer::ServiceListResolver
|
|
29
30
|
matches_any?(service_tags, excluded_tags)
|
30
31
|
end
|
31
32
|
|
32
|
-
included_definitions.map(&:service_name).map(&:to_s)
|
33
|
+
included_services = included_definitions.map(&:service_name).map(&:to_s)
|
34
|
+
|
35
|
+
if enabled_services.any?
|
36
|
+
included_services = included_services.select{ |s| enabled_services.include?(s) }
|
37
|
+
end
|
38
|
+
|
39
|
+
included_services
|
33
40
|
end
|
34
41
|
|
35
42
|
Contract Array => Array
|
@@ -14,7 +14,7 @@ class KuberKit::Shell::Commands::KubectlCommands
|
|
14
14
|
command_parts << "-n #{namespace}"
|
15
15
|
end
|
16
16
|
|
17
|
-
command_parts += Array(command_list)
|
17
|
+
command_parts += Array(command_list).compact
|
18
18
|
|
19
19
|
if interactive
|
20
20
|
shell.interactive!(command_parts.join(" "))
|
@@ -41,15 +41,11 @@ class KuberKit::Shell::Commands::KubectlCommands
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def logs(shell, pod_name, args: nil, kubeconfig_path: nil, namespace: nil)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
if args
|
48
|
-
command_parts << args
|
49
|
-
end
|
44
|
+
kubectl_run(shell, ["logs", args, pod_name], kubeconfig_path: kubeconfig_path, interactive: true, namespace: namespace)
|
45
|
+
end
|
50
46
|
|
51
|
-
|
52
|
-
kubectl_run(shell,
|
47
|
+
def describe(shell, resource_name, args: nil, kubeconfig_path: nil, namespace: nil)
|
48
|
+
kubectl_run(shell, ["describe", args, resource_name], kubeconfig_path: kubeconfig_path, interactive: true, namespace: namespace)
|
53
49
|
end
|
54
50
|
|
55
51
|
def get_resources(shell, resource_type, field_selector: nil, jsonpath: ".items[*].metadata.name", kubeconfig_path: nil, namespace: nil)
|
@@ -64,7 +60,12 @@ class KuberKit::Shell::Commands::KubectlCommands
|
|
64
60
|
command_parts << "-o jsonpath='{#{jsonpath}}'"
|
65
61
|
end
|
66
62
|
|
67
|
-
kubectl_run(shell, command_parts, kubeconfig_path: kubeconfig_path, namespace: namespace)
|
63
|
+
result = kubectl_run(shell, command_parts, kubeconfig_path: kubeconfig_path, namespace: namespace)
|
64
|
+
|
65
|
+
# Hide warnings manually, until appropriate kubectl option will be available
|
66
|
+
result = result.split("\n").reject{|n| n.start_with?("Warning:") }.join("\n") if result.is_a?(String)
|
67
|
+
|
68
|
+
result
|
68
69
|
end
|
69
70
|
|
70
71
|
def resource_exists?(shell, resource_type, resource_name, kubeconfig_path: nil, namespace: nil)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'cli/ui'
|
2
|
+
require "tty-prompt"
|
2
3
|
|
3
4
|
class KuberKit::UI::Interactive
|
4
5
|
include KuberKit::Import[
|
@@ -42,17 +43,10 @@ class KuberKit::UI::Interactive
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def prompt(text, options, &callback)
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
else
|
50
|
-
handler.option(option) do |selection|
|
51
|
-
selection
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
46
|
+
prompt = TTY::Prompt.new
|
47
|
+
prompt.select(text, options, filter: true, per_page: 10)
|
48
|
+
rescue TTY::Reader::InputInterrupt
|
49
|
+
raise KuberKit::Error.new("Selection cancelled.")
|
56
50
|
end
|
57
51
|
|
58
52
|
private
|
data/lib/kuber_kit/ui/simple.rb
CHANGED
@@ -97,10 +97,9 @@ class KuberKit::UI::Simple
|
|
97
97
|
print_debug("Result", "---------------------------")
|
98
98
|
end
|
99
99
|
|
100
|
-
def prompt(text, options
|
101
|
-
print_info("Select", text)
|
100
|
+
def prompt(text, options)
|
101
|
+
print_info("Select", text + "(#{options.join(', ')})")
|
102
102
|
result = $stdin.gets.chomp
|
103
|
-
callback.call(result) if callback
|
104
103
|
result
|
105
104
|
end
|
106
105
|
|
data/lib/kuber_kit/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kuber_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Iskander Khaziev
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: contracts-lite
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: tty-prompt
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: bundler
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -194,6 +208,7 @@ files:
|
|
194
208
|
- lib/kuber_kit/actions/kubectl_applier.rb
|
195
209
|
- lib/kuber_kit/actions/kubectl_attacher.rb
|
196
210
|
- lib/kuber_kit/actions/kubectl_console.rb
|
211
|
+
- lib/kuber_kit/actions/kubectl_describe.rb
|
197
212
|
- lib/kuber_kit/actions/kubectl_logs.rb
|
198
213
|
- lib/kuber_kit/actions/service_deployer.rb
|
199
214
|
- lib/kuber_kit/actions/service_reader.rb
|
@@ -297,7 +312,7 @@ homepage: https://github.com/ArtStation/kuber_kit
|
|
297
312
|
licenses:
|
298
313
|
- MIT
|
299
314
|
metadata: {}
|
300
|
-
post_install_message:
|
315
|
+
post_install_message:
|
301
316
|
rdoc_options: []
|
302
317
|
require_paths:
|
303
318
|
- lib
|
@@ -312,8 +327,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
312
327
|
- !ruby/object:Gem::Version
|
313
328
|
version: '0'
|
314
329
|
requirements: []
|
315
|
-
rubygems_version: 3.0.
|
316
|
-
signing_key:
|
330
|
+
rubygems_version: 3.0.8
|
331
|
+
signing_key:
|
317
332
|
specification_version: 4
|
318
333
|
summary: Docker Containers Build & Deployment
|
319
334
|
test_files: []
|