kontena-cli 0.16.0 → 0.16.1.rc1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c7adc70aca15e0272bcc9ffaab5edc2e6812b269
4
- data.tar.gz: 64cb766905a1f2d2a05fb60b8685a781d4378d14
3
+ metadata.gz: a140696639e10214728770220b852bd2c1278bb0
4
+ data.tar.gz: 4493f5eda8a877cde4e939041982b5f902df3b45
5
5
  SHA512:
6
- metadata.gz: 685cb7768a10b892c75eab794f8d95f9dfd71df1475dd1caf0f7f31c0900cab523c26a942c97823ef6412341e5d40b227ddbbb6940f19b115879450872564e45
7
- data.tar.gz: 9fc24afd8037fca5e60689dede5d49cf1ff17fb71fdc735469709b91807a627b2c51170f6420a53bb744a6167b53a7c4518942be98486f5b6c652e120a091826
6
+ metadata.gz: 35927d1ad63168a93767327ecb4a781c9367b06d5649e68986f89bc454bd4f011ec6151d82bfd4cf1d7a706508ab7ba0d7a6d7c70cd96f1e04a8863a00058efc
7
+ data.tar.gz: 9f403db6a2463f36ed270c49ce1867b4de8e77f4b8ed75e3abe3d8e10422f0a41e719ae5f641b9f1606d20eba4e0e6c042dd631fc276fe536c77b7eb8ef707d0
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.16.0
1
+ 0.16.1.rc1
@@ -6,12 +6,17 @@ module Kontena
6
6
 
7
7
  matches_commands 'master create'
8
8
 
9
- def configure_auth_provider_using_id(cloud_id)
10
- Kontena.run("master init-cloud --force --cloud-master-id #{cloud_id.shellescape}")
9
+ def init_cloud_args
10
+ args = []
11
+ args << '--force'
12
+ args << "--cloud-master-id #{command.cloud_master_id}" if command.cloud_master_id
13
+ args << "--provider #{command.result[:provider]}" if command.result[:provider]
14
+ args << "--version #{command.result[:version]}" if command.result[:version]
15
+ args.join(' ')
11
16
  end
12
17
 
13
18
  def configure_auth_provider
14
- Kontena.run("master init-cloud --force")
19
+ Kontena.run("master init-cloud #{init_cloud_args}")
15
20
  end
16
21
 
17
22
  def after
@@ -24,11 +29,7 @@ module Kontena
24
29
  return
25
30
  end
26
31
 
27
- if command.respond_to?(:cloud_master_id) && command.cloud_master_id
28
- configure_auth_provider_using_id(command.cloud_master_id)
29
- else
30
- configure_auth_provider
31
- end
32
+ configure_auth_provider
32
33
  end
33
34
  end
34
35
  end
@@ -1,4 +1,5 @@
1
1
  require 'yaml'
2
+ require 'shellwords'
2
3
  require_relative '../services/services_helper'
3
4
 
4
5
  module Kontena::Cli::Apps
@@ -36,7 +37,7 @@ module Kontena::Cli::Apps
36
37
  data['cpu_shares'] = options['cpu_shares'] if options['cpu_shares']
37
38
  data['volumes'] = options['volumes'] || []
38
39
  data['volumes_from'] = options['volumes_from'] || []
39
- data['cmd'] = options['command'].split(" ") if options['command']
40
+ data['cmd'] = Shellwords.split(options['command']) if options['command']
40
41
  data['affinity'] = options['affinity'] || []
41
42
  data['user'] = options['user'] if options['user']
42
43
  data['stateful'] = options['stateful'] == true
@@ -94,6 +94,16 @@ module Kontena::Cli::Cloud::Master
94
94
  response = spinner "Retrieving Master information from Kontena Cloud using id" do
95
95
  get_existing(self.cloud_master_id)
96
96
  end
