indocker 0.0.6 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +10 -2
  3. data/.rspec +2 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +5 -2
  6. data/Gemfile.lock +19 -49
  7. data/LICENSE.txt +17 -18
  8. data/README.md +20 -1
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/example/indocker/bin/deploy +120 -0
  13. data/example/indocker/bin/remote/compile +72 -0
  14. data/example/indocker/bin/remote/run +66 -0
  15. data/example/indocker/bin/utils/configurations.rb +3 -0
  16. data/example/indocker/bounded_contexts/shared/ruby/Dockerfile +10 -0
  17. data/example/indocker/bounded_contexts/shared/ruby/container.rb +5 -0
  18. data/example/indocker/bounded_contexts/shared/ruby/image.rb +3 -0
  19. data/example/indocker/configurations/dev.rb +9 -0
  20. data/example/indocker/infrastructure/build_servers.rb +8 -0
  21. data/example/indocker/infrastructure/networks.rb +1 -0
  22. data/example/indocker/infrastructure/registries.rb +3 -0
  23. data/example/indocker/infrastructure/servers.rb +8 -0
  24. data/example/indocker/setup.rb +24 -0
  25. data/indocker.gemspec +27 -25
  26. data/lib/indocker.rb +437 -130
  27. data/lib/indocker/artifacts/git.rb +25 -0
  28. data/lib/indocker/build_context.rb +87 -0
  29. data/lib/indocker/build_context_helper.rb +109 -0
  30. data/lib/indocker/build_context_pool.rb +36 -0
  31. data/lib/indocker/build_server.rb +2 -0
  32. data/lib/indocker/colored_string.rb +33 -0
  33. data/lib/indocker/concerns/inspectable.rb +12 -0
  34. data/lib/indocker/configuration_deployer.rb +525 -0
  35. data/lib/indocker/configurations/configuration.rb +122 -0
  36. data/lib/indocker/configurations/configuration_builder.rb +250 -0
  37. data/lib/indocker/configurations/formatters/stdout.rb +36 -0
  38. data/lib/indocker/container_deployer.rb +73 -0
  39. data/lib/indocker/container_helper.rb +13 -0
  40. data/lib/indocker/container_runner.rb +23 -0
  41. data/lib/indocker/containers/container.rb +118 -0
  42. data/lib/indocker/containers/container_builder.rb +186 -0
  43. data/lib/indocker/containers/restart_policy.rb +36 -0
  44. data/lib/indocker/context_args.rb +43 -0
  45. data/lib/indocker/crontab_redeploy_rules_builder.rb +54 -0
  46. data/lib/indocker/deploy_context.rb +126 -0
  47. data/lib/indocker/deployment_checker.rb +121 -0
  48. data/lib/indocker/deployment_progress.rb +495 -0
  49. data/lib/indocker/docker.rb +87 -0
  50. data/lib/indocker/docker_run_args.rb +183 -0
  51. data/lib/indocker/env_file_helper.rb +13 -0
  52. data/lib/indocker/env_files/local.rb +8 -0
  53. data/lib/indocker/env_files/remote.rb +8 -0
  54. data/lib/indocker/hash_merger.rb +9 -0
  55. data/lib/indocker/images/image.rb +86 -0
  56. data/lib/indocker/images/image_builder.rb +98 -0
  57. data/lib/indocker/images/image_compiler.rb +68 -0
  58. data/lib/indocker/images/template_compiler.rb +15 -0
  59. data/lib/indocker/images/templates_compiler.rb +28 -0
  60. data/lib/indocker/images_compiler.rb +38 -0
  61. data/lib/indocker/indocker_helper.rb +9 -0
  62. data/lib/indocker/network.rb +12 -0
  63. data/lib/indocker/network_helper.rb +7 -0
  64. data/lib/indocker/registries/abstract.rb +17 -0
  65. data/lib/indocker/registries/local.rb +5 -0
  66. data/lib/indocker/registries/remote.rb +12 -0
  67. data/lib/indocker/repositories/abstract.rb +25 -0
  68. data/lib/indocker/repositories/clonner.rb +17 -0
  69. data/lib/indocker/repositories/git.rb +24 -0
  70. data/lib/indocker/repositories/local.rb +20 -0
  71. data/lib/indocker/repositories/no_sync.rb +20 -0
  72. data/lib/indocker/rsync.rb +52 -0
  73. data/lib/indocker/server.rb +20 -0
  74. data/lib/indocker/server_pool.rb +30 -0
  75. data/lib/indocker/shell.rb +60 -0
  76. data/lib/indocker/ssh_result_logger.rb +18 -0
  77. data/lib/indocker/ssh_session.rb +92 -0
  78. data/lib/indocker/version.rb +1 -1
  79. data/lib/indocker/volume_helper.rb +7 -0
  80. data/lib/indocker/volumes/external.rb +8 -0
  81. data/lib/indocker/volumes/local.rb +9 -0
  82. data/lib/indocker/volumes/repository.rb +9 -0
  83. metadata +107 -222
  84. data/bin/indocker +0 -9
  85. data/lib/indocker/application_initializer.rb +0 -19
  86. data/lib/indocker/cli.rb +0 -27
  87. data/lib/indocker/configs/config.rb +0 -147
  88. data/lib/indocker/configs/config_factory.rb +0 -37
  89. data/lib/indocker/configs/config_initializer.rb +0 -9
  90. data/lib/indocker/configs/locator.rb +0 -23
  91. data/lib/indocker/container/container_builder.rb +0 -29
  92. data/lib/indocker/container/container_directives_runner.rb +0 -54
  93. data/lib/indocker/container/container_dsl.rb +0 -83
  94. data/lib/indocker/container/container_evaluator.rb +0 -13
  95. data/lib/indocker/container/container_inspector.rb +0 -26
  96. data/lib/indocker/container/container_manager.rb +0 -122
  97. data/lib/indocker/container/container_metadata.rb +0 -112
  98. data/lib/indocker/container/container_metadata_factory.rb +0 -30
  99. data/lib/indocker/container/container_metadata_repository.rb +0 -27
  100. data/lib/indocker/directives/base.rb +0 -17
  101. data/lib/indocker/directives/container_directives/base.rb +0 -23
  102. data/lib/indocker/directives/container_directives/cmd.rb +0 -7
  103. data/lib/indocker/directives/container_directives/depends_on.rb +0 -7
  104. data/lib/indocker/directives/container_directives/env.rb +0 -7
  105. data/lib/indocker/directives/container_directives/env_file.rb +0 -7
  106. data/lib/indocker/directives/container_directives/expose.rb +0 -7
  107. data/lib/indocker/directives/container_directives/from.rb +0 -14
  108. data/lib/indocker/directives/container_directives/network.rb +0 -12
  109. data/lib/indocker/directives/container_directives/ports.rb +0 -15
  110. data/lib/indocker/directives/container_directives/ready.rb +0 -16
  111. data/lib/indocker/directives/container_directives/volume.rb +0 -23
  112. data/lib/indocker/directives/image_directives/base.rb +0 -27
  113. data/lib/indocker/directives/image_directives/cmd.rb +0 -19
  114. data/lib/indocker/directives/image_directives/copy.rb +0 -32
  115. data/lib/indocker/directives/image_directives/docker_cp.rb +0 -20
  116. data/lib/indocker/directives/image_directives/entrypoint.rb +0 -19
  117. data/lib/indocker/directives/image_directives/env.rb +0 -9
  118. data/lib/indocker/directives/image_directives/env_file.rb +0 -19
  119. data/lib/indocker/directives/image_directives/expose.rb +0 -9
  120. data/lib/indocker/directives/image_directives/from.rb +0 -36
  121. data/lib/indocker/directives/image_directives/registry.rb +0 -30
  122. data/lib/indocker/directives/image_directives/run.rb +0 -17
  123. data/lib/indocker/directives/image_directives/workdir.rb +0 -9
  124. data/lib/indocker/directives/partial.rb +0 -21
  125. data/lib/indocker/docker_api/container_config.rb +0 -121
  126. data/lib/indocker/docker_api/docker_api.rb +0 -207
  127. data/lib/indocker/dsl_context.rb +0 -21
  128. data/lib/indocker/envs/env_metadata.rb +0 -39
  129. data/lib/indocker/envs/loader.rb +0 -19
  130. data/lib/indocker/errors.rb +0 -21
  131. data/lib/indocker/git/git_api.rb +0 -32
  132. data/lib/indocker/git/git_helper.rb +0 -34
  133. data/lib/indocker/git/git_service.rb +0 -21
  134. data/lib/indocker/handlers/container_run.rb +0 -20
  135. data/lib/indocker/handlers/container_stop.rb +0 -17
  136. data/lib/indocker/handlers/performable.rb +0 -22
  137. data/lib/indocker/image/image_builder.rb +0 -54
  138. data/lib/indocker/image/image_dependencies_manager.rb +0 -47
  139. data/lib/indocker/image/image_directives_runner.rb +0 -99
  140. data/lib/indocker/image/image_dockerfile_builder.rb +0 -24
  141. data/lib/indocker/image/image_dsl.rb +0 -89
  142. data/lib/indocker/image/image_evaluator.rb +0 -21
  143. data/lib/indocker/image/image_helper.rb +0 -9
  144. data/lib/indocker/image/image_metadata.rb +0 -50
  145. data/lib/indocker/image/image_metadata_factory.rb +0 -31
  146. data/lib/indocker/image/image_metadata_repository.rb +0 -29
  147. data/lib/indocker/networks/network_metadata.rb +0 -9
  148. data/lib/indocker/networks/network_metadata_factory.rb +0 -9
  149. data/lib/indocker/networks/network_metadata_repository.rb +0 -34
  150. data/lib/indocker/partial/partial_metadata.rb +0 -8
  151. data/lib/indocker/partial/partial_metadata_repository.rb +0 -26
  152. data/lib/indocker/registry/registry_api.rb +0 -46
  153. data/lib/indocker/registry/registry_helper.rb +0 -20
  154. data/lib/indocker/registry/registry_service.rb +0 -28
  155. data/lib/indocker/utils/ioc_container.rb +0 -17
  156. data/lib/indocker/utils/logger.rb +0 -62
  157. data/lib/indocker/utils/logger_factory.rb +0 -13
  158. data/lib/indocker/utils/registry_authenticator.rb +0 -19
  159. data/lib/indocker/utils/render_namespace.rb +0 -11
  160. data/lib/indocker/utils/render_util.rb +0 -15
  161. data/lib/indocker/utils/string_utils.rb +0 -11
  162. data/lib/indocker/utils/tar_helper.rb +0 -40
  163. data/lib/indocker/utils/test_logger_factory.rb +0 -9
  164. data/lib/indocker/volumes/volume_metadata.rb +0 -9
  165. data/lib/indocker/volumes/volume_metadata_factory.rb +0 -9
  166. data/lib/indocker/volumes/volume_metadata_repository.rb +0 -34
  167. data/spec/example/.indocker/config.rb +0 -30
  168. data/spec/example/.indocker/images_and_containers.rb +0 -25
  169. data/spec/example/assets/index.css +0 -1
  170. data/spec/example/assets/index.js +0 -1
  171. data/spec/fixtures/spec.env +0 -2
  172. data/spec/indocker/configs/config_factory_spec.rb +0 -18
  173. data/spec/indocker/configs/config_spec.rb +0 -88
  174. data/spec/indocker/container/container_builder_spec.rb +0 -67
  175. data/spec/indocker/container/container_manager_spec.rb +0 -278
  176. data/spec/indocker/docker_api/container_config_spec.rb +0 -64
  177. data/spec/indocker/docker_api/docker_api_spec.rb +0 -112
  178. data/spec/indocker/handlers/container_run_spec.rb +0 -60
  179. data/spec/indocker/image/image_builder_spec.rb +0 -153
  180. data/spec/indocker/image/image_directives_runner_spec.rb +0 -141
  181. data/spec/indocker/image/image_dockerfile_builder_spec.rb +0 -25
  182. data/spec/indocker/image/image_evaluator_spec.rb +0 -85
  183. data/spec/spec_helper.rb +0 -68
