kuber_kit 0.3.7 → 0.4.0

This diff has not been reviewed by any users.
Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +35 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +1 -1
  5. data/TODO.md +2 -1
  6. data/example/infrastructure/artifacts.rb +1 -1
  7. data/example/services/docker_app.rb +12 -0
  8. data/lib/kuber_kit.rb +6 -4
  9. data/lib/kuber_kit/actions/configuration_loader.rb +12 -19
  10. data/lib/kuber_kit/actions/env_file_reader.rb +1 -0
  11. data/lib/kuber_kit/actions/image_compiler.rb +10 -6
  12. data/lib/kuber_kit/actions/service_deployer.rb +10 -7
  13. data/lib/kuber_kit/actions/template_reader.rb +1 -0
  14. data/lib/kuber_kit/artifacts_sync/artifacts_updater.rb +3 -2
  15. data/lib/kuber_kit/cli.rb +38 -25
  16. data/lib/kuber_kit/configs.rb +2 -1
  17. data/lib/kuber_kit/container.rb +6 -2
  18. data/lib/kuber_kit/core/configuration_store.rb +2 -2
  19. data/lib/kuber_kit/core/image_store.rb +2 -2
  20. data/lib/kuber_kit/core/service.rb +5 -5
  21. data/lib/kuber_kit/core/service_factory.rb +0 -6
  22. data/lib/kuber_kit/core/service_store.rb +2 -2
  23. data/lib/kuber_kit/image_compiler/compiler.rb +3 -1
  24. data/lib/kuber_kit/image_compiler/image_builder.rb +9 -1
  25. data/lib/kuber_kit/service_deployer/strategies/docker.rb +14 -8
  26. data/lib/kuber_kit/service_deployer/strategies/docker_compose.rb +5 -1
  27. data/lib/kuber_kit/service_deployer/strategies/kubernetes.rb +3 -1
  28. data/lib/kuber_kit/service_reader/reader.rb +6 -0
  29. data/lib/kuber_kit/shell/commands/docker_commands.rb +15 -10
  30. data/lib/kuber_kit/shell/commands/docker_compose_commands.rb +5 -6
  31. data/lib/kuber_kit/shell/local_shell.rb +6 -6
  32. data/lib/kuber_kit/shell/ssh_shell.rb +4 -4
  33. data/lib/kuber_kit/tools/logger_factory.rb +7 -3
  34. data/lib/kuber_kit/ui/api.rb +48 -0
  35. data/lib/kuber_kit/ui/debug.rb +31 -0
  36. data/lib/kuber_kit/ui/interactive.rb +15 -0
  37. data/lib/kuber_kit/ui/simple.rb +34 -5
  38. data/lib/kuber_kit/version.rb +1 -1
  39. metadata +6 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e15ac135b8fd4fab45aee2797f1aa6c836e299e40175e6c518761af7d7557587
4
- data.tar.gz: a998aa67c2389dad43604b610471f9b196456dffb100926d25e3acbf6782494f
3
+ metadata.gz: 88b8c2ffe3973bc966b245ceba37047030243d88119fd672db31efb002c67f86
4
+ data.tar.gz: 5fafd218e63a669da3951b723f7167700704902006d4dd4fef13541e8ad1559b
5
5
  SHA512:
