nephophobia 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nephophobia (0.0.1)
4
+ nephophobia (0.0.2)
5
5
  hugs (~> 2.5.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Nephophobia
2
2
 
3
- Lean Ruby bindings to OpenStack's AWS EC2 endpoint. Hands back a Hash (for now).
3
+ Lean Ruby bindings to [EC2](http://aws.amazon.com/ec2/), and OpenStack's Admin endpoints. Hands back an object for access.
4
4
 
5
5
  ## Why
6
6
 
@@ -86,5 +86,13 @@ module Nephophobia
86
86
  @path = "/services/Admin/"
87
87
  @user ||= Nephophobia::User.new self
88
88
  end
89
+
90
+ ##
91
+ # Provide a simple interface to the OpenStack Role resources.
92
+
93
+ def role
94
+ @path = "/services/Admin/"
95
+ @role ||= Nephophobia::Role.new self
96
+ end
89
97
  end
90
98
  end
@@ -46,7 +46,7 @@ module Nephophobia
46
46
  end
47
47
 
48
48
  ##
49
- # Create the compute instance identified by +instance_id+.
49
+ # Create a compute instance with the given 'image_id'.
50
50
  # Returns information about the new instance.
51
51
  #
52
52
  # +image_id+: A String representing the ID of the image.
@@ -68,8 +68,7 @@ module Nephophobia
68
68
  end
69
69
 
70
70
  ##
71
- # Shuts down the given 'instance_id'. This operation is idempotent; if
72
- # you terminate an instance more than once, each call will succeed.
71
+ # Removes the given 'instance_id'.
73
72
  # Returns instances response to a state change.
74
73
  #
75
74
  # +instance_id+: A String representing the ID of the instance.
@@ -85,7 +84,7 @@ module Nephophobia
85
84
  end
86
85
 
87
86
  ##
88
- # Returns information about the given 'instance_id' +@client+ owns.
87
+ # Returns information about the given 'instance_id'.
89
88
  #
90
89
  # +instance_id+: A String representing the ID of the instance.
91
90
 
@@ -100,7 +99,7 @@ module Nephophobia
100
99
  end
101
100
 
102
101
  ##
103
- # Reboot the compute instance identified by +instance_id+.
102
+ # Reboot the given 'instance_id'.
104
103
  # Returns instances response to a state change.
105
104
  #
106
105
  # +instance_id+: A String representing the ID of the instance.
@@ -116,7 +115,7 @@ module Nephophobia
116
115
  end
117
116
 
118
117
  ##
119
- # Starts the compute instance identified by +instance_id+.
118
+ # Starts the given 'instance_id'.
120
119
  # Returns instances current and previous state.
121
120
  #
122
121
  # +instance_id+: A String representing the ID of the instance.
@@ -132,7 +131,7 @@ module Nephophobia
132
131
  end
133
132
 
134
133
  ##
135
- # Stops the compute instance identified by +instance_id+.
134
+ # Stops the given 'instance_id'
136
135
  # Returns instances current and previous state.
137
136
  #
138
137
  # +instance_id+: A String representing the ID of the instance.
@@ -44,7 +44,7 @@ module Nephophobia
44
44
  end
45
45
 
46
46
  ##
47
- # Returns information about the specified 'image_id'.
47
+ # Returns information about the given 'image_id'.
48
48
  #
49
49
  # +image_id+: A String representing the ID of the image.
50
50
 
@@ -69,7 +69,7 @@ module Nephophobia
69
69
 
70
70
  private
71
71
  ##
72
- # images which do not have a valid kernel_id are not runnable.
72
+ # Images which do not have a valid kernel_id are not runnable.
73
73
 
74
74
  def public? image
75
75
  image.is_public == "true" && image.kernel_id != "true"
@@ -1,11 +1,12 @@
1
1
  module Nephophobia
2
2
  class ProjectData
3
- attr_reader :name, :manager_id, :description
3
+ attr_reader :name, :manager_id, :description, :member
4
4
 
5
5
  def initialize hash
6
6
  @name = hash['projectname']
7
7
  @manager_id = hash['projectManagerId']
8
8
  @description = hash['description']
9
+ @member = hash['member']
9
10
  end
10
11
  end
11
12
 
@@ -37,7 +38,7 @@ module Nephophobia
37
38
  end
38
39
 
39
40
  ##
40
- # Creates the given 'project_name'.
41
+ # Creates the given 'project_name' and adds the specified 'user_name' as the manager.
41
42
  # Returns a response to the state change.
42
43
  #
43
44
  # +user_name+: A String representing a nova user_name.
@@ -75,19 +76,34 @@ module Nephophobia
75
76
  response = @client.action "DescribeProject", "Name" => project_name
76
77
 
77
78
  ProjectData.new response.body['DescribeProjectResponse']
79
+ rescue Hugs::Errors::BadRequest
78
80
  end
79
81
 
80
82
  ##
81
83
  # Returns information about all members of the given 'project_name'.
84
+ #
85
+ # +project_name+: A String representing a nova project name.
82
86
 
83
87
  def members project_name
84
88
  response = @client.action "DescribeProjectMembers", "Name" => project_name
85
89
 
86
- response.body['DescribeProjectMembersResponse']['members']['item']
90
+ response.body['DescribeProjectMembersResponse']['members']['item'].collect do |data|
91
+ ProjectData.new data
92
+ end
93
+ end
94
+
95
+ ##
96
+ # Return a Boolean if the given 'user_name' is a member of the specified 'project_name'.
97
+ #
98
+ # +user_name+: A String representing a nova user_name.
99
+ # +project_name+: A String representing a nova project_name name.
100
+
101
+ def member? user_name, project_name
102
+ members(project_name).any? { |f| f.member == user_name }
87
103
  end
88
104
 
89
105
  ##
90
- # Removes the given 'user_name' from the specified "project_name".
106
+ # Removes the given 'user_name' from the specified 'project_name'.
91
107
  # Returns a response to the state change.
92
108
  #
93
109
  # +user_name+: A String representing a nova user_name.
@@ -1,5 +1,69 @@
1
1
  module Nephophobia
2
+ class RoleData
3
+ attr_reader :name
4
+
5
+ def initialize hash
6
+ @name = hash['role']
7
+ end
8
+ end
9
+
2
10
  class Role
11
+ ### TODO: Add a default attr.
3
12
  DEFAULT = "sysadmin"
13
+
14
+ def initialize client
15
+ @client = client
16
+ end
17
+
18
+ ##
19
+ # Adds the given 'user_name' to the specified "project_name's" 'Role::DEFAULT'.
20
+ # Returns a response to the state change.
21
+ #
22
+ # +user_name+: A String representing a nova user_name.
23
+ # +project_name+: A String representing a nova project_name name.
24
+
25
+ def create user_name, project_name
26
+ modify_role user_name, "add", project_name
27
+ end
28
+
29
+ ##
30
+ # Removes the given 'user_name' from the specified "project_name's" 'Role::DEFAULT'.
31
+ #
32
+ # +user_name+: A String representing a nova user_name.
33
+ # +project_name+: A String representing a nova project_name name.
34
+
35
+ def destroy user_name, project_name
36
+ modify_role user_name, "remove", project_name
37
+ end
38
+
39
+ ##
40
+ # Returns roles for the given 'user_name' and 'project_name'.
41
+
42
+ def all user_name, project_name
43
+ params = {
44
+ "User" => user_name,
45
+ "Project" => project_name
46
+ }
47
+
48
+ response = @client.action "DescribeUserRoles", params
49
+
50
+ response.body['DescribeUserRolesResponse']['roles'] &&
51
+ Nephophobia.coerce(response.body['DescribeUserRolesResponse']['roles']['item']).collect do |data|
52
+ RoleData.new data
53
+ end
54
+ end
55
+
56
+ private
57
+ def modify_role user_name, operation, project_name
58
+ params = {
59
+ "User" => user_name,
60
+ "Role" => DEFAULT,
61
+ "Operation" => operation
62
+ }
63
+
64
+ response = @client.action "ModifyUserRole", params
65
+
66
+ ResponseData.new response.body['ModifyUserRoleResponse']
67
+ end
4
68
  end
5
69
  end
@@ -15,26 +15,32 @@ module Nephophobia
15
15
  end
16
16
 
17
17
  ##
18
- # Adds the given 'user_name' to the specified "project_name's" 'Role::DEFAULT'.
18
+ # Creates the given 'user_name'.
19
19
  # Returns a response to the state change.
20
20
  #
21
21
  # +user_name+: A String representing a nova user_name.
22
- # +project_name+: A String representing a nova project_name name.
23
22
 
24
- def add_role user_name, project_name
25
- modify_role user_name, "add", project_name
23
+ def create user_name
24
+ response = @client.action "RegisterUser", "Name" => user_name
25
+
26
+ UserData.new response.body['RegisterUserResponse']
26
27
  end
27
28
 
28
29
  ##
29
- # Creates the given 'user_name'.
30
- # Returns a response to the state change.
30
+ # Returns the credentials for a given 'user_name' for the specified 'project_name'.
31
31
  #
32
32
  # +user_name+: A String representing a nova user_name.
33
+ # +project_name+: A String representing a nova project_name name.
33
34
 
34
- def create user_name
35
- response = @client.action "RegisterUser", "Name" => user_name
35
+ def credentials user_name, project_name
36
+ params = {
37
+ "name" => user_name,
38
+ "project" => project_name
39
+ }
36
40
 
37
- UserData.new response.body['RegisterUserResponse']
41
+ response = @client.action "GenerateX509ForUser", params
42
+
43
+ Base64.decode64 response.body['GenerateX509ForUserResponse']['file']
38
44
  end
39
45
 
40
46
  ##
@@ -58,29 +64,7 @@ module Nephophobia
58
64
  response = @client.action "DescribeUser", "Name" => user_name
59
65
 
60
66
  UserData.new response.body['DescribeUserResponse']
61
- end
62
-
63
- ##
64
- # Removes the given 'user_name' from the specified "project_name's" 'Role::DEFAULT'.
65
- #
66
- # +user_name+: A String representing a nova user_name.
67
- # +project_name+: A String representing a nova project_name name.
68
-
69
- def remove_role user_name, project_name
70
- modify_role user_name, "remove", project_name
71
- end
72
-
73
- private
74
- def modify_role user_name, operation, project_name
75
- params = {
76
- "User" => user_name,
77
- "Role" => Role::DEFAULT,
78
- "Operation" => operation
79
- }
80
-
81
- response = @client.action "ModifyUserRole", params
82
-
83
- ResponseData.new response.body['ModifyUserRoleResponse']
67
+ rescue Hugs::Errors::BadRequest
84
68
  end
85
69
  end
86
70
  end
@@ -1,3 +1,3 @@
1
1
  module Nephophobia
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,30 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: http://10.1.170.32:8773/services/Admin/?AWSAccessKeyId=1d7a687b-0065-44d6-9611-5bf6c6c72424%3Aproduction&Action=DescribeProject&Name=invalid_project_name&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=1999-12-31T19%3A59%3A59Z&Version=2010-11-15&Signature=8Sk4Nu3S6eiEiftNj3jhPusdsT7%2FRpkFMGLBKaCaurw%3D
6
+ body:
7
+ headers:
8
+ accept:
9
+ - application/xml
10
+ connection:
11
+ - keep-alive
12
+ keep-alive:
13
+ - 30
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 400
17
+ message: Bad Request
18
+ headers:
19
+ content-type:
20
+ - text/xml
21
+ content-length:
22
+ - "197"
23
+ date:
24
+ - Mon, 07 Mar 2011 23:40:33 GMT
25
+ connection:
26
+ - keep-alive
27
+ body: |-
28
+ <?xml version="1.0"?>
29
+ <Response><Errors><Error><Code>NotFound</Code><Message>No project with id invalid_project_name</Message></Error></Errors><RequestID>ZVKFOJ0MKX8MJ5JJO0II</RequestID></Response>
30
+ http_version: "1.1"
@@ -19,10 +19,10 @@
19
19
  content-type:
20
20
  - text/xml
21
21
  content-length:
22
- - "605"
22
+ - "563"
23
23
  date:
24
- - Tue, 22 Feb 2011 06:52:40 GMT
24
+ - Tue, 08 Mar 2011 06:05:21 GMT
25
25
  connection:
26
26
  - keep-alive
27
- body: <?xml version="1.0" ?><DescribeProjectMembersResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"><requestId>KR4WD541JK-40-5M6F8P</requestId><members><item><member>root</member></item><item><member>foo</member></item><item><member>jkleinpeter</member></item><item><member>ccrissman</member></item><item><member>amikula</member></item><item><member>kbringard</member></item><item><member>cnoshpitz</member></item><item><member>dfong</member></item><item><member>jheiss</member></item><item><member>gnolan</member></item><item><member>msaltman</member></item></members></DescribeProjectMembersResponse>
27
+ body: <?xml version="1.0" ?><DescribeProjectMembersResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"><requestId>LE01AT-PG3M3UDJGO3GC</requestId><members><item><member>tr0001</member></item><item><member>jtran</member></item><item><member>jdewey</member></item><item><member>jkleinpeter</member></item><item><member>kbringard</member></item><item><member>root</member></item><item><member>jt708u</member></item><item><member>xx1234</member></item><item><member>jd265j</member></item><item><member>jk520u</member></item></members></DescribeProjectMembersResponse>
28
28
  http_version: "1.1"
@@ -0,0 +1,28 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: http://10.1.170.32:8773/services/Admin/?AWSAccessKeyId=1d7a687b-0065-44d6-9611-5bf6c6c72424%3Aproduction&Action=DescribeUserRoles&Project=foobar_project&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=1999-12-31T19%3A59%3A59Z&User=foobar_user&Version=2010-11-15&Signature=b27VsAcRr9dEbjffLUzb4zeztwPFRSVWM53vxFcuyzY%3D
6
+ body:
7
+ headers:
8
+ accept:
9
+ - application/xml
10
+ connection:
11
+ - keep-alive
12
+ keep-alive:
13
+ - 30
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ content-type:
20
+ - text/xml
21
+ content-length:
22
+ - "252"
23
+ date:
24
+ - Mon, 07 Mar 2011 23:23:41 GMT
25
+ connection:
26
+ - keep-alive
27
+ body: <?xml version="1.0" ?><DescribeUserRolesResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"><requestId>5P5XXDX7JWE3X1VH7XV8</requestId><roles><item><role>netadmin</role></item><item><role>sysadmin</role></item></roles></DescribeUserRolesResponse>
28
+ http_version: "1.1"
@@ -0,0 +1,28 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: http://10.1.170.32:8773/services/Admin/?AWSAccessKeyId=1d7a687b-0065-44d6-9611-5bf6c6c72424%3Aproduction&Action=DescribeUserRoles&Project=foobar_project&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=1999-12-31T19%3A59%3A59Z&User=foobar_user&Version=2010-11-15&Signature=b27VsAcRr9dEbjffLUzb4zeztwPFRSVWM53vxFcuyzY%3D
6
+ body:
7
+ headers:
8
+ accept:
9
+ - application/xml
10
+ connection:
11
+ - keep-alive
12
+ keep-alive:
13
+ - 30
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ content-type:
20
+ - text/xml
21
+ content-length:
22
+ - "177"
23
+ date:
24
+ - Tue, 08 Mar 2011 05:04:36 GMT
25
+ connection:
26
+ - keep-alive
27
+ body: <?xml version="1.0" ?><DescribeUserRolesResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"><requestId>YL8TVVAIPZF4TAL3BNA-</requestId><roles/></DescribeUserRolesResponse>
28
+ http_version: "1.1"
@@ -0,0 +1,28 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: http://10.1.170.32:8773/services/Admin/?AWSAccessKeyId=1d7a687b-0065-44d6-9611-5bf6c6c72424%3Aproduction&Action=DescribeUserRoles&Project=foobar_project&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=1999-12-31T19%3A59%3A59Z&User=foobar_user&Version=2010-11-15&Signature=b27VsAcRr9dEbjffLUzb4zeztwPFRSVWM53vxFcuyzY%3D
6
+ body:
7
+ headers:
8
+ accept:
9
+ - application/xml
10
+ connection:
11
+ - keep-alive
12
+ keep-alive:
13
+ - 30
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ content-type:
20
+ - text/xml
21
+ content-length:
22
+ - "252"
23
+ date:
24
+ - Mon, 07 Mar 2011 23:23:41 GMT
25
+ connection:
26
+ - keep-alive
27
+ body: <?xml version="1.0" ?><DescribeUserRolesResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"><requestId>5P5XXDX7JWE3X1VH7XV8</requestId><roles><item><role>sysadmin</role></item></roles></DescribeUserRolesResponse>
28
+ http_version: "1.1"
@@ -21,8 +21,8 @@
21
21
  content-length:
22
22
  - "184"
23
23
  date:
24
- - Tue, 01 Mar 2011 00:09:31 GMT
24
+ - Mon, 07 Mar 2011 23:09:07 GMT
25
25
  connection:
26
26
  - keep-alive
27
- body: <?xml version="1.0" ?><ModifyUserRoleResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"><requestId>D-7DGZ3BHUJ8OEXEYWMI</requestId><return>true</return></ModifyUserRoleResponse>
27
+ body: <?xml version="1.0" ?><ModifyUserRoleResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"><requestId>J3NI8VJ2XF9WIYC7ZLSQ</requestId><return>true</return></ModifyUserRoleResponse>
28
28
  http_version: "1.1"
@@ -0,0 +1,28 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: http://10.1.170.32:8773/services/Admin/?AWSAccessKeyId=1d7a687b-0065-44d6-9611-5bf6c6c72424%3Aproduction&Action=GenerateX509ForUser&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=1999-12-31T19%3A59%3A59Z&Version=2010-11-15&name=foobar_user&project=production&Signature=BO8yZkptbtg6q5iaxfx%2BvRp0wQktH0oEIPHVmDtisI0%3D
6
+ body:
7
+ headers:
8
+ accept:
9
+ - application/xml
10
+ connection:
11
+ - keep-alive
12
+ keep-alive:
13
+ - 30
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ content-type:
20
+ - text/xml
21
+ content-length:
22
+ - "9800"
23
+ date:
24
+ - Tue, 08 Mar 2011 00:58:04 GMT
25
+ connection:
26
+ - keep-alive
27
+ body: <?xml version="1.0" ?><GenerateX509ForUserResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"><requestId>0B3PAS4ZCYMRW2L3EL78</requestId><username>foobar_user</username><secretkey>bd2c4c04-a2e7-4082-8482-778435b9427b</secretkey><accesskey>494e56aa-b021-4610-b7c0-e4434da1bf2f</accesskey><file>UEsDBBQAAAAAAEIHaD7YpiZC7AMAAOwDAAAGAAAAbm92YXJjTk9WQV9LRVlfRElSPSQocHVzaGQgJChkaXJuYW1lICRCQVNIX1NPVVJDRSk+L2Rldi9udWxsOyBwd2Q7IHBvcGQ+L2Rldi9udWxsKQpleHBvcnQgRUMyX0FDQ0VTU19LRVk9IjQ5NGU1NmFhLWIwMjEtNDYxMC1iN2MwLWU0NDM0ZGExYmYyZjpwcm9kdWN0aW9uIgpleHBvcnQgRUMyX1NFQ1JFVF9LRVk9ImJkMmM0YzA0LWEyZTctNDA4Mi04NDgyLTc3ODQzNWI5NDI3YiIKZXhwb3J0IEVDMl9VUkw9Imh0dHA6Ly8wLjAuMC4wOjg3NzMvc2VydmljZXMvQ2xvdWQiCmV4cG9ydCBTM19VUkw9Imh0dHA6Ly8wLjAuMC4wOjMzMzMiCmV4cG9ydCBFQzJfVVNFUl9JRD00MiAjIG5vdmEgZG9lcyBub3QgdXNlIHVzZXIgaWQsIGJ1dCBidW5kbGluZyByZXF1aXJlcyBpdApleHBvcnQgRUMyX1BSSVZBVEVfS0VZPSR7Tk9WQV9LRVlfRElSfS9way5wZW0KZXhwb3J0IEVDMl9DRVJUPSR7Tk9WQV9LRVlfRElSfS9jZXJ0LnBlbQpleHBvcnQgTk9WQV9DRVJUPSR7Tk9WQV9LRVlfRElSfS9jYWNlcnQucGVtCmV4cG9ydCBFVUNBTFlQVFVTX0NFUlQ9JHtOT1ZBX0NFUlR9ICMgZXVjYS1idW5kbGUtaW1hZ2Ugc2VlbXMgdG8gcmVxdWlyZSB0aGlzIHNldAphbGlhcyBlYzItYnVuZGxlLWltYWdlPSJlYzItYnVuZGxlLWltYWdlIC0tY2VydCAke0VDMl9DRVJUfSAtLXByaXZhdGVrZXkgJHtFQzJfUFJJVkFURV9LRVl9IC0tdXNlciA0MiAtLWVjMmNlcnQgJHtOT1ZBX0NFUlR9IgphbGlhcyBlYzItdXBsb2FkLWJ1bmRsZT0iZWMyLXVwbG9hZC1idW5kbGUgLWEgJHtFQzJfQUNDRVNTX0tFWX0gLXMgJHtFQzJfU0VDUkVUX0tFWX0gLS11cmwgJHtTM19VUkx9IC0tZWMyY2VydCAke05PVkFfQ0VSVH0iCmV4cG9ydCBDTE9VRF9TRVJWRVJTX0FQSV9LRVk9IjQ5NGU1NmFhLWIwMjEtNDYxMC1iN2MwLWU0NDM0ZGExYmYyZiIKZXhwb3J0IENMT1VEX1NFUlZFUlNfVVNFUk5BTUU9ImZvb2Jhcl91c2VyIgpleHBvcnQgQ0xPVURfU0VSVkVSU19VUkw9Imh0dHA6Ly8wLjAuMC4wOjg3NzQvdjEuMC8iCgpQSwMEFAAAAAAAQgdoPngFLUt7AwAAewMAAAYAAABway5wZW0tLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCk1JSUNYd0lCQUFLQmdRRE9mTGJudDlKYi9NTHpWRzYrRGNaSDRsV1NyMDlyNklHeWRoTHNnQVJ4M0VmNG1jZXYKKzExblBNSEZicDV5NDk3RFZVUEpjc1A5K29vSzcwRzUranErZVdlZDVNN28yS3MrenVXbVV2NjYvZ3FleVBRUQpFZExvWHYyZDlXdXVTeVl2SjEydFBZSGVMQ01rRGJZWUY5UWtIWWZld0ZBeUZyaCtJZjdQRXJ3c0JRSURBUUFCCkFvR0JBS1M0dHN5cFJ1WGRBTVJPc2IxcGphamd0TFU4cHhZRk9CbmV1WC96TEJpTXl0bFdEQWVtZGIrYXAxWFIKeGhNUEZ6RXFQdFpnZUZ1TzF6cWIzUW40eFl5bjVyRkdIVG5DQmVRV0s4VnZvU2hTUE4xSWo0aFJUT0RudkNtSQpmaE43L3l0MFRRU3dabFkwRUE3MUhUVFhLWFNBdjRNdFFYZ24zM1pzaFRZeldtSU5Ba0VBOW1GRXEwMk5BdVg1CnRLTDVkd00xNjlmbnFkcUhGYW1PSGhHdGdQdUQyUGRxYmFWbzZacnY0YkN2MlBmUm5YUWlVVjBRYTFrbVRkTnYKSmIxOGwxNU94d0pCQU5hTXNQVlFCV09TeTRuejlZcnZpYnhTQWMxMjJic2tyMkRXWTFFRFZxL0U1WUdKNFoxago3disxY0lYZW5pQXJDWDAyenRaZW9JWE8zdG9LRmJlTzB0TUNRUUNSaWFtZnEwTEYySVdsbjdQUENwVjZpR0l2CllvZnpVdUpCZnQzSDJFcnRDbEhURFNlby9yMyt5bmxGcURZcFZXWEVQRDRydTFDMkhsU0VyYWNBWDFRWEFrRUEKdXBYaWM0VWpHcVNZVktJUW9jS09NM1BTVTRDUC9GdjhGYWg4K1FDQlRCMWRSeG5GVjE2SWhHT2p0eGlTeGdFSApvSmlncXZmaWZGd2JuTjMyWXd0WHR3SkJBTUI2VWk3cW5ua3dsb3JZS2pSYm4zeWlUWER3cVZRYWpFbkU1L2pZCmkvN0dhTW5jRlNhdUhwcy8rWlJlR2dPR2lnM0dZQlh4em8rZnE3TC9QUklPZGVBPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpQSwMEFAAAAAAAQgdoPmgxUxDWCQAA1gkAAAgAAABjZXJ0LnBlbUNlcnRpZmljYXRlOgogICAgRGF0YToKICAgICAgICBWZXJzaW9uOiAxICgweDApCiAgICAgICAgU2VyaWFsIE51bWJlcjogMjkgKDB4MWQpCiAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KICAgICAgICBJc3N1ZXI6IE89Tk9WQSBST09ULCBMPU1vdW50YWluIFZpZXcsIFNUPUNhbGlmb3JuaWEsIEM9VVMKICAgICAgICBWYWxpZGl0eQogICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXIgIDggMDA6NTg6MDQgMjAxMSBHTVQKICAgICAgICAgICAgTm90IEFmdGVyIDogTWFyICA3IDAwOjU4OjA0IDIwMTIgR01UCiAgICAgICAgU3ViamVjdDogQz1VUywgU1Q9Q2FsaWZvcm5pYSwgTz1BbnNvTGFicywgT1U9Tm92YURldiwgQ049cHJvZHVjdGlvbi1mb29iYXJfdXNlci0yMDExLTAzLTA4VDAwOjU4OjA0WgogICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgogICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgogICAgICAgICAgICAgICAgUHVibGljLUtleTogKDEwMjQgYml0KQogICAgICAgICAgICAgICAgTW9kdWx1czoKICAgICAgICAgICAgICAgICAgICAwMDpjZTo3YzpiNjplNzpiNzpkMjo1YjpmYzpjMjpmMzo1NDo2ZTpiZTowZDoKICAgICAgICAgICAgICAgICAgICBjNjo0NzplMjo1NTo5MjphZjo0Zjo2YjplODo4MTpiMjo3NjoxMjplYzo4MDoKICAgICAgICAgICAgICAgICAgICAwNDo3MTpkYzo0NzpmODo5OTpjNzphZjpmYjo1ZDo2NzozYzpjMTpjNTo2ZToKICAgICAgICAgICAgICAgICAgICA5ZTo3MjplMzpkZTpjMzo1NTo0MzpjOTo3MjpjMzpmZDpmYTo4YTowYTplZjoKICAgICAgICAgICAgICAgICAgICA0MTpiOTpmYTozYTpiZTo3OTo2Nzo5ZDplNDpjZTplODpkODphYjozZTpjZToKICAgICAgICAgICAgICAgICAgICBlNTphNjo1MjpmZTpiYTpmZTowYTo5ZTpjODpmNDoxMDoxMTpkMjplODo1ZToKICAgICAgICAgICAgICAgICAgICBmZDo5ZDpmNTo2YjphZTo0YjoyNjoyZjoyNzo1ZDphZDozZDo4MTpkZToyYzoKICAgICAgICAgICAgICAgICAgICAyMzoyNDowZDpiNjoxODoxNzpkNDoyNDoxZDo4NzpkZTpjMDo1MDozMjoxNjoKICAgICAgICAgICAgICAgICAgICBiODo3ZToyMTpmZTpjZjoxMjpiYzoyYzowNQogICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQogICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KICAgICAgICA5NDplZTpiMzozZDpmZjpmNjo1NzowNjpjZDo0MTo2YTplNjo0MDoxMDoxMDpiNDpjNjo0ZToKICAgICAgICBiMDowNzo3ZTpjNjo2MTpkODpkODo5ZjoxZDo5MDozYzoyNzpiODpiYzo0NjpmOTo3YjozZDoKICAgICAgICBmYjo4YjoyOTowYjoxMjpkOTpjODo1NDpmNzoyMDoxZTowMTpmYjozNzowODo4NzowZjo0ZDoKICAgICAgICA5NzozZTpiNDphZDo5NzpjYTpmYjpkNDpjMzpmNjpkODowYjpkNjo4NTozZDo2Yjo5ZTphNToKICAgICAgICA2NjoyYToyZTowOTo3ZDowNToxNjo4MzozZDoyNDozNDphMzo4MDplYjo4MzozODoyNTo2MToKICAgICAgICA2Mzo2MDoyNzo3Mzo1Yjo0MzpiNzplODowNzo2NDphNzozNTpkMDoyYzpiNzoxMzpkZjo2NDoKICAgICAgICA3ZTplYTpiMTo3YTowMjpkZTpmYzozNjo4Njo2Zjo3Yjo4YTowNjoxNjo0MTozODpmMjoyMDoKICAgICAgICA2YTo5ZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ09qQ0NBYU1DQVIwd0RRWUpLb1pJaHZjTkFRRUVCUUF3VGpFU01CQUdBMVVFQ2hNSlRrOVdRU0JTVDA5VQpNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01STXdFUVlEVlFRSUV3cERZV3hwWm05eWJtbGhNUXN3CkNRWURWUVFHRXdKVlV6QWVGdzB4TVRBek1EZ3dNRFU0TURSYUZ3MHhNakF6TURjd01EVTRNRFJhTUgweEN6QUoKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SRXdEd1lEVlFRS0RBaEJibk52VEdGaQpjekVRTUE0R0ExVUVDd3dIVG05MllVUmxkakUwTURJR0ExVUVBd3dyY0hKdlpIVmpkR2x2YmkxbWIyOWlZWEpmCmRYTmxjaTB5TURFeExUQXpMVEE0VkRBd09qVTRPakEwV2pDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXcKZ1lrQ2dZRUF6bnkyNTdmU1cvekM4MVJ1dmczR1IrSlZrcTlQYStpQnNuWVM3SUFFY2R4SCtKbkhyL3RkWnp6Qgp4VzZlY3VQZXcxVkR5WExEL2ZxS0N1OUJ1Zm82dm5sbm5lVE82TmlyUHM3bHBsTCt1djRLbnNqMEVCSFM2Rjc5Cm5mVnJya3NtTHlkZHJUMkIzaXdqSkEyMkdCZlVKQjJIM3NCUU1oYTRmaUgrenhLOExBVUNBd0VBQVRBTkJna3EKaGtpRzl3MEJBUVFGQUFPQmdRQ1U3ck05Ly9aWEJzMUJhdVpBRUJDMHhrNndCMzdHWWRqWW54MlFQQ2U0dkViNQplejM3aXlrTEV0bklWUGNnSGdIN053aUhEMDJYUHJTdGw4cjcxTVAyMkF2V2hUMXJucVZtS2k0SmZRVVdnejBrCk5LT0E2NE00SldGallDZHpXME8zNkFka3B6WFFMTGNUMzJSKzZyRjZBdDc4Tm9admU0b0dGa0U0OGlCcW5RPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpQSwMEFAAAAAAAQgdoPvjYZrmOBAAAjgQAAA0AAABub3ZhLXZwbi5jb25mIyB2aW06IHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NAoKIyBDb3B5cmlnaHQgMjAxMCBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCiMgQWRtaW5pc3RyYXRvciBvZiB0aGUgTmF0aW9uYWwgQWVyb25hdXRpY3MgYW5kIFNwYWNlIEFkbWluaXN0cmF0aW9uLgojIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQojICAgIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCiMgICAgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKIyAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKIyAgICBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwojICAgIHVuZGVyIHRoZSBMaWNlbnNlLgoKIyBOT1ZBIHVzZXIgY29ubmVjdGlvbgojIEVkaXQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byBwb2ludCB0byB5b3VyIGNlcnQgZmlsZXM6CmNlcnQgY2VydC5wZW0Ka2V5IHBrLnBlbQoKY2EgY2FjZXJ0LnBlbQoKY2xpZW50CmRldiB0YXAKcHJvdG8gdWRwCgpyZW1vdGUgMTAuMS4xNzAuMzIgMTAwMApyZXNvbHYtcmV0cnkgaW5maW5pdGUKbm9iaW5kCgojIERvd25ncmFkZSBwcml2aWxlZ2VzIGFmdGVyIGluaXRpYWxpemF0aW9uIChub24tV2luZG93cyBvbmx5KQp1c2VyIG5vYm9keQpncm91cCBub2dyb3VwCmNvbXAtbHpvCgojIFNldCBsb2cgZmlsZSB2ZXJib3NpdHkuCnZlcmIgMgoKa2VlcGFsaXZlIDEwIDEyMApwaW5nLXRpbWVyLXJlbQpwZXJzaXN0LXR1bgpwZXJzaXN0LWtleQpQSwMEFAAAAAAAQgdoPjP33SUFBAAABQQAAAoAAABjYWNlcnQucGVtLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5ekNDQWpTZ0F3SUJBZ0lKQUsrVm53V2NuNU9CTUEwR0NTcUdTSWIzRFFFQkJBVUFNRTR4RWpBUUJnTlYKQkFvVENVNVBWa0VnVWs5UFZERVdNQlFHQTFVRUJ4TU5UVzkxYm5SaGFXNGdWbWxsZHpFVE1CRUdBMVVFQ0JNSwpRMkZzYVdadmNtNXBZVEVMTUFrR0ExVUVCaE1DVlZNd0hoY05NVEV3TVRJM01qRXdOVEl5V2hjTk1USXdNVEkzCk1qRXdOVEl5V2pCT01SSXdFQVlEVlFRS0V3bE9UMVpCSUZKUFQxUXhGakFVQmdOVkJBY1REVTF2ZFc1MFlXbHUKSUZacFpYY3hFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4Q3pBSkJnTlZCQVlUQWxWVE1JR2ZNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUROSDJVOXRaT05yM2dTNGsrMWtTZDFjMzFmTnRsTTJrWEhGN3RBCmxjQ21SYUxReXUvQnNFR2J5T2t4bWdyK1RrZlZpaXBiaGU1Z0VzWkxCV3piVVB0MDlsb0ZENjltNXNBcU9zbVQKbXQvUU9FZUVFdXNJSWg4UjM0QStEL1pJR3pWeGhGMnRSejhWT0l6bDdzUi9ZcnVnWkxla2Y5L2lVbmE3RzI1bwppT1RjK1FJREFRQUJvNEd3TUlHdE1Bd0dBMVVkRXdRRk1BTUJBZjh3SFFZRFZSME9CQllFRkJDeTkwVWJScTZJCk12SWoyeUc0M0ZGWGZXSWpNSDRHQTFVZEl3UjNNSFdBRkJDeTkwVWJScTZJTXZJajJ5RzQzRkZYZldJam9WS2sKVURCT01SSXdFQVlEVlFRS0V3bE9UMVpCSUZKUFQxUXhGakFVQmdOVkJBY1REVTF2ZFc1MFlXbHVJRlpwWlhjeApFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4Q3pBSkJnTlZCQVlUQWxWVGdna0FyNVdmQlp5Zms0RXdEUVlKCktvWklodmNOQVFFRUJRQURnWUVBcHZGY1REZVZFdGRYc3E2MUpENzBvaithVlBmUjdFT09iYmU5eFhySFFBaU4KVWo4c21qY1RGWXBubHFlNHZoRC9KRFpCdTNFS3JxZkpRd3pnVDMyaWZUK25GVnhqc1I4cm1GandMU3h3NUtCWgpIOUhId1d6Y0lvMXZYZGFoQnROZlZ6bWQvUjdPNzkyY1IwL3lmZXE5Z0FJQTRrdjhHZkVXM1FtencwS0lRMlE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KUEsBAhQDFAAAAAAAQgdoPtimJkLsAwAA7AMAAAYAAAAAAAAAAAAAAIABAAAAAG5vdmFyY1BLAQIUAxQAAAAAAEIHaD54BS1LewMAAHsDAAAGAAAAAAAAAAAAAACAARAEAABway5wZW1QSwECFAMUAAAAAABCB2g+aDFTENYJAADWCQAACAAAAAAAAAAAAAAAgAGvBwAAY2VydC5wZW1QSwECFAMUAAAAAABCB2g++NhmuY4EAACOBAAADQAAAAAAAAAAAAAAgAGrEQAAbm92YS12cG4uY29uZlBLAQIUAxQAAAAAAEIHaD4z990lBQQAAAUEAAAKAAAAAAAAAAAAAACAAWQWAABjYWNlcnQucGVtUEsFBgAAAAAFAAUAEQEAAJEaAAAAAA==</file></GenerateX509ForUserResponse>
28
+ http_version: "1.1"
@@ -0,0 +1,59 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: http://10.1.170.32:8773/services/Admin/?AWSAccessKeyId=1d7a687b-0065-44d6-9611-5bf6c6c72424%3Aproduction&Action=DescribeUser&Name=invalid_username&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=1999-12-31T19%3A59%3A59Z&Version=2010-11-15&Signature=O4Ljcvuo%2BKnDxxWssxqGF36cNu%2B4WFRrI%2FPVD4BmAE4%3D
6
+ body:
7
+ headers:
8
+ accept:
9
+ - application/xml
10
+ connection:
11
+ - keep-alive
12
+ keep-alive:
13
+ - 30
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 400
17
+ message: Bad Request
18
+ headers:
19
+ content-type:
20
+ - text/xml
21
+ content-length:
22
+ - "189"
23
+ date:
24
+ - Mon, 07 Mar 2011 04:52:21 GMT
25
+ connection:
26
+ - keep-alive
27
+ body: |-
28
+ <?xml version="1.0"?>
29
+ <Response><Errors><Error><Code>NotFound</Code><Message>No user for id invalid_username</Message></Error></Errors><RequestID>0R2C84PAWETJ033HJLX2</RequestID></Response>
30
+ http_version: "1.1"
31
+ - !ruby/struct:VCR::HTTPInteraction
32
+ request: !ruby/struct:VCR::Request
33
+ method: :get
34
+ uri: http://10.1.170.32:8773/services/Admin/?AWSAccessKeyId=1d7a687b-0065-44d6-9611-5bf6c6c72424%3Aproduction&Action=DescribeUser&Name=invalid_user_name&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=1999-12-31T19%3A59%3A59Z&Version=2010-11-15&Signature=5K4TfIF6QONc2CZjSsZHsgixj61JYDO4c1B1TndWe9A%3D
35
+ body:
36
+ headers:
37
+ accept:
38
+ - application/xml
39
+ connection:
40
+ - keep-alive
41
+ keep-alive:
42
+ - 30
43
+ response: !ruby/struct:VCR::Response
44
+ status: !ruby/struct:VCR::ResponseStatus
45
+ code: 400
46
+ message: Bad Request
47
+ headers:
48
+ content-type:
49
+ - text/xml
50
+ content-length:
51
+ - "190"
52
+ date:
53
+ - Mon, 07 Mar 2011 23:40:04 GMT
54
+ connection:
55
+ - keep-alive
56
+ body: |-
57
+ <?xml version="1.0"?>
58
+ <Response><Errors><Error><Code>NotFound</Code><Message>No user for id invalid_user_name</Message></Error></Errors><RequestID>N3AL9FC3HF0YCKA5AZLG</RequestID></Response>
59
+ http_version: "1.1"
@@ -37,7 +37,7 @@ describe Nephophobia::Project do
37
37
  end
38
38
 
39
39
  describe "#create" do
40
- it "creates the given 'project_name'" do
40
+ it "creates the given 'user_name' in the specified 'project_name'" do
41
41
  VCR.use_cassette "project_create" do
42
42
  response = @project.create @project_name, @user_name
43
43
 
@@ -80,6 +80,16 @@ describe Nephophobia::Project do
80
80
  end
81
81
  end
82
82
 
83
+ describe "#find with invalid project_name" do
84
+ it "rescues Hugs::Errors::BadRequest" do
85
+ VCR.use_cassette "project_find_with_invalid_username" do
86
+ @response = @project.find "invalid_project_name"
87
+ end
88
+
89
+ @response.must_be_nil
90
+ end
91
+ end
92
+
83
93
  describe "#members" do
84
94
  before { @project_name = "production" }
85
95
 
@@ -87,7 +97,22 @@ describe Nephophobia::Project do
87
97
  VCR.use_cassette "project_members" do
88
98
  response = @project.members @project_name
89
99
 
90
- response.size.must_equal 11
100
+ response.size.must_equal 10
101
+ end
102
+ end
103
+ end
104
+
105
+ describe "#member?" do
106
+ before do
107
+ @user_name = "jdewey"
108
+ @project_name = "production"
109
+ end
110
+
111
+ it "returns true if the given 'user_name' is a member of the specified 'project_name'" do
112
+ VCR.use_cassette "project_members" do
113
+ response = @project.member? @user_name, @project_name
114
+
115
+ response.must_equal true
91
116
  end
92
117
  end
93
118
  end
@@ -0,0 +1,55 @@
1
+ require "test_helper"
2
+
3
+ describe Nephophobia::Role do
4
+ before do
5
+ @role = ADMIN_CLIENT.role
6
+ @user_name = "foobar_user"
7
+ @project_name = "foobar_project"
8
+ end
9
+
10
+ describe "#create" do
11
+ it "adds the default role to the given 'user_name' and 'project_name'" do
12
+ VCR.use_cassette "role_create" do
13
+ response = @role.create @user_name, @project_name
14
+
15
+ response.return.must_equal true
16
+ end
17
+ end
18
+ end
19
+
20
+ describe "#destroy" do
21
+ it "removes the default role to the given 'user_name' and 'project_name'" do
22
+ VCR.use_cassette "role_destroy" do
23
+ response = @role.destroy @user_name, @project_name
24
+
25
+ response.return.must_equal true
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "#all" do
31
+ it "returns all roles for the given 'user_name' and 'project_name'" do
32
+ VCR.use_cassette "role_all" do
33
+ response = @role.all @user_name, @project_name
34
+
35
+ response.size.must_equal 2
36
+ end
37
+ end
38
+
39
+ it "has a 'TypeError: can't convert String into Integer' error" do
40
+ VCR.use_cassette "role_all_with_string_into_int_error" do
41
+ response = @role.all @user_name, @project_name
42
+
43
+ response.size.must_equal 1
44
+ end
45
+ end
46
+
47
+ it "has a 'NoMethodError: undefined method `[]' for nil:NilClass' error" do
48
+ VCR.use_cassette "role_all_with_no_roles" do
49
+ response = @role.all @user_name, @project_name
50
+
51
+ response.must_be_nil
52
+ end
53
+ end
54
+ end
55
+ end
@@ -2,19 +2,8 @@ require "test_helper"
2
2
 
3
3
  describe Nephophobia::User do
4
4
  before do
5
- @user = ADMIN_CLIENT.user
6
- @user_name = "foobar_user"
7
- @project_name = "foobar_project"
8
- end
9
-
10
- describe "#add_role" do
11
- it "adds the default role to the given 'user_name'" do
12
- VCR.use_cassette "user_add_role" do
13
- response = @user.add_role @user_name, @project_name
14
-
15
- response.return.must_equal true
16
- end
17
- end
5
+ @user = ADMIN_CLIENT.user
6
+ @user_name = "foobar_user"
18
7
  end
19
8
 
20
9
  describe "#create" do
@@ -27,6 +16,18 @@ describe Nephophobia::User do
27
16
  end
28
17
  end
29
18
 
19
+ describe "#credentials" do
20
+ before { @project_name = "production" }
21
+
22
+ it "returns the credentials for a given 'user_name' for the specified 'project_name'." do
23
+ VCR.use_cassette "user_credentials" do
24
+ response = @user.credentials @user_name, @project_name
25
+
26
+ response.must_match %r{BEGIN CERTIFICATE}
27
+ end
28
+ end
29
+ end
30
+
30
31
  describe "#destroy" do
31
32
  it "destroys the given 'user_name'" do
32
33
  VCR.use_cassette "user_destroy" do
@@ -59,13 +60,13 @@ describe Nephophobia::User do
59
60
  end
60
61
  end
61
62
 
62
- describe "#remove_role" do
63
- it "removes the default role to the given 'user_name'" do
64
- VCR.use_cassette "user_remove_role" do
65
- response = @user.remove_role @user_name, @project_name
66
-
67
- response.return.must_equal true
63
+ describe "#find with invalid user_name" do
64
+ it "rescues Hugs::Errors::BadRequest" do
65
+ VCR.use_cassette "user_find_with_invalid_user_name" do
66
+ @response = @user.find "invalid_user_name"
68
67
  end
68
+
69
+ @response.must_be_nil
69
70
  end
70
71
  end
71
72
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: nephophobia
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - John Dewey
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-03-06 00:00:00 -08:00
14
+ date: 2011-03-08 00:00:00 -08:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -140,18 +140,25 @@ files:
140
140
  - test/fixtures/cassettes/project_create.yml
141
141
  - test/fixtures/cassettes/project_destroy.yml
142
142
  - test/fixtures/cassettes/project_find.yml
143
+ - test/fixtures/cassettes/project_find_with_invalid_username.yml
143
144
  - test/fixtures/cassettes/project_members.yml
144
145
  - test/fixtures/cassettes/project_remove_member.yml
145
- - test/fixtures/cassettes/user_add_role.yml
146
+ - test/fixtures/cassettes/role_all.yml
147
+ - test/fixtures/cassettes/role_all_with_no_roles.yml
148
+ - test/fixtures/cassettes/role_all_with_string_into_int_error.yml
149
+ - test/fixtures/cassettes/role_create.yml
150
+ - test/fixtures/cassettes/role_destroy.yml
146
151
  - test/fixtures/cassettes/user_create.yml
152
+ - test/fixtures/cassettes/user_credentials.yml
147
153
  - test/fixtures/cassettes/user_destroy.yml
148
154
  - test/fixtures/cassettes/user_find.yml
149
- - test/fixtures/cassettes/user_remove_role.yml
155
+ - test/fixtures/cassettes/user_find_with_invalid_user_name.yml
150
156
  - test/lib/aws_test.rb
151
157
  - test/lib/hashify_test.rb
152
158
  - test/lib/nephophobia/compute_test.rb
153
159
  - test/lib/nephophobia/image_test.rb
154
160
  - test/lib/nephophobia/project_test.rb
161
+ - test/lib/nephophobia/role_test.rb
155
162
  - test/lib/nephophobia/user_test.rb
156
163
  - test/lib/nephophobia_test.rb
157
164
  - test/test_helper.rb
@@ -204,18 +211,25 @@ test_files:
204
211
  - test/fixtures/cassettes/project_create.yml
205
212
  - test/fixtures/cassettes/project_destroy.yml
206
213
  - test/fixtures/cassettes/project_find.yml
214
+ - test/fixtures/cassettes/project_find_with_invalid_username.yml
207
215
  - test/fixtures/cassettes/project_members.yml
208
216
  - test/fixtures/cassettes/project_remove_member.yml
209
- - test/fixtures/cassettes/user_add_role.yml
217
+ - test/fixtures/cassettes/role_all.yml
218
+ - test/fixtures/cassettes/role_all_with_no_roles.yml
219
+ - test/fixtures/cassettes/role_all_with_string_into_int_error.yml
220
+ - test/fixtures/cassettes/role_create.yml
221
+ - test/fixtures/cassettes/role_destroy.yml
210
222
  - test/fixtures/cassettes/user_create.yml
223
+ - test/fixtures/cassettes/user_credentials.yml
211
224
  - test/fixtures/cassettes/user_destroy.yml
212
225
  - test/fixtures/cassettes/user_find.yml
213
- - test/fixtures/cassettes/user_remove_role.yml
226
+ - test/fixtures/cassettes/user_find_with_invalid_user_name.yml
214
227
  - test/lib/aws_test.rb
215
228
  - test/lib/hashify_test.rb
216
229
  - test/lib/nephophobia/compute_test.rb
217
230
  - test/lib/nephophobia/image_test.rb
218
231
  - test/lib/nephophobia/project_test.rb
232
+ - test/lib/nephophobia/role_test.rb
219
233
  - test/lib/nephophobia/user_test.rb
220
234
  - test/lib/nephophobia_test.rb
221
235
  - test/test_helper.rb