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,39 +0,0 @@
1
- require_relative 'common'
2
-
3
- module Kontena::Cli::Apps
4
- class RestartCommand < Kontena::Command
5
- include Kontena::Cli::Common
6
- include Common
7
-
8
- option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
9
- option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
10
-
11
- parameter "[SERVICE] ...", "Services to start"
12
-
13
- attr_reader :services
14
-
15
- def execute
16
- require_config_file(filename)
17
-
18
- @services = services_from_yaml(filename, service_list, service_prefix, true)
19
- if services.size > 0
20
- restart_services(services)
21
- elsif !service_list.empty?
22
- puts "No such service: #{service_list.join(', ')}".colorize(:red)
23
- end
24
-
25
- end
26
-
27
- def restart_services(services)
28
- services.each do |service_name, opts|
29
- if service_exists?(service_name)
30
- spinner "Sending restart signal to #{service_name.colorize(:cyan)} " do
31
- restart_service(token, prefixed_name(service_name))
32
- end
33
- else
34
- warning "No such service: #{service_name}"
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,33 +0,0 @@
1
- require_relative 'common'
2
-
3
- module Kontena::Cli::Apps
4
- class ScaleCommand < Kontena::Command
5
- include Kontena::Cli::Common
6
- include Kontena::Cli::GridOptions
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
-
12
- parameter "SERVICE", "Service to show"
13
- parameter "INSTANCES", "Scales service to given number of instances"
14
-
15
- attr_reader :services
16
-
17
- def execute
18
- require_config_file(filename)
19
- yml_service = services_from_yaml(filename, [service], service_prefix, true)
20
- if yml_service[service]
21
- options = yml_service[service]
22
- exit_with_error("Service has already instances defined in #{filename}. Please update #{filename} and deploy service instead") if options['instances']
23
- spinner "Scaling #{service.colorize(:cyan)} " do
24
- deployment = scale_service(require_token, prefixed_name(service), instances)
25
- wait_for_deploy_to_finish(token, deployment)
26
- end
27
-
28
- else
29
- exit_with_error("Service not found")
30
- end
31
- end
32
- end
33
- end
@@ -1,114 +0,0 @@
1
- require 'yaml'
2
- require 'shellwords'
3
- require_relative '../services/services_helper'
4
-
5
- module Kontena::Cli::Apps
6
- class ServiceGenerator
7
- include Kontena::Cli::Services::ServicesHelper
8
-
9
- attr_reader :service_config
10
-
11
- def initialize(service_config)
12
- @service_config = service_config
13
- end
14
-
15
- ##
16
- # @return [Hash]
17
- def generate
18
- parse_data(service_config)
19
- end
20
-
21
- private
22
-
23
- ##
24
- # @param [Hash] options
25
- # @return [Hash]
26
- def parse_data(options)
27
- data = {}
28
- data['instances'] = options['instances']
29
- data['image'] = parse_image(options['image'])
30
- data['env'] = options['environment'] if options['environment']
31
- data['links'] = parse_links(options['links'] || [])
32
- data['external_links'] = parse_links(options['external_links'] || [])
33
- data['ports'] = parse_stringified_ports(options['ports'] || [])
34
- data['memory'] = parse_memory(options['mem_limit'].to_s) if options['mem_limit']
35
- data['memory_swap'] = parse_memory(options['memswap_limit'].to_s) if options['memswap_limit']
36
- data['cpu_shares'] = options['cpu_shares'] if options['cpu_shares']
37
- data['volumes'] = options['volumes'] || []
38
- data['volumes_from'] = options['volumes_from'] || []
39
- data['cmd'] = Shellwords.split(options['command']) if options['command']
40
- data['affinity'] = options['affinity'] || []
41
- data['user'] = options['user'] if options['user']
42
- data['stateful'] = options['stateful'] == true
43
- data['privileged'] = options['privileged'] unless options['privileged'].nil?
44
- data['cap_add'] = options['cap_add'] if options['cap_add']
45
- data['cap_drop'] = options['cap_drop'] if options['cap_drop']
46
- data['net'] = options['net'] if options['net']
47
- data['pid'] = options['pid'] if options['pid']
48
- data['log_driver'] = options['log_driver'] if options['log_driver']
49
- data['log_opts'] = options['log_opt'] if options['log_opt'] && !options['log_opt'].empty?
50
- deploy_opts = options['deploy'] || {}
51
- data['strategy'] = deploy_opts['strategy'] if deploy_opts['strategy']
52
- deploy = {}
53
- deploy['wait_for_port'] = deploy_opts['wait_for_port'] if deploy_opts.has_key?('wait_for_port')
54
- deploy['min_health'] = deploy_opts['min_health'] if deploy_opts.has_key?('min_health')
55
- deploy['interval'] = parse_relative_time(deploy_opts['interval']) if deploy_opts.has_key?('interval')
56
- unless deploy.empty?
57
- data['deploy_opts'] = deploy
58
- end
59
- data['hooks'] = options['hooks'] || {}
60
- data['secrets'] = options['secrets'] if options['secrets']
61
- data['build'] = parse_build_options(options) if options['build']
62
- health_check = {}
63
- health_opts = options['health_check'] || {}
64
- health_check['protocol'] = health_opts['protocol'] if health_opts.has_key?('protocol')
65
- health_check['uri'] = health_opts['uri'] if health_opts.has_key?('uri')
66
- health_check['port'] = health_opts['port'] if health_opts.has_key?('port')
67
- health_check['timeout'] = health_opts['timeout'] if health_opts.has_key?('timeout')
68
- health_check['interval'] = health_opts['interval'] if health_opts.has_key?('interval')
69
- health_check['initial_delay'] = health_opts['initial_delay'] if health_opts.has_key?('initial_delay')
70
- unless health_check.empty?
71
- data['health_check'] = health_check
72
- end
73
- data
74
- end
75
-
76
- # @param [Array<String>] port_options
77
- # @return [Array<Hash>]
78
- def parse_stringified_ports(port_options)
79
- parse_ports(port_options).map {|p|
80
- {
81
- 'ip' => p[:ip],
82
- 'container_port' => p[:container_port],
83
- 'node_port' => p[:node_port],
84
- 'protocol' => p[:protocol]
85
- }
86
- }
87
- end
88
-
89
- # @param [Array<String>] link_options
90
- # @return [Array<Hash>]
91
- def parse_links(link_options)
92
- link_options.map{|l|
93
- service_name, alias_name = l.split(':')
94
- if service_name.nil?
95
- raise ArgumentError.new("Invalid link value #{l}")
96
- end
97
- alias_name = service_name if alias_name.nil?
98
- {
99
- 'name' => service_name,
100
- 'alias' => alias_name
101
- }
102
- }
103
- end
104
-
105
- # @param [Hash] options
106
- # @return [Hash]
107
- def parse_build_options(options)
108
- build = {}
109
- build['context'] = options['build'] if options['build']
110
- build['dockerfile'] = options['dockerfile'] if options['dockerfile']
111
- build
112
- end
113
- end
114
- end
@@ -1,27 +0,0 @@
1
- require 'yaml'
2
- require_relative 'service_generator'
3
-
4
- module Kontena::Cli::Apps
5
- class ServiceGeneratorV2 < ServiceGenerator
6
-
7
- def parse_data(options)
8
- data = super(options)
9
- data['net'] = options['network_mode'] if options['network_mode']
10
- data['log_driver'] = options.dig('logging', 'driver')
11
- data['log_opts'] = options.dig('logging', 'options')
12
- if options['depends_on']
13
- data['links'] ||= []
14
- data['links'] = (data['links'] + parse_links(options['depends_on'])).uniq
15
- end
16
- data
17
- end
18
-
19
- def parse_build_options(options)
20
- unless options['build'].is_a?(Hash)
21
- options['build'] = { 'context' => options['build']}
22
- end
23
- options['build']['args'] = parse_build_args(options['build']['args']) if options['build']['args']
24
- options['build']
25
- end
26
- end
27
- end
@@ -1,23 +0,0 @@
1
- require_relative 'common'
2
-
3
- module Kontena::Cli::Apps
4
- class ShowCommand < Kontena::Command
5
- include Kontena::Cli::Common
6
- include Kontena::Cli::GridOptions
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
-
12
- parameter "SERVICE", "Service to show"
13
-
14
- attr_reader :services
15
-
16
- def execute
17
- require_config_file(filename)
18
- token = require_token
19
- show_service(token, prefixed_name(service))
20
- show_service_instances(token, prefixed_name(service))
21
- end
22
- end
23
- end
@@ -1,40 +0,0 @@
1
- require_relative 'common'
2
-
3
- module Kontena::Cli::Apps
4
- class StartCommand < Kontena::Command
5
- include Kontena::Cli::Common
6
- include Kontena::Cli::GridOptions
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
-
12
- parameter "[SERVICE] ...", "Services to start"
13
-
14
- attr_reader :services
15
-
16
- def execute
17
- require_config_file(filename)
18
-
19
- @services = services_from_yaml(filename, service_list, service_prefix, true)
20
- if services.size > 0
21
- start_services(services)
22
- elsif !service_list.empty?
23
- puts "No such service: #{service_list.join(', ')}".colorize(:red)
24
- end
25
-
26
- end
27
-
28
- def start_services(services)
29
- services.each do |service_name, opts|
30
- if service_exists?(service_name)
31
- spinner "Starting #{service_name.colorize(:cyan)} " do
32
- start_service(token, prefixed_name(service_name))
33
- end
34
- else
35
- warning "No such service: #{service_name}"
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,40 +0,0 @@
1
- require_relative 'common'
2
-
3
- module Kontena::Cli::Apps
4
- class StopCommand < Kontena::Command
5
- include Kontena::Cli::Common
6
- include Kontena::Cli::GridOptions
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
-
12
- parameter "[SERVICE] ...", "Services to stop"
13
-
14
- attr_reader :services
15
-
16
- def execute
17
- require_config_file(filename)
18
-
19
- @services = services_from_yaml(filename, service_list, service_prefix, true)
20
- if services.size > 0
21
- stop_services(services)
22
- elsif !service_list.empty?
23
- puts "No such service: #{service_list.join(', ')}".colorize(:red)
24
- end
25
-
26
- end
27
-
28
- def stop_services(services)
29
- services.each do |service_name, opts|
30
- if service_exists?(service_name)
31
- spinner "Sending stop signal to #{service_name.colorize(:cyan)} " do
32
- stop_service(token, prefixed_name(service_name))
33
- end
34
- else
35
- warning "No such service: #{service_name}"
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,19 +0,0 @@
1
- module Kontena::Cli::Apps::YAML::Validations::CustomValidators
2
- class AffinitiesValidator < HashValidator::Validator::Base
3
- def initialize
4
- super('valid_affinities')
5
- end
6
-
7
- def validate(key, value, validations, errors)
8
- unless value.is_a?(Array)
9
- errors[key] = 'affinity must be array'
10
- return
11
- end
12
-
13
- invalid_formats = value.find_all { |a| !a.match(/(?<=\!|\=)=/) }
14
- if invalid_formats.count > 0
15
- errors[key] = "affinity contains invalid formats: #{invalid_formats.join(', ')}"
16
- end
17
- end
18
- end
19
- end
@@ -1,22 +0,0 @@
1
- module Kontena::Cli::Apps::YAML::Validations::CustomValidators
2
- class BuildValidator < HashValidator::Validator::Base
3
- def initialize
4
- super('valid_build')
5
- end
6
-
7
- def validate(key, value, validations, errors)
8
- unless value.is_a?(String) || value.is_a?(Hash)
9
- errors[key] = 'build must be string or hash'
10
- return
11
- end
12
- if value.is_a?(Hash)
13
- build_validation = {
14
- 'context' => 'string',
15
- 'dockerfile' => HashValidator.optional('string'),
16
- 'args' => HashValidator.optional(-> (value) { value.is_a?(Array) || value.is_a?(Hash) })
17
- }
18
- HashValidator.validator_for(build_validation).validate(key, value, build_validation, errors)
19
- end
20
- end
21
- end
22
- end
@@ -1,20 +0,0 @@
1
- module Kontena::Cli::Apps::YAML::Validations::CustomValidators
2
- class ExtendsValidator < HashValidator::Validator::Base
3
- def initialize
4
- super('valid_extends')
5
- end
6
-
7
- def validate(key, value, validations, errors)
8
- unless value.is_a?(String) || value.is_a?(Hash)
9
- errors[key] = 'extends must be string or hash'
10
- return
11
- end
12
- if value.is_a?(Hash)
13
- extends_validation = { 'service' => 'string' }
14
- extends_validation['file'] = HashValidator.optional('string') if value['file']
15
- extends_validation['stack'] = HashValidator.optional('string') if value['stack']
16
- HashValidator.validator_for(extends_validation).validate(key, value, extends_validation, errors)
17
- end
18
- end
19
- end
20
- end
@@ -1,54 +0,0 @@
1
- module Kontena::Cli::Apps::YAML::Validations::CustomValidators
2
- class HooksValidator < HashValidator::Validator::Base
3
- def initialize
4
- super('valid_hooks')
5
- end
6
-
7
- def validate(key, value, validations, errors)
8
- unless value.is_a?(Hash)
9
- errors[key] = 'hooks must be array'
10
- return
11
- end
12
-
13
- if value['pre_build']
14
- validate_pre_build_hooks(key, value['pre_build'], errors)
15
- end
16
-
17
- if value['post_start']
18
- validate_post_start_hooks(key, value['post_start'], errors)
19
- end
20
- end
21
-
22
- def validate_pre_build_hooks(key, pre_build_hooks, errors)
23
- unless pre_build_hooks.is_a?(Array)
24
- errors[key] = 'pre_build must be array'
25
- return
26
- end
27
- pre_build_validation = {
28
- 'name' => 'string',
29
- 'cmd' => 'string'
30
- }
31
- validator = HashValidator.validator_for(pre_build_validation)
32
- pre_build_hooks.each do |pre_build|
33
- validator.validate('hooks.pre_build', pre_build, pre_build_validation, errors)
34
- end
35
- end
36
-
37
- def validate_post_start_hooks(key, post_start_hooks, errors)
38
- unless post_start_hooks.is_a?(Array)
39
- errors[key] = 'post_start must be array'
40
- return
41
- end
42
- post_start_validation = {
43
- 'name' => 'string',
44
- 'instances' => (-> (value) { value.is_a?(Integer) || value == '*' }),
45
- 'cmd' => 'string',
46
- 'oneshot' => HashValidator.optional('boolean')
47
- }
48
- validator = HashValidator.validator_for(post_start_validation)
49
- post_start_hooks.each do |post_start|
50
- validator.validate('hooks.post_start', post_start, post_start_validation, errors)
51
- end
52
- end
53
- end
54
- end
@@ -1,22 +0,0 @@
1
- module Kontena::Cli::Apps::YAML::Validations::CustomValidators
2
- class SecretsValidator < HashValidator::Validator::Base
3
- def initialize
4
- super('valid_secrets')
5
- end
6
-
7
- def validate(key, value, validations, errors)
8
- unless value.is_a?(Array)
9
- errors[key] = 'secrets must be array'
10
- return
11
- end
12
- secret_item_validation = {
13
- 'secret' => 'string',
14
- 'name' => 'string',
15
- 'type' => 'string'
16
- }
17
- value.each do |secret|
18
- HashValidator.validator_for(secret_item_validation).validate(key, secret, secret_item_validation, errors)
19
- end
20
- end
21
- end
22
- end