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

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.
@@ -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