kuber_kit 0.3.11 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/example/infrastructure/artifacts.rb +1 -1
- data/example/services/docker_app.rb +12 -0
- data/lib/kuber_kit.rb +6 -4
- data/lib/kuber_kit/actions/configuration_loader.rb +10 -10
- data/lib/kuber_kit/actions/env_file_reader.rb +1 -0
- data/lib/kuber_kit/actions/image_compiler.rb +10 -6
- data/lib/kuber_kit/actions/service_deployer.rb +10 -7
- data/lib/kuber_kit/actions/template_reader.rb +1 -0
- data/lib/kuber_kit/artifacts_sync/artifacts_updater.rb +3 -2
- data/lib/kuber_kit/cli.rb +14 -15
- data/lib/kuber_kit/container.rb +5 -1
- data/lib/kuber_kit/core/configuration_store.rb +2 -2
- data/lib/kuber_kit/core/image_store.rb +2 -2
- data/lib/kuber_kit/core/service_store.rb +2 -2
- data/lib/kuber_kit/image_compiler/compiler.rb +3 -1
- data/lib/kuber_kit/image_compiler/image_builder.rb +9 -1
- data/lib/kuber_kit/service_deployer/strategies/kubernetes.rb +3 -1
- data/lib/kuber_kit/shell/commands/docker_commands.rb +7 -6
- data/lib/kuber_kit/shell/local_shell.rb +5 -5
- data/lib/kuber_kit/shell/ssh_shell.rb +4 -4
- data/lib/kuber_kit/tools/logger_factory.rb +1 -1
- data/lib/kuber_kit/ui/api.rb +48 -0
- data/lib/kuber_kit/ui/debug.rb +31 -0
- data/lib/kuber_kit/ui/interactive.rb +15 -0
- data/lib/kuber_kit/ui/simple.rb +34 -5
- data/lib/kuber_kit/version.rb +1 -1
- metadata +5 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 88b8c2ffe3973bc966b245ceba37047030243d88119fd672db31efb002c67f86
         | 
| 4 | 
            +
              data.tar.gz: 5fafd218e63a669da3951b723f7167700704902006d4dd4fef13541e8ad1559b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a1c79c0056820500948580504c533be1ba2f9ceafe282802a0bbe44021a34196706c23eb97b05e6905efc26f565719fd9a1c668ec99afdbda642261ad6e8b6e1
         | 
| 7 | 
            +
              data.tar.gz: 3e4e33cc19ff7917ee5210dcdecae40ed22cb29d93f884bdb27adf3ec8565d3397ee8715ed8e89e75ae0316a0cf9192075d5afd66ba55caf3fe4f060064c88b9
         | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/lib/kuber_kit.rb
    CHANGED
    
    | @@ -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  | 
| 209 | 
            -
                  @ | 
| 210 | 
            +
                def set_ui_mode(value)
         | 
| 211 | 
            +
                  @ui_mode = value
         | 
| 210 212 | 
             
                end
         | 
| 211 213 |  | 
| 212 | 
            -
                def  | 
| 213 | 
            -
                   | 
| 214 | 
            +
                def ui_mode
         | 
| 215 | 
            +
                  @ui_mode
         | 
| 214 216 | 
             
                end
         | 
| 215 217 |  | 
| 216 218 | 
             
                def deprecation_warnings_disabled?
         | 
| @@ -5,7 +5,6 @@ class KuberKit::Actions::ConfigurationLoader | |
| 5 5 | 
             
                "core.service_store",
         | 
| 6 6 | 
             
                "core.configuration_store",
         | 
| 7 7 | 
             
                "artifacts_sync.artifacts_updater",
         | 
| 8 | 
            -
                "tools.logger",
         | 
| 9 8 | 
             
                "shell.local_shell",
         | 
| 10 9 | 
             
                "ui",
         | 
| 11 10 | 
             
                "configs"
         | 
| @@ -20,18 +19,18 @@ class KuberKit::Actions::ConfigurationLoader | |
| 20 19 | 
             
                configurations_path  = options[:configurations_path]  || File.join(root_path, configs.configurations_dirname)
         | 
| 21 20 | 
             
                configuration_name   = ENV["KUBER_KIT_CONFIGURATION"] || options[:configuration]
         | 
