kontena-cli 0.6.1 → 0.7.0

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.
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env bash
2
+
3
+ _kontena_complete() {
4
+ COMPREPLY=()
5
+ DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
6
+ local word="${COMP_WORDS[COMP_CWORD]}"
7
+ local completions="$(${DIR}/completer ${COMP_WORDS[*]})"
8
+ COMPREPLY=( $(compgen -W "$completions" -- "$word") )
9
+ }
10
+
11
+ complete -F _kontena_complete kontena
@@ -0,0 +1,59 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/server/user"
3
+
4
+ module Kontena::Cli::Server
5
+ describe User do
6
+ describe '#register' do
7
+
8
+ let(:auth_client) do
9
+ double(Kontena::Client)
10
+ end
11
+
12
+ it 'asks email' do
13
+ expect(subject).to receive(:ask).once.and_return('john.doe@acme.io')
14
+ allow(subject).to receive(:password).and_return('secret')
15
+ allow(Kontena::Client).to receive(:new).and_return(auth_client)
16
+ allow(auth_client).to receive(:post)
17
+ subject.register(nil, {})
18
+ end
19
+
20
+ it 'asks password twice' do
21
+ allow(subject).to receive(:ask).once.and_return('john.doe@acme.io')
22
+ expect(subject).to receive(:password).twice.and_return('secret')
23
+ allow(Kontena::Client).to receive(:new).and_return(auth_client)
24
+ allow(auth_client).to receive(:post)
25
+ subject.register(nil, {})
26
+ end
27
+
28
+ it 'validates given passwords' do
29
+ allow(subject).to receive(:ask).once.and_return('john.doe@acme.io')
30
+ expect(subject).to receive(:password).twice.and_return('secret', 'secret2')
31
+ expect{subject.register(nil, {})}.to raise_error(ArgumentError)
32
+ end
33
+
34
+ it 'uses https://auth.kontena.io as default auth provider' do
35
+ allow(subject).to receive(:ask).and_return('john.doe@acme.io')
36
+ allow(subject).to receive(:password).and_return('secret')
37
+ expect(Kontena::Client).to receive(:new).with('https://auth.kontena.io').and_return(auth_client)
38
+ allow(auth_client).to receive(:post)
39
+ subject.register(nil, {})
40
+ end
41
+
42
+ it 'uses given auth provider' do
43
+ allow(subject).to receive(:ask).and_return('john.doe@acme.io')
44
+ allow(subject).to receive(:password).and_return('secret')
45
+ expect(Kontena::Client).to receive(:new).with('http://custom.auth-provider.io').and_return(auth_client)
46
+ allow(auth_client).to receive(:post)
47
+ subject.register('http://custom.auth-provider.io', {})
48
+ end
49
+
50
+ it 'sends register request to auth provider' do
51
+ allow(subject).to receive(:ask).and_return('john.doe@acme.io')
52
+ allow(subject).to receive(:password).and_return('secret')
53
+ allow(Kontena::Client).to receive(:new).with('https://auth.kontena.io').and_return(auth_client)
54
+ expect(auth_client).to receive(:post).with('users', {email: 'john.doe@acme.io', password: 'secret'})
55
+ subject.register(nil, {})
56
+ end
57
+ end
58
+ end
59
+ end
@@ -17,39 +17,40 @@ module Kontena::Cli::Services
17
17
 
18
18
  before(:each) do
19
19
  allow(subject).to receive(:client).with(token).and_return(client)
20
+ allow(subject).to receive(:current_grid).and_return('test-grid')
20
21
  end
21
22
 
22
23
  describe '#create_service' do
23
- it 'creates POST grids/:id/services request to Kontena Server' do
24
- expect(client).to receive(:post).with('grids/1/services', {'name' => 'test-service'})
25
- subject.create_service(token, '1', {'name' => 'test-service'})
24
+ it 'creates POST grids/:grid/:name/services request to Kontena Server' do
25
+ expect(client).to receive(:post).with('grids/test-grid/services', {'name' => 'test-service'})
26
+ subject.create_service(token, 'test-grid', {'name' => 'test-service'})
26
27
  end
27
28
  end
28
29
 
29
30
  describe '#update_service' do
30
31
  it 'creates PUT services/:id request to Kontena Server' do
31
- expect(client).to receive(:put).with('services/1', {'name' => 'test-service'})
32
+ expect(client).to receive(:put).with('services/test-grid/1', {'name' => 'test-service'})
32
33
  subject.update_service(token, '1', {'name' => 'test-service'})
33
34
  end
34
35
  end
35
36
 
36
37
  describe '#get_service' do
37
38
  it 'creates GET services/:id request to Kontena Server' do
38
- expect(client).to receive(:get).with('services/test-service')
39
+ expect(client).to receive(:get).with('services/test-grid/test-service')
39
40
  subject.get_service(token, 'test-service')
40
41
  end
41
42
  end
