nephophobia 0.0.2 → 0.0.3

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/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