kuber_kit 0.2.9 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +16 -14
  3. data/TODO.md +0 -2
  4. data/bin/{console → kit_console} +0 -0
  5. data/example/app_data/docker_compose.yml +6 -0
  6. data/example/configurations/review.rb +1 -1
  7. data/example/infrastructure/build_servers.rb +5 -5
  8. data/example/infrastructure/templates.rb +5 -0
  9. data/example/services/compose_app.rb +10 -0
  10. data/example/services/env_file.rb +1 -1
  11. data/lib/kuber_kit.rb +7 -1
  12. data/lib/kuber_kit/actions/configuration_loader.rb +1 -1
  13. data/lib/kuber_kit/actions/kubectl_applier.rb +2 -2
  14. data/lib/kuber_kit/actions/kubectl_attacher.rb +2 -2
  15. data/lib/kuber_kit/cli.rb +5 -0
  16. data/lib/kuber_kit/configs.rb +4 -3
  17. data/lib/kuber_kit/container.rb +10 -2
  18. data/lib/kuber_kit/core/configuration.rb +9 -7
  19. data/lib/kuber_kit/core/configuration_definition.rb +22 -9
  20. data/lib/kuber_kit/core/configuration_factory.rb +9 -9
  21. data/lib/kuber_kit/core/context_helper/base_helper.rb +7 -0
  22. data/lib/kuber_kit/core/image.rb +3 -1
  23. data/lib/kuber_kit/core/image_definition.rb +3 -1
  24. data/lib/kuber_kit/core/service.rb +4 -4
  25. data/lib/kuber_kit/core/service_definition.rb +3 -3
  26. data/lib/kuber_kit/core/service_factory.rb +6 -6
  27. data/lib/kuber_kit/service_deployer/deployer.rb +4 -2
  28. data/lib/kuber_kit/service_deployer/strategies/docker.rb +41 -0
  29. data/lib/kuber_kit/service_deployer/strategies/docker_compose.rb +33 -0
  30. data/lib/kuber_kit/service_deployer/strategies/kubernetes.rb +34 -7
  31. data/lib/kuber_kit/service_deployer/strategy_detector.rb +1 -1
  32. data/lib/kuber_kit/shell/abstract_shell.rb +4 -0
  33. data/lib/kuber_kit/shell/commands/docker_commands.rb +33 -0
  34. data/lib/kuber_kit/shell/commands/docker_compose_commands.rb +17 -0
  35. data/lib/kuber_kit/shell/commands/kubectl_commands.rb +11 -12
  36. data/lib/kuber_kit/shell/local_shell.rb +14 -0
  37. data/lib/kuber_kit/shell/ssh_shell.rb +4 -0
  38. data/lib/kuber_kit/version.rb +1 -1
  39. metadata +9 -5
  40. data/lib/kuber_kit/service_deployer/strategies/kubernetes_runner.rb +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 050f5ef4e2ef34f21bd8d5d92593717770a82c54c40d929cdce949a9f2735171
4
- data.tar.gz: 250684c19fc240e0f243ad3c5688cd170912b26c49559569d12717a0bd1655fb
3
+ metadata.gz: e9a909cb70758ec37ce6c7aefdf42ca9f2ab211635bff12b8cc0e228ce6ba5a3
4
+ data.tar.gz: edfbf0a103ef115b5acee93d0109f6ebc3b2da32918686b78583c9bad8ba449b
5
5
  SHA512:
6
- metadata.gz: 3b80414736ee18eb858e383dde9219468b20953d98bbc61439974683b0a0287758e6a039719783ee6c132b94fa999c1e3f4eb9c6c020939313d29d100dc365c3
7
- data.tar.gz: e7a7b01fea7a033bf14755dd597ca85079d51e235855c722c5ca8ddba1b25838d70469c2ae4089aca77b48394e5aca52dbcfdb9ef0706892a61437a3eaf8e7a9
6
+ metadata.gz: 35eae928da948dbf38673608035ee34674980b9551e3a8a16e60a829db50984fa6f518d131a1914a9e6111d9189e45499ea7660da41da83ab84df1ee65006940
7
+ data.tar.gz: d85768ead64d8ea7e1516ddabad52c9349975d72ed2dbc5e31658083845dcc0d790a3283b820999c8f22bcfd0ad5c878142c0add0d29c98e32123e1ff4633130
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kuber_kit (0.2.9)
4
+ kuber_kit (0.3.4)
5
5
  cli-ui
6
6
  contracts-lite
7
7
  dry-auto_inject
@@ -26,7 +26,7 @@ GEM
26
26
  dry-container (0.7.2)
27
27
  concurrent-ruby (~> 1.0)
28
28
  dry-configurable (~> 0.1, >= 0.1.3)
29
- dry-core (0.4.10)
29
+ dry-core (0.5.0)
30
30
  concurrent-ruby (~> 1.0)
31
31
  dry-equalizer (0.3.0)
32
32
  method_source (1.0.0)
@@ -35,23 +35,25 @@ GEM
35
35
  coderay (~> 1.1)
36
36
  method_source (~> 1.0)
37
37
  rake (10.5.0)