42
43
 
43
44
  describe '#deploy_service' do
44
45
  it 'creates POST services/:id/deploy request to Kontena Server' do
45
- allow(client).to receive(:get).with('services/1').and_return({'state' => 'running'})
46
- expect(client).to receive(:post).with('services/1/deploy', {'strategy' => 'ha'})
46
+ allow(client).to receive(:get).with('services/test-grid/1').and_return({'state' => 'running'})
47
+ expect(client).to receive(:post).with('services/test-grid/1/deploy', {'strategy' => 'ha'})
47
48
  subject.deploy_service(token, '1', {'strategy' => 'ha'})
48
49
  end
49
50
 
50
51
  it 'polls Kontena Server until service is running' do
51
- allow(client).to receive(:post).with('services/1/deploy', anything)
52
- expect(client).to receive(:get).with('services/1').twice.and_return({'state' => 'deploying'}, {'state' => 'running'})
52
+ allow(client).to receive(:post).with('services/test-grid/1/deploy', anything)
53
+ expect(client).to receive(:get).with('services/test-grid/1').twice.and_return({'state' => 'deploying'}, {'state' => 'running'})
53
54
 
54
55
  subject.deploy_service(token, '1', {'strategy' => 'ha'})
55
56
  end
@@ -100,4 +101,4 @@ module Kontena::Cli::Services
100
101
  end
101
102
  end
102
103
  end
103
- end
104
+ end
@@ -11,6 +11,28 @@ module Kontena::Cli::Stacks
11
11
  '1234567'
12
12
  end
13
13
 
14
+ let(:yml) do
15
+ content = <<content
16
+ wordpress:
17
+ image: wordpress:4.1
18
+ stateful: true
19
+ ports:
20
+ - 80:80
21
+ links:
22
+ - mysql:mysql
23
+ environment:
24
+ - WORDPRESS_DB_PASSWORD=%{prefix}_secret
25
+ instances: 2
26
+ deploy:
27
+ strategy: ha
28
+ mysql:
29
+ image: mysql:5.6
30
+ stateful: true
31
+ environment:
32
+ - MYSQL_ROOT_PASSWORD=%{prefix}_secret
33
+ content
34
+ content
35
+ end
14
36
 
15
37
  let(:services) do
