fog 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +2 -9
- data/Rakefile +3 -2
- data/docs/_layouts/default.html +13 -13
- data/docs/about/contributing.markdown +1 -1
- data/docs/about/getting_started.markdown +28 -3
- data/docs/dns/index.markdown +4 -4
- data/docs/index.markdown +2 -10
- data/docs/public/css/fog.css +14 -1
- data/docs/storage/index.markdown +2 -2
- data/fog.gemspec +6 -5
- data/lib/fog.rb +1 -1
- data/lib/fog/aws.rb +26 -1
- data/lib/fog/aws/auto_scaling.rb +3 -1
- data/lib/fog/aws/cloud_formation.rb +3 -0
- data/lib/fog/aws/cloud_watch.rb +17 -1
- data/lib/fog/aws/compute.rb +50 -18
- data/lib/fog/aws/elb.rb +4 -2
- data/lib/fog/aws/emr.rb +133 -0
- data/lib/fog/aws/models/cloud_watch/alarm.rb +12 -0
- data/lib/fog/aws/models/cloud_watch/alarm_data.rb +39 -0
- data/lib/fog/aws/models/cloud_watch/alarm_datum.rb +66 -0
- data/lib/fog/aws/models/cloud_watch/alarm_histories.rb +18 -0
- data/lib/fog/aws/models/cloud_watch/alarm_history.rb +16 -0
- data/lib/fog/aws/models/cloud_watch/alarms.rb +30 -0
- data/lib/fog/aws/models/compute/addresses.rb +1 -1
- data/lib/fog/aws/models/compute/key_pairs.rb +1 -1
- data/lib/fog/aws/models/compute/security_groups.rb +1 -1
- data/lib/fog/aws/models/compute/server.rb +4 -2
- data/lib/fog/aws/models/compute/servers.rb +1 -1
- data/lib/fog/aws/models/compute/snapshots.rb +1 -1
- data/lib/fog/aws/models/compute/spot_request.rb +21 -4
- data/lib/fog/aws/models/compute/spot_requests.rb +45 -1
- data/lib/fog/aws/models/compute/volumes.rb +1 -1
- data/lib/fog/aws/models/elb/load_balancer.rb +2 -0
- data/lib/fog/aws/models/storage/file.rb +1 -1
- data/lib/fog/aws/parsers/cdn/get_invalidation_list.rb +0 -1
- data/lib/fog/aws/parsers/cloud_formation/update_stack.rb +19 -0
- data/lib/fog/aws/parsers/cloud_watch/delete_alarms.rb +26 -0
- data/lib/fog/aws/parsers/cloud_watch/describe_alarm_history.rb +40 -0
- data/lib/fog/aws/parsers/cloud_watch/describe_alarms.rb +73 -0
- data/lib/fog/aws/parsers/cloud_watch/describe_alarms_for_metric.rb +71 -0
- data/lib/fog/aws/parsers/cloud_watch/disable_alarm_actions.rb +26 -0
- data/lib/fog/aws/parsers/cloud_watch/enable_alarm_actions.rb +26 -0
- data/lib/fog/aws/parsers/cloud_watch/get_metric_statistics.rb +1 -0
- data/lib/fog/aws/parsers/cloud_watch/put_metric_alarm.rb +26 -0
- data/lib/fog/aws/parsers/cloud_watch/set_alarm_state.rb +26 -0
- data/lib/fog/aws/parsers/compute/spot_instance_requests.rb +2 -2
- data/lib/fog/aws/parsers/emr/add_instance_groups.rb +28 -0
- data/lib/fog/aws/parsers/emr/add_job_flow_steps.rb +17 -0
- data/lib/fog/aws/parsers/emr/describe_job_flows.rb +140 -0
- data/lib/fog/aws/parsers/emr/modify_instance_groups.rb +17 -0
- data/lib/fog/aws/parsers/emr/run_job_flow.rb +19 -0
- data/lib/fog/aws/parsers/emr/set_termination_protection.rb +17 -0
- data/lib/fog/aws/parsers/emr/terminate_job_flows.rb +17 -0
- data/lib/fog/aws/rds.rb +3 -1
- data/lib/fog/aws/requests/cloud_formation/create_stack.rb +6 -0
- data/lib/fog/aws/requests/cloud_formation/update_stack.rb +62 -0
- data/lib/fog/aws/requests/cloud_watch/delete_alarms.rb +30 -0
- data/lib/fog/aws/requests/cloud_watch/describe_alarm_history.rb +33 -0
- data/lib/fog/aws/requests/cloud_watch/describe_alarms.rb +38 -0
- data/lib/fog/aws/requests/cloud_watch/describe_alarms_for_metric.rb +39 -0
- data/lib/fog/aws/requests/cloud_watch/disable_alarm_actions.rb +30 -0
- data/lib/fog/aws/requests/cloud_watch/enable_alarm_actions.rb +30 -0
- data/lib/fog/aws/requests/cloud_watch/put_metric_alarm.rb +84 -0
- data/lib/fog/aws/requests/cloud_watch/set_alarm_state.rb +31 -0
- data/lib/fog/aws/requests/compute/authorize_security_group_ingress.rb +141 -36
- data/lib/fog/aws/requests/compute/create_snapshot.rb +2 -3
- data/lib/fog/aws/requests/compute/create_tags.rb +5 -3
- data/lib/fog/aws/requests/compute/create_volume.rb +0 -1
- data/lib/fog/aws/requests/compute/delete_security_group.rb +25 -0
- data/lib/fog/aws/requests/compute/delete_tags.rb +3 -4
- data/lib/fog/aws/requests/compute/describe_addresses.rb +2 -2
- data/lib/fog/aws/requests/compute/describe_availability_zones.rb +5 -2
- data/lib/fog/aws/requests/compute/describe_images.rb +6 -9
- data/lib/fog/aws/requests/compute/describe_instances.rb +17 -8
- data/lib/fog/aws/requests/compute/describe_key_pairs.rb +2 -2
- data/lib/fog/aws/requests/compute/describe_regions.rb +2 -2
- data/lib/fog/aws/requests/compute/describe_reserved_instances.rb +1 -1
- data/lib/fog/aws/requests/compute/describe_security_groups.rb +2 -2
- data/lib/fog/aws/requests/compute/describe_snapshots.rb +7 -5
- data/lib/fog/aws/requests/compute/describe_volumes.rb +5 -4
- data/lib/fog/aws/requests/compute/modify_image_attribute.rb +32 -0
- data/lib/fog/aws/requests/compute/modify_instance_attribute.rb +1 -1
- data/lib/fog/aws/requests/compute/purchase_reserved_instances_offering.rb +1 -1
- data/lib/fog/aws/requests/compute/register_image.rb +0 -1
- data/lib/fog/aws/requests/compute/revoke_security_group_ingress.rb +41 -29
- data/lib/fog/aws/requests/compute/run_instances.rb +1 -2
- data/lib/fog/aws/requests/elb/create_load_balancer.rb +1 -1
- data/lib/fog/aws/requests/elb/create_load_balancer_listeners.rb +1 -1
- data/lib/fog/aws/requests/elb/deregister_instances_from_load_balancer.rb +1 -1
- data/lib/fog/aws/requests/elb/describe_instance_health.rb +2 -2
- data/lib/fog/aws/requests/elb/describe_load_balancers.rb +3 -3
- data/lib/fog/aws/requests/elb/register_instances_with_load_balancer.rb +2 -2
- data/lib/fog/aws/requests/emr/add_instance_groups.rb +46 -0
- data/lib/fog/aws/requests/emr/add_job_flow_steps.rb +49 -0
- data/lib/fog/aws/requests/emr/describe_job_flows.rb +108 -0
- data/lib/fog/aws/requests/emr/modify_instance_groups.rb +40 -0
- data/lib/fog/aws/requests/emr/run_job_flow.rb +106 -0
- data/lib/fog/aws/requests/emr/set_termination_protection.rb +39 -0
- data/lib/fog/aws/requests/emr/terminate_job_flows.rb +37 -0
- data/lib/fog/aws/requests/iam/get_server_certificate.rb +5 -7
- data/lib/fog/aws/requests/iam/upload_server_certificate.rb +1 -0
- data/lib/fog/aws/requests/simpledb/get_attributes.rb +2 -2
- data/lib/fog/aws/requests/simpledb/select.rb +1 -1
- data/lib/fog/aws/requests/storage/copy_object.rb +1 -1
- data/lib/fog/aws/requests/storage/get_object_url.rb +2 -2
- data/lib/fog/aws/requests/storage/hash_to_acl.rb +35 -25
- data/lib/fog/aws/ses.rb +1 -1
- data/lib/fog/aws/simpledb.rb +2 -0
- data/lib/fog/aws/sns.rb +3 -1
- data/lib/fog/aws/sqs.rb +4 -2
- data/lib/fog/aws/storage.rb +12 -3
- data/lib/fog/bin.rb +1 -1
- data/lib/fog/bin/aws.rb +8 -4
- data/lib/fog/bin/bluebox.rb +2 -2
- data/lib/fog/bin/brightbox.rb +1 -1
- data/lib/fog/bin/dnsimple.rb +1 -1
- data/lib/fog/bin/dnsmadeeasy.rb +1 -1
- data/lib/fog/bin/ecloud.rb +1 -1
- data/lib/fog/bin/glesys.rb +1 -1
- data/lib/fog/bin/go_grid.rb +1 -1
- data/lib/fog/bin/google.rb +1 -1
- data/lib/fog/bin/libvirt.rb +1 -1
- data/lib/fog/bin/linode.rb +2 -2
- data/lib/fog/bin/local.rb +1 -1
- data/lib/fog/bin/new_servers.rb +1 -1
- data/lib/fog/bin/ninefold.rb +2 -2
- data/lib/fog/bin/openstack.rb +1 -1
- data/lib/fog/bin/rackspace.rb +3 -3
- data/lib/fog/bin/slicehost.rb +1 -1
- data/lib/fog/bin/stormondemand.rb +1 -1
- data/lib/fog/bin/virtual_box.rb +1 -1
- data/lib/fog/bin/vmfusion.rb +1 -1
- data/lib/fog/bin/voxel.rb +1 -1
- data/lib/fog/bin/zerigo.rb +1 -1
- data/lib/fog/brightbox/models/compute/account.rb +1 -1
- data/lib/fog/compute/models/server.rb +1 -2
- data/lib/fog/core/attributes.rb +5 -5
- data/lib/fog/core/connection.rb +1 -1
- data/lib/fog/core/deprecation.rb +2 -2
- data/lib/fog/core/logger.rb +8 -3
- data/lib/fog/core/mock.rb +4 -0
- data/lib/fog/core/provider.rb +7 -2
- data/lib/fog/core/service.rb +8 -2
- data/lib/fog/dnsmadeeasy/models/dns/record.rb +3 -2
- data/lib/fog/dynect/dns.rb +25 -3
- data/lib/fog/ecloud/compute.rb +2 -6
- data/lib/fog/go_grid/requests/compute/grid_server_power.rb +1 -1
- data/lib/fog/google/models/storage/file.rb +1 -1
- data/lib/fog/google/requests/storage/get_object_url.rb +2 -2
- data/lib/fog/google/storage.rb +1 -1
- data/lib/fog/libvirt/models/compute/uri.rb +7 -3
- data/lib/fog/linode/models/compute/server.rb +10 -0
- data/lib/fog/ninefold/models/storage/file.rb +8 -6
- data/lib/fog/ninefold/models/storage/files.rb +3 -2
- data/lib/fog/ninefold/requests/storage/head_namespace.rb +20 -0
- data/lib/fog/ninefold/storage.rb +4 -2
- data/lib/fog/openstack.rb +4 -3
- data/lib/fog/openstack/compute.rb +8 -5
- data/lib/fog/openstack/models/compute/server.rb +10 -1
- data/lib/fog/openstack/requests/compute/create_server.rb +6 -8
- data/lib/fog/rackspace/load_balancers.rb +1 -0
- data/lib/fog/rackspace/models/dns/callback.rb +1 -1
- data/lib/fog/rackspace/models/dns/record.rb +1 -1
- data/lib/fog/rackspace/models/dns/zone.rb +1 -1
- data/lib/fog/slicehost/dns.rb +1 -0
- data/lib/fog/slicehost/models/dns/record.rb +7 -3
- data/lib/fog/slicehost/models/dns/zone.rb +1 -1
- data/lib/fog/slicehost/parsers/dns/create_record.rb +8 -2
- data/lib/fog/slicehost/parsers/dns/get_record.rb +17 -5
- data/lib/fog/slicehost/parsers/dns/get_records.rb +10 -2
- data/lib/fog/slicehost/requests/dns/get_record.rb +1 -1
- data/lib/fog/slicehost/requests/dns/get_records.rb +7 -8
- data/lib/fog/slicehost/requests/dns/update_record.rb +43 -0
- data/lib/fog/storm_on_demand/models/compute/balancers.rb +1 -1
- data/lib/fog/storm_on_demand/models/compute/configs.rb +1 -1
- data/lib/fog/storm_on_demand/models/compute/images.rb +1 -1
- data/lib/fog/storm_on_demand/models/compute/servers.rb +1 -1
- data/lib/fog/storm_on_demand/models/compute/templates.rb +1 -1
- data/lib/fog/terremark/vcloud.rb +1 -1
- data/lib/fog/vsphere/compute.rb +40 -23
- data/lib/fog/vsphere/models/compute/server.rb +1 -0
- data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +36 -4
- data/lib/fog/zerigo/dns.rb +14 -3
- data/lib/fog/zerigo/models/dns/record.rb +1 -1
- data/lib/fog/zerigo/models/dns/records.rb +5 -0
- data/lib/fog/zerigo/models/dns/zones.rb +2 -2
- data/lib/fog/zerigo/requests/dns/count_hosts.rb +20 -1
- data/lib/fog/zerigo/requests/dns/count_zones.rb +12 -1
- data/lib/fog/zerigo/requests/dns/create_host.rb +67 -1
- data/lib/fog/zerigo/requests/dns/create_zone.rb +44 -1
- data/lib/fog/zerigo/requests/dns/delete_host.rb +19 -0
- data/lib/fog/zerigo/requests/dns/delete_zone.rb +17 -0
- data/lib/fog/zerigo/requests/dns/find_hosts.rb +22 -1
- data/lib/fog/zerigo/requests/dns/get_host.rb +18 -1
- data/lib/fog/zerigo/requests/dns/get_zone.rb +19 -2
- data/lib/fog/zerigo/requests/dns/get_zone_stats.rb +23 -0
- data/lib/fog/zerigo/requests/dns/list_hosts.rb +20 -1
- data/lib/fog/zerigo/requests/dns/list_zones.rb +15 -0
- data/lib/fog/zerigo/requests/dns/update_host.rb +20 -1
- data/lib/fog/zerigo/requests/dns/update_zone.rb +20 -1
- data/tests/aws/models/cloud_watch/alarm_data_tests.rb +42 -0
- data/tests/aws/models/cloud_watch/alarm_history_tests.rb +22 -0
- data/tests/aws/models/compute/security_group_tests.rb +15 -10
- data/tests/aws/models/elb/model_tests.rb +4 -4
- data/tests/aws/requests/cloud_formation/stack_tests.rb +14 -0
- data/tests/aws/requests/cloud_watch/list_metrics_test.rb +5 -5
- data/tests/aws/requests/compute/image_tests.rb +33 -2
- data/tests/aws/requests/compute/instance_tests.rb +16 -1
- data/tests/aws/requests/compute/security_group_tests.rb +251 -32
- data/tests/aws/requests/compute/tag_tests.rb +42 -2
- data/tests/aws/requests/emr/helper.rb +172 -0
- data/tests/aws/requests/emr/instance_group_tests.rb +106 -0
- data/tests/aws/requests/emr/job_flow_tests.rb +88 -0
- data/tests/aws/requests/iam/server_certificate_tests.rb +20 -7
- data/tests/aws/requests/storage/bucket_tests.rb +82 -54
- data/tests/aws/requests/storage/hash_to_acl_tests.rb +173 -0
- data/tests/aws/requests/storage/object_tests.rb +44 -24
- data/tests/brightbox/requests/compute/helper.rb +15 -6
- data/tests/core/attribute_tests.rb +29 -0
- data/tests/core/mocking_tests.rb +60 -0
- data/tests/dns/models/record_tests.rb +4 -2
- data/tests/dns/models/records_tests.rb +4 -2
- data/tests/dns/models/zone_tests.rb +3 -1
- data/tests/dns/models/zones_tests.rb +4 -2
- data/tests/helper.rb +4 -0
- data/tests/rackspace/requests/dns/dns_tests.rb +16 -12
- data/tests/rackspace/requests/dns/records_tests.rb +13 -11
- data/tests/slicehost/requests/dns/dns_tests.rb +58 -11
- data/tests/vsphere/compute_tests.rb +18 -10
- data/tests/vsphere/requests/compute/vm_clone_tests.rb +1 -1
- metadata +214 -221
@@ -0,0 +1,38 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
class CloudWatch
|
4
|
+
class Real
|
5
|
+
|
6
|
+
require 'fog/aws/parsers/cloud_watch/describe_alarms'
|
7
|
+
|
8
|
+
# Retrieves alarms with the specified names
|
9
|
+
# ==== Options
|
10
|
+
# * ActionPrefix<~String>: The action name prefix
|
11
|
+
# * AlarmNamePrefix<~String>: The alarm name prefix.
|
12
|
+
# AlarmNames cannot be specified if this parameter is specified
|
13
|
+
# * AlarmNames<~Array>: A list of alarm names to retrieve information for.
|
14
|
+
# * MaxRecords<~Integer>: The maximum number of alarm descriptions to retrieve
|
15
|
+
# * NextToken<~String>: The token returned by a previous call to indicate that there is more data available
|
16
|
+
# * NextToken<~String> The token returned by a previous call to indicate that there is more data available
|
17
|
+
# * StateValue<~String>: The state value to be used in matching alarms
|
18
|
+
#
|
19
|
+
# ==== Returns
|
20
|
+
# * response<~Excon::Response>:
|
21
|
+
#
|
22
|
+
# ==== See Also
|
23
|
+
# http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarms.html
|
24
|
+
#
|
25
|
+
|
26
|
+
def describe_alarms(options={})
|
27
|
+
if alarm_names = options.delete('AlarmNames')
|
28
|
+
options.merge!(AWS.indexed_param('AlarmNames.member.%d', [*alarm_names]))
|
29
|
+
end
|
30
|
+
request({
|
31
|
+
'Action' => 'DescribeAlarms',
|
32
|
+
:parser => Fog::Parsers::AWS::CloudWatch::DescribeAlarms.new
|
33
|
+
}.merge(options))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
class CloudWatch
|
4
|
+
class Real
|
5
|
+
|
6
|
+
require 'fog/aws/parsers/cloud_watch/describe_alarms_for_metric'
|
7
|
+
|
8
|
+
# Retrieves all alarms for a single metric
|
9
|
+
# ==== Options
|
10
|
+
# * Dimensions<~Array>: a list of dimensions to filter against
|
11
|
+
# Name : The name of the dimension
|
12
|
+
# Value : The value to filter against
|
13
|
+
# * MetricName<~String>: The name of the metric
|
14
|
+
# * Namespace<~String>: The namespace of the metric
|
15
|
+
# * Period<~Integer>: The period in seconds over which the statistic is applied
|
16
|
+
# * Statistics<~String>: The statistic for the metric
|
17
|
+
# * Unit<~String> The unit for the metric
|
18
|
+
#
|
19
|
+
# ==== Returns
|
20
|
+
# * response<~Excon::Response>:
|
21
|
+
#
|
22
|
+
# ==== See Also
|
23
|
+
# http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarms.html
|
24
|
+
#
|
25
|
+
|
26
|
+
def describe_alarms_for_metric(options)
|
27
|
+
if dimensions = options.delete('Dimensions')
|
28
|
+
options.merge!(AWS.indexed_param('Dimensions.member.%d.Name', dimensions.collect {|dimension| dimension['Name']}))
|
29
|
+
options.merge!(AWS.indexed_param('Dimensions.member.%d.Value', dimensions.collect {|dimension| dimension['Value']}))
|
30
|
+
end
|
31
|
+
request({
|
32
|
+
'Action' => 'DescribeAlarmsForMetric',
|
33
|
+
:parser => Fog::Parsers::AWS::CloudWatch::DescribeAlarmsForMetric.new
|
34
|
+
}.merge(options))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
class CloudWatch
|
4
|
+
class Real
|
5
|
+
|
6
|
+
require 'fog/aws/parsers/cloud_watch/disable_alarm_actions'
|
7
|
+
|
8
|
+
# Disables actions for the specified alarms
|
9
|
+
# ==== Options
|
10
|
+
# * AlarmNames<~Array>: The names of the alarms to disable actions for
|
11
|
+
#
|
12
|
+
# ==== Returns
|
13
|
+
# * response<~Excon::Response>:
|
14
|
+
#
|
15
|
+
# ==== See Also
|
16
|
+
# http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/API_DisableAlarmActions.html
|
17
|
+
#
|
18
|
+
|
19
|
+
def disable_alarm_actions(alarm_names)
|
20
|
+
options = {}
|
21
|
+
options.merge!(AWS.indexed_param('AlarmNames.member.%d', [*alarm_names]))
|
22
|
+
request({
|
23
|
+
'Action' => 'DisableAlarmActions',
|
24
|
+
:parser => Fog::Parsers::AWS::CloudWatch::DisableAlarmActions.new
|
25
|
+
}.merge(options))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
class CloudWatch
|
4
|
+
class Real
|
5
|
+
|
6
|
+
require 'fog/aws/parsers/cloud_watch/enable_alarm_actions'
|
7
|
+
|
8
|
+
# Enables actions for the specified alarms
|
9
|
+
# ==== Options
|
10
|
+
# * AlarmNames<~Array>: The names of the alarms to enable actions for
|
11
|
+
#
|
12
|
+
# ==== Returns
|
13
|
+
# * response<~Excon::Response>:
|
14
|
+
#
|
15
|
+
# ==== See Also
|
16
|
+
# http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/API_EnableAlarmActions.html
|
17
|
+
#
|
18
|
+
|
19
|
+
def enable_alarm_actions(alarm_names)
|
20
|
+
options = {}
|
21
|
+
options.merge!(AWS.indexed_param('AlarmNames.member.%d', [*alarm_names]))
|
22
|
+
request({
|
23
|
+
'Action' => 'EnableAlarmActions',
|
24
|
+
:parser => Fog::Parsers::AWS::CloudWatch::EnableAlarmActions.new
|
25
|
+
}.merge(options))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
class CloudWatch
|
4
|
+
class Real
|
5
|
+
require 'fog/aws/parsers/cloud_watch/put_metric_alarm'
|
6
|
+
|
7
|
+
# Creates or updates an alarm and associates it with the specified Amazon CloudWatch metric
|
8
|
+
# ==== Options
|
9
|
+
# * ActionsEnabled<~Boolean>: Indicates whether or not actions should be executed during any changes to the alarm's state
|
10
|
+
# * AlarmActions<~Array>: A list of actions to execute
|
11
|
+
# * AlarmDescription<~String>: The description for the alarm
|
12
|
+
# * AlarmName<~String> The unique name for the alarm
|
13
|
+
# * ComparisonOperator<~String>: The arithmetic operation to use for comparison
|
14
|
+
# * Dimensions<~Array>: a list of dimensions to filter against,
|
15
|
+
# Name : The name of the dimension
|
16
|
+
# Value : The value to filter against
|
17
|
+
# * EvaluationPeriods<~Integer>: The number of periods over which data is compared to the specified threshold
|
18
|
+
# * InsufficientDataActions<~Array>: A list of actions to execute
|
19
|
+
# * MetricName<~String>: The name for the alarm's associated metric
|
20
|
+
# * Namespace<~String>: The namespace for the alarm's associated metric
|
21
|
+
# * OKActions<~Array>: A list of actions to execute
|
22
|
+
# * Period<~Integer>: The period in seconds over which the specified statistic is applied
|
23
|
+
# * Statistic<~String>: The statistic to apply to the alarm's associated metric
|
24
|
+
# * Threshold<~Double>: The value against which the specified statistic is compared
|
25
|
+
# * Unit<~String>: The unit for the alarm's associated metric
|
26
|
+
#
|
27
|
+
# ==== Returns
|
28
|
+
# * response<~Excon::Response>:
|
29
|
+
#
|
30
|
+
# ==== See Also
|
31
|
+
# http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/API_PutMetricAlarm.html
|
32
|
+
#
|
33
|
+
def put_metric_alarm(options)
|
34
|
+
if dimensions = options.delete('Dimensions')
|
35
|
+
options.merge!(AWS.indexed_param('Dimensions.member.%d.Name', dimensions.collect {|dimension| dimension['Name']}))
|
36
|
+
options.merge!(AWS.indexed_param('Dimensions.member.%d.Value', dimensions.collect {|dimension| dimension['Value']}))
|
37
|
+
end
|
38
|
+
if alarm_actions = options.delete('AlarmActions')
|
39
|
+
options.merge!(AWS.indexed_param('AlarmActions.member.%d', [*alarm_actions]))
|
40
|
+
end
|
41
|
+
if insufficient_data_actions = options.delete('InsufficientDataActions')
|
42
|
+
options.merge!(AWS.indexed_param('InsufficientDataActions.member.%d', [*insufficient_data_actions]))
|
43
|
+
end
|
44
|
+
if ok_actions = options.delete('OKActions')
|
45
|
+
options.merge!(AWS.indexed_param('OKActions.member.%d', [*ok_actions]))
|
46
|
+
end
|
47
|
+
|
48
|
+
request({
|
49
|
+
'Action' => 'PutMetricAlarm',
|
50
|
+
:parser => Fog::Parsers::AWS::CloudWatch::PutMetricAlarm.new
|
51
|
+
}.merge(options))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class Mock
|
56
|
+
require 'fog/aws/parsers/cloud_watch/put_metric_alarm'
|
57
|
+
|
58
|
+
# See: Fog::AWS::CloudWatch::Real.put_metric_alarm()
|
59
|
+
#
|
60
|
+
def put_metric_alarm(options)
|
61
|
+
supported_actions = [ "InsufficientDataActions", "OKActions", "AlarmActions" ]
|
62
|
+
found_actions = options.keys.select {|key| supported_actions.include? key }
|
63
|
+
if found_actions.empty?
|
64
|
+
raise Fog::Compute::AWS::Error.new("The request must contain at least one of #{supported_actions.join(", ")}'")
|
65
|
+
end
|
66
|
+
|
67
|
+
requirements = [ "AlarmName", "ComparisonOperator", "EvaluationPeriods", "Namespace", "Period", "Statistic", "Threshold" ]
|
68
|
+
requirements.each do |req|
|
69
|
+
unless options.has_key?(req)
|
70
|
+
raise Fog::Compute::AWS::Error.new("The request must contain a the parameter '%s'" % req)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
response = Excon::Response.new
|
75
|
+
response.status = 200
|
76
|
+
response.body = {
|
77
|
+
'requestId' => Fog::AWS::Mock.request_id
|
78
|
+
}
|
79
|
+
response
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
class CloudWatch
|
4
|
+
class Real
|
5
|
+
|
6
|
+
require 'fog/aws/parsers/cloud_watch/set_alarm_state'
|
7
|
+
|
8
|
+
# Temporarily sets the state of an alarm
|
9
|
+
# ==== Options
|
10
|
+
# * AlarmName<~String>: The names of the alarm
|
11
|
+
# * StateReason<~String>: The reason that this alarm is set to this specific state (in human-readable text format)
|
12
|
+
# * StateReasonData<~String>: The reason that this alarm is set to this specific state (in machine-readable JSON format)
|
13
|
+
# * StateValue<~String>: The value of the state
|
14
|
+
#
|
15
|
+
# ==== Returns
|
16
|
+
# * response<~Excon::Response>:
|
17
|
+
#
|
18
|
+
# ==== See Also
|
19
|
+
# http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/API_SetAlarmState.html
|
20
|
+
#
|
21
|
+
|
22
|
+
def set_alarm_state(options)
|
23
|
+
request({
|
24
|
+
'Action' => 'SetAlarmState',
|
25
|
+
:parser => Fog::Parsers::AWS::CloudWatch::SetAlarmState.new
|
26
|
+
}.merge(options))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -13,11 +13,23 @@ module Fog
|
|
13
13
|
# * 'SourceSecurityGroupName'<~String> - Name of security group to authorize
|
14
14
|
# * 'SourceSecurityGroupOwnerId'<~String> - Name of owner to authorize
|
15
15
|
# or
|
16
|
-
# * 'CidrIp' - CIDR range
|
17
|
-
# * 'FromPort' - Start of port range (or -1 for ICMP wildcard)
|
18
|
-
# * '
|
19
|
-
# * '
|
20
|
-
#
|
16
|
+
# * 'CidrIp'<~String> - CIDR range
|
17
|
+
# * 'FromPort'<~Integer> - Start of port range (or -1 for ICMP wildcard)
|
18
|
+
# * 'IpProtocol'<~String> - Ip protocol, must be in ['tcp', 'udp', 'icmp']
|
19
|
+
# * 'ToPort'<~Integer> - End of port range (or -1 for ICMP wildcard)
|
20
|
+
# or
|
21
|
+
# * 'IpPermissions'<~Array>:
|
22
|
+
# * permission<~Hash>:
|
23
|
+
# * 'FromPort'<~Integer> - Start of port range (or -1 for ICMP wildcard)
|
24
|
+
# * 'Groups'<~Array>:
|
25
|
+
# * group<~Hash>:
|
26
|
+
# * 'GroupName'<~String> - Name of security group to authorize
|
27
|
+
# * 'UserId'<~String> - Name of owner to authorize
|
28
|
+
# * 'IpProtocol'<~String> - Ip protocol, must be in ['tcp', 'udp', 'icmp']
|
29
|
+
# * 'IpRanges'<~Array>:
|
30
|
+
# * ip_range<~Hash>:
|
31
|
+
# * 'CidrIp'<~String> - CIDR range
|
32
|
+
# * 'ToPort'<~Integer> - End of port range (or -1 for ICMP wildcard)
|
21
33
|
#
|
22
34
|
# === Returns
|
23
35
|
# * response<~Excon::Response>:
|
@@ -28,10 +40,15 @@ module Fog
|
|
28
40
|
# {Amazon API Reference}[http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-AuthorizeSecurityGroupIngress.html]
|
29
41
|
def authorize_security_group_ingress(group_name, options = {})
|
30
42
|
if group_name.is_a?(Hash)
|
31
|
-
Fog::Logger.
|
43
|
+
Fog::Logger.deprecation("Fog::AWS::Compute#authorize_security_group_ingress now requires the 'group_name' parameter. Only specifying an options hash is now deprecated [light_black](#{caller.first})[/]")
|
32
44
|
options = group_name
|
33
|
-
group_name = options
|
45
|
+
group_name = options.delete('GroupName')
|
46
|
+
end
|
47
|
+
|
48
|
+
if ip_permissions = options.delete('IpPermissions')
|
49
|
+
options.merge!(indexed_ip_permissions_params(ip_permissions))
|
34
50
|
end
|
51
|
+
|
35
52
|
request({
|
36
53
|
'Action' => 'AuthorizeSecurityGroupIngress',
|
37
54
|
'GroupName' => group_name,
|
@@ -40,51 +57,69 @@ module Fog
|
|
40
57
|
}.merge!(options))
|
41
58
|
end
|
42
59
|
|
60
|
+
private
|
61
|
+
|
62
|
+
def indexed_ip_permissions_params(ip_permissions)
|
63
|
+
params = {}
|
64
|
+
ip_permissions.each_with_index do |permission, key_index|
|
65
|
+
key_index += 1
|
66
|
+
params[format('IpPermissions.%d.IpProtocol', key_index)] = permission['IpProtocol']
|
67
|
+
params[format('IpPermissions.%d.FromPort', key_index)] = permission['FromPort']
|
68
|
+
params[format('IpPermissions.%d.ToPort', key_index)] = permission['ToPort']
|
69
|
+
(permission['Groups'] || []).each_with_index do |group, group_index|
|
70
|
+
group_index += 1
|
71
|
+
params[format('IpPermissions.%d.Groups.%d.UserId', key_index, group_index)] = group['UserId']
|
72
|
+
params[format('IpPermissions.%d.Groups.%d.GroupName', key_index, group_index)] = group['GroupName']
|
73
|
+
params[format('IpPermissions.%d.Groups.%d.GroupId', key_index, group_index)] = group['GroupId']
|
74
|
+
end
|
75
|
+
(permission['IpRanges'] || []).each_with_index do |ip_range, range_index|
|
76
|
+
range_index += 1
|
77
|
+
params[format('IpPermissions.%d.IpRanges.%d.CidrIp', key_index, range_index)] = ip_range['CidrIp']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
params.reject {|k, v| v.nil? }
|
81
|
+
end
|
82
|
+
|
43
83
|
end
|
44
84
|
|
45
85
|
class Mock
|
46
86
|
|
47
87
|
def authorize_security_group_ingress(group_name, options = {})
|
48
88
|
if group_name.is_a?(Hash)
|
49
|
-
Fog::Logger.
|
89
|
+
Fog::Logger.deprecation("Fog::AWS::Compute#authorize_security_group_ingress now requires the 'group_name' parameter. Only specifying an options hash is now deprecated [light_black](#{caller.first})[/]")
|
50
90
|
options = group_name
|
51
|
-
group_name = options
|
91
|
+
group_name = options.delete('GroupName')
|
52
92
|
end
|
53
93
|
|
94
|
+
verify_permission_options(options)
|
95
|
+
|
54
96
|
response = Excon::Response.new
|
55
97
|
group = self.data[:security_groups][group_name]
|
56
98
|
|
57
99
|
if group
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
'
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
100
|
+
normalized_permissions = normalize_permissions(options)
|
101
|
+
|
102
|
+
normalized_permissions.each do |permission|
|
103
|
+
if matching_group_permission = find_matching_permission(group, permission)
|
104
|
+
if permission['groups'].any? {|pg| matching_group_permission['groups'].include?(pg) }
|
105
|
+
raise Fog::Compute::AWS::Error, "InvalidPermission.Duplicate => The permission '123' has already been authorized in the specified group"
|
106
|
+
end
|
107
|
+
|
108
|
+
if permission['ipRanges'].any? {|pr| matching_group_permission['ipRanges'].include?(pr) }
|
109
|
+
raise Fog::Compute::AWS::Error, "InvalidPermission.Duplicate => The permission '123' has already been authorized in the specified group"
|
110
|
+
end
|
68
111
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
'
|
74
|
-
'
|
75
|
-
|
76
|
-
|
77
|
-
group['ipPermissions'] << {
|
78
|
-
'groups' => [],
|
79
|
-
'fromPort' => options['FromPort'],
|
80
|
-
'ipRanges' => [],
|
81
|
-
'ipProtocol' => options['IpProtocol'],
|
82
|
-
'toPort' => options['ToPort']
|
83
|
-
}
|
84
|
-
if options['CidrIp']
|
85
|
-
group['ipPermissions'].last['ipRanges'] << { 'cidrIp' => options['CidrIp'] }
|
112
|
+
end
|
113
|
+
|
114
|
+
normalized_permissions.each do |permission|
|
115
|
+
if matching_group_permission = find_matching_permission(group, permission)
|
116
|
+
matching_group_permission['groups'] += permission['groups']
|
117
|
+
matching_group_permission['ipRanges'] += permission['ipRanges']
|
118
|
+
else
|
119
|
+
group['ipPermissions'] << permission
|
86
120
|
end
|
87
121
|
end
|
122
|
+
|
88
123
|
response.status = 200
|
89
124
|
response.body = {
|
90
125
|
'requestId' => Fog::AWS::Mock.request_id,
|
@@ -96,6 +131,76 @@ module Fog
|
|
96
131
|
end
|
97
132
|
end
|
98
133
|
|
134
|
+
private
|
135
|
+
|
136
|
+
def verify_permission_options(options)
|
137
|
+
if options.empty?
|
138
|
+
raise Fog::Compute::AWS::Error.new("InvalidRequest => The request received was invalid.")
|
139
|
+
end
|
140
|
+
if options['IpProtocol'] && !['tcp', 'udp', 'icmp'].include?(options['IpProtocol'])
|
141
|
+
raise Fog::Compute::AWS::Error.new("InvalidPermission.Malformed => Unsupported IP protocol \"#{options['IpProtocol']}\" - supported: [tcp, udp, icmp]")
|
142
|
+
end
|
143
|
+
if options['IpProtocol'] && (!options['FromPort'] || !options['ToPort'])
|
144
|
+
raise Fog::Compute::AWS::Error.new("InvalidPermission.Malformed => TCP/UDP port (-1) out of range")
|
145
|
+
end
|
146
|
+
if options.has_key?('IpPermissions')
|
147
|
+
if !options['IpPermissions'].is_a?(Array) || options['IpPermissions'].empty?
|
148
|
+
raise Fog::Compute::AWS::Error.new("InvalidRequest => The request received was invalid.")
|
149
|
+
end
|
150
|
+
options['IpPermissions'].each {|p| verify_permission_options(p) }
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def normalize_permissions(options)
|
155
|
+
normalized_permissions = []
|
156
|
+
|
157
|
+
if options['SourceSecurityGroupName']
|
158
|
+
['tcp', 'udp'].each do |protocol|
|
159
|
+
normalized_permissions << {
|
160
|
+
'ipProtocol' => protocol,
|
161
|
+
'fromPort' => 1,
|
162
|
+
'toPort' => 65535,
|
163
|
+
'groups' => [{'groupName' => options['SourceSecurityGroupName'], 'userId' => options['SourceSecurityGroupOwnerId'] || self.data[:owner_id]}],
|
164
|
+
'ipRanges' => []
|
165
|
+
}
|
166
|
+
end
|
167
|
+
normalized_permissions << {
|
168
|
+
'ipProtocol' => 'icmp',
|
169
|
+
'fromPort' => -1,
|
170
|
+
'toPort' => -1,
|
171
|
+
'groups' => [{'groupName' => options['SourceSecurityGroupName'], 'userId' => options['SourceSecurityGroupOwnerId'] || self.data[:owner_id]}],
|
172
|
+
'ipRanges' => []
|
173
|
+
}
|
174
|
+
elsif options['CidrIp']
|
175
|
+
normalized_permissions << {
|
176
|
+
'ipProtocol' => options['IpProtocol'],
|
177
|
+
'fromPort' => Integer(options['FromPort']),
|
178
|
+
'toPort' => Integer(options['ToPort']),
|
179
|
+
'groups' => [],
|
180
|
+
'ipRanges' => [{'cidrIp' => options['CidrIp']}]
|
181
|
+
}
|
182
|
+
elsif options['IpPermissions']
|
183
|
+
options['IpPermissions'].each do |permission|
|
184
|
+
normalized_permissions << {
|
185
|
+
'ipProtocol' => permission['IpProtocol'],
|
186
|
+
'fromPort' => Integer(permission['FromPort']),
|
187
|
+
'toPort' => Integer(permission['ToPort']),
|
188
|
+
'groups' => (permission['Groups'] || []).map {|g| {'groupName' => g['GroupName'], 'userId' => g['UserId'] || self.data[:owner_id]} },
|
189
|
+
'ipRanges' => (permission['IpRanges'] || []).map {|r| { 'cidrIp' => r['CidrIp'] } }
|
190
|
+
}
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
normalized_permissions
|
195
|
+
end
|
196
|
+
|
197
|
+
def find_matching_permission(group, permission)
|
198
|
+
group['ipPermissions'].detect {|group_permission|
|
199
|
+
permission['ipProtocol'] == group_permission['ipProtocol'] &&
|
200
|
+
permission['fromPort'] == group_permission['fromPort'] &&
|
201
|
+
permission['toPort'] == group_permission['toPort'] }
|
202
|
+
end
|
203
|
+
|
99
204
|
end
|
100
205
|
end
|
101
206
|
end
|