bosh_cli 1.2982.0 → 1.2983.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.
- checksums.yaml +4 -4
- data/lib/cli/base_command.rb +117 -115
- data/lib/cli/client/credentials.rb +3 -3
- data/lib/cli/client/uaa/auth_info.rb +14 -7
- data/lib/cli/client/uaa/client_token_issuer.rb +0 -2
- data/lib/cli/version.rb +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebcf2ddd1601fd0a009078c3b52f043df2c81969
|
4
|
+
data.tar.gz: 3e9306e4515ddd0dd38cc8da3a31028b6d6e42ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5634530f84e9f3e1c06f28d3d3b3f6b223077a81e4cbb4b55f0daae9ed5b256379d149031365070db740b1d013c9bd3c43e3f945c0ce507d553b71158ac1ce98
|
7
|
+
data.tar.gz: 93545f71bc76fc460cad14e07122075340840220adc2f7433f466d2e2362dfc8369d2c29432f4b07edbf6dcdd5248cea51e3ca0f120ec4217733df3bea69abbd
|
data/lib/cli/base_command.rb
CHANGED
@@ -40,7 +40,7 @@ module Bosh::Cli
|
|
40
40
|
|
41
41
|
def director
|
42
42
|
@director ||= Bosh::Cli::Client::Director.new(
|
43
|
-
|
43
|
+
target, credentials, @options.select { |k, _| k == :no_track })
|
44
44
|
end
|
45
45
|
|
46
46
|
def release
|
@@ -62,7 +62,7 @@ module Bosh::Cli
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def logged_in?
|
65
|
-
!!(credentials)
|
65
|
+
!!(credentials && credentials.authorization_header)
|
66
66
|
end
|
67
67
|
|
68
68
|
def non_interactive?
|
@@ -92,6 +92,7 @@ module Bosh::Cli
|
|
92
92
|
url = config.resolve_alias(:target, raw_url) || raw_url
|
93
93
|
url ? normalize_url(url) : nil
|
94
94
|
end
|
95
|
+
|
95
96
|
alias_method :target_url, :target
|
96
97
|
|
97
98
|
# @return [String] Deployment manifest path
|
@@ -100,153 +101,154 @@ module Bosh::Cli
|
|
100
101
|
end
|
101
102
|
|
102
103
|
def credentials
|
103
|
-
|
104
|
-
return Client::UaaCredentials.new(auth_token) if auth_token
|
105
|
-
|
106
|
-
if username && password
|
107
|
-
return Client::BasicCredentials.new(username, password)
|
108
|
-
end
|
109
|
-
|
110
|
-
nil
|
111
|
-
end
|
104
|
+
return @credentials if @credentials
|
112
105
|
|
113
|
-
|
114
|
-
@uaa_token_provider ||= begin
|
115
|
-
director_client = Client::Director.new(target)
|
116
|
-
auth_info = Client::Uaa::AuthInfo.new(director_client, ENV, config.ca_cert(target))
|
106
|
+
if auth_info.uaa?
|
117
107
|
token_decoder = Client::Uaa::TokenDecoder.new
|
118
|
-
Client::Uaa::TokenProvider.new(auth_info, config, token_decoder, target)
|
108
|
+
uaa_token_provider = Client::Uaa::TokenProvider.new(auth_info, config, token_decoder, target)
|
109
|
+
@credentials = Client::UaaCredentials.new(uaa_token_provider)
|
110
|
+
elsif username && password
|
111
|
+
@credentials = Client::BasicCredentials.new(username, password)
|
119
112
|
end
|
120
|
-
end
|
121
113
|
|
122
|
-
|
123
|
-
options[:target] || config.target_name || target_url
|
114
|
+
@credentials
|
124
115
|
end
|
125
116
|
|
126
|
-
|
127
|
-
|
128
|
-
|
117
|
+
def target_name
|
118
|
+
options[:target] || config.target_name || target_url
|
119
|
+
end
|
129
120
|
|
130
|
-
|
121
|
+
def cache_dir
|
122
|
+
File.join(Dir.home, '.bosh', 'cache')
|
123
|
+
end
|
131
124
|
|
132
|
-
|
133
|
-
def username
|
134
|
-
options[:username] || ENV['BOSH_USER'] || config.username(target)
|
135
|
-
end
|
125
|
+
protected
|
136
126
|
|
137
|
-
|
138
|
-
|
139
|
-
|
127
|
+
def auth_info
|
128
|
+
@auth_info ||= begin
|
129
|
+
director_client = Client::Director.new(target)
|
130
|
+
Client::Uaa::AuthInfo.new(director_client, ENV, config.ca_cert(target))
|
140
131
|
end
|
132
|
+
end
|
141
133
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
# @param [#to_s] task_id Task ID
|
147
|
-
def task_report(status, task_id, success_msg = nil, error_msg = nil)
|
148
|
-
case status
|
149
|
-
when :non_trackable
|
150
|
-
report = "Can't track director task".make_red
|
151
|
-
when :track_timeout
|
152
|
-
report = 'Task tracking timeout'.make_red
|
153
|
-
when :running
|
154
|
-
report = "Task #{task_id.make_yellow} running"
|
155
|
-
when :error
|
156
|
-
report = error_msg
|
157
|
-
when :done
|
158
|
-
report = success_msg
|
159
|
-
else
|
160
|
-
report = "Task exited with status #{status}"
|
161
|
-
end
|
134
|
+
# @return [String] Director username
|
135
|
+
def username
|
136
|
+
options[:username] || ENV['BOSH_USER'] || config.username(target)
|
137
|
+
end
|
162
138
|
|
163
|
-
|
164
|
-
|
165
|
-
|
139
|
+
# @return [String] Director password
|
140
|
+
def password
|
141
|
+
options[:password] || ENV['BOSH_PASSWORD'] || config.password(target)
|
142
|
+
end
|
166
143
|
|
167
|
-
|
168
|
-
|
144
|
+
# Prints director task completion report. Note that event log usually
|
145
|
+
# contains pretty detailed error report and other UI niceties, so most
|
146
|
+
# of the time this could just do nothing
|
147
|
+
# @param [Symbol] status Task status
|
148
|
+
# @param [#to_s] task_id Task ID
|
149
|
+
def task_report(status, task_id, success_msg = nil, error_msg = nil)
|
150
|
+
case status
|
151
|
+
when :non_trackable
|
152
|
+
report = "Can't track director task".make_red
|
153
|
+
when :track_timeout
|
154
|
+
report = 'Task tracking timeout'.make_red
|
155
|
+
when :running
|
156
|
+
report = "Task #{task_id.make_yellow} running"
|
157
|
+
when :error
|
158
|
+
report = error_msg
|
159
|
+
when :done
|
160
|
+
report = success_msg
|
161
|
+
else
|
162
|
+
report = "Task exited with status #{status}"
|
169
163
|
end
|
170
164
|
|
171
|
-
|
172
|
-
|
173
|
-
err('Please log in first') unless logged_in?
|
165
|
+
unless [:running, :done].include?(status)
|
166
|
+
@exit_code = 1
|
174
167
|
end
|
175
168
|
|
176
|
-
|
177
|
-
|
178
|
-
|
169
|
+
say("\n#{report}") if report
|
170
|
+
say("\nFor a more detailed error report, run: bosh task #{task_id} --debug") if status == :error
|
171
|
+
end
|
179
172
|
|
180
|
-
|
181
|
-
|
182
|
-
|
173
|
+
def auth_required
|
174
|
+
target_required
|
175
|
+
err('Please log in first') unless logged_in?
|
176
|
+
end
|
183
177
|
|
184
|
-
|
185
|
-
|
186
|
-
|
178
|
+
def target_required
|
179
|
+
err('Please choose target first') if target.nil?
|
180
|
+
end
|
187
181
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
end
|
192
|
-
end
|
182
|
+
def deployment_required
|
183
|
+
err('Please choose deployment first') if deployment.nil?
|
184
|
+
end
|
193
185
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
end
|
198
|
-
end
|
186
|
+
def show_deployment
|
187
|
+
say("Current deployment is #{deployment.make_green}")
|
188
|
+
end
|
199
189
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
"please discard or commit them first.\n\n" +
|
204
|
-
'Use the --force option to skip this check.')
|
190
|
+
def no_track_unsupported
|
191
|
+
if @options.delete(:no_track)
|
192
|
+
say('Ignoring `' + '--no-track'.make_yellow + "' option")
|
205
193
|
end
|
194
|
+
end
|
206
195
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
File.directory?('src')
|
196
|
+
def check_if_release_dir
|
197
|
+
unless in_release_dir?
|
198
|
+
err("Sorry, your current directory doesn't look like release directory")
|
211
199
|
end
|
200
|
+
end
|
212
201
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
202
|
+
def raise_dirty_state_error
|
203
|
+
say("\n%s\n" % [`git status`])
|
204
|
+
err('Your current directory has some local modifications, ' +
|
205
|
+
"please discard or commit them first.\n\n" +
|
206
|
+
'Use the --force option to skip this check.')
|
207
|
+
end
|
208
|
+
|
209
|
+
def in_release_dir?
|
210
|
+
File.directory?('packages') &&
|
211
|
+
File.directory?('jobs') &&
|
212
|
+
File.directory?('src')
|
213
|
+
end
|
224
214
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
215
|
+
def dirty_state?
|
216
|
+
git_status = `git status 2>&1`
|
217
|
+
case $?.exitstatus
|
218
|
+
when 128 # Not in a git repo
|
219
|
+
false
|
220
|
+
when 127 # git command not found
|
221
|
+
false
|
222
|
+
else
|
223
|
+
!git_status.lines.to_a.last.include?('nothing to commit')
|
230
224
|
end
|
225
|
+
end
|
231
226
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
227
|
+
def valid_index_for(job, index, options = {})
|
228
|
+
index = '0' if job_unique_in_deployment?(job)
|
229
|
+
err('You should specify the job index. There is more than one instance of this job type.') if index.nil?
|
230
|
+
index = index.to_i if options[:integer_index]
|
231
|
+
index
|
232
|
+
end
|
236
233
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
234
|
+
def normalize_url(url)
|
235
|
+
url = url.gsub(/\/$/, '')
|
236
|
+
url = "https://#{url}" unless url.match(/^http:?/)
|
237
|
+
uri = URI.parse(url)
|
238
|
+
|
239
|
+
if port = url.match(/:(\d+)$/)
|
240
|
+
port_number = port.captures[0].to_i
|
241
|
+
if port_number == URI::HTTPS::DEFAULT_PORT
|
242
|
+
uri.to_s + ":#{URI::HTTPS::DEFAULT_PORT}"
|
245
243
|
else
|
246
|
-
uri.port =
|
244
|
+
uri.port = port_number
|
247
245
|
uri.to_s
|
248
246
|
end
|
247
|
+
else
|
248
|
+
uri.port = DEFAULT_DIRECTOR_PORT
|
249
|
+
uri.to_s
|
249
250
|
end
|
250
251
|
end
|
251
252
|
end
|
252
253
|
end
|
254
|
+
end
|
@@ -2,12 +2,12 @@ module Bosh
|
|
2
2
|
module Cli
|
3
3
|
module Client
|
4
4
|
class UaaCredentials
|
5
|
-
def initialize(
|
6
|
-
@
|
5
|
+
def initialize(token_provider)
|
6
|
+
@token_provider = token_provider
|
7
7
|
end
|
8
8
|
|
9
9
|
def authorization_header
|
10
|
-
@token
|
10
|
+
@token_provider.token
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -16,6 +16,13 @@ module Bosh
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def client_auth?
|
19
|
+
if @client_id.nil? && !@client_secret.nil?
|
20
|
+
raise ValidationError.new('BOSH_CLIENT is missing')
|
21
|
+
end
|
22
|
+
if @client_secret.nil? && !@client_id.nil?
|
23
|
+
raise ValidationError.new('BOSH_CLIENT_SECRET is missing')
|
24
|
+
end
|
25
|
+
|
19
26
|
!@client_id.nil? && !@client_secret.nil?
|
20
27
|
end
|
21
28
|
|
@@ -24,15 +31,15 @@ module Bosh
|
|
24
31
|
end
|
25
32
|
|
26
33
|
def url
|
27
|
-
auth_info.fetch('options', {}).fetch('url', nil)
|
28
|
-
end
|
29
|
-
|
30
|
-
def validate!
|
31
|
-
return unless uaa?
|
34
|
+
url = auth_info.fetch('options', {}).fetch('url', nil)
|
32
35
|
|
33
|
-
|
34
|
-
|
36
|
+
if url
|
37
|
+
unless URI.parse(url).instance_of?(URI::HTTPS)
|
38
|
+
raise ValidationError.new('HTTPS protocol is required')
|
39
|
+
end
|
35
40
|
end
|
41
|
+
|
42
|
+
url
|
36
43
|
end
|
37
44
|
|
38
45
|
private
|
data/lib/cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2983.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- VMware
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bosh_common
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.2983.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.2983.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bosh-template
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: 1.2983.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
40
|
+
version: 1.2983.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: cf-uaa-lib
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,14 +128,14 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.
|
131
|
+
version: 1.2983.0
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 1.
|
138
|
+
version: 1.2983.0
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: net-ssh
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -306,7 +306,7 @@ dependencies:
|
|
306
306
|
version: '0'
|
307
307
|
description: |-
|
308
308
|
BOSH CLI
|
309
|
-
|
309
|
+
71d152
|
310
310
|
email: support@cloudfoundry.com
|
311
311
|
executables:
|
312
312
|
- bosh
|