kuber_kit 0.3.3 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae284766e125c54579032cd54c29d602848f95a9a91e07c357ab1b985632a9d1
4
- data.tar.gz: 9a9c7a194893cdc39c7629fbda8e03bb7da6b77583899995c14a511f3b152943
3
+ metadata.gz: cdefb838f103f417001c7ff0167d95bc985a1db8b8b97b505426e5f2b98db7f3
4
+ data.tar.gz: 13f8f1103796553e56a874064e36a33e66931e73917a141e6fad049c5ced73da
5
5
  SHA512:
6
- metadata.gz: 3cbef254939ce54ff789fcde11ca3db500bfc552f75768bb9424dbdef682830eceed216b046f5930b95e45c8985c2b77e6ce2947e277951e718b1f38df62af29
7
- data.tar.gz: bb571f10d8f4e41612c31e1616138e45a54134b92b4b8f9a9577083fc175982e3e5f1a77f1ec564a160ce88f46f76d57d143a8968b8282c92d66f4cb2e2f4220
6
+ metadata.gz: cbd45f1537f9ecc3b2d29a090f85921b47ffda91093aefa7f150d5101ff3bc147f30966febdb37352e6dfb3f7e245a84423a649a0f9d9cdd586dd597634be96c
7
+ data.tar.gz: 947ced5481b927993ed9462255fcf7ed656c718e9642fc0f8888b14a41aa630947b89d96f56d9b5a571956c5475c6e711c3a1b604e333b617a5208292e39e9ca
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kuber_kit (0.3.3)
4
+ kuber_kit (0.3.8)
5
5
  cli-ui
6
6
  contracts-lite
7
7
  dry-auto_inject
@@ -19,16 +19,14 @@ GEM
19
19
  docile (1.3.2)
20
20
  dry-auto_inject (0.7.0)
21
21
  dry-container (>= 0.3.4)
22
- dry-configurable (0.11.6)
22
+ dry-configurable (0.12.0)
23
23
  concurrent-ruby (~> 1.0)
24
- dry-core (~> 0.4, >= 0.4.7)
25
- dry-equalizer (~> 0.2)
24
+ dry-core (~> 0.5, >= 0.5.0)
26
25
  dry-container (0.7.2)
27
26
  concurrent-ruby (~> 1.0)
28
27
  dry-configurable (~> 0.1, >= 0.1.3)
29
- dry-core (0.4.10)
28
+ dry-core (0.5.0)
30
29
  concurrent-ruby (~> 1.0)
31
- dry-equalizer (0.3.0)
32
30
  method_source (1.0.0)
33
31
  net-ssh (6.1.0)
34
32
  pry (0.13.1)
data/TODO.md CHANGED
@@ -1,8 +1,8 @@
1
+ - https://ttytoolkit.org/
2
+ - kit status should show the list of services and their status, with ability to select & view logs
1
3
  - list services and require confirmation before deployment
2
- - kit attach should list available deployments/pods, and ask for specific container if it has multiple containers
3
4
  - add kit logs support, should work similar to kit attach
4
5
  - allow deploying only services enabled for specific configuration
5
6
  - find a way to always deploy some service, e.g. for migrations and env_files
6
- - add ability to set container health checks
7
7
  - template should be able to set default attributes
8
8
  - template should be able to depend on image?
@@ -166,6 +166,8 @@ module KuberKit
166
166
  autoload :ConfigurationLoader, 'actions/configuration_loader'
167
167
  autoload :KubectlApplier, 'actions/kubectl_applier'
168
168
  autoload :KubectlAttacher, 'actions/kubectl_attacher'
169
+ autoload :KubectlConsole, 'actions/kubectl_console'
170
+ autoload :KubectlLogs, 'actions/kubectl_logs'
169
171
  end
170
172
 
171
173
  module Extensions
@@ -5,11 +5,17 @@ class KuberKit::Actions::KubectlAttacher
5
5
  "ui"
6
6
  ]
7
7
 
8
- Contract String, Hash => Any
8
+ Contract Maybe[String], Hash => Any
9
9
  def call(pod_name, options)
10
10
  kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
11
11
  deployer_namespace = KuberKit.current_configuration.deployer_namespace
12
12
 