@@ -0,0 +1,68 @@
1
+ require 'fileutils'
2
+
3
+ class Indocker::Images::ImageCompiler
4
+ BUILDS_DIR = 'image_build'.freeze
5
+ DOCKERIGNORE = <<~EOS
6
+ Dockerfile
7
+ .DS_Store
8
+ **/.DS_Store
9
+ **/*.log
10
+ **/*_spec.rb
11
+ node_modules
12
+ .vagrant
13
+ .vscode
14
+ tmp
15
+ logs
16
+ EOS
17
+
18
+ def initialize
19
+ @compiled_images = Hash.new(false)
20
+ end
21
+
22
+ def compile(build_context, image, skip_dependent)
23
+ if !skip_dependent
24
+ image.dependent_images.each do |dependent_image|
25
+ compile_image(build_context, dependent_image)
26
+ end
27
+ end
28
+
29
+ compile_image(build_context, image)
30
+ end
31
+
32
+ def compile_image(build_context, image)
33
+ return if @compiled_images[image]
34
+
35
+ compile_dir = File.join(build_context.configuration.build_dir, BUILDS_DIR, image.name.to_s)
36
+ FileUtils.rm_rf(compile_dir)
37
+ FileUtils.mkdir_p(compile_dir)
38
+
39
+ if image.build_context
40
+ templates_compiler = Indocker::Images::TemplatesCompiler.new
41
+
42
+ templates_compiler.compile(
43
+ templates_dir: image.build_context,
44
+ compile_dir: compile_dir,
45
+ context: build_context
46
+ )
47
+ end
48
+
49
+ compiler = Indocker::Images::TemplateCompiler.new
50
+
51
+ target_dockerfile = File.join(compile_dir, 'Dockerfile')
52
+ FileUtils.cp(image.dockerfile, target_dockerfile)
53
+ compiler.compile(target_dockerfile, build_context)
54
+
55
+ File
56
+ .join(compile_dir, '.dockerignore')
57
+ .tap { |_| File.write(_, Indocker.dockerignore.join("\n")) }
58
+
59
+ if image.before_build
60
+ image.before_build.call(build_context, compile_dir)
61
+ end
62
+
63
+ build_context.build_image(image, compile_dir)
64
+ build_context.set_compiled(image)
65
+
66
+ @compiled_images[image] = true
67
+ end
68
+ end
@@ -0,0 +1,15 @@
1
+ require 'erb'
2
+
3
+ class Indocker::Images::TemplateCompiler
4
+ def compile(path, context)
5
+ Indocker.logger.debug("compiling template file #{path}".grey)
6
+ template = File.read(path)
7
+ content = ERB.new(template).result(context.helper.get_binding)
8
+ File.write(path, content)
9
+ rescue Errno::EACCES => e
10
+ # do nothing for read only files
11
+ rescue => e
12
+ Indocker.logger.error("compilation failed for template file #{path}. #{e.inspect}")
13
+ raise e
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ require 'erb'
2
+ require 'fileutils'
3
+
4
+ class Indocker::Images::TemplatesCompiler
5
+ def compile(templates_dir:, compile_dir:, context:)
6
+ prepare_dirs!(templates_dir, compile_dir)
7
+
8
+ compiler = Indocker::Images::TemplateCompiler.new
9
+
10
+ Dir[File.join(compile_dir, '**/**')].each do |file|
11
+ next if !File.file?(file)
12
+ compiler.compile(file, context)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def prepare_dirs!(templates_dir, compile_dir)
19
+ Indocker.logger.debug("recreating directory #{compile_dir}".grey)
20
+ FileUtils.rm_rf(compile_dir)
21
+ FileUtils.mkdir_p(compile_dir)
22
+
23
+ Indocker.logger.debug("copy template files".grey)
24
+ Indocker.logger.debug(" from: #{templates_dir}".grey)
25
+ Indocker.logger.debug(" to: #{compile_dir}".grey)
26
+ FileUtils.cp_r(File.join(templates_dir, '.'), compile_dir)
27
+ end
28
+ end
@@ -0,0 +1,38 @@
1
+ class Indocker::ImagesCompiler
2
+ def initialize(logger)
3
+ @logger = logger
4
+ end
5
+
6
+ def compile(configuration:, image_list:, skip_dependent:)
7
+ preload_images(configuration, image_list)
8
+
9
+ build_context = Indocker::BuildContext.new(
10
+ configuration: configuration,
11
+ build_server: nil,
12
+ logger: Indocker.logger
13
+ )
14
+
15
+ image_compiler = Indocker::Images::ImageCompiler.new
16
+
17
+ image_list.each do |image_name|
18
+ image = Indocker.configuration.images.detect do |i|
19
+ i.name == image_name
20
+ end
21
+
22
+ image_compiler.compile(build_context, image, skip_dependent)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def preload_images(configuration, image_list)
29
+ image_list.each do |image_name|
30
+ image_path = Indocker.image_files.fetch(image_name) do
31
+ @logger.error("image not found :#{image_name} in configuration :#{configuration.name}")
32
+ exit 1
33
+ end
34
+
35
+ require image_path
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ class Indocker::IndockerHelper
2
+ INDOCKER_FOLDER = 'indocker'.freeze
3
+
4
+ class << self
5
+ def indocker_dir
6
+ File.join(Indocker.deploy_dir, INDOCKER_FOLDER)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ class Indocker::Network
2
+ attr_reader :name, :containers
3
+
4
+ def initialize(name)
5
+ @name = name
6
+ @containers = []
7
+ end
8
+
9
+ def add_container(container)
10
+ @containers.push(container) if !@containers.include?(container)
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class Indocker::NetworkHelper
2
+ class << self
3
+ def name(configuration_name, network)
4
+ "#{configuration_name}_#{network.name}"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ class Indocker::Registries::Abstract
2
+ include Indocker::Concerns::Inspectable
3
+
4
+ attr_reader :repository_name
5
+
6
+ def initialize(repository_name)
7
+ @repository_name = repository_name
8
+ end
9
+
10
+ def setup(*args)
11
+ self
12
+ end
13
+
14
+ def is_local?
15
+ self.is_a?(Indocker::Registries::Local)
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ class Indocker::Registries::Local < Indocker::Registries::Abstract
2
+ def url
3
+ ''
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ class Indocker::Registries::Remote < Indocker::Registries::Abstract
2
+ attr_reader :server_name
3
+
4
+ def setup(server_name)
5
+ @server_name = server_name
6
+ self
7
+ end
8
+
9
+ def url
10
+ @server_name
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ class Indocker::Repositories::Abstract
2
+ include Indocker::Concerns::Inspectable
3
+
4
+ attr_reader :name
5
+
6
+ def initialize(name)
7
+ @name = name
8
+ end
9
+
10
+ def setup(*args)
11
+ self
12
+ end
13
+
14
+ def is_local?
15
+ self.is_a?(Indocker::Repositories::Local)
16
+ end
17
+
18
+ def is_git?
19
+ self.is_a?(Indocker::Repositories::Git)
20
+ end
21
+
22
+ def is_no_sync?
23
+ self.is_a?(Indocker::Repositories::NoSync)
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ require 'net/ssh'
2
+
3
+ class Indocker::Repositories::Clonner
4
+ def initialize(configuration, logger)
5
+ @configuration = configuration
6
+ @logger = logger
7
+ end
8
+
9
+ def clone(session, repository)
10
+ raise ArgumenError.new("only git repositories should be clonned") if !repository.is_git?
11
+
12
+ session.exec!("rm -rf #{repository.clone_path} && mkdir -p #{repository.clone_path}")
13
+
14
+ git_command = "git clone -b #{repository.branch} --depth 1 #{repository.remote_url} #{repository.clone_path}"
15
+ session.exec!("ssh-agent bash -c 'ssh-add ~/.ssh/#{repository.ssh_key}; #{git_command}'")
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ class Indocker::Repositories::Git < Indocker::Repositories::Abstract
2
+ attr_reader :remote_url, :remote_name, :email, :password, :branch, :ssh_key
3
+
4
+ DEFAULT_SSH_KEY = "id_rsa"
5
+
6
+ def setup(remote_name:, remote_url:, email: nil, password: nil, branch:, clone_path: nil, ssh_key: DEFAULT_SSH_KEY)
7
+ @remote_name = remote_name
8
+ @remote_url = remote_url
9
+ @email = email
10
+ @password = password
11
+ @branch = branch
12
+ @clone_path = clone_path
13
+ @ssh_key = ssh_key
14
+ self
15
+ end
16
+
17
+ def project_name
18
+ @remote_url.split('/').last.gsub('.git', '')
19
+ end
20
+
21
+ def clone_path
22
+ @clone_path || "/tmp/#{Indocker.configuration.name}/repositories/git/#{project_name}/#{branch}"
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ class Indocker::Repositories::Local < Indocker::Repositories::Abstract
2
+ attr_reader :root_path
3
+
4
+ def setup(root_path)
5
+ @root_path = File.expand_path(root_path)
6
+ self
7
+ end
8
+
9
+ def project_name
10
+ root_path.split('/').last
11
+ end
12
+
13
+ def root_path
14
+ @root_path || (raise ArgumentError.new("root path was not set. Set it using setup method"))
15
+ end
16
+
17
+ def clone_path
18
+ "/tmp/#{Indocker.configuration.name}/repositories/local/#{project_name}"
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ class Indocker::Repositories::NoSync < Indocker::Repositories::Abstract
2
+ attr_reader :root_path
3
+
4
+ def setup(root_path)
5
+ @root_path = File.expand_path(root_path)
6
+ self
7
+ end
8
+
9
+ def project_name
10
+ root_path.split('/').last
11
+ end
12
+
13
+ def root_path
14
+ @root_path || (raise ArgumentError.new("root path was not set. Set it using setup method"))
15
+ end
16
+
17
+ def clone_path
18
+ root_path
19
+ end
20
+ end
@@ -0,0 +1,52 @@
1
+ require_relative 'shell'
2
+
3
+ class Indocker::Rsync
4
+ def self.local_sync(from, to, create_path: nil, raise_on_error: false, exclude: nil)
5
+ @session ||= Indocker::SshSession.new(
6
+ host: 'localhost',
7
+ user: nil,
8
+ port: nil,
9
+ logger: Indocker.logger
10
+ )
11
+
12
+ sync(@session, from, to, create_path: create_path, raise_on_error: raise_on_error, exclude: exclude)
13
+ end
14
+
15
+ def self.sync(session, from, to, create_path: nil, raise_on_error: false, exclude: nil)
16
+ if create_path
17
+ session.exec!("mkdir -p #{create_path}")
18
+ end
19
+
20
+ if session.local?
21
+ return if File.expand_path(to) == File.expand_path(from)
22
+
23
+ Indocker::Shell.command("rm -rf #{to}", Indocker.logger, raise_on_error: raise_on_error)
24
+
25
+ if Indocker::Shell.command_exist?("rsync")
26
+ sync_local_rsync(from, to, raise_on_error: raise_on_error, exclude: exclude)
27
+ else
28
+ Indocker.logger.debug("WARNING: exclude option skipped due to fallback to CP command")
29
+ sync_local_cp(from, to, raise_on_error: raise_on_error)
30
+ end
31
+ else
32
+ command = "rsync --delete-after -a -e 'ssh -p #{session.port}' #{from} #{session.user}@#{session.host}:#{to}"
33
+ Indocker.logger.debug("sync #{from} #{session.user}@#{session.host}:#{to}")
34
+ Indocker::Shell.command(command, Indocker.logger, raise_on_error: raise_on_error)
35
+ end
36
+ end
37
+
38
+ private
39
+ def self.sync_local_cp(from, to, raise_on_error:)
40
+ Indocker::Shell.command("cp -r #{from} #{to}", Indocker.logger, raise_on_error: raise_on_error)
41
+ end
42
+
43
+ def self.sync_local_rsync(from, to, raise_on_error:, exclude: nil)
44
+ options = []
45
+ options << " --exclude=#{exclude}" if exclude
46
+ # Add a trailing slash to directory to have behavior similar to CP command
47
+ if File.directory?(from) && !from.end_with?("/")
48
+ from = "#{from}/"
49
+ end
50
+ Indocker::Shell.command("rsync -a #{options.join(' ')} #{from} #{to}", Indocker.logger, raise_on_error: raise_on_error)
51
+ end
52
+ end
@@ -0,0 +1,20 @@
1
+ class Indocker::Server
2
+ include Indocker::Concerns::Inspectable
3
+
4
+ attr_reader :name, :host, :user, :port
5
+
6
+ def initialize(name:, host:, user:, port:)
7
+ @name = name
8
+ @host = host
9
+ @user = user
10
+ @port = port
11
+ end
12
+
13
+ def ==(value)
14
+ if value.is_a?(Indocker::Server)
15
+ @name == value.name
16
+ else
17
+ super
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
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 get(server)
16
+ Indocker::DeployContext.new(
17
+ logger: @logger,
18
+ configuration: @configuration,
19
+ server: server,
20
+ )
21
+ end
22
+
23
+ def each(&proc)
24
+ @contexts.each(&proc)
25
+ end
26
+
27
+ def close_sessions
28
+ @contexts.each(&:close_session)
29
+ end
30
+ end