| 22 21 |  | 
| 23 | 
            -
                 | 
| 24 | 
            -
                 | 
| 25 | 
            -
                 | 
| 26 | 
            -
                 | 
| 27 | 
            -
                 | 
| 28 | 
            -
                 | 
| 29 | 
            -
                 | 
| 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}"
         | 
| 30 29 |  | 
| 31 30 | 
             
                ui.print_info("Logs", "See logs at: #{configs.log_file_path}")
         | 
| 32 31 |  | 
| 33 32 | 
             
                unless File.exists?(root_path)
         | 
| 34 | 
            -
                  ui.print_warning " | 
| 33 | 
            +
                  ui.print_warning "ConfigurationLoader", "KuberKit root path #{root_path} doesn't exist. You may want to pass it --path parameter."
         | 
| 35 34 | 
             
                end
         | 
| 36 35 |  | 
| 37 36 | 
             
                if Gem::Version.new(KuberKit::VERSION) < Gem::Version.new(configs.kuber_kit_min_version)
         | 
| @@ -65,6 +64,7 @@ class KuberKit::Actions::ConfigurationLoader | |
| 65 64 | 
             
                true
         | 
| 66 65 | 
             
              rescue KuberKit::Error => e
         | 
| 67 66 | 
             
                ui.print_error("Error", e.message)
         | 
| 67 | 
            +
                
         | 
| 68 68 | 
             
                false
         | 
| 69 69 | 
             
              end
         | 
| 70 70 |  | 
| @@ -97,6 +97,6 @@ class KuberKit::Actions::ConfigurationLoader | |
| 97 97 | 
             
                  require(path)
         | 
| 98 98 | 
             
                end
         | 
| 99 99 | 
             
              rescue KuberKit::Shell::AbstractShell::DirNotFoundError
         | 
| 100 | 
            -
                 | 
| 100 | 
            +
                ui.print_warning("ConfigurationLoader", "Directory with infrastructure not found: #{infra_path}")
         | 
| 101 101 | 
             
              end
         | 
| 102 102 | 
             
            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 | 
            -
                   | 
| 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 | 
            -
                 | 
| 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 | 
            -
                     | 
| 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 | 
            -
                       | 
| 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 " | 
| 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 | 
            -
                 | 
| 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 | 
            -
                   | 
| 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 | 
            -
                     | 
| 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)
         | 
| @@ -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 | 
            -
             | 
| 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 | 
            -
                   | 
| 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 |  | 
    
        data/lib/kuber_kit/cli.rb
    CHANGED
    
    | @@ -7,6 +7,7 @@ class KuberKit::CLI < Thor | |
| 7 7 | 
             
              class_option :images_path, :type => :string
         | 
| 8 8 | 
             
              class_option :infra_path, :type => :string
         | 
| 9 9 | 
             
              class_option :configurations_path, :type => :string
         | 
| 10 | 
            +
              class_option :ui, :type => :string, :desc => "UI mode (interactive|debug|simple)"
         | 
| 10 11 | 
             
              class_option :debug, :type => :boolean, aliases: ["-d"]
         | 
| 11 12 | 
             
              class_option :configuration, :type => :string, aliases: ["-C"]
         | 
| 12 13 |  | 
| @@ -20,15 +21,10 @@ class KuberKit::CLI < Thor | |
| 20 21 | 
             
                  result = KuberKit::Container['actions.image_compiler'].call(image_names, options)
         | 
| 21 22 | 
             
                end
         | 
| 22 23 |  | 
| 23 | 
            -
                logger = KuberKit::Container['tools.logger']
         | 
| 24 24 | 
             
                if result
         | 
| 25 | 
            -
                   | 
| 26 | 
            -
                  logger.info("Image compilation finished!")
         | 
| 27 | 
            -
                  logger.info("---------------------------")
         | 
| 25 | 
            +
                  print_result("Image compilation finished!", result: result)
         | 
| 28 26 | 
             
                else
         | 
| 29 | 
            -
                   | 
| 30 | 
            -
                  logger.info("Image compilation failed!".red)
         | 
| 31 | 
            -
                  logger.info("-------------------------".red)
         | 
