kontena-cli 1.4.0.pre6 → 1.4.0.pre7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/VERSION +1 -1
  4. data/bin/kontena +1 -1
  5. data/kontena-cli.gemspec +3 -3
  6. data/lib/kontena/cli/certificate/authorize_command.rb +67 -6
  7. data/lib/kontena/cli/certificate/get_command.rb +7 -0
  8. data/lib/kontena/cli/certificate/list_command.rb +75 -0
  9. data/lib/kontena/cli/certificate/register_command.rb +13 -2
  10. data/lib/kontena/cli/certificate/request_command.rb +20 -0
  11. data/lib/kontena/cli/certificate/show_command.rb +19 -0
  12. data/lib/kontena/cli/certificate_command.rb +4 -1
  13. data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
  14. data/lib/kontena/cli/common.rb +21 -33
  15. data/lib/kontena/cli/etcd/health_command.rb +21 -27
  16. data/lib/kontena/cli/helpers/exec_helper.rb +15 -6
  17. data/lib/kontena/cli/helpers/health_helper.rb +12 -0
  18. data/lib/kontena/cli/helpers/log_helper.rb +2 -2
  19. data/lib/kontena/cli/helpers/time_helper.rb +29 -0
  20. data/lib/kontena/cli/master/init_cloud_command.rb +19 -0
  21. data/lib/kontena/cli/master/list_command.rb +1 -1
  22. data/lib/kontena/cli/master/ssh_command.rb +3 -1
  23. data/lib/kontena/cli/master/use_command.rb +1 -2
  24. data/lib/kontena/cli/node_command.rb +1 -0
  25. data/lib/kontena/cli/nodes/health_command.rb +28 -13
  26. data/lib/kontena/cli/nodes/list_command.rb +19 -3
  27. data/lib/kontena/cli/nodes/show_command.rb +4 -2
  28. data/lib/kontena/cli/nodes/ssh_command.rb +5 -2
  29. data/lib/kontena/cli/nodes/update_command.rb +2 -0
  30. data/lib/kontena/cli/plugins/install_command.rb +11 -8
  31. data/lib/kontena/cli/plugins/list_command.rb +5 -3
  32. data/lib/kontena/cli/plugins/search_command.rb +4 -2
  33. data/lib/kontena/cli/plugins/show_command.rb +17 -0
  34. data/lib/kontena/cli/plugins/uninstall_command.rb +9 -13
  35. data/lib/kontena/cli/registry/create_command.rb +1 -1
  36. data/lib/kontena/cli/services/create_command.rb +6 -0
  37. data/lib/kontena/cli/services/services_helper.rb +33 -6
  38. data/lib/kontena/cli/services/update_command.rb +6 -0
  39. data/lib/kontena/cli/stacks/build_command.rb +3 -3
  40. data/lib/kontena/cli/stacks/common.rb +105 -90
  41. data/lib/kontena/cli/stacks/deploy_command.rb +7 -3
  42. data/lib/kontena/cli/stacks/install_command.rb +39 -6
  43. data/lib/kontena/cli/stacks/list_command.rb +36 -4
  44. data/lib/kontena/cli/stacks/logs_command.rb +9 -2
  45. data/lib/kontena/cli/stacks/registry/pull_command.rb +2 -2
  46. data/lib/kontena/cli/stacks/registry/push_command.rb +20 -9
  47. data/lib/kontena/cli/stacks/registry/remove_command.rb +4 -4
  48. data/lib/kontena/cli/stacks/registry/show_command.rb +4 -4
  49. data/lib/kontena/cli/stacks/remove_command.rb +27 -1
  50. data/lib/kontena/cli/stacks/service_generator.rb +12 -2
  51. data/lib/kontena/cli/stacks/show_command.rb +35 -5
  52. data/lib/kontena/cli/stacks/stack_name.rb +71 -0
  53. data/lib/kontena/cli/stacks/upgrade_command.rb +127 -14
  54. data/lib/kontena/cli/stacks/validate_command.rb +38 -10
  55. data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
  56. data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -2
  57. data/lib/kontena/cli/stacks/yaml/reader.rb +211 -185
  58. data/lib/kontena/cli/stacks/yaml/service_extender.rb +6 -12
  59. data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +97 -0
  60. data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
  61. data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
  62. data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
  63. data/lib/kontena/cli/stacks/yaml/validations.rb +16 -0
  64. data/lib/kontena/cli/stacks/yaml/validator_v3.rb +25 -8
  65. data/lib/kontena/client.rb +2 -2
  66. data/lib/kontena/command.rb +11 -0
  67. data/lib/kontena/main_command.rb +3 -1
  68. data/lib/kontena/plugin_manager.rb +11 -198
  69. data/lib/kontena/plugin_manager/cleaner.rb +33 -0
  70. data/lib/kontena/plugin_manager/common.rb +86 -0
  71. data/lib/kontena/plugin_manager/installer.rb +54 -0
  72. data/lib/kontena/plugin_manager/loader.rb +93 -0
  73. data/lib/kontena/plugin_manager/rubygems_client.rb +42 -23
  74. data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
  75. data/lib/kontena/util.rb +24 -0
  76. data/lib/kontena_cli.rb +1 -0
  77. data/omnibus/config/projects/kontena.rb +7 -1
  78. data/omnibus/config/software/{kontena.rb → kontena-cli.rb} +2 -0
  79. data/spec/fixtures/api/node.json +2 -1
  80. data/spec/fixtures/stack-internal-extend.yml +6 -1
  81. data/spec/fixtures/stack-with-dependencies-dep-1-1.yml +8 -0
  82. data/spec/fixtures/stack-with-dependencies-dep-1.yml +17 -0
  83. data/spec/fixtures/stack-with-dependencies-dep-2.yml +8 -0
  84. data/spec/fixtures/stack-with-dependencies-dep-3.yml +5 -0
  85. data/spec/fixtures/stack-with-dependencies-dep_2-removed.yml +17 -0
  86. data/spec/fixtures/stack-with-dependencies-dep_3-added.yml +25 -0
  87. data/spec/fixtures/stack-with-dependencies.yml +22 -0
  88. data/spec/fixtures/stack-with-variables.yml +3 -0
  89. data/spec/kontena/cli/etcd/health_command_spec.rb +45 -33
  90. data/spec/kontena/cli/helpers/exec_helper_spec.rb +2 -1
  91. data/spec/kontena/cli/master/init_cloud_command_spec.rb +14 -0
  92. data/spec/kontena/cli/nodes/health_command_spec.rb +74 -10
  93. data/spec/kontena/cli/nodes/list_command_spec.rb +381 -232
  94. data/spec/kontena/cli/nodes/show_command_spec.rb +31 -0
  95. data/spec/kontena/cli/nodes/ssh_command_spec.rb +18 -3
  96. data/spec/kontena/cli/plugins/install_command_spec.rb +1 -1
  97. data/spec/kontena/cli/stacks/build_command_spec.rb +6 -12
  98. data/spec/kontena/cli/stacks/common_spec.rb +42 -69
  99. data/spec/kontena/cli/stacks/install_command_spec.rb +57 -31
  100. data/spec/kontena/cli/stacks/list_command_spec.rb +44 -0
  101. data/spec/kontena/cli/stacks/logs_command_spec.rb +12 -1
  102. data/spec/kontena/cli/stacks/remove_command_spec.rb +39 -0
  103. data/spec/kontena/cli/stacks/show_command_spec.rb +16 -0
  104. data/spec/kontena/cli/stacks/stack_name_spec.rb +21 -0
  105. data/spec/kontena/cli/stacks/upgrade_command_spec.rb +73 -56
  106. data/spec/kontena/cli/stacks/validate_command_spec.rb +81 -0
  107. data/spec/kontena/cli/stacks/yaml/custom_validators/affinities_validator_spec.rb +22 -0
  108. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +173 -169
  109. data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +12 -3
  110. data/spec/kontena/cli/stacks/yaml/stack_file_loader/file_loader_spec.rb +47 -0
  111. data/spec/kontena/cli/stacks/yaml/stack_file_loader/registry_loader_spec.rb +53 -0
  112. data/spec/kontena/cli/stacks/yaml/stack_file_loader/uri_loader_spec.rb +53 -0
  113. data/spec/kontena/cli/stacks/yaml/stack_file_loader_spec.rb +104 -0
  114. data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +19 -0
  115. data/spec/kontena/plugin_manager/cleaner_spec.rb +20 -0
  116. data/spec/kontena/plugin_manager/common_spec.rb +39 -0
  117. data/spec/kontena/plugin_manager/installer_spec.rb +50 -0
  118. data/spec/kontena/plugin_manager/loader_spec.rb +5 -0
  119. data/spec/kontena/plugin_manager/rubygems_client_spec.rb +11 -25
  120. data/spec/kontena/plugin_manager/uninstaller_spec.rb +19 -0
  121. data/spec/kontena/plugin_manager_spec.rb +7 -7
  122. metadata +64 -97
  123. data/lib/kontena/cli/app_command.rb +0 -22
  124. data/lib/kontena/cli/apps/build_command.rb +0 -28
  125. data/lib/kontena/cli/apps/common.rb +0 -172
  126. data/lib/kontena/cli/apps/config_command.rb +0 -25
  127. data/lib/kontena/cli/apps/deploy_command.rb +0 -137
  128. data/lib/kontena/cli/apps/docker_compose_generator.rb +0 -61
  129. data/lib/kontena/cli/apps/docker_helper.rb +0 -80
  130. data/lib/kontena/cli/apps/dockerfile_generator.rb +0 -16
  131. data/lib/kontena/cli/apps/init_command.rb +0 -89
  132. data/lib/kontena/cli/apps/kontena_yml_generator.rb +0 -105
  133. data/lib/kontena/cli/apps/list_command.rb +0 -59
  134. data/lib/kontena/cli/apps/logs_command.rb +0 -37
  135. data/lib/kontena/cli/apps/monitor_command.rb +0 -93
  136. data/lib/kontena/cli/apps/remove_command.rb +0 -74
  137. data/lib/kontena/cli/apps/restart_command.rb +0 -39
  138. data/lib/kontena/cli/apps/scale_command.rb +0 -33
  139. data/lib/kontena/cli/apps/service_generator.rb +0 -114
  140. data/lib/kontena/cli/apps/service_generator_v2.rb +0 -27
  141. data/lib/kontena/cli/apps/show_command.rb +0 -23
  142. data/lib/kontena/cli/apps/start_command.rb +0 -40
  143. data/lib/kontena/cli/apps/stop_command.rb +0 -40
  144. data/lib/kontena/cli/apps/yaml/custom_validators/affinities_validator.rb +0 -19
  145. data/lib/kontena/cli/apps/yaml/custom_validators/build_validator.rb +0 -22
  146. data/lib/kontena/cli/apps/yaml/custom_validators/extends_validator.rb +0 -20
  147. data/lib/kontena/cli/apps/yaml/custom_validators/hooks_validator.rb +0 -54
  148. data/lib/kontena/cli/apps/yaml/custom_validators/secrets_validator.rb +0 -22
  149. data/lib/kontena/cli/apps/yaml/reader.rb +0 -213
  150. data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -77
  151. data/lib/kontena/cli/apps/yaml/validations.rb +0 -71
  152. data/lib/kontena/cli/apps/yaml/validator.rb +0 -38
  153. data/lib/kontena/cli/apps/yaml/validator_v2.rb +0 -53
  154. data/spec/fixtures/app.json +0 -42
  155. data/spec/fixtures/health.yml +0 -26
  156. data/spec/fixtures/kontena-build.yml +0 -16
  157. data/spec/fixtures/kontena-internal-extend.yml +0 -8
  158. data/spec/fixtures/kontena-invalid.yml +0 -4
  159. data/spec/fixtures/kontena-with-env-file.yml +0 -18
  160. data/spec/fixtures/kontena-with-variables.yml +0 -19
  161. data/spec/fixtures/kontena.yml +0 -17
  162. data/spec/fixtures/kontena_build_v2.yml +0 -26
  163. data/spec/fixtures/kontena_numeric_version.yml +0 -9
  164. data/spec/fixtures/kontena_v2.yml +0 -35
  165. data/spec/fixtures/mysql.yml +0 -3
  166. data/spec/fixtures/wordpress-scaled.yml +0 -3
  167. data/spec/fixtures/wordpress.yml +0 -2
  168. data/spec/kontena/cli/app/build_command_spec.rb +0 -55
  169. data/spec/kontena/cli/app/common_spec.rb +0 -110
  170. data/spec/kontena/cli/app/config_command_spec.rb +0 -78
  171. data/spec/kontena/cli/app/deploy_command_spec.rb +0 -217
  172. data/spec/kontena/cli/app/docker_helper_spec.rb +0 -155
  173. data/spec/kontena/cli/app/init_command_spec.rb +0 -109
  174. data/spec/kontena/cli/app/logs_command_spec.rb +0 -131
  175. data/spec/kontena/cli/app/scale_spec.rb +0 -51
  176. data/spec/kontena/cli/app/service_generator_spec.rb +0 -384
  177. data/spec/kontena/cli/app/service_generator_v2_spec.rb +0 -73
  178. data/spec/kontena/cli/app/yaml/reader_spec.rb +0 -457
  179. data/spec/kontena/cli/app/yaml/service_extender_spec.rb +0 -127
  180. data/spec/kontena/cli/app/yaml/validator_spec.rb +0 -380
  181. data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +0 -301