6
- metadata.gz: ac0c29ae11579f2431f8fc7972027b8551866d96cc212d4117eddfb91694d7680a73f0d6d867f955746475e404cd6136b8d4ad228e5489366df7f881cbba92be
7
- data.tar.gz: d29aaa6aa028eef516f91a8f9081fd4a9d32c5c9f850755c7bea8583240c9b3bf2636dc2bab745fa778062c2a45334fc043d49d69d10963c574be4f26fc66044
6
+ metadata.gz: a1c79c0056820500948580504c533be1ba2f9ceafe282802a0bbe44021a34196706c23eb97b05e6905efc26f565719fd9a1c668ec99afdbda642261ad6e8b6e1
7
+ data.tar.gz: 3e4e33cc19ff7917ee5210dcdecae40ed22cb29d93f884bdb27adf3ec8565d3397ee8715ed8e89e75ae0316a0cf9192075d5afd66ba55caf3fe4f060064c88b9
@@ -0,0 +1,35 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Rspec
9
+
10
+ on:
11
+ push:
12
+ branches: [ main ]
13
+ pull_request:
14
+ branches: [ main ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby-version: ['2.5', '2.7']
23
+
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
+ # uses: ruby/setup-ruby@v1
30
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
31
+ with:
32
+ ruby-version: ${{ matrix.ruby-version }}
33
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
34
+ - name: Run tests
35
+ run: bundle exec rspec spec/
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kuber_kit (0.3.7)
4
+ kuber_kit (0.4.0)
5
5
  cli-ui
6
6
  contracts-lite
7
7
  dry-auto_inject
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # KuberKit
2
2
 
3
- [![Codeship Status for ArtStation/kuber_kit](https://app.codeship.com/projects/1286f0a6-3f90-4c1b-b426-721ed8a6571b/status?branch=master)](https://app.codeship.com/projects/417264)
3
+ [![Rspec](https://github.com/ArtStation/kuber_kit/workflows/Rspec/badge.svg)](https://github.com/ArtStation/kuber_kit/actions?query=workflow%3ARspec)
4
4
 
5
5
  Solution for building & deploying applications on Kubernetes, written in Ruby.
6
6
 
data/TODO.md CHANGED
@@ -5,4 +5,5 @@
5
5
  - allow deploying only services enabled for specific configuration
6
6
  - find a way to always deploy some service, e.g. for migrations and env_files
7
7
  - template should be able to set default attributes
8
- - template should be able to depend on image?
8
+ - template should be able to depend on image?
9
+ - cleanup image builds older than some date
@@ -9,5 +9,5 @@ KuberKit.add_artifact(
9
9
  KuberKit.add_artifact(
10
10
  KuberKit::Core::Artifacts::Git
11
11
  .new(:kuber_kit_repo)
12
- .setup(remote_url: "git@github.com:ArtStation/kuber_kit.git")
12
+ .setup(remote_url: "git@github.com:ArtStation/kuber_kit.git", branch: "main")
13
13
  )
@@ -0,0 +1,12 @@
1
+ KuberKit
2
+ .define_service(:docker_app)
3
+ .images(:ruby_app)
4
+ .deployer_strategy(:docker)
5
+ .attributes(
6
+ deployer: {
7
+ detached: true,
8
+ image_name: :ruby_app,
9
+ container_name: "test_docker_app",
10
+ delete_if_exists: true
11
+ }
12
+ )
@@ -177,6 +177,8 @@ module KuberKit
177
177
  module UI
178
178
  autoload :Interactive, 'ui/interactive'
179
179
  autoload :Simple, 'ui/simple'
180
+ autoload :Debug, 'ui/debug'
181
+ autoload :Api, 'ui/api'
180
182
  end
181
183
 
182
184
  autoload :CLI, 'cli'
@@ -205,12 +207,12 @@ module KuberKit
205
207
  @current_configuration = nil
206
208
  end
207
209
 
208
- def set_debug_mode(value)
209
- @debug_mode = value
210
+ def set_ui_mode(value)
211
+ @ui_mode = value
210
212
  end
211
213
 
212
- def debug_mode?
213
- !!@debug_mode
214
+ def ui_mode
215
+ @ui_mode
214
216
  end
215
217
 
216
218
  def deprecation_warnings_disabled?
@@ -1,13 +1,10 @@
1
1
  class KuberKit::Actions::ConfigurationLoader
2
- APP_CONFIG_FILENAME = "config.rb".freeze
3
-
4
2
  include KuberKit::Import[
5
3
  "core.registry_store",
6
4
  "core.image_store",
7
5
  "core.service_store",
8
6
  "core.configuration_store",
9
7
  "artifacts_sync.artifacts_updater",
10
- "tools.logger",
11
8
  "shell.local_shell",
12
9
  "ui",
13
10
  "configs"
@@ -16,29 +13,24 @@ class KuberKit::Actions::ConfigurationLoader
16
13
  Contract Hash => Any
17
14
  def call(options)
18
15
  root_path = options[:path] || File.join(Dir.pwd, configs.kuber_kit_dirname)
19
-
20
- # require config file first, in case if other dirs are overriden in config
21
- config_file_path = File.join(root_path, APP_CONFIG_FILENAME)
22
- if File.exists?(config_file_path)
23
- require config_file_path
24
- end
25
-
26
16
  images_path = options[:images_path] || File.join(root_path, configs.images_dirname)
27
17
  services_path = options[:services_path] || File.join(root_path, configs.services_dirname)
28
18
  infra_path = options[:infra_path] || File.join(root_path, configs.infra_dirname)
29
19
  configurations_path = options[:configurations_path] || File.join(root_path, configs.configurations_dirname)
30
20
  configuration_name = ENV["KUBER_KIT_CONFIGURATION"] || options[:configuration]
31
21
 
32
- logger.info "Launching kuber_kit with:"
33
- logger.info " Root path: #{root_path.to_s.yellow}"
34
- logger.info " Images path: #{images_path.to_s.yellow}"
35
- logger.info " Services path: #{services_path.to_s.yellow}"
36
- logger.info " Infrastructure path: #{infra_path.to_s.yellow}"
37
- logger.info " Configurations path: #{configurations_path.to_s.yellow}"
38
- logger.info " Configuration name: #{configuration_name.to_s.yellow}"
22
+ ui.print_debug "ConfigurationLoader", "Launching kuber_kit with:"
23
+ ui.print_debug "ConfigurationLoader", " Root path: #{root_path.to_s.yellow}"
24
+ ui.print_debug "ConfigurationLoader", " Images path: #{images_path.to_s.yellow}"
25
+ ui.print_debug "ConfigurationLoader", " Services path: #{services_path.to_s.yellow}"
26
+ ui.print_debug "ConfigurationLoader", " Infrastructure path: #{infra_path.to_s.yellow}"
27
+ ui.print_debug "ConfigurationLoader", " Configurations path: #{configurations_path.to_s.yellow}"
28
+ ui.print_debug "ConfigurationLoader", " Configuration name: #{configuration_name.to_s.yellow}"
29
+
30
+ ui.print_info("Logs", "See logs at: #{configs.log_file_path}")
39
31
 
40
32
  unless File.exists?(root_path)
41
- ui.print_warning "WARNING", "KuberKit root path #{root_path} doesn't exist. You may want to pass it --path parameter."
33
+ ui.print_warning "ConfigurationLoader", "KuberKit root path #{root_path} doesn't exist. You may want to pass it --path parameter."
42
34
  end
43
35
 
44
36
  if Gem::Version.new(KuberKit::VERSION) < Gem::Version.new(configs.kuber_kit_min_version)
@@ -72,6 +64,7 @@ class KuberKit::Actions::ConfigurationLoader
72
64
  true
73
65
  rescue KuberKit::Error => e
74
66
  ui.print_error("Error", e.message)
67
+
75
68
  false
76
69
  end
77
70
 
@@ -104,6 +97,6 @@ class KuberKit::Actions::ConfigurationLoader
104
97
  require(path)
105
98
  end
106
99
  rescue KuberKit::Shell::AbstractShell::DirNotFoundError
107
- logger.warn("Directory with infrastructure not found: #{infra_path}")
100
+ ui.print_warning("ConfigurationLoader", "Directory with infrastructure not found: #{infra_path}")
108
101
  end
109
102
  end
@@ -15,6 +15,7 @@ class KuberKit::Actions::EnvFileReader
15
15
  true
16
16
  rescue KuberKit::Error => e
17
17
  ui.print_error("Error", e.message)
18
+
18
19
  false
19
20
  end
20
21
  end
@@ -3,7 +3,6 @@ class KuberKit::Actions::ImageCompiler
3
3
  "image_compiler.image_dependency_resolver",
4
4
  "image_compiler.build_server_pool_factory",
5
5
  "shell.local_shell",
6
- "tools.logger",
7
6
  "ui",
8
7
  image_compiler: "image_compiler.action_handler",
9
8
  ]
@@ -13,14 +12,17 @@ class KuberKit::Actions::ImageCompiler
13
12
  build_id = generate_build_id
14
13
  build_server_pool = build_server_pool_factory.create()
15
14
 
15
+ compiled_images = []
16
+ compilation_result = {}
16
17
  image_dependency_resolver.each_with_deps(image_names) do |dep_image_names|
17
18
  result = compile_simultaneously(dep_image_names, build_id, build_server_pool)
18
- abort unless result
19
+ compiled_images += dep_image_names
20
+ compilation_result = compilation_result.merge(result)
19
21
  end
20
22
 
21
23
  build_server_pool.disconnect_all
22
24
 
23
- true
25
+ { images: compiled_images, compilation: compilation_result }
24
26
  rescue KuberKit::Error => e
25
27
  ui.print_error("Error", e.message)
26
28
 
@@ -30,20 +32,22 @@ class KuberKit::Actions::ImageCompiler
30
32
  private
31
33
  def compile_simultaneously(image_names, build_id, build_server_pool)
32
34
  task_group = ui.create_task_group
35
+ compiler_result = {}
33
36
  image_names.map do |image_name|
34
37
 
35
- logger.info("Started compiling: #{image_name.to_s.green}")
38
+ ui.print_debug("ImageCompiler", "Started compiling: #{image_name.to_s.green}")
36
39
  task_group.add("Compiling #{image_name.to_s.yellow}") do |task|
37
40
  shell = build_server_pool.get_shell
38
41
 
39
- image_compiler.call(shell, image_name, build_id)
42
+ compiler_result[image_name] = image_compiler.call(shell, image_name, build_id)
40
43
 
41
44
  task.update_title("Compiled #{image_name.to_s.green}")
42
- logger.info("Finished compiling: #{image_name.to_s.green}")
45
+ ui.print_debug("ImageCompiler", "Finished compiling: #{image_name}")
43
46
  end
44
47
 
45
48
  end
46
49
  task_group.wait
50
+ compiler_result
47
51
  end
48
52
 
49
53
  def generate_build_id
@@ -4,7 +4,6 @@ class KuberKit::Actions::ServiceDeployer
4
4
  "service_deployer.service_list_resolver",
5
5
  "core.service_store",
6
6
  "shell.local_shell",
7
- "tools.logger",
8
7
  "ui",
9
8
  service_deployer: "service_deployer.action_handler",
10
9
  ]
@@ -25,7 +24,7 @@ class KuberKit::Actions::ServiceDeployer
25
24
  )
26
25
 
27
26
  unless service_names.any?
28
- ui.print_warning "WARNING", "No service found with given options, nothing will be deployed."
27
+ ui.print_warning "ServiceDeployer", "No service found with given options, nothing will be deployed."
29
28
  end
30
29
 
31
30
  services = service_names.map do |service_name|
@@ -35,9 +34,9 @@ class KuberKit::Actions::ServiceDeployer
35
34
  images_names = services.map(&:images).flatten.uniq
36
35
 
37
36
  compile_images(images_names) unless skip_compile
38
- deploy_services(service_names)
37
+ deployment_result = deploy_services(service_names)
39
38
 
40
- true
39
+ { services: service_names, deployment: deployment_result }
41
40
  rescue KuberKit::Error => e
42
41
  ui.print_error("Error", e.message)
43
42
 
@@ -47,18 +46,22 @@ class KuberKit::Actions::ServiceDeployer
47
46
  def deploy_services(service_names)
48
47
  task_group = ui.create_task_group
49
48
 
49
+ deployer_result = {}
50
+
50
51
  service_names.each do |service_name|
51
52
 
52
- logger.info("Started deploying: #{service_name.to_s.green}")
53
+ ui.print_debug("ServiceDeployer", "Started deploying: #{service_name.to_s.green}")
53
54
  task_group.add("Deploying #{service_name.to_s.yellow}") do |task|
54
- service_deployer.call(local_shell, service_name.to_sym)
55
+ deployer_result[service_name] = service_deployer.call(local_shell, service_name.to_sym)
55
56
 
56
57
  task.update_title("Deployed #{service_name.to_s.green}")
57
- logger.info("Finished deploying: #{service_name.to_s.green}")
58
+ ui.print_debug("ServiceDeployer", "Finished deploying: #{service_name.to_s.green}")
58
59
  end
59
60
  end
60
61
 
61
62
  task_group.wait
63
+
64
+ deployer_result
62
65
  end
63
66
 
64
67
  def compile_images(images_names)
@@ -14,6 +14,7 @@ class KuberKit::Actions::TemplateReader
14
14
  true
15
15
  rescue KuberKit::Error => e
16
16
  ui.print_error("Error", e.message)
17
+
17
18
  false
18
19
  end
19
20
  end
@@ -4,7 +4,8 @@ class KuberKit::ArtifactsSync::ArtifactsUpdater
4
4
  include KuberKit::Import[
5
5
  "artifacts_sync.git_artifact_resolver",
6
6
  "artifacts_sync.null_artifact_resolver",
7
- "tools.logger"
7
+
8
+ "ui"
8
9
  ]
9
10
 
10
11
  def use_resolver(artifact_resolver, artifact_class:)
@@ -23,7 +24,7 @@ class KuberKit::ArtifactsSync::ArtifactsUpdater
23
24
  artifacts.each do |artifact|
24
25
  resolver = @@resolvers[artifact.class]
25
26
 
26
- logger.info "Updating artifact #{artifact.name.to_s.green}"
27
+ ui.print_debug "ArtifactUpdater", "Updating artifact #{artifact.name.to_s.green}"
27
28
 
28
29
  raise ResolverNotFoundError, "Can't find resolver for artifact #{artifact}" if resolver.nil?
29
30
 
@@ -1,16 +1,19 @@
1
1
  require 'thor'
2
2
 
3
3
  class KuberKit::CLI < Thor
4
+ APP_CONFIG_FILENAME = "config.rb".freeze
5
+
4
6
  class_option :path, :type => :string
5
7
  class_option :images_path, :type => :string
6
8
  class_option :infra_path, :type => :string
7
9
  class_option :configurations_path, :type => :string
10
+ class_option :ui, :type => :string, :desc => "UI mode (interactive|debug|simple)"
8
11
  class_option :debug, :type => :boolean, aliases: ["-d"]
9
12
  class_option :configuration, :type => :string, aliases: ["-C"]
10
13
 
11
14
  desc "compile IMAGE_NAMES", "Compile image with IMAGE_NAMES (comma-separated)"
12
15
  def compile(image_names_str)
13
- KuberKit.set_debug_mode(options[:debug])
16
+ setup(options)
14
17
 
15
18
  image_names = image_names_str.split(",").map(&:strip).map(&:to_sym)
16
19
 
@@ -18,15 +21,10 @@ class KuberKit::CLI < Thor
18
21
  result = KuberKit::Container['actions.image_compiler'].call(image_names, options)
19
22
  end
20
23
 
21
- logger = KuberKit::Container['tools.logger']
22
24
  if result
23
- logger.info("---------------------------")
24
- logger.info("Image compilation finished!")
25
- logger.info("---------------------------")
25
+ print_result("Image compilation finished!", result: result)
26
26
  else
27
- logger.info("-------------------------".red)
28
- logger.info("Image compilation failed!".red)
29
- logger.info("-------------------------".red)
27
+ exit 1
30
28
  end
31
29
  end
32
30
 
@@ -35,7 +33,7 @@ class KuberKit::CLI < Thor
35
33
  method_option :tags, :type => :array, aliases: ["-t"]
36
34
  method_option :skip_compile, :type => :boolean, aliases: ["-B"]
37
35
  def deploy
38
- KuberKit.set_debug_mode(options[:debug])
36
+ setup(options)
39
37
 
40
38
  if KuberKit::Container['actions.configuration_loader'].call(options)
41
39
  result = KuberKit::Container['actions.service_deployer'].call(
@@ -45,21 +43,16 @@ class KuberKit::CLI < Thor
45
43
  )
46
44
  end
47
45
 
48
- logger = KuberKit::Container['tools.logger']
49
46
  if result
50
- logger.info("---------------------------")
51
- logger.info("Service deployment finished!")
52
- logger.info("---------------------------")
47
+ print_result("Service deployment finished!", result: result)
53
48
  else
54
- logger.info("-------------------------".red)
55
- logger.info("Service deployment failed!".red)
56
- logger.info("-------------------------".red)
49
+ exit 1
57
50
  end
58
51
  end
59
52
 
60
53
  desc "env ENV_FILE_NAME", "Return content of Env File ENV_FILE_NAME"
61
54
  def env(env_file_name)
62
- KuberKit.set_debug_mode(options[:debug])
55
+ setup(options)
63
56
 
64
57
  if KuberKit::Container['actions.configuration_loader'].call(options)
65
58
  KuberKit::Container['actions.env_file_reader'].call(env_file_name.to_sym, options)
@@ -68,7 +61,7 @@ class KuberKit::CLI < Thor
68
61
 
69
62
  desc "template TEMPLATE_NAME", "Return content of Template TEMPLATE_NAME"
70
63
  def template(template_name)
71
- KuberKit.set_debug_mode(options[:debug])
64
+ setup(options)
72
65
 
73
66
  if KuberKit::Container['actions.configuration_loader'].call(options)
74
67
  KuberKit::Container['actions.template_reader'].call(template_name.to_sym, options)
@@ -77,7 +70,7 @@ class KuberKit::CLI < Thor
77
70
 
78
71
  desc "service SERVICE_NAME", "Return content of Service SERVICE_NAME"
79
72
  def service(service_name)
80
- KuberKit.set_debug_mode(options[:debug])
73
+ setup(options)
81
74
 
82
75
  if KuberKit::Container['actions.configuration_loader'].call(options)
83
76
  KuberKit::Container['actions.service_reader'].call(service_name.to_sym, options)
@@ -86,7 +79,7 @@ class KuberKit::CLI < Thor
86
79
 
87
80
  desc "apply FILE_PATH", "Apply FILE_PATH with kubectl"
88
81
  def apply(file_path)
89
- KuberKit.set_debug_mode(options[:debug])
82
+ setup(options)
90
83
 
91
84
  if KuberKit::Container['actions.configuration_loader'].call(options)
92
85
  KuberKit::Container['actions.kubectl_applier'].call(File.expand_path(file_path), options)
@@ -95,26 +88,26 @@ class KuberKit::CLI < Thor
95
88
 
96
89
  desc "attach POD_NAME", "Attach to POD_NAME using kubectl"
97
90
  def attach(pod_name = nil)
98
- KuberKit.set_debug_mode(options[:debug])
91
+ setup(options)
99
92
 
100
93
  if KuberKit::Container['actions.configuration_loader'].call(options)
101
94
  KuberKit::Container['actions.kubectl_attacher'].call(pod_name, options)
102
95
  end
103
96
  end
104
97
 
105
- desc "launch console in POD_NAME", "Attach to POD_NAME using kubectl & launch bin/console"
98
+ desc "console POD_NAME", "Attach to POD_NAME using kubectl & launch bin/console"
106
99
  def console(pod_name = nil)
107
- KuberKit.set_debug_mode(options[:debug])
100
+ setup(options)
108
101
 
109
102
  if KuberKit::Container['actions.configuration_loader'].call(options)
110
103
  KuberKit::Container['actions.kubectl_console'].call(pod_name, options)
111
104
  end
112
105
  end
113
106
 
114
- desc "show logs for POD_NAME", "Show logs for POD_NAME using kubectl"
107
+ desc "logs POD_NAME", "Show logs for POD_NAME using kubectl"
115
108
  method_option :follow, :type => :boolean, aliases: ["-f"]
116
109
  def logs(pod_name = nil)
117
- KuberKit.set_debug_mode(options[:debug])
110
+ setup(options)
118
111
 
119
112
  if KuberKit::Container['actions.configuration_loader'].call(options)
120
113
  KuberKit::Container['actions.kubectl_logs'].call(pod_name, options)
@@ -129,4 +122,24 @@ class KuberKit::CLI < Thor
129
122
  def self.exit_on_failure?
130
123
  true
131
124
  end
125
+
126
+ private
127
+ def setup(options)
128
+ if options[:debug]
129
+ KuberKit.set_ui_mode(:debug)
130
+ elsif options[:ui]
131
+ KuberKit.set_ui_mode(options[:ui].to_sym)
132
+ end
133
+
134
+ # We should load config before loading any bean, to make sure that bean won't be built with default config
135
+ root_path = options[:path] || File.join(Dir.pwd, KuberKit::Container['configs'].kuber_kit_dirname)
136
+ config_file_path = File.join(root_path, APP_CONFIG_FILENAME)
137
+ if File.exists?(config_file_path)
138
+ require config_file_path
139
+ end
140
+ end
141
+
142
+ def print_result(message, data = {})
143
+ KuberKit::Container['ui'].print_result(message, data)
144
+ end
132
145
  end
@@ -5,7 +5,7 @@ class KuberKit::Configs
5
5
  :image_dockerfile_name, :image_build_context_dir, :image_tag, :docker_ignore_list, :image_compile_dir,
6
6
  :kuber_kit_dirname, :kuber_kit_min_version, :images_dirname, :services_dirname, :infra_dirname, :configurations_dirname,
7
7
  :artifact_clone_dir, :service_config_dir, :deployer_strategy, :compile_simultaneous_limit,
8
- :additional_images_paths, :deprecation_warnings_disabled
8
+ :additional_images_paths, :deprecation_warnings_disabled, :log_file_path
9
9
  ]
10
10
  DOCKER_IGNORE_LIST = [
11
11
  'Dockerfile',
@@ -51,6 +51,7 @@ class KuberKit::Configs
51
51
  set :compile_simultaneous_limit, 5
52
52
  set :additional_images_paths, []
53
53
  set :deprecation_warnings_disabled, false
54
+ set :log_file_path, "/tmp/kuber_kit.log"
54
55
  end
55
56
 
56
57
  def items
@@ -114,7 +114,7 @@ class KuberKit::Container
114
114
  end
115
115
 
116
116
  register "tools.logger" do
117
- KuberKit::Container["tools.logger_factory"].create("/tmp/kuber_kit.log")
117
+ KuberKit::Container["tools.logger_factory"].create()
118
118
  end
119
119
 
120
120
  register "shell.bash_commands" do
@@ -258,8 +258,12 @@ class KuberKit::Container
258
258
  end
259
259
 
260
260
  register "ui" do
261
- if KuberKit.debug_mode?
261
+ if KuberKit.ui_mode == :debug
262
+ KuberKit::UI::Debug.new
263
+ elsif KuberKit.ui_mode == :simple
262
264
  KuberKit::UI::Simple.new
265
+ elsif KuberKit.ui_mode == :api
266
+ KuberKit::UI::Api.new
263
267
  else
264
268
  KuberKit::UI::Interactive.new
265
269
  end
@@ -3,7 +3,7 @@ class KuberKit::Core::ConfigurationStore
3
3
  "core.configuration_factory",
4
4
  "core.configuration_definition_factory",
5
5
  "shell.local_shell",
6
- "tools.logger"
6
+ "ui"
7
7
  ]
8
8
 
9
9
  def define(configuration_name)
@@ -33,7 +33,7 @@ class KuberKit::Core::ConfigurationStore
33
33
  load_definition(path)
34
34
  end
35
35
  rescue KuberKit::Shell::AbstractShell::DirNotFoundError
36
- logger.warn("Directory with configurations not found: #{dir_path}")
36
+ ui.print_warning("ConfigurationStore", "Directory with configurations not found: #{dir_path}")
37
37
  []
38
38
  end
39
39
 
@@ -3,7 +3,7 @@ class KuberKit::Core::ImageStore
3
3
  "core.image_factory",
4
4
  "core.image_definition_factory",
5
5
  "shell.local_shell",
6
- "tools.logger"
6
+ "ui"
7
7
  ]
8
8
 
9
9
  def define(image_name, image_dir = nil)
@@ -33,7 +33,7 @@ class KuberKit::Core::ImageStore
33
33
  load_definition(path)
34
34
  end
35
35
  rescue KuberKit::Shell::AbstractShell::DirNotFoundError
36
- logger.warn("Directory with images not found: #{dir_path}")
36
+ ui.print_warning("ImageStore", "Directory with images not found: #{dir_path}")
37
37
  []
38
38
  end
39
39
 
@@ -4,11 +4,11 @@ class KuberKit::Core::Service
4
4
  attr_reader :name, :template_name, :tags, :images, :attributes, :deployer_strategy
5
5
 
6
6
  Contract KeywordArgs[
7
- name: Symbol,
8
- template_name: Symbol,
9
- tags: ArrayOf[Symbol],
10
- images: ArrayOf[Symbol],
11
- attributes: HashOf[Symbol => Any],
7
+ name: Symbol,
8
+ template_name: Maybe[Symbol],
9
+ tags: ArrayOf[Symbol],
10
+ images: ArrayOf[Symbol],
11
+ attributes: HashOf[Symbol => Any],
12
12
  deployer_strategy: Maybe[Symbol]
13
13
  ] => Any
14
14
  def initialize(name:, template_name:, tags:, images:, attributes:, deployer_strategy:)
@@ -1,13 +1,7 @@
1
1
  class KuberKit::Core::ServiceFactory
2
- AttributeNotSetError = Class.new(KuberKit::Error)
3
-
4
2
  def create(definition)
5
3
  service_attrs = definition.to_service_attrs
6
4
 
7
- if service_attrs.template_name.nil?
8
- raise AttributeNotSetError, "Please set template for service using #template method"
9
- end
10
-
11
5
  configuration_attributes = KuberKit.current_configuration.service_attributes(service_attrs.name)
12
6
  attributes = (service_attrs.attributes || {}).merge(configuration_attributes)
13
7
 
@@ -3,7 +3,7 @@ class KuberKit::Core::ServiceStore
3
3
  "core.service_factory",
4
4
  "core.service_definition_factory",
5
5
  "shell.local_shell",
6
- "tools.logger"
6
+ "ui",
7
7
  ]
8
8
 
9
9
  def define(service_name)
@@ -33,7 +33,7 @@ class KuberKit::Core::ServiceStore
33
33
  load_definition(path)
34
34
  end
35
35
  rescue KuberKit::Shell::AbstractShell::DirNotFoundError
36
- logger.warn("Directory with services not found: #{dir_path}")
36
+ ui.print_warning("ServiceStore", "Directory with services not found: #{dir_path}")
37
37
  []
38
38
  end
39
39
 
@@ -12,7 +12,9 @@ class KuberKit::ImageCompiler::Compiler
12
12
  context_helper = context_helper_factory.build_image_context(shell, image)
13
13
  image_build_dir_creator.create(shell, image, image_build_dir, context_helper: context_helper)
14
14
 
15
- image_builder.build(shell, image, image_build_dir, context_helper: context_helper)
15
+ result = image_builder.build(shell, image, image_build_dir, context_helper: context_helper)
16
16
  image_build_dir_creator.cleanup(shell, image_build_dir)
17
+
18
+ result
17
19
  end
18
20
  end
@@ -10,7 +10,13 @@ class KuberKit::ImageCompiler::ImageBuilder
10
10
  def build(shell, image, build_dir, context_helper: nil)
11
11
  image.before_build_callback.call(context_helper, build_dir) if image.before_build_callback
12
12
 
13
- docker_commands.build(shell, build_dir, ["-t=#{image.registry_url}"])
13
+ build_options = ["-t=#{image.registry_url}"]
14
+ # use quite option for api mode ui, so it will only return built image id
15
+ if KuberKit.ui_mode == :api
16
+ build_options << "-q"
17
+ end
18
+
19
+ build_result = docker_commands.build(shell, build_dir, build_options)
14
20
 
15
21
  version_tag = version_tag_builder.get_version
16
22
  docker_commands.tag(shell, image.registry_url, version_tag)
@@ -21,5 +27,7 @@ class KuberKit::ImageCompiler::ImageBuilder
21
27
  end
22
28
 
23
29
  image.after_build_callback.call(context_helper, build_dir) if image.after_build_callback
30
+
31
+ build_result
24
32
  end
25
33
  end
@@ -8,8 +8,9 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
8
8
  STRATEGY_OPTIONS = [
9
9
  :container_name,
10
10
  :image_name,
11
- :docker_run_args,
12
- :docker_run_command,
11
+ :detached,
12
+ :command_name,
13
+ :command_args,
13
14
  :delete_if_exists
14
15
  ]
15
16
 
@@ -21,9 +22,9 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
21
22
  raise KuberKit::Error, "Unknow options for deploy strategy: #{unknown_options}. Available options: #{STRATEGY_OPTIONS}"
22
23
  end
23
24
 
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)
25
+ container_name = strategy_options.fetch(:container_name, service.uri)
26
+ command_name = strategy_options.fetch(:command_name, "bash")
27
+ command_args = strategy_options.fetch(:command_args, nil)
27
28
 