13
+ if !pod_name
14
+ resources = kubectl_commands.get_resources(local_shell, "deployments", jsonpath: ".items[*].metadata.name")
15
+ options = resources.split(" ").map{|d| "deploy/#{d}" }
16
+ pod_name = ui.prompt("Please select deployment to attach", options)
17
+ end
18
+
13
19
  kubectl_commands.exec(
14
20
  local_shell, pod_name, "bash", args: "-it",
15
21
  kubeconfig_path: kubeconfig_path,
@@ -0,0 +1,32 @@
1
+ class KuberKit::Actions::KubectlConsole
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(pod_name, options)
10
+ kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
11
+ deployer_namespace = KuberKit.current_configuration.deployer_namespace
12
+
13
+ if !pod_name
14
+ resources = kubectl_commands.get_resources(local_shell, "deployments", jsonpath: ".items[*].metadata.name")
15
+ options = resources.split(" ").map{|d| "deploy/#{d}" }
16
+ pod_name = ui.prompt("Please select deployment to attach", options)
17
+ end
18
+
19
+ kubectl_commands.exec(
20
+ local_shell, pod_name, "bin/console", args: "-it",
21
+ kubeconfig_path: kubeconfig_path,
22
+ interactive: true,
23
+ namespace: deployer_namespace
24
+ )
25
+
26
+ true
27
+ rescue KuberKit::Error => e
28
+ ui.print_error("Error", e.message)
29
+
30
+ false
31
+ end
32
+ end
@@ -0,0 +1,37 @@
1
+ class KuberKit::Actions::KubectlLogs
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(pod_name, options)
10
+ kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
11
+ deployer_namespace = KuberKit.current_configuration.deployer_namespace
12
+
13
+ if !pod_name
14
+ deployments = kubectl_commands.get_resources(local_shell, "deployments", jsonpath: ".items[*].metadata.name")
15
+ deploy_options = deployments.split(" ").map{|d| "deploy/#{d}" }
16
+ pod_name = ui.prompt("Please select deployment to attach", deploy_options)
17
+ end
18
+
19
+ args = nil
20
+ if options[:follow]
21
+ args = "-f"
22
+ end
23
+
24
+ kubectl_commands.logs(
25
+ local_shell, pod_name,
26
+ args: args,
27
+ kubeconfig_path: kubeconfig_path,
28
+ namespace: deployer_namespace
29
+ )
30
+
31
+ true
32
+ rescue KuberKit::Error => e
33
+ ui.print_error("Error", e.message)
34
+
35
+ false
36
+ end
37
+ end
@@ -10,10 +10,11 @@ class KuberKit::Actions::ServiceDeployer
10
10
  ]
11
11
 
12
12
  Contract KeywordArgs[
13
- services: Maybe[ArrayOf[String]],
14
- tags: Maybe[ArrayOf[String]],
13
+ services: Maybe[ArrayOf[String]],
14
+ tags: Maybe[ArrayOf[String]],
15
+ skip_compile: Maybe[Bool],
15
16
  ] => Any
16
- def call(services:, tags:)
17
+ def call(services:, tags:, skip_compile: false)
17
18
  if services.empty? && tags.empty?
18
19
  services, tags = show_tags_selection
19
20
  end
@@ -33,7 +34,7 @@ class KuberKit::Actions::ServiceDeployer
33
34
 
34
35
  images_names = services.map(&:images).flatten.uniq
35
36
 
36
- compile_images(images_names)
37
+ compile_images(images_names) unless skip_compile
37
38
  deploy_services(service_names)
38
39
 
39
40
  true
@@ -31,15 +31,17 @@ class KuberKit::CLI < Thor
31
31
  end
32
32
 
33
33
  desc "deploy CONTEXT_NAME", "Deploy CONTEXT_NAME with kubectl"
34
- method_option :services, :type => :array, aliases: ["-s"]
35
- method_option :tags, :type => :array, aliases: ["-t"]
34
+ method_option :services, :type => :array, aliases: ["-s"]
35
+ method_option :tags, :type => :array, aliases: ["-t"]
36
+ method_option :skip_compile, :type => :boolean, aliases: ["-B"]
36
37
  def deploy
37
38
  KuberKit.set_debug_mode(options[:debug])
38
39
 
39
40
  if KuberKit::Container['actions.configuration_loader'].call(options)
40
41
  result = KuberKit::Container['actions.service_deployer'].call(
41
- services: options[:services] || [],
42
- tags: options[:tags] || []
42
+ services: options[:services] || [],
43
+ tags: options[:tags] || [],
44
+ skip_compile: options[:skip_compile] || false
43
45
  )
44
46
  end
45
47
 
@@ -91,8 +93,8 @@ class KuberKit::CLI < Thor
91
93
  end
92
94
  end
93
95
 
