kontena-cli 1.1.1 → 1.1.2.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6375c4de944897ae1d7c56fdb0de7bac7cbbe79a
4
- data.tar.gz: d25ef27c6e5cddc843c90cdb9bec53fbfa9354bf
3
+ metadata.gz: c08178a70fa7abd31742032c4a32bfcd3c448c6e
4
+ data.tar.gz: d425757f104f91eef926f0cc73a212ad60fb7df1
5
5
  SHA512:
6
- metadata.gz: 0cacb7083c66545a80ba743d289f47e326f488d382d0243339bcd72a4e12af4abfe0be9d7f3f7870e1bd5748df3e8e6edd0d6d971a70d3af507c3e0a31712f2a
7
- data.tar.gz: fbfc01b96161a08c8e98fb2c60b4d4a418cebd2c829b60f20bbd099dd77bdbc0ad11862b6d6ef69ee7aa4eb4219982b2d9fc9bbf451cb189a3178d0d1a850e05
6
+ metadata.gz: b2d8888c0b79d53b134dd3b9399afbcfac958fc6e2d8ed31ea2846eaeee2f8da905ed9e70afdba11ced3bb961e50c55e586980acfca81d0796e96e0f190d1fe2
7
+ data.tar.gz: 13356fee387db7005b1588a7c0a277e9f98172fbcc252d38610638a7f493cc291ad8ab3e34bcbea3c834edbf3747da5b0e27439ca4205be49230dcaed3024b41
data/LOGO CHANGED
@@ -4,5 +4,5 @@
4
4
  | < (_) | | | | || __/ | | | (_| |
5
5
  |_|\_\___/|_| |_|\__\___|_| |_|\__,_|
6
6
  -------------------------------------
7
- Copyright (c)2016 Kontena, Inc.
7
+ Copyright (c)2017 Kontena, Inc.
8
8
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.1.2.rc1
@@ -82,26 +82,10 @@ module Kontena::Cli::Services
82
82
  data[:log_driver] = log_driver if log_driver
83
83
  data[:log_opts] = parse_log_opts(log_opt_list)
84
84
  data[:strategy] = deploy_strategy if deploy_strategy
85
- data[:deploy_opts] = {}
86
- if deploy_min_health
87
- data[:deploy_opts][:min_health] = deploy_min_health.to_f
88
- end
89
- if deploy_wait_for_port
90
- data[:deploy_opts][:wait_for_port] = deploy_wait_for_port.to_i
91
- end
92
- if deploy_interval
93
- data[:deploy_opts][:interval] = parse_relative_time(deploy_interval)
94
- end
95
- if health_check_port
96
- data[:health_check] = {
97
- protocol: health_check_protocol,
98
- uri: health_check_uri,
99
- port: health_check_port,
100
- timeout: health_check_timeout,
101
- interval: health_check_interval,
102
- initial_delay: health_check_initial_delay
103
- }
104
- end
85
+ deploy_opts = parse_deploy_opts
86
+ data[:deploy_opts] = deploy_opts unless deploy_opts.empty?
87
+ health_check = parse_health_check
88
+ data[:health_check] = health_check unless health_check.empty?
105
89
  data[:pid] = pid if pid
106
90
  data
107
91
  end
@@ -432,6 +432,35 @@ module Kontena
432
432
  build_args
433
433
  end
434
434
 
435
+ # @return [Hash]
436
+ def parse_deploy_opts
437
+ deploy_opts = {}
438
+ deploy_opts[:min_health] = deploy_min_health.to_f if deploy_min_health
439
+ deploy_opts[:wait_for_port] = deploy_wait_for_port.to_i if deploy_wait_for_port
440
+ if deploy_interval
441
+ deploy_opts[:interval] = parse_relative_time(deploy_interval)
442
+ end
443
+
444
+ deploy_opts
445
+ end
446
+
447
+ # @return [Hash]
448
+ def parse_health_check
449
+ health_check = {}
450
+ if health_check_port
451
+ health_check[:port] = health_check_port == 'none' ? nil : health_check_port
452
+ end
453
+ if health_check_protocol
454
+ health_check[:protocol] = health_check_protocol == 'none' ? nil : health_check_protocol
455
+ end
456
+ health_check[:uri] = health_check_uri if health_check_uri
457
+ health_check[:timeout] = health_check_timeout if health_check_timeout
458
+ health_check[:interval] = health_check_interval if health_check_interval
459
+ health_check[:initial_delay] = health_check_initial_delay if health_check_initial_delay
460
+
461
+ health_check
462
+ end
463
+
435
464
  # @param [Symbol] health
436
465
  # @return [String]
437
466
  def health_status_icon(health)
@@ -73,23 +73,10 @@ module Kontena::Cli::Services
73
73
  data[:net] = net if net
74
74
  data[:log_driver] = log_driver if log_driver
75
75
  data[:log_opts] = parse_log_opts(log_opt_list) if log_opt_list
76
- data[:deploy_opts] = {}
77
- data[:deploy_opts][:min_health] = deploy_min_health.to_f if deploy_min_health
78
- data[:deploy_opts][:wait_for_port] = deploy_wait_for_port.to_i if deploy_wait_for_port
79
- if deploy_interval
80
- data[:deploy_opts][:interval] = parse_relative_time(deploy_interval)
81
- end
82
- if health_check_port
83
- data[:health_check] = {
84
- protocol: health_check_protocol,
85
- uri: health_check_uri,
86
- port: health_check_port,
87
- timeout: health_check_timeout,
88
- interval: health_check_interval,
89
- initial_delay: health_check_initial_delay
90
- }
91
- end
92
- data.delete(:deploy_opts) if data[:deploy_opts].empty?
76
+ deploy_opts = parse_deploy_opts
77
+ data[:deploy_opts] = deploy_opts unless deploy_opts.empty?
78
+ health_check = parse_health_check
79
+ data[:health_check] = health_check unless health_check.empty?
93
80
  data[:pid] = pid if pid
94
81
  data
95
82
  end
@@ -71,7 +71,7 @@ module Kontena::Cli::Stacks
71
71
  'expose' => outcome[:expose],
72
72
  'version' => outcome[:version],
73
73
  'source' => reader.raw_content,
74
- 'registry' => 'file://',
74
+ 'registry' => outcome[:registry],
75
75
  'services' => kontena_services,
76
76
  'variables' => outcome[:variables]
77
77
  }
