kontena-cli 0.15.0.rc1 → 0.15.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/kontena/cli/apps/service_generator.rb +1 -19
- data/lib/kontena/cli/apps/yaml/reader.rb +29 -1
- data/lib/kontena/cli/grids/common.rb +2 -1
- data/lib/kontena/cli/services/list_command.rb +5 -18
- data/lib/kontena/cli/services/services_helper.rb +38 -2
- data/lib/kontena/cli/vault/list_command.rb +3 -3
- data/lib/kontena/cli/whoami_command.rb +19 -20
- data/lib/kontena/main_command.rb +2 -1
- data/lib/kontena/util.rb +11 -0
- data/spec/fixtures/kontena-with-env-file.yml +18 -0
- data/spec/fixtures/{kontena_build_v2.yaml → kontena_build_v2.yml} +0 -0
- data/spec/kontena/cli/app/service_generator_spec.rb +1 -52
- data/spec/kontena/cli/app/yaml/reader_spec.rb +84 -0
- data/spec/kontena/cli/services/services_helper_spec.rb +36 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de5064548c891f2a1dc2b8382efcd81ef47a4e3b
|
4
|
+
data.tar.gz: 0d1262bfcc83048a591ab04b1040c94cbbb0ca02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c540225c876e38452bcf9308fa2ae356464b17e7f0433c65e078afaaf20b9cfeedee96fb76e77a921f2f0d2269a3fbbac127cad33abb81a8b5d4af49829ca06
|
7
|
+
data.tar.gz: 2c723b83ee5fe5a81e853f45e22cb44be1decb8dee9e4f8b83defa1ef2c0a3c03af8afc750ac38d3f90d1a6c7c6abd92dda7d921e83a8ac311891a487b23e8af
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.15.0.
|
1
|
+
0.15.0.rc2
|
@@ -26,7 +26,7 @@ module Kontena::Cli::Apps
|
|
26
26
|
data = {}
|
27
27
|
data['container_count'] = options['instances']
|
28
28
|
data['image'] = parse_image(options['image'])
|
29
|
-
data['env'] =
|
29
|
+
data['env'] = options['environment'] if options['environment']
|
30
30
|
data['container_count'] = options['instances']
|
31
31
|
data['links'] = parse_links(options['links'] || [])
|
32
32
|
data['external_links'] = parse_links(options['external_links'] || [])
|
@@ -73,24 +73,6 @@ module Kontena::Cli::Apps
|
|
73
73
|
data
|
74
74
|
end
|
75
75
|
|
76
|
-
# @param [Hash] options
|
77
|
-
def merge_env_vars(options)
|
78
|
-
return options['environment'] unless options['env_file']
|
79
|
-
|
80
|
-
options['env_file'] = [options['env_file']] if options['env_file'].is_a?(String)
|
81
|
-
options['environment'] = [] unless options['environment']
|
82
|
-
options['env_file'].each do |env_file|
|
83
|
-
options['environment'].concat(read_env_file(env_file))
|
84
|
-
end
|
85
|
-
options['environment'].uniq {|s| s.split('=').first}
|
86
|
-
end
|
87
|
-
|
88
|
-
|
89
|
-
# @param [String] path
|
90
|
-
def read_env_file(path)
|
91
|
-
File.readlines(path).delete_if { |line| line.start_with?('#') || line.strip.empty? }
|
92
|
-
end
|
93
|
-
|
94
76
|
# @param [Array<String>] port_options
|
95
77
|
# @return [Array<Hash>]
|
96
78
|
def parse_stringified_ports(port_options)
|
@@ -89,6 +89,8 @@ module Kontena::Cli::Apps
|
|
89
89
|
# @param [Hash] service_config
|
90
90
|
def process_config(service_config)
|
91
91
|
normalize_env_vars(service_config)
|
92
|
+
merge_env_vars(service_config)
|
93
|
+
expand_build_context(service_config)
|
92
94
|
normalize_build_args(service_config)
|
93
95
|
service_config = extend_config(service_config) if service_config.key?('extends')
|
94
96
|
service_config
|
@@ -146,7 +148,33 @@ module Kontena::Cli::Apps
|
|
146
148
|
options['environment'] = options['environment'].map { |k, v| "#{k}=#{v}" }
|
147
149
|
end
|
148
150
|
end
|
149
|
-
|
151
|
+
|
152
|
+
# @param [Hash] options
|
153
|
+
def merge_env_vars(options)
|
154
|
+
return options['environment'] unless options['env_file']
|
155
|
+
|
156
|
+
options['env_file'] = [options['env_file']] if options['env_file'].is_a?(String)
|
157
|
+
options['environment'] = [] unless options['environment']
|
158
|
+
options['env_file'].each do |env_file|
|
159
|
+
options['environment'].concat(read_env_file(env_file))
|
160
|
+
end
|
161
|
+
options.delete('env_file')
|
162
|
+
options['environment'].uniq! { |s| s.split('=').first }
|
163
|
+
end
|
164
|
+
|
165
|
+
# @param [String] path
|
166
|
+
def read_env_file(path)
|
167
|
+
File.readlines(path).map { |line| line.strip }.delete_if { |line| line.start_with?('#') || line.empty? }
|
168
|
+
end
|
169
|
+
|
170
|
+
def expand_build_context(options)
|
171
|
+
if options['build'].is_a?(String)
|
172
|
+
options['build'] = File.expand_path(options['build'])
|
173
|
+
elsif context = options.dig('build', 'context')
|
174
|
+
options['build']['context'] = File.expand_path(context)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
150
178
|
# @param [Hash] options - service config
|
151
179
|
def normalize_build_args(options)
|
152
180
|
if v2? && options.dig('build', 'args')
|
@@ -4,8 +4,9 @@ module Kontena::Cli::Grids
|
|
4
4
|
##
|
5
5
|
# @param [Hash] grid
|
6
6
|
def print_grid(grid)
|
7
|
+
host = ENV['KONTENA_URL'] || self.current_master['url']
|
7
8
|
puts "#{grid['name']}:"
|
8
|
-
puts " uri: #{
|
9
|
+
puts " uri: #{host.sub('http', 'ws')}"
|
9
10
|
puts " token: #{grid['token']}"
|
10
11
|
root_dir = grid['engine_root_dir']
|
11
12
|
nodes = client(require_token).get("grids/#{grid['name']}/nodes")
|
@@ -12,8 +12,8 @@ module Kontena::Cli::Services
|
|
12
12
|
|
13
13
|
grids = client(token).get("grids/#{current_grid}/services")
|
14
14
|
services = grids['services'].sort_by{|s| s['updated_at'] }.reverse
|
15
|
-
titles = ['NAME', 'INSTANCES', 'STATEFUL', 'STATE', '
|
16
|
-
puts "%-60s %-10s %-8s %-10s %-
|
15
|
+
titles = ['NAME', 'INSTANCES', 'STATEFUL', 'STATE', 'EXPOSED PORTS']
|
16
|
+
puts "%-60s %-10s %-8s %-10s %-50s" % titles
|
17
17
|
services.each do |service|
|
18
18
|
stateful = service['stateful'] ? 'yes' : 'no'
|
19
19
|
running = service['instances']['running']
|
@@ -22,28 +22,15 @@ module Kontena::Cli::Services
|
|
22
22
|
ports = service['ports'].map{|p|
|
23
23
|
"#{p['ip']}:#{p['node_port']}->#{p['container_port']}/#{p['protocol']}"
|
24
24
|
}.join(", ")
|
25
|
-
health =
|
26
|
-
if service['health_status']
|
27
|
-
icon = "■"
|
28
|
-
healthy = service.dig('health_status', 'healthy')
|
29
|
-
total = service.dig('health_status', 'total')
|
30
|
-
color = :green
|
31
|
-
if healthy == 0
|
32
|
-
color = :red
|
33
|
-
elsif healthy > 0 && healthy < total
|
34
|
-
color = :yellow
|
35
|
-
end
|
36
|
-
health = "■".colorize(color)
|
37
|
-
end
|
25
|
+
health = health_status(service)
|
38
26
|
vars = [
|
39
|
-
service['name'],
|
27
|
+
"#{health_status_icon(health)} #{service['name']}",
|
40
28
|
instances,
|
41
29
|
stateful,
|
42
30
|
service['state'],
|
43
|
-
health,
|
44
31
|
ports
|
45
32
|
]
|
46
|
-
puts "%-
|
33
|
+
puts "%-74s %-10.10s %-8s %-10s %-50s" % vars
|
47
34
|
end
|
48
35
|
end
|
49
36
|
end
|
@@ -180,7 +180,7 @@ module Kontena
|
|
180
180
|
puts " interval: #{service['health_check']['interval']}"
|
181
181
|
puts " initial_delay: #{service['health_check']['initial_delay']}"
|
182
182
|
end
|
183
|
-
|
183
|
+
|
184
184
|
if service['health_status']
|
185
185
|
puts " health status:"
|
186
186
|
puts " healthy: #{service['health_status']['healthy']}"
|
@@ -282,7 +282,7 @@ module Kontena
|
|
282
282
|
ip: ip,
|
283
283
|
container_port: container_port,
|
284
284
|
node_port: node_port,
|
285
|
-
protocol: protocol
|
285
|
+
protocol: protocol
|
286
286
|
}
|
287
287
|
}
|
288
288
|
end
|
@@ -399,6 +399,42 @@ module Kontena
|
|
399
399
|
|
400
400
|
build_args
|
401
401
|
end
|
402
|
+
|
403
|
+
# @param [Symbol] health
|
404
|
+
# @return [String]
|
405
|
+
def health_status_icon(health)
|
406
|
+
if health == :unhealthy
|
407
|
+
icon = '⊗'.freeze
|
408
|
+
icon.colorize(:red)
|
409
|
+
elsif health == :partial
|
410
|
+
icon = '⊙'.freeze
|
411
|
+
icon.colorize(:yellow)
|
412
|
+
elsif health == :healthy
|
413
|
+
icon = '⊛'.freeze
|
414
|
+
icon.colorize(:green)
|
415
|
+
else
|
416
|
+
icon = '⊝'.freeze
|
417
|
+
icon.colorize(:default)
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
# @param [Hash] service
|
422
|
+
# @return [Symbol]
|
423
|
+
def health_status(service)
|
424
|
+
if service['health_status']
|
425
|
+
healthy = service.dig('health_status', 'healthy')
|
426
|
+
total = service.dig('health_status', 'total')
|
427
|
+
if healthy == 0
|
428
|
+
:unhealthy
|
429
|
+
elsif healthy > 0 && healthy < total
|
430
|
+
:partial
|
431
|
+
else
|
432
|
+
:healthy
|
433
|
+
end
|
434
|
+
else
|
435
|
+
:unknown
|
436
|
+
end
|
437
|
+
end
|
402
438
|
end
|
403
439
|
end
|
404
440
|
end
|
@@ -10,10 +10,10 @@ module Kontena::Cli::Vault
|
|
10
10
|
token = require_token
|
11
11
|
result = client(token).get("grids/#{current_grid}/secrets")
|
12
12
|
|
13
|
-
column_width_paddings = '%-54s %-25.25s'
|
14
|
-
puts column_width_paddings % ['NAME', 'CREATED AT']
|
13
|
+
column_width_paddings = '%-54s %-25.25s %-25.25s'
|
14
|
+
puts column_width_paddings % ['NAME', 'CREATED AT', 'UPDATED AT']
|
15
15
|
result['secrets'].sort_by { |s| s['name'] }.each do |secret|
|
16
|
-
puts column_width_paddings % [secret['name'], secret['created_at']]
|
16
|
+
puts column_width_paddings % [secret['name'], secret['created_at'], secret['updated_at']]
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -10,27 +10,26 @@ class Kontena::Cli::WhoamiCommand < Clamp::Command
|
|
10
10
|
end
|
11
11
|
|
12
12
|
require_api_url
|
13
|
-
puts "Master: #{self.current_master['name']}"
|
14
|
-
puts "URL: #{api_url}"
|
15
|
-
puts "Grid: #{current_grid}"
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
13
|
+
puts "Master: #{ENV['KONTENA_URL'] || self.current_master['name']}"
|
14
|
+
puts "URL: #{ENV['KONTENA_URL'] || api_url}"
|
15
|
+
puts "Grid: #{ENV['KONTENA_GRID'] || current_grid}"
|
16
|
+
unless ENV['KONTENA_URL']
|
17
|
+
if current_master['email']
|
18
|
+
puts "User: #{current_master['email']}"
|
19
|
+
else # In case local storage doesn't have the user email yet
|
20
|
+
token = require_token
|
21
|
+
user = client(token).get('user')
|
22
|
+
puts "User: #{user['email']}"
|
23
|
+
master = {
|
24
|
+
'name' => current_master['name'],
|
25
|
+
'url' => current_master['url'],
|
26
|
+
'token' => current_master['token'],
|
27
|
+
'email' => user['email'],
|
28
|
+
'grid' => current_master['grid']
|
29
|
+
}
|
29
30
|
|
30
|
-
|
31
|
+
self.add_master(current_master['name'], master)
|
32
|
+
end
|
31
33
|
end
|
32
|
-
|
33
|
-
|
34
34
|
end
|
35
|
-
|
36
35
|
end
|
data/lib/kontena/main_command.rb
CHANGED
@@ -27,10 +27,11 @@ require_relative 'cli/stack_command'
|
|
27
27
|
require_relative 'cli/certificate_command'
|
28
28
|
|
29
29
|
class Kontena::MainCommand < Kontena::Command
|
30
|
+
include Kontena::Util
|
30
31
|
|
31
32
|
subcommand "grid", "Grid specific commands", Kontena::Cli::GridCommand
|
32
33
|
subcommand "app", "App specific commands", Kontena::Cli::AppCommand
|
33
|
-
subcommand "stack", "Stack specific commands", Kontena::Cli::StackCommand
|
34
|
+
subcommand "stack", "Stack specific commands", Kontena::Cli::StackCommand if experimental?
|
34
35
|
subcommand "service", "Service specific commands", Kontena::Cli::ServiceCommand
|
35
36
|
subcommand "vault", "Vault specific commands", Kontena::Cli::VaultCommand
|
36
37
|
subcommand "certificate", "LE Certificate specific commands", Kontena::Cli::CertificateCommand
|
data/lib/kontena/util.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
module Kontena
|
2
2
|
module Util
|
3
3
|
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
4
8
|
# @param [String] cmd
|
5
9
|
def which(cmd)
|
6
10
|
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
@@ -13,5 +17,12 @@ module Kontena
|
|
13
17
|
return nil
|
14
18
|
end
|
15
19
|
module_function(:which)
|
20
|
+
|
21
|
+
module ClassMethods
|
22
|
+
def experimental?
|
23
|
+
ENV.has_key?('KONTENA_EXPERIMENTAL')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
16
27
|
end
|
17
28
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
wordpress:
|
2
|
+
extends:
|
3
|
+
file: docker-compose.yml
|
4
|
+
service: wordpress
|
5
|
+
stateful: true
|
6
|
+
env_file: .env
|
7
|
+
environment:
|
8
|
+
WORDPRESS_DB_PASSWORD: %{project}_secret
|
9
|
+
instances: 2
|
10
|
+
deploy:
|
11
|
+
strategy: ha
|
12
|
+
mysql:
|
13
|
+
extends:
|
14
|
+
file: docker-compose.yml
|
15
|
+
service: mysql
|
16
|
+
stateful: true
|
17
|
+
environment:
|
18
|
+
- MYSQL_ROOT_PASSWORD=%{project}_secret
|
File without changes
|
@@ -6,12 +6,6 @@ describe Kontena::Cli::Apps::ServiceGenerator do
|
|
6
6
|
described_class.new({})
|
7
7
|
end
|
8
8
|
|
9
|
-
let(:env_file) do
|
10
|
-
'APIKEY=12345
|
11
|
-
MYSQL_ROOT_PASSWORD=secret
|
12
|
-
WP_ADMIN_PASSWORD=verysecret'.split(/\r?\n/)
|
13
|
-
end
|
14
|
-
|
15
9
|
describe '#parse_data' do
|
16
10
|
context 'volumes' do
|
17
11
|
it 'returns volumes if set' do
|
@@ -387,50 +381,5 @@ WP_ADMIN_PASSWORD=verysecret'.split(/\r?\n/)
|
|
387
381
|
expect(result['secrets']).to be_nil
|
388
382
|
end
|
389
383
|
end
|
390
|
-
end
|
391
|
-
|
392
|
-
describe '#read_env_file' do
|
393
|
-
before(:each) do
|
394
|
-
allow(File).to receive(:readlines).with('.env').and_return(env_file)
|
395
|
-
end
|
396
|
-
it 'reads given file' do
|
397
|
-
expect(File).to receive(:readlines).with('.env').and_return(env_file)
|
398
|
-
subject.send(:read_env_file, '.env')
|
399
|
-
end
|
400
|
-
|
401
|
-
it 'returns array' do
|
402
|
-
variables = subject.send(:read_env_file, '.env')
|
403
|
-
expect(variables).to eq([
|
404
|
-
'APIKEY=12345',
|
405
|
-
'MYSQL_ROOT_PASSWORD=secret',
|
406
|
-
'WP_ADMIN_PASSWORD=verysecret'
|
407
|
-
])
|
408
|
-
end
|
409
|
-
|
410
|
-
it 'discards comment lines' do
|
411
|
-
result = env_file
|
412
|
-
result << "#COMMENTLINE"
|
413
|
-
allow(File).to receive(:readlines).with('.env').and_return(result)
|
414
|
-
|
415
|
-
variables = subject.send(:read_env_file, '.env')
|
416
|
-
expect(variables).to eq([
|
417
|
-
'APIKEY=12345',
|
418
|
-
'MYSQL_ROOT_PASSWORD=secret',
|
419
|
-
'WP_ADMIN_PASSWORD=verysecret'
|
420
|
-
])
|
421
|
-
end
|
422
|
-
|
423
|
-
it 'discards empty lines' do
|
424
|
-
result = env_file
|
425
|
-
result << '
|
426
|
-
'
|
427
|
-
allow(File).to receive(:readlines).with('.env').and_return(result)
|
428
|
-
variables = subject.send(:read_env_file, '.env')
|
429
|
-
expect(variables).to eq([
|
430
|
-
'APIKEY=12345',
|
431
|
-
'MYSQL_ROOT_PASSWORD=secret',
|
432
|
-
'WP_ADMIN_PASSWORD=verysecret'
|
433
|
-
])
|
434
|
-
end
|
435
|
-
end
|
384
|
+
end
|
436
385
|
end
|
@@ -16,6 +16,12 @@ describe Kontena::Cli::Apps::YAML::Reader do
|
|
16
16
|
spy
|
17
17
|
end
|
18
18
|
|
19
|
+
let(:env_file) do
|
20
|
+
['APIKEY=12345
|
21
|
+
', 'MYSQL_ROOT_PASSWORD=secret
|
22
|
+
', 'WP_ADMIN_PASSWORD=verysecret']
|
23
|
+
end
|
24
|
+
|
19
25
|
let(:valid_result) do
|
20
26
|
{
|
21
27
|
'wordpress' => {
|
@@ -232,6 +238,57 @@ describe Kontena::Cli::Apps::YAML::Reader do
|
|
232
238
|
result = subject.execute[:services]
|
233
239
|
expect(result['mysql']['environment']).to eq(['MYSQL_ROOT_PASSWORD=test_secret'])
|
234
240
|
end
|
241
|
+
|
242
|
+
context 'when introduced env_file' do
|
243
|
+
before(:each) do
|
244
|
+
allow(File).to receive(:read)
|
245
|
+
.with(absolute_yaml_path('kontena.yml'))
|
246
|
+
.and_return(fixture('kontena-with-env-file.yml'))
|
247
|
+
allow(File).to receive(:readlines).with('.env').and_return(env_file)
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'reads given file' do
|
251
|
+
expect(File).to receive(:readlines).with('.env').and_return(env_file)
|
252
|
+
subject.send(:read_env_file, '.env')
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'discards comment lines' do
|
256
|
+
result = env_file
|
257
|
+
result << "#COMMENTLINE"
|
258
|
+
allow(File).to receive(:readlines).with('.env').and_return(result)
|
259
|
+
|
260
|
+
variables = subject.send(:read_env_file, '.env')
|
261
|
+
expect(variables).to eq([
|
262
|
+
'APIKEY=12345',
|
263
|
+
'MYSQL_ROOT_PASSWORD=secret',
|
264
|
+
'WP_ADMIN_PASSWORD=verysecret'
|
265
|
+
])
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'discards empty lines' do
|
269
|
+
result = env_file
|
270
|
+
result << '
|
271
|
+
'
|
272
|
+
allow(File).to receive(:readlines).with('.env').and_return(result)
|
273
|
+
variables = subject.send(:read_env_file, '.env')
|
274
|
+
expect(variables).to eq([
|
275
|
+
'APIKEY=12345',
|
276
|
+
'MYSQL_ROOT_PASSWORD=secret',
|
277
|
+
'WP_ADMIN_PASSWORD=verysecret'
|
278
|
+
])
|
279
|
+
end
|
280
|
+
|
281
|
+
it 'merges variables' do
|
282
|
+
result = subject.execute[:services]
|
283
|
+
expect(result['wordpress']['environment']).to eq([
|
284
|
+
'WORDPRESS_DB_PASSWORD=test_secret',
|
285
|
+
'APIKEY=12345',
|
286
|
+
'MYSQL_ROOT_PASSWORD=secret',
|
287
|
+
'WP_ADMIN_PASSWORD=verysecret'
|
288
|
+
])
|
289
|
+
end
|
290
|
+
|
291
|
+
end
|
235
292
|
end
|
236
293
|
it 'returns result hash' do
|
237
294
|
outcome = subject.execute
|
@@ -246,4 +303,31 @@ describe Kontena::Cli::Apps::YAML::Reader do
|
|
246
303
|
expect(outcome[:errors].size).to eq(1)
|
247
304
|
end
|
248
305
|
end
|
306
|
+
|
307
|
+
context 'when build option is string' do
|
308
|
+
it 'expands build option to absolute path' do
|
309
|
+
allow(File).to receive(:read)
|
310
|
+
.with(absolute_yaml_path('docker-compose.yml'))
|
311
|
+
.and_return(fixture('docker-compose.yml'))
|
312
|
+
allow(File).to receive(:read)
|
313
|
+
.with(absolute_yaml_path('kontena.yml'))
|
314
|
+
.and_return(fixture('kontena-build.yml'))
|
315
|
+
outcome = subject.execute
|
316
|
+
|
317
|
+
expect(outcome[:services]['wordpress']['build']).to eq(File.expand_path('.'))
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
context 'when build option is Hash' do
|
322
|
+
it 'expands build context to absolute path' do
|
323
|
+
allow(File).to receive(:read)
|
324
|
+
.with(absolute_yaml_path('docker-compose.yml'))
|
325
|
+
.and_return(fixture('docker-compose.yml'))
|
326
|
+
allow(File).to receive(:read)
|
327
|
+
.with(absolute_yaml_path('kontena.yml'))
|
328
|
+
.and_return(fixture('kontena_build_v2.yml'))
|
329
|
+
outcome = subject.execute
|
330
|
+
expect(outcome[:services]['webapp']['build']['context']).to eq(File.expand_path('.'))
|
331
|
+
end
|
332
|
+
end
|
249
333
|
end
|
@@ -223,5 +223,41 @@ module Kontena::Cli::Services
|
|
223
223
|
expect(subject.parse_build_args({'foo' => 'bar', 'baz' => nil})).to eq({'foo' => 'bar', 'baz' => 'baf'})
|
224
224
|
end
|
225
225
|
end
|
226
|
+
|
227
|
+
describe '#health_status' do
|
228
|
+
it 'returns :unknown by default' do
|
229
|
+
expect(subject.health_status({})).to eq(:unknown)
|
230
|
+
end
|
231
|
+
|
232
|
+
it 'returns :healthy if all instances are healthy' do
|
233
|
+
data = {
|
234
|
+
'health_status' => {
|
235
|
+
'healthy' => 3,
|
236
|
+
'total' => 3
|
237
|
+
}
|
238
|
+
}
|
239
|
+
expect(subject.health_status(data)).to eq(:healthy)
|
240
|
+
end
|
241
|
+
|
242
|
+
it 'returns :partial if not all instances are healthy' do
|
243
|
+
data = {
|
244
|
+
'health_status' => {
|
245
|
+
'healthy' => 2,
|
246
|
+
'total' => 3
|
247
|
+
}
|
248
|
+
}
|
249
|
+
expect(subject.health_status(data)).to eq(:partial)
|
250
|
+
end
|
251
|
+
|
252
|
+
it 'returns :unhealthy if all instances are down' do
|
253
|
+
data = {
|
254
|
+
'health_status' => {
|
255
|
+
'healthy' => 0,
|
256
|
+
'total' => 3
|
257
|
+
}
|
258
|
+
}
|
259
|
+
expect(subject.health_status(data)).to eq(:unhealthy)
|
260
|
+
end
|
261
|
+
end
|
226
262
|
end
|
227
263
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kontena-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.15.0.
|
4
|
+
version: 0.15.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kontena, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -339,9 +339,10 @@ files:
|
|
339
339
|
- spec/fixtures/health.yml
|
340
340
|
- spec/fixtures/kontena-build.yml
|
341
341
|
- spec/fixtures/kontena-invalid.yml
|
342
|
+
- spec/fixtures/kontena-with-env-file.yml
|
342
343
|
- spec/fixtures/kontena-with-variables.yml
|
343
344
|
- spec/fixtures/kontena.yml
|
344
|
-
- spec/fixtures/kontena_build_v2.
|
345
|
+
- spec/fixtures/kontena_build_v2.yml
|
345
346
|
- spec/fixtures/kontena_v2.yml
|
346
347
|
- spec/fixtures/mysql.yml
|
347
348
|
- spec/fixtures/wordpress-scaled.yml
|
@@ -419,9 +420,10 @@ test_files:
|
|
419
420
|
- spec/fixtures/health.yml
|
420
421
|
- spec/fixtures/kontena-build.yml
|
421
422
|
- spec/fixtures/kontena-invalid.yml
|
423
|
+
- spec/fixtures/kontena-with-env-file.yml
|
422
424
|
- spec/fixtures/kontena-with-variables.yml
|
423
425
|
- spec/fixtures/kontena.yml
|
424
|
-
- spec/fixtures/kontena_build_v2.
|
426
|
+
- spec/fixtures/kontena_build_v2.yml
|
425
427
|
- spec/fixtures/kontena_v2.yml
|
426
428
|
- spec/fixtures/mysql.yml
|
427
429
|
- spec/fixtures/wordpress-scaled.yml
|