38
- rspec (3.9.0)
39
- rspec-core (~> 3.9.0)
40
- rspec-expectations (~> 3.9.0)
41
- rspec-mocks (~> 3.9.0)
42
- rspec-core (3.9.3)
43
- rspec-support (~> 3.9.3)
44
- rspec-expectations (3.9.3)
38
+ rspec (3.10.0)
39
+ rspec-core (~> 3.10.0)
40
+ rspec-expectations (~> 3.10.0)
41
+ rspec-mocks (~> 3.10.0)
42
+ rspec-core (3.10.0)
43
+ rspec-support (~> 3.10.0)
44
+ rspec-expectations (3.10.0)
45
45
  diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.9.0)
47
- rspec-mocks (3.9.1)
46
+ rspec-support (~> 3.10.0)
47
+ rspec-mocks (3.10.0)
48
48
  diff-lcs (>= 1.2.0, < 2.0)
49
- rspec-support (~> 3.9.0)
50
- rspec-support (3.9.4)
51
- simplecov (0.19.0)
49
+ rspec-support (~> 3.10.0)
50
+ rspec-support (3.10.0)
51
+ simplecov (0.20.0)
52
52
  docile (~> 1.1)
53
53
  simplecov-html (~> 0.11)
54
+ simplecov_json_formatter (~> 0.1)
54
55
  simplecov-html (0.12.3)
56
+ simplecov_json_formatter (0.1.2)
55
57
  thor (1.0.1)
56
58
 
57
59
  PLATFORMS
data/TODO.md CHANGED
@@ -3,8 +3,6 @@
3
3
  - add kit logs support, should work similar to kit attach
4
4
  - allow deploying only services enabled for specific configuration
5
5
  - find a way to always deploy some service, e.g. for migrations and env_files
6
- - allow setting default configuration for kuberkit using env variable
7
6
  - add ability to set container health checks
8
- - implement interactive shell.exec!
9
7
  - template should be able to set default attributes
10
8
  - template should be able to depend on image?
File without changes
@@ -0,0 +1,6 @@
1
+ version: "3.3"
2
+ services:
3
+ <%= service_name %>:
4
+ container_name: <%= service_name %>
5
+ hostname: <%= service_name %>
6
+ image: <%= image_url(attribute(:image_name, default: service_name.to_sym)) %>
@@ -2,4 +2,4 @@ KuberKit
2
2
  .define_configuration(:review)
3
3
  .use_registry(:review_default, as: :default)
4
4
  .use_artifact(:kuber_kit_repo, as: :kuber_kit_repo)
5
- .use_build_server(:remote_bs)
5
+ #.use_build_server(:remote_bs)
@@ -1,8 +1,8 @@
1
1
  ENV['SSH_TEST_HOST'] ||= "indocker.artstn.ninja"
2
2
  ENV['SSH_TEST_USER'] ||= "kuber_kit"
3
3
 
