kuber_kit 0.3.2 → 0.3.7

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: 339883bd875277f494fdef1fe01035920e6a867ea98394e10c4d08e5a8b5a108
4
- data.tar.gz: 96448b7bb059d60e55ec0b8bceb70e1a02b8740773dcdbc4944afa3fafda3192
3
+ metadata.gz: e15ac135b8fd4fab45aee2797f1aa6c836e299e40175e6c518761af7d7557587
4
+ data.tar.gz: a998aa67c2389dad43604b610471f9b196456dffb100926d25e3acbf6782494f
5
5
  SHA512:
6
- metadata.gz: 49b5bf9c115c06ab88f67b60bc54f55b254a3a1a4de58ebe0fa834c04b352d8e759ed66747bd98e1d62a8adbb794cbda948dbd324c06165113af29d28ce02aad
7
- data.tar.gz: 77354cf127ad50ff4f5f092aeaebfdb7568030ea8120e990dc01eb109a9ca679da83f1124cd5df225d37053ce2abe84d4e9016c0d284b47a323a4d175ba28b40
6
+ metadata.gz: ac0c29ae11579f2431f8fc7972027b8551866d96cc212d4117eddfb91694d7680a73f0d6d867f955746475e404cd6136b8d4ad228e5489366df7f881cbba92be
7
+ data.tar.gz: d29aaa6aa028eef516f91a8f9081fd4a9d32c5c9f850755c7bea8583240c9b3bf2636dc2bab745fa778062c2a45334fc043d49d69d10963c574be4f26fc66044
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kuber_kit (0.3.2)
4
+ kuber_kit (0.3.7)
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?
File without changes
@@ -146,9 +146,9 @@ module KuberKit
146
146
 
147
147
  module Strategies
148
148
  autoload :Abstract, 'service_deployer/strategies/abstract'
149
+ autoload :Docker, 'service_deployer/strategies/docker'
149
150
  autoload :DockerCompose, 'service_deployer/strategies/docker_compose'
150
151
  autoload :Kubernetes, 'service_deployer/strategies/kubernetes'
151
- autoload :KubernetesRunner, 'service_deployer/strategies/kubernetes_runner'
152
152
  end
153
153
  end
154
154
 
@@ -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
@@ -233,8 +241,8 @@ class KuberKit::Container
233
241
  KuberKit::ServiceDeployer::Strategies::Kubernetes.new
234
242
  end
235
243
 
236
- register "service_deployer.strategies.kubernetes_runner" do
237
- KuberKit::ServiceDeployer::Strategies::KubernetesRunner.new
244
+ register "service_deployer.strategies.docker" do
245
+ KuberKit::ServiceDeployer::Strategies::Docker.new
238
246
  end
239
247
 
240
248
  register "service_deployer.strategies.docker_compose" do
@@ -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
@@ -4,7 +4,7 @@ class KuberKit::ServiceDeployer::Deployer
4
4
  include KuberKit::Import[
5
5
  "core.service_store",
6
6
  "service_deployer.strategies.kubernetes",
7
- "service_deployer.strategies.kubernetes_runner",
7
+ "service_deployer.strategies.docker",
8
8
  "service_deployer.strategies.docker_compose"
9
9
  ]
10
10
 
@@ -39,7 +39,7 @@ class KuberKit::ServiceDeployer::Deployer
39
39
  private
40
40
  def add_default_strategies
41
41
  register_strategy(:kubernetes, kubernetes)
42
- register_strategy(:kubernetes_runner, kubernetes_runner)
42
+ register_strategy(:docker, docker)
43
43
  register_strategy(:docker_compose, docker_compose)
44
44
  end
45
45
  end