@@ -57,22 +57,12 @@ module Kontena::Cli::Stacks
57
57
  deploy['interval'] = parse_relative_time(deploy_opts['interval'])
58
58
  else
59
59
  deploy['interval'] = nil
60
- end
60
+ end
61
61
  data['deploy_opts'] = deploy
62
62
  data['hooks'] = options['hooks'] || {}
63
63
  data['secrets'] = options['secrets'] if options['secrets']
64
64
  data['build'] = parse_build_options(options) if options['build']
65
- health_check = {}
66
- health_opts = options['health_check'] || {}
67
- health_check['protocol'] = health_opts['protocol'] if health_opts.has_key?('protocol')
68
- health_check['uri'] = health_opts['uri'] if health_opts.has_key?('uri')
69
- health_check['port'] = health_opts['port'] if health_opts.has_key?('port')
70
- health_check['timeout'] = health_opts['timeout'] if health_opts.has_key?('timeout')
71
- health_check['interval'] = health_opts['interval'] if health_opts.has_key?('interval')
72
- health_check['initial_delay'] = health_opts['initial_delay'] if health_opts.has_key?('initial_delay')
73
- unless health_check.empty?
74
- data['health_check'] = health_check
75
- end
65
+ data['health_check'] = parse_health_check(options)
76
66
  data
77
67
  end
78
68
 
@@ -113,5 +103,15 @@ module Kontena::Cli::Stacks
113
103
  build['dockerfile'] = options['dockerfile'] if options['dockerfile']
114
104
  build
115
105
  end
106
+
107
+ # @param [Hash] options
108
+ # @return [Hash]
109
+ def parse_health_check(options)
110
+ health_check = {}
111
+ %w(port protocol uri timeout interval initial_delay).each do |k|
112
+ health_check[k] = options.dig('health_check', k)
113
+ end
114
+ health_check
115
+ end
116
116
  end
117
117
  end
@@ -11,7 +11,7 @@ module Kontena::Cli::Stacks
11
11
  include Kontena::Util
12
12
  include Kontena::Cli::Common
13
13
 
14
- attr_reader :file, :raw_content, :errors, :notifications, :defaults, :values
14
+ attr_reader :file, :raw_content, :errors, :notifications, :defaults, :values, :registry
15
15
 
16
16
  def initialize(file, skip_validation: false, skip_variables: false, variables: nil, values: nil, defaults: nil)
17
17
  require 'yaml'
@@ -25,13 +25,13 @@ module Kontena::Cli::Stacks
25
25
  if from_registry?
26
26
  require 'shellwords'
27
27
  @raw_content = Kontena::StacksCache.pull(file)
28
- @registry = Kontena::StacksCache.registry_url
28
+ @registry = current_account.stacks_url
29
29
  elsif from_url?
30
- require 'open-uri'
31
- stream = open(file)
32
- @raw_content = stream.read
30
+ @raw_content = load_from_url(file)
31
+ @registry = nil
33
32
  else
34
33
  @raw_content = File.read(File.expand_path(file))
34
+ @registry = nil
35
35
  end
