nephophobia 0.3.0 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/lib/nephophobia.rb +26 -37
  2. data/lib/nephophobia/client.rb +6 -6
  3. data/lib/nephophobia/resource/compute.rb +209 -0
  4. data/lib/nephophobia/resource/credential.rb +68 -0
  5. data/lib/nephophobia/resource/image.rb +65 -0
  6. data/lib/nephophobia/resource/project.rb +132 -0
  7. data/lib/nephophobia/resource/role.rb +72 -0
  8. data/lib/nephophobia/resource/user.rb +83 -0
  9. data/lib/nephophobia/response/address.rb +13 -0
  10. data/lib/nephophobia/response/compute.rb +34 -0
  11. data/lib/nephophobia/response/credential.rb +17 -0
  12. data/lib/nephophobia/response/image.rb +24 -0
  13. data/lib/nephophobia/response/member.rb +15 -0
  14. data/lib/nephophobia/response/project.rb +18 -0
  15. data/lib/nephophobia/response/return.rb +16 -0
  16. data/lib/nephophobia/response/role.rb +15 -0
  17. data/lib/nephophobia/response/user.rb +17 -0
  18. data/lib/nephophobia/response/vnc.rb +11 -0
  19. data/lib/nephophobia/util.rb +12 -0
  20. data/lib/nephophobia/version.rb +1 -1
  21. data/nephophobia.gemspec +2 -2
  22. data/test/cassettes/compute_describe_addresses.yml +244 -0
  23. data/test/cassettes/compute_find.yml +30 -18
  24. data/test/cassettes/credential_import.yml +82 -0
  25. data/test/cassettes/role_all_no_params.yml +82 -0
  26. data/test/cassettes/role_modify_role.yml +190 -0
  27. data/test/dummy.pub +1 -0
  28. data/test/lib/nephophobia/{compute_test.rb → response/compute_test.rb} +39 -4
  29. data/test/lib/nephophobia/{credential_test.rb → response/credential_test.rb} +28 -1
  30. data/test/lib/nephophobia/{image_test.rb → response/image_test.rb} +1 -1
  31. data/test/lib/nephophobia/{project_test.rb → response/project_test.rb} +1 -1
  32. data/test/lib/nephophobia/{role_test.rb → response/role_test.rb} +57 -4
  33. data/test/lib/nephophobia/{user_test.rb → response/user_test.rb} +1 -1
  34. data/test/lib/{nephophobia_test.rb → nephophobia/util_test.rb} +3 -3
  35. data/test/test_helper.rb +7 -0
  36. metadata +45 -24
  37. data/lib/nephophobia/compute.rb +0 -243
  38. data/lib/nephophobia/credential.rb +0 -65
  39. data/lib/nephophobia/image.rb +0 -84
  40. data/lib/nephophobia/project.rb +0 -157
  41. data/lib/nephophobia/role.rb +0 -83
  42. data/lib/nephophobia/user.rb +0 -95
@@ -2,52 +2,41 @@ require "aws"
2
2
  require "hashify"
3
3
  require "date"
4
4
  require "nephophobia/client"
5
- require "nephophobia/compute"
6
- require "nephophobia/credential"
7
- require "nephophobia/image"
8
- require "nephophobia/project"
9
- require "nephophobia/role"
10
- require "nephophobia/user"
5
+ require "nephophobia/util"
6
+ require "nephophobia/response/address"
7
+ require "nephophobia/response/compute"
8
+ require "nephophobia/response/credential"
9
+ require "nephophobia/response/image"
10
+ require "nephophobia/response/member"
11
+ require "nephophobia/response/project"
12
+ require "nephophobia/response/return"
13
+ require "nephophobia/response/role"
14
+ require "nephophobia/response/user"
15
+ require "nephophobia/response/vnc"
16
+ require "nephophobia/resource/compute"
17
+ require "nephophobia/resource/credential"
18
+ require "nephophobia/resource/image"
19
+ require "nephophobia/resource/project"
20
+ require "nephophobia/resource/role"
21
+ require "nephophobia/resource/user"
11
22
 
12
23
  require "hugs"
13
24
 
14
- module Nephophobia
15
- class ResponseData
16
- attr_reader :return, :request_id
17
-
18
- attr_accessor :attributes
19
-
20
- def initialize attributes
21
- @attributes = attributes
22
-
23
- @request_id = attributes["requestId"]
24
- @return = attributes["return"] == "true"
25
- end
26
- end
27
-
28
- ##
29
- # Wraps a Hash with an Array.
30
- #
31
- # +obj+: The Object to be tested for wrapping.
32
-
33
- def self.coerce obj
34
- (obj.is_a? Hash) ? [obj] : obj
35
- end
36
- end
37
-
38
25
  ##
