kuber_kit 0.7.0 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d5c29f15c515fba96ece8e78533644f3a43a1d2549302599f745c676dedd47c5
4
- data.tar.gz: dccbbc6c69d0cdfbb27dfb3f9ded0bdd1efb3609f1b8ba5fe1580d4cf65ed42b
3
+ metadata.gz: 7d37959e170cf0ae0f88daa765fed03f52d3df930a05f8130fccbd2d6b68468d
4
+ data.tar.gz: 89610ec982168e4bad20d1688b792d60f95174e9a3d8d420bc7a257db6889b86
5
5
  SHA512:
6
- metadata.gz: 110f8df5c9fa5767ee82ce03b5e482b96ba43f0394a7cc8349888df086adb663a68858fe49154c83913fc7a8be935a0494e84cf617a332f69e4553edc234024c
7
- data.tar.gz: c1800c82bb31e7b17d12b033317ebffa554eee238c66d10141603ad42817ceb314cfd12cf01b4ccc010f701e9a3424a72ed10f2ed2611c7339e9a83d5ae45821
6
+ metadata.gz: f6d6dbe6c69bb428b7b528bcfed76d1619abd1b8253bd2a2c069a657e487db6444cdfa65a6ec8e896bb691b688dcb4a5dfcd1a024bf657c29ad77b0eb40b5cc5
7
+ data.tar.gz: 758e908ce338e9effb8d9e1740e200ee69b64b22154436c6548635eca3ffcd39c1ee634c94850741cecb629558a875055afc85434ba45adeccecc29e209a8f3e
data/CHANGELOG.md CHANGED
@@ -1,4 +1,12 @@
1
- **0.7.0**
1
+ **0.8.2**
2
+ - Update Kit Env command to support kubeconfig path as artifact
3
+
4
+ **0.8.1**
5
+ - Allow deploying services without dependecies
6
+ - Default services should be first in the list
7
+ - KubeConfig should be able to take file from artifact
8
+
9
+ **0.7.1**
2
10
  - Added Ruby 3.0 support
3
11
 
4
12
  **0.6.4**
data/README.md CHANGED
@@ -12,6 +12,29 @@ Add this line to your application's Gemfile:
12
12
  gem 'kuber_kit'