@@ -0,0 +1,46 @@
1
+ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer::Strategies::Abstract
2
+ include KuberKit::Import[
3
+ "shell.docker_commands",
4
+ "core.image_store",
5
+ "configs",
6
+ ]
7
+
8
+ STRATEGY_OPTIONS = [
9
+ :container_name,
10
+ :image_name,
11
+ :docker_run_args,
12
+ :docker_run_command,
13
+ :delete_if_exists
14
+ ]
15
+
16
+ Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
17
+ def deploy(shell, service)
18
+ strategy_options = service.attribute(:deployer, default: {})
19
+ unknown_options = strategy_options.keys.map(&:to_sym) - STRATEGY_OPTIONS
20
+ if unknown_options.any?
21
+ raise KuberKit::Error, "Unknow options for deploy strategy: #{unknown_options}. Available options: #{STRATEGY_OPTIONS}"
22
+ end
23
+
24
+ container_name = strategy_options.fetch(:container_name, service.uri)
25
+ docker_run_args = strategy_options.fetch(:docker_run_args, nil)
26
+ docker_run_command = strategy_options.fetch(:docker_run_command, nil)
27
+
28
+ image_name = strategy_options.fetch(:image_name, nil)
29
+ if image_name.nil?
30
+ raise KuberKit::Error, "image_name is mandatory attribute for this deploy strategy"
31
+ end
32
+ image = image_store.get_image(image_name.to_sym)
33
+
34
+ delete_enabled = strategy_options.fetch(:delete_if_exists, false)
35
+ if delete_enabled && docker_commands.container_exists?(shell, container_name)
36
+ docker_commands.delete_container(shell, container_name)
37
+ end
38
+
39
+ docker_commands.run(
40
+ shell, image.remote_registry_url,
41
+ run_args: docker_run_args,
42
+ run_command: docker_run_command,
43
+ detached: !!strategy_options[:detached]
44
+ )
45
+ end
46
+ end
@@ -5,20 +5,30 @@ class KuberKit::ServiceDeployer::Strategies::DockerCompose < KuberKit::ServiceDe
5
5
  "configs",
6
6
  ]
7
7
 
8
+ STRATEGY_OPTIONS = [
9
+ :service_name,
10
+ :command_name
11
+ ]
12
+
8
13
  Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
9
14
  def deploy(shell, service)
10
15
  service_config = reader.read(shell, service)
11
16
  config_path = "#{configs.service_config_dir}/#{service.name}.yml"
12
17
  shell.write(config_path, service_config)
13
18
 
14
- deployer_service_name = service.attribute(:deployer_service_name, default: service.name.to_s)
15
- deployer_command_name = service.attribute(:deployer_command_name, default: "bash")
16
- deployer_interactive = service.attribute(:deployer_interactive, default: false)
19
+ strategy_options = service.attribute(:deployer, default: {})
20
+ unknown_options = strategy_options.keys.map(&:to_sym) - STRATEGY_OPTIONS
21
+ if unknown_options.any?
22
+ raise KuberKit::Error, "Unknow options for deploy strategy: #{unknown_options}. Available options: #{STRATEGY_OPTIONS}"
23
+ end
24
+
25
+ service_name = strategy_options.fetch(:service_name, service.name.to_s)
26
+ command_name = strategy_options.fetch(:command_name, "bash")
17
27
 
18
28
  docker_compose_commands.run(shell, config_path,
19
- service: deployer_service_name,
20
- command: deployer_command_name,
21
- interactive: deployer_interactive
29
+ service: service_name,
30
+ command: command_name,
31
+ detached: !!strategy_options[:detached]
22
32
  )
23
33
  end
24
34
  end
@@ -5,21 +5,48 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
5
5
  "configs",
6
6
  ]
7
7
 
8
+ STRATEGY_OPTIONS = [
9
+ :resource_type,
10
+ :resource_name,
11
+ :delete_if_exists,
12
+ :restart_if_exists
13
+ ]
14
+
8
15
  Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
9
16
  def deploy(shell, service)
10
17
  service_config = reader.read(shell, service)
11
18
  config_path = "#{configs.service_config_dir}/#{service.name}.yml"
12
19
  shell.write(config_path, service_config)
13
20
 