16
38
  {
@@ -35,7 +57,7 @@ module Kontena::Cli::Stacks
35
57
  end
36
58
 
37
59
  let(:options) do
38
- options = double({prefix: false, file: false})
60
+ options = double({prefix: false, file: false, service: nil})
39
61
  end
40
62
 
41
63
  let(:env_vars) do
@@ -64,8 +86,7 @@ module Kontena::Cli::Stacks
64
86
  context 'when api url and token are valid' do
65
87
  before(:each) do
66
88
  allow(subject).to receive(:settings).and_return(settings)
67
- allow(YAML).to receive(:load).and_return(services)
68
- allow(File).to receive(:read)
89
+ allow(File).to receive(:read).and_return(yml)
69
90
  allow(subject).to receive(:get_service).and_raise(Kontena::Errors::StandardError.new(404, 'Not Found'))
70
91
  allow(subject).to receive(:create_service).and_return({'id' => 'kontena-test-mysql'},{'id' => 'kontena-test-wordpress'})
71
92
  allow(subject).to receive(:current_grid).and_return('1')
@@ -74,28 +95,28 @@ module Kontena::Cli::Stacks
74
95
 
75
96
  it 'reads ./kontena.yml file by default' do
76
97
  allow(subject).to receive(:settings).and_return(settings)
77
-
78
- expect(File).to receive(:read).with('./kontena.yml')
98
+ expect(File).to receive(:read).with('./kontena.yml').and_return(yml)
79
99
  expect(options).to receive(:file).once.and_return(false)
80
100
  subject.deploy(options)
81
101
  end
82
102
 
83
103
  it 'reads given yml file' do
84
104
  expect(options).to receive(:file).once.and_return('custom.yml')
85
- expect(File).to receive(:read).with('custom.yml')
105
+ expect(File).to receive(:read).with('custom.yml').and_return(yml)
86
106
  subject.deploy(options)
87
107
  end
88
108
 
89
109
  it 'uses current directory as service name prefix by default' do
90
110
  current_dir = '/kontena/tests/stacks'
91
111
  allow(Dir).to receive(:getwd).and_return(current_dir)
92
- expect(File).to receive(:basename).with(current_dir)
112
+ expect(File).to receive(:basename).with(current_dir).and_return('stacks')
93
113
  subject.deploy(options)
94
114
  end
95
115
 
96
116
  context 'when yml file has multiple env files' do
97
117
  it 'merges environment variables correctly' do
98
118
  allow(subject).to receive(:current_dir).and_return("kontena-test")
119
+ allow(YAML).to receive(:load).and_return(services)
99
120
  services['wordpress']['environment'] = ['MYSQL_ADMIN_PASSWORD=password']
100
121
  services['wordpress']['env_file'] = %w(/path/to/env_file .env)
101
122
 
@@ -120,6 +141,7 @@ module Kontena::Cli::Stacks
120
141
  context 'when yml file has one env file' do
121
142
  it 'merges environment variables correctly' do
122
143
  allow(subject).to receive(:current_dir).and_return("kontena-test")
144
+ allow(YAML).to receive(:load).and_return(services)
123
145
  services['wordpress']['environment'] = ['MYSQL_ADMIN_PASSWORD=password']
124
146
  services['wordpress']['env_file'] = '/path/to/env_file'
125
147
 
@@ -142,7 +164,7 @@ module Kontena::Cli::Stacks
142
164
 
143
165
  it 'creates mysql service before wordpress' do
144
166
  allow(subject).to receive(:current_dir).and_return("kontena-test")
145
- data = {:name =>"kontena-test-mysql", :image=>'mysql:5.6', :env=>nil, :container_count=>nil, :stateful=>true}
167
+ data = {:name =>"kontena-test-mysql", :image=>'mysql:5.6', :env=>["MYSQL_ROOT_PASSWORD=kontena-test_secret"], :container_count=>nil, :stateful=>true}
146
168
  expect(subject).to receive(:create_service).with('1234567', '1', data)
147
169
 
148
170
  subject.deploy(options)
@@ -153,11 +175,11 @@ module Kontena::Cli::Stacks
153
175
 
154
176
  data = {
155
177
  :name =>"kontena-test-wordpress",
156
- :image=>"wordpress:latest",
157
- :env=>nil,
178
+ :image=>"wordpress:4.1",
179
+ :env=>["WORDPRESS_DB_PASSWORD=kontena-test_secret"],
158
180
  :container_count=>2,
159
- :stateful=>false,
160
- :links=>[{:name=>"kontena-test-mysql", :alias=>"db"}],
181
+ :stateful=>true,
182
+ :links=>[{:name=>"kontena-test-mysql", :alias=>"mysql"}],
161
183
  :ports=>[{:container_port=>"80", :node_port=>"80", :protocol=>"tcp"}]
162
184
  }
163
185
  expect(subject).to receive(:create_service).with('1234567', '1', data)
@@ -172,8 +194,18 @@ module Kontena::Cli::Stacks
172
194
  subject.deploy(options)
173
195
  end
174
196
 
197
+ context 'when giving service option' do
198
+ it 'deploys only given services' do
199
+ allow(subject).to receive(:current_dir).and_return("kontena-test")
200
+ allow(options).to receive(:service).and_return(['wordpress'])
201
+ expect(subject).to receive(:create).once.with('wordpress', anything).and_return({})
202
+ expect(subject).not_to receive(:create).with('mysql', services['mysql'])
175
203
 
204
+ subject.deploy(options)
205
+ end
206
+ end
176
207
  end
208
+
177
209
  end
178
210
  end
179
211
  end
@@ -6,7 +6,6 @@
6
6
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
7
 
8
8
  RSpec.configure do |config|
9
- config.treat_symbols_as_metadata_keys_with_true_values = true
10
9
  config.run_all_when_everything_filtered = true
11
10
  config.filter_run :focus
12
11
 
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.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kontena, Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-01 00:00:00.000000000 Z
11
+ date: 2015-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -103,7 +103,9 @@ files:
103
103
  - lib/kontena/cli/containers/containers.rb
104
104
  - lib/kontena/cli/grids/audit_log.rb
105
105
  - lib/kontena/cli/grids/commands.rb
106
+ - lib/kontena/cli/grids/external_registries.rb
106
107
  - lib/kontena/cli/grids/grids.rb
108
+ - lib/kontena/cli/grids/registry.rb
107
109
  - lib/kontena/cli/grids/users.rb
108
110
  - lib/kontena/cli/grids/vpn.rb
109
111
  - lib/kontena/cli/nodes/commands.rb
@@ -122,6 +124,9 @@ files:
122
124
  - lib/kontena/cli/version.rb
123
125
  - lib/kontena/client.rb
124
126
  - lib/kontena/errors.rb
127
+ - lib/kontena/scripts/completer
128
+ - lib/kontena/scripts/init
129
+ - spec/kontena/cli/server/user_spec.rb
125
130
  - spec/kontena/cli/services/services_helper_spec.rb
126
131
  - spec/kontena/cli/stacks/stacks_spec.rb
127
132
  - spec/spec_helper.rb
@@ -151,6 +156,7 @@ signing_key:
151
156
  specification_version: 4
152
157
  summary: Kontena command line tool
153
158
  test_files:
159
+ - spec/kontena/cli/server/user_spec.rb
154
160
  - spec/kontena/cli/services/services_helper_spec.rb
155
161
  - spec/kontena/cli/stacks/stacks_spec.rb
156
162
  - spec/spec_helper.rb