kontena-cli 0.16.1.rc1 → 0.16.1.rc2
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be3c8f5234712118a790b7f856228bb23ffbf71f
|
4
|
+
data.tar.gz: 7ecf734b79afacd69b7e627d76d39713f72f42dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c100040a30909a54ce1c780f0a18702a318f18bdf17e0c478ca41caf7b1cdac0f6a7a49e86608a65d86d02b4d5a382212ac98e561bad3267bced1c0980754a20
|
7
|
+
data.tar.gz: c9c71d667d60fa94d37fc73c87008d57e6e44d391e67f23805e932148db29d86437ef69377eaab0bc379523f634aad1faae36c3bc22265deae746e71223b49f8
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.16.1.
|
1
|
+
0.16.1.rc2
|
@@ -34,8 +34,8 @@ module Kontena::Cli::Cloud::Master
|
|
34
34
|
|
35
35
|
response = cloud_client.post('user/masters', { data: { attributes: attributes } })
|
36
36
|
exit_with_error "Failed (invalid response)" unless response.kind_of?(Hash)
|
37
|
-
exit_with_error "Failed (no data)" unless response['data']
|
38
37
|
exit_with_error "Failed: #{response['error']}" if response['error']
|
38
|
+
exit_with_error "Failed (no data)" unless response['data']
|
39
39
|
response
|
40
40
|
end
|
41
41
|
|
@@ -100,13 +100,14 @@ module Kontena::Cli::Cloud::Master
|
|
100
100
|
args = []
|
101
101
|
args << "--provider #{self.provider.shellescape}" if self.provider
|
102
102
|
args << "--version #{self.version.shellescape}" if self.version
|
103
|
+
args << self.cloud_master_id
|
103
104
|
Kontena.run("cloud master update #{args.join(' ')}")
|
104
105
|
end
|
105
106
|
end
|
106
107
|
end
|
107
108
|
else
|
108
109
|
response = spinner "Registering current Kontena Master '#{current_master.name}' #{" as '#{new_name}' " unless new_name == current_master.name}to Kontena Cloud" do
|
109
|
-
register(new_name, current_master.url)
|
110
|
+
register(new_name, current_master.url, self.provider, nil, self.version)
|
110
111
|
end
|
111
112
|
end
|
112
113
|
|
@@ -98,7 +98,7 @@ module Kontena::Cli::Master
|
|
98
98
|
config.current_server = existing_server.name
|
99
99
|
existing_server
|
100
100
|
else
|
101
|
-
new_server = Kontena::Cli::Config::Server.new(url:
|
101
|
+
new_server = Kontena::Cli::Config::Server.new(url: url, name: self.name)
|
102
102
|
config.servers << new_server
|
103
103
|
config.current_server = new_server.name
|
104
104
|
new_server
|
@@ -127,17 +127,19 @@ module Kontena::Cli::Master
|
|
127
127
|
|
128
128
|
if response['server'] && response['server']['name']
|
129
129
|
server.name ||= response['server']['name']
|
130
|
+
end
|
131
|
+
|
132
|
+
if response['user']
|
130
133
|
server.username = response['user']['name'] || response['user']['email']
|
131
|
-
config.current_server = server.name
|
132
|
-
else
|
133
|
-
raise Kontena::Errors::StandardError.new(500, 'Code exchange invalid response')
|
134
134
|
end
|
135
135
|
|
136
136
|
server.token = Kontena::Cli::Config::Token.new(
|
137
137
|
access_token: response['access_token'],
|
138
138
|
refresh_token: response['refresh_token'],
|
139
|
-
expires_at: response['expires_in']
|
139
|
+
expires_at: in_to_at(response['expires_in']),
|
140
140
|
)
|
141
|
+
|
142
|
+
config.current_server = server.name
|
141
143
|
end
|
142
144
|
true
|
143
145
|
end
|
@@ -200,7 +202,7 @@ module Kontena::Cli::Master
|
|
200
202
|
sputs url
|
201
203
|
else
|
202
204
|
puts "Visit this URL in a browser:"
|
203
|
-
puts "
|
205
|
+
puts "#{url}"
|
204
206
|
puts
|
205
207
|
puts "Then complete the authentication by using:"
|
206
208
|
puts "kontena master login --code <CODE FROM BROWSER>"
|
@@ -269,10 +271,12 @@ module Kontena::Cli::Master
|
|
269
271
|
server.name = self.name
|
270
272
|
elsif response['server'] && response['server']['name']
|
271
273
|
server.name = response['server']['name']
|
272
|
-
elsif config.find_server('
|
273
|
-
|
274
|
+
elsif config.find_server('kontena-master')
|
275
|
+
new_name = "kontena-master-2"
|
276
|
+
new_name.succ! until config.find_server(new_name).nil?
|
277
|
+
server.name = new_name
|
274
278
|
else
|
275
|
-
server.name = "
|
279
|
+
server.name = "kontena-master"
|
276
280
|
end
|
277
281
|
end
|
278
282
|
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require_relative "../../../../spec_helper"
|
2
|
+
require 'kontena/cli/cloud/master/add_command'
|
3
|
+
|
4
|
+
describe Kontena::Cli::Cloud::Master::AddCommand do
|
5
|
+
|
6
|
+
include ClientHelpers
|
7
|
+
|
8
|
+
let(:subject) do
|
9
|
+
described_class.new(File.basename($0))
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:client) { double }
|
13
|
+
|
14
|
+
before(:each) do
|
15
|
+
allow(subject).to receive(:cloud_client).and_return(client)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#register" do
|
19
|
+
it 'posts valid data to cloud' do
|
20
|
+
expect(client).to receive(:post).with(
|
21
|
+
'user/masters',
|
22
|
+
hash_including(
|
23
|
+
data: {
|
24
|
+
attributes: {
|
25
|
+
'name' => 'name',
|
26
|
+
'url' => 'url',
|
27
|
+
'provider' => 'provider',
|
28
|
+
'redirect-uri' => 'redirect-uri',
|
29
|
+
'version' => 'version',
|
30
|
+
'owner' => 'owner',
|
31
|
+
}
|
32
|
+
}
|
33
|
+
)
|
34
|
+
).and_return({'data' => { attributes: {}}})
|
35
|
+
subject.register("name", "url", "provider", "redirect-uri", "version", "owner")
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'raises if cloud respons with error' do
|
39
|
+
expect(client).to receive(:post).and_return({'error' => 'foofoo'})
|
40
|
+
expect(subject).to receive(:exit_with_error).at_least(:once)
|
41
|
+
subject.register("name", "url", "provider", "redirect-uri", "version", "owner")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#new_cloud_master_name" do
|
46
|
+
it 'returns a suffixed name if duplicates exist' do
|
47
|
+
allow(subject).to receive(:cloud_masters).and_return(
|
48
|
+
[
|
49
|
+
{
|
50
|
+
"attributes" => {
|
51
|
+
"name" => "foofoo"
|
52
|
+
}
|
53
|
+
}
|
54
|
+
]
|
55
|
+
)
|
56
|
+
|
57
|
+
expect(subject.new_cloud_master_name("foofoo2")).to eq "foofoo2"
|
58
|
+
expect(subject.new_cloud_master_name("foofoo")).to eq "foofoo-2"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#register_current' do
|
63
|
+
let(:current_master) { Kontena::Cli::Config::Server.new(name: 'foofoo', url: 'foofoofoo') }
|
64
|
+
let(:success_response) {
|
65
|
+
{
|
66
|
+
'data' => {
|
67
|
+
'attributes' => {
|
68
|
+
'client-id' => '123',
|
69
|
+
'client-secret' => '345',
|
70
|
+
'provider' => 'foo',
|
71
|
+
'version' => '0.0.0',
|
72
|
+
'owner' => 'pwner'
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
before(:each) do
|
79
|
+
allow(subject).to receive(:require_api_url).and_return(true)
|
80
|
+
allow(subject).to receive(:require_token).and_return(true)
|
81
|
+
allow(subject).to receive(:force?).and_return(true)
|
82
|
+
allow(subject).to receive(:current_master).and_return(current_master)
|
83
|
+
allow(subject).to receive(:cloud_masters).and_return([])
|
84
|
+
allow(client).to receive(:post).and_return(success_response)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'calls register with proper arguments without cloud-master-id' do
|
88
|
+
expect(subject).to receive(:register) do |name, url, provider, redirect_uri, version|
|
89
|
+
expect(name).to eq current_master.name
|
90
|
+
expect(url).to eq current_master.url
|
91
|
+
expect(provider).to eq 'provider'
|
92
|
+
expect(version).to eq '10.10.10'
|
93
|
+
expect(redirect_uri).to be_nil
|
94
|
+
end.and_return(success_response)
|
95
|
+
|
96
|
+
subject.provider = 'provider'
|
97
|
+
subject.version = '10.10.10'
|
98
|
+
|
99
|
+
expect(Kontena).to receive(:run).with('master config import --force --preset kontena_auth_provider')
|
100
|
+
expect(Kontena).to receive(:run).with('master config set oauth2.client_id=123 oauth2.client_secret=345 server.root_url=foofoofoo server.name=foofoo cloud.provider_is_kontena=true')
|
101
|
+
|
102
|
+
subject.register_current
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'calls register with proper arguments with cloud-master-id' do
|
106
|
+
expect(subject).to receive(:get_existing).with('abcd').and_return(success_response)
|
107
|
+
|
108
|
+
subject.provider = 'provider'
|
109
|
+
subject.version = '10.10.10'
|
110
|
+
subject.cloud_master_id = 'abcd'
|
111
|
+
|
112
|
+
expect(Kontena).to receive(:run).with('cloud master update --provider provider --version 10.10.10 abcd').and_return(true)
|
113
|
+
expect(Kontena).to receive(:run).with('master config import --force --preset kontena_auth_provider').and_return(true)
|
114
|
+
expect(Kontena).to receive(:run).with('master config set oauth2.client_id=123 oauth2.client_secret=345 server.root_url=foofoofoo server.name=foofoo cloud.provider_is_kontena=true').and_return(true)
|
115
|
+
|
116
|
+
subject.register_current
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
@@ -0,0 +1,215 @@
|
|
1
|
+
require_relative "../../../spec_helper"
|
2
|
+
require 'kontena/cli/master/login_command'
|
3
|
+
|
4
|
+
describe Kontena::Cli::Master::LoginCommand do
|
5
|
+
|
6
|
+
include ClientHelpers
|
7
|
+
|
8
|
+
let(:subject) do
|
9
|
+
described_class.new(File.basename($0))
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:config) { double }
|
13
|
+
|
14
|
+
before(:each) do
|
15
|
+
allow(subject).to receive(:config).and_return(config)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#use_current_master_if_available' do
|
19
|
+
context 'url not given' do
|
20
|
+
it 'sets local url current master url if defined' do
|
21
|
+
expect(config).to receive(:current_master).twice.and_return(Kontena::Cli::Config::Server.new(url: 'foo'))
|
22
|
+
expect(subject).to receive(:url=).with('foo')
|
23
|
+
expect(subject.use_current_master_if_available).to be_truthy
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'raises if no current master and no url' do
|
27
|
+
subject.url = nil
|
28
|
+
expect(config).to receive(:current_master).and_return(nil)
|
29
|
+
expect(subject).to receive(:exit_with_error)
|
30
|
+
subject.use_current_master_if_available
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'url given' do
|
35
|
+
it 'returns nil' do
|
36
|
+
subject.url = 'foofoo'
|
37
|
+
expect(subject.use_current_master_if_available).to be_nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#use_master_by_name' do
|
43
|
+
context 'url given' do
|
44
|
+
it 'should return nil when url looks like an url' do
|
45
|
+
subject.url = 'http://foo'
|
46
|
+
expect(subject).not_to receive(:config)
|
47
|
+
expect(subject.use_master_by_name).to be_nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'name given' do
|
52
|
+
it 'should try to look for servers by name' do
|
53
|
+
expect(config).to receive(:find_server).and_return(Kontena::Cli::Config::Server.new(url: 'https://foo'))
|
54
|
+
subject.url = 'foomaster'
|
55
|
+
expect(subject).to receive(:url=).with('https://foo')
|
56
|
+
subject.use_master_by_name
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#find_server_or_create_new' do
|
62
|
+
|
63
|
+
let(:existing_server) { Kontena::Cli::Config::Server.new(url: 'https://foo', name: 'existing') }
|
64
|
+
|
65
|
+
it 'should try to pick up an existing server from config' do
|
66
|
+
subject.name = 'name'
|
67
|
+
expect(config).to receive(:find_server_by).with(url: 'foo', name: 'name').and_return(existing_server)
|
68
|
+
expect(config).to receive(:current_server=).with(existing_server.name)
|
69
|
+
expect(subject.find_server_or_create_new('foo')).to eq existing_server
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should create a new server instance if existing not found' do
|
73
|
+
expect(config).to receive(:find_server_by).and_return(nil)
|
74
|
+
subject.name = "foofoo1"
|
75
|
+
servers = []
|
76
|
+
expect(config).to receive(:servers).and_return(servers)
|
77
|
+
expect(config).to receive(:current_server=).with('foofoo1')
|
78
|
+
expect(subject.find_server_or_create_new('http://foo').name).to eq 'foofoo1'
|
79
|
+
expect(servers.first.url).to eq 'http://foo'
|
80
|
+
expect(servers.first.name).to eq 'foofoo1'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '#set_server_token' do
|
85
|
+
let(:server) { Kontena::Cli::Config::Server.new(name: 'some_server') }
|
86
|
+
let(:token) { Kontena::Cli::Config::Token.new(access_token: 'bartoken') }
|
87
|
+
|
88
|
+
it 'should set token from parameters as the servers access token' do
|
89
|
+
subject.token = 'footoken'
|
90
|
+
expect(server).to receive(:token=) do |token|
|
91
|
+
expect(token.access_token).to eq 'footoken'
|
92
|
+
end
|
93
|
+
subject.set_server_token(server)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should clear servers existing token when forced' do
|
97
|
+
subject.force = true
|
98
|
+
server.token = token
|
99
|
+
subject.set_server_token(server)
|
100
|
+
expect(server.access_token).to be_nil
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should add a blank token if server has none' do
|
104
|
+
server.token = nil
|
105
|
+
subject.set_server_token(server)
|
106
|
+
expect(server.access_token).to be_nil
|
107
|
+
expect(server.token.parent_name).to eq 'some_server'
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should keep the existing token unless a new one is supplied' do
|
111
|
+
server.token = token
|
112
|
+
subject.token = nil
|
113
|
+
subject.force = false
|
114
|
+
subject.set_server_token(server)
|
115
|
+
expect(server.token).to eq token
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#use_authorization_code' do
|
120
|
+
let(:client) { double }
|
121
|
+
|
122
|
+
before(:each) do
|
123
|
+
allow(subject.config).to receive(:current_server=)
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should set the local name to name provided from server if no name was set' do
|
127
|
+
expect(Kontena::Client).to receive(:new).and_return(client)
|
128
|
+
expect(client).to receive(:exchange_code).with('abcd1234').and_return(
|
129
|
+
{
|
130
|
+
'access_token' => 'token',
|
131
|
+
'refresh_token' => 'refresh_token',
|
132
|
+
'expires_in' => 1000,
|
133
|
+
'server' => {
|
134
|
+
'name' => 'foofoo1'
|
135
|
+
}
|
136
|
+
}
|
137
|
+
)
|
138
|
+
|
139
|
+
server = Kontena::Cli::Config::Server.new(name: nil, url: 'http://foo')
|
140
|
+
subject.use_authorization_code(server, 'abcd1234')
|
141
|
+
expect(server.token.access_token).to eq 'token'
|
142
|
+
expect(server.name).to eq 'foofoo1'
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'should not touch the local name if the server already has a name' do
|
146
|
+
expect(Kontena::Client).to receive(:new).and_return(client)
|
147
|
+
expect(client).to receive(:exchange_code).with('abcd1234').and_return(
|
148
|
+
{
|
149
|
+
'access_token' => 'token',
|
150
|
+
'refresh_token' => 'refresh_token',
|
151
|
+
'expires_in' => 1000,
|
152
|
+
'server' => {
|
153
|
+
'name' => 'foofoo1'
|
154
|
+
}
|
155
|
+
}
|
156
|
+
)
|
157
|
+
|
158
|
+
server = Kontena::Cli::Config::Server.new(name: 'foofoo2', url: 'http://foo')
|
159
|
+
subject.use_authorization_code(server, 'abcd1234')
|
160
|
+
expect((Time.now.utc.to_i+800..Time.now.utc.to_i+1100).cover?(server.token.expires_at.to_i)).to be_truthy
|
161
|
+
expect(server.name).to eq 'foofoo2'
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe '#in_to_at' do
|
166
|
+
it 'should return nil when expires_in is <0 or nil' do
|
167
|
+
expect(subject.in_to_at(0)).to be_nil
|
168
|
+
expect(subject.in_to_at(-1)).to be_nil
|
169
|
+
expect(subject.in_to_at(nil)).to be_nil
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'should return a timestamp when expires_in is >0' do
|
173
|
+
time = Time.now.utc.to_i
|
174
|
+
expect((time + 80..time + 120).cover?(subject.in_to_at(100))).to be_truthy
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe '#update_server_name' do
|
179
|
+
let(:server) { Kontena::Cli::Config::Server.new }
|
180
|
+
let(:response) { { 'access_token' => 'token', 'server' => { 'name' => 'foo2' } } }
|
181
|
+
|
182
|
+
it 'should do nothing if server already has a name' do
|
183
|
+
server.name = 'foofoofoo'
|
184
|
+
subject.update_server_name(server, response)
|
185
|
+
expect(server.name).to eq 'foofoofoo'
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'should set the name from name parameter if set' do
|
189
|
+
subject.name = 'abcd'
|
190
|
+
subject.update_server_name(server, response)
|
191
|
+
expect(server.name).to eq 'abcd'
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'should set the name from server response if returned' do
|
195
|
+
subject.update_server_name(server, response)
|
196
|
+
expect(server.name).to eq 'foo2'
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'should use a default name if no other can be figured out' do
|
200
|
+
expect(subject.config).to receive(:find_server).with('kontena-master').and_return(nil)
|
201
|
+
subject.update_server_name(server, response.reject{|k,v| k=='server'})
|
202
|
+
expect(server.name).to eq 'kontena-master'
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should use a default name with suffix if one already exists' do
|
206
|
+
expect(subject.config).to receive(:find_server).with('kontena-master').and_return(true)
|
207
|
+
expect(subject.config).to receive(:find_server).with('kontena-master-2').and_return(true)
|
208
|
+
expect(subject.config).to receive(:find_server).with('kontena-master-3').and_return(nil)
|
209
|
+
subject.update_server_name(server, response.reject{|k,v| k=='server'})
|
210
|
+
expect(server.name).to eq 'kontena-master-3'
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
|
215
|
+
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.16.1.
|
4
|
+
version: 0.16.1.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-10-
|
11
|
+
date: 2016-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -416,6 +416,7 @@ files:
|
|
416
416
|
- spec/kontena/cli/app/yaml/validator_spec.rb
|
417
417
|
- spec/kontena/cli/app/yaml/validator_v2_spec.rb
|
418
418
|
- spec/kontena/cli/cloud/logout_command_spec.rb
|
419
|
+
- spec/kontena/cli/cloud/master/add_command_spec.rb
|
419
420
|
- spec/kontena/cli/common_spec.rb
|
420
421
|
- spec/kontena/cli/containers/containers_helper_spec.rb
|
421
422
|
- spec/kontena/cli/containers/logs_command_spec.rb
|
@@ -426,6 +427,7 @@ files:
|
|
426
427
|
- spec/kontena/cli/helpers/log_helper_spec.rb
|
427
428
|
- spec/kontena/cli/main_command_spec.rb
|
428
429
|
- spec/kontena/cli/master/current_command_spec.rb
|
430
|
+
- spec/kontena/cli/master/login_command_spec.rb
|
429
431
|
- spec/kontena/cli/master/logout_command_spec.rb
|
430
432
|
- spec/kontena/cli/master/use_command_spec.rb
|
431
433
|
- spec/kontena/cli/master/users/invite_command_spec.rb
|
@@ -509,6 +511,7 @@ test_files:
|
|
509
511
|
- spec/kontena/cli/app/yaml/validator_spec.rb
|
510
512
|
- spec/kontena/cli/app/yaml/validator_v2_spec.rb
|
511
513
|
- spec/kontena/cli/cloud/logout_command_spec.rb
|
514
|
+
- spec/kontena/cli/cloud/master/add_command_spec.rb
|
512
515
|
- spec/kontena/cli/common_spec.rb
|
513
516
|
- spec/kontena/cli/containers/containers_helper_spec.rb
|
514
517
|
- spec/kontena/cli/containers/logs_command_spec.rb
|
@@ -519,6 +522,7 @@ test_files:
|
|
519
522
|
- spec/kontena/cli/helpers/log_helper_spec.rb
|
520
523
|
- spec/kontena/cli/main_command_spec.rb
|
521
524
|
- spec/kontena/cli/master/current_command_spec.rb
|
525
|
+
- spec/kontena/cli/master/login_command_spec.rb
|
522
526
|
- spec/kontena/cli/master/logout_command_spec.rb
|
523
527
|
- spec/kontena/cli/master/use_command_spec.rb
|
524
528
|
- spec/kontena/cli/master/users/invite_command_spec.rb
|