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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5c1697ed582055ca1d233797dcc663ffd8c2e7a00763b7d8a9ea8ca639b2270
4
- data.tar.gz: a707b96dc99201d2d3c2338ceaef7d53d5241772f718b2453cb6249ce82b2335
3
+ metadata.gz: dfc1d29b7283361acaed01c9ddd08a29d121020c75af2d6ec7e4245d347021fb
4
+ data.tar.gz: 7e9063497954963223629beaa6d6ec914851c5e8c9633fa35d50986a95149aec
5
5
  SHA512:
6
- metadata.gz: be389af37cb52dd30f7a7cd6795231d3e7894fea24d303c1bdcb47f84b74e4e8b558a20e04e611a2263ae2d44cb008edd5e77beba4011d137fb5df06dd63b909
7
- data.tar.gz: ee6144b4aad93cfa417d3cad69bfb1cc14b11fea014a50d02bfa2996306fa4b32de7923b9d8105ca79d7793ffac5dc123bb5bb7f2d4562e97405dafab3399956
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)
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.7)
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.1)
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
- - https://ttytoolkit.org/
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
- ui.create_task("Updating artifacts") do |task|
44
- artifacts = KuberKit.current_configuration.artifacts.values
45
- artifacts_updater.update(local_shell, artifacts)
46
- task.update_title("Updated #{artifacts.count} artifacts")
47
- end
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
- ui.create_task("Loading image definitions") do |task|
50
- files = image_store.load_definitions(images_path)
51
+ ui.create_task("Loading image definitions") do |task|
52
+ files = image_store.load_definitions(images_path)
51
53
 
52
- configs.additional_images_paths.each do |path|
53
- files += image_store.load_definitions(path)
54
- end
54
+ configs.additional_images_paths.each do |path|
55
+ files += image_store.load_definitions(path)
56
+ end
55
57
 
56
- task.update_title("Loaded #{files.count} image definitions")
57
- end
58
+ task.update_title("Loaded #{files.count} image definitions")
59
+ end
58
60
 
59
- ui.create_task("Loading service definitions") do |task|
60
- files = service_store.load_definitions(services_path)
61
- task.update_title("Loaded #{files.count} service definitions")
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) do |selection|
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: services || [],
24
- tags: 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 result == "confirm".green
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
- compile_images(images_names) unless skip_compile
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
- image_compiler.call(images_names, {}) if images_names.any?
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) do |selected_tag|
96
- if selected_tag == specific_service_option
97
- show_service_selection
98
- else
99
- return [[], [selected_tag]]
100
- end
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
- ui.prompt("Please select which service to deploy", services) do |selected_service|
114
- return [[selected_service], []]
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
@@ -37,6 +37,10 @@ class KuberKit::Container
37
37
  KuberKit::Actions::KubectlConsole.new
38
38
  end
39
39
 
40
+ register "actions.kubectl_describe" do
41
+ KuberKit::Actions::KubectlDescribe.new
42
+ end
43
+
40
44
  register "actions.kubectl_logs" do
41
45
  KuberKit::Actions::KubectlLogs.new
42
46
  end
@@ -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: Optional[ArrayOf[String]],
8
- tags: Optional[ArrayOf[String]]
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
- command_parts = []
45
- command_parts << "logs"
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
- command_parts << pod_name
52
- kubectl_run(shell, command_parts, kubeconfig_path: kubeconfig_path, interactive: true, namespace: namespace)
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
- CLI::UI::Prompt.ask(text) do |handler|
46
- options.each do |option|
47
- if callback
48
- handler.option(option, &callback)
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
@@ -97,10 +97,9 @@ class KuberKit::UI::Simple
97
97
  print_debug("Result", "---------------------------")
98
98
  end
99
99
 
100
- def prompt(text, options, &callback)
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
 
@@ -1,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.4.4"
2
+ VERSION = "0.4.5"
3
3
  end
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
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-01-26 00:00:00.000000000 Z
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.9
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: []