14
- kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
15
- deployer_namespace = KuberKit.current_configuration.deployer_namespace
21
+ kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
22
+ namespace = KuberKit.current_configuration.deployer_namespace
23
+
24
+ strategy_options = service.attribute(:deployer, default: {})
25
+ unknown_options = strategy_options.keys.map(&:to_sym) - STRATEGY_OPTIONS
26
+ if unknown_options.any?
27
+ raise KuberKit::Error, "Unknow options for deploy strategy: #{unknown_options}. Available options: #{STRATEGY_OPTIONS}"
28
+ end
29
+
30
+ resource_type = strategy_options.fetch(:resource_type, "deployment")
31
+ resource_name = strategy_options.fetch(:resource_name, service.uri)
32
+
33
+ resource_exists = kubectl_commands.resource_exists?(
34
+ shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace
35
+ )
36
+
37
+ delete_enabled = strategy_options.fetch(:delete_if_exists, false)
38
+ if delete_enabled && resource_exists
39
+ kubectl_commands.delete_resource(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
40
+ end
16
41
 
17
- kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
42
+ kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
18
43
 
19
- deployer_restart_enabled = service.attribute(:deployer_restart_enabled, default: true)
20
- deployer_restart_name = service.attribute(:deployer_restart_name, default: service.uri)
21
- if deployer_restart_enabled
22
- kubectl_commands.rolling_restart(shell, deployer_restart_name, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
44
+ restart_enabled = strategy_options.fetch(:restart_if_exists, true)
45
+ if restart_enabled && resource_exists
46
+ kubectl_commands.rolling_restart(
47
+ shell, resource_type, resource_name,
48
+ kubeconfig_path: kubeconfig_path, namespace: namespace
49
+ )
23
50
  end
24
51
  end
25
52
  end
@@ -14,6 +14,26 @@ 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, detached: false)
18
+ command_parts = []
19
+ command_parts << "docker run"
20
+ command_parts << "-d" if detached
21
+ command_parts << run_args if run_args
22
+ command_parts << image_name
23
+ command_parts << run_command if run_command
24
+
25
+ shell.exec!(command_parts.join(" "))
26
+ end
27
+
28
+ def container_exists?(shell, container_name)
29
+ result = get_container_id(shell, container_name)
30
+ result && result != ""
31
+ end
32
+
33
+ def delete_container(shell, container_name)
34
+ shell.exec!(%Q{docker rm -f #{container_name}})
35
+ end
36
+
17
37
  def get_container_id(shell, container_name, only_healthy: false, status: "running")
18
38
  command_parts = []
19
39
  command_parts << "docker ps -a -q"
@@ -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
- "-f #{path}",
6
5
  "run",
7
- service,
8
- command
6
+ "-f #{path}",
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,25 +40,56 @@ 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 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)
53
+ end
54
+
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}"
58
+
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
+
43
70
  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)
71
+ result = get_resources(shell, resource_type,
72
+ field_selector: "metadata.name=#{resource_name}", kubeconfig_path: kubeconfig_path, namespace: namespace
73
+ )
45
74
  result && result != ""
46
75
  end