4
- KuberKit.add_build_server(
5
- KuberKit::Core::BuildServers::BuildServer
6
- .new(:remote_bs)
7
- .setup(host: ENV['SSH_TEST_HOST'], user: ENV['SSH_TEST_USER'], port: 22)
8
- )
4
+ # KuberKit.add_build_server(
5
+ # KuberKit::Core::BuildServers::BuildServer
6
+ # .new(:remote_bs)
7
+ # .setup(host: ENV['SSH_TEST_HOST'], user: ENV['SSH_TEST_USER'], port: 22)
8
+ # )
@@ -6,4 +6,9 @@ KuberKit.add_template(
6
6
  KuberKit.add_template(
7
7
  KuberKit::Core::Templates::ArtifactFile
8
8
  .new(:env_file, artifact_name: :kuber_kit_example_data, file_path: "env_file.yml")
9
+ )
10
+
11
+ KuberKit.add_template(
12
+ KuberKit::Core::Templates::ArtifactFile
13
+ .new(:docker_compose, artifact_name: :kuber_kit_example_data, file_path: "docker_compose.yml")
9
14
  )
@@ -0,0 +1,10 @@
1
+ KuberKit
2
+ .define_service(:compose_app)
3
+ .template(:docker_compose)
4
+ .images(:ruby_app)
5
+ .tags(:compose)
6
+ .deployer_strategy(:docker_compose)
7
+ .attributes(
8
+ image_name: :ruby_app,
9
+ deployer_interactive: true
10
+ )
@@ -3,5 +3,5 @@ KuberKit
3
3
  .template(:env_file)
4
4
  .tags("env_file")
5
5
  .attributes(
6
- deployment_restart_enabled: false
6
+ deployer_restart_enabled: false
7
7
  )
@@ -88,6 +88,7 @@ module KuberKit
88
88
  module Commands
89
89
  autoload :BashCommands, 'shell/commands/bash_commands'
90
90
  autoload :DockerCommands, 'shell/commands/docker_commands'
91
+ autoload :DockerComposeCommands, 'shell/commands/docker_compose_commands'
91
92
  autoload :GitCommands, 'shell/commands/git_commands'
92
93
  autoload :RsyncCommands, 'shell/commands/rsync_commands'
93
94
  autoload :KubectlCommands, 'shell/commands/kubectl_commands'
@@ -145,8 +146,9 @@ module KuberKit
145
146
 
146
147
  module Strategies
147
148
  autoload :Abstract, 'service_deployer/strategies/abstract'
149
+ autoload :Docker, 'service_deployer/strategies/docker'
150
+ autoload :DockerCompose, 'service_deployer/strategies/docker_compose'
148
151
  autoload :Kubernetes, 'service_deployer/strategies/kubernetes'
149
- autoload :KubernetesRunner, 'service_deployer/strategies/kubernetes_runner'
150
152
  end
151
153
  end
152
154
 
@@ -209,6 +211,10 @@ module KuberKit
209
211
  !!@debug_mode
210
212
  end
211
213
 
214
+ def deprecation_warnings_disabled?
215
+ Container["configs"].deprecation_warnings_disabled
216
+ end
217
+
212
218
  def current_configuration
213
219
  if @configuration_name.nil?
214
220
  raise "Please set configuration name before calling current_configuration"
@@ -27,7 +27,7 @@ class KuberKit::Actions::ConfigurationLoader
27
27
  services_path = options[:services_path] || File.join(root_path, configs.services_dirname)
28
28
  infra_path = options[:infra_path] || File.join(root_path, configs.infra_dirname)
29
29
  configurations_path = options[:configurations_path] || File.join(root_path, configs.configurations_dirname)
30
- configuration_name = options[:configuration]
30
+ configuration_name = ENV["KUBER_KIT_CONFIGURATION"] || options[:configuration]
31
31
 
32
32
  logger.info "Launching kuber_kit with:"
33
33
  logger.info " Root path: #{root_path.to_s.yellow}"
@@ -8,9 +8,9 @@ class KuberKit::Actions::KubectlApplier
8
8
  Contract String, Hash => Any
9
9
  def call(file_path, options)
10
10
  kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
11
- deploy_namespace = KuberKit.current_configuration.deploy_namespace
11
+ deployer_namespace = KuberKit.current_configuration.deployer_namespace
12
12
  ui.create_task("Applying file: #{file_path}") do |task|
13
- kubectl_commands.apply_file(local_shell, file_path, kubeconfig_path: kubeconfig_path, namespace: deploy_namespace)
13
+ kubectl_commands.apply_file(local_shell, file_path, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
14
14
  task.update_title("Applied file: #{file_path}")
15
15
  end
16
16
 
@@ -8,13 +8,13 @@ class KuberKit::Actions::KubectlAttacher
8
8
  Contract String, Hash => Any
9
9
  def call(pod_name, options)
10
10
  kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
11
- deploy_namespace = KuberKit.current_configuration.deploy_namespace
11
+ deployer_namespace = KuberKit.current_configuration.deployer_namespace
12
12
 
13
13
  kubectl_commands.exec(
14
14
  local_shell, pod_name, "bash", args: "-it",
15
15
  kubeconfig_path: kubeconfig_path,
16
16
  interactive: true,
17
- namespace: deploy_namespace
17
+ namespace: deployer_namespace
18
18
  )
19
19
 
20
20
  true
@@ -100,6 +100,11 @@ class KuberKit::CLI < Thor
100
100
  end
101
101
  end
102
102
 
103
+ desc "version", "Print current version"
104
+ def version
105
+ puts KuberKit::VERSION
106
+ end
107
+
103
108
  def self.exit_on_failure?
104
109
  true
105
110
  end
@@ -4,8 +4,8 @@ class KuberKit::Configs
4
4
  AVAILABLE_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
- :artifact_clone_dir, :service_config_dir, :deploy_strategy, :compile_simultaneous_limit,
8
- :additional_images_paths
7
+ :artifact_clone_dir, :service_config_dir, :deployer_strategy, :compile_simultaneous_limit,
8
+ :additional_images_paths, :deprecation_warnings_disabled
9
9
  ]
10
10
  DOCKER_IGNORE_LIST = [
11
11
  'Dockerfile',
@@ -47,9 +47,10 @@ class KuberKit::Configs
47
47
  set :configurations_dirname, "configurations"
48
48
  set :artifact_clone_dir, "/tmp/kuber_kit/artifacts"
49
49
  set :service_config_dir, "/tmp/kuber_kit/services"
50
- set :deploy_strategy, :kubernetes
50
+ set :deployer_strategy, :kubernetes
51
51
  set :compile_simultaneous_limit, 5
52
52
  set :additional_images_paths, []
53
+ set :deprecation_warnings_disabled, false
53
54
  end
54
55
 
55
56
  def items
@@ -117,6 +117,10 @@ class KuberKit::Container
117
117
  KuberKit::Shell::Commands::DockerCommands.new
118
118
  end
119
119
 
120
+ register "shell.docker_compose_commands" do
121
+ KuberKit::Shell::Commands::DockerComposeCommands.new
122
+ end
123
+
120
124
  register "shell.git_commands" do
121
125
  KuberKit::Shell::Commands::GitCommands.new
122
126
  end
@@ -229,8 +233,12 @@ class KuberKit::Container
229
233
  KuberKit::ServiceDeployer::Strategies::Kubernetes.new
230
234
  end
231
235
 
232
- register "service_deployer.strategies.kubernetes_runner" do
233
- KuberKit::ServiceDeployer::Strategies::KubernetesRunner.new
236
+ register "service_deployer.strategies.docker" do
237
+ KuberKit::ServiceDeployer::Strategies::Docker.new
238
+ end
239
+
240
+ register "service_deployer.strategies.docker_compose" do
241
+ KuberKit::ServiceDeployer::Strategies::DockerCompose.new
234
242
  end
235
243
 
236
244
  register "service_reader.action_handler" do
@@ -1,6 +1,6 @@
1
1
  class KuberKit::Core::Configuration
2
2
  attr_reader :name, :artifacts, :registries, :env_files, :templates, :kubeconfig_path,
3
- :deploy_strategy, :deploy_namespace, :services_attributes, :build_servers,
3
+ :deployer_strategy, :deployer_namespace, :services_attributes, :build_servers,
4
4
  :global_build_vars
5
5
 
6
6
  Contract KeywordArgs[
@@ -10,14 +10,14 @@ class KuberKit::Core::Configuration
10
10
  env_files: Hash,
11
11
  templates: Hash,
12
12
  kubeconfig_path: Maybe[String],
13
- deploy_strategy: Symbol,
14
- deploy_namespace: Maybe[Symbol],
13
+ deployer_strategy: Symbol,
14
+ deployer_namespace: Maybe[Symbol],
15
15
  services_attributes: HashOf[Symbol => Hash],
16
16
  build_servers: ArrayOf[KuberKit::Core::BuildServers::AbstractBuildServer],
17
17
  global_build_vars: HashOf[Symbol => Any],
18
18
  ] => Any
19
19
  def initialize(name:, artifacts:, registries:, env_files:, templates:, kubeconfig_path:,
20
- deploy_strategy:, deploy_namespace:, services_attributes:, build_servers:,
20
+ deployer_strategy:, deployer_namespace:, services_attributes:, build_servers:,
21
21
  global_build_vars:)
22
22
  @name = name
23
23
  @artifacts = artifacts
@@ -25,8 +25,8 @@ class KuberKit::Core::Configuration
25
25
  @env_files = env_files
26
26
  @templates = templates
27
27
  @kubeconfig_path = kubeconfig_path
28
- @deploy_strategy = deploy_strategy
29
- @deploy_namespace = deploy_namespace
28
+ @deployer_strategy = deployer_strategy
29
+ @deployer_namespace = deployer_namespace
30
30
  @build_servers = build_servers
31
31
  @services_attributes = services_attributes
32
32
  @global_build_vars = global_build_vars
@@ -37,7 +37,9 @@ class KuberKit::Core::Configuration
37
37
  end
38
38
 
39
39
  def global_build_args
40
- puts "WARNING: global_build_args is deprecated, please use global_build_vars instead"
40
+ unless KuberKit.deprecation_warnings_disabled?
41
+ puts "DEPRECATION: global_build_args is deprecated, please use global_build_vars instead"
42
+ end
41
43
  global_build_vars
42
44
  end
43
45
  end
@@ -23,8 +23,8 @@ class KuberKit::Core::ConfigurationDefinition
23
23
  env_files: @env_files,
24
24
  templates: @templates,
25
25
  kubeconfig_path: @kubeconfig_path,
26
- deploy_strategy: @deploy_strategy,
27
- deploy_namespace: @deploy_namespace,
26
+ deployer_strategy: @deployer_strategy,
27
+ deployer_namespace: @deployer_namespace,
28
28
  enabled_services: @enabled_services,
29
29
  build_servers: @build_servers,
30
30
  services_attributes: @services_attributes,
@@ -82,22 +82,35 @@ class KuberKit::Core::ConfigurationDefinition
82
82
  self
83
83
  end
84
84
 
85
- def deploy_namespace(namespace)
86
- @deploy_namespace = namespace
85
+ def deployer_namespace(namespace)
86
+ @deployer_namespace = namespace
87
87
 
88
88
  self
89
89
  end
90
90
 
91
- def deploy_strategy(path)
92
- @deploy_strategy = path
91
+ def deployer_strategy(path)
92
+ @deployer_strategy = path
93
93
 
94
94
  self
95
95
  end
96
96
 
97
- def enabled_services(services_hash)
98
- @enabled_services += services_hash.keys.map(&:to_sym)
99
- @services_attributes = @services_attributes.merge(services_hash)
97
+ def enabled_services(services)
98
+ if services.is_a?(Hash)
99
+ @enabled_services += services.keys.map(&:to_sym)
100
+ @services_attributes = @services_attributes.merge(services)
101
+ return self
102
+ end
103
+
104
+ if services.is_a?(Array)
105
+ @enabled_services += services.map(&:to_sym)
106
+ return self
107
+ end
108
+
109
+ raise KuberKit::Error, "#enabled_services method accepts only Array or Hash"
110
+ end
100
111
 
112
+ def service_attributes(services)
113
+ @services_attributes = @services_attributes.merge(services)
101
114
  self
102
115
  end
103
116
 
@@ -20,15 +20,15 @@ class KuberKit::Core::ConfigurationFactory
20
20
  build_servers = fetch_build_servers(configuration_attrs.build_servers)
21
21
 
22
22
  KuberKit::Core::Configuration.new(
23
- name: configuration_attrs.name,
24
- artifacts: artifacts,
25
- registries: registries,
26
- env_files: env_files,
27
- templates: templates,
28
- kubeconfig_path: configuration_attrs.kubeconfig_path,
29
- deploy_strategy: configuration_attrs.deploy_strategy || configs.deploy_strategy,
30
- deploy_namespace: configuration_attrs.deploy_namespace,
31
- build_servers: build_servers,
23
+ name: configuration_attrs.name,
24
+ artifacts: artifacts,
25
+ registries: registries,
26
+ env_files: env_files,
27
+ templates: templates,
28
+ kubeconfig_path: configuration_attrs.kubeconfig_path,
29
+ deployer_strategy: configuration_attrs.deployer_strategy || configs.deployer_strategy,
30
+ deployer_namespace: configuration_attrs.deployer_namespace,
31
+ build_servers: build_servers,
32
32
  services_attributes: configuration_attrs.services_attributes,
33
33
  global_build_vars: configuration_attrs.global_build_vars || {},
34
34
  )
@@ -33,6 +33,13 @@ class KuberKit::Core::ContextHelper::BaseHelper
33
33
  KuberKit.global_build_vars
34
34
  end
35
35
 
36
+ def global_build_args
37
+ unless KuberKit.deprecation_warnings_disabled?
38
+ puts "DEPRECATION: global_build_args is deprecated, please use global_build_vars instead"
39
+ end
40
+ global_build_vars
41
+ end
42
+
36
43
  def get_binding
37
44
  binding
38
45
  end
@@ -33,7 +33,9 @@ class KuberKit::Core::Image
33
33
  end
34
34
 
35
35
  def build_args
36
- puts "WARNING: build_args is deprecated, please use build_vars instead"
36
+ unless KuberKit.deprecation_warnings_disabled?
37
+ puts "WARNING: build_args is deprecated, please use build_vars instead"
38
+ end
37
39
  build_vars
38
40
  end
39
41
  end
@@ -44,7 +44,9 @@ class KuberKit::Core::ImageDefinition
44
44
  end
45
45
 
46
46
  def build_args(value = nil, &block)
47
- puts "WARNING: build_args is deprecated, please use build_vars instead"
47
+ unless KuberKit.deprecation_warnings_disabled?
48
+ puts "WARNING: build_args is deprecated, please use build_vars instead"
49
+ end
48
50
  build_vars(value, *block)
49
51
  end
50
52
 
@@ -1,7 +1,7 @@
1
1
  class KuberKit::Core::Service
2
2
  AttributeNotSet = Class.new(Indocker::Error)
3
3
 
4
- attr_reader :name, :template_name, :tags, :images, :attributes, :deploy_strategy
4
+ attr_reader :name, :template_name, :tags, :images, :attributes, :deployer_strategy
5
5
 
6
6
  Contract KeywordArgs[
7
7
  name: Symbol,
@@ -9,15 +9,15 @@ class KuberKit::Core::Service
9
9
  tags: ArrayOf[Symbol],
10
10
  images: ArrayOf[Symbol],
11
11
  attributes: HashOf[Symbol => Any],
12
- deploy_strategy: Maybe[Symbol]
12
+ deployer_strategy: Maybe[Symbol]
13
13
  ] => Any
14
- def initialize(name:, template_name:, tags:, images:, attributes:, deploy_strategy:)
14
+ def initialize(name:, template_name:, tags:, images:, attributes:, deployer_strategy:)
15
15
  @name = name
16
16
  @template_name = template_name
17
17
  @tags = tags
18
18
  @images = images
19
19
  @attributes = attributes
20
- @deploy_strategy = deploy_strategy
20
+ @deployer_strategy = deployer_strategy
21
21
  end
22
22
 
23
23
  def uri
@@ -13,7 +13,7 @@ class KuberKit::Core::ServiceDefinition
13
13
  tags: Array(get_value(@tags)).map(&:to_sym),
14
14
  images: Array(get_value(@images)).map(&:to_sym),
15
15
  attributes: get_value(@attributes),
16
- deploy_strategy: get_value(@deploy_strategy),
16
+ deployer_strategy: get_value(@deployer_strategy),
17
17
  )
18
18
  end
19
19
 
@@ -41,8 +41,8 @@ class KuberKit::Core::ServiceDefinition
41
41
  self
42
42
  end
43
43
 
44
- def deploy_strategy(value = nil, &block)
45
- @deploy_strategy = block_given? ? block : value
44
+ def deployer_strategy(value = nil, &block)
45
+ @deployer_strategy = block_given? ? block : value
46
46
 
47
47
  self
48
48
  end
@@ -12,12 +12,12 @@ class KuberKit::Core::ServiceFactory
12
12
  attributes = (service_attrs.attributes || {}).merge(configuration_attributes)
13
13
 
14
14
  KuberKit::Core::Service.new(
15
- name: service_attrs.name,
16
- template_name: service_attrs.template_name,
17
- tags: service_attrs.tags,
18
- images: service_attrs.images,
19
- attributes: attributes,
20
- deploy_strategy: service_attrs.deploy_strategy,
15
+ name: service_attrs.name,
16
+ template_name: service_attrs.template_name,
17
+ tags: service_attrs.tags,
18
+ images: service_attrs.images,
19
+ attributes: attributes,
20
+ deployer_strategy: service_attrs.deployer_strategy,
21
21
  )
22
22
  end
23
23
  end
@@ -4,7 +4,8 @@ class KuberKit::ServiceDeployer::Deployer
4
4
  include KuberKit::Import[
5
5
  "core.service_store",
6
6
  "service_deployer.strategies.kubernetes",
7
- "service_deployer.strategies.kubernetes_runner"
7
+ "service_deployer.strategies.docker",
8
+ "service_deployer.strategies.docker_compose"
8
9
  ]
9
10
 
10
11
  def initialize(**injected_deps)
@@ -38,6 +39,7 @@ class KuberKit::ServiceDeployer::Deployer
38
39
  private
39
40
  def add_default_strategies
40
41
  register_strategy(:kubernetes, kubernetes)
41
- register_strategy(:kubernetes_runner, kubernetes_runner)
42
+ register_strategy(:docker, docker)
43
+ register_strategy(:docker_compose, docker_compose)
42
44
  end
43
45
  end
@@ -0,0 +1,41 @@
1
+ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer::Strategies::Abstract
2
+ include KuberKit::Import[
3
+ "shell.docker_commands",
4
+ "core.image_store",
5
+ "configs",
6
+ ]
7
+
8
+ STRATEGY_OPTIONS = [
9
+ :container_name,
10
+ :image_name,
11
+ :docker_run_args,
12
+ :docker_run_command,
13
+ :delete_if_exists
14
+ ]
15
+
16
+ Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
17
+ def deploy(shell, service)
18
+ strategy_options = service.attribute(:deployer, default: {})
19
+ unknown_options = strategy_options.keys.map(&:to_sym) - STRATEGY_OPTIONS
20
+ if unknown_options.any?
21
+ raise KuberKit::Error, "Unknow options for deploy strategy: #{unknown_options}. Available options: #{STRATEGY_OPTIONS}"
22
+ end
23
+
24
+ container_name = strategy_options.fetch(:container_name, service.uri)
25
+ docker_run_args = strategy_options.fetch(:docker_run_args, nil)
26
+ docker_run_command = strategy_options.fetch(:docker_run_command, nil)
27
+
28
+ image_name = strategy_options.fetch(:image_name, nil)
29
+ if image_name.nil?
30
+ raise KuberKit::Error, "image_name is mandatory attribute for this deploy strategy"
31
+ end
32
+ image = image_store.get_image(image_name.to_sym)
33
+
34
+ delete_enabled = strategy_options.fetch(:delete_if_exists, false)
35
+ if delete_enabled && docker_commands.container_exists?(shell, container_name)
36
+ docker_commands.delete_container(shell, container_name)
37
+ end
38
+
39
+ docker_commands.run(shell, image.remote_registry_url, run_args: docker_run_args, run_command: docker_run_command)
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+ class KuberKit::ServiceDeployer::Strategies::DockerCompose < KuberKit::ServiceDeployer::Strategies::Abstract
2
+ include KuberKit::Import[
3
+ "service_reader.reader",
4
+ "shell.docker_compose_commands",
5
+ "configs",
6
+ ]
7
+
8
+ STRATEGY_OPTIONS = [
9
+ :service_name,
10
+ :command_name
11
+ ]
12
+
13
+ Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
14
+ def deploy(shell, service)
15
+ service_config = reader.read(shell, service)
16
+ config_path = "#{configs.service_config_dir}/#{service.name}.yml"
17
+ shell.write(config_path, service_config)
18
+
19
+ strategy_options = service.attribute(:deployer, default: {})
20
+ unknown_options = strategy_options.keys.map(&:to_sym) - STRATEGY_OPTIONS
21
+ if unknown_options.any?
22
+ raise KuberKit::Error, "Unknow options for deploy strategy: #{unknown_options}. Available options: #{STRATEGY_OPTIONS}"
23
+ end
24
+
25
+ service_name = strategy_options.fetch(:service_name, service.name.to_s)
26
+ command_name = strategy_options.fetch(:command_name, "bash")
27
+
28
+ docker_compose_commands.run(shell, config_path,
29
+ service: service_name,
30
+ command: command_name,
31
+ )
32
+ end
33
+ end
@@ -5,21 +5,48 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
5
5
  "configs",
6
6
  ]
