kontena-cli 1.4.0.pre6 → 1.4.0.pre7

Sign up to get free protection for your applications and to get access to all the features.
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