indocker 0.1.11 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/Gemfile +0 -1
  4. data/Gemfile.lock +8 -2
  5. data/example/indocker/bounded_contexts/shared/bad_container_build/container.rb +2 -1
  6. data/example/indocker/bounded_contexts/shared/bad_container_start/container.rb +2 -1
  7. data/example/indocker/bounded_contexts/shared/daemon_container/Dockerfile +4 -0
  8. data/example/indocker/bounded_contexts/shared/daemon_container/container.rb +6 -0
  9. data/example/indocker/bounded_contexts/shared/daemon_container/image.rb +3 -0
  10. data/example/indocker/bounded_contexts/shared/good_container/container.rb +2 -1
  11. data/example/indocker/bounded_contexts/shared/ruby/container.rb +2 -1
  12. data/example/indocker/configurations/external.rb +6 -1
  13. data/example/indocker/infrastructure/artifacts.rb +10 -0
  14. data/example/indocker/setup.rb +1 -0
  15. data/indocker.gemspec +1 -0
  16. data/lib/indocker.rb +26 -13
  17. data/lib/indocker/build_context.rb +9 -43
  18. data/lib/indocker/container_deployer.rb +10 -28
  19. data/lib/indocker/crontab_redeploy_rules_builder.rb +2 -1
  20. data/lib/indocker/deploy_context.rb +4 -32
  21. data/lib/indocker/deployment_checker.rb +4 -2
  22. data/lib/indocker/docker_run_args.rb +2 -2
  23. data/lib/indocker/images/image_compiler.rb +0 -1
  24. data/lib/indocker/{configuration_deployer.rb → launchers/configuration_deployer.rb} +36 -41
  25. data/lib/indocker/{container_runner.rb → launchers/container_runner.rb} +2 -3
  26. data/lib/indocker/{images_compiler.rb → launchers/images_compiler.rb} +3 -3
  27. data/lib/indocker/{network.rb → networks/network.rb} +1 -1
  28. data/lib/indocker/{network_helper.rb → networks/network_helper.rb} +1 -1
  29. data/lib/indocker/server_pools/build_server_connection.rb +15 -0
  30. data/lib/indocker/{build_context_pool.rb → server_pools/build_server_pool.rb} +8 -8
  31. data/lib/indocker/server_pools/deploy_server_connection.rb +17 -0
  32. data/lib/indocker/server_pools/deploy_server_pool.rb +41 -0
  33. data/lib/indocker/server_pools/server_connection.rb +37 -0
  34. data/lib/indocker/ssh_result_logger.rb +18 -0
  35. data/lib/indocker/ssh_session.rb +3 -5
  36. data/lib/indocker/version.rb +1 -1
  37. data/lib/indocker/{volume_helper.rb → volumes/volume_helper.rb} +1 -1
  38. metadata +33 -12
  39. data/example/spec/indocker_spec.rb +0 -39
  40. data/example/spec/spec_helper.rb +0 -39
  41. data/lib/indocker/server_pool.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8625d37ada817f2f83c30f154bd2ed9a104a023e5b554f4c91f3708ed4aa2770
4
- data.tar.gz: 24950eb94bd956f7f10ad81da4330bffa78495a4852733a1bec5d0713cce4896
3
+ metadata.gz: e93eba781605cba8bdb795ed40a03b16d3602508ca427639b42ead50c25b7ec6
4
+ data.tar.gz: 3e5dc1f5582c8ee45fa4e3583cfea13abf3121e52341eecdc98b8660db700d94
5
5
  SHA512:
6
- metadata.gz: e50ef7ed88a688bb1119e55b1d1662d6827e5667cc66c61dc85933687e9d4834c785c03c7fb917a2709adf04d909f7e611f8c844741b1532211dddad340dc149
7
- data.tar.gz: 1e52f25fff3bf09ddb7f1d097b46ad0e858555892d3b4721a628c8817a16e165694dbf3650e940eb83cb6ac05d8ded47c6359ada9d3cba39d3885ff95e9e88d0
6
+ metadata.gz: 4da7e1049911e4d0c12d89d977cfb568687f61568866ec82f737694c1023984ad97d205d25eaa35e19ebc46843d0743d1df07c833c48d293a5c10ca5de0fd792
7
+ data.tar.gz: 1a8205455ebf5da34c8039a87c45772807920e362e8814bee275ef578647a15edf9970a9c53196b5805aeba8d4b3b047e30e329b0637d393a390c9d32c68353f
@@ -0,0 +1 @@
1
+ 2.5.0
data/Gemfile CHANGED
@@ -6,6 +6,5 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
6
6
  gemspec
7
7
 
8
8
  group :test do
9
- gem 'rspec'
10
9
  gem 'pry'
11
10
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- indocker (0.1.11)
4
+ indocker (0.1.16)
5
5
  net-ssh
6
6
 
7
7
  GEM
@@ -9,6 +9,7 @@ GEM
9
9
  specs:
10
10
  coderay (1.1.3)
11
11
  diff-lcs (1.3)
12
+ docile (1.3.2)
12
13
  method_source (1.0.0)
13
14
  net-ssh (6.1.0)
14
15
  pry (0.13.1)
@@ -28,6 +29,10 @@ GEM
28
29
  diff-lcs (>= 1.2.0, < 2.0)
29
30
  rspec-support (~> 3.9.0)
30
31
  rspec-support (3.9.2)
32
+ simplecov (0.18.5)
33
+ docile (~> 1.1)
34
+ simplecov-html (~> 0.11)
35
+ simplecov-html (0.12.2)
31
36
 
32
37
  PLATFORMS
33
38
  ruby
@@ -37,7 +42,8 @@ DEPENDENCIES
37
42
  indocker!
38
43
  pry
39
44
  rake (~> 12.3.3)
40
- rspec
45
+ rspec (~> 3.0)
46
+ simplecov (~> 0.18.5)
41
47
 
42
48
  BUNDLED WITH
43
49
  1.17.3
@@ -2,4 +2,5 @@ Indocker
2
2
  .define_container(:bad_container_build)
3
3
  .tags('bad_container_build', 'console=true')
4
4
  .image(:bad_container_build)
