blobstore_client 0.5.0 → 1.5.0.pre.1113
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.
- data/README.md +127 -0
- data/bin/blobstore_client_console +21 -20
- data/config/local.yml.example +2 -0
- data/lib/blobstore_client.rb +12 -41
- data/lib/blobstore_client/atmos_blobstore_client.rb +52 -35
- data/lib/blobstore_client/base.rb +76 -40
- data/lib/blobstore_client/client.rb +12 -7
- data/lib/blobstore_client/dav_blobstore_client.rb +67 -0
- data/lib/blobstore_client/errors.rb +1 -0
- data/lib/blobstore_client/local_client.rb +24 -15
- data/lib/blobstore_client/s3_blobstore_client.rb +97 -96
- data/lib/blobstore_client/simple_blobstore_client.rb +24 -11
- data/lib/blobstore_client/swift_blobstore_client.rb +78 -87
- data/lib/blobstore_client/version.rb +1 -1
- metadata +33 -67
- data/README +0 -1
- data/Rakefile +0 -49
- data/spec/assets/file +0 -1
- data/spec/spec_helper.rb +0 -8
- data/spec/unit/atmos_blobstore_client_spec.rb +0 -72
- data/spec/unit/blobstore_client_spec.rb +0 -44
- data/spec/unit/local_client_spec.rb +0 -78
- data/spec/unit/s3_blobstore_client_spec.rb +0 -282
- data/spec/unit/simple_blobstore_client_spec.rb +0 -106
- data/spec/unit/swift_blobstore_client_spec.rb +0 -315
@@ -1,17 +1,17 @@
|
|
1
1
|
# Copyright (c) 2009-2012 VMware, Inc.
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
3
|
+
require 'base64'
|
4
|
+
require 'fog'
|
5
|
+
require 'multi_json'
|
6
|
+
require 'uri'
|
7
|
+
require 'httpclient'
|
8
8
|
|
9
9
|
module Bosh
|
10
10
|
module Blobstore
|
11
11
|
|
12
12
|
class SwiftBlobstoreClient < BaseClient
|
13
13
|
|
14
|
-
# Blobstore client for Swift
|
14
|
+
# Blobstore client for OpenStack Swift
|
15
15
|
# @param [Hash] options Swift BlobStore options
|
16
16
|
# @option options [Symbol] container_name
|
17
17
|
# @option options [Symbol] swift_provider
|
@@ -26,130 +26,121 @@ module Bosh
|
|
26
26
|
validate_options(@options)
|
27
27
|
|
28
28
|
swift_provider = @options[:swift_provider]
|
29
|
-
swift_options = {:
|
29
|
+
swift_options = { provider: swift_provider }
|
30
30
|
swift_options.merge!(@options[swift_provider.to_sym])
|
31
|
+
|
32
|
+
if swift_options.has_key?(:openstack_auth_url)
|
33
|
+
unless swift_options[:openstack_auth_url].match(/\/tokens$/)
|
34
|
+
swift_options[:openstack_auth_url] = swift_options[:openstack_auth_url] + '/tokens'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
31
38
|
swift = Fog::Storage.new(swift_options)
|
32
39
|
|
33
40
|
container_name = @options[:container_name]
|
34
41
|
@container = swift.directories.get(container_name)
|
35
|
-
if @container.nil?
|
36
|
-
|
37
|
-
end
|
42
|
+
raise NotFound, "Swift container '#{container_name}' not found" if @container.nil?
|
43
|
+
|
38
44
|
@container
|
39
45
|
end
|
40
46
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
+
protected
|
48
|
+
|
49
|
+
def create_file(object_id, file)
|
50
|
+
object_id ||= generate_object_id
|
51
|
+
object = container.files.create(key: object_id, body: file)
|
52
|
+
begin
|
53
|
+
public_url = object.public_url
|
54
|
+
rescue NotImplementedError
|
55
|
+
public_url = nil
|
56
|
+
end
|
57
|
+
encode_object_id(object_id, public_url)
|
47
58
|
rescue Exception => e
|
48
59
|
raise BlobstoreError, "Failed to create object: #{e.message}"
|
49
60
|
end
|
50
61
|
|
51
62
|
def get_file(object_id, file)
|
52
63
|
object_info = decode_object_id(object_id)
|
53
|
-
if object_info[
|
54
|
-
response = @http_client.get(object_info[
|
64
|
+
if object_info['purl']
|
65
|
+
response = @http_client.get(object_info['purl']) do |block|
|
55
66
|
file.write(block)
|
56
67
|
end
|
57
68
|
if response.status != 200
|
58
|
-
raise BlobstoreError, "Could not fetch object,
|
59
|
-
[response.status, response.content]
|
69
|
+
raise BlobstoreError, "Could not fetch object, #{response.status} #{response.content}"
|
60
70
|
end
|
61
71
|
else
|
62
|
-
object = container.files.get(object_info[
|
72
|
+
object = container.files.get(object_info['oid']) do |block|
|
63
73
|
file.write(block)
|
64
74
|
end
|
65
|
-
if object.nil?
|
66
|
-
raise NotFound, "Swift object '#{object_id}' not found"
|
67
|
-
end
|
75
|
+
raise NotFound, "Swift object '#{object_info['oid']}' not found" if object.nil?
|
68
76
|
end
|
69
77
|
rescue Exception => e
|
70
|
-
raise BlobstoreError,
|
71
|
-
"Failed to find object '#{object_id}': #{e.message}"
|
78
|
+
raise BlobstoreError, "Failed to find object '#{object_id}': #{e.message}"
|
72
79
|
end
|
73
80
|
|
74
|
-
def
|
81
|
+
def delete_object(object_id)
|
75
82
|
object_info = decode_object_id(object_id)
|
76
|
-
object = container.files.get(object_info[
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
end
|
83
|
+
object = container.files.get(object_info['oid'])
|
84
|
+
|
85
|
+
raise NotFound, "Swift object '#{object_id}' not found" if object.nil?
|
86
|
+
|
87
|
+
object.destroy
|
82
88
|
rescue Exception => e
|
83
|
-
raise BlobstoreError,
|
84
|
-
"Failed to delete object '#{object_id}': #{e.message}"
|
89
|
+
raise BlobstoreError, "Failed to delete object '#{object_id}': #{e.message}"
|
85
90
|
end
|
86
91
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
92
|
+
def object_exists?(object_id)
|
93
|
+
object_info = decode_object_id(object_id)
|
94
|
+
object = container.files.head(object_info['oid'])
|
95
|
+
object.nil? ? false : true
|
96
|
+
rescue Exception => e
|
97
|
+
raise BlobstoreError, "Failed to find object '#{object_id}': #{e.message}"
|
91
98
|
end
|
92
99
|
|
100
|
+
private
|
101
|
+
|
93
102
|
def encode_object_id(object_id, public_url = nil)
|
94
|
-
json = MultiJson.encode({:
|
95
|
-
URI
|
103
|
+
json = MultiJson.encode({ oid: object_id, purl: public_url })
|
104
|
+
URI.escape(Base64.encode64(json))
|
96
105
|
end
|
97
106
|
|
98
107
|
def decode_object_id(object_id)
|
99
108
|
begin
|
100
|
-
object_info = MultiJson.decode(Base64.decode64(URI
|
101
|
-
rescue MultiJson::DecodeError
|
102
|
-
|
109
|
+
object_info = MultiJson.decode(Base64.decode64(URI.unescape(object_id)))
|
110
|
+
rescue MultiJson::DecodeError
|
111
|
+
object_info = {}
|
112
|
+
object_info['oid'] = object_id
|
103
113
|
end
|
104
114
|
|
105
|
-
if !object_info.kind_of?(Hash) || object_info[
|
106
|
-
|
107
|
-
end
|
115
|
+
raise BlobstoreError, "Invalid object_id: #{object_info.inspect}" if !object_info.kind_of?(Hash) || object_info['oid'].nil?
|
116
|
+
|
108
117
|
object_info
|
109
118
|
end
|
110
119
|
|
111
120
|
def validate_options(options)
|
112
|
-
unless options.is_a?(Hash)
|
113
|
-
|
114
|
-
|
115
|
-
unless options.has_key?(:container_name)
|
116
|
-
raise "Swift container name is missing"
|
117
|
-
end
|
118
|
-
unless options.has_key?(:swift_provider)
|
119
|
-
raise "Swift provider is missing"
|
120
|
-
end
|
121
|
+
raise "Invalid options format, Hash expected, #{options.class} given" unless options.is_a?(Hash)
|
122
|
+
raise 'Swift container name is missing' unless options.has_key?(:container_name)
|
123
|
+
raise 'Swift provider is missing' unless options.has_key?(:swift_provider)
|
121
124
|
case options[:swift_provider]
|
122
|
-
when
|
123
|
-
unless options.has_key?(:hp)
|
124
|
-
|
125
|
-
|
126
|
-
unless options[:hp].
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
unless options
|
131
|
-
|
132
|
-
|
133
|
-
unless options[:
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
unless options.has_key?(:
|
141
|
-
raise "Rackspace options are missing"
|
142
|
-
end
|
143
|
-
unless options[:rackspace].is_a?(Hash)
|
144
|
-
raise "Invalid Rackspace options, Hash expected,
|
145
|
-
#{options[:rackspace].class} given"
|
146
|
-
end
|
147
|
-
unless options[:rackspace].has_key?(:rackspace_username)
|
148
|
-
raise "Rackspace username is missing"
|
149
|
-
end
|
150
|
-
unless options[:rackspace].has_key?(:rackspace_api_key)
|
151
|
-
raise "Rackspace API key is missing"
|
152
|
-
end
|
125
|
+
when 'hp'
|
126
|
+
raise 'HP options are missing' unless options.has_key?(:hp)
|
127
|
+
raise "Invalid HP options, Hash expected, #{options[:hp].class} given" unless options[:hp].is_a?(Hash)
|
128
|
+
raise 'HP access key is missing' unless options[:hp].has_key?(:hp_access_key)
|
129
|
+
raise 'HP secret key is missing' unless options[:hp].has_key?(:hp_secret_key)
|
130
|
+
raise 'HP tenant ID is missing' unless options[:hp].has_key?(:hp_tenant_id)
|
131
|
+
raise 'HP availability zone is missing' unless options[:hp].has_key?(:hp_avl_zone)
|
132
|
+
when 'openstack'
|
133
|
+
raise 'OpenStack options are missing' unless options.has_key?(:openstack)
|
134
|
+
raise "Invalid OpenStack options, Hash expected, #{options[:openstack].class} given" unless options[:openstack].is_a?(Hash)
|
135
|
+
raise 'OpenStack authorization URL is missing' unless options[:openstack].has_key?(:openstack_auth_url)
|
136
|
+
raise 'OpenStack user name is missing' unless options[:openstack].has_key?(:openstack_username)
|
137
|
+
raise 'OpenStack API key is missing' unless options[:openstack].has_key?(:openstack_api_key)
|
138
|
+
raise 'OpenStack tenant is missing' unless options[:openstack].has_key?(:openstack_tenant)
|
139
|
+
when 'rackspace'
|
140
|
+
raise 'Rackspace options are missing' unless options.has_key?(:rackspace)
|
141
|
+
raise "Invalid Rackspace options, Hash expected, #{options[:rackspace].class} given" unless options[:rackspace].is_a?(Hash)
|
142
|
+
raise 'Rackspace username is missing' unless options[:rackspace].has_key?(:rackspace_username)
|
143
|
+
raise 'Rackspace API key is missing' unless options[:rackspace].has_key?(:rackspace_api_key)
|
153
144
|
else
|
154
145
|
raise "Swift provider #{options[:swift_provider]} not supported"
|
155
146
|
end
|
metadata
CHANGED
@@ -1,32 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blobstore_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 1.5.0.pre.1113
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- VMware
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-10-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name: aws-
|
15
|
+
name: aws-sdk
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 1.8.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - '='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 1.8.5
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: fog
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 1.
|
37
|
+
version: 1.14.0
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,23 +42,23 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 1.
|
45
|
+
version: 1.14.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: httpclient
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
none: false
|
50
50
|
requirements:
|
51
|
-
- -
|
51
|
+
- - '='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
53
|
+
version: 2.2.4
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 2.2.4
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: multi_json
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
requirements:
|
67
67
|
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 1.1
|
69
|
+
version: '1.1'
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 1.1
|
77
|
+
version: '1.1'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: ruby-atmos-pure
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -91,22 +91,6 @@ dependencies:
|
|
91
91
|
- - ~>
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: 1.0.5
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: uuidtools
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ~>
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: 2.1.2
|
102
|
-
type: :runtime
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ~>
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 2.1.2
|
110
94
|
- !ruby/object:Gem::Dependency
|
111
95
|
name: bosh_common
|
112
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,7 +98,7 @@ dependencies:
|
|
114
98
|
requirements:
|
115
99
|
- - ~>
|
116
100
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
101
|
+
version: 1.5.0.pre.1113
|
118
102
|
type: :runtime
|
119
103
|
prerelease: false
|
120
104
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -122,37 +106,33 @@ dependencies:
|
|
122
106
|
requirements:
|
123
107
|
- - ~>
|
124
108
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
126
|
-
description: BOSH blobstore client
|
127
|
-
|
109
|
+
version: 1.5.0.pre.1113
|
110
|
+
description: ! 'BOSH blobstore client
|
111
|
+
|
112
|
+
cfd471'
|
113
|
+
email: support@cloudfoundry.com
|
128
114
|
executables:
|
129
115
|
- blobstore_client_console
|
130
116
|
extensions: []
|
131
117
|
extra_rdoc_files: []
|
132
118
|
files:
|
133
119
|
- bin/blobstore_client_console
|
120
|
+
- config/local.yml.example
|
134
121
|
- lib/blobstore_client.rb
|
135
122
|
- lib/blobstore_client/atmos_blobstore_client.rb
|
136
123
|
- lib/blobstore_client/base.rb
|
137
124
|
- lib/blobstore_client/client.rb
|
125
|
+
- lib/blobstore_client/dav_blobstore_client.rb
|
138
126
|
- lib/blobstore_client/errors.rb
|
139
127
|
- lib/blobstore_client/local_client.rb
|
140
128
|
- lib/blobstore_client/s3_blobstore_client.rb
|
141
129
|
- lib/blobstore_client/simple_blobstore_client.rb
|
142
130
|
- lib/blobstore_client/swift_blobstore_client.rb
|
143
131
|
- lib/blobstore_client/version.rb
|
144
|
-
- README
|
145
|
-
|
146
|
-
|
147
|
-
-
|
148
|
-
- spec/unit/atmos_blobstore_client_spec.rb
|
149
|
-
- spec/unit/blobstore_client_spec.rb
|
150
|
-
- spec/unit/local_client_spec.rb
|
151
|
-
- spec/unit/s3_blobstore_client_spec.rb
|
152
|
-
- spec/unit/simple_blobstore_client_spec.rb
|
153
|
-
- spec/unit/swift_blobstore_client_spec.rb
|
154
|
-
homepage: http://www.vmware.com
|
155
|
-
licenses: []
|
132
|
+
- README.md
|
133
|
+
homepage: https://github.com/cloudfoundry/bosh
|
134
|
+
licenses:
|
135
|
+
- Apache 2.0
|
156
136
|
post_install_message:
|
157
137
|
rdoc_options: []
|
158
138
|
require_paths:
|
@@ -162,31 +142,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
162
142
|
requirements:
|
163
143
|
- - ! '>='
|
164
144
|
- !ruby/object:Gem::Version
|
165
|
-
version:
|
166
|
-
segments:
|
167
|
-
- 0
|
168
|
-
hash: -2537561053731340493
|
145
|
+
version: 1.9.3
|
169
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
147
|
none: false
|
171
148
|
requirements:
|
172
|
-
- - ! '
|
149
|
+
- - ! '>'
|
173
150
|
- !ruby/object:Gem::Version
|
174
|
-
version:
|
175
|
-
segments:
|
176
|
-
- 0
|
177
|
-
hash: -2537561053731340493
|
151
|
+
version: 1.3.1
|
178
152
|
requirements: []
|
179
153
|
rubyforge_project:
|
180
|
-
rubygems_version: 1.8.
|
154
|
+
rubygems_version: 1.8.23
|
181
155
|
signing_key:
|
182
156
|
specification_version: 3
|
183
157
|
summary: BOSH blobstore client
|
184
|
-
test_files:
|
185
|
-
- spec/assets/file
|
186
|
-
- spec/spec_helper.rb
|
187
|
-
- spec/unit/atmos_blobstore_client_spec.rb
|
188
|
-
- spec/unit/blobstore_client_spec.rb
|
189
|
-
- spec/unit/local_client_spec.rb
|
190
|
-
- spec/unit/s3_blobstore_client_spec.rb
|
191
|
-
- spec/unit/simple_blobstore_client_spec.rb
|
192
|
-
- spec/unit/swift_blobstore_client_spec.rb
|
158
|
+
test_files: []
|
data/README
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
Blobstore client for VMware AppCloud Outer Shell.
|