36
36
 
37
37
  @errors = []
@@ -43,6 +43,12 @@ module Kontena::Cli::Stacks
43
43
  @defaults = defaults
44
44
  end
45
45
 
46
+ def load_from_url(url)
47
+ require 'open-uri'
48
+ stream = open(url)
49
+ stream.read
50
+ end
51
+
46
52
  def internals_interpolated_yaml
47
53
  @internals_interpolated_yaml ||= ::YAML.safe_load(
48
54
  replace_dollar_dollars(
@@ -121,7 +127,7 @@ module Kontena::Cli::Stacks
121
127
  result[:stack] = raw_yaml['stack']
122
128
  result[:version] = self.stack_version
123
129
  result[:name] = self.stack_name
124
- result[:registry] = @registry if from_registry?
130
+ result[:registry] = registry
125
131
  result[:expose] = fully_interpolated_yaml['expose']
126
132
  result[:errors] = errors unless skip_validation?
127
133
  result[:notifications] = notifications
@@ -2,6 +2,7 @@ require_relative 'stacks_client'
2
2
  require_relative 'cli/common'
3
3
  require_relative 'cli/stacks/common'
4
4
  require 'yaml'
5
+ require 'uri'
5
6
 
6
7
  module Kontena
7
8
  class StacksCache
@@ -94,8 +95,8 @@ module Kontena
94
95
  stack
95
96
  end
96
97
 
97
- def registry_url
98
- client.api_url
98
+ def registry_url(stack, version = nil)
99
+ client.full_uri(stack, version)
99
100
  end
100
101
 
101
102
  def client
@@ -7,6 +7,10 @@ module Kontena
7
7
  ACCEPT_YAML = { 'Accept' => 'application/yaml' }
8
8
  CT_YAML = { 'Content-Type' => 'application/yaml' }
9
9
 
10
+ def full_uri(stack_name, version = nil)
11
+ URI.join(api_url, path_to(stack_name, version)).to_s
12
+ end
13
+
10
14
  def path_to(stack_name, version = nil)
11
15
  version ? "/stack/#{stack_name}/version/#{version}" : "/stack/#{stack_name}"
12
16
  end
@@ -52,5 +52,73 @@ describe Kontena::Cli::Services::UpdateCommand do
52
52
  '--log-opt', 'gelf-address=udp://log_forwarder-logstash_internal:12201', 'service'
53
53
  ])
54
54
  end
55
+
56
+ context 'health check' do
57
+ it 'sends --health-check-port' do
58
+ expect(subject).to receive(:update_service).with(
59
+ duck_type(:access_token), 'service', hash_including(health_check: {
60
+ port: '8080'
61
+ })
62
+ )
63
+ subject.run([
64
+ '--health-check-port', '8080', 'service'
65
+ ])
66
+ end
67
+
68
+ it 'sends --health-check-port as nil if none given' do
69
+ expect(subject).to receive(:update_service).with(
70
+ duck_type(:access_token), 'service', hash_including(health_check: {
71
+ port: nil
72
+ })
73
+ )
74
+ subject.run([
75
+ '--health-check-port', 'none', 'service'
76
+ ])
77
+ end
78
+
79
+ it 'sends --health-check-protocol' do
80
+ expect(subject).to receive(:update_service).with(
81
+ duck_type(:access_token), 'service', hash_including(health_check: {
82
+ protocol: 'tcp'
83
+ })
84
+ )
85
+ subject.run([
86
+ '--health-check-protocol', 'tcp', 'service'
87
+ ])
88
+ end
89
+
90
+ it 'sends --health-check-protocol as nil if none given' do
91
+ expect(subject).to receive(:update_service).with(
92
+ duck_type(:access_token), 'service', hash_including(health_check: {
93
+ protocol: nil
94
+ })
95
+ )
96
+ subject.run([
97
+ '--health-check-protocol', 'none', 'service'
98
+ ])
99
+ end
100
+
101
+ it 'sends --health-check-timeout' do
102
+ expect(subject).to receive(:update_service).with(
103
+ duck_type(:access_token), 'service', hash_including(health_check: {
104
+ timeout: '30'
105
+ })
106
+ )
107
+ subject.run([
108
+ '--health-check-timeout', '30', 'service'
109
+ ])
110
+ end
111
+
112
+ it 'sends --health-check-uri' do
113
+ expect(subject).to receive(:update_service).with(
114
+ duck_type(:access_token), 'service', hash_including(health_check: {
115
+ uri: '/health'
116
+ })
117
+ )
118
+ subject.run([
119
+ '--health-check-uri', '/health', 'service'
120
+ ])
121
+ end
122
+ end
55
123
  end
56
124
  end