94
- desc "attach POD_NAME", "Attach to POD_NAME with kubectl"
95
- def attach(pod_name)
96
+ desc "attach POD_NAME", "Attach to POD_NAME using kubectl"
97
+ def attach(pod_name = nil)
96
98
  KuberKit.set_debug_mode(options[:debug])
97
99
 
98
100
  if KuberKit::Container['actions.configuration_loader'].call(options)
@@ -100,6 +102,30 @@ class KuberKit::CLI < Thor
100
102
  end
101
103
  end
102
104
 
105
+ desc "launch console in POD_NAME", "Attach to POD_NAME using kubectl & launch bin/console"
106
+ def console(pod_name = nil)
107
+ KuberKit.set_debug_mode(options[:debug])
108
+
109
+ if KuberKit::Container['actions.configuration_loader'].call(options)
110
+ KuberKit::Container['actions.kubectl_console'].call(pod_name, options)
111
+ end
112
+ end
113
+
114
+ desc "show logs for POD_NAME", "Show logs for POD_NAME using kubectl"
115
+ method_option :follow, :type => :boolean, aliases: ["-f"]
116
+ def logs(pod_name = nil)
117
+ KuberKit.set_debug_mode(options[:debug])
118
+
119
+ if KuberKit::Container['actions.configuration_loader'].call(options)
120
+ KuberKit::Container['actions.kubectl_logs'].call(pod_name, options)
121
+ end
122
+ end
123
+
124
+ desc "version", "Print current version"
125
+ def version
126
+ puts KuberKit::VERSION
127
+ end
128
+
103
129
  def self.exit_on_failure?
104
130
  true
105
131
  end
@@ -33,6 +33,14 @@ class KuberKit::Container
33
33
  KuberKit::Actions::KubectlAttacher.new
34
34
  end
35
35
 
36
+ register "actions.kubectl_console" do
37
+ KuberKit::Actions::KubectlConsole.new
38
+ end
39
+
40
+ register "actions.kubectl_logs" do
41
+ KuberKit::Actions::KubectlLogs.new
42
+ end
43
+
36
44
  register "configs" do
37
45
  KuberKit::Configs.new
38
46
  end
@@ -33,6 +33,13 @@ class KuberKit::Core::ContextHelper::BaseHelper
33
33
  KuberKit.global_build_vars
34
34
  end
35
35
 
36
+ def global_build_args
37
+ unless KuberKit.deprecation_warnings_disabled?
38
+ puts "DEPRECATION: global_build_args is deprecated, please use global_build_vars instead"
39
+ end
40
+ global_build_vars
41
+ end
42
+
36
43
  def get_binding
37
44
  binding
38
45
  end
