fog 1.0.0 → 1.1.0
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/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
|