7
7
 
8
+ STRATEGY_OPTIONS = [
9
+ :resource_type,
10
+ :resource_name,
11
+ :delete_if_exists,
12
+ :restart_if_exists
13
+ ]
14
+
8
15
  Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
9
16
  def deploy(shell, service)
10
17
  service_config = reader.read(shell, service)
11
18
  config_path = "#{configs.service_config_dir}/#{service.name}.yml"
12
19
  shell.write(config_path, service_config)
13
20
 
14
- kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
15
- deploy_namespace = KuberKit.current_configuration.deploy_namespace
21
+ kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
22
+ namespace = KuberKit.current_configuration.deployer_namespace
23
+
24
+ strategy_options = service.attribute(:deployer, default: {})
25
+ unknown_options = strategy_options.keys.map(&:to_sym) - STRATEGY_OPTIONS
26
+ if unknown_options.any?
27
+ raise KuberKit::Error, "Unknow options for deploy strategy: #{unknown_options}. Available options: #{STRATEGY_OPTIONS}"
28
+ end
29
+
30
+ resource_type = strategy_options.fetch(:resource_type, "deployment")
31
+ resource_name = strategy_options.fetch(:resource_name, service.uri)
32
+
33
+ resource_exists = kubectl_commands.resource_exists?(
34
+ shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace
35
+ )
36
+
37
+ delete_enabled = strategy_options.fetch(:delete_if_exists, false)
38
+ if delete_enabled && resource_exists
39
+ kubectl_commands.delete_resource(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
40
+ end
16
41
 
17
- kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: deploy_namespace)
42
+ kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
18
43
 