28
29
  image_name = strategy_options.fetch(:image_name, nil)
29
30
  if image_name.nil?
@@ -36,11 +37,16 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
36
37
  docker_commands.delete_container(shell, container_name)
37
38
  end
38
39
 
40
+ command_args = Array(command_args)
41
+ if container_name
42
+ command_args << "--name #{container_name}"
43
+ end
44
+
39
45
  docker_commands.run(
40
46
  shell, image.remote_registry_url,
41
- run_args: docker_run_args,
42
- run_command: docker_run_command,
43
- detached: !!strategy_options[:detached]
47
+ command: command_name,
48
+ args: command_args,
49
+ detached: !!strategy_options[:detached]
44
50
  )
45
51
  end
46
52
  end
@@ -7,7 +7,9 @@ class KuberKit::ServiceDeployer::Strategies::DockerCompose < KuberKit::ServiceDe
7
7
 
8
8
  STRATEGY_OPTIONS = [
9
9
  :service_name,
10
- :command_name
10
+ :command_name,
11
+ :command_args,
12
+ :detached
11
13
  ]
12
14
 
13
15
  Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
@@ -24,10 +26,12 @@ class KuberKit::ServiceDeployer::Strategies::DockerCompose < KuberKit::ServiceDe
24
26
 
25
27
  service_name = strategy_options.fetch(:service_name, service.name.to_s)
