mirror of
https://github.com/fog/fog-aws.git
synced 2022-11-09 13:50:52 -05:00
100 lines
4.7 KiB
Ruby
100 lines
4.7 KiB
Ruby
|
module Fog
|
||
|
module AWS
|
||
|
class Elasticache
|
||
|
class Real
|
||
|
require 'fog/aws/parsers/elasticache/single_cache_cluster'
|
||
|
|
||
|
# Modifies an existing cache cluster
|
||
|
# Returns a cache cluster description
|
||
|
#
|
||
|
# === Required Parameters
|
||
|
# * id <~String> - The ID of the existing cluster to be modified
|
||
|
# === Optional Parameters
|
||
|
# * options <~Hash> - All optional parameters should be set in this Hash:
|
||
|
# * :apply_immediately <~TrueFalseClass> - whether to apply changes now
|
||
|
# * :auto_minor_version_upgrade <~TrueFalseClass>
|
||
|
# * :num_nodes <~Integer> - The number of nodes in the Cluster
|
||
|
# * :nodes_to_remove <~Array> - Array of node IDs to delete
|
||
|
# * :security_group_names <~Array> - Array of Elasticache::SecurityGroup names
|
||
|
# * :parameter_group_name <~String> - Name of the Cluster's ParameterGroup
|
||
|
# * :engine_version <~String> - The Cluster's caching software version
|
||
|
# * :notification_topic_arn <~String> - Amazon SNS Resource Name
|
||
|
# * :notification_topic_status <~String> - Amazon SNS Topic status
|
||
|
# * :preferred_maintenance_window <~String>
|
||
|
# === Returns
|
||
|
# * response <~Excon::Response>:
|
||
|
# * body <~Hash>
|
||
|
def modify_cache_cluster(id, options = {})
|
||
|
# Construct Cache Security Group parameters in the format:
|
||
|
# CacheSecurityGroupNames.member.N => "security_group_name"
|
||
|
group_names = options[:security_group_names] || []
|
||
|
sec_group_params = group_names.reduce({}) do |group_hash, name|
|
||
|
index = group_names.index(name) + 1
|
||
|
group_hash["CacheSecurityGroupNames.member.#{index}"] = name
|
||
|
group_hash
|
||
|
end
|
||
|
# Construct CacheNodeIdsToRemove parameters in the format:
|
||
|
# CacheNodeIdsToRemove.member.N => "node_id"
|
||
|
node_ids = options[:nodes_to_remove] || []
|
||
|
node_id_params = node_ids.reduce({}) do |node_hash, node_id|
|
||
|
index = node_ids.index(node_id) + 1
|
||
|
node_hash["CacheNodeIdsToRemove.member.#{index}"] = node_id
|
||
|
node_hash
|
||
|
end
|
||
|
# Merge the Cache Security Group parameters with the normal options
|
||
|
request(node_id_params.merge(sec_group_params.merge(
|
||
|
'Action' => 'ModifyCacheCluster',
|
||
|
'CacheClusterId' => id.strip,
|
||
|
'ApplyImmediately' => options[:apply_immediately],
|
||
|
'NumCacheNodes' => options[:num_nodes],
|
||
|
'AutoMinorVersionUpgrade' => options[:auto_minor_version_upgrade],
|
||
|
'CacheParameterGroupName' => options[:parameter_group_name],
|
||
|
'EngineVersion' => options[:engine_version],
|
||
|
'NotificationTopicArn' => options[:notification_topic_arn],
|
||
|
'NotificationTopicStatus' => options[:notification_topic_status],
|
||
|
'PreferredMaintenanceWindow' => options[:preferred_maintenance_window],
|
||
|
:parser => Fog::Parsers::AWS::Elasticache::SingleCacheCluster.new
|
||
|
)))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Mock
|
||
|
def modify_cache_cluster(id, options = {})
|
||
|
response = Excon::Response.new
|
||
|
cluster = self.data[:clusters][id]
|
||
|
pending_values = Hash.new
|
||
|
# For any given option, update the cluster's corresponding value
|
||
|
{ :auto_minor_version_upgrade => 'AutoMinorVersionUpgrade',
|
||
|
:preferred_maintenance_window => 'PreferredMaintenanceWindow',
|
||
|
:engine_version => 'EngineVersion',
|
||
|
:num_nodes => 'NumCacheNodes',
|
||
|
}.each do |option, cluster_key|
|
||
|
if options[option] != nil
|
||
|
cluster[cluster_key] = options[option].to_s
|
||
|
pending_values[cluster_key] = options[option]
|
||
|
end
|
||
|
end
|
||
|
cache['CacheParameterGroup'] = {
|
||
|
'CacheParameterGroupName' => options[:parameter_group_name]
|
||
|
} if options[:parameter_group_name]
|
||
|
if options[:num_nodes] || options[:engine_version]
|
||
|
cluster['CacheNodes'] =
|
||
|
create_cache_nodes(cluster['CacheClusterId'], options[:num_nodes])
|
||
|
cluster['NumCacheNodes'] = cluster['CacheNodes'].size
|
||
|
end
|
||
|
if options[:nodes_to_remove]
|
||
|
pending_values['CacheNodeId'] = options[:nodes_to_remove].join(',')
|
||
|
end
|
||
|
response.body = {
|
||
|
'CacheCluster' => cluster.merge({
|
||
|
'PendingModifiedValues' => pending_values
|
||
|
}),
|
||
|
'ResponseMetadata' => { 'RequestId' => Fog::AWS::Mock.request_id }
|
||
|
}
|
||
|
response
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|