bosh_cli 1.5.0.pre.1365 → 1.5.0.pre.1374

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  require 'cli/public_stemcell_presenter'
2
- require 'cli/public_stemcell_index'
2
+ require 'cli/public_stemcells'
3
3
 
4
4
  module Bosh::Cli
5
5
  class Command::Stemcell < Command::Base
@@ -102,19 +102,18 @@ module Bosh::Cli
102
102
  usage 'public stemcells'
103
103
  desc 'Show the list of publicly available stemcells for download.'
104
104
  option '--full', 'show the full download url'
105
- option '--tags tag1,tag2...', Array, 'filter by tag'
106
105
  option '--all', 'show all stemcells'
107
106
  def list_public
108
- public_stemcell_index = PublicStemcellIndex.download(self)
109
- public_stemcells_presenter = PublicStemcellPresenter.new(self, public_stemcell_index)
107
+ public_stemcells = PublicStemcells.new
108
+ public_stemcells_presenter = PublicStemcellPresenter.new(self, public_stemcells)
110
109
  public_stemcells_presenter.list(options)
111
110
  end
112
111
 
113
112
  usage 'download public stemcell'
114
113
  desc 'Downloads a stemcell from the public blobstore'
115
114
  def download_public(stemcell_filename)
116
- public_stemcell_index = PublicStemcellIndex.download(self)
117
- public_stemcells_presenter = PublicStemcellPresenter.new(self, public_stemcell_index)
115
+ public_stemcells = PublicStemcells.new
116
+ public_stemcells_presenter = PublicStemcellPresenter.new(self, public_stemcells)
118
117
  public_stemcells_presenter.download(stemcell_filename)
119
118
  end
120
119
 
@@ -1,34 +1,31 @@
1
1
  module Bosh::Cli
2
2
  class PublicStemcell
3
- attr_reader :name
3
+ attr_reader :size
4
4
 
5
- def initialize(name, properties)
6
- @name = name
7
- @properties = properties
5
+ def initialize(key, size)
6
+ @key = key
7
+ @size = size
8
8
  end
9
9
 
10
- def url
11
- @properties['url']
12
- end
13
-
14
- def size
15
- @properties['size']
10
+ def name
11
+ File.basename(@key)
16
12
  end
17
13
 
18
- def sha1
19
- @properties['sha1']
14
+ def version
15
+ version_digits = @key.gsub(/[^\d]/, '')
16
+ version_digits.to_i
20
17
  end
21
18
 
22
- def tags
23
- @properties['tags']
19
+ def variety
20
+ name.gsub(version.to_s, '')
24
21
  end
25
22
 
26
- def tag_names
27
- tags ? tags.join(', ') : ''
23
+ def url
24
+ "#{PublicStemcells::PUBLIC_STEMCELLS_BASE_URL}/#{@key}"
28
25
  end
29
26
 
30
- def tagged?(requested_tags)
31
- tags.nil? || (requested_tags - tags).empty?
27
+ def legacy?
28
+ @key.include?('legacy')
32
29
  end
33
30
  end
34
31
  end
@@ -1,24 +1,19 @@
1
- require 'cli/public_stemcell_index'
2
1
  require 'cli/download_with_progress'
3
2
 
4
3
  module Bosh::Cli
5
4
  class PublicStemcellPresenter
6
- def initialize(ui, public_stemcell_index)
5
+ def initialize(ui, public_stemcells)
7
6
  @ui = ui
8
- @public_stemcell_index = public_stemcell_index
7
+ @public_stemcells = public_stemcells
9
8
  end
10
9
 
11
10
  def list(options)
12
11
  full = !!options[:full]
13
- requested_tags = options[:tags] || %w(stable)
14
-
15
12
  stemcells_table = @ui.table do |t|
16
- t.headings = full ? %w(Name Url Tags) : %w(Name Tags)
13
+ t.headings = full ? %w(Name Url) : %w(Name)
17
14
 