| 27 | 
            +
                  exit 1
         | 
| 32 28 | 
             
                end
         | 
| 33 29 | 
             
              end
         | 
| 34 30 |  | 
| @@ -47,15 +43,10 @@ class KuberKit::CLI < Thor | |
| 47 43 | 
             
                  )
         | 
| 48 44 | 
             
                end
         | 
| 49 45 |  | 
| 50 | 
            -
                logger = KuberKit::Container['tools.logger']
         | 
| 51 46 | 
             
                if result
         | 
| 52 | 
            -
                   | 
| 53 | 
            -
                  logger.info("Service deployment finished!")
         | 
| 54 | 
            -
                  logger.info("---------------------------")
         | 
| 47 | 
            +
                  print_result("Service deployment finished!", result: result)
         | 
| 55 48 | 
             
                else
         | 
| 56 | 
            -
                   | 
| 57 | 
            -
                  logger.info("Service deployment failed!".red)
         | 
| 58 | 
            -
                  logger.info("-------------------------".red)
         | 
| 49 | 
            +
                  exit 1
         | 
| 59 50 | 
             
                end
         | 
| 60 51 | 
             
              end
         | 
| 61 52 |  | 
| @@ -134,7 +125,11 @@ class KuberKit::CLI < Thor | |
| 134 125 |  | 
| 135 126 | 
             
              private
         | 
| 136 127 | 
             
                def setup(options)
         | 
| 137 | 
            -
                   | 
| 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
         | 
| 138 133 |  | 
| 139 134 | 
             
                  # We should load config before loading any bean, to make sure that bean won't be built with default config
         | 
| 140 135 | 
             
                  root_path     = options[:path] || File.join(Dir.pwd, KuberKit::Container['configs'].kuber_kit_dirname)
         | 
| @@ -143,4 +138,8 @@ class KuberKit::CLI < Thor | |
| 143 138 | 
             
                    require config_file_path
         | 
| 144 139 | 
             
                  end
         | 
| 145 140 | 
             
                end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                def print_result(message, data = {})
         | 
| 143 | 
            +
                  KuberKit::Container['ui'].print_result(message, data)
         | 
| 144 | 
            +
                end
         | 
| 146 145 | 
             
            end
         | 
    
        data/lib/kuber_kit/container.rb
    CHANGED
    
    | @@ -258,8 +258,12 @@ class KuberKit::Container | |
| 258 258 | 
             
              end
         | 
| 259 259 |  | 
| 260 260 | 
             
              register "ui" do
         | 
| 261 | 
            -
                if KuberKit. | 
| 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 | 
            -
                " | 
| 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 | 
            -
                 | 
| 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 | 
            -
                " | 
| 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 | 
            -
                 | 
| 36 | 
            +
                ui.print_warning("ImageStore", "Directory with images not found: #{dir_path}")
         | 
| 37 37 | 
             
                []
         | 
| 38 38 | 
             
              end
         | 
| 39 39 |  | 
| @@ -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 | 
            -
                " | 
| 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 | 
            -
                 | 
| 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 | 
            -
                 | 
| 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
         | 
| @@ -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
         | 
| @@ -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)
         | 
| @@ -29,8 +29,8 @@ class KuberKit::Shell::Commands::DockerCommands | |
| 29 29 | 
             
                end
         | 
| 30 30 | 
             
              end
         | 
| 31 31 |  | 
| 32 | 
            -
              def container_exists?(shell, container_name)
         | 
| 33 | 
            -
                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)
         | 
| 34 34 | 
             
                result && result != ""
         | 
| 35 35 | 
             
              end
         | 
