indocker 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) 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 +17 -49
  7. data/LICENSE.txt +17 -18
  8. data/README.md +33 -1
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/indocker.gemspec +26 -25
  13. data/lib/indocker.rb +429 -130
  14. data/lib/indocker/artifacts/git.rb +25 -0
  15. data/lib/indocker/build_context.rb +87 -0
  16. data/lib/indocker/build_context_helper.rb +109 -0
  17. data/lib/indocker/build_context_pool.rb +36 -0
  18. data/lib/indocker/build_server.rb +2 -0
  19. data/lib/indocker/colored_string.rb +33 -0
  20. data/lib/indocker/concerns/inspectable.rb +12 -0
  21. data/lib/indocker/configuration_deployer.rb +525 -0
  22. data/lib/indocker/configurations/configuration.rb +122 -0
  23. data/lib/indocker/configurations/configuration_builder.rb +250 -0
  24. data/lib/indocker/configurations/formatters/stdout.rb +36 -0
  25. data/lib/indocker/container_deployer.rb +73 -0
  26. data/lib/indocker/container_helper.rb +13 -0
  27. data/lib/indocker/container_runner.rb +23 -0
  28. data/lib/indocker/containers/container.rb +118 -0
  29. data/lib/indocker/containers/container_builder.rb +186 -0
  30. data/lib/indocker/containers/restart_policy.rb +36 -0
  31. data/lib/indocker/context_args.rb +44 -0
  32. data/lib/indocker/crontab_redeploy_rules_builder.rb +54 -0
  33. data/lib/indocker/deploy_context.rb +126 -0
  34. data/lib/indocker/deployment_checker.rb +121 -0
  35. data/lib/indocker/deployment_progress.rb +495 -0
  36. data/lib/indocker/docker.rb +87 -0
  37. data/lib/indocker/docker_run_args.rb +175 -0
  38. data/lib/indocker/env_file_helper.rb +13 -0
  39. data/lib/indocker/env_files/local.rb +8 -0
  40. data/lib/indocker/env_files/remote.rb +8 -0
  41. data/lib/indocker/hash_merger.rb +9 -0
  42. data/lib/indocker/images/image.rb +86 -0
  43. data/lib/indocker/images/image_builder.rb +98 -0
  44. data/lib/indocker/images/image_compiler.rb +68 -0
  45. data/lib/indocker/images/template_compiler.rb +15 -0
  46. data/lib/indocker/images/templates_compiler.rb +28 -0
  47. data/lib/indocker/images_compiler.rb +38 -0
  48. data/lib/indocker/indocker_helper.rb +9 -0
  49. data/lib/indocker/network.rb +12 -0
  50. data/lib/indocker/network_helper.rb +7 -0
  51. data/lib/indocker/registries/abstract.rb +17 -0
  52. data/lib/indocker/registries/local.rb +5 -0
  53. data/lib/indocker/registries/remote.rb +12 -0
  54. data/lib/indocker/repositories/abstract.rb +25 -0
  55. data/lib/indocker/repositories/clonner.rb +15 -0
  56. data/lib/indocker/repositories/git.rb +21 -0
  57. data/lib/indocker/repositories/local.rb +20 -0
  58. data/lib/indocker/repositories/no_sync.rb +20 -0
  59. data/lib/indocker/rsync.rb +52 -0
  60. data/lib/indocker/server.rb +20 -0
  61. data/lib/indocker/server_pool.rb +30 -0
  62. data/lib/indocker/shell.rb +60 -0
  63. data/lib/indocker/ssh_result_logger.rb +18 -0
  64. data/lib/indocker/ssh_session.rb +92 -0
  65. data/lib/indocker/version.rb +1 -1
  66. data/lib/indocker/volume_helper.rb +7 -0
  67. data/lib/indocker/volumes/external.rb +8 -0
  68. data/lib/indocker/volumes/local.rb +9 -0
  69. data/lib/indocker/volumes/repository.rb +9 -0
  70. metadata +88 -230
  71. data/bin/indocker +0 -9
  72. data/lib/indocker/application_initializer.rb +0 -19
  73. data/lib/indocker/cli.rb +0 -27
  74. data/lib/indocker/configs/config.rb +0 -147
  75. data/lib/indocker/configs/config_factory.rb +0 -37
  76. data/lib/indocker/configs/config_initializer.rb +0 -9
  77. data/lib/indocker/configs/locator.rb +0 -23
  78. data/lib/indocker/container/container_builder.rb +0 -29
  79. data/lib/indocker/container/container_directives_runner.rb +0 -54
  80. data/lib/indocker/container/container_dsl.rb +0 -83
  81. data/lib/indocker/container/container_evaluator.rb +0 -13
  82. data/lib/indocker/container/container_inspector.rb +0 -26
  83. data/lib/indocker/container/container_manager.rb +0 -122
  84. data/lib/indocker/container/container_metadata.rb +0 -112
  85. data/lib/indocker/container/container_metadata_factory.rb +0 -30
  86. data/lib/indocker/container/container_metadata_repository.rb +0 -27
  87. data/lib/indocker/directives/base.rb +0 -17
  88. data/lib/indocker/directives/container_directives/base.rb +0 -23
  89. data/lib/indocker/directives/container_directives/cmd.rb +0 -7
  90. data/lib/indocker/directives/container_directives/depends_on.rb +0 -7
  91. data/lib/indocker/directives/container_directives/env.rb +0 -7
  92. data/lib/indocker/directives/container_directives/env_file.rb +0 -7
  93. data/lib/indocker/directives/container_directives/expose.rb +0 -7
  94. data/lib/indocker/directives/container_directives/from.rb +0 -14
  95. data/lib/indocker/directives/container_directives/network.rb +0 -12
  96. data/lib/indocker/directives/container_directives/ports.rb +0 -15
  97. data/lib/indocker/directives/container_directives/ready.rb +0 -16
  98. data/lib/indocker/directives/container_directives/volume.rb +0 -23
  99. data/lib/indocker/directives/image_directives/base.rb +0 -27
  100. data/lib/indocker/directives/image_directives/cmd.rb +0 -19
  101. data/lib/indocker/directives/image_directives/copy.rb +0 -32
  102. data/lib/indocker/directives/image_directives/docker_cp.rb +0 -20
  103. data/lib/indocker/directives/image_directives/entrypoint.rb +0 -19
  104. data/lib/indocker/directives/image_directives/env.rb +0 -9
  105. data/lib/indocker/directives/image_directives/env_file.rb +0 -19
  106. data/lib/indocker/directives/image_directives/expose.rb +0 -9
  107. data/lib/indocker/directives/image_directives/from.rb +0 -36
  108. data/lib/indocker/directives/image_directives/registry.rb +0 -30
  109. data/lib/indocker/directives/image_directives/run.rb +0 -17
  110. data/lib/indocker/directives/image_directives/workdir.rb +0 -9
  111. data/lib/indocker/directives/partial.rb +0 -21
  112. data/lib/indocker/docker_api/container_config.rb +0 -121
  113. data/lib/indocker/docker_api/docker_api.rb +0 -207
  114. data/lib/indocker/dsl_context.rb +0 -21
  115. data/lib/indocker/envs/env_metadata.rb +0 -39
  116. data/lib/indocker/envs/loader.rb +0 -19
  117. data/lib/indocker/errors.rb +0 -21
  118. data/lib/indocker/git/git_api.rb +0 -32
  119. data/lib/indocker/git/git_helper.rb +0 -34
  120. data/lib/indocker/git/git_service.rb +0 -21
  121. data/lib/indocker/handlers/container_run.rb +0 -20
  122. data/lib/indocker/handlers/container_stop.rb +0 -17
  123. data/lib/indocker/handlers/performable.rb +0 -22
  124. data/lib/indocker/image/image_builder.rb +0 -54
  125. data/lib/indocker/image/image_dependencies_manager.rb +0 -47
  126. data/lib/indocker/image/image_directives_runner.rb +0 -99
  127. data/lib/indocker/image/image_dockerfile_builder.rb +0 -24
  128. data/lib/indocker/image/image_dsl.rb +0 -89
  129. data/lib/indocker/image/image_evaluator.rb +0 -21
  130. data/lib/indocker/image/image_helper.rb +0 -9
  131. data/lib/indocker/image/image_metadata.rb +0 -50
  132. data/lib/indocker/image/image_metadata_factory.rb +0 -31
  133. data/lib/indocker/image/image_metadata_repository.rb +0 -29
  134. data/lib/indocker/networks/network_metadata.rb +0 -9
  135. data/lib/indocker/networks/network_metadata_factory.rb +0 -9
  136. data/lib/indocker/networks/network_metadata_repository.rb +0 -34
  137. data/lib/indocker/partial/partial_metadata.rb +0 -8
  138. data/lib/indocker/partial/partial_metadata_repository.rb +0 -26
  139. data/lib/indocker/registry/registry_api.rb +0 -46
  140. data/lib/indocker/registry/registry_helper.rb +0 -20
  141. data/lib/indocker/registry/registry_service.rb +0 -28
  142. data/lib/indocker/utils/ioc_container.rb +0 -17
  143. data/lib/indocker/utils/logger.rb +0 -62
  144. data/lib/indocker/utils/logger_factory.rb +0 -13
  145. data/lib/indocker/utils/registry_authenticator.rb +0 -19
  146. data/lib/indocker/utils/render_namespace.rb +0 -11
  147. data/lib/indocker/utils/render_util.rb +0 -15
  148. data/lib/indocker/utils/string_utils.rb +0 -11
  149. data/lib/indocker/utils/tar_helper.rb +0 -40
  150. data/lib/indocker/utils/test_logger_factory.rb +0 -9
  151. data/lib/indocker/volumes/volume_metadata.rb +0 -9
  152. data/lib/indocker/volumes/volume_metadata_factory.rb +0 -9
  153. data/lib/indocker/volumes/volume_metadata_repository.rb +0 -34
  154. data/spec/example/.indocker/config.rb +0 -30
  155. data/spec/example/.indocker/images_and_containers.rb +0 -25
  156. data/spec/example/assets/index.css +0 -1
  157. data/spec/example/assets/index.js +0 -1
  158. data/spec/fixtures/spec.env +0 -2
  159. data/spec/indocker/configs/config_factory_spec.rb +0 -18
  160. data/spec/indocker/configs/config_spec.rb +0 -88
  161. data/spec/indocker/container/container_builder_spec.rb +0 -67
  162. data/spec/indocker/container/container_manager_spec.rb +0 -278
  163. data/spec/indocker/docker_api/container_config_spec.rb +0 -64
  164. data/spec/indocker/docker_api/docker_api_spec.rb +0 -112
  165. data/spec/indocker/handlers/container_run_spec.rb +0 -60
  166. data/spec/indocker/image/image_builder_spec.rb +0 -153
  167. data/spec/indocker/image/image_directives_runner_spec.rb +0 -141
  168. data/spec/indocker/image/image_dockerfile_builder_spec.rb +0 -25
  169. data/spec/indocker/image/image_evaluator_spec.rb +0 -85
  170. data/spec/spec_helper.rb +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3bbc0745d6bfb718696fac49f13f32af04865472