@@ -385,5 +385,54 @@ describe Kontena::Cli::Stacks::ServiceGenerator do
385
385
  expect(result['secrets']).to be_nil
386
386
  end
387
387
  end
388
+
389
+ context 'health_check' do
390
+ it 'returns health_check with nils by default' do
391
+ data = {
392
+ 'image' => 'foo/bar:latest'
393
+ }
394
+ result = subject.send(:parse_data, data)
395
+ health_check = result['health_check']
396
+ expect(health_check['port']).to be_nil
397
+ expect(health_check['protocol']).to be_nil
398
+ end
399
+
400
+ it 'returns health_check with port & protocol' do
401
+ data = {
402
+ 'image' => 'foo/bar:latest',
403
+ 'health_check' => {
404
+ 'port' => 8080,
405
+ 'protocol' => 'tcp'
406
+ }
407
+ }
408
+ result = subject.send(:parse_data, data)
409
+ health_check = result['health_check']
410
+ expect(health_check['port']).to eq(8080)
411
+ expect(health_check['protocol']).to eq('tcp')
412
+ expect(health_check['uri']).to be_nil
413
+ end
414
+
415
+ it 'returns health_check with all values' do
416
+ data = {
417
+ 'image' => 'foo/bar:latest',
418
+ 'health_check' => {
419
+ 'port' => 8080,
420
+ 'protocol' => 'http',
421
+ 'uri' => '/health',
422
+ 'interval' => 60,
423
+ 'timeout' => 5,
424
+ 'initial_delay' => 30
425
+ }
426
+ }
427
+ result = subject.send(:parse_data, data)
428
+ health_check = result['health_check']
429
+ expect(health_check['port']).to eq(8080)
430
+ expect(health_check['protocol']).to eq('http')
431
+ expect(health_check['uri']).to eq('/health')
432
+ expect(health_check['interval']).to eq(60)
433
+ expect(health_check['timeout']).to eq(5)
434
+ expect(health_check['initial_delay']).to eq(30)
435
+ end
436
+ end
388
437
  end
389
438
  end
@@ -398,19 +398,25 @@ describe Kontena::Cli::Stacks::YAML::Reader do
398
398
  .with(absolute_yaml_path('kontena_v3.yml'))
399
399
  .and_return(fixture('stack-with-liquid.yml'))
400
400
  expect(subject.from_file?).to be_truthy
401
+ expect(subject.execute[:registry]).to be_nil
401
402
  end
402
403
 
403
404
  it 'can read from the registry' do
404
- expect(Kontena::StacksCache).to receive(:pull)
405
- .with('foo/foo')
406
- .and_return(fixture('stack-with-liquid.yml'))
407
- expect(Kontena::StacksCache).to receive(:registry_url).and_return('foo')
408
- expect(described_class.new('foo/foo').from_registry?).to be_truthy
405
+ stack_double = double
406
+ allow_any_instance_of(Kontena::StacksCache::RegistryClientFactory).to receive(:cloud_auth?).and_return(true)
407
+ expect(Kontena::StacksCache).to receive(:cache).with('foo/foo', nil).and_return(stack_double)
408
+ expect(stack_double).to receive(:read).and_return(fixture('kontena_v3.yml'))
409
+ instance = described_class.new('foo/foo')
410
+ expect(instance.from_registry?).to be_truthy
411
+ expect(instance.execute[:registry]).to eq instance.current_account.stacks_url
409
412
  end
410
413
 
411
414
  it 'can read from an url' do
412
- stub_request(:get, "http://foo.example.com/foo").to_return(:status => 200, :body => fixture('stack-with-liquid.yml'), :headers => {})
413
- expect(described_class.new('http://foo.example.com/foo').from_url?).to be_truthy
415
+ stub_request(:get, "http://foo.example.com/foo").to_return(:status => 200, :body => fixture('stack-with-liquid.yml'), :headers => {})
416
+ allow_any_instance_of(described_class).to receive(:load_from_url).and_return(fixture('stack-with-liquid.yml'))
417
+ instance = described_class.new('http://foo.example.com/foo')
418
+ expect(instance.from_url?).to be_truthy
419
+ expect(instance.execute[:registry]).to be_nil
414
420
  end
415
421
  end
416
422
 
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: 1.1.1
4
+ version: 1.1.2.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kontena, Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-08 00:00:00.000000000 Z
11
+ date: 2017-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -621,9 +621,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
621
621
  version: 2.1.0
622
622
  required_rubygems_version: !ruby/object:Gem::Requirement
623
623
  requirements:
624
- - - ">="
624
+ - - ">"
625
625
  - !ruby/object:Gem::Version
626
- version: '0'
626
+ version: 1.3.1
627
627
  requirements: []
628
628
  rubyforge_project:
629
629
  rubygems_version: 2.6.8