fog-riakcs 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.hound.yml +20 -0
  4. data/.rubocop.yml +20 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +17 -0
  8. data/CONTRIBUTING.md +18 -0
  9. data/CONTRIBUTORS.md +10 -0
  10. data/Gemfile +4 -0
  11. data/LICENSE.md +20 -0
  12. data/README.md +38 -0
  13. data/Rakefile +18 -0
  14. data/fog-riakcs.gemspec +36 -0
  15. data/gemfiles/Gemfile.1.9.2- +8 -0
  16. data/gemfiles/Gemfile.1.9.3+ +7 -0
  17. data/lib/fog/riakcs.rb +17 -0
  18. data/lib/fog/riakcs/multipart_utils.rb +45 -0
  19. data/lib/fog/riakcs/multipart_utils/headers.rb +33 -0
  20. data/lib/fog/riakcs/provisioning.rb +97 -0
  21. data/lib/fog/riakcs/provisioning/create_user.rb +77 -0
  22. data/lib/fog/riakcs/provisioning/disable_user.rb +23 -0
  23. data/lib/fog/riakcs/provisioning/enable_user.rb +23 -0
  24. data/lib/fog/riakcs/provisioning/get_user.rb +41 -0
  25. data/lib/fog/riakcs/provisioning/list_users.rb +43 -0
  26. data/lib/fog/riakcs/provisioning/regrant_secret.rb +23 -0
  27. data/lib/fog/riakcs/provisioning/update_user.rb +23 -0
  28. data/lib/fog/riakcs/usage.rb +61 -0
  29. data/lib/fog/riakcs/usage/get_usage.rb +68 -0
  30. data/lib/fog/riakcs/user_utils.rb +34 -0
  31. data/lib/fog/riakcs/utils.rb +16 -0
  32. data/lib/fog/riakcs/version.rb +5 -0
  33. data/spec/minitest_helper.rb +31 -0
  34. data/tests/helper.rb +34 -0
  35. data/tests/helpers/collection_helper.rb +97 -0
  36. data/tests/helpers/flavors_helper.rb +32 -0
  37. data/tests/helpers/formats_helper.rb +98 -0
  38. data/tests/helpers/formats_helper_tests.rb +110 -0
  39. data/tests/helpers/mock_helper.rb +15 -0
  40. data/tests/helpers/model_helper.rb +29 -0
  41. data/tests/helpers/responds_to_helper.rb +11 -0
  42. data/tests/helpers/schema_validator_tests.rb +107 -0
  43. data/tests/helpers/server_helper.rb +25 -0
  44. data/tests/helpers/servers_helper.rb +10 -0
  45. data/tests/helpers/succeeds_helper.rb +9 -0
  46. data/tests/riakcs/provisioning/provisioning_tests.rb +174 -0
  47. data/tests/riakcs/usage/usage_tests.rb +29 -0
  48. 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