@@ -8,6 +8,7 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
8
8
  STRATEGY_OPTIONS = [
9
9
  :container_name,
10
10
  :image_name,
11
+ :detached,
11
12
  :docker_run_args,
12
13
  :docker_run_command,
13
14
  :delete_if_exists
@@ -36,6 +37,11 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
36
37
  docker_commands.delete_container(shell, container_name)
37
38
  end
38
39
 
39
- docker_commands.run(shell, image.remote_registry_url, run_args: docker_run_args, run_command: docker_run_command)
40
+ docker_commands.run(
41
+ shell, image.remote_registry_url,
42
+ run_args: docker_run_args,
43
+ run_command: docker_run_command,
44
+ detached: !!strategy_options[:detached]
45
+ )
40
46
  end
41
47
  end
@@ -7,7 +7,8 @@ class KuberKit::ServiceDeployer::Strategies::DockerCompose < KuberKit::ServiceDe
7
7
 
8
8
  STRATEGY_OPTIONS = [
9
9
  :service_name,
10
- :command_name
10
+ :command_name,
11
+ :detached
11
12
  ]
12
13
 
13
14
  Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
@@ -26,8 +27,9 @@ class KuberKit::ServiceDeployer::Strategies::DockerCompose < KuberKit::ServiceDe
26
27
  command_name = strategy_options.fetch(:command_name, "bash")
27
28
 
28
29
  docker_compose_commands.run(shell, config_path,
29
- service: service_name,
30
- command: command_name,
30
+ service: service_name,
31
+ command: command_name,
32
+ detached: !!strategy_options[:detached]
31
33
  )
32
34
  end
33
35
  end
@@ -14,9 +14,10 @@ class KuberKit::Shell::Commands::DockerCommands
14
14
  shell.exec!(%Q{docker push #{tag_name}})
15
15
  end
16
16
 
17
- def run(shell, image_name, run_args: nil, run_command: nil)
17
+ def run(shell, image_name, run_args: nil, run_command: nil, detached: false)
18
18
  command_parts = []
19
19
  command_parts << "docker run"
20
+ command_parts << "-d" if detached
20
21
  command_parts << run_args if run_args
21
22
  command_parts << image_name
22
23
  command_parts << run_command if run_command
@@ -1,13 +1,18 @@
1
1
  class KuberKit::Shell::Commands::DockerComposeCommands
2
- def run(shell, path, service:, command:, interactive: false)
2
+ def run(shell, path, service:, command:, interactive: false, detached: false)
3
3
  command_parts = [
4
4
  "docker-compose",
5
5
  "-f #{path}",
6
6
  "run",
7
- service,
8
- command
9
7
  ]
10
8
 
9
+ if detached
10
+ command_parts << "-d"
11
+ end
12
+
13
+ command_parts << service
14
+ command_parts << command
15
+
11
16
  if interactive
12
17
  shell.interactive!(command_parts.join(" "))
13
18
  else
@@ -40,15 +40,38 @@ class KuberKit::Shell::Commands::KubectlCommands
40
40
  kubectl_run(shell, command_parts, kubeconfig_path: kubeconfig_path, interactive: interactive, namespace: namespace)
41
41
  end
42
42
 
43
- def resource_exists?(shell, resource_type, resource_name, kubeconfig_path: nil, namespace: nil)
44
- result = find_resources(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
45
- result && result != ""
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
50
+
51
+ command_parts << pod_name
52
+ kubectl_run(shell, command_parts, kubeconfig_path: kubeconfig_path, interactive: true, namespace: namespace)
46
53
  end
47
54
 
48
- def find_resources(shell, resource_type, resource_name, jsonpath: ".items[*].metadata.name", kubeconfig_path: nil, namespace: nil)
49
- command = %Q{get #{resource_type} --field-selector=metadata.name=#{resource_name} -o jsonpath='{#{jsonpath}}'}
55
+ def get_resources(shell, resource_type, field_selector: nil, jsonpath: ".items[*].metadata.name", kubeconfig_path: nil, namespace: nil)
56
+ command_parts = []
57
+ command_parts << "get #{resource_type}"
50
58
 
51
- kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
59
+ if field_selector
60
+ command_parts << "--field-selector=#{field_selector}"
61
+ end
62
+
63
+ if jsonpath
64
+ command_parts << "-o jsonpath='{#{jsonpath}}'"
65
+ end
66
+
67
+ kubectl_run(shell, command_parts, kubeconfig_path: kubeconfig_path, namespace: namespace)
68
+ end
69
+
70
+ def resource_exists?(shell, resource_type, resource_name, kubeconfig_path: nil, namespace: nil)
71
+ result = get_resources(shell, resource_type,
72
+ field_selector: "metadata.name=#{resource_name}", kubeconfig_path: kubeconfig_path, namespace: namespace
73
+ )
74
+ result && result != ""
52
75
  end
53
76
 
54
77
  def delete_resource(shell, resource_type, resource_name, kubeconfig_path: nil, namespace: nil)
@@ -29,7 +29,13 @@ class KuberKit::UI::Interactive
29
29
  def prompt(text, options, &callback)
30
30
  CLI::UI::Prompt.ask(text) do |handler|
31
31
  options.each do |option|
32
- handler.option(option, &callback)
32
+ if callback
33
+ handler.option(option, &callback)
34
+ else
35
+ handler.option(option) do |selection|
36
+ selection
37
+ end
38
+ end
33
39
  end
34
40
  end
35
41
  end
@@ -71,7 +71,8 @@ class KuberKit::UI::Simple
71
71
  def prompt(text, options, &callback)
72
72
  print_info("Select", text)
73
73
  result = $stdin.gets.chomp
74
- callback.call(result)
74
+ callback.call(result) if callback
75
+ result
75
76
  end
76
77
 
77
78
  private
@@ -1,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.8"
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.3.3
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iskander Khaziev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-11 00:00:00.000000000 Z
11
+ date: 2021-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts-lite
@@ -191,6 +191,8 @@ files:
191
191
  - lib/kuber_kit/actions/image_compiler.rb
192
192
  - lib/kuber_kit/actions/kubectl_applier.rb
193
193
  - lib/kuber_kit/actions/kubectl_attacher.rb
194
+ - lib/kuber_kit/actions/kubectl_console.rb
195
+ - lib/kuber_kit/actions/kubectl_logs.rb
194
196
  - lib/kuber_kit/actions/service_deployer.rb
195
197
  - lib/kuber_kit/actions/service_reader.rb
196
198
  - lib/kuber_kit/actions/template_reader.rb