97
+ if response && response.kind_of?(Hash) && response.has_key?('data') && response['data']['attributes']
98
+ if (self.provider && response['data']['attributes']['provider'] != self.provider) || (self.version && response['data']['attributes']['version'] != self.version)
99
+ spinner "Updating provider and version attributes to Kontena Cloud master" do
100
+ args = []
101
+ args << "--provider #{self.provider.shellescape}" if self.provider
102
+ args << "--version #{self.version.shellescape}" if self.version
103
+ Kontena.run("cloud master update #{args.join(' ')}")
104
+ end
105
+ end
106
+ end
97
107
  else
98
108
  response = spinner "Registering current Kontena Master '#{current_master.name}' #{" as '#{new_name}' " unless new_name == current_master.name}to Kontena Cloud" do
99
109
  register(new_name, current_master.url)
@@ -38,13 +38,7 @@ module Kontena::Cli::Cloud::Master
38
38
 
39
39
  response = cloud_client.put(
40
40
  "master",
41
- { data: { attributes: attrs.reject{ |k, _| ['client-id', 'client-secret'].include?(k) } } },
42
- {},
43
- cloud_client.basic_auth_header(
44
- attrs["client-id"],
45
- attrs["client-secret"]
46
- ),
47
- false
41
+ { data: { attributes: attrs.reject{ |k, _| ['client-id', 'client-secret'].include?(k) } } }
48
42
  )
49
43
 
50
44
  if response
@@ -359,7 +359,7 @@ module Kontena
359
359
  pastel.green('at'),
360
360
  pastel.yellow(server.url),
361
361
  pastel.green('as'),
362
- pastel.yellow(server.username)
362
+ pastel.yellow(server.token.username || server.username)
363
363
  ].join(' ')
364
364
  else
365
365
  puts pastel.cyan("Not authenticated to current master #{server.name}")
@@ -81,6 +81,11 @@ module Kontena
81
81
  server = Server.new(server_data)
82
82
  end
83
83
  server.account ||= 'master'
84
+ if servers.find { |s| s['name'] == server.name}
85
+ server.name = "#{server.name}-2"
86
+ server.name.succ! until servers.find { |s| s['name'] == server.name }.nil?
87
+ logger.debug "Renamed server to #{server.name} because a duplicate was found in config"
88
+ end
84
89
  servers << server
85
90
  end
86
91
 
@@ -5,17 +5,22 @@ module Kontena::Cli::Master
5
5
 
6
6
  banner "Configures the current Kontena Master to use Kontena Cloud services and authentication"
7
7
 
8
- option '--force', :flag, "Don't ask questions"
9
- option '--cloud-master-id', '[ID]', "Use existing cloud master ID"
8
+ option '--force', :flag, "Don't ask questions"
9
+ option '--cloud-master-id', '[ID]', "Use existing cloud master ID"
10
+ option '--provider', '[NAME]', "Set master provider name"
11
+ option '--version', '[VERSION]', "Set master version"
10
12
 
11
13
  requires_current_master
14
+ requires_current_master_token
12
15
  requires_current_account_token
13
16
 
14
17
  def execute
15
18
  args = ["--current"]
16
19
  args << "--force" if self.force?
17
- args << "--cloud-master-id #{self.cloud_master_id}" if self.cloud_master_id
18
- Kontena.run("cloud master add #{args.map(&:shellescape).join(' ')}")
20
+ args += ["--cloud-master-id", self.cloud_master_id.shellescape] if self.cloud_master_id
21
+ args += ["--provider", self.provider.shellescape] if self.provider
22
+ args += ["--version", self.version.shellescape] if self.version
23
+ Kontena.run("cloud master add #{args.join(' ')}")
19
24
  end
20
25
  end
21
26
  end
@@ -39,6 +39,7 @@ module Kontena::Cli::Master
39
39
  unless self.join || self.force?
40
40
  if auth_works?(server)
41
41
  config.write
42
+ config.reset_instance
42
43
  display_login_info(only: :master) unless self.no_login_info?
43
44
  exit 0
44
45
  end
@@ -117,23 +118,26 @@ module Kontena::Cli::Master
117
118
  def use_authorization_code(server, code)