18
- @public_stemcell_index.each do |stemcell|
19
- if options[:all] || stemcell.tagged?(requested_tags)
20
- t << (full ? [stemcell.name, stemcell.url, stemcell.tag_names] : [stemcell.name, stemcell.tag_names])
21
- end
15
+ stemcell_for(options).each do |stemcell|
16
+ t << (full ? [stemcell.name, stemcell.url] : [stemcell.name])
22
17
  end
23
18
  end
24
19
 
@@ -27,23 +22,25 @@ module Bosh::Cli
27
22
  end
28
23
 
29
24
  def download(stemcell_name)
30
- unless @public_stemcell_index.has_stemcell?(stemcell_name)
31
- @ui.err("'#{stemcell_name}' not found in '#{@public_stemcell_index.names.join(',')}'.")
25
+ unless @public_stemcells.has_stemcell?(stemcell_name)
26
+ @ui.err("'#{stemcell_name}' not found.")
32
27
  end
33
28
 
34
29
  if File.exists?(stemcell_name) && !@ui.confirmed?("Overwrite existing file `#{stemcell_name}'?")
35
30
  @ui.err("File `#{stemcell_name}' already exists")
36
31
  end
37
32
 
38
- stemcell = @public_stemcell_index.find(stemcell_name)
39
- download_with_progress = DownloadWithProgress.new(stemcell.size, stemcell.url)
33
+ stemcell = @public_stemcells.find(stemcell_name)
34
+ download_with_progress = DownloadWithProgress.new(stemcell.url, stemcell.size)
40
35
  download_with_progress.perform
41
36
 
42
- if download_with_progress.sha1?(stemcell.sha1)
43
- @ui.say('Download complete'.make_green)
44
- else
45
- @ui.err("The downloaded file sha1 `#{download_with_progress.sha1}' does not match the expected sha1 `#{stemcell.sha1}'")
46
- end
37
+ @ui.say('Download complete'.make_green)
38
+ end
39
+
40
+ private
41
+
42
+ def stemcell_for(options)
43
+ options[:all] ? @public_stemcells.all : @public_stemcells.recent
47
44
  end
48
45
  end
49
46
  end
@@ -0,0 +1,36 @@
1
+ require 'httpclient'
2
+ require 'rexml/document'
3
+
4
+ require 'cli/public_stemcell'
5
+
6
+ module Bosh::Cli
7
+ class PublicStemcells
8
+ PUBLIC_STEMCELLS_BASE_URL = 'https://bosh-jenkins-artifacts.s3.amazonaws.com'
9
+
10
+ def has_stemcell?(stemcell_filename)
11
+ all.any? { |stemcell| stemcell.name == stemcell_filename }
12
+ end
13
+
14
+ def find(stemcell_filename)
15
+ all.detect { |stemcell| stemcell.name == stemcell_filename }
16
+ end
17
+
18
+ def all
19
+ response = HTTPClient.new.get(PUBLIC_STEMCELLS_BASE_URL)
20
+ doc = REXML::Document.new(response.body)
21
+ stemcell_tags = REXML::XPath.match(doc, "/ListBucketResult/Contents[Key[text()[starts-with(.,'bosh-stemcell/') and not(contains(.,'latest'))]]]")
22
+
23
+ stemcell_tags.map do |stemcell_tag|
24
+ stemcell_key = stemcell_tag.get_text('Key').value
25
+ stemcell_size = Integer(stemcell_tag.get_text('Size').value)
26
+
27
+ PublicStemcell.new(stemcell_key, stemcell_size)
28
+ end
29
+ end
30
+
31
+ def recent
32
+ stemcell_varietes = all.reject(&:legacy?).group_by(&:variety).values
33
+ stemcell_varietes.map { |stemcells| stemcells.sort_by(&:version).last }
34
+ end
35
+ end
36
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Bosh
4
4
  module Cli
5
- VERSION = '1.5.0.pre.1365'
5
+ VERSION = '1.5.0.pre.1374'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0.pre.1365
4
+ version: 1.5.0.pre.1374
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-19 00:00:00.000000000 Z
12
+ date: 2013-11-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bosh_common
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.5.0.pre.1365
21
+ version: 1.5.0.pre.1374
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 1.5.0.pre.1365
29
+ version: 1.5.0.pre.1374
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: json_pure
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -114,7 +114,7 @@ dependencies:
114
114
  requirements:
115
115
  - - ~>
116
116
  - !ruby/object:Gem::Version
117
- version: 1.5.0.pre.1365
117
+ version: 1.5.0.pre.1374
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
@@ -122,7 +122,7 @@ dependencies:
122
122
  requirements:
123
123
  - - ~>
124
124
  - !ruby/object:Gem::Version
125
- version: 1.5.0.pre.1365
125
+ version: 1.5.0.pre.1374
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: net-ssh
128
128
  requirement: !ruby/object:Gem::Requirement
@@ -203,6 +203,22 @@ dependencies:
203
203
  - - ~>
204
204
  - !ruby/object:Gem::Version
205
205
  version: 0.5.4
206
+ - !ruby/object:Gem::Dependency
207
+ name: fakefs
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
206
222
  - !ruby/object:Gem::Dependency
207
223
  name: rspec-fire
208
224
  requirement: !ruby/object:Gem::Requirement
@@ -219,9 +235,41 @@ dependencies:
219
235
  - - ! '>='
220
236
  - !ruby/object:Gem::Version
221
237
  version: '0'
238
+ - !ruby/object:Gem::Dependency
239
+ name: webmock
240
+ requirement: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ! '>='
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ type: :development
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ none: false
250
+ requirements:
251
+ - - ! '>='
252
+ - !ruby/object:Gem::Version
253
+ version: '0'
254
+ - !ruby/object:Gem::Dependency
255
+ name: vcr
256
+ requirement: !ruby/object:Gem::Requirement
257
+ none: false
258
+ requirements:
259
+ - - ! '>='
260
+ - !ruby/object:Gem::Version
261
+ version: '0'
262
+ type: :development
263
+ prerelease: false
264
+ version_requirements: !ruby/object:Gem::Requirement
265
+ none: false
266
+ requirements:
267
+ - - ! '>='
268
+ - !ruby/object:Gem::Version
269
+ version: '0'
222
270
  description: ! 'BOSH CLI
223
271
 
224
- a77e8c'
272
+ d50b1a'
225
273
  email: support@cloudfoundry.com
226
274
  executables:
227
275
  - bosh
@@ -285,8 +333,8 @@ files:
285
333
  - lib/cli/package_builder.rb
286
334
  - lib/cli/packaging_helper.rb
287
335
  - lib/cli/public_stemcell.rb
288
- - lib/cli/public_stemcell_index.rb
289
336
  - lib/cli/public_stemcell_presenter.rb
337
+ - lib/cli/public_stemcells.rb
290
338
  - lib/cli/release.rb
291
339
  - lib/cli/release_builder.rb
292
340
  - lib/cli/release_compiler.rb
@@ -1,41 +0,0 @@
1
- require 'cli/public_stemcell'
2
-
3
- module Bosh::Cli
4
- class PublicStemcellIndex
5
- def self.download(ui)
6
- index_url = 'https://s3.amazonaws.com/blob.cfblob.com/stemcells/public_stemcells_index.yml'
7
-
8
- http_client = HTTPClient.new
9
- response = http_client.get(index_url)
10
- status_code = response.http_header.status_code
11
-
12
- if status_code == HTTP::Status::OK
13
- index = Psych.load(response.body)
14
- index.delete('public_stemcells_index.yml') if index.has_key?('public_stemcells_index.yml')
15
- new(index)
16
- else
17
- ui.err("Received HTTP #{status_code} from #{index_url}.")
18
- end
19
- end
20
-
21
- def initialize(index)
22
- @index = index
23
- end
24
-
25
- def has_stemcell?(stemcell_name)
26
- @index.has_key?(stemcell_name)
27
- end
28
-
29
- def names
30
- @index.keys.sort
31
- end
32
-
33
- def find(stemcell_name)
34
- PublicStemcell.new(stemcell_name, @index[stemcell_name])
35
- end
36
-
37
- def each
38
- names.map { |stemcell_name| yield find(stemcell_name) }
39
- end
40
- end
41
- end