fog-riakcs 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.hound.yml +20 -0
- data/.rubocop.yml +20 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +17 -0
- data/CONTRIBUTING.md +18 -0
- data/CONTRIBUTORS.md +10 -0
- data/Gemfile +4 -0
- data/LICENSE.md +20 -0
- data/README.md +38 -0
- data/Rakefile +18 -0
- data/fog-riakcs.gemspec +36 -0
- data/gemfiles/Gemfile.1.9.2- +8 -0
- data/gemfiles/Gemfile.1.9.3+ +7 -0
- data/lib/fog/riakcs.rb +17 -0
- data/lib/fog/riakcs/multipart_utils.rb +45 -0
- data/lib/fog/riakcs/multipart_utils/headers.rb +33 -0
- data/lib/fog/riakcs/provisioning.rb +97 -0
- data/lib/fog/riakcs/provisioning/create_user.rb +77 -0
- data/lib/fog/riakcs/provisioning/disable_user.rb +23 -0
- data/lib/fog/riakcs/provisioning/enable_user.rb +23 -0
- data/lib/fog/riakcs/provisioning/get_user.rb +41 -0
- data/lib/fog/riakcs/provisioning/list_users.rb +43 -0
- data/lib/fog/riakcs/provisioning/regrant_secret.rb +23 -0
- data/lib/fog/riakcs/provisioning/update_user.rb +23 -0
- data/lib/fog/riakcs/usage.rb +61 -0
- data/lib/fog/riakcs/usage/get_usage.rb +68 -0
- data/lib/fog/riakcs/user_utils.rb +34 -0
- data/lib/fog/riakcs/utils.rb +16 -0
- data/lib/fog/riakcs/version.rb +5 -0
- data/spec/minitest_helper.rb +31 -0
- data/tests/helper.rb +34 -0
- data/tests/helpers/collection_helper.rb +97 -0
- data/tests/helpers/flavors_helper.rb +32 -0
- data/tests/helpers/formats_helper.rb +98 -0
- data/tests/helpers/formats_helper_tests.rb +110 -0
- data/tests/helpers/mock_helper.rb +15 -0
- data/tests/helpers/model_helper.rb +29 -0
- data/tests/helpers/responds_to_helper.rb +11 -0
- data/tests/helpers/schema_validator_tests.rb +107 -0
- data/tests/helpers/server_helper.rb +25 -0
- data/tests/helpers/servers_helper.rb +10 -0
- data/tests/helpers/succeeds_helper.rb +9 -0
- data/tests/riakcs/provisioning/provisioning_tests.rb +174 -0
- data/tests/riakcs/usage/usage_tests.rb +29 -0
- metadata +233 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
def create_user(email, name, options = {})
|
6
|
+
payload = Fog::JSON.encode({ :email => email, :name => name })
|
7
|
+
headers = { 'Content-Type' => 'application/json' }
|
8
|
+
|
9
|
+
if(options[:anonymous])
|
10
|
+
request(
|
11
|
+
:expects => [201],
|
12
|
+
:method => 'POST',
|
13
|
+
:path => 'user',
|
14
|
+
:body => payload,
|
15
|
+
:headers => headers
|
16
|
+
)
|
17
|
+
else
|
18
|
+
begin
|
19
|
+
response = @s3_connection.put_object('riak-cs', 'user', payload, headers)
|
20
|
+
if !response.body.empty?
|
21
|
+
case response.headers['Content-Type']
|
22
|
+
when 'application/json'
|
23
|
+
response.body = Fog::JSON.decode(response.body)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
response
|
27
|
+
rescue Excon::Errors::Conflict => e
|
28
|
+
raise Fog::RiakCS::Provisioning::UserAlreadyExists.new
|
29
|
+
rescue Excon::Errors::BadRequest => e
|
30
|
+
raise Fog::RiakCS::Provisioning::ServiceUnavailable.new
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Mock
|
37
|
+
def invalid_email?(email)
|
38
|
+
!email.include?('@')
|
39
|
+
end
|
40
|
+
|
41
|
+
def user_exists?(email)
|
42
|
+
data.find do |key, value|
|
43
|
+
value[:email] == email
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_user(email, name, options = {})
|
48
|
+
if invalid_email?(email)
|
49
|
+
raise Fog::RiakCS::Provisioning::ServiceUnavailable, "The email address you provided is not a valid."
|
50
|
+
end
|
51
|
+
|
52
|
+
if user_exists?(email)
|
53
|
+
raise Fog::RiakCS::Provisioning::UserAlreadyExists, "User with email #{email} already exists."
|
54
|
+
end
|
55
|
+
|
56
|
+
key_id = rand(1000).to_s
|
57
|
+
key_secret = rand(1000).to_s
|
58
|
+
data[key_id] = { :email => email, :name => name, :status => 'enabled', :key_secret => key_secret }
|
59
|
+
|
60
|
+
Excon::Response.new.tap do |response|
|
61
|
+
response.status = 200
|
62
|
+
response.headers['Content-Type'] = 'application/json'
|
63
|
+
response.body = {
|
64
|
+
"email" => data[:email],
|
65
|
+
"display_name" => data[:name],
|
66
|
+
"name" => "user123",
|
67
|
+
"key_id" => key_id,
|
68
|
+
"key_secret" => key_secret,
|
69
|
+
"id" => "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
70
|
+
"status" => "enabled"
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include UserUtils
|
7
|
+
include MultipartUtils
|
8
|
+
|
9
|
+
def disable_user(key_id)
|
10
|
+
update_riakcs_user(key_id, { :status => 'disabled' })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Mock
|
15
|
+
include UserUtils
|
16
|
+
|
17
|
+
def disable_user(key_id)
|
18
|
+
update_mock_user(key_id, { :status => 'disabled' })
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include UserUtils
|
7
|
+
include MultipartUtils
|
8
|
+
|
9
|
+
def enable_user(key_id)
|
10
|
+
update_riakcs_user(key_id, { :status => 'enabled' })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Mock
|
15
|
+
include UserUtils
|
16
|
+
|
17
|
+
def enable_user(key_id)
|
18
|
+
update_mock_user(key_id, { :status => 'enabled' })
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include MultipartUtils
|
7
|
+
|
8
|
+
def get_user(key_id)
|
9
|
+
response = @s3_connection.get_object('riak-cs', "user/#{key_id}", { 'Accept' => 'application/json' })
|
10
|
+
response.body = Fog::JSON.decode(response.body)
|
11
|
+
response
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Mock
|
16
|
+
def get_user(key_id)
|
17
|
+
if user = data[key_id]
|
18
|
+
Excon::Response.new.tap do |response|
|
19
|
+
response.status = 200
|
20
|
+
response.headers['Content-Type'] = 'application/json'
|
21
|
+
response.body = {
|
22
|
+
"email" => user[:email],
|
23
|
+
"display_name" => user[:name],
|
24
|
+
"name" => "user123",
|
25
|
+
"key_id" => "XXXXXXXXXXXXXXXXXXXX",
|
26
|
+
"key_secret" => user[:key_secret],
|
27
|
+
"id" => "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
28
|
+
"status" => user[:status]
|
29
|
+
}
|
30
|
+
end
|
31
|
+
else
|
32
|
+
Excon::Response.new.tap do |response|
|
33
|
+
response.status = 404
|
34
|
+
response.headers['Content-Type'] = 'application/json'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include MultipartUtils
|
7
|
+
|
8
|
+
def list_users(options = {})
|
9
|
+
response = @s3_connection.get_object('riak-cs', 'users', { 'Accept' => 'application/json', 'query' => options })
|
10
|
+
|
11
|
+
boundary = extract_boundary(response.headers['Content-Type'])
|
12
|
+
parts = parse(response.body, boundary)
|
13
|
+
decoded = parts.map { |part| Fog::JSON.decode(part[:body]) }
|
14
|
+
|
15
|
+
response.body = decoded.flatten
|
16
|
+
|
17
|
+
response
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Mock
|
22
|
+
def list_users(options = {})
|
23
|
+
filtered_data = options[:status] ? data.select { |key, value| value[:status] == options[:status] } : data
|
24
|
+
|
25
|
+
Excon::Response.new.tap do |response|
|
26
|
+
response.status = 200
|
27
|
+
response.body = filtered_data.map do |key, value|
|
28
|
+
{
|
29
|
+
"email" => value[:email],
|
30
|
+
"display_name" => value[:name],
|
31
|
+
"name" => "user123",
|
32
|
+
"key_id" => key,
|
33
|
+
"key_secret" => value[:key_secret],
|
34
|
+
"id" => "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
35
|
+
"status" => value[:status]
|
36
|
+
}
|
37
|
+
end.compact
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include UserUtils
|
7
|
+
include MultipartUtils
|
8
|
+
|
9
|
+
def regrant_secret(key_id)
|
10
|
+
update_riakcs_user(key_id, { :new_key_secret => true })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Mock
|
15
|
+
include UserUtils
|
16
|
+
|
17
|
+
def regrant_secret(key_id)
|
18
|
+
update_mock_user(key_id, { :new_key_secret => true })
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include UserUtils
|
7
|
+
include MultipartUtils
|
8
|
+
|
9
|
+
def update_user(key_id, user)
|
10
|
+
update_riakcs_user(key_id, user)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Mock
|
15
|
+
include UserUtils
|
16
|
+
|
17
|
+
def update_user(key_id, user)
|
18
|
+
update_mock_user(key_id, user)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module RiakCS
|
5
|
+
class Usage < Fog::Service
|
6
|
+
requires :riakcs_access_key_id, :riakcs_secret_access_key
|
7
|
+
recognizes :host, :path, :port, :scheme, :persistent
|
8
|
+
|
9
|
+
request_path 'fog/riakcs/usage'
|
10
|
+
request :get_usage
|
11
|
+
|
12
|
+
class Mock
|
13
|
+
include Fog::RiakCS::Utils
|
14
|
+
|
15
|
+
def self.data
|
16
|
+
@data ||= Hash.new do |hash, key|
|
17
|
+
hash[key] = {}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.reset
|
22
|
+
@data = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(options = {})
|
26
|
+
configure_uri_options(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def data
|
30
|
+
self.class.data[riakcs_uri]
|
31
|
+
end
|
32
|
+
|
33
|
+
def reset_data
|
34
|
+
self.class.data.delete(riakcs_uri)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Real
|
39
|
+
include Fog::RiakCS::Utils
|
40
|
+
|
41
|
+
def initialize(options = {})
|
42
|
+
configure_uri_options(options)
|
43
|
+
@riakcs_access_key_id = options[:riakcs_access_key_id]
|
44
|
+
@riakcs_secret_access_key = options[:riakcs_secret_access_key]
|
45
|
+
@connection_options = options[:connection_options] || {}
|
46
|
+
@persistent = options[:persistent] || false
|
47
|
+
|
48
|
+
@connection = Fog::Storage.new(
|
49
|
+
:provider => 'AWS',
|
50
|
+
:aws_access_key_id => @riakcs_access_key_id,
|
51
|
+
:aws_secret_access_key => @riakcs_secret_access_key,
|
52
|
+
:host => @host,
|
53
|
+
:port => @port,
|
54
|
+
:scheme => @scheme,
|
55
|
+
:connection_options => @connection_options
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
class Usage
|
4
|
+
module Utils
|
5
|
+
TYPES_TO_STRING = { :access => 'a', :storage => 'b' }
|
6
|
+
DEFAULT_TYPES = TYPES_TO_STRING.keys
|
7
|
+
DEFAULT_FORMAT = :json
|
8
|
+
|
9
|
+
def sanitize_and_convert_time(time)
|
10
|
+
time.utc.iso8601.gsub(/[:-]/, '')
|
11
|
+
end
|
12
|
+
|
13
|
+
def format_and_types_to_path(format, types)
|
14
|
+
format_character = format.to_s.split('').first
|
15
|
+
type_characters = types.map { |t| TYPES_TO_STRING[t] }.compact
|
16
|
+
|
17
|
+
[type_characters, format_character].flatten.compact.join
|
18
|
+
end
|
19
|
+
|
20
|
+
def request_uri(access_key_id, options)
|
21
|
+
format = DEFAULT_FORMAT
|
22
|
+
types = options[:types] || DEFAULT_TYPES
|
23
|
+
start_time = options[:start_time] || Time.now.utc - 86400
|
24
|
+
end_time = options[:end_time] || Time.now.utc
|
25
|
+
|
26
|
+
[access_key_id,
|
27
|
+
format_and_types_to_path(format, types),
|
28
|
+
sanitize_and_convert_time(start_time),
|
29
|
+
sanitize_and_convert_time(end_time)].join('.')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Real
|
34
|
+
include Utils
|
35
|
+
|
36
|
+
def get_usage(access_key_id, options = {})
|
37
|
+
response = @connection.get_object('riak-cs', ["usage", request_uri(access_key_id, options)].join("/"))
|
38
|
+
|
39
|
+
if !response.body.empty?
|
40
|
+
response.body = Fog::JSON.decode(response.body)
|
41
|
+
end
|
42
|
+
response
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class Mock
|
47
|
+
include Utils
|
48
|
+
|
49
|
+
def get_usage(access_key, options = {})
|
50
|
+
Excon::Response.new.tap do |response|
|
51
|
+
response.status = 200
|
52
|
+
response.headers['Content-Type'] = 'application/json'
|
53
|
+
response.body = {
|
54
|
+
'Access' => {
|
55
|
+
'Nodes' => [],
|
56
|
+
'Errors' => []
|
57
|
+
},
|
58
|
+
'Storage' => {
|
59
|
+
'Samples' => [],
|
60
|
+
'Errors' => []
|
61
|
+
}
|
62
|
+
}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
module UserUtils
|
4
|
+
def update_riakcs_user(key_id, user)
|
5
|
+
response = @s3_connection.put_object('riak-cs', "user/#{key_id}", Fog::JSON.encode(user), { 'Content-Type' => 'application/json' })
|
6
|
+
if !response.body.empty?
|
7
|
+
response.body = Fog::JSON.decode(response.body)
|
8
|
+
end
|
9
|
+
response
|
10
|
+
end
|
11
|
+
|
12
|
+
def update_mock_user(key_id, user)
|
13
|
+
if data[key_id]
|
14
|
+
if status = user[:status]
|
15
|
+
data[key_id][:status] = status
|
16
|
+
end
|
17
|
+
|
18
|
+
if user[:new_key_secret]
|
19
|
+
data[key_id][:key_secret] = rand(100).to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
Excon::Response.new.tap do |response|
|
23
|
+
response.status = 200
|
24
|
+
response.body = data[key_id]
|
25
|
+
end
|
26
|
+
else
|
27
|
+
Excon::Response.new.tap do |response|
|
28
|
+
response.status = 403
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Fog
|
2
|
+
module RiakCS
|
3
|
+
module Utils
|
4
|
+
def configure_uri_options(options = {})
|
5
|
+
@host = options[:host] || 'localhost'
|
6
|
+
@persistent = options[:persistent] || true
|
7
|
+
@port = options[:port] || 8080
|
8
|
+
@scheme = options[:scheme] || 'http'
|
9
|
+
end
|
10
|
+
|
11
|
+
def riakcs_uri
|
12
|
+
"#{@scheme}://#{@host}:#{@port}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|