19
- deployment_restart_enabled = service.attribute(:deployment_restart_enabled, default: true)
20
- deployment_restart_name = service.attribute(:deployment_restart_name, default: service.uri)
21
- if deployment_restart_enabled
22
- kubectl_commands.rolling_restart(shell, deployment_restart_name, kubeconfig_path: kubeconfig_path, namespace: deploy_namespace)
44
+ restart_enabled = strategy_options.fetch(:restart_if_exists, true)
45
+ if restart_enabled && resource_exists
46
+ kubectl_commands.rolling_restart(
47
+ shell, resource_type, resource_name,
48
+ kubeconfig_path: kubeconfig_path, namespace: namespace
49
+ )
23
50
  end
24
51
  end
25
52
  end
@@ -1,6 +1,6 @@
1
1
  class KuberKit::ServiceDeployer::StrategyDetector
2
2
  Contract KuberKit::Core::Service => Symbol
3
3
  def call(service)
4
- service.deploy_strategy || KuberKit.current_configuration.deploy_strategy
4
+ service.deployer_strategy || KuberKit.current_configuration.deployer_strategy
5
5
  end
6
6
  end
@@ -6,6 +6,10 @@ class KuberKit::Shell::AbstractShell
6
6
  raise KuberKit::NotImplementedError, "must be implemented"
