fog 0.3.7 → 0.3.8

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 (201) hide show
  1. data/Gemfile.lock +6 -6
  2. data/README.rdoc +7 -1
  3. data/bin/fog +4 -3
  4. data/fog.gemspec +39 -24
  5. data/lib/fog.rb +4 -12
  6. data/lib/fog/aws.rb +14 -5
  7. data/lib/fog/aws/compute.rb +26 -9
  8. data/lib/fog/aws/elb.rb +3 -2
  9. data/lib/fog/aws/models/compute/address.rb +2 -1
  10. data/lib/fog/aws/models/compute/addresses.rb +11 -9
  11. data/lib/fog/aws/models/compute/flavor.rb +1 -1
  12. data/lib/fog/aws/models/compute/flavors.rb +13 -11
  13. data/lib/fog/aws/models/compute/image.rb +2 -1
  14. data/lib/fog/aws/models/compute/images.rb +7 -9
  15. data/lib/fog/aws/models/compute/key_pair.rb +1 -1
  16. data/lib/fog/aws/models/compute/key_pairs.rb +10 -8
  17. data/lib/fog/aws/models/compute/security_group.rb +1 -1
  18. data/lib/fog/aws/models/compute/security_groups.rb +11 -9
  19. data/lib/fog/aws/models/compute/server.rb +10 -3
  20. data/lib/fog/aws/models/compute/servers.rb +14 -8
  21. data/lib/fog/aws/models/compute/snapshot.rb +3 -2
  22. data/lib/fog/aws/models/compute/snapshots.rb +11 -16
  23. data/lib/fog/aws/models/compute/tag.rb +36 -0
  24. data/lib/fog/aws/models/compute/tags.rb +34 -0
  25. data/lib/fog/aws/models/compute/volume.rb +11 -10
  26. data/lib/fog/aws/models/compute/volumes.rb +11 -9
  27. data/lib/fog/aws/models/storage/directories.rb +1 -1
  28. data/lib/fog/aws/models/storage/directory.rb +1 -1
  29. data/lib/fog/aws/models/storage/file.rb +3 -2
  30. data/lib/fog/aws/models/storage/files.rb +1 -7
  31. data/lib/fog/aws/parsers/compute/describe_availability_zones.rb +4 -2
  32. data/lib/fog/aws/parsers/compute/describe_images.rb +23 -13
  33. data/lib/fog/aws/parsers/compute/describe_instances.rb +34 -8
  34. data/lib/fog/aws/parsers/compute/describe_security_groups.rb +4 -3
  35. data/lib/fog/aws/parsers/compute/describe_snapshots.rb +33 -13
  36. data/lib/fog/aws/parsers/compute/describe_tags.rb +30 -0
  37. data/lib/fog/aws/parsers/compute/describe_volumes.rb +17 -3
  38. data/lib/fog/aws/parsers/compute/run_instances.rb +4 -4
  39. data/lib/fog/aws/parsers/storage/get_bucket.rb +1 -1
  40. data/lib/fog/aws/parsers/storage/get_bucket_logging.rb +1 -1
  41. data/lib/fog/aws/parsers/storage/get_bucket_object_versions.rb +3 -3
  42. data/lib/fog/aws/requests/compute/create_snapshot.rb +1 -0
  43. data/lib/fog/aws/requests/compute/create_tags.rb +78 -0
  44. data/lib/fog/aws/requests/compute/delete_tags.rb +45 -0
  45. data/lib/fog/aws/requests/compute/describe_addresses.rb +27 -19
  46. data/lib/fog/aws/requests/compute/describe_availability_zones.rb +31 -25
  47. data/lib/fog/aws/requests/compute/describe_images.rb +11 -18
  48. data/lib/fog/aws/requests/compute/describe_instances.rb +125 -53
  49. data/lib/fog/aws/requests/compute/describe_key_pairs.rb +29 -21
  50. data/lib/fog/aws/requests/compute/describe_regions.rb +28 -23
  51. data/lib/fog/aws/requests/compute/describe_reserved_instances.rb +8 -4
  52. data/lib/fog/aws/requests/compute/describe_security_groups.rb +48 -19
  53. data/lib/fog/aws/requests/compute/describe_snapshots.rb +72 -35
  54. data/lib/fog/aws/requests/compute/describe_tags.rb +42 -0
  55. data/lib/fog/aws/requests/compute/describe_volumes.rb +67 -36
  56. data/lib/fog/aws/requests/compute/run_instances.rb +10 -3
  57. data/lib/fog/aws/simpledb.rb +3 -1
  58. data/lib/fog/aws/storage.rb +17 -8
  59. data/lib/fog/bluebox/models/compute/flavor.rb +1 -1
  60. data/lib/fog/bluebox/models/compute/flavors.rb +1 -1
  61. data/lib/fog/bluebox/models/compute/image.rb +1 -1
  62. data/lib/fog/bluebox/models/compute/images.rb +1 -1
  63. data/lib/fog/bluebox/models/compute/server.rb +8 -6
  64. data/lib/fog/bluebox/models/compute/servers.rb +1 -1
  65. data/lib/fog/bluebox/requests/compute/get_blocks.rb +1 -1
  66. data/lib/fog/core.rb +11 -0
  67. data/lib/fog/{attributes.rb → core/attributes.rb} +0 -0
  68. data/lib/fog/{bin.rb → core/bin.rb} +1 -1
  69. data/lib/fog/{collection.rb → core/collection.rb} +4 -0
  70. data/lib/fog/{connection.rb → core/connection.rb} +0 -0
  71. data/lib/fog/{credentials.rb → core/credentials.rb} +2 -0
  72. data/lib/fog/{deprecation.rb → core/deprecation.rb} +0 -0
  73. data/lib/fog/{errors.rb → core/errors.rb} +0 -0
  74. data/lib/fog/{hmac.rb → core/hmac.rb} +0 -0
  75. data/lib/fog/{model.rb → core/model.rb} +0 -0
  76. data/lib/fog/{parser.rb → core/parser.rb} +0 -0
  77. data/lib/fog/{provider.rb → core/provider.rb} +0 -0
  78. data/lib/fog/{service.rb → core/service.rb} +1 -0
  79. data/lib/fog/{ssh.rb → core/ssh.rb} +7 -7
  80. data/lib/fog/go_grid.rb +1 -1
  81. data/lib/fog/go_grid/compute.rb +6 -1
  82. data/lib/fog/go_grid/models/compute/image.rb +60 -0
  83. data/lib/fog/go_grid/models/compute/images.rb +33 -0
  84. data/lib/fog/go_grid/models/compute/server.rb +56 -0
  85. data/lib/fog/go_grid/models/compute/servers.rb +35 -0
  86. data/lib/fog/go_grid/requests/compute/grid_image_get.rb +41 -0
  87. data/lib/fog/go_grid/requests/compute/grid_image_list.rb +6 -1
  88. data/lib/fog/go_grid/requests/compute/grid_server_power.rb +2 -2
  89. data/lib/fog/google/models/storage/directories.rb +1 -1
  90. data/lib/fog/google/models/storage/directory.rb +1 -1
  91. data/lib/fog/google/models/storage/file.rb +3 -2
  92. data/lib/fog/google/models/storage/files.rb +1 -7
  93. data/lib/fog/google/parsers/storage/get_bucket.rb +1 -1
  94. data/lib/fog/linode/requests/compute/avail_linodeplans.rb +2 -2
  95. data/lib/fog/local/models/storage/directories.rb +1 -1
  96. data/lib/fog/local/models/storage/directory.rb +1 -1
  97. data/lib/fog/local/models/storage/file.rb +2 -2
  98. data/lib/fog/local/models/storage/files.rb +2 -5
  99. data/lib/fog/local/storage.rb +1 -1
  100. data/lib/fog/new_servers/compute.rb +1 -1
  101. data/lib/fog/rackspace/models/compute/flavor.rb +1 -3
  102. data/lib/fog/rackspace/models/compute/flavors.rb +1 -1
  103. data/lib/fog/rackspace/models/compute/image.rb +2 -1
  104. data/lib/fog/rackspace/models/compute/images.rb +1 -1
  105. data/lib/fog/rackspace/models/compute/server.rb +12 -11
  106. data/lib/fog/rackspace/models/compute/servers.rb +1 -1
  107. data/lib/fog/rackspace/models/storage/directories.rb +1 -1
  108. data/lib/fog/rackspace/models/storage/directory.rb +1 -1
  109. data/lib/fog/rackspace/models/storage/file.rb +4 -4
  110. data/lib/fog/rackspace/models/storage/files.rb +1 -1
  111. data/lib/fog/rackspace/requests/compute/create_image.rb +2 -2
  112. data/lib/fog/rackspace/requests/compute/delete_image.rb +1 -1
  113. data/lib/fog/rackspace/requests/compute/delete_server.rb +1 -1
  114. data/lib/fog/rackspace/requests/compute/get_server_details.rb +1 -1
  115. data/lib/fog/rackspace/requests/compute/list_addresses.rb +1 -1
  116. data/lib/fog/rackspace/requests/compute/list_images_detail.rb +2 -2
  117. data/lib/fog/rackspace/requests/compute/list_private_addresses.rb +1 -1
  118. data/lib/fog/rackspace/requests/compute/list_public_addresses.rb +1 -1
  119. data/lib/fog/rackspace/requests/compute/update_server.rb +1 -1
  120. data/lib/fog/rackspace/requests/storage/put_object.rb +4 -3
  121. data/lib/fog/slicehost/models/compute/flavor.rb +1 -1
  122. data/lib/fog/slicehost/models/compute/flavors.rb +1 -1
  123. data/lib/fog/slicehost/models/compute/image.rb +1 -1
  124. data/lib/fog/slicehost/models/compute/images.rb +1 -1
  125. data/lib/fog/slicehost/models/compute/server.rb +3 -1
  126. data/lib/fog/slicehost/models/compute/servers.rb +1 -1
  127. data/lib/fog/terremark/ecloud.rb +34 -33
  128. data/lib/fog/terremark/models/shared/address.rb +1 -1
  129. data/lib/fog/terremark/models/shared/network.rb +1 -1
  130. data/lib/fog/terremark/models/shared/server.rb +1 -1
  131. data/lib/fog/terremark/models/shared/servers.rb +1 -1
  132. data/lib/fog/terremark/models/shared/task.rb +1 -1
  133. data/lib/fog/terremark/models/shared/tasks.rb +1 -1
  134. data/lib/fog/terremark/models/shared/vdc.rb +1 -1
  135. data/lib/fog/terremark/parser.rb +1 -0
  136. data/lib/fog/terremark/vcloud.rb +4 -4
  137. data/lib/fog/vcloud.rb +15 -7
  138. data/lib/fog/vcloud/terremark/ecloud.rb +15 -3
  139. data/lib/fog/vcloud/terremark/ecloud/models/firewall_acls.rb +1 -1
  140. data/lib/fog/vcloud/terremark/ecloud/models/internet_services.rb +1 -1
  141. data/lib/fog/vcloud/terremark/ecloud/models/ips.rb +1 -1
  142. data/lib/fog/vcloud/terremark/ecloud/models/networks.rb +1 -1
  143. data/lib/fog/vcloud/terremark/ecloud/models/nodes.rb +1 -1
  144. data/lib/fog/vcloud/terremark/ecloud/models/public_ips.rb +1 -1
  145. data/lib/fog/vcloud/terremark/ecloud/models/servers.rb +1 -1
  146. data/lib/fog/vcloud/terremark/ecloud/models/tasks.rb +1 -1
  147. data/lib/fog/vcloud/terremark/ecloud/models/vdcs.rb +1 -1
  148. data/lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb +55 -49
  149. data/lib/fog/vcloud/terremark/ecloud/requests/add_node.rb +19 -15
  150. data/lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb +8 -1
  151. data/lib/fog/vcloud/terremark/ecloud/requests/configure_node.rb +17 -12
  152. data/lib/fog/vcloud/terremark/ecloud/requests/get_catalog.rb +29 -1
  153. data/lib/fog/vcloud/terremark/ecloud/requests/get_catalog_item.rb +38 -2
  154. data/lib/fog/vcloud/terremark/ecloud/requests/get_customization_options.rb +8 -2
  155. data/lib/fog/vcloud/terremark/ecloud/requests/instantiate_vapp_template.rb +46 -4
  156. data/spec/aws/models/compute/server_spec.rb +2 -0
  157. data/spec/aws/requests/simpledb/select_spec.rb +1 -0
  158. data/spec/spec_helper.rb +1 -1
  159. data/spec/vcloud/spec_helper.rb +1 -1
  160. data/spec/vcloud/terremark/ecloud/requests/get_catalog_item_spec.rb +62 -0
  161. data/spec/vcloud/terremark/ecloud/requests/get_catalog_spec.rb +44 -0
  162. data/spec/vcloud/terremark/ecloud/requests/get_customization_options_spec.rb +39 -0
  163. data/spec/vcloud/terremark/ecloud/requests/instantiate_vapp_template_spec.rb +73 -0
  164. data/tests/aws/requests/compute/address_tests.rb +2 -6
  165. data/tests/aws/requests/compute/availability_zone_tests.rb +3 -10
  166. data/tests/aws/requests/compute/image_tests.rb +4 -9
  167. data/tests/aws/requests/compute/instance_tests.rb +7 -8
  168. data/tests/aws/requests/compute/key_pair_tests.rb +2 -6
  169. data/tests/aws/requests/compute/region_tests.rb +2 -9
  170. data/tests/aws/requests/compute/security_group_tests.rb +3 -7
  171. data/tests/aws/requests/compute/snapshot_tests.rb +4 -7
  172. data/tests/aws/requests/compute/tag_tests.rb +49 -0
  173. data/tests/aws/requests/compute/volume_tests.rb +2 -6
  174. data/tests/aws/requests/storage/bucket_tests.rb +48 -0
  175. data/tests/aws/requests/storage/object_tests.rb +63 -0
  176. data/tests/bluebox/requests/compute/block_tests.rb +24 -11
  177. data/tests/bluebox/requests/compute/product_tests.rb +3 -0
  178. data/tests/bluebox/requests/compute/template_tests.rb +3 -0
  179. data/tests/go_grid/helper.rb +0 -0
  180. data/tests/go_grid/requests/compute/image_tests.rb +0 -0
  181. data/tests/helper.rb +5 -1
  182. data/tests/linode/requests/compute/datacenter_tests.rb +1 -0
  183. data/tests/linode/requests/compute/distribution_tests.rb +2 -0
  184. data/tests/linode/requests/compute/linode_tests.rb +6 -0
  185. data/tests/linode/requests/compute/linodeplans_tests.rb +2 -0
  186. data/tests/lorem.txt +1 -0
  187. data/tests/rackspace/requests/compute/flavor_tests.rb +4 -0
  188. data/tests/rackspace/requests/compute/image_tests.rb +12 -4
  189. data/tests/rackspace/requests/compute/server_tests.rb +9 -0
  190. data/tests/slicehost/requests/compute/backup_tests.rb +1 -0
  191. data/tests/slicehost/requests/compute/flavor_tests.rb +3 -0
  192. data/tests/slicehost/requests/compute/image_tests.rb +3 -0
  193. data/tests/slicehost/requests/compute/slice_tests.rb +14 -2
  194. metadata +42 -27
  195. data/spec/aws/requests/storage/delete_bucket_spec.rb +0 -35
  196. data/spec/aws/requests/storage/delete_object_spec.rb +0 -36
  197. data/spec/aws/requests/storage/get_object_spec.rb +0 -58
  198. data/spec/aws/requests/storage/get_service_spec.rb +0 -32
  199. data/spec/aws/requests/storage/head_object_spec.rb +0 -26
  200. data/spec/aws/requests/storage/put_bucket_spec.rb +0 -19
  201. data/spec/aws/requests/storage/put_object_spec.rb +0 -43
