fog-riakcs 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.
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