fog-radosgw 0.0.1
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/.gitignore +23 -0
- data/CONTRIBUTORS.md +3 -0
- data/Gemfile +2 -0
- data/LICENSE.md +20 -0
- data/README.md +65 -0
- data/Rakefile +82 -0
- data/fog-radosgw.gemspec +29 -0
- data/lib/fog/radosgw.rb +2 -0
- data/lib/fog/radosgw/core.rb +144 -0
- data/lib/fog/radosgw/provisioning.rb +101 -0
- data/lib/fog/radosgw/requests/provisioning/create_user.rb +83 -0
- data/lib/fog/radosgw/requests/provisioning/delete_user.rb +57 -0
- data/lib/fog/radosgw/requests/provisioning/disable_user.rb +23 -0
- data/lib/fog/radosgw/requests/provisioning/enable_user.rb +23 -0
- data/lib/fog/radosgw/requests/provisioning/get_user.rb +66 -0
- data/lib/fog/radosgw/requests/provisioning/list_users.rb +70 -0
- data/lib/fog/radosgw/requests/provisioning/update_user.rb +23 -0
- data/lib/fog/radosgw/requests/provisioning/user.json +17 -0
- data/lib/fog/radosgw/requests/usage/get_usage.rb +60 -0
- data/lib/fog/radosgw/usage.rb +62 -0
- data/lib/fog/radosgw/version.rb +5 -0
- data/tests/helper.rb +9 -0
- data/tests/helpers/mock_helper.rb +15 -0
- data/tests/radosgw/helper.rb +1 -0
- data/tests/radosgw/requests/provisioning/provisioning_tests.rb +170 -0
- data/tests/radosgw/requests/usage/usage_tests.rb +23 -0
- metadata +156 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
module Fog
|
2
|
+
module Radosgw
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
|
7
|
+
def create_user(user_id, display_name, email, options = {})
|
8
|
+
if get_user(user_id).status != 404
|
9
|
+
raise Fog::Radosgw::Provisioning::UserAlreadyExists, "User with user_id #{user_id} already exists."
|
10
|
+
end
|
11
|
+
|
12
|
+
path = "admin/user"
|
13
|
+
user_id = Fog::AWS.escape(user_id)
|
14
|
+
display_name = Fog::AWS.escape(display_name)
|
15
|
+
email = Fog::AWS.escape(email)
|
16
|
+
query = "?uid=#{user_id}&display-name=#{display_name}&email=#{email}&format=json"
|
17
|
+
params = {
|
18
|
+
:method => 'PUT',
|
19
|
+
:path => path,
|
20
|
+
}
|
21
|
+
|
22
|
+
begin
|
23
|
+
response = Excon.put("#{@scheme}://#{@host}/#{path}#{query}",
|
24
|
+
:headers => signed_headers(params))
|
25
|
+
if !response.body.empty?
|
26
|
+
case response.headers['Content-Type']
|
27
|
+
when 'application/json'
|
28
|
+
response.body = Fog::JSON.decode(response.body)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
response
|
32
|
+
rescue Excon::Errors::Conflict => e
|
33
|
+
raise Fog::Radosgw::Provisioning::UserAlreadyExists.new
|
34
|
+
rescue Excon::Errors::BadRequest => e
|
35
|
+
raise Fog::Radosgw::Provisioning::ServiceUnavailable.new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Mock
|
41
|
+
def user_exists?(user_id)
|
42
|
+
data.find do |key, value|
|
43
|
+
value[:user_id] == user_id
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_user(user_id, display_name, email, options = {})
|
48
|
+
if user_exists?(user_id)
|
49
|
+
raise Fog::Radosgw::Provisioning::UserAlreadyExists, "User with user_id #{user_id} already exists."
|
50
|
+
end
|
51
|
+
|
52
|
+
secret_key = rand(1000).to_s
|
53
|
+
data[user_id] = {
|
54
|
+
:email => email,
|
55
|
+
:user_id => user_id,
|
56
|
+
:display_name => display_name,
|
57
|
+
:suspended => 0,
|
58
|
+
:secret_key => secret_key,
|
59
|
+
}
|
60
|
+
|
61
|
+
Excon::Response.new.tap do |response|
|
62
|
+
response.status = 200
|
63
|
+
response.headers['Content-Type'] = 'application/json'
|
64
|
+
response.body = {
|
65
|
+
"email" => email,
|
66
|
+
"user_id" => user_id,
|
67
|
+
"display_name" => display_name,
|
68
|
+
"suspended" => 0,
|
69
|
+
"keys" =>
|
70
|
+
[
|
71
|
+
{
|
72
|
+
"access_key" => "XXXXXXXXXXXXXXXXXXXX",
|
73
|
+
"secret_key" => secret_key,
|
74
|
+
"user" => user_id,
|
75
|
+
}
|
76
|
+
],
|
77
|
+
}
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Fog
|
2
|
+
module Radosgw
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
|
7
|
+
def delete_user(user_id)
|
8
|
+
path = "admin/user"
|
9
|
+
user_id = Fog::AWS.escape(user_id)
|
10
|
+
query = "?uid=#{user_id}&format=json"
|
11
|
+
params = {
|
12
|
+
:method => 'DELETE',
|
13
|
+
:path => path,
|
14
|
+
}
|
15
|
+
|
16
|
+
begin
|
17
|
+
response = Excon.delete("#{@scheme}://#{@host}/#{path}#{query}",
|
18
|
+
:headers => signed_headers(params))
|
19
|
+
if !response.body.empty?
|
20
|
+
case response.headers['Content-Type']
|
21
|
+
when 'application/json'
|
22
|
+
response.body = Fog::JSON.decode(response.body)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
response
|
26
|
+
rescue Excon::Errors::NotFound => e
|
27
|
+
raise Fog::Radosgw::Provisioning::NoSuchUser.new
|
28
|
+
rescue Excon::Errors::BadRequest => e
|
29
|
+
raise Fog::Radosgw::Provisioning::ServiceUnavailable.new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Mock
|
35
|
+
def user_exists?(user_id)
|
36
|
+
data.find do |key, value|
|
37
|
+
value[:user_id] == user_id
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete_user(user_id)
|
42
|
+
if !user_exists?(user_id)
|
43
|
+
raise Fog::Radosgw::Provisioning::NoSuchUser, "No user with user_id #{user_id} exists."
|
44
|
+
end
|
45
|
+
|
46
|
+
data.delete(user_id)
|
47
|
+
|
48
|
+
Excon::Response.new.tap do |response|
|
49
|
+
response.status = 200
|
50
|
+
response.headers['Content-Type'] = 'application/json'
|
51
|
+
response.body = ""
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fog
|
2
|
+
module Radosgw
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include UserUtils
|
7
|
+
include MultipartUtils
|
8
|
+
|
9
|
+
def disable_user(user_id)
|
10
|
+
update_radosgw_user(user_id, { :suspended => 1 })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Mock
|
15
|
+
include UserUtils
|
16
|
+
|
17
|
+
def disable_user(user_id)
|
18
|
+
update_mock_user(user_id, { :suspended => 1 })
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fog
|
2
|
+
module Radosgw
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include UserUtils
|
7
|
+
include MultipartUtils
|
8
|
+
|
9
|
+
def enable_user(user_id)
|
10
|
+
update_radosgw_user(user_id, { :suspended => 0 })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Mock
|
15
|
+
include UserUtils
|
16
|
+
|
17
|
+
def enable_user(user_id)
|
18
|
+
update_mock_user(user_id, { :suspended => 0 })
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Fog
|
2
|
+
module Radosgw
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include MultipartUtils
|
7
|
+
|
8
|
+
def get_user(user_id)
|
9
|
+
path = "admin/user"
|
10
|
+
user_id = Fog::AWS.escape(user_id)
|
11
|
+
query = "?uid=#{user_id}&format=json"
|
12
|
+
params = {
|
13
|
+
:method => 'GET',
|
14
|
+
:path => path,
|
15
|
+
}
|
16
|
+
|
17
|
+
begin
|
18
|
+
response = Excon.get("#{@scheme}://#{@host}/#{path}#{query}",
|
19
|
+
:headers => signed_headers(params))
|
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::NotFound => e
|
28
|
+
raise Fog::Radosgw::Provisioning::NoSuchUser.new
|
29
|
+
rescue Excon::Errors::BadRequest => e
|
30
|
+
raise Fog::Radosgw::Provisioning::ServiceUnavailable.new
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Mock
|
36
|
+
def get_user(user_id)
|
37
|
+
if value = data[user_id]
|
38
|
+
Excon::Response.new.tap do |response|
|
39
|
+
response.status = 200
|
40
|
+
response.headers['Content-Type'] = 'application/json'
|
41
|
+
response.body = {
|
42
|
+
"email" => value[:email],
|
43
|
+
"user_id" => value[:user_id],
|
44
|
+
"display_name" => value[:display_name],
|
45
|
+
"suspended" => value[:suspended],
|
46
|
+
"keys" =>
|
47
|
+
[
|
48
|
+
{
|
49
|
+
"access_key" => "XXXXXXXXXXXXXXXXXXXX",
|
50
|
+
"secret_key" => value[:secret_key],
|
51
|
+
"user" => value[:user_id],
|
52
|
+
}
|
53
|
+
],
|
54
|
+
}
|
55
|
+
end
|
56
|
+
else
|
57
|
+
Excon::Response.new.tap do |response|
|
58
|
+
response.status = 404
|
59
|
+
response.headers['Content-Type'] = 'application/json'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Fog
|
2
|
+
module Radosgw
|
3
|
+
class Provisioning
|
4
|
+
class Real
|
5
|
+
include Utils
|
6
|
+
include MultipartUtils
|
7
|
+
|
8
|
+
def list_user_ids()
|
9
|
+
path = "admin/metadata/user"
|
10
|
+
query = "?format=json"
|
11
|
+
params = {
|
12
|
+
:method => 'GET',
|
13
|
+
:path => path,
|
14
|
+
}
|
15
|
+
|
16
|
+
begin
|
17
|
+
response = Excon.get("#{@scheme}://#{@host}/#{path}#{query}",
|
18
|
+
:headers => signed_headers(params))
|
19
|
+
if !response.body.empty?
|
20
|
+
case response.headers['Content-Type']
|
21
|
+
when 'application/json'
|
22
|
+
response.body = Fog::JSON.decode(response.body)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
response.body = []
|
26
|
+
end
|
27
|
+
response
|
28
|
+
rescue Excon::Errors::BadRequest => e
|
29
|
+
raise Fog::Radosgw::Provisioning::ServiceUnavailable.new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def list_users(options = {})
|
34
|
+
response = list_user_ids
|
35
|
+
response.body = response.body.map { |user_id| get_user(user_id).body }
|
36
|
+
if options[:suspended]
|
37
|
+
response.body = response.body.select { |user| user[:suspended] == options[:suspended] }
|
38
|
+
end
|
39
|
+
response
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Mock
|
44
|
+
def list_users(options = {})
|
45
|
+
filtered_data = options[:suspended] ? data.select { |key, value| value[:suspended] == options[:suspended] } : data
|
46
|
+
|
47
|
+
Excon::Response.new.tap do |response|
|
48
|
+
response.status = 200
|
49
|
+
response.body = filtered_data.map do |key, value|
|
50
|
+
{
|
51
|
+
"email" => value[:email],
|
52
|
+
"display_name" => value[:user_id],
|
53
|
+
"user_id" => value[:user_id],
|
54
|
+
"suspended" => value[:suspended],
|
55
|
+
"keys" =>
|
56
|
+
[
|
57
|
+
{
|
58
|
+
"access_key" => "XXXXXXXXXXXXXXXXXXXX",
|
59
|
+
"secret_key" => value[:secret_key],
|
60
|
+
"user" => value[:user_id],
|
61
|
+
}
|
62
|
+
],
|
63
|
+
}
|
64
|
+
end.compact
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fog
|
2
|
+
module Radosgw
|
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_radosgw_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,17 @@
|
|
1
|
+
{
|
2
|
+
"keys" : [
|
3
|
+
{
|
4
|
+
"access_key" : "UPET5548S0CU9112ID33",
|
5
|
+
"secret_key" : "aaw1AZ7+OlEEy6FrXkGy0oP2p4BvE/Eeg0L9ucmj",
|
6
|
+
"user" : "Fog User"
|
7
|
+
}
|
8
|
+
],
|
9
|
+
"suspended" : 0,
|
10
|
+
"swift_keys" : [],
|
11
|
+
"subusers" : [],
|
12
|
+
"user_id" : "Fog User",
|
13
|
+
"caps" : [],
|
14
|
+
"display_name" : "Fog User",
|
15
|
+
"email" : "",
|
16
|
+
"max_buckets" : 1000
|
17
|
+
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Fog
|
2
|
+
module Radosgw
|
3
|
+
class Usage
|
4
|
+
module Utils
|
5
|
+
|
6
|
+
def sanitize_and_convert_time(time)
|
7
|
+
fmt = '%Y-%m-%d %H:%M:%S'
|
8
|
+
Fog::AWS.escape(time.strftime(fmt))
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
class Real
|
14
|
+
include Utils
|
15
|
+
|
16
|
+
def get_usage(access_key_id, options = {})
|
17
|
+
path = "admin/usage"
|
18
|
+
t_now = Fog::Time.now
|
19
|
+
start_time = sanitize_and_convert_time(options[:start_time] || t_now - 86400)
|
20
|
+
end_time = sanitize_and_convert_time(options[:end_time] || t_now)
|
21
|
+
|
22
|
+
query = "?format=json&start=#{start_time}&end=#{end_time}"
|
23
|
+
params = {
|
24
|
+
:method => 'GET',
|
25
|
+
:path => path,
|
26
|
+
}
|
27
|
+
|
28
|
+
begin
|
29
|
+
response = Excon.get("#{@scheme}://#{@host}/#{path}#{query}",
|
30
|
+
:headers => signed_headers(params))
|
31
|
+
if !response.body.empty?
|
32
|
+
case response.headers['Content-Type']
|
33
|
+
when 'application/json'
|
34
|
+
response.body = Fog::JSON.decode(response.body)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
response
|
38
|
+
rescue Excon::Errors::BadRequest => e
|
39
|
+
raise Fog::Radosgw::Provisioning::ServiceUnavailable.new
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Mock
|
45
|
+
include Utils
|
46
|
+
|
47
|
+
def get_usage(access_key, options = {})
|
48
|
+
Excon::Response.new.tap do |response|
|
49
|
+
response.status = 200
|
50
|
+
response.headers['Content-Type'] = 'application/json'
|
51
|
+
response.body = {
|
52
|
+
'entries' => [],
|
53
|
+
'summary' => []
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'fog/radosgw/core'
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
module Fog
|
5
|
+
module Radosgw
|
6
|
+
class Usage < Fog::Service
|
7
|
+
requires :radosgw_access_key_id, :radosgw_secret_access_key
|
8
|
+
recognizes :host, :path, :port, :scheme, :persistent
|
9
|
+
|
10
|
+
request_path 'fog/radosgw/requests/usage'
|
11
|
+
request :get_usage
|
12
|
+
|
13
|
+
class Mock
|
14
|
+
include Utils
|
15
|
+
|
16
|
+
def self.data
|
17
|
+
@data ||= Hash.new do |hash, key|
|
18
|
+
hash[key] = {}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.reset
|
23
|
+
@data = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(options = {})
|
27
|
+
configure_uri_options(options)
|
28
|
+
end
|
29
|
+
|
30
|
+
def data
|
31
|
+
self.class.data[radosgw_uri]
|
32
|
+
end
|
33
|
+
|
34
|
+
def reset_data
|
35
|
+
self.class.data.delete(radosgw_uri)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class Real
|
40
|
+
include Utils
|
41
|
+
|
42
|
+
def initialize(options = {})
|
43
|
+
configure_uri_options(options)
|
44
|
+
@radosgw_access_key_id = options[:radosgw_access_key_id]
|
45
|
+
@radosgw_secret_access_key = options[:radosgw_secret_access_key]
|
46
|
+
@connection_options = options[:connection_options] || {}
|
47
|
+
@persistent = options[:persistent] || false
|
48
|
+
|
49
|
+
@s3_connection = Fog::Storage.new(
|
50
|
+
:provider => 'AWS',
|
51
|
+
:aws_access_key_id => @radosgw_access_key_id,
|
52
|
+
:aws_secret_access_key => @radosgw_secret_access_key,
|
53
|
+
:host => @host,
|
54
|
+
:port => @port,
|
55
|
+
:scheme => @scheme,
|
56
|
+
:connection_options => @connection_options
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|