39
26
  # Allow Data Classes to comply with ActiveModel.
40
27
 
41
28
  module Nephophobia
42
29
  class Rails
43
30
  CLASSES = [
44
- ::Nephophobia::ComputeData,
45
- ::Nephophobia::CredentialData,
46
- ::Nephophobia::ImageData,
47
- ::Nephophobia::MemberData,
48
- ::Nephophobia::ProjectData,
49
- ::Nephophobia::RoleData,
50
- ::Nephophobia::UserData
31
+ ::Nephophobia::Response::Address,
32
+ ::Nephophobia::Response::Compute,
33
+ ::Nephophobia::Response::Credential,
34
+ ::Nephophobia::Response::Image,
35
+ ::Nephophobia::Response::Member,
36
+ ::Nephophobia::Response::Project,
37
+ ::Nephophobia::Response::Role,
38
+ ::Nephophobia::Response::User,
39
+ ::Nephophobia::Response::Vnc
51
40
  ].freeze
52
41
 
53
42
  def self.insert
@@ -59,7 +59,7 @@ module Nephophobia
59
59
 
60
60
  def compute
61
61
  @path = "/services/Cloud"
62
- @compute ||= Nephophobia::Compute.new self
62
+ @compute ||= Nephophobia::Resource::Compute.new self
63
63
  end
64
64
 
65
65
  ##
@@ -67,7 +67,7 @@ module Nephophobia
67
67
 
68
68
  def credential
69
69
  @path = "/services/Cloud"
70
- @credential ||= Nephophobia::Credential.new self
70
+ @credential ||= Nephophobia::Resource::Credential.new self
71
71
  end
72
72
 
73
73
  ##
@@ -75,7 +75,7 @@ module Nephophobia
75
75
 
76
76
  def image
77
77
  @path = "/services/Cloud"
78
- @image ||= Nephophobia::Image.new self
78
+ @image ||= Nephophobia::Resource::Image.new self
79
79
  end
80
80
 
81
81
  ##
@@ -83,7 +83,7 @@ module Nephophobia
83
83
 
84
84
  def project
85
85
  @path = "/services/Admin"
86
- @project ||= Nephophobia::Project.new self
86
+ @project ||= Nephophobia::Resource::Project.new self
87
87
  end
88
88
 
89
89
  ##
@@ -91,7 +91,7 @@ module Nephophobia
91
91
 
92
92
  def user
93
93
  @path = "/services/Admin"
94
- @user ||= Nephophobia::User.new self
94
+ @user ||= Nephophobia::Resource::User.new self
95
95
  end
96
96
 
97
97
  ##
@@ -99,7 +99,7 @@ module Nephophobia
99
99
 
100
100
  def role
101
101
  @path = "/services/Admin"
102
- @role ||= Nephophobia::Role.new self
102
+ @role ||= Nephophobia::Resource::Role.new self
103
103
  end
104
104
  end
105
105
  end