118
119
  vspinner "Exchanging authorization code for an access token from Kontena Master" do
119
120
  client = Kontena::Client.new(server.url, server.token)
120
- response = client.exchange_code(code) rescue nil
121
-
122
- if response && response.kind_of?(Hash) && !response.has_key?('error')
123
- if response['server'] && response['server']['name']
124
- server.name ||= response['server']['name']
125
- server.username = response['user']['name'] || response['user']['email']
126
- config.current_server = server.name
127
- end
128
-
129
- server.token = Kontena::Cli::Config::Token.new(
130
- access_token: response['access_token'],
131
- refresh_token: response['refresh_token'],
132
- expires_at: response['expires_in'].to_i > 0 ? Time.now.utc.to_i + response['expires_in'].to_i : nil,
133
- )
121
+ begin
122
+ response = client.exchange_code(code)
123
+ rescue StandardError => ex
124
+ ENV["DEBUG"] && puts("#{ex}\n#{ex.backtrace.join(" \n")}")
125
+ exit_with_error "Code exchange failed: #{ex}"
126
+ end
127
+
128
+ if response['server'] && response['server']['name']
129
+ server.name ||= response['server']['name']
130
+ server.username = response['user']['name'] || response['user']['email']
131
+ config.current_server = server.name
134
132
  else
135
- raise Kontena::Errors::StandardError.new(500, 'Code exchange failed')
133
+ raise Kontena::Errors::StandardError.new(500, 'Code exchange invalid response')
136
134
  end
135
+
136
+ server.token = Kontena::Cli::Config::Token.new(
137
+ access_token: response['access_token'],
138
+ refresh_token: response['refresh_token'],
139
+ expires_at: response['expires_in'].to_i > 0 ? Time.now.utc.to_i + response['expires_in'].to_i : nil,
140
+ )
137
141
  end
138
142
  true
139
143
  end
@@ -166,17 +170,20 @@ module Kontena::Cli::Master
166
170
 
167
171
  def get_authorization_url(web_server_port = nil)
168
172
  authorization_url = nil
173
+
174
+ http_client = Kontena::Client.new(self.url)
175
+
169
176
  vspinner "Sending authentication request to receive an authorization URL" do