7
7
  end
8
8
 
9
+ def interactive!(command)
10
+ raise KuberKit::NotImplementedError, "must be implemented"
11
+ end
12
+
9
13
  def read(file_path)
10
14
  raise KuberKit::NotImplementedError, "must be implemented"
11
15
  end
@@ -13,4 +13,37 @@ class KuberKit::Shell::Commands::DockerCommands
13
13
  def push(shell, tag_name)
14
14
  shell.exec!(%Q{docker push #{tag_name}})
15
15
  end
16
+
17
+ def run(shell, image_name, run_args: nil, run_command: nil)
18
+ command_parts = []
19
+ command_parts << "docker run"
20
+ command_parts << run_args if run_args
21
+ command_parts << image_name
22
+ command_parts << run_command if run_command
23
+
24
+ shell.exec!(command_parts.join(" "))
25
+ end
26
+
27
+ def container_exists?(shell, container_name)
28
+ result = get_container_id(shell, container_name)
29
+ result && result != ""
30
+ end
31
+
32
+ def delete_container(shell, container_name)
33
+ shell.exec!(%Q{docker rm -f #{container_name}})
34
+ end
35
+
36
+ def get_container_id(shell, container_name, only_healthy: false, status: "running")
37
+ command_parts = []
38
+ command_parts << "docker ps -a -q"
39
+
40
+ if only_healthy
41
+ command_parts << "--filter=\"health=healthy\""
42
+ end
43
+
44
+ command_parts << "--filter=\"status=#{status}\""
45
+ command_parts << "--filter=\"name=#{container_name}\""
46
+
47
+ shell.exec!(command_parts.join(" "))
48
+ end
16
49
  end
@@ -0,0 +1,17 @@
1
+ class KuberKit::Shell::Commands::DockerComposeCommands
2
+ def run(shell, path, service:, command:, interactive: false)
3
+ command_parts = [
4
+ "docker-compose",
5
+ "-f #{path}",
6
+ "run",
7
+ service,
8
+ command
9
+ ]
10
+
11
+ if interactive
12
+ shell.interactive!(command_parts.join(" "))
13
+ else
14
+ shell.exec!(command_parts.join(" "))
15
+ end
16
+ end
17
+ end
@@ -16,9 +16,8 @@ class KuberKit::Shell::Commands::KubectlCommands
16
16
 
17
17
  command_parts += Array(command_list)
18
18
 
19
- # TODO: investigate how to do it with shell.
20
19
  if interactive
21
- system(command_parts.join(" "))
20
+ shell.interactive!(command_parts.join(" "))
22
21
  else
23
22
  shell.exec!(command_parts.join(" "))
24
23
  end
@@ -58,8 +57,16 @@ class KuberKit::Shell::Commands::KubectlCommands
58
57
  kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
59
58
  end
60
59
 
61
- def rolling_restart(shell, deployment_name, kubeconfig_path: nil, namespace: nil)
62
- patch_deployment(shell, deployment_name, {
60
+ def patch_resource(shell, resource_type, resource_name, specs, kubeconfig_path: nil, namespace: nil)
61
+ specs_json = JSON.dump(specs).gsub('"', '\"')
62
+
63
+ command = %Q{patch #{resource_type} #{resource_name} -p "#{specs_json}"}
64
+
65
+ kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
66
+ end
67
+
68
+ def rolling_restart(shell, resource_type, resource_name, kubeconfig_path: nil, namespace: nil)
69
+ patch_resource(shell, resource_type, resource_name, {
63
70
  spec: {
64
71
  template: {
65
72
  metadata: {
@@ -71,12 +78,4 @@ class KuberKit::Shell::Commands::KubectlCommands
71
78
  }
72
79
  }, kubeconfig_path: kubeconfig_path, namespace: namespace)
73
80
  end
74
-
75
- def patch_deployment(shell, deployment_name, specs, kubeconfig_path: nil, namespace: nil)
76
- specs_json = JSON.dump(specs).gsub('"', '\"')
77
-
78
- command = %Q{patch deployment #{deployment_name} -p "#{specs_json}"}
79
-
80
- kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
81
- end
82
81
  end
@@ -30,6 +30,20 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
30
30
  result
31
31
  end
32
32
 
33
+ def interactive!(command, log_command: true)
34
+ command_number = command_counter.get_number.to_s.rjust(2, "0")
35
+
36
+ if log_command
37
+ logger.info("Interactive: [#{command_number}]: #{command.to_s.cyan}")
38
+ end
39
+
40
+ result = system(command)
41
+
42
+ if !$?.success?
43
+ raise ShellError, "Shell command failed: #{command}\r\n#{result}"
44
+ end
45
+ end
46
+
33
47
  def sync(local_path, remote_path, exclude: nil, delete: true)
34
48
  rsync_commands.rsync(self, local_path, remote_path, exclude: exclude, delete: delete)
35
49
  end
@@ -38,6 +38,10 @@ class KuberKit::Shell::SshShell < KuberKit::Shell::LocalShell
38
38
  raise ShellError.new(e.message)
39
39
  end
40
40
 
41
+ def interactive!(command, log_command: true)
42
+ raise "Currently interactive run is not supported for ssh shell."
43
+ end
44
+
41
45
  def sync(local_path, remote_path, exclude: nil, delete: true)
42
46
  rsync_commands.rsync(
43
47
  local_shell, local_path, remote_path,
@@ -1,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.2.9"
2
+ VERSION = "0.3.4"
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.2.9
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iskander Khaziev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-08 00:00:00.000000000 Z
11
+ date: 2020-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts-lite
@@ -140,8 +140,8 @@ description: Docker Containers Build & Deployment
140
140
  email:
141
141
  - gvalmon@gmail.com
142
142
  executables:
143
- - console
144
143
  - kit
144
+ - kit_console
145
145
  extensions: []
146
146
  extra_rdoc_files: []
147
147
  files:
@@ -156,8 +156,9 @@ files:
156
156
  - README.md
157
157
  - Rakefile
158
158
  - TODO.md
159
- - bin/console
160
159
  - bin/kit
160
+ - bin/kit_console
161
+ - example/app_data/docker_compose.yml
161
162
  - example/app_data/env_file.yml
162
163
  - example/app_data/service.yml
163
164
  - example/app_data/test.env
@@ -180,6 +181,7 @@ files:
180
181
  - example/infrastructure/env_files.rb
181
182
  - example/infrastructure/registries.rb
182
183
  - example/infrastructure/templates.rb
184
+ - example/services/compose_app.rb
183
185
  - example/services/env_file.rb
184
186
  - example/services/ruby_app.rb
185
187
  - kuber_kit.gemspec
@@ -258,8 +260,9 @@ files:
258
260
  - lib/kuber_kit/service_deployer/deployer.rb
259
261
  - lib/kuber_kit/service_deployer/service_list_resolver.rb
260
262
  - lib/kuber_kit/service_deployer/strategies/abstract.rb
263
+ - lib/kuber_kit/service_deployer/strategies/docker.rb
264
+ - lib/kuber_kit/service_deployer/strategies/docker_compose.rb
261
265
  - lib/kuber_kit/service_deployer/strategies/kubernetes.rb
262
- - lib/kuber_kit/service_deployer/strategies/kubernetes_runner.rb
263
266
  - lib/kuber_kit/service_deployer/strategy_detector.rb
264
267
  - lib/kuber_kit/service_reader/action_handler.rb
265
268
  - lib/kuber_kit/service_reader/reader.rb
@@ -267,6 +270,7 @@ files:
267
270
  - lib/kuber_kit/shell/command_counter.rb
268
271
  - lib/kuber_kit/shell/commands/bash_commands.rb
269
272
  - lib/kuber_kit/shell/commands/docker_commands.rb
273
+ - lib/kuber_kit/shell/commands/docker_compose_commands.rb
270
274
  - lib/kuber_kit/shell/commands/git_commands.rb
271
275
  - lib/kuber_kit/shell/commands/kubectl_commands.rb
272
276
  - lib/kuber_kit/shell/commands/rsync_commands.rb
@@ -1,35 +0,0 @@
1
- class KuberKit::ServiceDeployer::Strategies::KubernetesRunner < KuberKit::ServiceDeployer::Strategies::Abstract
2
- include KuberKit::Import[
3
- "service_reader.reader",
4
- "shell.kubectl_commands",
5
- "configs",
6
- ]
7
-
8
- Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
9
- def deploy(shell, service)
10
- service_config = reader.read(shell, service)
11
- config_path = "#{configs.service_config_dir}/#{service.name}.yml"
12
- shell.write(config_path, service_config)
13
-
14
- kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
15
- deploy_namespace = KuberKit.current_configuration.deploy_namespace
16
-
17
- deployment_resource_name = service.attribute(:deployment_resource_name, default: service.uri)
18
- deployment_resource_type = service.attribute(:deployment_resource_type, default: "job")
19
-
20
- deployment_delete_enabled = service.attribute(:deployment_delete_enabled, default: true)
21
- if deployment_delete_enabled
22
- delete_resource_if_exists(shell, deployment_resource_type, deployment_resource_name, kubeconfig_path: kubeconfig_path, namespace: deploy_namespace)
23
- end
24
-
25
- kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: deploy_namespace)
26
- end
27
-
28
- private
29
- def delete_resource_if_exists(shell, resource_type, resource_name, kubeconfig_path:, namespace: )
30
- unless kubectl_commands.resource_exists?(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
31
- return false
32
- end
33
- kubectl_commands.delete_resource(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
34
- end
35
- end