5
- .networks(:app_net)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -2,4 +2,5 @@ Indocker
2
2
  .define_container(:bad_container_start)
3
3
  .tags('bad_container_start', 'console=true')
4
4
  .image(:bad_container_start)
5
- .networks(:app_net)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -0,0 +1,4 @@
1
+ FROM ruby:2.5.0
2
+
3
+ RUN mkdir /app
4
+ WORKDIR /app
@@ -0,0 +1,6 @@
1
+ Indocker
2
+ .define_container(:daemon_container)
3
+ .tags('daemon_container', 'console=true')
4
+ .image(:daemon_container)
5
+ .networks(:app_net)
6
+ .daemonize(true)
@@ -0,0 +1,3 @@
1
+ Indocker
2
+ .define_image(:daemon_container)
3
+ .registry(:default)
@@ -2,4 +2,5 @@ Indocker
2
2
  .define_container(:good_container)
3
3
  .tags('good_container', 'console=true')
4
4
  .image(:good_container)
5
- .networks(:app_net)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -2,4 +2,5 @@ Indocker
2
2
  .define_container(:ruby)
3
3
  .tags('ruby', 'console=true')
4
4
  .image(:ruby)
5
- .networks(:app_net)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -14,5 +14,10 @@ Indocker
14
14
  },
15
15
  bad_container_start: {
16
16
  servers: [:external],
17
+ },
18
+ daemon_container: {
19
+ servers: [:external],
17
20
  }
18
- )
21
+ ).artifacts(
22
+ indocker_readme: [:external],
23
+ )
@@ -0,0 +1,10 @@
1
+ Indocker.add_artifact(
2
+ Indocker::Artifacts::Git.new(
3
+ name: :indocker_readme,
4
+ remote_name: 'origin',
5
+ remote_url: 'https://github.com/ArtStation/indocker.git',
6
+ branch: :master,
7
+ source_path: './README.md',
8
+ target_path: File.join(Indocker.deploy_dir, 'README.md'),
9
+ )
10
+ )
@@ -18,6 +18,7 @@ require_relative 'infrastructure/registries'
18
18
  require_relative 'infrastructure/servers'
19
19
  require_relative 'infrastructure/build_servers'
20
20
  require_relative 'infrastructure/networks'
21
+ require_relative 'infrastructure/artifacts'
21
22
 
22
23
  Indocker.set_bounded_contexts_dir(File.join(__dir__, 'bounded_contexts'))
23
24
 
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "bundler", "~> 1.17"
28
28
  spec.add_development_dependency "rake", "~> 12.3.3"
29
29
  spec.add_development_dependency "rspec", "~> 3.0"
30
+ spec.add_development_dependency "simplecov", "~> 0.18.5"
30
31
  end
@@ -50,6 +50,7 @@ module Indocker
50
50
  autoload :Local, 'volumes/local'
51
51
  autoload :External, 'volumes/external'
52
52
  autoload :Repository, 'volumes/repository'
53
+ autoload :VolumeHelper, 'volumes/volume_helper'
53
54
  end
54
55
 
55
56
  module EnvFiles
@@ -61,30 +62,42 @@ module Indocker
61
62
  autoload :Git, 'artifacts/git'
62
63
  end
63
64
 
65
+ module Networks
66
+ autoload :Network, 'networks/network'
67
+ autoload :NetworkHelper, 'networks/network_helper'
68
+ end
69
+
70
+ module Launchers
71
+ autoload :ConfigurationDeployer, 'launchers/configuration_deployer'
72
+ autoload :ImagesCompiler, 'launchers/images_compiler'
73
+ autoload :ContainerRunner, 'launchers/container_runner'
74
+ end
75
+
76
+ module ServerPools
77
+ autoload :ServerConnection, 'server_pools/server_connection'
78
+ autoload :DeployServerPool, 'server_pools/deploy_server_pool'
79
+ autoload :DeployServerConnection, 'server_pools/deploy_server_connection'
80
+ autoload :BuildServerPool, 'server_pools/build_server_pool'
81
+ autoload :BuildServerConnection, 'server_pools/build_server_connection'
82
+ end
83
+
64
84
  autoload :HashMerger, 'hash_merger'
65
85
  autoload :BuildServer, 'build_server'
66
86
  autoload :Server, 'server'
67
- autoload :ConfigurationDeployer, 'configuration_deployer'
68
87
  autoload :SshSession, 'ssh_session'
69
- autoload :BuildContextPool, 'build_context_pool'
70
88
  autoload :BuildContext, 'build_context'
71
89
  autoload :BuildContextHelper, 'build_context_helper'
72
90
  autoload :Shell, 'shell'
73
91
  autoload :Docker, 'docker'
74
92
  autoload :ContextArgs, 'context_args'
75
- autoload :Network, 'network'
76
93
  autoload :ContainerDeployer, 'container_deployer'
77
- autoload :ServerPool, 'server_pool'
78
94
  autoload :DeployContext, 'deploy_context'
79
95
  autoload :ContainerHelper, 'container_helper'
80
96
  autoload :DockerRunArgs, 'docker_run_args'
81
- autoload :VolumeHelper, 'volume_helper'
82
- autoload :NetworkHelper, 'network_helper'
83
97
  autoload :Rsync, 'rsync'
84
98
  autoload :EnvFileHelper, 'env_file_helper'
85
99
  autoload :IndockerHelper, 'indocker_helper'
86
- autoload :ImagesCompiler, 'images_compiler'
87
- autoload :ContainerRunner, 'container_runner'
100
+ autoload :SshResultLogger, 'ssh_result_logger'
88
101
  autoload :DeploymentProgress, 'deployment_progress'
89
102
  autoload :DeploymentChecker, 'deployment_checker'
90
103
  autoload :DeploymentPolicy, 'deployment_policy'
@@ -171,7 +184,7 @@ module Indocker
171
184
  raise ArgumentError.new("network :#{name} was already defined")
172
185
  end
173
186
 
174
- networks.push(Indocker::Network.new(name))
187
+ networks.push(Indocker::Networks::Network.new(name))
175
188
  end
176
189
 
177
190
  def container_files
@@ -339,7 +352,7 @@ module Indocker
339
352
  require_confirmation: require_confirmation,