@@ -1,28 +0,0 @@
1
- require_relative 'common'
2
- require_relative 'docker_helper'
3
-
4
- module Kontena::Cli::Apps
5
- class BuildCommand < Kontena::Command
6
- include Kontena::Cli::Common
7
- include Common
8
- include DockerHelper
9
-
10
- option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
11
- option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
12
- option ['--no-cache'], :flag, 'Do not use cache when building the image', default: false
13
- option '--skip-validation', :flag, 'Skip YAML file validation', default: false
14
- parameter "[SERVICE] ...", "Services to build"
15
-
16
- attr_reader :services
17
-
18
- def execute
19
- require_config_file(filename)
20
- @services = services_from_yaml(filename, service_list, service_prefix, skip_validation?)
21
- if services.none?{ |name, service| service['build'] }
22
- error 'Not found any service with build option'
23
- abort
24
- end
25
- process_docker_images(services, true, no_cache?)
26
- end
27
- end
28
- end
@@ -1,172 +0,0 @@
1
- require_relative '../services/services_helper'
2
- require_relative './service_generator'
3
- require_relative './service_generator_v2'
4
- require_relative './yaml/reader'
5
- require 'yaml'
6
-
7
- module Kontena::Cli::Apps
8
- module Common
9
- include Kontena::Cli::Services::ServicesHelper
10
-
11
- def require_config_file(filename)
12
- exit_with_error("File #{filename} does not exist") unless File.exists?(filename)
13
- end
14
-
15
- # @param [String] filename
16
- # @param [Array<String>] service_list
17
- # @param [String] prefix
18
- # @param [TrueClass|FalseClass] skip_validation
19
- # @return [Hash]
20
- def services_from_yaml(filename, service_list, prefix, skip_validation = false)
21
- set_env_variables(prefix, current_grid)
22
- reader = YAML::Reader.new(filename, skip_validation)
23
- outcome = reader.execute
24
- hint_on_validation_notifications(outcome[:notifications]) if outcome[:notifications].size > 0
25
- abort_on_validation_errors(outcome[:errors]) if outcome[:errors].size > 0
26
- kontena_services = generate_services(outcome[:services], outcome[:version])
27
- kontena_services.delete_if { |name, service| !service_list.include?(name)} unless service_list.empty?
28
- kontena_services
29
- end
30
-
31
- ##
32
- # @param [Hash] yaml
33
- # @param [String] version
34
- # @return [Hash]
35
- def generate_services(yaml_services, version)
36
- services = {}
37
- if version.to_i == 2
38
- generator_klass = ServiceGeneratorV2
39
- else
40
- generator_klass = ServiceGenerator
41
- end
42
- yaml_services.each do |service_name, config|
43
- exit_with_error("Image is missing for #{service_name}. Aborting.") unless config['image']
44
- services[service_name] = generator_klass.new(config).generate
45
- end
46
- services
47
- end
48
-
49
- def read_yaml(filename)
50
- reader = YAML::Reader.new(filename)
51
- outcome = reader.execute
52
- outcome
53
- end
54
-
55
- def set_env_variables(project, grid)
56
- ENV['project'] = project
57
- ENV['grid'] = grid
58
- end
59
-
60
- def service_prefix
61
- @service_prefix ||= project_name || project_name_from_yaml(filename) || current_dir
62
- end
63
-
64
- def project_name_from_yaml(file)
65
- reader = YAML::Reader.new(file, true)
66
- reader.stack_name
67
- end
68
-
69
- # @return [String]
70
- def token
71
- @token ||= require_token
72
- end
73
-
74
- # @param [String] name
75
- # @return [String]
76
- def prefixed_name(name)
77
- return name if service_prefix.strip == ""
78
- "#{service_prefix}-#{name}"
79
- end
80
-
81
- # @return [String]
82
- def current_dir
83
- File.basename(Dir.getwd)
84
- end
85
-
86
- # @param [String] name
87
- # @return [Boolean]
88
- def service_exists?(name)
89
- get_service(token, prefixed_name(name)) rescue false
90
- end
91
-
92
- # @param [Hash] services
93
- # @param [String] file
94
- def create_yml(services, file = 'kontena.yml')
95
- yml = File.new(file, 'w')
96
- yml.puts services.to_yaml
97
- yml.close
98
- end
99
-
100
- # @return [Hash]
101
- def app_json
102
- if !@app_json && File.exist?('app.json')
103
- @app_json = JSON.parse(File.read('app.json'))
104
- end
105
- @app_json ||= {}
106
- end
107
-
108
- def display_notifications(messages, color = :yellow)
109
- messages.each do |files|
110
- files.each do |file, services|
111
- $stderr.puts "#{file}:".colorize(color)
112
- services.each do |service|
113
- service.each do |name, errors|
114
- $stderr.puts " #{name}:".colorize(color)
115
- if errors.is_a?(String)
116
- $stderr.puts " - #{errors}".colorize(color)
117
- else
118
- errors.each do |key, error|
119
- $stderr.puts " - #{key}: #{error.to_json}".colorize(color)
120
- end
121
- end
122
- end
123
- end
124
- end
125
- end
126
- end
127
-
128
- def hint_on_validation_notifications(errors)
129
- $stderr.puts "YAML contains the following unsupported options and they were rejected:".colorize(:yellow)
130
- display_notifications(errors)
131
- end
132
-
133
- def abort_on_validation_errors(errors)
134
- $stderr.puts "YAML validation failed! Aborting.".colorize(:red)
135
- display_notifications(errors, :red)
136
- abort
137
- end
138
-
139
- def valid_addons(prefix=nil)
140
- if prefix
141
- prefix = "#{prefix}-"
142
- end
143
-
144
- {
145
- 'openredis' => {
146
- 'image' => 'redis:latest',
147
- 'environment' => ["REDIS_URL=redis://#{prefix}openredis:6379"]
148
- },
149
- 'redis' => {
150
- 'image' => 'redis:latest',
151
- 'environment' => ["REDIS_URL=redis://#{prefix}redis:6379"]
152
- },
153
- 'rediscloud' => {
154
- 'image' => 'redis:latest',
155
- 'environment' => ["REDISCLOUD_URL=redis://#{prefix}rediscloud:6379"]
156
- },
157
- 'postgresql' => {
158
- 'image' => 'postgres:latest',
159
- 'environment' => ["DATABASE_URL=postgres://#{prefix}postgres:@postgresql:5432/postgres"]
160
- },
161
- 'mongolab' => {
162
- 'image' => 'mongo:latest',
163
- 'environment' => ["MONGOLAB_URI=#{prefix}mongolab:27017"]
164
- },
165
- 'memcachedcloud' => {
166
- 'image' => 'memcached:latest',
167
- 'environment' => ["MEMCACHEDCLOUD_SERVERS=#{prefix}memcachedcloud:11211"]
168
- }
169
- }
170
- end
171
- end
172
- end
@@ -1,25 +0,0 @@
1
- require_relative 'common'
2
- require 'yaml'
3
-
4
- module Kontena::Cli::Apps
5
- class ConfigCommand < Kontena::Command
6
- include Kontena::Cli::Common
7
- include Common
8
-
9
- option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
10
- option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
11
- option '--skip-validation', :flag, 'Skip YAML file validation', default: false
12
- parameter "[SERVICE] ...", "Services to view"
13
-
14
- def execute
15
- require_config_file(filename)
16
- services = services_from_yaml(filename, service_list, service_prefix, skip_validation?)
17
- services.each do |name, config|
18
- config['cmd'] = config['cmd'].join(" ") if config['cmd']
19
- config.delete_if {|key, value| value.nil? || (value.respond_to?(:empty?) && value.empty?) }
20
- end
21
- services = { 'services' => services }
22
- puts services.to_yaml
23
- end
24
- end
25
- end
@@ -1,137 +0,0 @@
1
- require 'yaml'
2
- require_relative 'common'
3
- require_relative 'docker_helper'
4
-
5
- module Kontena::Cli::Apps
6
- class DeployCommand < Kontena::Command
7
- include Kontena::Cli::Common
8
- include Kontena::Cli::GridOptions
9
- include Common
10
- include DockerHelper
11
-
12
- option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
13
- option ['--no-build'], :flag, 'Don\'t build an image, even if it\'s missing', default: false
14
- option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
15
- option '--async', :flag, 'Run deploys async/parallel'
16
- option '--force', :flag, 'Force deploy even if service does not have any changes'
17
-
18
- option '--skip-validation', :flag, 'Skip YAML file validation', default: false
19
- parameter "[SERVICE] ...", "Services to start"
20
-
21
- attr_reader :services, :deploy_queue
22
-
23
- def execute
24
- require_api_url
25
- require_token
26
- require_config_file(filename)
27
- @deploy_queue = []
28
- @services = services_from_yaml(filename, service_list, service_prefix)
29
- process_docker_images(services) if !no_build?
30
- create_or_update_services(services)
31
- deploy_services(deploy_queue)
32
- end
33
-
34
- private
35
-
36
- # @param [Hash] services
37
- def create_or_update_services(services)
38
- services.each do |name, config|
39
- create_or_update_service(name, config)
40
- end
41
- end
42
-
43
- # @param [Array] queue
44
- def deploy_services(queue)
45
- queue.each do |service|
46
- name = service['id'].split('/').last
47
- options = {}
48
- options[:force] = true if force?
49
- spinner "Deploying #{unprefixed_name(name).colorize(:cyan)} " do
50
- deployment = deploy_service(token, name, options)
51
- unless async?
52
- wait_for_deploy_to_finish(token, deployment)
53
- end
54
- end
55
- end
56
- end
57
-
58
- # @param [String] name
59
- # @param [Hash] options
60
- def create_or_update_service(name, options)
61
- # skip if service is already processed or it's not present
62
- return nil if in_deploy_queue?(name) || !services.key?(name)
63
-
64
- # create/update linked services recursively before continuing
65
- unless options['links'].empty?
66
- options['links'].each_with_index do |linked_service, index|
67
- # change prefixed service name also to links options
68
- linked_service_name = linked_service['name']
69
- options['links'][index]['name'] = "#{prefixed_name(linked_service['name'])}"
70
- create_or_update_service(linked_service_name, services[linked_service_name]) unless in_deploy_queue?(linked_service_name)
71
- end
72
- end
73
-
74
- merge_external_links(options)
75
-
76
- if service_exists?(name)
77
- service = update(name, options)
78
- else
79
- service = create(name, options)
80
- end
81
-
82
- deploy_queue.push service
83
- end
84
-
85
- # @param [String] name
86
- def find_service_by_name(name)
87
- get_service(token, prefixed_name(name)) rescue nil
88
- end
89
-
90
- # @param [String] name
91
- # @param [Hash] options
92
- def create(name, options)
93
- data = { 'name' => prefixed_name(name) }
94
- data.merge!(options)
95
- result = nil
96
- spinner "Creating #{name.colorize(:cyan)} " do
97
- result = create_service(token, current_grid, data)
98
- end
99
- result
100
- end
101
-
102
- # @param [String] name
103
- # @param [Hash] options
104
- def update(name, options)
105
- prefixed_name = prefixed_name(name)
106
- result = nil
107
- spinner "Updating #{name.colorize(:cyan)} " do
108
- result = update_service(token, prefixed_name, options)
109
- end
110
- result
111
- end
112
-
113
- # @param [String] name
114
- def in_deploy_queue?(name)
115
- deploy_queue.find {|service| service['name'] == prefixed_name(name)} != nil
116
- end
117
-
118
- #
119
- # @param [String] name
120
- def unprefixed_name(name)
121
- if service_prefix.empty?
122
- name
123
- else
124
- name.sub("#{service_prefix}-", '')
125
- end
126
- end
127
-
128
- # @param [Hash] options
129
- def merge_external_links(options)
130
- if options['external_links']
131
- options['links'] ||= []
132
- options['links'] = options['links'] + options['external_links']
133
- options.delete('external_links')
134
- end
135
- end
136
- end
137
- end
@@ -1,61 +0,0 @@
1
- require 'yaml'
2
- require_relative 'common'
3
-
4
- module Kontena::Cli::Apps
5
- class DockerComposeGenerator
6
- include Common
7
-
8
- attr_reader :docker_compose_file
9
-
10
- def initialize(filename)
11
- @docker_compose_file = filename
12
- end
13
-
14
- def generate(procfile, addons, env_file)
15
- if procfile.keys.size > 0
16
- # generate services found in Procfile
17
- docker_compose = {
18
- 'version' => '2'
19
- }
20
- services = {}
21
- procfile.each do |service, command|
22
- services[service] = {'build' => '.' }
23
- if app_json && service == 'web' # Heroku generates PORT env variable so should we do too
24
- services[service]['environment'] = ['PORT=5000']
25
- services[service]['ports'] = ['5000:5000']
26
- end
27
- services[service]['command'] = "/start #{service}" if service != 'web'
28
- services[service]['env_file'] = env_file if env_file
29
-
30
- # generate addon services
31
- addons.each do |addon|
32
- addon_service = addon.split(":")[0]
33
- addon_service.slice!('heroku-')
34
- if valid_addons.has_key?(addon_service)
35
- services[service]['links'] = [] unless services[service]['links']
36
- services[service]['links'] << "#{addon_service}:#{addon_service}"
37
- services[service]['environment'] = [] unless services[service]['environment']
38
- services[service]['environment'] += valid_addons[addon_service]['environment']
39
- services[addon_service] = {'image' => valid_addons[addon_service]['image']}
40
- end
41
- end
42
- end
43
- docker_compose['services'] = services
44
- else
45
- # no Procfile found, create dummy web service
46
- docker_compose = {
47
- 'version' => '2',
48
- 'services' => {
49
- 'web' => {
50
- 'build' => '.'
51
- }
52
- }
53
- }
54
-
55
- docker_compose['services']['web']['env_file'] = env_file if env_file
56
- end
57
- # create docker-compose.yml file
58
- create_yml(docker_compose, docker_compose_file)
59
- end
60
- end
61
- end
@@ -1,80 +0,0 @@
1
- module Kontena::Cli::Apps
2
- module DockerHelper
3
-
4
- # @param [Hash] services
5
- # @param [Boolean] force_build
6
- # @param [Boolean] no_cache
7
- def process_docker_images(services, force_build = false, no_cache = false)
8
- services.each do |name, service|
9
- if service['build'] && (!image_exist?(service['image']) || force_build)
10
- dockerfile = service['build']['dockerfile'] || 'Dockerfile'
11
- raise ("'#{service['image']}' is not valid Docker image name") unless validate_image_name(service['image'])
12
- raise ("'#{service['build']['context']}' does not have #{dockerfile}") unless dockerfile_exist?(service['build']['context'], dockerfile)
13
- if service['hooks'] && service['hooks']['pre_build']
14
- puts "Running pre_build hook".colorize(:cyan)
15
- run_pre_build_hook(service['hooks']['pre_build'])
16
- end
17
- puts "Building image #{service['image'].colorize(:cyan)}"
18
- build_docker_image(service, no_cache)
19
- puts "Pushing image #{service['image'].colorize(:cyan)} to registry"
20
- push_docker_image(service['image'])
21
- end
22
- end
23
- end
24
-
25
- # @param [String] name
26
- # @return [Boolean]
27
- def validate_image_name(name)
28
- !(/^[\w.\/\-:]+:?+[\w+.]+$/ =~ name).nil?
29
- end
30
-
31
- # @param [Hash] service
32
- # @param [Boolean] no_cache
33
- # @return [Integer]
34
- def build_docker_image(service, no_cache = false)
35
- dockerfile = dockerfile = service['build']['dockerfile'] || 'Dockerfile'
36
- build_context = service['build']['context']
37
- cmd = ['docker', 'build', '-t', service['image']]
38
- cmd << ['-f', File.join(File.expand_path(build_context), dockerfile)] if dockerfile != "Dockerfile"
39
- cmd << '--no-cache' if no_cache
40
- args = service['build']['args'] || {}
41
- args.each do |k, v|
42
- cmd << "--build-arg=#{k}=#{v}"
43
- end
44
- cmd << build_context
45
- ret = system(*cmd.flatten)
46
- raise ("Failed to build image #{service['image'].colorize(:cyan)}") unless ret
47
- ret
48
- end
49
-
50
- # @param [String] image
51
- # @return [Integer]
52
- def push_docker_image(image)
53
- ret = system('docker', 'push', image)
54
- raise ("Failed to push image #{image.colorize(:cyan)}") unless ret
55
- ret
56
- end
57
-
58
- # @param [String] image
59
- # @return [Boolean]
60
- def image_exist?(image)
61
- system("docker history '#{image}' >/dev/null 2>/dev/null")
62
- end
63
-
64
- # @param [String] path
65
- # @param [String] dockerfile
66
- # @return [Boolean]
67
- def dockerfile_exist?(path, dockerfile)
68
- file = File.join(File.expand_path(path), dockerfile)
69
- File.exist?(file)
70
- end
71
-
72
- # @param [Hash] hook
73
- def run_pre_build_hook(hook)
74
- hook.each do |h|
75
- ret = system(h['cmd'])
76
- raise ("Failed to run pre_build hook: #{h['name']}!") unless ret
77
- end
78
- end
79
- end
80
- end