4
- data.tar.gz: 09c9a04f604edc7ac4416e4c96d1b24aff88cecb
2
+ SHA256:
3
+ metadata.gz: 91f327fcfb82bd30d26d102d302226fbe32dfacd0c269985311b13606eca5d46
4
+ data.tar.gz: a2aca349450f5c5c6ebc383c71b676f36dc3e45ad9cd33ee0fabafc17bc819fd
5
5
  SHA512:
6
- metadata.gz: 5063bd4bef44009433c038cc6f090aa7d89f3fc233e9f8cfee1955013aad4fa7c84c9b5110c071240b5b640ed1cb9bbaa4f6738cb5b5437dc2cf2adb9aaae661
7
- data.tar.gz: 7550ca05ad5e981a452a031de277583edef63a0456c9dca770cd6525239656ed76ced297ec5c831d85f6689c2d8800a28df62a5552d586c6ca7283ee42a63e59
6
+ metadata.gz: 8d3ec5cbb23b2e2e183f87f04d37dd4bd00e847f805d4864d78c88d721871e6b38082b19523321a77f12a4b9839db0e00a5588bc394e240df0369d59386f1b34
7
+ data.tar.gz: 27477f7cffd4bec8b3ad4abf3c60bc93af5779ee88f97440363bf238d2e04160e4509cf2da3960f5c528c77d3c79f92ce85e94b3ccd64b0aca4559dbdc444de9
data/.gitignore CHANGED
@@ -1,3 +1,11 @@
1
+ *.gem
2
+ /.bundle/
3
+ /.yardoc
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
1
10
  .DS_Store