13
13
  ```
14
14
 
15
+ ## Usage
16
+
17
+ ### Available commands
18
+
19
+ * `kit apply FILE_PATH` - Apply FILE_PATH with kubectl. Doesn't guarantee service restart. E.g. `kit apply -C community ~/.kuber_kit/services/main_app_sidekiq.yml`.
20
+ * `kit attach` - Attach to POD_NAME. E.g. `kit attach -C community main-app-sidekiq-797646db88-7s4g7`
21
+ * `kit compile IMAGE_NAMES` - Compile image with IMAGE_NAMES (comma-separated), and pushes to registry. Does not launch service. E.g. `kit compile -C community main_app_sidekiq`
22
+ * `kit console POD_NAME` - Attach to POD_NAME & launch bin/console. E.g. `kit console -C community main-app-sidekiq-797646db88-7s4g7`
23
+ * `kit deploy` - Deploy all services
24
+ * `kit env ENV_FILE_NAME` - Return content of Env File ENV_FILE_NAME, where ENV_FILE_NAME artifact added by `KuberKit.add_env_file` in config files. E.g. `kit env -C community env_rke_community`
25
+ * `kit help [COMMAND]` - Describe available commands or one specific command
26
+ * `kit logs POD_NAME` - Show logs for POD_NAME. E.g. `kit logs -C community main-app-sidekiq-797646db88-7s4g7`
27
+ * `kit service SERVICE_NAME` - Return content of Service. E.g. `kit service -C community main_app_sidekiq`
28
+ * `kit template TEMPLATE_NAME` - Return content of Template. E.g. `kit template -C community web_app`
29
+ * `kit version` - Print current version
30
+
31
+ ### Deploy Specific services
32
+
33
+ * `kit deploy -t blogging` - Deploy all services with tag blogging
34
+ * `kit deploy -s blogging_app` - Deploy service with name blogging_app
35
+ * `kit deploy -s *_app` - Deploy all services with name ending `_app`
36
+ * `kit deploy -t blogging -s ^*_app` - Deploy all services with tag blogging, except ones ending with `_app`
37
+
15
38
  ## Development
16
39
 
17
40
  ### Launch compilation
data/kuber_kit.gemspec CHANGED
@@ -23,13 +23,13 @@ Gem::Specification.new do |spec|
23
23
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ["lib"]
25
25
 
26
- if RUBY_VERSION >= '3.0.0'
26
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0')
27
27
  spec.add_dependency "contracts", '0.17.0'
28
28
  else
29
29
  spec.add_dependency "contracts", '0.16.0'
30
30
  end
31
31
 
32
- if RUBY_VERSION >= '2.6.0'
32
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.6.0')
33
33
  spec.add_dependency "dry-auto_inject", "~> 0.8.0"
34
34
  else
35
35
  spec.add_dependency "dry-auto_inject", "~> 0.7.0"
@@ -40,6 +40,7 @@ Gem::Specification.new do |spec|
40
40
  spec.add_dependency "net-ssh"
41
41
  spec.add_dependency "tty-prompt"
42
42
  spec.add_dependency "dry-container", "~> 0.7.2"
43
+ spec.add_dependency "dry-configurable", "~> 0.12.1"
43
44
 
44
45
  spec.add_development_dependency "bundler", "~> 2.2"
45
46
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,5 +1,6 @@
1
1
  class KuberKit::Actions::KubectlEnv
2
2
  include KuberKit::Import[
3
+ "core.artifact_path_resolver",
3
4
  "shell.local_shell",
4
5
  "ui"
5
6
  ]
@@ -8,6 +9,11 @@ class KuberKit::Actions::KubectlEnv
8
9
  def call(options)
9
10
  configuration = KuberKit.current_configuration
10
11
  kubeconfig_path = configuration.kubeconfig_path
12
+
13
+ if kubeconfig_path.is_a?(KuberKit::Core::ArtifactPath)
14
+ kubeconfig_path = artifact_path_resolver.call(kubeconfig_path)
15
+ end
16
+
11
17
  ui.print_info("ENV", "export KUBECONFIG=#{kubeconfig_path}")
12
18
 
13
19
  true
@@ -17,9 +17,10 @@ class KuberKit::Actions::ServiceDeployer
17
17
  tags: Maybe[ArrayOf[String]],
18
18
  skip_services: Maybe[ArrayOf[String]],
19
19
  skip_compile: Maybe[Bool],
20
+ skip_dependencies: Maybe[Bool],
20
21
  require_confirmation: Maybe[Bool],
21
22
  ] => Any
22
- def call(services:, tags:, skip_services: nil, skip_compile: false, require_confirmation: false)
23
+ def call(services:, tags:, skip_services: nil, skip_compile: false, skip_dependencies: false, require_confirmation: false)
23
24
  deployment_result = KuberKit::Actions::ActionResult.new()
24
25
  current_configuration = KuberKit.current_configuration
25
26
 
@@ -30,7 +31,6 @@ class KuberKit::Actions::ServiceDeployer
30
31
  default_services = current_configuration.default_services.map(&:to_s)
31
32
  disabled_services = current_configuration.disabled_services.map(&:to_s)
32
33
  disabled_services += skip_services if skip_services
33
-
34
34
 
35
35
  service_names = service_list_resolver.resolve(
36
36
  services: services || [],
@@ -41,7 +41,11 @@ class KuberKit::Actions::ServiceDeployer
41
41
  ).map(&:to_sym)
42
42
 
43
43
  # Return the list of services with all dependencies.
44
- all_service_names = service_dependency_resolver.get_all(service_names)
44
+ if skip_dependencies
45
+ all_service_names = service_names
46
+ else
47
+ all_service_names = service_dependency_resolver.get_all(service_names)
48
+ end
45
49
 
46
50
  unless all_service_names.any?
47
51
  ui.print_warning "ServiceDeployer", "No service found with given options, nothing will be deployed."
@@ -60,11 +64,21 @@ class KuberKit::Actions::ServiceDeployer
60
64
  return false unless compilation_result && compilation_result.succeeded?
61
65
  end
62
66
 
63
- service_dependency_resolver.each_with_deps(service_names) do |dep_service_names|
64
- ui.print_debug("ServiceDeployer", "Scheduling to compile: #{dep_service_names.inspect}. Limit: #{configs.deploy_simultaneous_limit}")
67
+ if skip_dependencies
68
+ service_names.each_slice(configs.deploy_simultaneous_limit) do |batch_service_names|
69
+ ui.print_debug("ServiceDeployer", "Scheduling to compile: #{batch_service_names.inspect}. Limit: #{configs.deploy_simultaneous_limit}")
70
+
71
+ if deployment_result.succeeded?
72
+ deploy_simultaneously(batch_service_names, deployment_result)
73
+ end
74
+ end
75
+ else
76
+ service_dependency_resolver.each_with_deps(service_names) do |dep_service_names|
77
+ ui.print_debug("ServiceDeployer", "Scheduling to compile: #{dep_service_names.inspect}. Limit: #{configs.deploy_simultaneous_limit}")
65
78
 
66
- if deployment_result.succeeded?
67
- deploy_simultaneously(dep_service_names, deployment_result)
79
+ if deployment_result.succeeded?
80
+ deploy_simultaneously(dep_service_names, deployment_result)
81
+ end
68
82
  end
69
83
  end
70
84
 
@@ -2,9 +2,6 @@ class KuberKit::ArtifactsSync::ArtifactUpdater
2
2
  ResolverNotFoundError = Class.new(KuberKit::NotFoundError)
3
3
 
4
4
  include KuberKit::Import[
5
- "artifacts_sync.git_artifact_resolver",
6
- "artifacts_sync.null_artifact_resolver",
7
-
8
5
  "ui"
9
6
  ]
10
7
 
@@ -19,8 +16,6 @@ class KuberKit::ArtifactsSync::ArtifactUpdater
19
16
  end
20
17
 
21
18
  def update(shell, artifact)
22
- add_default_resolvers
23
-
24
19
  resolver = @@resolvers[artifact.class]
25
20
 
26
21
  ui.print_debug "ArtifactUpdater", "Updating artifact #{artifact.name.to_s.green}"
@@ -29,13 +24,4 @@ class KuberKit::ArtifactsSync::ArtifactUpdater
29
24
 
30
25
  resolver.resolve(shell, artifact)
31
26
  end
32
-
33
- def add_default_resolvers
34
- use_resolver(git_artifact_resolver, artifact_class: KuberKit::Core::Artifacts::Git)
35
- use_resolver(null_artifact_resolver, artifact_class: KuberKit::Core::Artifacts::Local)
36
- end
37
-
38
- def reset!
39
- @@resolvers = {}
40
- end
41
27
  end
data/lib/kuber_kit/cli.rb CHANGED
@@ -39,6 +39,7 @@ class KuberKit::CLI < Thor
39
39
  method_option :tags, :type => :array, aliases: ["-t"], repeatable: true
40
40
  method_option :skip_services, :type => :array, aliases: ["-S"], repeatable: true
41
41
  method_option :skip_compile, :type => :boolean, aliases: ["-B"]
42
+ method_option :skip_dependencies, :type => :boolean, aliases: ["-D"]
42
43
  method_option :require_confirmation, :type => :boolean, aliases: ["-r"]
43
44
  def deploy
44
45
  setup(options)
@@ -53,6 +54,7 @@ class KuberKit::CLI < Thor
53
54
  tags: (options[:tags] || []).flatten.uniq,
54
55
  skip_services: (options[:skip_services] || []).flatten.uniq,
55
56
  skip_compile: options[:skip_compile] || false,
57
+ skip_dependencies: options[:skip_dependencies] || false,
56
58
  require_confirmation: require_confirmation
57
59
  )
58
60
  end
@@ -61,6 +61,10 @@ class KuberKit::Container
61
61
  KuberKit::Configs.new
62
62
  end
63
63
 
64
+ register "core.artifact_path_resolver" do
65
+ KuberKit::Core::ArtifactPathResolver.new
66
+ end
67
+
64
68
  register "core.image_factory" do
65
69
  KuberKit::Core::ImageFactory.new
66
70
  end
@@ -0,0 +1,8 @@
1
+ class KuberKit::Core::ArtifactPath
2
+ attr_reader :artifact_name, :file_path
3
+
4
+ def initialize(artifact_name:, file_path:)
5
+ @artifact_name = artifact_name
6
+ @file_path = file_path
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ class KuberKit::Core::ArtifactPathResolver < KuberKit::EnvFileReader::Strategies::Abstract
2
+ include KuberKit::Import[
3
+ "core.artifact_store"
4
+ ]
5
+
6
+ Contract KuberKit::Core::ArtifactPath => String
7
+ def call(artifact_path)
8
+ artifact = artifact_store.get(artifact_path.artifact_name)
9
+
10
+ file_parts = [artifact.cloned_path, artifact_path.file_path].compact
11
+ File.join(*file_parts)
12
+ end
13
+ end
@@ -10,7 +10,7 @@ class KuberKit::Core::Configuration
10
10
  registries: Hash,
11
11
  env_files: Hash,
12
12
  templates: Hash,
13
- kubeconfig_path: Maybe[String],
13
+ kubeconfig_path: Maybe[Or[String, KuberKit::Core::ArtifactPath]],
14
14
  services_attributes: HashOf[Symbol => Hash],
15
15
  enabled_services: ArrayOf[Symbol],
16
16
  disabled_services: ArrayOf[Symbol],
@@ -0,0 +1,32 @@
1
+ class KuberKit::Defaults
2
+ class << self
3
+ def init
4
+ return if @_initialized
5
+ @_initialized = true
6
+ init!
7
+ end
8
+
9
+ def init!
10
+ KuberKit::Container["artifacts_sync.artifact_updater"].use_resolver(
11
+ KuberKit::Container["artifacts_sync.git_artifact_resolver"],
12
+ artifact_class: KuberKit::Core::Artifacts::Git
13
+ )
14
+ KuberKit::Container["artifacts_sync.artifact_updater"].use_resolver(
15
+ KuberKit::Container["artifacts_sync.null_artifact_resolver"],
16
+ artifact_class: KuberKit::Core::Artifacts::Local
17
+ )
18
+ KuberKit::Container["env_file_reader.reader"].use_reader(
19
+ KuberKit::Container["env_file_reader.strategies.artifact_file"],
20
+ env_file_class: KuberKit::Core::EnvFiles::ArtifactFile
21
+ )
22
+ KuberKit::Container["env_file_reader.reader"].use_reader(
23
+ KuberKit::Container["env_file_reader.strategies.env_group"],
24
+ env_file_class: KuberKit::Core::EnvFiles::EnvGroup
25
+ )
26
+ KuberKit::Container["template_reader.reader"].use_reader(
27
+ KuberKit::Container["template_reader.strategies.artifact_file"],
28
+ template_class: KuberKit::Core::Templates::ArtifactFile
29
+ )
30
+ end
31
+ end
32
+ end
@@ -1,16 +1,6 @@
1
1
  class KuberKit::EnvFileReader::Reader
2
2
  ReaderNotFoundError = Class.new(KuberKit::NotFoundError)
3
-
4
- include KuberKit::Import[
5
- "env_file_reader.strategies.artifact_file",
6
- "env_file_reader.strategies.env_group",
7
- ]
8
-
9
- def initialize(**injected_deps, &block)
10
- super(**injected_deps)
11
- add_default_strategies
12
- end
13
-
3
+
14
4
  def use_reader(env_file_reader, env_file_class:)
15
5
  @@readers ||= {}
16
6
 
@@ -28,14 +18,4 @@ class KuberKit::EnvFileReader::Reader
28
18
 
29
19
  reader.read(shell, env_file)
30
20
  end
31
-
32
- def reset!
33
- @@readers = {}
34
- end
35
-
36
- private
37
- def add_default_strategies
38
- use_reader(artifact_file, env_file_class: KuberKit::Core::EnvFiles::ArtifactFile)
39
- use_reader(env_group, env_file_class: KuberKit::Core::EnvFiles::EnvGroup)
40
- end
41
21
  end
@@ -43,7 +43,7 @@ class KuberKit::ServiceDeployer::ServiceListResolver
43
43
  end
44
44
 
45
45
  if included_services.any?
46
- included_services += default_services
46
+ included_services = default_services + included_services
47
47
  end
48
48
 
49
49
  included_services
@@ -2,9 +2,24 @@ require 'json'
2
2
  require 'shellwords'
3
3
 
4
4
  class KuberKit::Shell::Commands::KubectlCommands
5
+ include KuberKit::Import[
6
+ "core.artifact_path_resolver"
7
+ ]
8
+
9
+ Contract KuberKit::Shell::AbstractShell, Or[String, ArrayOf[String]], KeywordArgs[
10
+ kubeconfig_path: Maybe[Or[
11
+ String, KuberKit::Core::ArtifactPath
12
+ ]],
13
+ namespace: Maybe[String],
14
+ interactive: Optional[Bool],
15
+ ] => Any
5
16
  def kubectl_run(shell, command_list, kubeconfig_path: nil, namespace: nil, interactive: false)
6
17
  command_parts = []
18
+
7
19
  if kubeconfig_path
20
+ if kubeconfig_path.is_a?(KuberKit::Core::ArtifactPath)
21
+ kubeconfig_path = artifact_path_resolver.call(kubeconfig_path)
22
+ end
8
23
  command_parts << "KUBECONFIG=#{kubeconfig_path}"
9
24
  end
10
25
 
@@ -41,11 +56,11 @@ class KuberKit::Shell::Commands::KubectlCommands
41
56
  end
42
57
 
43
58
  def logs(shell, pod_name, args: nil, kubeconfig_path: nil, namespace: nil)
44
- kubectl_run(shell, ["logs", args, pod_name], kubeconfig_path: kubeconfig_path, interactive: true, namespace: namespace)
59
+ kubectl_run(shell, ["logs", args, pod_name].compact, kubeconfig_path: kubeconfig_path, interactive: true, namespace: namespace)
45
60
  end
46
61
 
47
62
  def describe(shell, resource_name, args: nil, kubeconfig_path: nil, namespace: nil)
48
- kubectl_run(shell, ["describe", args, resource_name], kubeconfig_path: kubeconfig_path, interactive: true, namespace: namespace)
63
+ kubectl_run(shell, ["describe", args, resource_name].compact, kubeconfig_path: kubeconfig_path, interactive: true, namespace: namespace)
49
64
  end
50
65
 
51
66
  def get_resources(shell, resource_type, field_selector: nil, jsonpath: ".items[*].metadata.name", kubeconfig_path: nil, namespace: nil)
@@ -1,15 +1,6 @@
1
1
  class KuberKit::TemplateReader::Reader
2
2
  ReaderNotFoundError = Class.new(KuberKit::NotFoundError)
3
3
 
4
- include KuberKit::Import[
5
- "template_reader.strategies.artifact_file",
6
- ]
7
-
8
- def initialize(**injected_deps, &block)
9
- super(**injected_deps)
10
- add_default_strategies
11
- end
12
-
13
4
  def use_reader(template_reader, template_class:)
14
5
  @@readers ||= {}
15
6
 
@@ -27,13 +18,4 @@ class KuberKit::TemplateReader::Reader
27
18
 
28
19
  reader.read(shell, template)
29
20
  end
30
-
31
- def reset!
32
- @@readers = {}
33
- end
34
-
35
- private
36
- def add_default_strategies
37
- use_reader(artifact_file, template_class: KuberKit::Core::Templates::ArtifactFile)
38
- end
39
21
  end
@@ -1,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.2"
3
3
  end
data/lib/kuber_kit.rb CHANGED
@@ -13,6 +13,9 @@ module KuberKit
13
13
  NotFoundError = Class.new(Error)
14
14
 
15
15
  module Core
16
+ autoload :ArtifactPath, 'core/artifact_path'
17
+ autoload :ArtifactPathResolver, 'core/artifact_path_resolver'
18
+
16
19
  autoload :ImageDefinition, 'core/image_definition'
17
20
  autoload :ImageDefinitionFactory, 'core/image_definition_factory'
18
21
  autoload :ImageStore, 'core/image_store'
@@ -208,6 +211,7 @@ module KuberKit
208
211
  autoload :CLI, 'cli'
209
212
  autoload :Container, 'container'
210
213
  autoload :Configs, 'configs'
214
+ autoload :Defaults, 'defaults'
211
215
 
212
216
  Import = Dry::AutoInject(Container)
213
217
 
@@ -297,4 +301,6 @@ module KuberKit
297
301
  end
298
302
  end
299
303
 
304
+ KuberKit::Defaults.init
305
+
300
306
  require 'kuber_kit/extensions/indocker_compat'
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.7.0
4
+ version: 0.8.2
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-08-28 00:00:00.000000000 Z
11
+ date: 2022-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.7.2
111
+ - !ruby/object:Gem::Dependency
112
+ name: dry-configurable
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.12.1
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.12.1
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: bundler
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -241,6 +255,8 @@ files:
241
255
  - lib/kuber_kit/cli.rb
242
256
  - lib/kuber_kit/configs.rb
243
257
  - lib/kuber_kit/container.rb
258
+ - lib/kuber_kit/core/artifact_path.rb
259
+ - lib/kuber_kit/core/artifact_path_resolver.rb
244
260
  - lib/kuber_kit/core/artifacts/abstract_artifact.rb
245
261
  - lib/kuber_kit/core/artifacts/artifact_store.rb
246
262
  - lib/kuber_kit/core/artifacts/git.rb
@@ -280,6 +296,7 @@ files:
280
296
  - lib/kuber_kit/core/templates/abstract_template.rb
281
297
  - lib/kuber_kit/core/templates/artifact_file.rb
282
298
  - lib/kuber_kit/core/templates/template_store.rb
299
+ - lib/kuber_kit/defaults.rb
283
300
  - lib/kuber_kit/env_file_reader/action_handler.rb
284
301
  - lib/kuber_kit/env_file_reader/env_file_parser.rb
285
302
  - lib/kuber_kit/env_file_reader/env_file_tempfile_creator.rb