340
353
  )
341
354
 
342
- Indocker::ConfigurationDeployer
355
+ Indocker::Launchers::ConfigurationDeployer
343
356
  .new(logger: Indocker.logger, global_logger: Indocker.global_logger)
344
357
  .run(
345
358
  configuration: configuration,
@@ -356,7 +369,7 @@ module Indocker
356
369
  )
357
370
  end
358
371
 
359
- def launched?(contaner_name, servers: [])
372
+ def launched?(contaner_name, servers: nil)
360
373
  silent_logger = Logger.new(File.open(File::NULL, "w"))
361
374
  Indocker::DeploymentChecker
362
375
  .new(silent_logger, silent_logger)
@@ -368,7 +381,7 @@ module Indocker
368
381
  end
369
382
 
370
383
  def compile(images:, skip_dependent:)
371
- Indocker::ImagesCompiler
384
+ Indocker::Launchers::ImagesCompiler
372
385
  .new(Indocker.logger)
373
386
  .compile(
374
387
  configuration: configuration,
@@ -378,7 +391,7 @@ module Indocker
378
391
  end
379
392
 
380
393
  def run(container_name, force_restart)
381
- Indocker::ContainerRunner
394
+ Indocker::Launchers::ContainerRunner
382
395
  .new(Indocker.logger)
383
396
  .run(
384
397
  configuration: configuration,
@@ -1,54 +1,18 @@
1
1
  require 'fileutils'
2
2
 
3
3
  class Indocker::BuildContext
4
- attr_reader :session, :server, :configuration, :helper, :logger
4
+ attr_reader :configuration, :logger, :global_logger, :helper
5
5
 
6
- def initialize(configuration:, build_server:, logger:)
6
+ def initialize(configuration:, logger:, global_logger:)
7
7
  @configuration = configuration
8
8
  @logger = logger
9
9
  @helper = Indocker::BuildContextHelper.new(@configuration, @build_server)
10
- @server = build_server
11
- @compiled_images = Hash.new(false)
12
- end
13
-
14
- def create_session!
15
- return unless @server
16
-
17
- @session = Indocker::SshSession.new(
18
- host: @server.host,
19
- user: @server.user,
20
- port: @server.port,
21
- logger: @logger
22
- )
23
- end
24
-
25
- def exec!(command)
26
- @session.exec!(command)
27
- end
28
-
29
- def close_session
30
- @session.close if @session
31
- end
32
-
33
- def image_compiled?(image)
34
- @compiled_images[image]
35
- end
36
-
37
- def set_busy(flag)
38
- @busy = !!flag
39
- end
40
-
41
- def busy?
42
- !!@busy
43
- end
44
-
45
- def set_compiled(image)
46
- @compiled_images[image] = true
10
+ @global_logger = global_logger
47
11
  end
48
12
 
49
13
  def build_image(image, build_dir, args: [])
50
14
  image_name = image.image_name
51
- registry = image.registry
15
+ registry = image.registry
52
16
  tag = image.tag
53
17
 
54
18
  FileUtils.cd(build_dir) do
@@ -72,13 +36,15 @@ class Indocker::BuildContext
72
36
  res = Indocker::Docker.build(image.local_registry_url, build_args)
73
37
 
74
38
  if res.exit_status != 0
75
- puts "image compilation :#{image.name} failed"
76
- puts res.stdout
39
+ @global_logger.error("image compilation :#{image.name} failed")
40
+ @global_logger.error(res.stdout)
77
41
  exit 1
78
42
  end
79
43
 
80
44
  Indocker::Docker.tag(image.local_registry_url, image.registry_url)
81
- Indocker::Docker.tag(image.local_registry_url, image.local_registry_url)
45
+ if image.registry_url != image.local_registry_url
46
+ Indocker::Docker.tag(image.local_registry_url, image.local_registry_url)
47
+ end
82
48
 
83
49
  if !image.registry.is_local?
84
50
  Indocker::Docker.push(image.registry_url)
@@ -5,7 +5,7 @@ class Indocker::ContainerDeployer
5
5
  @configuration = configuration
6
6
  @logger = logger
7
7
 
8
- @server_pool = Indocker::ServerPool.new(
8
+ @server_pool = Indocker::ServerPools::DeployServerPool.new(
9
9
  configuration: @configuration,
10
10
  logger: logger
11
11
  )
@@ -14,10 +14,6 @@ class Indocker::ContainerDeployer
14
14
  @deployed_servers = {}
15
15
  end
16
16
 
17
- def create_sessions!
18
- @server_pool.create_sessions!
19
- end
20
-
21
17
  def deploy(container, force_restart, skip_force_restart, progress)
22
18
  return if @deployed_containers[container]
23
19
 
@@ -37,37 +33,23 @@ class Indocker::ContainerDeployer
37
33
  end
38
34
 
39
35
  exec_proc.call do
40
- deploy_context = @server_pool.get(server)
36
+ deploy_server = @server_pool.create_connection!(server)
41
37
  @logger.info("Deploying container: #{container.name.to_s.green} to #{server.user}@#{server.host}")
42
38
 
43
- command_output = @logger.debug? ? "" : " > /dev/null"
44
- debug_options = @logger.debug? ? "-d" : ""
45
-
46
- if force_restart && !skip_force_restart.include?(container.name)
47
- force_restart_options = force_restart ? "-f" : ""
48
- end
49
-
50
- result = deploy_context
51
- .session
52
- .exec!(
53
- "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/run -C #{Indocker.configuration_name} -c #{container.name} #{debug_options} #{command_output} #{force_restart_options}",
54
- on_stdout: proc { |data|
55
- @logger.info("[deploy] #{data}")
56
- },
57
- on_stderr: proc { |data|
58
- @logger.error("[deploy] #{data}")
59
- }
39
+ result = deploy_server
40
+ .run_container_remotely(
41
+ configuration_name: Indocker.configuration_name,
42
+ container_name: container.name,
43
+ force_restart: force_restart && !skip_force_restart.include?(container.name)
60
44
  )
61
-
45
+
62
46
  if result.exit_code != 0
63
- @global_logger.error("[deploy] #{container.name.to_s.green} deployment for server #{server.name} failed")
64
- puts result.stdout_data
65
47
  exit 1
66
48
  end
67
-
49
+
68
50
  @logger.info("Container deployment to #{server.user}@#{server.host} finished: #{container.name.to_s.green}")
69
51
 
70
- deploy_context.close_session
52
+ deploy_server.close_session
71
53
  progress.finish_deploying_container(container, server)
72
54
  end
73
55
  end
@@ -8,7 +8,7 @@ PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sb
8
8
  CRONTAB
9
9
 
10
10
  LOG_FILE = "/var/log/indocker-redeploy-%{env}.log"
11
- COMMAND = "export TERM=xterm;#{Indocker.deploy_dir}/indocker/bin/deploy -C %{env} -f -B -y -c %{container_name}"
11
+ COMMAND = "export TERM=xterm;%{deploy_dir}/indocker/bin/deploy -C %{env} -f -B -y -c %{container_name}"
12
12
  REDEPLOY_RULE = %Q{%{schedule} echo `date` "- %{command}..." >> %{log_file}; %{command} 1>/dev/null 2>>%{log_file}; echo `date` "- done, exitcode = $?" >> %{log_file}}
13
13
 
14
14
  def initialize(configuration:, logger:)
@@ -41,6 +41,7 @@ PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sb
41
41
  COMMAND % {
42
42
  env: env,
43
43
  container_name: container.name,
44
+ deploy_dir: Indocker.deploy_dir
44
45
  }
45
46
  end
46
47
 
@@ -2,42 +2,14 @@ require 'digest'
2
2
  require 'fileutils'
3
3
 
4
4
  class Indocker::DeployContext
5
- attr_reader :server, :session
5
+ attr_reader :configuration, :logger
6
6
 
7
- def initialize(logger:, configuration:, server:)
7
+ def initialize(logger:, configuration:)
8
8
  @logger = logger
9
9
  @configuration = configuration
10
- @server = server
11
10
  @restart_policy = Indocker::Containers::RestartPolicy.new(configuration, logger)
12
11
  end
13
12
 
14
- def create_session!
15
- return unless @server
16
-
17
- @session = Indocker::SshSession.new(
18
- host: @server.host,
19
- user: @server.user,
20
- port: @server.port,
21
- logger: @logger
22
- )
23
- end
24
-
25
- def exec!(command)
26
- @session.exec!(command)
27
- end
28
-
29
- def close_session
30
- @session.close if @session
31
- end
32
-
33
- def set_busy(flag)
34
- @busy = !!flag
35
- end
36
-
37
- def busy?
38
- !!@busy
39
- end
40
-
41
13
  def deploy(container, force_restart)
42
14
  @logger.info("Deploying container: #{container.name.to_s.green}")
43
15
  @logger.debug("Deploy dir: #{Indocker.deploy_dir}")
@@ -46,14 +18,14 @@ class Indocker::DeployContext
46
18
 
47
19
  container.networks.each do |network|
48
20
  Indocker::Docker.create_network(
49
- Indocker::NetworkHelper.name(@configuration.name, network)
21
+ Indocker::Networks::NetworkHelper.name(@configuration.name, network)
50
22
  )
51
23
  end
52
24
 
53
25
  container.volumes.each do |volume|
54
26
  if volume.is_a?(Indocker::Volumes::External)
55
27
  Indocker::Docker.create_volume(
56
- Indocker::VolumeHelper.name(@configuration.name, volume)
28
+ Indocker::Volumes::VolumeHelper.name(@configuration.name, volume)
57
29
  )
58
30
  end
59
31
  end
@@ -109,13 +109,15 @@ class Indocker::DeploymentChecker
109
109
  { missing_containers: total_missing_containers, invalid_containers: total_invalid_containers }
110
110
  end
111
111
 
112
- def launched?(container_name, configuration:, servers:)
112
+ def launched?(container_name, configuration:, servers: nil)
113
113
  container = Indocker.containers.detect { |c| c.name == container_name.to_sym }
114
114
  hostnames = (container.get_start_option(:scale) || 1).times.map do |number|
115
115
  Indocker::ContainerHelper.hostname(configuration.name, container, number)
116
116
  end
117
117
 
118
- result = run(configuration: configuration, servers: servers, only_containers: [container.name])
118
+ servers ||= container.servers.map(&:name)
119
+
120
+ result = run(configuration: configuration, servers: container.servers.map(&:name), only_containers: [container.name])
119
121
  result[:missing_containers].empty?
120
122
  end
121
123
  end
@@ -159,7 +159,7 @@ class Indocker::DockerRunArgs
159
159
  if volume.is_a?(Indocker::Volumes::Local)
160
160
  args.push("-v #{volume.local_path}:#{volume.path}")
161
161
  elsif volume.is_a?(Indocker::Volumes::External)
162
- name = Indocker::VolumeHelper.name(configuration.name, volume)
162
+ name = Indocker::Volumes::VolumeHelper.name(configuration.name, volume)
163
163
  args.push("-v #{name}:#{volume.path}")
164
164
  elsif volume.is_a?(Indocker::Volumes::Repository)
165
165
  repository = configuration.repositories.fetch(volume.repository_name) do
@@ -173,7 +173,7 @@ class Indocker::DockerRunArgs
173
173
  end
174
174
 
175
175
  container.networks.each do |network|
176
- name = Indocker::NetworkHelper.name(configuration.name, network)
176
+ name = Indocker::Networks::NetworkHelper.name(configuration.name, network)
177
177
  args.push("--network #{name}")
178
178
  end
179
179
 
@@ -61,7 +61,6 @@ class Indocker::Images::ImageCompiler
61
61
  end
62
62
 
63
63
  build_context.build_image(image, compile_dir)
64
- build_context.set_compiled(image)
65
64
 
66
65
  @compiled_images[image] = true
67
66
  end
@@ -2,7 +2,7 @@ require 'timeout'
2
2
  require 'benchmark'
3
3
  require 'tempfile'
4
4
 
5
- class Indocker::ConfigurationDeployer
5
+ class Indocker::Launchers::ConfigurationDeployer
6
6
  REMOTE_OPERATION_TIMEOUT = 60
7
7
 
8
8
  def initialize(logger:, global_logger:)
@@ -14,13 +14,11 @@ class Indocker::ConfigurationDeployer
14
14
  @progress = Indocker::DeploymentProgress.new(
15
15
  Indocker.logger.level == Logger::DEBUG ? nil : Logger.new(STDOUT)
16
16
  )
17
+ @compiled_images = Hash.new(false)
17
18
  end
18
19
 
19
20
  # Launch deployment & measure the benchmark
20
21
  def run(configuration:, deployment_policy:)
21
- build_context_pool = nil
22
- deployer = nil
23
-
24
22
  time = Benchmark.realtime do
25
23
  if deployment_policy.force_restart
26
24
  @logger.warn("WARNING. All containers will be forced to restart.")
@@ -46,12 +44,11 @@ class Indocker::ConfigurationDeployer
46
44
  containers = find_containers_to_deploy(configuration, deployment_policy)
47
45
 
48
46
  clonner = Indocker::Repositories::Clonner.new(configuration, @logger)
49
- build_context_pool = Indocker::BuildContextPool.new(configuration: configuration, logger: @logger)
47
+ build_server_pool = Indocker::ServerPools::BuildServerPool.new(configuration: configuration, logger: @logger)
50
48
  deployer = Indocker::ContainerDeployer.new(configuration: configuration, logger: @logger)
51
49
 
52
50
  @global_logger.info("Establishing ssh sessions to all servers...")
53
- build_context_pool.create_sessions!
54
- deployer.create_sessions!
51
+ build_server_pool.create_sessions!
55
52
 
56
53
  build_servers = configuration
57
54
  .build_servers
@@ -95,7 +92,7 @@ class Indocker::ConfigurationDeployer
95
92
  recursively_deploy_container(
96
93
  configuration,
97
94
  deployer,
98
- build_context_pool,
95
+ build_server_pool,
99
96
  container,
100
97
  containers,
101
98
  deployment_policy.skip_build,
@@ -109,7 +106,7 @@ class Indocker::ConfigurationDeployer
109
106
  .list
110
107
  .each { |t| t.join if t != Thread.current }
111
108
  ensure
112
- build_context_pool.close_sessions if build_context_pool
109
+ build_server_pool.close_sessions if build_server_pool
113
110
  deployer.close_sessions if deployer
114
111
  end
115
112
 
@@ -261,23 +258,25 @@ class Indocker::ConfigurationDeployer
261
258
  def collect_soft_dependent_containers(containers, configuration)
262
259
  result = containers
263
260
 
264
- result += containers.map do |container|
265
- container.soft_dependent_containers.reject do |soft_dependent_container|
266
- configuration.enabled_containers.include?(soft_dependent_container.name) &&
267
- Indocker.launched?(soft_dependent_container.name)
268
- end
269
- end.flatten
261
+ soft_dependent_containers = containers
262
+ .map(&:soft_dependent_containers)
263
+ .flatten
264
+ .uniq(&:name)
270
265
 
266
+ result += soft_dependent_containers.select do |container|
267
+ configuration.enabled_containers.include?(container.name) &&
268
+ !Indocker.launched?(container.name)
269
+ end
271
270
 
272
- result.uniq
271
+ result
273
272
  end
274
273
 
275
- def compile_image(configuration, image, build_context)
276
- return if build_context.image_compiled?(image)
274
+ def compile_image(configuration, image, build_server)
275
+ return if @compiled_images[image]
277
276
 
278
277
  image.dependent_images.each do |dependent_image|
279
- next if build_context.image_compiled?(dependent_image)
280
- compile_image(configuration, dependent_image, build_context)
278
+ next if @compiled_images[image]
279
+ compile_image(configuration, dependent_image, build_server)
281
280
  end
282
281
 
283
282
  compiler = Indocker::Images::ImageCompiler.new
@@ -287,38 +286,30 @@ class Indocker::ConfigurationDeployer
287
286
  result = nil
288
287
 
289
288
  time = Benchmark.realtime do
290
- result = build_context
291
- .session
292
- .exec!(
293
- "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/compile -C #{Indocker.configuration_name} -i #{image.name} -s #{@logger.debug? ? '-d' : ''}",
294
- on_stdout: proc { |data|
295
- @logger.info("[compile] #{data}")
296
- },
297
- on_stderr: proc { |data|
298
- @logger.error("[compile] #{data}")
299
- }
289
+ result = build_server
290
+ .compile_image_remotely(
291
+ configuration_name: Indocker.configuration_name,
292
+ image_name: image.name
300
293
  )
301
294
  end
302
295
 
303
296
  if result.exit_code != 0
304
- @global_logger.error("[compile] #{image.name.to_s.green} image compilation failed")
305
- puts result.stdout_data
306
- exit 1
297
+ exit 1
307
298
  end
308
299
 
309
300
  @logger.info("Image compilation completed #{image.name.to_s.green}. Time taken: #{time}")
310
301
 
311
- build_context.set_compiled(image)
302
+ @compiled_images[image] = true
312
303
  end
313
304
 
314
- def recursively_deploy_container(configuration, deployer, build_context_pool, container,
305
+ def recursively_deploy_container(configuration, deployer, build_server_pool, container,
315
306
  containers, skip_build, skip_deploy, force_restart, skip_force_restart)
316
307
 
317
308
  container.dependent_containers.each do |container|
318
309
  recursively_deploy_container(
319
310
  configuration,
320
311
  deployer,
321
- build_context_pool,
312
+ build_server_pool,
322
313
  container,
323
314
  containers,
324
315
  skip_build,
@@ -333,20 +324,24 @@ class Indocker::ConfigurationDeployer
333
324
  @progress.start_building_container(container)
334
325
 
335
326
  if !skip_build
336
- build_context = build_context_pool.get
327
+ build_server = build_server_pool.get
337
328
 
338
- build_context.set_busy(true)
339
- compile_image(configuration, container.image, build_context)
340
- build_context.set_busy(false)
329
+ build_server.set_busy(true)
330
+ compile_image(configuration, container.image, build_server)
331
+ build_server.set_busy(false)
341
332
  end
342
333
 
343
334
  @progress.finish_building_container(container)
344
335
 
345
336
  if !skip_deploy
346
- deployer.deploy(container, force_restart, skip_force_restart, @progress)
337
+ deploy_container(deployer, container, force_restart, skip_force_restart)
347
338
  end
348
339
  end
349
340
 
341
+ def deploy_container(deployer, container, force_restart, skip_force_restart)
342
+ deployer.deploy(container, force_restart, skip_force_restart, @progress)
343
+ end
344
+
350
345
  class RemoteOperation
351
346
  attr_reader :thread, :server, :operation, :message
352
347
 
@@ -1,4 +1,4 @@
1
- class Indocker::ContainerRunner
1
+ class Indocker::Launchers::ContainerRunner
2
2
  def initialize(logger)
3
3
  @logger = logger
4
4
  end
@@ -13,8 +13,7 @@ class Indocker::ContainerRunner
13
13
 
14
14
  deploy_context = Indocker::DeployContext.new(
15
15
  logger: @logger,
16
- configuration: configuration,
17
- server: nil
16
+ configuration: configuration
18
17
  )
19
18
 
20
19
  container = configuration.containers.detect { |c| c.name == container_name }
@@ -1,4 +1,4 @@
1
- class Indocker::ImagesCompiler
1
+ class Indocker::Launchers::ImagesCompiler
2
2
  def initialize(logger)
3
3
  @logger = logger
4
4
  end
@@ -8,8 +8,8 @@ class Indocker::ImagesCompiler
8
8
 
9
9
  build_context = Indocker::BuildContext.new(
10
10
  configuration: configuration,
11
- build_server: nil,
12
- logger: @logger
11
+ logger: @logger,
12
+ global_logger: Indocker.global_logger
13
13
  )
14
14
 
15
15
  image_compiler = Indocker::Images::ImageCompiler.new
@@ -1,4 +1,4 @@
1
- class Indocker::Network
1
+ class Indocker::Networks::Network
2
2
  attr_reader :name, :containers
3
3
 
4
4
  def initialize(name)
@@ -1,4 +1,4 @@
1
- class Indocker::NetworkHelper
1
+ class Indocker::Networks::NetworkHelper
2
2
  class << self
3
3
  def name(configuration_name, network)
4
4
  "#{configuration_name}_#{network.name}"
@@ -0,0 +1,15 @@
1
+ require 'fileutils'
2
+
3
+ class Indocker::ServerPools::BuildServerConnection < Indocker::ServerPools::ServerConnection
4
+ def compile_image_remotely(configuration_name:, image_name:)
5
+ result = exec!(
6
+ "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/compile -C #{configuration_name} -i #{image_name} -s #{@logger.debug? ? '-d' : ''}"
7
+ )
8
+
9
+ Indocker::SshResultLogger
10
+ .new(@logger)
11
+ .log(result, "#{image_name.to_s.green} image compilation failed")
12
+
13
+ result
14
+ end
15
+ end
@@ -1,26 +1,26 @@
1
- class Indocker::BuildContextPool
1
+ class Indocker::ServerPools::BuildServerPool
2
2
  def initialize(configuration:, logger:)
3
3
  @logger = logger
4
4
  @configuration = configuration
5
5
 
6
- @contexts = configuration.build_servers.map do |build_server|
7
- Indocker::BuildContext.new(
6
+ @connections = configuration.build_servers.map do |build_server|
7
+ Indocker::ServerPools::BuildServerConnection.new(
8
8
  logger: @logger,
9
9
  configuration: configuration,
10
- build_server: build_server
10
+ server: build_server,
11
11
  )
12
12
  end
13
13
  end
14
14
 
15
15
  def create_sessions!
16
- @contexts.each(&:create_session!)
16
+ @connections.each(&:create_session!)
17
17
  end
18
18
 
19
19
  def get
20
20
  context = nil
21
21
 
22
22
  loop do
23
- context = @contexts.detect {|c| !c.busy?}
23
+ context = @connections.detect {|c| !c.busy?}
24
24
  sleep(0.1)
25
25
  break if context
26
26
  end
@@ -29,11 +29,11 @@ class Indocker::BuildContextPool
29
29
  end
30
30
 
31
31
  def each(&proc)
32
- @contexts.each(&proc)
32
+ @connections.each(&proc)
33
33
  end
34
34
 
35
35
  def close_sessions
36
- @contexts.each(&:close_session)
36
+ @connections.each(&:close_session)
37
37
  rescue => e
38
38
  @logger.error("error during session close: #{e.inspect}")
39
39
  end
@@ -0,0 +1,17 @@
1
+ class Indocker::ServerPools::DeployServerConnection < Indocker::ServerPools::ServerConnection
2
+ def run_container_remotely(configuration_name:, container_name:, force_restart:)
3
+ command_output = @logger.debug? ? "" : " > /dev/null"
4
+ debug_options = @logger.debug? ? "-d" : ""
5
+ force_restart_options = force_restart ? "-f" : ""
6
+
7
+ result = exec!(
8
+ "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/run -C #{configuration_name} -c #{container_name} #{debug_options} #{command_output} #{force_restart_options}"
9
+ )
10
+
11
+ Indocker::SshResultLogger
12
+ .new(@logger)
13
+ .log(result, "#{container_name.to_s.green} deployment for server #{server.name} failed")
14
+
15
+ result
16
+ end
17
+ end
@@ -0,0 +1,41 @@
1
+ class Indocker::ServerPools::DeployServerPool
2
+ def initialize(configuration:, logger:)
3
+ @logger = logger
4
+ @configuration = configuration
5
+ @connections = []
6
+ @semaphore = Mutex.new
7
+ end
8
+
9
+ def create_connection!(server)
10
+ connection = Indocker::ServerPools::DeployServerConnection.new(
11
+ logger: @logger,
12
+ configuration: @configuration,
13
+ server: server,
14
+ )
15
+ connection.create_session!
16
+ connection
17
+ end
18
+
19
+ def find_or_create_connection!(server)
20
+ @semaphore.synchronize do
21
+ connection = @connections.detect do |connection|
22
+ connection.server.host == server.host &&
23
+ connection.server.port == server.port &&
24
+ connection.server.user == server.user
25
+ end
26
+ if connection.nil?
27
+ connection = create_connection!(server)
28
+ @connections.push(connection)
29
+ end
30
+ connection
31
+ end
32
+ end
33
+
34
+ def each(&proc)
35
+ @connections.each(&proc)
36
+ end
37
+
38
+ def close_sessions
39
+ @connections.each(&:close_session)
40
+ end
41
+ end
@@ -0,0 +1,37 @@
1
+ class Indocker::ServerPools::ServerConnection
2
+ attr_reader :server, :session
3
+
4
+ def initialize(logger:, configuration:, server:)
5
+ @logger = logger
6
+ @configuration = configuration
7
+ @server = server
8
+ end
9
+
10
+ def create_session!
11
+ return unless @server
12
+
13
+ @session = Indocker::SshSession.new(
14
+ host: @server.host,
15
+ user: @server.user,
16
+ port: @server.port,
17
+ logger: @logger
18
+ )
19
+ end
20
+
21
+ def exec!(command)
22
+ @session.exec!(command)
23
+ end
24
+
25
+ def close_session
26
+ @session.close if @session
27
+ @session = nil
28
+ end
29
+
30
+ def set_busy(flag)
31
+ @busy = !!flag
32
+ end
33
+
34
+ def busy?
35
+ !!@busy
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ class Indocker::SshResultLogger
2
+ def initialize(logger)
3
+ @logger = logger
4
+ end
5
+
6
+ def log(result, error_message)
7
+ if result.exit_code == 0
8
+ puts result.stdout_data
9
+ else
10
+ @logger.error(error_message)
11
+ puts result.stdout_data
12
+
13
+ result.stderr_data.to_s.split("\n").each do |line|
14
+ @logger.error(line)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -37,11 +37,11 @@ class Indocker::SshSession
37
37
  !@ssh
38
38
  end
39
39
 
40
- def exec!(command, on_stdout: nil, on_stderr: nil)
40
+ def exec!(command)
41
41
  if local?
42
42
  exec_locally!(command)
43
43
  else
44
- exec_remotely!(command, on_stdout: on_stdout, on_stderr: on_stderr)
44
+ exec_remotely!(command)
45
45
  end
46
46
  end
47
47
 
@@ -57,7 +57,7 @@ class Indocker::SshSession
57
57
  ExecResult.new(res.stdout, '', res.exit_status, nil)
58
58
  end
59
59
 
60
- def exec_remotely!(command, on_stdout:, on_stderr:)
60
+ def exec_remotely!(command)
61
61
  if Indocker.export_command
62
62
  command = "#{Indocker.export_command} && #{command}"
63
63
  end
@@ -78,12 +78,10 @@ class Indocker::SshSession
78
78
 
79
79
  channel.on_data do |ch,data|
80
80
  stdout_data += data
81
- on_stdout.call(data) if on_stdout
82
81
  end
83
82
 
84
83
  channel.on_extended_data do |ch,type,data|
85
84
  stderr_data += data
86
- on_stderr.call(data) if on_stderr
87
85
  end
88
86
 
89
87
  channel.on_request('exit-status') do |ch,data|
@@ -1,3 +1,3 @@
1
1
  module Indocker
2
- VERSION = "0.1.11"
2
+ VERSION = "0.1.16"
3
3
  end
@@ -1,4 +1,4 @@
1
- class Indocker::VolumeHelper
1
+ class Indocker::Volumes::VolumeHelper
2
2
  class << self
3
3
  def name(configuration_name, volume)
4
4
  "#{configuration_name}_#{volume.name}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: indocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-08-13 00:00:00.000000000 Z
12
+ date: 2020-08-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: net-ssh
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '3.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 0.18.5
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.18.5
70
84
  description: Docker Containers Deployment
71
85
  email:
72
86
  - gvalmon@gmail.com
@@ -76,6 +90,7 @@ extra_rdoc_files: []
76
90
  files:
77
91
  - ".gitignore"
78
92
  - ".rspec"
93
+ - ".ruby-version"
79
94
  - ".travis.yml"
80
95
  - Gemfile
81
96
  - Gemfile.lock
@@ -95,6 +110,9 @@ files:
95
110
  - example/indocker/bounded_contexts/shared/bad_container_start/build_context/bin/run
96
111
  - example/indocker/bounded_contexts/shared/bad_container_start/container.rb
97
112
  - example/indocker/bounded_contexts/shared/bad_container_start/image.rb
113
+ - example/indocker/bounded_contexts/shared/daemon_container/Dockerfile
114
+ - example/indocker/bounded_contexts/shared/daemon_container/container.rb
115
+ - example/indocker/bounded_contexts/shared/daemon_container/image.rb
98
116
  - example/indocker/bounded_contexts/shared/good_container/Dockerfile
99
117
  - example/indocker/bounded_contexts/shared/good_container/container.rb
100
118
  - example/indocker/bounded_contexts/shared/good_container/image.rb
@@ -103,29 +121,25 @@ files:
103
121
  - example/indocker/bounded_contexts/shared/ruby/image.rb
104
122
  - example/indocker/configurations/dev.rb
105
123
  - example/indocker/configurations/external.rb
124
+ - example/indocker/infrastructure/artifacts.rb
106
125
  - example/indocker/infrastructure/build_servers.rb
107
126
  - example/indocker/infrastructure/networks.rb
108
127
  - example/indocker/infrastructure/registries.rb
109
128
  - example/indocker/infrastructure/servers.rb
110
129
  - example/indocker/setup.rb
111
- - example/spec/indocker_spec.rb
112
- - example/spec/spec_helper.rb
113
130
  - indocker.gemspec
114
131
  - lib/indocker.rb
115
132
  - lib/indocker/artifacts/git.rb
116
133
  - lib/indocker/build_context.rb
117
134
  - lib/indocker/build_context_helper.rb
118
- - lib/indocker/build_context_pool.rb
119
135
  - lib/indocker/build_server.rb
120
136
  - lib/indocker/colored_string.rb
121
137
  - lib/indocker/concerns/inspectable.rb
122
- - lib/indocker/configuration_deployer.rb
123
138
  - lib/indocker/configurations/configuration.rb
124
139
  - lib/indocker/configurations/configuration_builder.rb
125
140
  - lib/indocker/configurations/formatters/stdout.rb
126
141
  - lib/indocker/container_deployer.rb
127
142
  - lib/indocker/container_helper.rb
128
- - lib/indocker/container_runner.rb
129
143
  - lib/indocker/containers/container.rb
130
144
  - lib/indocker/containers/container_builder.rb
131
145
  - lib/indocker/containers/restart_policy.rb
@@ -146,11 +160,13 @@ files:
146
160
  - lib/indocker/images/image_compiler.rb
147
161
  - lib/indocker/images/template_compiler.rb
148
162
  - lib/indocker/images/templates_compiler.rb
149
- - lib/indocker/images_compiler.rb
150
163
  - lib/indocker/indocker_helper.rb
164
+ - lib/indocker/launchers/configuration_deployer.rb
165
+ - lib/indocker/launchers/container_runner.rb
166
+ - lib/indocker/launchers/images_compiler.rb
151
167
  - lib/indocker/logger_factory.rb
152
- - lib/indocker/network.rb
153
- - lib/indocker/network_helper.rb
168
+ - lib/indocker/networks/network.rb
169
+ - lib/indocker/networks/network_helper.rb
154
170
  - lib/indocker/registries/abstract.rb
155
171
  - lib/indocker/registries/local.rb
156
172
  - lib/indocker/registries/remote.rb
@@ -161,14 +177,19 @@ files:
161
177
  - lib/indocker/repositories/no_sync.rb
162
178
  - lib/indocker/rsync.rb
163
179
  - lib/indocker/server.rb
164
- - lib/indocker/server_pool.rb
180
+ - lib/indocker/server_pools/build_server_connection.rb
181
+ - lib/indocker/server_pools/build_server_pool.rb
182
+ - lib/indocker/server_pools/deploy_server_connection.rb
183
+ - lib/indocker/server_pools/deploy_server_pool.rb
184
+ - lib/indocker/server_pools/server_connection.rb
165
185
  - lib/indocker/shell.rb
186
+ - lib/indocker/ssh_result_logger.rb
166
187
  - lib/indocker/ssh_session.rb
167
188
  - lib/indocker/version.rb
168
- - lib/indocker/volume_helper.rb
169
189
  - lib/indocker/volumes/external.rb
170
190
  - lib/indocker/volumes/local.rb
171
191
  - lib/indocker/volumes/repository.rb
192
+ - lib/indocker/volumes/volume_helper.rb
172
193
  homepage: https://github.com/ArtStation/indocker
173
194
  licenses:
174
195
  - MIT
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe Indocker do
4
- it "has a version number" do
5
- expect(Indocker::VERSION).not_to be nil
6
- end
7
-
8
- describe "successful deployment" do
9
- it "doesn't raise any error" do
10
- expect{
11
- launch_deployment(containers: [:good_container])
12
- }.to_not raise_error
13
- end
14
-
15
- it "shows a message about successful deploy" do
16
- allow(Indocker.global_logger).to receive(:info).at_least(:once)
17
-
18
- launch_deployment(containers: [:good_container])
19
-
20
- expect(Indocker.global_logger).to have_received(:info).at_least(:once).with(/Deployment finished/)
21
- end
22
- end
23
-
24
- describe "failed build" do
25
- it "exits with an error" do
26
- expect{
27
- launch_deployment(containers: [:bad_container_build])
28
- }.to raise_error(SystemExit)
29
- end
30
- end
31
-
32
- describe "failed start" do
33
- it "exits without error" do
34
- expect{
35
- launch_deployment(containers: [:bad_container_start])
36
- }.to_not raise_error(SystemExit)
37
- end
38
- end
39
- end
@@ -1,39 +0,0 @@
1
- require "bundler/setup"
2
- require "indocker"
3
- require "pry"
4
-
5
- RSpec.configure do |config|
6
- # Enable flags like --only-failures and --next-failure
7
- config.example_status_persistence_file_path = ".rspec_status"
8
-
9
- # Disable RSpec exposing methods globally on `Module` and `main`
10
- config.disable_monkey_patching!
11
-
12
- config.expect_with :rspec do |c|
13
- c.syntax = :expect
14
- end
15
- end
16
-
17
- def launch_deployment(options = {})
18
- require_relative '../indocker/bin/utils/configurations'
19
-
20
- Indocker.set_configuration_name(options[:configuration] || "external")
21
- require_relative '../indocker/setup'
22
-
23
- Indocker.set_log_level(options[:debug] ? Logger::DEBUG : Logger::INFO)
24
-
25
- Indocker.deploy(
26
- containers: options[:containers] || [],
27
- tags: options[:tags] || [],
28
- skip_containers: options[:skip_containers] || [],
29
- skip_dependent: !!options[:skip_dependent],
30
- servers: options[:servers] || [],
31
- skip_build: options[:skip_build],
32
- skip_deploy: options[:skip_deploy],
33
- force_restart: options[:force_restart],
34
- skip_tags: options[:skip_tags] || [],
35
- skip_force_restart: options[:skip_force_restart] || [],
36
- auto_confirm: !!options[:auto_confirm],
37
- require_confirmation: !!options[:require_confirmation],
38
- )
39
- end
@@ -1,38 +0,0 @@
1
- class Indocker::ServerPool
2
- def initialize(configuration:, logger:)
3
- @logger = logger
4
- @configuration = configuration
5
-
6
- @contexts = configuration.servers.map do |server|
7
- Indocker::DeployContext.new(
8
- logger: @logger,
9
- configuration: configuration,
10
- server: server,
11
- )
12
- end
13
- end
14
-
15
- def create_sessions!
16
- @contexts.each(&:create_session!)
17
- end
18
-
19
- # NOTE: get is a bad name here, because we create a new connection.
20
- # TODO: why we create a new connection here?
21
- def get(server)
22
- context = Indocker::DeployContext.new(
23
- logger: @logger,
24
- configuration: @configuration,
25
- server: server,
26
- )
27
- context.create_session!
28
- context
29
- end
30
-
31
- def each(&proc)
32
- @contexts.each(&proc)
33
- end
34
-
35
- def close_sessions
36
- @contexts.each(&:close_session)
37
- end
38
- end