2
- .byebug_history
3
- tmp/*
11
+ .rspec_status
data/.rspec CHANGED
@@ -1 +1,3 @@
1
+ --format documentation
2
+ --color
1
3
  --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.3.1
7
+ before_install: gem install bundler -v 1.17.3
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
- gemspec
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in indocker.gemspec
6
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,67 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- indocker (0.0.5)
5
- byebug
6
- colorize
7
- docker-api
8
- docker_registry2
9
- git
10
- smart_ioc
11
- thor
4
+ indocker (0.1.0)
12
5
 
13
6
  GEM
14
7
  remote: https://rubygems.org/
15
8
  specs:
16
- byebug (9.1.0)
17
- colorize (0.8.1)
18
9
  diff-lcs (1.3)
19
- docker-api (1.34.0)
20
- excon (>= 0.47.0)
21
- multi_json
22
- docker_registry2 (1.3.0)
23
- rest-client (>= 1.8.0)
24
- domain_name (0.5.20170404)
25
- unf (>= 0.0.5, < 1.0.0)
26
- excon (0.59.0)
27
- git (1.3.0)
28
- http-cookie (1.0.3)
29
- domain_name (~> 0.5)
30
- mime-types (3.1)
31
- mime-types-data (~> 3.2015)
32
- mime-types-data (3.2016.0521)
33
- multi_json (1.12.2)
34
- netrc (0.11.0)
35
- rest-client (2.0.2)
36
- http-cookie (>= 1.0.2, < 2.0)
37
- mime-types (>= 1.16, < 4.0)
38
- netrc (~> 0.8)
39
- rspec (3.7.0)
40
- rspec-core (~> 3.7.0)
41
- rspec-expectations (~> 3.7.0)
42
- rspec-mocks (~> 3.7.0)
43
- rspec-core (3.7.0)
44
- rspec-support (~> 3.7.0)
45
- rspec-expectations (3.7.0)
10
+ rake (10.5.0)
11
+ rspec (3.9.0)
12
+ rspec-core (~> 3.9.0)
13
+ rspec-expectations (~> 3.9.0)
14
+ rspec-mocks (~> 3.9.0)
15
+ rspec-core (3.9.1)
16
+ rspec-support (~> 3.9.1)
17
+ rspec-expectations (3.9.0)
46
18
  diff-lcs (>= 1.2.0, < 2.0)
47
- rspec-support (~> 3.7.0)
48
- rspec-mocks (3.7.0)
19
+ rspec-support (~> 3.9.0)
20
+ rspec-mocks (3.9.1)
49
21
  diff-lcs (>= 1.2.0, < 2.0)
50
- rspec-support (~> 3.7.0)
51
- rspec-support (3.7.0)
52
- smart_ioc (0.2.1)
53
- thor (0.20.0)
54
- unf (0.1.4)
55
- unf_ext
56
- unf_ext (0.0.7.4)
22
+ rspec-support (~> 3.9.0)
23
+ rspec-support (3.9.2)
57
24
 
58
25
  PLATFORMS
59
26
  ruby
60
27
 
61
28
  DEPENDENCIES
62
- byebug
29
+ bundler (~> 1.17)
63
30
  indocker!
64
- rspec
31
+ rake (~> 10.0)
32
+ rspec (~> 3.0)
65
33
 
66
34
  BUNDLED WITH
67
- 1.16.0.pre.3
35
+ 1.17.3
data/LICENSE.txt CHANGED
@@ -1,22 +1,21 @@
1
- Copyright (c) 2016-2017 Droidlabs
1
+ The MIT License (MIT)
2
2
 
3
- MIT License
3
+ Copyright (c) 2020 TODO: Write your name
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
12
11
 
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
15
14
 
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1 +1,33 @@
1
- DSL for build, run and deploy docker containers
1
+ # InDocker
2
+
3
+ Docker Containers Deployment
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'indocker'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install indocker
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Development
26
+
27
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
28
+
29
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
30
+
31
+ ## License
32
+
33
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "indocker"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/indocker.gemspec CHANGED
@@ -1,28 +1,29 @@
1
- require_relative 'lib/indocker/version'
2
1
 
3
- Gem::Specification.new do |s|
4
- s.name = 'indocker'
5
- s.version = Indocker::VERSION
6
- s.summary = "Indocker"
7
- s.description = "DSL for build, run and deploy docker containers"
8
- s.authors = ["Droid Labs"]
9
- s.email = 'hello@droidlabs.pro'
10
-
11
- s.files = `git ls-files`.split($/)
12
- s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
13
- s.test_files = s.files.grep(%r{^(spec)/})
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "indocker/version"
14
5
 
15
- s.add_development_dependency "byebug"
16
- s.add_development_dependency "rspec"
17
-
18
- s.add_dependency "smart_ioc"
19
- s.add_dependency "docker-api"
20
- s.add_dependency "docker_registry2"
21
- s.add_dependency "thor"
22
- s.add_dependency "colorize"
23
- s.add_dependency "git"
24
- s.add_dependency "byebug" # TODO: remove after release
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "indocker"
8
+ spec.version = Indocker::VERSION
9
+ spec.authors = ["Ruslan Gatiyatov", "Iskander Khaziev"]
10
+ spec.email = ["gvalmon@gmail.com"]
25
11
 
26
- s.homepage = 'https://github.com/droidlabs/indocker'
27
- s.license = 'MIT'
28
- end
12
+ spec.summary = %q{Docker Containers Deployment}
13
+ spec.description = %q{Docker Containers Deployment}
14
+ spec.homepage = "https://github.com/ArtStation/indocker"
15
+ spec.license = "MIT"
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.17"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ end
data/lib/indocker.rb CHANGED
@@ -1,155 +1,454 @@
1
- require 'smart_ioc'
1
+ require "indocker/version"
2
+ require 'logger'
3
+ $LOAD_PATH << File.join(__dir__, 'indocker')
2
4
 
3
- require 'byebug' # TODO: remove after release
5
+ require_relative 'indocker/colored_string'
4
6
 
5
- SmartIoC.find_package_beans(:indocker, __dir__)
6
- SmartIoC.set_load_proc do |location|
7
- require(location)
8
- end
7
+ module Indocker
8
+ module Repositories
9
+ autoload :Abstract, 'repositories/abstract'
10
+ autoload :Git, 'repositories/git'
11
+ autoload :Local, 'repositories/local'
12
+ autoload :NoSync, 'repositories/no_sync'
13
+ autoload :Clonner, 'repositories/clonner'
14
+ end
9
15
 
10
- require 'indocker/version'
11
-
12
- require 'indocker/image/image_helper'
13
-
14
- require 'indocker/errors'
15
- require 'indocker/cli'
16
- require 'indocker/dsl_context'
17
-
18
- require 'indocker/docker_api/docker_api'
19
- require 'indocker/docker_api/container_config'
20
-
21
- require 'indocker/configs/config'
22
- require 'indocker/configs/config_factory'
23
- require 'indocker/configs/locator'
24
- require 'indocker/configs/config_initializer'
25
-
26
- require 'indocker/utils/logger'
27
- require 'indocker/utils/logger_factory'
28
- require 'indocker/utils/test_logger_factory'
29
- require 'indocker/utils/tar_helper'
30
- require 'indocker/utils/string_utils'
31
- require 'indocker/utils/registry_authenticator'
32
- require 'indocker/utils/render_util'
33
- require 'indocker/utils/render_namespace'
34
-
35
- require 'indocker/handlers/performable'
36
- require 'indocker/handlers/container_run'
37
- require 'indocker/handlers/container_stop'
38
-
39
- require 'indocker/utils/ioc_container'
40
-
41
- require 'indocker/envs/env_metadata'
42
- require 'indocker/envs/loader'
43
-
44
- require 'indocker/registry/registry_helper'
45
- require 'indocker/registry/registry_service'
46
- require 'indocker/registry/registry_api'
47
-
48
- require 'indocker/image/image_metadata'
49
- require 'indocker/image/image_metadata_factory'
50
- require 'indocker/image/image_dsl'
51
- require 'indocker/image/image_metadata_repository'
52
- require 'indocker/image/image_builder'
53
- require 'indocker/image/image_dependencies_manager'
54
- require 'indocker/image/image_evaluator'
55
- require 'indocker/image/image_dockerfile_builder'
56
- require 'indocker/image/image_directives_runner'
57
-
58
- require 'indocker/container/container_metadata'
59
- require 'indocker/container/container_metadata_repository'
60
- require 'indocker/container/container_metadata_factory'
61
- require 'indocker/container/container_manager'
62
- require 'indocker/container/container_evaluator'
63
- require 'indocker/container/container_dsl'
64
- require 'indocker/container/container_builder'
65
- require 'indocker/container/container_directives_runner'
66
-
67
- require 'indocker/partial/partial_metadata'
68
- require 'indocker/partial/partial_metadata_repository'
69
-
70
- require 'indocker/directives/base'
71
- require 'indocker/directives/partial'
72
-
73
- require 'indocker/networks/network_metadata'
74
- require 'indocker/networks/network_metadata_factory'
75
- require 'indocker/networks/network_metadata_repository'
76
-
77
- require 'indocker/volumes/volume_metadata'
78
- require 'indocker/volumes/volume_metadata_factory'
79
- require 'indocker/volumes/volume_metadata_repository'
80
-
81
- require 'indocker/directives/image_directives/base'
82
- require 'indocker/directives/image_directives/cmd'
83
- require 'indocker/directives/image_directives/entrypoint'
84
- require 'indocker/directives/image_directives/env'
85
- require 'indocker/directives/image_directives/copy'
86
- require 'indocker/directives/image_directives/from'
87
- require 'indocker/directives/image_directives/run'
88
- require 'indocker/directives/image_directives/workdir'
89
- require 'indocker/directives/image_directives/expose'
90
- require 'indocker/directives/image_directives/env_file'
91
- require 'indocker/directives/image_directives/docker_cp'
92
- require 'indocker/directives/image_directives/registry'
93
-
94
- require 'indocker/directives/container_directives/base'
95
- require 'indocker/directives/container_directives/from'
96
- require 'indocker/directives/container_directives/network'
97
- require 'indocker/directives/container_directives/ports'
98
- require 'indocker/directives/container_directives/expose'
99
- require 'indocker/directives/container_directives/depends_on'
100
- require 'indocker/directives/container_directives/ready'
101
- require 'indocker/directives/container_directives/cmd'
102
- require 'indocker/directives/container_directives/volume'
103
- require 'indocker/directives/container_directives/env_file'
104
- require 'indocker/directives/container_directives/env'
105
-
106
-
107
- require 'indocker/git/git_helper'
16
+ module Configurations
17
+ autoload :Configuration, 'configurations/configuration'
18
+ autoload :ConfigurationBuilder, 'configurations/configuration_builder'
108
19
 
109
- module Indocker
110
- DOCKERFILE_NAME = 'Dockerfile'
20
+ module Formatters
21
+ autoload :Stdout, 'configurations/formatters/stdout'
22
+ end
23
+ end
24
+
25
+ module Registries
26
+ autoload :Abstract, 'registries/abstract'
27
+ autoload :Local, 'registries/local'
28
+ autoload :Remote, 'registries/remote'
29
+ end
30
+
31
+ module Concerns
32
+ autoload :Inspectable, 'concerns/inspectable'
33
+ end
34
+
35
+ module Images
36
+ autoload :Image, 'images/image'
37
+ autoload :ImageBuilder, 'images/image_builder'
38
+ autoload :ImageCompiler, 'images/image_compiler'
39
+ autoload :TemplateCompiler, 'images/template_compiler'
40
+ autoload :TemplatesCompiler, 'images/templates_compiler'
41
+ end
42
+
43
+ module Containers
44
+ autoload :Container, 'containers/container'
45
+ autoload :ContainerBuilder, 'containers/container_builder'
46
+ autoload :RestartPolicy, 'containers/restart_policy'
47
+ end
48
+
49
+ module Volumes
50
+ autoload :Local, 'volumes/local'
51
+ autoload :External, 'volumes/external'
52
+ autoload :Repository, 'volumes/repository'
53
+ end
54
+
55
+ module EnvFiles
56
+ autoload :Local, 'env_files/local'
57
+ autoload :Remote, 'env_files/remote'
58
+ end
59
+
60
+ module Artifacts
61
+ autoload :Git, 'artifacts/git'
62
+ end
63
+
64
+ autoload :HashMerger, 'hash_merger'
65
+ autoload :BuildServer, 'build_server'
66
+ autoload :Server, 'server'
67
+ autoload :ConfigurationDeployer, 'configuration_deployer'
68
+ autoload :SshSession, 'ssh_session'
69
+ autoload :BuildContextPool, 'build_context_pool'
70
+ autoload :BuildContext, 'build_context'
71
+ autoload :BuildContextHelper, 'build_context_helper'
72
+ autoload :Shell, 'shell'
73
+ autoload :Docker, 'docker'
74
+ autoload :ContextArgs, 'context_args'
75
+ autoload :Network, 'network'
76
+ autoload :ContainerDeployer, 'container_deployer'
77
+ autoload :ServerPool, 'server_pool'
78
+ autoload :DeployContext, 'deploy_context'
79
+ autoload :ContainerHelper, 'container_helper'
80
+ autoload :DockerRunArgs, 'docker_run_args'
81
+ autoload :VolumeHelper, 'volume_helper'
82
+ autoload :NetworkHelper, 'network_helper'
83
+ autoload :Rsync, 'rsync'
84
+ autoload :EnvFileHelper, 'env_file_helper'
85
+ autoload :IndockerHelper, 'indocker_helper'
86
+ autoload :ImagesCompiler, 'images_compiler'
87
+ autoload :ContainerRunner, 'container_runner'
88
+ autoload :SshResultLogger, 'ssh_result_logger'
89
+ autoload :DeploymentProgress, 'deployment_progress'
90
+ autoload :DeploymentChecker, 'deployment_checker'
91
+ autoload :CrontabRedeployRulesBuilder, 'crontab_redeploy_rules_builder'
111
92
 
112
93
  class << self
113
- def define_image(name, &definition)
114
- ioc.image_metadata_repository.put(
115
- ioc.image_metadata_factory.create(name, &definition)
116
- )
94
+ def set_export_command(command)
95
+ @export_command = command
117
96
  end
118
97
 
119
- def define_container(name, attach: false, &definition)
120
- ioc.container_metadata_repository.put(
121
- ioc.container_metadata_factory.create(name, attach: attach, &definition)
122
- )
98
+ def export_command
99
+ @export_command
123
100
  end
124
101
 
125
- def define_partial(name, &definition)
126
- ioc.partial_metadata_repository.put(
127
- Indocker::PartialMetadata.new(name, &definition)
128
- )
102
+ def set_deploy_dir(val)
103
+ @deploy_dir = val
104
+ end
105
+
106
+ def set_root_dir(val)
107
+ @root_dir = val
108
+ end
109
+
110
+ def deploy_dir
111
+ if @deploy_dir
112
+ @deploy_dir
113
+ else
114
+ raise ArgumentError.new("deploy dir was not specified")
115
+ end
116
+ end
117
+
118
+ def root_dir
119
+ if @root_dir
120
+ File.expand_path(@root_dir)
121
+ else
122
+ raise ArgumentError.new("root dir was not specified")
123
+ end
124
+ end
125
+
126
+ def add_artifact(artifact)
127
+ artifacts.push(artifact)
128
+ end
129
+
130
+ def add_repository(repository)
131
+ if !repository.is_a?(Indocker::Repositories::Abstract)
132
+ raise ArgumentError.new("should be an instance of Indocker::Repositories::Abstract, got: #{repository.inspect}")
133
+ end
134
+
135
+ repositories.push(repository)
136
+ end
137
+
138
+ def add_registry(registry)
139
+ if !registry.is_a?(Indocker::Registries::Abstract)
140
+ raise ArgumentError.new("should be an instance of Indocker::Registries::Abstract, got: #{registry.inspect}")
141
+ end
142
+
143
+ registries.push(registry)
144
+ end
145
+
146
+ def add_server(server)
147
+ if !server.is_a?(Indocker::Server)
148
+ raise ArgumentError.new("should be an instance of Indocker::Server, got: #{server.inspect}")
149
+ end
150
+
151
+ existing = servers.detect {|s| s == server}
152
+
153
+ if existing
154
+ raise ArgumentError.new("server with name #{server.name} was already defined")
155
+ end
156
+
157
+ servers.push(server)
129
158
  end
130
159
 
131
160
  def define_network(name)
132
- ioc.network_metadata_repository.put(
133
- ioc.network_metadata_factory.create(name)
161
+ if networks.detect {|n| n.name == name}
162
+ raise ArgumentError.new("network :#{name} was already defined")
163
+ end
164
+
165
+ networks.push(Indocker::Network.new(name))
166
+ end
167
+
168
+ def container_files
169
+ @container_files || (raise ArgumentError.new("container files were not found. Set bounded contexts dir"))
170
+ end
171
+
172
+ def image_files
173
+ @image_files || (raise ArgumentError.new("image files were not found. Set bounded contexts dir"))
174
+ end
175
+
176
+ def set_bounded_contexts_dir(path)
177
+ @container_files = {}
178
+
179
+ Dir[File.join(path, '**/container.rb')].map do |path|
180
+ name = path.gsub('/container.rb', '').split('/').last.to_sym
181
+ @container_files[name] = path
182
+ end
183
+
184
+ @image_files = {}
185
+
186
+ Dir[File.join(path, '**/image.rb')].map do |path|
187
+ name = path.gsub('/image.rb', '').split('/').last.to_sym
188
+ @image_files[name] = path
189
+ end
190
+ end
191
+
192
+ def define_env_file(env_file)
193
+ if env_files.detect {|ef| ef.name == env_file.name}
194
+ Indocker.logger.error("env file :#{env_file.name} was already defined")
195
+ exit 1
196
+ end
197
+
198
+ env_files.push(env_file)
199
+ end
200
+
201
+ def define_volume(volume)
202
+ if volumes.detect { |v| v.name == volume.name}
203
+ raise ArgumentError.new("volume :#{volume.name} was already defined")
204
+ end
205
+
206
+ volumes.push(volume)
207
+ end
208
+
209
+ def add_build_server(build_server)
210
+ if !build_server.is_a?(Indocker::BuildServer)
211
+ raise ArgumentError.new("should be an instance of Indocker::BuildServer, got: #{build_server.inspect}")
212
+ end
213
+
214
+ existing = build_servers.detect {|s| s == build_server}
215
+
216
+ if existing
217
+ raise ArgumentError.new("build server with name #{build_server.name} was already defined")
218
+ end
219
+
220
+ build_servers.push(build_server)
221
+ end
222
+
223
+ def repositories
224
+ @repositories ||= []
225
+ end
226
+
227
+ def registries
228
+ @registries ||= []
229
+ end
230
+
231
+ def networks
232
+ @networks ||= []
233
+ end
234
+
235
+ def volumes
236
+ @volumes ||= []
237
+ end
238
+
239
+ def servers
240
+ @servers ||= []
241
+ end
242
+
243
+ def artifacts
244
+ @artifacts ||= []
245
+ end
246
+
247
+ def build_servers
248
+ @build_servers ||= []
249
+ end
250
+
251
+ def env_files
252
+ @env_files ||= []
253
+ end
254
+
255
+ def configuration
256
+ @configuration || (raise ArgumentError.new("no configuration provided"))
257
+ end
258
+
259
+ def images
260
+ @images ||= []
261
+ end
262
+
263
+ def containers
264
+ @containers ||= []
265
+ end
266
+
267
+ def build_configuration(name)
268
+ builder = Indocker::Configurations::ConfigurationBuilder.new(
269
+ name: name,
270
+ repositories: repositories,
271
+ registries: registries,
272
+ servers: servers,
273
+ build_servers: build_servers,
274
+ volumes: volumes,
275
+ networks: networks,
276
+ env_files: env_files,
277
+ containers: containers,
134
278
  )