26
28
  command_name = strategy_options.fetch(:command_name, "bash")
29
+ command_args = strategy_options.fetch(:command_args, nil)
27
30
 
28
31
  docker_compose_commands.run(shell, config_path,
29
32
  service: service_name,
30
33
  command: command_name,
34
+ args: command_args,
31
35
  detached: !!strategy_options[:detached]
32
36
  )
33
37
  end
@@ -39,7 +39,7 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
39
39
  kubectl_commands.delete_resource(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
40
40
  end
41
41
 
42
- kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
42
+ apply_result = kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
43
43
 
44
44
  restart_enabled = strategy_options.fetch(:restart_if_exists, true)
45
45
  if restart_enabled && resource_exists
@@ -48,5 +48,7 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
48
48
  kubeconfig_path: kubeconfig_path, namespace: namespace
49
49
  )
50
50
  end
51
+
52
+ apply_result
51
53
  end
52
54
  end
@@ -6,8 +6,14 @@ class KuberKit::ServiceReader::Reader
6
6
  "preprocessing.text_preprocessor"
7
7
  ]
8
8
 
9
+ AttributeNotSetError = Class.new(KuberKit::Error)
10
+
9
11
  Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
10
12
  def read(shell, service)
13
+ if service.template_name.nil?
14
+ raise AttributeNotSetError, "Please set template for service using #template method"
15
+ end
16
+
11
17
  template = template_store.get(service.template_name)