47
76
 
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}}'}
77
+ def delete_resource(shell, resource_type, resource_name, kubeconfig_path: nil, namespace: nil)
78
+ command = %Q{delete #{resource_type} #{resource_name}}
50
79
 
51
80
  kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
52
81
  end
53
82
 
54
- def delete_resource(shell, resource_type, resource_name, kubeconfig_path: nil, namespace: nil)
55
- command = %Q{delete #{resource_type} #{resource_name}}
83
+ def patch_resource(shell, resource_type, resource_name, specs, kubeconfig_path: nil, namespace: nil)
84
+ specs_json = JSON.dump(specs).gsub('"', '\"')
85
+
86
+ command = %Q{patch #{resource_type} #{resource_name} -p "#{specs_json}"}
56
87
 
57
88
  kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
58
89
  end
59
90
 
60
- def rolling_restart(shell, deployer_name, kubeconfig_path: nil, namespace: nil)
61
- patch_deployment(shell, deployer_name, {
91
+ def rolling_restart(shell, resource_type, resource_name, kubeconfig_path: nil, namespace: nil)
92
+ patch_resource(shell, resource_type, resource_name, {
62
93
  spec: {
63
94
  template: {
64
95
  metadata: {
@@ -70,12 +101,4 @@ class KuberKit::Shell::Commands::KubectlCommands
70
101
  }
71
102
  }, kubeconfig_path: kubeconfig_path, namespace: namespace)
72
103
  end
73
-
74
- def patch_deployment(shell, deployer_name, specs, kubeconfig_path: nil, namespace: nil)
75
- specs_json = JSON.dump(specs).gsub('"', '\"')
76
-
77
- command = %Q{patch deployment #{deployer_name} -p "#{specs_json}"}
78
-
79
- kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
80
- end
81
104
  end
@@ -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.2"
2
+ VERSION = "0.3.7"
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.2
4
+ version: 0.3.7
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
@@ -140,8 +140,8 @@ description: Docker Containers Build & Deployment
140
140
  email:
141
141
  - gvalmon@gmail.com
142
142
  executables:
143
- - console
144
143
  - kit
144
+ - kit_console
145
145
  extensions: []
146
146
  extra_rdoc_files: []
147
147
  files:
@@ -156,8 +156,8 @@ files:
156
156
  - README.md
157
157
  - Rakefile
158
158
  - TODO.md
159
- - bin/console
160
159
  - bin/kit
160
+ - bin/kit_console
161
161
  - example/app_data/docker_compose.yml
162
162
  - example/app_data/env_file.yml
163
163
  - example/app_data/service.yml
@@ -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
@@ -260,9 +262,9 @@ files:
260
262
  - lib/kuber_kit/service_deployer/deployer.rb
261
263
  - lib/kuber_kit/service_deployer/service_list_resolver.rb
262
264
  - lib/kuber_kit/service_deployer/strategies/abstract.rb
265
+ - lib/kuber_kit/service_deployer/strategies/docker.rb
263
266
  - lib/kuber_kit/service_deployer/strategies/docker_compose.rb
264
267
  - lib/kuber_kit/service_deployer/strategies/kubernetes.rb
265
- - lib/kuber_kit/service_deployer/strategies/kubernetes_runner.rb
266
268
  - lib/kuber_kit/service_deployer/strategy_detector.rb
267
269
  - lib/kuber_kit/service_reader/action_handler.rb
268
270
  - lib/kuber_kit/service_reader/reader.rb
@@ -1,35 +0,0 @@
1
- class KuberKit::ServiceDeployer::Strategies::KubernetesRunner < KuberKit::ServiceDeployer::Strategies::Abstract
2
- include KuberKit::Import[
3
- "service_reader.reader",
4
- "shell.kubectl_commands",
5
- "configs",
6
- ]
7
-
8
- Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
9
- def deploy(shell, service)
10
- service_config = reader.read(shell, service)
11
- config_path = "#{configs.service_config_dir}/#{service.name}.yml"
12
- shell.write(config_path, service_config)
13
-
14
- kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
15
- deployer_namespace = KuberKit.current_configuration.deployer_namespace
16
-
17
- deployer_resource_name = service.attribute(:deployer_resource_name, default: service.uri)
18
- deployer_resource_type = service.attribute(:deployer_resource_type, default: "job")
19
-
20
- deployer_delete_enabled = service.attribute(:deployer_delete_enabled, default: true)
21
- if deployer_delete_enabled
22
- delete_resource_if_exists(shell, deployer_resource_type, deployer_resource_name, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
23
- end
24
-
25
- kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
26
- end
27
-
28
- private
29
- def delete_resource_if_exists(shell, resource_type, resource_name, kubeconfig_path:, namespace: )
30
- unless kubectl_commands.resource_exists?(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
31
- return false
32
- end
33
- kubectl_commands.delete_resource(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
34
- end
35
- end