| 36 36 |  | 
| @@ -38,15 +38,16 @@ class KuberKit::Shell::Commands::DockerCommands | |
| 38 38 | 
             
                shell.exec!(%Q{docker rm -f #{container_name}})
         | 
| 39 39 | 
             
              end
         | 
| 40 40 |  | 
| 41 | 
            -
              def get_container_id(shell, container_name, only_healthy: false, status:  | 
| 41 | 
            +
              def get_container_id(shell, container_name, only_healthy: false, status: nil)
         | 
| 42 42 | 
             
                command_parts = []
         | 
| 43 43 | 
             
                command_parts << "docker ps -a -q"
         | 
| 44 44 |  | 
| 45 45 | 
             
                if only_healthy
         | 
| 46 46 | 
             
                  command_parts << "--filter=\"health=healthy\""
         | 
| 47 47 | 
             
                end
         | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 48 | 
            +
                if status
         | 
| 49 | 
            +
                  command_parts << "--filter=\"status=#{status}\""
         | 
| 50 | 
            +
                end
         | 
| 50 51 | 
             
                command_parts << "--filter=\"name=#{container_name}\""
         | 
| 51 52 |  | 
| 52 53 | 
             
                shell.exec!(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 | 
            -
                   | 
| 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 | 
            -
                   | 
| 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 | 
            -
                   | 
| 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 | 
            -
                 | 
| 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
         | 
| @@ -2,7 +2,7 @@ require 'tempfile' | |
| 2 2 |  | 
| 3 3 | 
             
            class KuberKit::Shell::SshShell < KuberKit::Shell::LocalShell
         | 
| 4 4 | 
             
              include KuberKit::Import[
         | 
| 5 | 
            -
                " | 
| 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 | 
            -
                   | 
| 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 | 
            -
                   | 
| 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 | 
            -
                 | 
| 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
         | 
| @@ -26,7 +26,7 @@ class KuberKit::Tools::LoggerFactory | |
| 26 26 | 
             
                  severity_text  = severity.to_s
         | 
| 27 27 | 
             
                  severity_text  = severity_text.colorize(severity_color) if severity_color
         | 
| 28 28 |  | 
| 29 | 
            -
                  if level == Logger:: | 
| 29 | 
            +
                  if level == Logger::DEBUG
         | 
| 30 30 | 
             
                    "#{datetime.strftime("%Y/%m/%d %H:%M:%S").grey} #{msg}\n"
         | 
| 31 31 | 
             
                  else
         | 
| 32 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)
         | 
    
        data/lib/kuber_kit/ui/simple.rb
    CHANGED
    
    | @@ -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 | 
            -
                     | 
| 26 | 
            +
                    Thread.current.abort_on_exception = true
         | 
| 27 | 
            +
                    Thread.current.report_on_exception = false
         | 
| 28 | 
            +
                    print_started
         | 
| 15 29 | 
             
                    @callback.call(self)
         | 
| 16 | 
            -
                     | 
| 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 =  | 
| 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 | 
            -
               | 
| 107 | 
            +
              protected
         | 
| 79 108 | 
             
                def print_text(title, text, color:)
         | 
| 80 109 | 
             
                  puts "#{title.colorize(color)}\r\n #{text.colorize(color)}"
         | 
| 81 110 | 
             
                end
         | 
    
        data/lib/kuber_kit/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: kuber_kit
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              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- | 
| 11 | 
            +
            date: 2021-01-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: contracts-lite
         | 
| @@ -183,6 +183,7 @@ files: | |
| 183 183 | 
             
            - example/infrastructure/registries.rb
         | 
| 184 184 | 
             
            - example/infrastructure/templates.rb
         | 
| 185 185 | 
             
            - example/services/compose_app.rb
         | 
| 186 | 
            +
            - example/services/docker_app.rb
         | 
| 186 187 | 
             
            - example/services/env_file.rb
         | 
| 187 188 | 
             
            - example/services/ruby_app.rb
         | 
| 188 189 | 
             
            - kuber_kit.gemspec
         | 
| @@ -287,6 +288,8 @@ files: | |
| 287 288 | 
             
            - lib/kuber_kit/tools/file_presence_checker.rb
         | 
| 288 289 | 
             
            - lib/kuber_kit/tools/logger_factory.rb
         | 
| 289 290 | 
             
            - lib/kuber_kit/ui.rb
         | 
| 291 | 
            +
            - lib/kuber_kit/ui/api.rb
         | 
| 292 | 
            +
            - lib/kuber_kit/ui/debug.rb
         | 
| 290 293 | 
             
            - lib/kuber_kit/ui/interactive.rb
         | 
| 291 294 | 
             
            - lib/kuber_kit/ui/simple.rb
         | 
| 292 295 | 
             
            - lib/kuber_kit/version.rb
         |