170
- client.request(
177
+ http_client.request(
171
178
  http_method: :get,
172
179
  path: build_auth_url_path(web_server_port),
173
180
  expects: [501, 400, 302, 403],
174
181
  auth: false
175
182
  )
176
183
 
177
- case client.last_response.status
184
+ case http_client.last_response.status
178
185
  when 302
179
- authorization_url = client.last_response.headers['Location']
186
+ authorization_url = http_client.last_response.headers['Location']
180
187
  when 501
181
188
  exit_with_error "Authentication provider not configured"
182
189
  when 403
@@ -1,4 +1,5 @@
1
1
  require_relative 'services_helper'
2
+ require 'shellwords'
2
3
 
3
4
  module Kontena::Cli::Services
4
5
  class CreateCommand < Kontena::Command
@@ -71,7 +72,7 @@ module Kontena::Cli::Services
71
72
  data[:env] = env_list unless env_list.empty?
72
73
  data[:secrets] = parse_secrets(secret_list)
73
74
  data[:container_count] = instances if instances
74
- data[:cmd] = cmd.split(" ") if cmd
75
+ data[:cmd] = Shellwords.split(cmd) if cmd
75
76
  data[:user] = user if user
76
77
  data[:image] = parse_image(image) if image
77
78
  data[:privileged] = privileged?
@@ -1,4 +1,5 @@
1
1
  require_relative 'services_helper'
2
+ require 'shellwords'
2
3
 
3
4
  module Kontena::Cli::Services
4
5
  class UpdateCommand < Kontena::Command
@@ -63,7 +64,7 @@ module Kontena::Cli::Services
63
64
  data[:env] = env_list unless env_list.empty?
64
65
  data[:secrets] = parse_secrets(secret_list) unless secret_list.empty?
65
66
  data[:container_count] = instances if instances
66
- data[:cmd] = cmd.split(" ") if cmd
67
+ data[:cmd] = Shellwords.split(cmd) if cmd
67
68
  data[:user] = user if user
68
69
  data[:image] = parse_image(image) if image
69
70
  data[:privileged] = privileged?
@@ -10,6 +10,7 @@ module Kontena::Cli::Vpn
10
10
  stdout, stderr = client(require_token).post("containers/#{current_grid}/vpn/vpn-1/exec", payload)
11
11
  if linux?
12
12
  stdout << "\n"
13
+ stdout << "script-security 2 system\n"
13
14
  stdout << "up /etc/openvpn/update-resolv-conf\n"
14
15
  stdout << "down /etc/openvpn/update-resolv-conf\n"
15
16
  end
@@ -56,9 +56,9 @@ module Kontena
56
56
  @http_client = Excon.new(
57
57
  api_url,
58
58
  omit_default_port: true,
59
- connect_timeout: ENV["EXCON_CONNECT_TIMEOUT"] || 5,
60
- read_timeout: ENV["EXCON_READ_TIMEOUT"] || 30,
61
- write_timeout: ENV["EXCON_WRITE_TIMEOUT"] || 5
59
+ connect_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_i : 5,
60
+ read_timeout: ENV["EXCON_READ_TIMEOUT"] ? ENV["EXCON_READ_TIMEOUT"].to_i : 30,
61
+ write_timeout: ENV["EXCON_WRITE_TIMEOUT"] ? ENV["EXCON_WRITE_TIMEOUT"].to_i : 5
62
62
  )
63
63
 
64
64
  @default_headers = {
@@ -3,9 +3,9 @@ require_relative '../spec_helper'
3
3
  # Lots of coverage already in Common spec
4
4
  describe Kontena::Cli::Config do
5
5
 
6
- context 'base' do
7
- let(:subject) { described_class.instance }
6
+ let(:subject) { described_class.instance }
8
7
 
8
+ context 'base' do
9
9
  before(:each) do
10
10
  allow(File).to receive(:exist?).and_return(false)
11
11
  allow(File).to receive(:write).and_return(true)
@@ -52,6 +52,37 @@ describe Kontena::Cli::Config do
52
52
  end
53
53
  end
54
54
 
55
+ context 'duplicates' do
56
+ before(:each) do
57
+ allow(File).to receive(:exist?).and_return(true)
58
+ allow(File).to receive(:readable?).and_return(true)
59
+ allow(File).to receive(:write).and_return(true)
60
+ allow(File).to receive(:read).and_return <<-EOB
61
+ {"current_server": "test123",
62
+ "servers" : [
63
+ {
64
+ "name": "test123",
65
+ "url": "https://foo.example.com"
66
+ },
67
+ {
68
+ "name": "test123",
69
+ "url": "https://foo2.example.com"
70
+ }
71
+ ]
72
+ }
73
+ EOB
74
+
75
+ subject.class.reset_instance
76
+ end
77
+
78
+ it 'renames duplicate entries on load' do
79
+ puts subject.servers.inspect
80
+ expect(subject.servers.size).to eq 2
81
+ expect(subject.servers.first.name).not_to eq subject.servers.last.name
82
+ expect(subject.servers.last.name).to eq "test123-2"
83
+ end
84
+ end
85
+
55
86
  describe 'Token' do
56
87
  let(:subject) { Kontena::Cli::Config::Token.new(access_token: 'abcd', expires_at: Time.now.utc - 100) }
57
88
 
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.16.0
4
+ version: 0.16.1.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: 2016-10-25 00:00:00.000000000 Z
11
+ date: 2016-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -466,9 +466,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
466
466
  version: 2.0.0
467
467
  required_rubygems_version: !ruby/object:Gem::Requirement
468
468
  requirements:
469
- - - ">="
469
+ - - ">"
470
470
  - !ruby/object:Gem::Version
471
- version: '0'
471
+ version: 1.3.1
472
472
  requirements: []
473
473
  rubyforge_project:
474
474
  rubygems_version: 2.5.1