@@ -8,7 +8,7 @@ module Fog
8
8
  # Describe all or specified instances
9
9
  #
10
10
  # ==== Parameters
11
- # * instance_id<~Array> - List of instance ids to describe, defaults to all
11
+ # * filters<~Hash> - List of filters to limit results with
12
12
  #
13
13
  # ==== Returns
14
14
  # * response<~Excon::Response>:
@@ -50,8 +50,13 @@ module Fog
50
50
  # * 'rootDeviceType'<~String> - root device type used by AMI in [ebs, instance-store]
51
51
  # * 'ramdiskId'<~String> - Id of ramdisk used to launch instance
52
52
  # * 'reason'<~String> - reason for most recent state transition, or blank
53
- def describe_instances(instance_id = [])
54
- params = AWS.indexed_param('InstanceId', instance_id)
53
+ def describe_instances(filters = {})
54
+ unless filters.is_a?(Hash)
55
+ Formatador.display_line("[yellow][WARN] describe_instances with #{filters.class} param is deprecated, use describe_instances('instance-id' => []) instead[/] [light_black](#{caller.first})[/]")
56
+ filters = {'instance-id' => [*filters]}
57
+ end
58
+ params = AWS.indexed_filters(filters)
59
+
55
60
  request({
56
61
  'Action' => 'DescribeInstances',
57
62
  :idempotent => true,
@@ -63,64 +68,131 @@ module Fog
63
68
 
64
69
  class Mock
65
70
 
66
- def describe_instances(instance_id = [])
71
+ def describe_instances(filters = {})
72
+ unless filters.is_a?(Hash)
73
+ Formatador.display_line("[yellow][WARN] describe_instances with #{filters.class} param is deprecated, use describe_instances('instance-id' => []) instead[/] [light_black](#{caller.first})[/]")
74
+ filters = {'instance-id' => [*filters]}
75
+ end
76
+
77
+ if filters.keys.any? {|key| key =~ /^tag/}
78
+ Formatador.display_line("[yellow][WARN] describe_instances tag filters are not yet mocked[/] [light_black](#{caller.first})[/]")
79
+ Fog::Mock.not_implemented
80
+ end
81
+
67
82
  response = Excon::Response.new
68
- instance_id = [*instance_id]
69
- if instance_id != []
70
- instance_set = @data[:instances].reject {|key,value| !instance_id.include?(key)}.values
71
- else
72
- instance_set = @data[:instances].values
83
+
84
+ instance_set = @data[:instances].values
85
+
86
+ aliases = {
87
+ 'architecture' => 'architecture',
88
+ 'availability-zone' => 'availabilityZone',
89
+ 'client-token' => 'clientToken',
90
+ 'dns-token' => 'dnsName',
91
+ 'group-id' => 'groupId',
92
+ 'image-id' => 'imageId',
93
+ 'instance-id' => 'instanceId',
94
+ 'instance-lifecycle' => 'instanceLifecycle',
95
+ 'instance-type' => 'instanceType',
96
+ 'ip-address' => 'ipAddress',
97
+ 'kernel-id' => 'kernelId',
98
+ 'key-name' => 'key-name',
99
+ 'launch-index' => 'launchIndex',
100
+ 'launch-time' => 'launchTime',
101
+ 'monitoring-state' => 'monitoringState',
102
+ 'owner-id' => 'ownerId',
103
+ 'placement-group-name' => 'placementGroupName',
104
+ 'platform' => 'platform',
105
+ 'private-dns-name' => 'privateDnsName',
106
+ 'private-ip-address' => 'privateIpAddress',
107
+ 'product-code' => 'productCode',
108
+ 'ramdisk-id' => 'ramdiskId',
109
+ 'reason' => 'reason',
110
+ 'requester-id' => 'requesterId',
111
+ 'reservation-id' => 'reservationId',
112
+ 'root-device-name' => 'rootDeviceName',
113
+ 'root-device-type' => 'rootDeviceType',
114
+ 'spot-instance-request-id' => 'spotInstanceRequestId',
115
+ 'subnet-id' => 'subnetId',
116
+ 'virtualization-type' => 'virtualizationType',
117
+ 'vpc-id' => 'vpcId'
118
+ }
119
+ block_device_mapping_aliases = {
120
+ 'attach-time' => 'attachTime',
121
+ 'delete-on-termination' => 'deleteOnTermination',
122
+ 'device-name' => 'deviceName',
123
+ 'status' => 'status',
124
+ 'volume-id' => 'volumeId',
125
+ }
126
+ instance_state_aliases = {
127
+ 'code' => 'code',
128
+ 'name' => 'name'
129
+ }
130
+ state_reason_aliases = {
131
+ 'code' => 'code',
132
+ 'message' => 'message'
133
+ }
134
+ for filter_key, filter_value in filters
135
+ if block_device_mapping_key = filter_key.split('block-device-mapping.')[1]
136
+ aliased_key = block_device_mapping_aliases[block_device_mapping_key]
137
+ instance_set = instance_set.reject{|instance| !instance['blockDeviceMapping'].detect {|block_device_mapping| [*filter_value].include?(block_device_mapping[aliased_key])}}
138
+ elsif instance_state_key = filter_key.split('instance-state-')[1]
139
+ aliased_key = instance_state_aliases[instance_state_key]
140
+ instance_set = instance_set.reject{|instance| ![*filter_value].include?(instance['instanceState'][aliased_key])}
141
+ elsif state_reason_key = filter_key.split('state-reason-')[1]
142
+ aliased_key = state_reason_aliases[state_reason_key]
143
+ instance_set = instance_set.reject{|instance| ![*filter_value].include?(instance['stateReason'][aliased_key])}
144
+ else
145
+ aliased_key = aliases[filter_key]
146
+ instance_set = instance_set.reject {|instance| ![*filter_value].include?(instance[aliased_key])}
147
+ end
73
148
  end
74
149
 
75
- if instance_id.length == 0 || instance_id.length == instance_set.length
76
- response.status = 200
77
- reservation_set = {}
78
-
79
- instance_set.each do |instance|
80
- case instance['instanceState']['name']
81
- when 'pending'
82
- if Time.now - instance['launchTime'] > Fog::Mock.delay
83
- instance['ipAddress'] = Fog::AWS::Mock.ip_address
84
- instance['dnsName'] = Fog::AWS::Mock.dns_name_for(instance['ipAddress'])
85
- instance['privateIpAddress'] = Fog::AWS::Mock.ip_address
86
- instance['privateDnsName'] = Fog::AWS::Mock.private_dns_name_for(instance['privateIpAddress'])
87
- instance['instanceState'] = { 'code' => 16, 'name' => 'running' }
88
- end
89
- when 'rebooting'
90
- instance['instanceState'] = { 'code' => 16, 'name' => 'running' }
91
- when 'shutting-down'
92
- if Time.now - @data[:deleted_at][instance['instanceId']] > Fog::Mock.delay * 2
93
- @data[:deleted_at].delete(instance['instanceId'])
94
- @data[:instances].delete(instance['instanceId'])
95
- elsif Time.now - @data[:deleted_at][instance['instanceId']] > Fog::Mock.delay
96
- instance['instanceState'] = { 'code' => 48, 'name' => 'terminating' }
97
- end
98
- when 'terminating'
99
- if Time.now - @data[:deleted_at][instance['instanceId']] > Fog::Mock.delay
100
- @data[:deleted_at].delete(instance['instanceId'])
101
- @data[:instances].delete(instance['instanceId'])
102
- end
103
- end
150
+ response.status = 200
151
+ reservation_set = {}
104
152
 
105
- if @data[:instances][instance['instanceId']]
106
- reservation_set[instance['reservationId']] ||= {
107
- 'groupSet' => instance['groupSet'],
108
- 'instancesSet' => [],
109
- 'ownerId' => instance['ownerId'],
110
- 'reservationId' => instance['reservationId']
111
- }
112
- reservation_set[instance['reservationId']]['instancesSet'] << instance.reject{|key,value| !['amiLaunchIndex', 'architecture', 'blockDeviceMapping', 'dnsName', 'imageId', 'instanceId', 'instanceState', 'instanceType', 'ipAddress', 'kernelId', 'keyName', 'launchTime', 'monitoring', 'placement', 'privateDnsName', 'privateIpAddress', 'productCodes', 'ramdiskId', 'reason', 'rootDeviceType'].include?(key)}
153
+ instance_set.each do |instance|
154
+ case instance['instanceState']['name']
155
+ when 'pending'
156
+ if Time.now - instance['launchTime'] > Fog::Mock.delay
157
+ instance['ipAddress'] = Fog::AWS::Mock.ip_address
158
+ instance['dnsName'] = Fog::AWS::Mock.dns_name_for(instance['ipAddress'])
159
+ instance['privateIpAddress'] = Fog::AWS::Mock.ip_address
160
+ instance['privateDnsName'] = Fog::AWS::Mock.private_dns_name_for(instance['privateIpAddress'])
161
+ instance['instanceState'] = { 'code' => 16, 'name' => 'running' }
162
+ end
163
+ when 'rebooting'
164
+ instance['instanceState'] = { 'code' => 16, 'name' => 'running' }
165
+ when 'shutting-down'
166
+ if Time.now - @data[:deleted_at][instance['instanceId']] > Fog::Mock.delay * 2
167
+ @data[:deleted_at].delete(instance['instanceId'])
168
+ @data[:instances].delete(instance['instanceId'])
169
+ elsif Time.now - @data[:deleted_at][instance['instanceId']] > Fog::Mock.delay
170
+ instance['instanceState'] = { 'code' => 48, 'name' => 'terminating' }
171
+ end
172
+ when 'terminating'
173
+ if Time.now - @data[:deleted_at][instance['instanceId']] > Fog::Mock.delay
174
+ @data[:deleted_at].delete(instance['instanceId'])
175
+ @data[:instances].delete(instance['instanceId'])
113
176
  end
114
177
  end
115
178
 
116
- response.body = {
117
- 'requestId' => Fog::AWS::Mock.request_id,
118
- 'reservationSet' => reservation_set.values
119
- }
120
- response
121
- else
122
- raise Fog::AWS::Compute::NotFound.new("The instance ID #{instance_id.inspect} does not exist")
179
+ if @data[:instances][instance['instanceId']]
180
+
181
+ reservation_set[instance['reservationId']] ||= {
182
+ 'groupSet' => instance['groupSet'],
183
+ 'instancesSet' => [],
184
+ 'ownerId' => instance['ownerId'],
185
+ 'reservationId' => instance['reservationId']
186
+ }
187
+ reservation_set[instance['reservationId']]['instancesSet'] << instance.reject{|key,value| !['amiLaunchIndex', 'architecture', 'blockDeviceMapping', 'clientToken', 'dnsName', 'imageId', 'instanceId', 'instanceState', 'instanceType', 'ipAddress', 'kernelId', 'keyName', 'launchTime', 'monitoring', 'placement', 'privateDnsName', 'privateIpAddress', 'productCodes', 'ramdiskId', 'reason', 'rootDeviceType', 'stateReason', 'tagSet'].include?(key)}
188
+ end
123
189
  end
190
+
191
+ response.body = {
192
+ 'requestId' => Fog::AWS::Mock.request_id,
193
+ 'reservationSet' => reservation_set.values
194
+ }
195
+ response
124
196
  end
125
197
 
126
198
  end
@@ -8,7 +8,7 @@ module Fog
8
8
  # Describe all or specified key pairs
9
9
  #
10
10
  # ==== Parameters
11
- # * key_name<~Array>:: List of key names to describe, defaults to all
11
+ # * filters<~Hash> - List of filters to limit results with
12
12
  #
13
13
  # ==== Returns
14
14
  # * response<~Excon::Response>:
@@ -17,8 +17,12 @@ module Fog
17
17
  # * 'keySet'<~Array>:
18
18
  # * 'keyName'<~String> - Name of key
19
19
  # * 'keyFingerprint'<~String> - Fingerprint of key
20
- def describe_key_pairs(key_name = [])
21
- params = AWS.indexed_param('KeyName', key_name)
20
+ def describe_key_pairs(filters = {})
21
+ unless filters.is_a?(Hash)
22
+ Formatador.display_line("[yellow][WARN] describe_key_pairs with #{filters.class} param is deprecated, use describe_key_pairs('key-name' => []) instead[/] [light_black](#{caller.first})[/]")
23
+ filters = {'key-name' => [*filters]}
24
+ end
25
+ params = AWS.indexed_filters(filters)
22
26
  request({
23
27
  'Action' => 'DescribeKeyPairs',
24
28
  :idempotent => true,
@@ -30,26 +34,30 @@ module Fog
30
34
 
31
35
  class Mock
32
36
 
33
- def describe_key_pairs(key_name = [])
34
- response = Excon::Response.new
35
- key_name = [*key_name]
36
- if key_name != []
37
- key_set = @data[:key_pairs].reject {|key, value| !key_name.include?(key)}.values
38
- else
39
- key_set = @data[:key_pairs].values
37
+ def describe_key_pairs(filters = {})
38
+ unless filters.is_a?(Hash)
39
+ Formatador.display_line("[yellow][WARN] describe_key_pairs with #{filters.class} param is deprecated, use describe_key_pairs('key-name' => []) instead[/] [light_black](#{caller.first})[/]")
40
+ filters = {'key-name' => [*filters]}
40
41
  end
41
- if key_name.length == 0 || key_name.length == key_set.length
42
- response.status = 200
43
- response.body = {
44
- 'requestId' => Fog::AWS::Mock.request_id,
45
- 'keySet' => key_set.map do |key|
46
- key.reject {|key,value| !['keyFingerprint', 'keyName'].include?(key)}
47
- end
48
- }
49
- response
50
- else
51
- raise Fog::AWS::Compute::NotFound.new("The key pair #{key_name.inspect} does not exist")
42
+
43
+ response = Excon::Response.new
44
+
45
+ key_set = @data[:key_pairs].values
46
+
47
+ aliases = {'fingerprint' => 'keyFingerprint', 'key-name' => 'keyName'}
48
+ for filter_key, filter_value in filters
49
+ aliased_key = aliases[filter_key]
50
+ key_set = key_set.reject{|key_pair| ![*filter_value].include?(key_pair[aliased_key])}
52
51
  end
52
+
53
+ response.status = 200
54
+ response.body = {
55
+ 'requestId' => Fog::AWS::Mock.request_id,
56
+ 'keySet' => key_set.map do |key_pair|
57
+ key_pair.reject {|key,value| !['keyFingerprint', 'keyName'].include?(key)}
58
+ end
59
+ }
60
+ response
53
61
  end
54
62
 
55
63
  end
@@ -8,7 +8,7 @@ module Fog
8
8
  # Describe all or specified regions
9
9
  #
10
10
  # ==== Params
11
- # * region_name<~String> - List of regions to describe, defaults to all
11
+ # * filters<~Hash> - List of filters to limit results with
12
12
  #
13
13
  # ==== Returns
14
14
  # * response<~Excon::Response>:
@@ -17,8 +17,12 @@ module Fog
17
17
  # * 'regionInfo'<~Array>:
18
18
  # * 'regionName'<~String> - Name of region
19
19
  # * 'regionEndpoint'<~String> - Service endpoint for region
20
- def describe_regions(region_name = [])
21
- params = AWS.indexed_param('RegionName', region_name)
20
+ def describe_regions(filters = {})
21
+ unless filters.is_a?(Hash)
22
+ Formatador.display_line("[yellow][WARN] describe_regions with #{filters.class} param is deprecated, use describe_regions('region-name' => []) instead[/] [light_black](#{caller.first})[/]")
23
+ filters = {'region-name' => [*filters]}
24
+ end
25
+ params = AWS.indexed_filters(filters)
22
26
  request({
23
27
  'Action' => 'DescribeRegions',
24
28
  :idempotent => true,
@@ -30,29 +34,30 @@ module Fog
30
34
 
31
35
  class Mock
32
36
 
33
- def describe_regions(region_name = [])
34
- response = Excon::Response.new
35
- region_name = [*region_name]
36
- regions = {
37
- 'eu-west-1' => {"regionName"=>"eu-west-1", "regionEndpoint"=>"eu-west-1.ec2.amazonaws.com"},
38
- 'us-east-1' => {"regionName"=>"us-east-1", "regionEndpoint"=>"us-east-1.ec2.amazonaws.com"}
39
- }
40
- if region_name != []
41
- region_info = regions.reject {|key, value| !region_name.include?(key)}.values
42
- else
43
- region_info = regions.values
37
+ def describe_regions(filters = {})
38
+ unless filters.is_a?(Hash)
39
+ Formatador.display_line("[yellow][WARN] describe_regions with #{filters.class} param is deprecated, use describe_regions('region-name' => []) instead[/] [light_black](#{caller.first})[/]")
40
+ filters = {'region-name' => [*filters]}
44
41
  end
45
42
 
46
- if region_name.length == 0 || region_name.length == region_info.length
47
- response.status = 200
48
- response.body = {
49
- 'requestId' => Fog::AWS::Mock.request_id,
50
- 'regionInfo' => region_info
51
- }
52
- response
53
- else
54
- raise Fog::AWS::Compute::Error.new("InvalidParameterValue => Invalid region: #{region_name.inspect}")
43
+ response = Excon::Response.new
44
+ region_info = [
45
+ {"regionName"=>"eu-west-1", "regionEndpoint"=>"eu-west-1.ec2.amazonaws.com"},
46
+ {"regionName"=>"us-east-1", "regionEndpoint"=>"us-east-1.ec2.amazonaws.com"}
47
+ ]
48
+
49
+ aliases = {'region-name' => 'regionName', 'endpoint' => 'regionEndpoint'}
50
+ for filter_key, filter_value in filters
51
+ aliased_key = aliases[filter_key]
52
+ region_info = region_info.reject{|region| ![*filter_value].include?(region[aliased_key])}
55
53
  end
54
+
55
+ response.status = 200
56
+ response.body = {
57
+ 'requestId' => Fog::AWS::Mock.request_id,
58
+ 'regionInfo' => region_info
59
+ }
60
+ response
56
61
  end
57
62
 
58
63
  end
@@ -8,7 +8,7 @@ module Fog
8
8
  # Describe all or specified reserved instances
9
9
  #
10
10
  # ==== Parameters
11
- # * reserved_instances_id<~Array> - List of reserved instance ids to describe, defaults to all
11
+ # * filters<~Hash> - List of filters to limit results with
12
12
  #
13
13
  # ==== Returns
14
14
  # * response<~Excon::Response>:
@@ -25,8 +25,12 @@ module Fog
25
25
  # * 'start'<~Time> - start time for reservation
26
26
  # * 'state'<~String> - state of reserved instance purchase, in .[pending-payment, active, payment-failed, retired]
27
27
  # * 'usagePrice"<~Float> - usage price of reserved instances, per hour
28
- def describe_reserved_instances(reserved_instances_id = [])
29
- params = AWS.indexed_param('ReservedInstancesId', reserved_instances_id)
28
+ def describe_reserved_instances(filters = {})
29
+ unless filters.is_a?(Hash)
30
+ Formatador.display_line("[yellow][WARN] describe_reserved_instances with #{filters.class} param is deprecated, use describe_reserved_instances('reserved-instances-id' => []) instead[/] [light_black](#{caller.first})[/]")
31
+ filters = {'reserved-instances-id' => [*filters]}
32
+ end
33
+ params = AWS.indexed_filters(filters)
30
34
  request({
31
35
  'Action' => 'DescribeReservedInstances',
32
36
  :idempotent => true,
@@ -38,7 +42,7 @@ module Fog
38
42
 
39
43
  class Mock
40
44
 
41
- def describe_reserved_instances(reserved_instances_id = {})
45
+ def describe_reserved_instances(filters = {})
42
46
  Fog::Mock.not_implemented
43
47
  end
44
48
 
@@ -8,7 +8,7 @@ module Fog
8
8
  # Describe all or specified security groups
9
9
  #
10
10
  # ==== Parameters
11
- # * group_name<~Array> - List of groups to describe, defaults to all
11
+ # * filters<~Hash> - List of filters to limit results with
12
12
  #
13
13
  # === Returns
14
14
  # * response<~Excon::Response>:
@@ -27,8 +27,12 @@ module Fog
27
27
  # * 'cidrIp'<~String> - CIDR range
28
28
  # * 'toPort'<~Integer> - End of port range (or -1 for ICMP wildcard)
29
29
  # * 'ownerId'<~String> - AWS Access Key Id of the owner of the security group
30
- def describe_security_groups(group_name = [])
31
- params = AWS.indexed_param('GroupName', group_name)
30
+ def describe_security_groups(filters = {})
31
+ unless filters.is_a?(Hash)
32
+ Formatador.display_line("[yellow][WARN] describe_security_groups with #{filters.class} param is deprecated, use describe_security_groups('group-name' => []) instead[/] [light_black](#{caller.first})[/]")
33
+ filters = {'group-name' => [*filters]}
34
+ end
35
+ params = AWS.indexed_filters(filters)
32
36
  request({
33
37
  'Action' => 'DescribeSecurityGroups',
34
38
  :idempotent => true,
@@ -40,24 +44,49 @@ module Fog
40
44
 
41
45
  class Mock
42
46
 
43
- def describe_security_groups(group_name = [])
44
- response = Excon::Response.new
45
- group_name = [*group_name]
46
- if group_name != []
47
- security_group_info = @data[:security_groups].reject {|key, value| !group_name.include?(key)}.values
48
- else
49
- security_group_info = @data[:security_groups].values
47
+ def describe_security_groups(filters = {})
48
+ unless filters.is_a?(Hash)
49
+ Formatador.display_line("[yellow][WARN] describe_security_groups with #{filters.class} param is deprecated, use describe_security_groups('group-name' => []) instead[/] [light_black](#{caller.first})[/]")
50
+ filters = {'group-name' => [*filters]}
50
51
  end
51
- if group_name.length == 0 || group_name.length == security_group_info.length
52
- response.status = 200
53
- response.body = {
54
- 'requestId' => Fog::AWS::Mock.request_id,
55
- 'securityGroupInfo' => security_group_info
56
- }
57
- response
58
- else
59
- raise Fog::AWS::Compute::NotFound.new("The security group #{group_name.inspect} does not exist")
52
+
53
+ response = Excon::Response.new
54
+
55
+ security_group_info = @data[:security_groups].values
56
+
57
+ aliases = {
58
+ 'description' => 'groupDescription',
59
+ 'group-name' => 'groupName',
60
+ 'owner-id' => 'ownerId'
61
+ }
62
+ permission_aliases = {
63
+ 'cidr' => 'cidrIp',
64
+ 'from-port' => 'fromPort',
65
+ 'protocol' => 'ipProtocol',
66
+ 'to-port' => 'toPort'
67
+ }
68
+ for filter_key, filter_value in filters
69
+ if permission_key = filter_key.split('ip-permission.')[1]
70
+ if permission_key == 'group-name'
71
+ security_group_info = security_group_info.reject{|security_group| !security_group['ipPermissions']['groups'].detect {|group| [*filter_value].include?(group['groupName'])}}
72
+ elsif permission_key == 'user-id'
73
+ security_group_info = security_group_info.reject{|security_group| !security_group['ipPermissions']['groups'].detect {|group| [*filter_value].include?(group['userId'])}}
74
+ else
75
+ aliased_key = permission_aliases[filter_key]
76
+ security_group_info = security_group_info.reject{|security_group| !security_group['ipPermissions'].detect {|permission| [*filter_value].include?(permission[aliased_key])}}
77
+ end
78
+ else
79
+ aliased_key = aliases[filter_key]
80
+ security_group_info = security_group_info.reject{|security_group| ![*filter_value].include?(security_group[aliased_key])}
81
+ end
60
82
  end
83
+
84
+ response.status = 200
85
+ response.body = {
86
+ 'requestId' => Fog::AWS::Mock.request_id,
87
+ 'securityGroupInfo' => security_group_info
88
+ }
89
+ response
61
90
  end
62
91
 
63
92
  end