12
18
 
13
19
  context_helper = context_helper_factory.build_service_context(shell, service)
@@ -3,7 +3,7 @@ class KuberKit::Shell::Commands::DockerCommands
3
3
  default_args = ["--rm=true"]
4
4
  args_list = (default_args + args).join(" ")
5
5
 
6
- shell.exec!(%Q{docker build #{build_dir} #{args_list}})
6
+ shell.exec!(%Q{docker image build #{build_dir} #{args_list}})
7
7
  end
8
8
 
9
9
  def tag(shell, image_name, tag_name)
@@ -14,19 +14,23 @@ 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)
17
+ def run(shell, image_name, args: nil, command: nil, detached: false, interactive: false)
18
18
  command_parts = []
19
19
  command_parts << "docker run"
20
20
  command_parts << "-d" if detached
21
- command_parts << run_args if run_args
21
+ command_parts << Array(args).join(" ") if args
22
22
  command_parts << image_name
23
- command_parts << run_command if run_command
23
+ command_parts << command if command
24
24
 
25
- shell.exec!(command_parts.join(" "))
25
+ if interactive
26
+ shell.interactive!(command_parts.join(" "))
27
+ else
28
+ shell.exec!(command_parts.join(" "))
29
+ end
26
30
  end
27
31
 
28
- def container_exists?(shell, container_name)
29
- result = get_container_id(shell, container_name)
32
+ def container_exists?(shell, container_name, status: nil)
33
+ result = get_container_id(shell, container_name, status: status)
30
34
  result && result != ""
31
35
  end
32
36
 
@@ -34,15 +38,16 @@ class KuberKit::Shell::Commands::DockerCommands
34
38
  shell.exec!(%Q{docker rm -f #{container_name}})
35
39
  end
36
40
 
37
- def get_container_id(shell, container_name, only_healthy: false, status: "running")
41
+ def get_container_id(shell, container_name, only_healthy: false, status: nil)
38
42
  command_parts = []
39
43
  command_parts << "docker ps -a -q"
40
44
 
41
45
  if only_healthy
42
46
  command_parts << "--filter=\"health=healthy\""
43
47
  end
44
-
45
- command_parts << "--filter=\"status=#{status}\""
48
+ if status
49
+ command_parts << "--filter=\"status=#{status}\""
50
+ end
46
51
  command_parts << "--filter=\"name=#{container_name}\""
47
52
 
48
53
  shell.exec!(command_parts.join(" "))
@@ -1,17 +1,16 @@
1
1
  class KuberKit::Shell::Commands::DockerComposeCommands
2
- def run(shell, path, service:, command:, interactive: false, detached: false)
2
+ def run(shell, path, service:, args: nil, command: nil, detached: false, interactive: false)
3
3
  command_parts = [
4
4
  "docker-compose",
5
- "run",
6
5
  "-f #{path}",
6
+ "run",
7
7
  ]
8
8
 
9
- if detached
10
- command_parts << "-d"
11
- end
12
9
 
10
+ command_parts << "-d" if detached
11
+ command_parts << Array(args).join(" ") if args
13
12
  command_parts << service
14
- command_parts << command
13
+ command_parts << command if command
15
14
 
16
15
  if interactive
17
16
  shell.interactive!(command_parts.join(" "))
@@ -2,16 +2,16 @@ require 'fileutils'
2
2
 
3
3
  class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
4
4
  include KuberKit::Import[
5
- "tools.logger",
6
5
  "shell.command_counter",
7
6
  "shell.rsync_commands",
7
+ "ui",
8
8
  ]
9
9
 
10
10
  def exec!(command, log_command: true)
11
11
  command_number = command_counter.get_number.to_s.rjust(2, "0")
12
12
 
13
13
  if log_command
14
- logger.info("Execute: [#{command_number}]: #{command.to_s.cyan}")
14
+ ui.print_debug("LocalShell", "Execute: [#{command_number}]: #{command.to_s.cyan}")
15
15
  end
16
16
 
17
17
  result = nil
@@ -20,7 +20,7 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
20
20
  end
21
21
 
22
22
  if result && result != "" && log_command
23
- logger.info("Finished [#{command_number}] with result: \n#{result.grey}")
23
+ ui.print_debug("LocalShell", "Finished [#{command_number}] with result: \n ----\n#{result.grey}\n ----")
24
24
  end
25
25
 
26
26
  if $?.exitstatus != 0
@@ -34,7 +34,7 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
34
34
  command_number = command_counter.get_number.to_s.rjust(2, "0")
35
35
 
36
36
  if log_command
37
- logger.info("Interactive: [#{command_number}]: #{command.to_s.cyan}")
37
+ ui.print_debug("LocalShell", "Interactive: [#{command_number}]: #{command.to_s.cyan}")
38
38
  end
39
39
 
40
40
  result = system(command)
@@ -57,7 +57,7 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
57
57
 
58
58
  File.write(file_path, content)
59
59
 
60
- logger.info("Created file #{file_path.to_s.cyan}\r\n#{content.grey}")
60
+ ui.print_debug("LocalShell", "Created file #{file_path.to_s.cyan}\r\n ----\r\n#{content.grey}\r\n ----")
61
61
 
62
62
  true
63
63
  end
@@ -76,7 +76,7 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
76
76
 
77
77
  def recursive_list_files(path, name: nil)
78
78
  command = %Q{find -L #{path} -type f}
79
- command += " -name #{name}" if name
79
+ command += " -name '#{name}'" if name
80
80
  exec!(command).split(/[\r\n]+/)
81
81
  rescue => e
82
82
  if e.message.include?("No such file or directory")
@@ -2,7 +2,7 @@ require 'tempfile'
2
2
 
3
3
  class KuberKit::Shell::SshShell < KuberKit::Shell::LocalShell
4
4
  include KuberKit::Import[
5
- "tools.logger",
5
+ "ui",
6
6
  "shell.command_counter",
7
7
  "shell.rsync_commands",
8
8
  "shell.local_shell"
@@ -24,13 +24,13 @@ class KuberKit::Shell::SshShell < KuberKit::Shell::LocalShell
24
24
  command_number = command_counter.get_number.to_s.rjust(2, "0")
25
25
 
26
26
  if log_command
27
- logger.info("#{ssh_session.host.green} > Execute: [#{command_number}]: #{command.to_s.cyan}")
27
+ ui.print_debug("SshShell", "#{ssh_session.host.green} > Execute: [#{command_number}]: #{command.to_s.cyan}")
28
28
  end
29
29
 
30
30
  result = ssh_session.exec!(command)
31
31
 
32
32
  if result && result != "" && log_command
33
- logger.info("#{ssh_session.host.green} > Finished [#{command_number}] with result: \n#{result.grey}")
33
+ ui.print_debug("SshShell", "#{ssh_session.host.green} > Finished [#{command_number}] with result: \n#{result.grey}")
34
34
  end
35
35
 
36
36
  result
@@ -62,7 +62,7 @@ class KuberKit::Shell::SshShell < KuberKit::Shell::LocalShell
62
62
  sync(file.path, file_path)
63
63
  end
64
64
 
65
- logger.info("Created file #{file_path.to_s.cyan}\r\n#{content.grey}")
65
+ ui.print_debug("SshShell", "Created file #{file_path.to_s.cyan}\r\n ----\r\n#{content.grey}\r\n ----")
66
66
 
67
67
  true
68
68
  end
@@ -9,8 +9,12 @@ class KuberKit::Tools::LoggerFactory
9
9
  Logger::FATAL => String::Colors::PURPLE,
10
10
  }
11
11
 
12
- def create(stdout, level = nil)
13
- logger = Logger.new(stdout)
12
+ include KuberKit::Import[
13
+ "configs",
14
+ ]
15
+
16
+ def create(stdout = nil, level = nil)
17
+ logger = Logger.new(stdout || configs.log_file_path)
14
18
 
15
19
  logger.level = level || Logger::DEBUG
16
20
 
@@ -22,7 +26,7 @@ class KuberKit::Tools::LoggerFactory
22
26
  severity_text = severity.to_s
23
27
  severity_text = severity_text.colorize(severity_color) if severity_color
24
28
 
25
- if level == Logger::INFO
29
+ if level == Logger::DEBUG
26
30
  "#{datetime.strftime("%Y/%m/%d %H:%M:%S").grey} #{msg}\n"
27
31
  else
28
32
  "#{datetime.strftime("%Y/%m/%d %H:%M:%S").grey} #{severity_text.downcase}: #{msg}\n"
@@ -0,0 +1,48 @@
1
+ require 'json'
2
+ class KuberKit::UI::Api < KuberKit::UI::Simple
3
+ class Task < KuberKit::UI::Simple::Task
4
+ def print_started
5
+ # do nothing, api formatter should only show result
6
+ end
7
+
8
+ def print_finished
9
+ # do nothing, api formatter should only show result
10
+ end
11
+ end
12
+
13
+ def create_task_group
14
+ TaskGroup.new(KuberKit::UI::Api::Task)
15
+ end
16
+
17
+ def create_task(title, &block)
18
+ task = KuberKit::UI::Api::Task.new(title, &block)
19
+ task.execute
20
+ task.wait
21
+ end
22
+
23
+ def print_info(title, text)
24
+ logger.debug(text)
25
+ end
26
+
27
+ def print_error(title, text)
28
+ logger.debug(text)
29
+ print_json({error: text})
30
+ end
31
+
32
+ def print_warning(title, text)
33
+ logger.debug(text)
34
+ end
35
+
36
+ def print_debug(title, text)
37
+ logger.debug(text)
38
+ end
39
+
40
+ def print_result(message, data = {})
41
+ print_json({message: message}.merge(data))
42
+ end
43
+
44
+ protected
45
+ def print_json(data)
46
+ puts JSON.generate(data)
47
+ end
48
+ end
@@ -0,0 +1,31 @@
1
+ class KuberKit::UI::Debug < KuberKit::UI::Simple
2
+ def print_info(title, text)
3
+ print_text(text, color: String::Colors::BLUE)
4
+ end
5
+
6
+ def print_error(title, text)
7
+ print_text(text, color: String::Colors::RED)
8
+ end
9
+
10
+ def print_warning(title, text)
11
+ print_text(text, color: String::Colors::YELLOW)
12
+ logger.debug(text)
13
+ end
14
+
15
+ def print_debug(title, text)
16
+ print_text(text, color: nil)
17
+ logger.debug(text)
18
+ end
19
+
20
+ def print_result(message, data = {})
21
+ print_debug("Result", "---------------------------")
22
+ print_debug("Result", message)
23
+ print_debug("Result", "---------------------------")
24
+ end
25
+
26
+ protected
27
+ def print_text(text, color: nil)
28
+ colorized_message = color ? text.colorize(color) : text
29
+ puts " #{Time.now.strftime("%H:%M:%S").grey} #{colorized_message}"
30
+ end
31
+ end
@@ -1,6 +1,10 @@
1
1
  require 'cli/ui'
2
2
 
3
3
  class KuberKit::UI::Interactive
4
+ include KuberKit::Import[
5
+ "tools.logger",
6
+ ]
7
+
4
8
  class TaskGroup < CLI::UI::SpinGroup
5
9
  end
6
10
 
@@ -24,6 +28,17 @@ class KuberKit::UI::Interactive
24
28
 
25
29
  def print_warning(title, text)
26
30
  print_in_frame(title, text, color: :yellow)
31
+ logger.debug(text)
32
+ end
33
+
34
+ def print_debug(title, text)
35
+ logger.debug(text)
36
+ end
37
+
38
+ def print_result(message, data = {})
39
+ print_debug("Result", "---------------------------")
40
+ print_debug("Result", message)
41
+ print_debug("Result", "---------------------------")
27
42
  end
28
43
 
29
44
  def prompt(text, options, &callback)
@@ -1,19 +1,33 @@
1
1
  class KuberKit::UI::Simple
2
+ include KuberKit::Import[
3
+ "tools.logger",
4
+ ]
5
+
2
6
  class Task
3
7
  def initialize(title, &callback)
4
8
  @title = title
5
9
  @callback = callback
6
10
  end
7
11
 
12
+ def print_started
13
+ puts "- #{@title}"
14
+ end
15
+
16
+ def print_finished
17
+ puts "- #{@title.grey}"
18
+ end
19
+
8
20
  def execute
9
21
  if @thread
10
22
  raise "Already started execution of task '#{title}'"
11
23
  end
12
24
 
13
25
  @thread = Thread.new do
14
- puts "Start task: #{@title.green}"
26
+ Thread.current.abort_on_exception = true
27
+ Thread.current.report_on_exception = false
28
+ print_started
15
29
  @callback.call(self)
16
- puts "Finish task: #{@title.green}"
30
+ print_finished
17
31
  end
18
32
  end
19
33
 
@@ -30,8 +44,12 @@ class KuberKit::UI::Simple
30
44
  end
31
45
 
32
46
  class TaskGroup
47
+ def initialize(task_class)
48
+ @task_class = task_class
49
+ end
50
+
33
51
  def add(task_title, &task_block)
34
- task = Task.new(task_title, &task_block)
52
+ task = @task_class.new(task_title, &task_block)
35
53
  task.execute
36
54
  add_task(task)
37
55
  end
@@ -47,7 +65,7 @@ class KuberKit::UI::Simple
47
65
  end
48
66
 
49
67
  def create_task_group
50
- TaskGroup.new
68
+ TaskGroup.new(KuberKit::UI::Simple::Task)
51
69
  end
52
70
 
53
71
  def create_task(title, &block)
@@ -66,6 +84,17 @@ class KuberKit::UI::Simple
66
84
 
67
85
  def print_warning(title, text)
68
86
  print_text(title, text, color: String::Colors::YELLOW)
87
+ logger.debug(text)
88
+ end
89
+
90
+ def print_debug(title, text)
91
+ logger.debug(text)
92
+ end
93
+
94
+ def print_result(message, data = {})
95
+ print_debug("Result", "---------------------------")
96
+ print_debug("Result", message)
97
+ print_debug("Result", "---------------------------")
69
98
  end
70
99
 
71
100
  def prompt(text, options, &callback)
@@ -75,7 +104,7 @@ class KuberKit::UI::Simple
75
104
  result
76
105
  end
77
106
 
78
- private
107
+ protected
79
108
  def print_text(title, text, color:)
80
109
  puts "#{title.colorize(color)}\r\n #{text.colorize(color)}"
81
110
  end
@@ -1,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.3.7"
2
+ VERSION = "0.4.0"
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.7
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iskander Khaziev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-07 00:00:00.000000000 Z
11
+ date: 2021-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts-lite
@@ -145,6 +145,7 @@ executables:
145
145
  extensions: []
146
146
  extra_rdoc_files: []
147
147
  files:
148
+ - ".github/workflows/rspec.yml"
148
149
  - ".gitignore"
149
150
  - ".rspec"
150
151
  - ".ruby-gemset"
@@ -182,6 +183,7 @@ files:
182
183
  - example/infrastructure/registries.rb
183
184
  - example/infrastructure/templates.rb
184
185
  - example/services/compose_app.rb
186
+ - example/services/docker_app.rb
185
187
  - example/services/env_file.rb
186
188
  - example/services/ruby_app.rb
187
189
  - kuber_kit.gemspec
@@ -286,6 +288,8 @@ files:
286
288
  - lib/kuber_kit/tools/file_presence_checker.rb
287
289
  - lib/kuber_kit/tools/logger_factory.rb
288
290
  - lib/kuber_kit/ui.rb
291
+ - lib/kuber_kit/ui/api.rb
292
+ - lib/kuber_kit/ui/debug.rb
289
293
  - lib/kuber_kit/ui/interactive.rb
290
294
  - lib/kuber_kit/ui/simple.rb
291
295
  - lib/kuber_kit/version.rb