@@ -0,0 +1,209 @@
1
+ module Nephophobia
2
+ module Resource
3
+ class Compute
4
+ def initialize client
5
+ @client = client
6
+ end
7
+
8
+ ##
9
+ # Returns information about instances that +@client+ owns.
10
+ #
11
+ # +filter+: An optional Hash, intended for filtering.
12
+ # See the API Reference for further details.
13
+ # {
14
+ # "Filter.1.Name" => "instance-type",
15
+ # "Filter.1.Value.1" => "m1.small"
16
+ # }
17
+
18
+ def all filter = {}
19
+ response = @client.action "DescribeInstances", filter
20
+
21
+ item = response.body['DescribeInstancesResponse']['reservationSet']['item']
22
+ Nephophobia::Util.coerce(item).collect do |data|
23
+ Response::Compute.new data
24
+ end
25
+ end
26
+
27
+ ##
28
+ # Create a compute instance with the given 'image_id'.
29
+ # Returns information about the new instance.
30
+ #
31
+ # +image_id+: A String representing the ID of the image.
32
+ # +params+: An optional Hash.
33
+ # See the API Reference for further details.
34
+ # {
35
+ # "DisplayName" => "testserver1",
36
+ # "DisplayDescription" => "test description"
37
+ # }
38
+
39
+ def create image_id, params = {}
40
+ response = @client.action "RunInstances", { "ImageId" => image_id }.merge(params)
41
+
42
+ Response::Compute.new response.body['RunInstancesResponse']
43
+ end
44
+
45
+ ##
46
+ # Removes the given 'instance_id'.
47
+ # Returns instances response to a state change.
48
+ #
49
+ # +instance_id+: A String representing the ID of the instance.
50
+
51
+ def destroy instance_id
52
+ params = {
53
+ "InstanceId.1" => instance_id
54
+ }
55
+
56
+ response = @client.action "TerminateInstances", params
57
+
58
+ Response::Return.new response.body['TerminateInstancesResponse']
59
+ end
60
+
61
+ ##
62
+ # Returns information about the given 'instance_id'.
63
+ #
64
+ # +instance_id+: A String representing the ID of the instance.
65
+
66
+ def find instance_id
67
+ params = {
68
+ "InstanceId.1" => instance_id
69
+ }
70
+
71
+ response = @client.action "DescribeInstances", params
72
+
73
+ Response::Compute.new response.body['DescribeInstancesResponse']['reservationSet']['item']
74
+ end
75
+
76
+ ##
77
+ # Reboot the given 'instance_id'.
78
+ # Returns instances response to a state change.
79
+ #
80
+ # +instance_id+: A String representing the ID of the instance.
81
+
82
+ def reboot instance_id
83
+ params = {
84
+ "InstanceId.1" => instance_id
85
+ }
86
+
87
+ response = @client.action "RebootInstances", params
88
+
89
+ Response::Return.new response.body['RebootInstancesResponse']
90
+ end
91
+
92
+ ##
93
+ # Starts the given 'instance_id'.
94
+ # Returns instances current and previous state.
95
+ #
96
+ # +instance_id+: A String representing the ID of the instance.
97
+
98
+ def start instance_id
99
+ params = {
100
+ "InstanceId.1" => instance_id
101
+ }
102
+
103
+ response = @client.action "StopInstances", params
104
+
105
+ Response::Return.new response.body
106
+ end
107
+
108
+ ##
109
+ # Stops the given 'instance_id'
110
+ # Returns instances current and previous state.
111
+ #
112
+ # +instance_id+: A String representing the ID of the instance.
113
+
114
+ def stop instance_id
115
+ params = {
116
+ "InstanceId.1" => instance_id
117
+ }
118
+
119
+ response = @client.action "StartInstances", params
120
+
121
+ Response::Return.new response.body
122
+ end
123
+
124
+ ##
125
+ # Returns the VNC browser URL. Used by the Portal.
126
+ # __Must__ execute as a user with the +admin+ role.
127
+ #
128
+ # +instance_id+: A String representing the ID of the instance.
129
+
130
+ def vnc_url instance_id
131
+ params = {
132
+ "InstanceId" => instance_id
133
+ }
134
+
135
+ response = @client.action "GetVncConsole", params
136
+
137
+ Response::Vnc.new response.body['GetVncConsoleResponse']
138
+ end
139
+
140
+ ##
141
+ # Acquires an elastic IP address.
142
+ # Returns an elastic IP.
143
+
144
+ def allocate_address
145
+ response = @client.action "AllocateAddress", {}
146
+
147
+ Response::Address.new response.body['AllocateAddressResponse']
148
+ end
149
+
150
+ ##
151
+ # Releases an elastic IP address.
152
+ #
153
+ # +floating_ip+: A String representing a floating IP address.
154
+
155
+ def release_address floating_ip
156
+ params = {
157
+ "PublicIp" => floating_ip
158
+ }
159
+
160
+ response = @client.action "ReleaseAddress", params
161
+
162
+ Response::Address.new response.body['ReleaseAddressResponse']['releaseResponse']
163
+ end
164
+
165
+ ##
166
+ # Associates an elastic IP address with an instance.
167
+ #
168
+ # +instance_id+: A String representing the ID of the instance.
169
+ # +floating_ip+: A String representing a floating IP address.
170
+
171
+ def associate_address instance_id, floating_ip
172
+ params = {
173
+ "InstanceId" => instance_id,
174
+ "PublicIp" => floating_ip
175
+ }
176
+
177
+ response = @client.action "AssociateAddress", params
178
+
179
+ Response::Address.new response.body['AssociateAddressResponse']['associateResponse']
180
+ end
181
+
182
+ ##
183
+ # Disassociates the specified elastic IP address from the instance
184
+ # to which it is assigned.
185
+ #
186
+ # +instance_id+: A String representing the ID of the instance.
187
+ # +floating_ip+: A String representing a floating IP address.
188
+
189
+ def disassociate_address floating_ip
190
+ params = {
191
+ "PublicIp" => floating_ip
192
+ }
193
+
194
+ response = @client.action "DisassociateAddress", params
195
+
196
+ Response::Address.new response.body['DisassociateAddressResponse']['disassociateResponse']
197
+ end
198
+
199
+ def describe_addresses
200
+ response = @client.action "DescribeAddresses", {}
201
+
202
+ item = response.body['DescribeAddressesResponse']['addressesSet']['item']
203
+ Nephophobia::Util.coerce(item).collect do |data|
204
+ Response::Address.new data
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end
@@ -0,0 +1,68 @@
1
+ module Nephophobia
2
+ module Resource
3
+ class Credential
4
+ def initialize client
5
+ @client = client
6
+ end
7
+
8
+ ##
9
+ # Returns information about key pairs that +@client+ owns.
10
+
11
+ def all
12
+ response = @client.action "DescribeKeyPairs", {}
13
+
14
+ key_set = response.body['DescribeKeyPairsResponse']['keySet']
15
+ key_set && Nephophobia::Util.coerce(key_set['item']).collect do |data|
16
+ Response::Credential.new data
17
+ end
18
+ end
19
+
20
+ ##
21
+ # Create a key pair with the given 'key_name'.
22
+ # Returns information about the new key.
23
+ #
24
+ # +key_name+: A String containing a unique name for the key pair.
25
+
26
+ def create key_name
27
+ params = {
28
+ "KeyName" => key_name
29
+ }
30
+
31
+ response = @client.action "CreateKeyPair", params
32
+
33
+ Response::Credential.new response.body['CreateKeyPairResponse']
34
+ end
35
+
36
+ ##
37
+ # Import a key pair
38
+
39
+ def import_public_key key_name, pubkey, fprint=nil
40
+ params = {
41
+ 'KeyName' => key_name,
42
+ 'PublicKey' => pubkey
43
+ }
44
+ params.merge!( 'Fingerprint' => fprint ) unless fprint.nil?
45
+
46
+ response = @client.action "ImportPublicKey", params
47
+
48
+ Response::Credential.new response.body["ImportPublicKeyResponse"]['return']
49
+ end
50
+
51
+ ##
52
+ # Deletes the key pair for the given 'key_name'.
53
+ # Returns a response to the state change.
54
+ #
55
+ # +key_name+: A String containing a unique name for the key pair.
56
+
57
+ def destroy key_name
58
+ params = {
59
+ "KeyName" => key_name
60
+ }
61
+
62
+ response = @client.action "DeleteKeyPair", params
63
+
64
+ Response::Return.new response.body['DeleteKeyPairResponse']
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,65 @@
1
+ module Nephophobia
2
+ module Resource
3
+ class Image
4
+ def initialize client
5
+ @client = client
6
+ end
7
+
8
+ ##
9
+ # Returns information about AMIs, AKIs, and ARIs. Images returned include
10
+ # public images, private images that +@client+ owns, and private images
11
+ # owned by other AWS accounts but for which +@client+ has explicit launch
12
+ # permissions.
13
+ #
14
+ # +filter+: An optional Hash, intended for filtering.
15
+ # See the API Reference for further details.
16
+ # {
17
+ # "Filter.1.Name" => "instance-type",
18
+ # "Filter.1.Value.1" => "m1.small",
19
+ # "ExecutableBy.1" => "self",
20
+ # }
21
+
22
+ def all filter = {}
23
+ response = @client.action "DescribeImages", filter
24
+
25
+ item = response.body['DescribeImagesResponse']['imagesSet']['item'].collect do |data|
26
+ Response::Image.new data
27
+ end
28
+ end
29
+
30
+ ##
31
+ # Returns information about the given 'image_id'.
32
+ #
33
+ # +image_id+: A String representing the ID of the image.
34
+
35
+ def find image_id
36
+ params = {
37
+ "ImageId.1" => image_id
38
+ }
39
+
40
+ response = @client.action "DescribeImages", params
41
+
42
+ Response::Image.new response.body['DescribeImagesResponse']['imagesSet']['item']
43
+ end
44
+
45
+ ##
46
+ # Return information about all public images.
47
+
48
+ def runnable
49
+ all.select do |image|
50
+ runnable? image
51
+ end
52
+ end
53
+
54
+ private
55
+ ##
56
+ # Images which do not have a valid kernel_id are not runnable.
57
+
58
+ def runnable? image
59
+ image.is_public == "true" &&
60
+ image.kernel_id != "true" &&
61
+ image.image_type == "machine"
62
+ end
63
+ end
64
+ end
65
+ end