279
+
280
+ @configuration = builder.configuration
281
+ builder
135
282
  end
136
283
 
137
- def define_volume(name)
138
- ioc.volume_metadata_repository.put(
139
- ioc.volume_metadata_factory.create(name)
284
+ def define_image(name)
285
+ path = caller[0].split(':').first
286
+
287
+ if !(path =~ /\/image.rb$/)
288
+ Indocker.logger.error("image :#{name} should be defined in image.rb file")
289
+ exit 1
290
+ end
291
+
292
+ builder = Indocker::Images::ImageBuilder.new(
293
+ name: name,
294
+ configuration: configuration,
295
+ dir: path.split('image.rb').first
140
296
  )
297
+
298
+ images.push(builder.image)
299
+
300
+ builder
141
301
  end
142
302
 
143
- def setup(&block)
144
- ioc.config.set(&block)
303
+ def define_container(name)
304
+ builder = Indocker::Containers::ContainerBuilder.new(
305
+ name: name,
306
+ configuration: configuration,
307
+ )
308
+
309
+ containers.push(builder.container)
310
+ builder
145
311
  end
146
312
 
147
- def cache_dir(dir = nil)
148
- ioc.config.git.cache_dir(Pathname.new(dir))
313
+ def deploy(containers: [], skip_tags: [], tags: [], skip_dependent: false, skip_containers: [], servers: [], skip_build: false, force_restart: false, skip_force_restart: [], auto_confirm: false, require_confirmation: false)
314
+ Indocker::ConfigurationDeployer
315
+ .new(Indocker.logger)
316
+ .run(
317
+ configuration: configuration,
318
+ deploy_containers: containers,
319
+ deploy_tags: tags,
320
+ skip_dependent: skip_dependent,
321
+ skip_containers: skip_containers,
322
+ servers: servers,
323
+ skip_build: skip_build,
324
+ force_restart: force_restart,
325
+ skip_tags: skip_tags,
326
+ skip_force_restart: skip_force_restart,
327
+ auto_confirm: auto_confirm,
328
+ require_confirmation: require_confirmation,
329
+ )
149
330
  end
150
331
 
151
- def build_dir(dir = nil)
152
- ioc.config.build_dir(Pathname.new(dir))
332
+ def check(servers: [])
333
+ Indocker::DeploymentChecker
334
+ .new(Indocker.logger)
335
+ .run(
336
+ configuration: configuration,
337
+ servers: servers,
338
+ )
339
+ end
340
+
341
+ def launched?(contaner_name, servers: [])
342
+ silent_logger = Logger.new(File.open(File::NULL, "w"))
343
+ Indocker::DeploymentChecker
344
+ .new(silent_logger, silent_logger)
345
+ .launched?(
346
+ contaner_name,
347
+ configuration: configuration,
348
+ servers: servers,
349
+ )
350
+ end
351
+
352
+ def compile(images:, skip_dependent:)
353
+ Indocker::ImagesCompiler
354
+ .new(Indocker.logger)
355
+ .compile(
356
+ configuration: configuration,
357
+ image_list: images,
358
+ skip_dependent: skip_dependent,
359
+ )
360
+ end
361
+
362
+ def run(container_name, force_restart)
363
+ Indocker::ContainerRunner
364
+ .new(Indocker.logger)
365
+ .run(
366
+ configuration: configuration,
367
+ container_name: container_name,
368
+ force_restart: force_restart
369
+ )
370
+ end
371
+
372
+ def global_build_args
373
+ Indocker::ContextArgs.new(nil, configuration.global_build_args, nil)
374
+ end
375
+
376
+ def helper
377
+ Indocker::BuildContextHelper.new(Indocker.configuration, nil)
378
+ end
379
+
380
+ def logger
381
+ @logger ||= begin
382
+ logger = if @log_level == Logger::DEBUG
383
+ Logger.new(STDOUT)
384
+ else
385
+ Logger.new(File.open(File::NULL, "w"))
386
+ end
387
+
388
+ logger.level = @log_level || Logger::INFO
389
+
390
+ logger.formatter = proc do |severity, datetime, progname, msg|
391
+ level = Logger::SEV_LABEL.index(severity)
392
+
393
+ severity = case level
394
+ when Logger::INFO
395
+ severity.green
396
+ when Logger::WARN
397
+ severity.purple
398
+ when Logger::DEBUG
399
+ severity.yellow
400
+ when Logger::ERROR
401
+ severity.red
402
+ when Logger::FATAL
403
+ severity.red
404
+ else
405
+ severity
406
+ end
407
+
408
+ severity = severity.downcase
409
+
410
+ if logger.debug?
411
+ if msg == "{timestamp}"
412
+ ""
413
+ else
414
+ "#{datetime.strftime("%Y/%m/%d %H:%M:%S")} #{severity}: #{msg}\n"
415
+ end
416
+ else
417
+ # Use a nicer logging for not debug
418
+ if msg == "{timestamp}"
419
+ datetime.strftime("%Y/%m/%d %H:%M:%S\n").grey
420
+ else
421
+ " #{severity}: #{msg}\n"
422
+ end
423
+ end
424
+ end
425
+
426
+ logger
427
+ end
428
+ end
429
+
430
+ def set_log_level(level)
431
+ @log_level = level
432
+ end
433
+
434
+ def set_dockerignore(ignore_list)
435
+ @dockerignore = ignore_list
436
+ end
437
+
438
+ def dockerignore
439
+ @dockerignore || []
440
+ end
441
+
442
+ def build_helper(&proc)
443
+ Indocker::BuildContextHelper.class_exec(&proc)
444
+ end
445
+
446
+ def set_configuration_name(name)
447
+ @configuration_name = name
448
+ end
449
+
450
+ def configuration_name
451
+ @configuration_name || (raise ArgumentError.new("configuration was not specified"))
153
452
  end
154
453
  end
155
- end
454
+ end