#
# Copyright (c) 2009 RightScale Inc
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
module RightAws
class RdsInterface < RightAwsBase
include RightAwsBaseInterface
API_VERSION = "2010-07-28"
DEFAULT_HOST = 'rds.amazonaws.com'
DEFAULT_PORT = 443
DEFAULT_PROTOCOL = 'https'
DEFAULT_PATH = '/'
DEFAULT_INSTANCE_CLASS = 'db.m1.small'
INSTANCE_CLASSES = ['db.m1.small', 'db.m1.large', 'db.m1.xlarge', 'db.m2.2xlarge', 'db.m2.2xlarge', 'db.m2.4xlarge']
@@bench = AwsBenchmarkingBlock.new
def self.bench_xml
@@bench.xml
end
def self.bench_service
@@bench.service
end
# Create a new handle to a RDS account. All handles share the same per process or per thread
# HTTP connection to RDS. Each handle is for a specific account. The params have the
# following options:
# * :endpoint_url a fully qualified url to Amazon API endpoint (this overwrites: :server, :port, :service, :protocol). Example: 'https://rds.amazonaws.com'
# * :server: RDS service host, default: DEFAULT_HOST
# * :port: RDS service port, default: DEFAULT_PORT
# * :protocol: 'http' or 'https', default: DEFAULT_PROTOCOL
# * :logger: for log messages, default: RAILS_DEFAULT_LOGGER else STDOUT
#
# rds = RightAws::RdsInterface.new('xxxxxxxxxxxxxxxxxxxxx','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
# {:logger => Logger.new('/tmp/x.log')}) #=> #
#
def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
init({ :name => 'RDS',
:default_host => ENV['RDS_URL'] ? URI.parse(ENV['RDS_URL']).host : DEFAULT_HOST,
:default_port => ENV['RDS_URL'] ? URI.parse(ENV['RDS_URL']).port : DEFAULT_PORT,
:default_service => ENV['RDS_URL'] ? URI.parse(ENV['RDS_URL']).path : DEFAULT_PATH,
:default_protocol => ENV['RDS_URL'] ? URI.parse(ENV['RDS_URL']).scheme : DEFAULT_PROTOCOL,
:default_api_version => ENV['RDS_API_VERSION'] || API_VERSION },
aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY'],
params)
end
#-----------------------------------------------------------------
# Requests
#-----------------------------------------------------------------
# Generates request hash for REST API.
def generate_request(action, params={}) #:nodoc:
generate_request_impl(:get, action, params )
end
# Sends request to Amazon and parses the response.
# Raises AwsError if any banana happened.
def request_info(request, parser, &block) # :nodoc:
request_info_impl(:rds_connection, @@bench, request, parser, &block)
end
# Incrementally lists something.
def incrementally_list_items(action, parser_class, params={}, &block) # :nodoc:
params = params.dup
params['MaxRecords'] = params.delete(:max_records) if params[:max_records]
params['Marker'] = params.delete(:marker) if params[:marker]
last_response = nil
loop do
link = generate_request(action, params)
last_response = request_info( link, parser_class.new(:logger => @logger))
params['Marker'] = last_response[:marker]
break unless block && block.call(last_response) && !last_response[:marker].right_blank?
end
last_response
end
#-----------------------------------------------------------------
# API Calls:
#-----------------------------------------------------------------
# --------------------------------------------
# DB Instances
# --------------------------------------------
# List DB instances.
#
# Optional params: +:aws_id+, +:max_records+, +:marker+
#
# # Get a list of DB instances. The response is an +Array+ of instances.
# rds.describe_db_instances #=>
# [{:instance_class=>"db.m1.small",
# :status=>"creating",
# :backup_retention_period=>1,
# :read_replica_db_instance_identifiers=>["kd-delete-me-01-replica-01"],
# :master_username=>"username",
# :preferred_maintenance_window=>"sun:05:00-sun:09:00",
# :db_parameter_group=>{:status=>"in-sync", :name=>"default.mysql5.1"},
# :multi_az=>true,
# :engine=>"mysql",
# :auto_minor_version_upgrade=>false,
# :allocated_storage=>25,
# :availability_zone=>"us-east-1d",
# :aws_id=>"kd-delete-me-01",
# :preferred_backup_window=>"03:00-05:00",
# :engine_version=>"5.1.50",
# :pending_modified_values=>{:master_user_password=>"****"},
# :db_security_groups=>[{:status=>"active", :name=>"default"}]}]
#
# # Retrieve a custom DB instance.
# # The response is an +Array+ with a single instance record.
# rds.describe_db_instances("kd-test-n3")
#
# # Incrementally a list DB instances. Every response part is a +Hash+.
# rds.describe_db_instances(:max_records => 30) do |x|
# puts x.inspect #=>
# {:db_instances=>
# [{:instance_class=>"db.m1.small",
# :status=>"creating",
# :backup_retention_period=>1,
# :read_replica_db_instance_identifiers=>["kd-delete-me-01-replica-01"],
# :master_username=>"username",
# :preferred_maintenance_window=>"sun:05:00-sun:09:00",
# :db_parameter_group=>{:status=>"in-sync", :name=>"default.mysql5.1"},
# :multi_az=>true,
# :engine=>"mysql",
# :auto_minor_version_upgrade=>false,
# :allocated_storage=>25,
# :availability_zone=>"us-east-1d",
# :aws_id=>"kd-delete-me-01",
# :preferred_backup_window=>"03:00-05:00",
# :engine_version=>"5.1.50",
# :pending_modified_values=>{:master_user_password=>"****"},
# :db_security_groups=>[{:status=>"active", :name=>"default"}]}]}
# true
# end
#
def describe_db_instances(*params, &block)
item, params = AwsUtils::split_items_and_params(params)
params = params.dup
params['DBInstanceIdentifier'] = item if item
result = []
incrementally_list_items('DescribeDBInstances', DescribeDbInstancesParser, params) do |response|
result += response[:db_instances]
block ? block.call(response) : true
end
result
end
# Create a new RDS instance of the type and size specified by you. The default storage engine for RDS Instances is InnoDB.
#
# Mandatory arguments: +aws_id+, +master_username+, +master_user_password+
# Optional params: +:allocated_storage+ (25 by def), +:instance_class+, +:engine+ ('MySQL' by def),
# +:endpoint_port+, +:db_name+, +:db_security_groups+, +:db_parameter_group+, +:availability_zone+, +:preferred_maintenance_window+
# +:backup_retention_period+, +:preferred_backup_window+, +:multi_az+, +:engine_version+, +:auto_minor_version_upgrade+
#
# rds.create_db_instance('kd-delete-me-01', 'username', 'password',
# :db_instance_class => 'db.m1.small',
# :multi_az => true,
# :auto_minor_version_upgrade => false ) #=>
# {:instance_class=>"db.m1.small",
# :multi_az=>true,
# :status=>"creating",
# :backup_retention_period=>1,
# :read_replica_db_instance_identifiers=>[],
# :master_username=>"username",
# :preferred_maintenance_window=>"sun:05:00-sun:09:00",
# :auto_minor_version_upgrade=>false,
# :db_parameter_group=>{:status=>"in-sync", :name=>"default.mysql5.1"},
# :engine=>"mysql",
# :allocated_storage=>25,
# :aws_id=>"kd-delete-me-01",
# :preferred_backup_window=>"03:00-05:00",
# :engine_version=>"5.1.50",
# :pending_modified_values=>{:master_user_password=>"****"},
# :db_security_groups=>[{:status=>"active", :name=>"default"}]}
#
def create_db_instance(aws_id, master_username, master_user_password, params={})
request_hash = {}
# Mandatory
request_hash['DBInstanceIdentifier'] = aws_id
request_hash['MasterUsername'] = master_username
request_hash['MasterUserPassword'] = master_user_password
# Mandatory with default values
request_hash['DBInstanceClass'] = params[:instance_class].right_blank? ? DEFAULT_INSTANCE_CLASS : params[:instance_class].to_s
request_hash['AllocatedStorage'] = params[:allocated_storage].right_blank? ? 25 : params[:allocated_storage]
request_hash['Engine'] = params[:engine].right_blank? ? 'mysql' : params[:engine]
# Optional
request_hash['Port'] = params[:endpoint_port] unless params[:endpoint_port].right_blank?
request_hash['DBName'] = params[:db_name] unless params[:db_name].right_blank?
request_hash['AvailabilityZone'] = params[:availability_zone] unless params[:availability_zone].right_blank?
request_hash['MultiAZ'] = params[:multi_az].to_s unless params[:multi_az].nil?
request_hash['PreferredMaintenanceWindow'] = params[:preferred_maintenance_window] unless params[:preferred_maintenance_window].right_blank?
request_hash['BackupRetentionPeriod'] = params[:backup_retention_period] unless params[:backup_retention_period].right_blank?
request_hash['PreferredBackupWindow'] = params[:preferred_backup_window] unless params[:preferred_backup_window].right_blank?
request_hash['DBParameterGroupName'] = params[:db_parameter_group] unless params[:db_parameter_group].right_blank?
request_hash['EngineVersion'] = params[:engine_version] unless params[:engine_version].right_blank?
request_hash['AutoMinorVersionUpgrade'] = params[:auto_minor_version_upgrade].to_s unless params[:auto_minor_version_upgrade].nil?
request_hash.merge!(amazonize_list('DBSecurityGroups.member', params[:db_security_groups]))
link = generate_request('CreateDBInstance', request_hash)
request_info(link, DescribeDbInstancesParser.new(:logger => @logger))[:db_instances].first
end
# Modify a DB instance.
#
# Mandatory arguments: +aws_id+.
# Optional params: +:master_user_password+, +:instance_class+, +:db_security_groups+,
# +:db_parameter_group+, +:preferred_maintenance_window+, +:allocated_storage+, +:apply_immediately+,
# +:backup_retention_period+, +:preferred_backup_window+, +:multi_az+, +:engine_version+,
# +:auto_minor_version_upgrade+, +:allow_major_version_upgrade+
#
# rds.modify_db_instance('kd-delete-me-01',
# :master_user_password => 'newpassword',
# :instance_class => 'db.m1.large',
# :multi_az => false,
# :allocated_storage => 30,
# :allow_major_version_upgrade => true,
# :auto_minor_version_upgrade => true,
# :preferred_maintenance_window => 'sun:06:00-sun:10:00',
# :preferred_backup_window => '02:00-04:00',
# :apply_immediately => true,
# :backup_retention_period => 2) #=>
# {:engine_version=>"5.1.50",
# :aws_id=>"kd-delete-me-01",
# :multi_az=>true,
# :status=>"available",
# :read_replica_db_instance_identifiers=>[],
# :availability_zone=>"us-east-1d",
# :auto_minor_version_upgrade=>true,
# :master_username=>"username",
# :preferred_maintenance_window=>"sun:06:00-sun:10:00",
# :db_parameter_group=>{:status=>"in-sync", :name=>"default.mysql5.1"},
# :create_time=>"2010-11-17T10:21:59.720Z",
# :preferred_backup_window=>"02:00-04:00",
# :engine=>"mysql",
# :db_security_groups=>[{:status=>"active", :name=>"default"}],
# :endpoint_address=>"kd-delete-me-01.chxspydgchoo.us-east-1.rds.amazonaws.com",
# :instance_class=>"db.m1.small",
# :latest_restorable_time=>"2010-11-17T10:27:17.089Z",
# :backup_retention_period=>2,
# :pending_modified_values=>
# {:multi_az=>false, :master_user_password=>"****", :allocated_storage=>30, :instance_class=>"db.m1.large"},
# :allocated_storage=>25}
#
def modify_db_instance(aws_id, params={})
request_hash = {}
# Mandatory
request_hash['DBInstanceIdentifier'] = aws_id
# Optional
request_hash['MasterUserPassword'] = params[:master_user_password] unless params[:master_user_password].right_blank?
request_hash['DBInstanceClass'] = params[:instance_class].to_s.capitalize unless params[:instance_class].right_blank?
request_hash['PreferredMaintenanceWindow'] = params[:preferred_maintenance_window] unless params[:preferred_maintenance_window].right_blank?
request_hash['BackupRetentionPeriod'] = params[:backup_retention_period] unless params[:backup_retention_period].right_blank?
request_hash['PreferredBackupWindow'] = params[:preferred_backup_window] unless params[:preferred_backup_window].right_blank?
request_hash['AllocatedStorage'] = params[:allocated_storage] unless params[:allocated_storage].right_blank?
request_hash['MultiAZ'] = params[:multi_az].to_s unless params[:multi_az].nil?
request_hash['EngineVersion'] = params[:engine_version] unless params[:engine_version].right_blank?
request_hash['AutoMinorVersionUpgrade'] = params[:auto_minor_version_upgrade].to_s unless params[:auto_minor_version_upgrade].nil?
request_hash['AllowMajorVersionUpgrade'] = params[:allow_major_version_upgrade].to_s unless params[:allow_major_version_upgrade].nil?
request_hash['ApplyImmediately'] = params[:apply_immediately].to_s unless params[:apply_immediately].right_blank?
request_hash.merge!(amazonize_list('DBSecurityGroups.member', params[:db_security_groups]))
request_hash['DBParameterGroupName'] = params[:db_parameter_group] unless params[:db_parameter_group].right_blank?
link = generate_request('ModifyDBInstance', request_hash)
request_info(link, DescribeDbInstancesParser.new(:logger => @logger))[:db_instances].first
end
# Reboot Db instance.
#
# rds.reboot_db_instance('kd-my-awesome-db') #=>
# {:status=>"rebooting",
# :pending_modified_values=>{},
# :allocated_storage=>42,
# :master_username=>"kd",
# :db_security_groups=>[],
# :instance_class=>"Medium",
# :availability_zone=>"us-east-1a",
# :aws_id=>"kd-my-awesome-db",
# :create_time=>"2009-08-28T08:34:21.858Z",
# :engine=>"MySQL5.1",
# :preferred_maintenance_window=>"Sun:05:00-Sun:09:00"}
#
def reboot_db_instance(aws_id, params={})
params = params.dup
params['DBInstanceIdentifier'] = aws_id
link = generate_request('RebootDBInstance', params)
request_info(link, DescribeDbInstancesParser.new(:logger => @logger))[:db_instances].first
end
# Delete a DB instance
#
# Mandatory arguments: aws_id
# Optional params: :skip_final_snapshot ('false' by def),
# :snapshot_aws_id ('{instance_aws_id}-final-snapshot-YYYYMMDDHHMMSS')
#
# rds.delete_db_instance('my-awesome-db-g2') #=> true
#
def delete_db_instance(aws_id, params={})
request_hash = {}
request_hash['DBInstanceIdentifier'] = aws_id
request_hash['SkipFinalSnapshot'] = params.has_key?(:skip_final_snapshot) ? params[:skip_final_snapshot].to_s : 'false'
if request_hash['SkipFinalSnapshot'] == 'false' && params[:snapshot_aws_id].right_blank?
params = params.dup
params[:snapshot_aws_id] = "#{aws_id}-final-snapshot-#{Time.now.utc.strftime('%Y%m%d%H%M%S')}"
end
request_hash['FinalDBSnapshotIdentifier'] = params[:snapshot_aws_id] unless params[:snapshot_aws_id].right_blank?
link = generate_request('DeleteDBInstance', request_hash)
request_info(link, DescribeDbInstancesParser.new(:logger => @logger))[:db_instances].first
end
# --------------------------------------------
# DB SecurityGroups
# --------------------------------------------
#
# rds.describe_db_security_groups #=>
# [{:owner_id=>"82...25",
# :description=>"Default",
# :ec2_security_groups=>[],
# :ip_ranges=>[],
# :name=>"Default"},
# {:owner_id=>"82...25",
# :description=>"kd",
# :ec2_security_groups=>[],
# :ip_ranges=>[],
# :name=>"kd2"},
# {:owner_id=>"82...25",
# :description=>"kd",
# :ec2_security_groups=>
# [{:status=>"Authorized", :owner_id=>"82...23", :name=>"default"},
# {:status=>"Authorized", :owner_id=>"82...24", :name=>"default1"},
# {:status=>"Authorized", :owner_id=>"82...25", :name=>"default"},
# {:status=>"Authorized", :owner_id=>"82...26", :name=>"default"},
# {:status=>"Authorized", :owner_id=>"82...26", :name=>"default1"},
# {:status=>"Authorized", :owner_id=>"82...29", :name=>"default22"}],
# :ip_ranges=>
# [{:status=>"Authorized", :cidrip=>"127.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"128.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"129.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"130.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"131.0.0.1/8"}],
# :name=>"kd3"}]
#
# # get a custom group
# rds.describe_db_security_groups('kd3')
#
def describe_db_security_groups(*db_security_group_name, &block)
items, params = AwsUtils::split_items_and_params(db_security_group_name)
params['DBSecurityGroupName'] = items.first unless items.right_blank?
result = []
incrementally_list_items('DescribeDBSecurityGroups', DescribeDbSecurityGroupsParser, params) do |response|
result += response[:db_security_groups]
block ? block.call(response) : true
end
result
end
# Create a database security group so that ingress to an RDS Instance can be controlled.
# A new security group cannot have the same name as an existing group.
#
# ds.create_db_security_group('kd3', 'kd') #=>
# {:ec2_security_groups=>[],
# :description=>"kd",
# :ip_ranges=>[],
# :name=>"kd3",
# :owner_id=>"82...25"}
#
def create_db_security_group(db_security_group_name, db_security_group_description)
link = generate_request('CreateDBSecurityGroup', 'DBSecurityGroupName' => db_security_group_name,
'DBSecurityGroupDescription' => db_security_group_description)
request_info(link, DescribeDbSecurityGroupsParser.new(:logger => @logger))[:db_security_groups].first
end
def modify_db_security_group_ingress(action, db_security_group_name, params={}) # :nodoc:
request_hash = { 'DBSecurityGroupName' => db_security_group_name}
request_hash['CIDRIP'] = params[:cidrip] unless params[:cidrip].right_blank?
request_hash['EC2SecurityGroupName'] = params[:ec2_security_group_name] unless params[:ec2_security_group_name].right_blank?
request_hash['EC2SecurityGroupOwnerId'] = params[:ec2_security_group_owner] unless params[:ec2_security_group_owner].right_blank?
link = generate_request(action, request_hash)
request_info(link, DescribeDbSecurityGroupsParser.new(:logger => @logger))[:db_security_groups].first
end
# Authorize an ingress. Params: +:cidrip+ or (+:ec2_security_group_name+ and +:ec2_security_group_owner+)
#
# rds.authorize_db_security_group_ingress('kd3', :cidrip => '131.0.0.1/8')
# {:owner_id=>"82...25",
# :ec2_security_groups=>[],
# :description=>"kd",
# :ip_ranges=>
# [{:status=>"Authorized", :cidrip=>"127.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"128.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"129.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"130.0.0.1/8"},
# {:status=>"Authorizing", :cidrip=>"131.0.0.1/8"}],
# :name=>"kd3"}
#
# rds.authorize_db_security_group_ingress('kd3',:ec2_security_group_owner => '82...27',
# :ec2_security_group_name => 'default') #=>
# {:owner_id=>"82...25",
# :ec2_security_groups=>
# [{:status=>"Authorized", :owner_id=>"82...25", :name=>"g1"},
# {:status=>"Authorized", :owner_id=>"82...26", :name=>"g2"},
# {:status=>"Authorizing", :owner_id=>"82...27", :name=>"default"}],
# :ip_ranges=>
# [{:status=>"Authorized", :cidrip=>"127.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"128.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"129.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"130.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"131.0.0.1/8"}],
# :name=>"kd3"}
#
def authorize_db_security_group_ingress(db_security_group_name, params={})
modify_db_security_group_ingress('AuthorizeDBSecurityGroupIngress', db_security_group_name, params)
end
# Revoke an ingress.
# Optional params: +:cidrip+ or (+:ec2_security_group_name+ and +:ec2_security_group_owner+)
#
# rds.revoke_db_security_group_ingress('kd3', :ec2_security_group_owner => '82...25',
# :ec2_security_group_name => 'default') #=>
# {:owner_id=>"82...25",
# :ec2_security_groups=>
# [{:status=>"Revoking", :owner_id=>"826693181925", :name=>"default"}],
# :name=>"kd3",
# :description=>"kd",
# :ip_ranges=>
# [{:status=>"Authorized", :cidrip=>"127.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"128.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"129.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"130.0.0.1/8"},
# {:status=>"Authorized", :cidrip=>"131.0.0.1/8"}]}
#
def revoke_db_security_group_ingress(db_security_group_name, params={})
modify_db_security_group_ingress('RevokeDBSecurityGroupIngress', db_security_group_name, params)
end
# Delete a database security group. Database security group must not be associated with any
# RDS Instances.
#
# rds.delete_db_security_group('kd3') #=> true
#
def delete_db_security_group(db_security_group_name)
link = generate_request('DeleteDBSecurityGroup', 'DBSecurityGroupName' => db_security_group_name)
request_info(link, RightHttp2xxParser.new(:logger => @logger))
end
# --------------------------------------------
# DB ParameterGroups
# --------------------------------------------
# Describe DBParameterGroups.
#
# rds.describe_db_parameter_groups #=>
# [{:engine=>"MySQL5.1",
# :description=>"Default parameter group for MySQL5.1",
# :name=>"default.MySQL5.1"}]
#
# # List parameter groups by 20
# rds.describe_db_parameter_groups(:max_records=>20) do |response|
# puts response.inspect
# true
# end
#
def describe_db_parameter_groups(*db_parameter_group_name, &block)
items, params = AwsUtils::split_items_and_params(db_parameter_group_name)
params['DBParameterGroupName'] = items.first unless items.right_blank?
result = []
incrementally_list_items('DescribeDBParameterGroups', DescribeDbParameterGroupsParser, params) do |response|
result += response[:db_parameter_groups]
block ? block.call(response) : true
end
result
end
# Creates a database parameter group so that configuration of an RDS Instance can be controlled.
#
# rds.create_db_parameter_group('my-new-group-1','My new group') #=> {}
#
# TODO: this call returns an empty hash, but should be a parameter group data - ask Amazon guys.
#
def create_db_parameter_group(db_parameter_group_name, db_parameter_group_description, db_parameter_group_family='mysql5.1', params={})
params['DBParameterGroupName'] = db_parameter_group_name
params['Description'] = db_parameter_group_description
params['DBParameterGroupFamily'] = db_parameter_group_family
link = generate_request('CreateDBParameterGroup', params )
request_info(link, DescribeDbParameterGroupsParser.new(:logger => @logger))[:db_parameter_groups].first
end
# Modify DBParameterGroup paramaters. Up to 20 params can be midified at once.
#
# rds.modify_db_parameter_group('kd1', 'max_allowed_packet' => 2048) #=> true
#
# rds.modify_db_parameter_group('kd1', 'max_allowed_packet' => {:value => 2048, :method => 'immediate') #=> true
#
def modify_db_parameter_group(db_parameter_group_name, params={}) # :nodoc:
request_hash = { 'DBParameterGroupName' => db_parameter_group_name}
parameters = []
params.each do |key, value|
method = 'pending-reboot'
if value.is_a?(Hash)
method = value[:method] unless value[:method].right_blank?
value = value[:value]
end
parameters << [key, value, method]
end
request_hash.merge!( amazonize_list(['Parameters.member.?.ParameterName',
'Parameters.member.?.ParameterValue',
'Parameters.member.?.ApplyMethod'],
parameters ))
link = generate_request('ModifyDBParameterGroup', request_hash)
request_info(link, RightHttp2xxParser.new(:logger => @logger))
end
# Delete DBParameter Group.
#
# rds.delete_db_parameter_group('kd1') #=> true
#
def delete_db_parameter_group(db_parameter_group_name)
link = generate_request('DeleteDBParameterGroup', 'DBParameterGroupName' => db_parameter_group_name)
request_info(link, RightHttp2xxParser.new(:logger => @logger))
end
# Modify the parameters of a DBParameterGroup to the engine/system default value.
#
# # Reset all parameters
# rds.reset_db_parameter_group('kd2', :all ) #=> true
#
# # Reset custom parameters
# rds.reset_db_parameter_group('kd2', 'max_allowed_packet', 'auto_increment_increment' ) #=> true
# rds.reset_db_parameter_group('kd2', 'max_allowed_packet', 'auto_increment_increment' => 'immediate' ) #=> true
#
def reset_db_parameter_group(db_parameter_group_name, *params)
params = params.flatten
request_hash = { 'DBParameterGroupName' => db_parameter_group_name }
if params.first.to_s == 'all'
request_hash['ResetAllParameters'] = true
else
tmp = []
params.each{ |item| tmp |= item.to_a }
params = []
tmp.each do |key, method|
method = 'pending-reboot' unless method
params << [key, method]
end
request_hash.merge!( amazonize_list(['Parameters.member.?.ParameterName',
'Parameters.member.?.ApplyMethod'],
params ))
end
link = generate_request('ResetDBParameterGroup', request_hash)
request_info(link, RightHttp2xxParser.new(:logger => @logger))
end
# Get the detailed parameters list for a particular DBParameterGroup.
#
# rds.describe_db_parameters('kd1') #=>
# [{:is_modifiable=>true,
# :apply_type=>"static",
# :source=>"engine-default",
# :allowed_values=>"ON,OFF",
# :description=>"Controls whether user-defined functions that have only an xxx symbol for the main function can be loaded",
# :name=>"allow-suspicious-udfs",
# :data_type=>"boolean"},
# {:is_modifiable=>true,
# :apply_type=>"dynamic",
# :source=>"engine-default",
# :allowed_values=>"1-65535",
# :description=>"Intended for use with master-to-master replication, and can be used to control the operation of AUTO_INCREMENT columns",
# :name=>"auto_increment_increment",
# :data_type=>"integer"}, ... ]
#
# # List parameters by 20
# rds.describe_db_parameters('kd1', :max_records=>20) do |response|
# puts response.inspect
# true
# end
#
def describe_db_parameters(*db_parameter_group_name, &block)
item, params = AwsUtils::split_items_and_params(db_parameter_group_name)
params['DBParameterGroupName'] = item
result = []
incrementally_list_items('DescribeDBParameters', DescribeDbParametersParser, params) do |response|
result += response[:parameters]
block ? block.call(response) : true
end
result
end
# Describe a default parameters for the parameter group family.
#
# rds.describe_engine_default_parameters('MySQL5.1') #=>
# [{:is_modifiable=>true,
# :apply_type=>"static",
# :source=>"engine-default",
# :allowed_values=>"ON,OFF",
# :description=>"Controls whether user-defined functions that have only an xxx symbol for the main function can be loaded",
# :name=>"allow-suspicious-udfs",
# :data_type=>"boolean"},
# {:is_modifiable=>true,
# :apply_type=>"dynamic",
# :source=>"engine-default",
# :allowed_values=>"1-65535",
# :description=>"Intended for use with master-to-master replication, and can be used to control the operation of AUTO_INCREMENT columns",
# :name=>"auto_increment_increment",
# :data_type=>"integer"}, ... ]
#
def describe_engine_default_parameters(*db_parameter_group_family, &block)
db_parameter_group_family = ['MySQL5.1'] if db_parameter_group_family.right_blank?
item, params = AwsUtils::split_items_and_params(db_parameter_group_family)
params['DBParameterGroupFamily'] = item if item
result = []
incrementally_list_items('DescribeEngineDefaultParameters', DescribeDbParametersParser, params) do |response|
result += response[:parameters]
block ? block.call(response) : true
end
result
end
# --------------------------------------------
# DB Snapshots
# --------------------------------------------
# Get DBSecurityGroup details for a particular customer or for a particular DBSecurityGroup if a name is specified.
# Optional params: +:instance_aws_id+
#
# # all snapshots
# rds.describe_db_snapshots #=>
# [{:status=>"Available",
# :instance_aws_id=>"kd-test-n1",
# :allocated_storage=>25,
# :availability_zone=>"us-east-1b",
# :aws_id=>"kd-test-n1-final-snapshot-at-20090630131215",
# :engine=>"MySQL5.1",
# :endpoint_port=>3306,
# :instance_create_time=>"2009-06-30T12:48:15.590Z",
# :master_username=>"payless",
# :snapshot_time=>"2009-06-30T13:16:48.496Z"}, ...]
#
# # all snapshots for a custom instance
# rds.describe_db_snapshots(:instance_aws_id => 'kd-test-n3') #=>
# [{:status=>"Available",
# :instance_aws_id=>"kd-test-n3",
# :allocated_storage=>25,
# :availability_zone=>"us-east-1a",
# :aws_id=>"kd-test-n3-final-snapshot-20090713074916",
# :engine=>"MySQL5.1",
# :endpoint_port=>3306,
# :instance_create_time=>"2009-06-30T12:51:32.540Z",
# :master_username=>"payless",
# :snapshot_time=>"2009-07-13T07:52:35.542Z"}]
#
# # a snapshot by id
# rds.describe_db_snapshots('my-awesome-db-final-snapshot-20090713075554') #=>
# [{:status=>"Available",
# :allocated_storage=>25,
# :engine=>"MySQL5.1",
# :instance_aws_id=>"my-awesome-db",
# :availability_zone=>"us-east-1a",
# :instance_create_time=>"2009-07-13T07:53:08.912Z",
# :endpoint_port=>3306,
# :master_username=>"medium",
# :aws_id=>"my-awesome-db-final-snapshot-20090713075554",
# :snapshot_time=>"2009-07-13T07:59:17.537Z"}]
#
def describe_db_snapshots(params={}, &block)
item, params = AwsUtils::split_items_and_params(params)
params['DBSnapshotIdentifier'] = item if item
params['DBInstanceIdentifier'] = params.delete(:instance_aws_id) unless params[:instance_aws_id].right_blank?
result = []
incrementally_list_items('DescribeDBSnapshots', DescribeDbSnapshotsParser, params) do |response|
result += response[:db_snapshots]
block ? block.call(response) : true
end
result
end
# Create a DBSnapshot. The source DBInstance must be in Available state
#
# rds.create_db_snapshot('remove-me-tomorrow-2', 'my-awesome-db-g7' ) #=>
# {:status=>"PendingCreation",
# :allocated_storage=>50,
# :availability_zone=>"us-east-1b",
# :engine=>"MySQL5.1",
# :aws_id=>"remove-me-tomorrow-2",
# :instance_create_time=>"2009-07-13T09:35:39.243Z",
# :endpoint_port=>3306,
# :instance_aws_id=>"my-awesome-db-g7",
# :db_master_username=>"username"}
#
def create_db_snapshot(aws_id, instance_aws_id)
link = generate_request('CreateDBSnapshot', 'DBSnapshotIdentifier' => aws_id,
'DBInstanceIdentifier' => instance_aws_id)
request_info(link, DescribeDbSnapshotsParser.new(:logger => @logger))[:db_snapshots].first
end
# Create a new RDS instance from a DBSnapshot. The source DBSnapshot must be
# in the "Available" state. The new RDS instance is created with the Default security group.
#
# Optional params: +:instance_class+, +:endpoint_port+, +:availability_zone+, +:multi_az+,
# +:auto_minor_version_upgrade+
#
# rds.restore_db_instance_from_db_snapshot('ahahahaha-final-snapshot-20090828081159', 'q1') #=>
# {:status=>"creating",
# :pending_modified_values=>{},
# :allocated_storage=>42,
# :db_security_groups=>[],
# :master_username=>"kd",
# :availability_zone=>"us-east-1a",
# :aws_id=>"q1",
# :create_time=>"2009-08-29T18:07:01.510Z",
# :instance_class=>"Medium",
# :preferred_maintenance_window=>"Sun:05:00-Sun:09:00",
# :engine=>"MySQL",
# :engine_version=>"5.1.49"}
#
def restore_db_instance_from_db_snapshot(snapshot_aws_id, instance_aws_id, params={})
request_hash = { 'DBSnapshotIdentifier' => snapshot_aws_id,
'DBInstanceIdentifier' => instance_aws_id }
request_hash['DBInstanceClass'] = params[:instance_class] unless params[:instance_class].right_blank?
request_hash['Port'] = params[:endpoint_port] unless params[:endpoint_port].right_blank?
request_hash['AvailabilityZone'] = params[:availability_zone] unless params[:availability_zone].right_blank?
request_hash['MultiAZ'] = params[:multi_az] unless params[:multi_az].nil?
request_hash['AutoMinorVersionUpgrade'] = params[:auto_minor_version_upgrade] unless params[:auto_minor_version_upgrade].nil?
link = generate_request('RestoreDBInstanceFromDBSnapshot', request_hash)
request_info(link, DescribeDbInstancesParser.new(:logger => @logger))[:db_instances].first
end
# Create a new RDS instance from a point-in-time system snapshot. The target
# database is created from the source database restore point with the same configuration as
# the original source database, except that the new RDS instance is created with the default
# security group.
#
# Optional params: +:instance_class+, +:endpoint_port+, +:availability_zone+, +:multi_az+, +:restore_time+,
# +:auto_minor_version_upgrade+, +:use_latest_restorable_time+
#
def restore_db_instance_to_point_in_time(instance_aws_id, new_instance_aws_id, params={})
request_hash = { 'SourceDBInstanceIdentifier' => instance_aws_id,
'TargetDBInstanceIdentifier' => new_instance_aws_id}
request_hash['UseLatestRestorableTime'] = params[:use_latest_restorable_time].to_s unless params[:use_latest_restorable_time].nil?
request_hash['RestoreTime'] = params[:restore_time] unless params[:restore_time].right_blank?
request_hash['DBInstanceClass'] = params[:instance_class] unless params[:instance_class].right_blank?
request_hash['MultiAZ'] = params[:multi_az] unless params[:multi_az].nil?
request_hash['Port'] = params[:endpoint_port] unless params[:endpoint_port].right_blank?
request_hash['AvailabilityZone'] = params[:availability_zone] unless params[:availability_zone].right_blank?
request_hash['AutoMinorVersionUpgrade'] = params[:auto_minor_version_upgrade] unless params[:auto_minor_version_upgrade].nil?
link = generate_request('RestoreDBInstanceToPointInTime', request_hash)
request_info(link, DescribeDbInstancesParser.new(:logger => @logger))[:db_instances].first
end
# Delete a DBSnapshot. The DBSnapshot must be in the Available state to be deleted.
#
# rds.delete_db_snapshot('remove-me-tomorrow-1') #=>
# {:status=>"Deleted",
# :allocated_storage=>50,
# :instance_create_time=>"2009-07-13T09:27:01.053Z",
# :availability_zone=>"us-east-1a",
# :db_master_username=>"username",
# :aws_id=>"remove-me-tomorrow-1",
# :snapshot_time=>"2009-07-13T10:59:30.227Z",
# :endpoint_port=>3306,
# :instance_aws_id=>"my-awesome-db-g5",
# :engine=>"MySQL5.1"}
#
def delete_db_snapshot(aws_id)
link = generate_request('DeleteDBSnapshot', 'DBSnapshotIdentifier' => aws_id)
request_info(link, DescribeDbSnapshotsParser.new(:logger => @logger))[:db_snapshots].first
end
# --------------------------------------------
# DB Events
# --------------------------------------------
# Get events related to RDS instances and DBSecurityGroups for the past 14 days.
# Optional params: +:duration+, +:start_time+, +:end_time+, +:aws_id+,
# +:source_type+('db-instance', 'db-security-group', 'db-snapshot', 'db-parameter-group')
#
# # get all enevts
# rds.describe_events #=>
# [{:aws_id=>"my-awesome-db-g4",
# :source_type=>"DBInstance",
# :message=>"Started user snapshot for database instance:my-awesome-db-g4",
# :date=>"2009-07-13T10:54:13.661Z"},
# {:aws_id=>"my-awesome-db-g5",
# :source_type=>"DBInstance",
# :message=>"Started user snapshot for database instance:my-awesome-db-g5",
# :date=>"2009-07-13T10:55:13.674Z"},
# {:aws_id=>"my-awesome-db-g7",
# :source_type=>"DBInstance",
# :message=>"Started user snapshot for database instance:my-awesome-db-g7",
# :date=>"2009-07-13T10:56:34.226Z"}]
#
# # get all events since yesterday
# rds.describe_events(:start_date => 1.day.ago)
#
# # get last 60 min events
# rds.describe_events(:duration => 60)
#
def describe_events(params={}, &block)
params = params.dup
params['SourceIdentifier'] = params.delete(:aws_id) unless params[:aws_id].right_blank?
params['SourceType'] = params.delete(:source_type) unless params[:source_type].right_blank?
params['Duration'] = params.delete(:duration) unless params[:duration].right_blank?
params['StartDate'] = fix_date(params.delete(:start_date)) unless params[:start_date].right_blank?
params['EndDate'] = fix_date(params.delete(:end_date)) unless params[:end_date].right_blank?
result = []
incrementally_list_items('DescribeEvents', DescribeEventsParser, params) do |response|
result += response[:events]
block ? block.call(response) : true
end
result
end
def fix_date(date) # :nodoc:
date = Time.at(date) if date.is_a?(Fixnum)
date = date.utc.strftime('%Y-%m-%dT%H:%M:%SZ') if date.is_a?(Time)
date
end
# --------------------------------------------
# DB Engine Versions
# --------------------------------------------
# Get a list of the available DB engines.
# Optional params: +:db_parameter_group_family+, +:default_only+, +:engine+, +:engine_version+
#
# rds.describe_db_engine_versions #=>
# [{:engine=>"mysql",
# :db_parameter_group_family=>"mysql5.1",
# :engine_version=>"5.1.45"},
# {:engine=>"mysql",
# :db_parameter_group_family=>"mysql5.1",
# :engine_version=>"5.1.49"},
# {:engine=>"mysql",
# :db_parameter_group_family=>"mysql5.1",
# :engine_version=>"5.1.50"}]
#
def describe_db_engine_versions(params={}, &block)
params = params.dup
params['DBParameterGroupFamily'] = params.delete(:db_parameter_group_family) unless params[:db_parameter_group_family].right_blank?
params['DefaultOnly'] = params.delete(:default_only).to_s unless params[:default_only].nil?
params['Engine'] = params.delete(:engine) unless params[:engine].right_blank?
params['EngineVersion'] = params.delete(:engine_version) unless params[:engine_version].right_blank?
result = []
incrementally_list_items('DescribeDBEngineVersions', DescribeDBEngineVersionsParser, params) do |response|
result += response[:db_engine_versions]
block ? block.call(response) : true
end
result
end
# --------------------------------------------
# DB Replicas
# --------------------------------------------
# Create a DB Instance that acts as a Read Replica of a source DB Instance.
#
# Optional params: +:endpoint_port+, +:availability_zone+, +:db_instance_class+, +:auto_minor_version_upgrade+
#
# rds.create_db_instance_read_replica('kd-delete-me-01-replica-01', 'kd-delete-me-01',
# :db_instance_class => 'db.m1.small',
# :endpoint_port => '11000',
# :auto_minor_version_upgrade => false ) #=>
# {:auto_minor_version_upgrade=>false,
# :read_replica_source_db_instance_identifier=>"kd-delete-me-01",
# :status=>"creating",
# :backup_retention_period=>0,
# :allocated_storage=>30,
# :read_replica_db_instance_identifiers=>[],
# :engine_version=>"5.1.50",
# :aws_id=>"kd-delete-me-01-replica-01",
# :multi_az=>false,
# :preferred_maintenance_window=>"sun:06:00-sun:10:00",
# :master_username=>"username",
# :preferred_backup_window=>"02:00-04:00",
# :db_parameter_group=>{:status=>"in-sync", :name=>"default.mysql5.1"},
# :engine=>"mysql",
# :db_security_groups=>[{:status=>"active", :name=>"default"}],
# :instance_class=>"db.m1.small",
# :pending_modified_values=>{}}
#
def create_db_instance_read_replica(aws_id, source_db_instance_identifier, params={})
request_hash = { 'DBInstanceIdentifier' => aws_id,
'SourceDBInstanceIdentifier' => source_db_instance_identifier}
request_hash['Port'] = params[:endpoint_port] unless params[:endpoint_port].right_blank?
request_hash['AvailabilityZone'] = params[:availability_zone] unless params[:availability_zone].right_blank?
request_hash['DBInstanceClass'] = params[:db_instance_class] unless params[:db_instance_class].right_blank?
request_hash['AutoMinorVersionUpgrade'] = params[:auto_minor_version_upgrade].to_s unless params[:auto_minor_version_upgrade].nil?
link = generate_request('CreateDBInstanceReadReplica', request_hash)
request_info(link, DescribeDbInstancesParser.new(:logger => @logger))[:db_instances].first
end
#---------------------------------------------
# Reserved Instances
#---------------------------------------------
# Lists available reserved DB Instance offerings.
# Options: :aws_id, :instance_class, :duration, :product_description, :multi_az
#
# rds.describe_reserved_db_instances_offerings #=>
# [{:multi_az=>false,
# :duration=>31536000,
# :fixed_price=>1325.0,
# :usage_price=>0.262,
# :aws_id=>"248e7b75-2451-4381-9025-b5553d421c7b",
# :instance_class=>"db.m2.xlarge",
# :product_description=>"mysql"},
# {:multi_az=>true,
# :duration=>94608000,
# :fixed_price=>700.0,
# :usage_price=>0.092,
# :aws_id=>"248e7b75-49a7-4cd7-9a9b-354f4906a9b1",
# :instance_class=>"db.m1.small",
# :product_description=>"mysql"}, ... ]
#
# rds.describe_reserved_db_instances_offerings(:aws_id => "248e7b75-49a7-4cd7-9a9b-354f4906a9b1") #=>
# [{:duration=>94608000,
# :multi_az=>true,
# :fixed_price=>700.0,
# :usage_price=>0.092,
# :aws_id=>"248e7b75-49a7-4cd7-9a9b-354f4906a9b1",
# :instance_class=>"db.m1.small",
# :product_description=>"mysql"}]
#
# rds.describe_reserved_db_instances_offerings(:instance_class => "db.m1.small")
# rds.describe_reserved_db_instances_offerings(:duration => 31536000)
# rds.describe_reserved_db_instances_offerings(:product_description => 'mysql')
# rds.describe_reserved_db_instances_offerings(:multi_az => true)
#
def describe_reserved_db_instances_offerings(params={}, &block)
params = params.dup
params['ReservedDBInstancesOfferingId'] = params.delete(:aws_id) unless params[:aws_id].right_blank?
params['DBInstanceClass'] = params.delete(:instance_class) unless params[:instance_class].right_blank?
params['Duration'] = params.delete(:duration) unless params[:duration].right_blank?
params['ProductDescription'] = params.delete(:product_description) unless params[:product_description].right_blank?
params['MultiAZ'] = params.delete(:multi_az).to_s unless params[:multi_az].nil?
result = []
incrementally_list_items('DescribeReservedDBInstancesOfferings', DescribeReservedDBInstancesOfferingsParser, params) do |response|
result += response[:reserved_db_instances_offerings]
block ? block.call(response) : true
end
result
end
# Returns information about reserved DB Instances for this account, or about
# a specified reserved DB Instance.
# Options: :aws_id, :offering_aws_id, :instance_class, :duration, :product_description, :multi_az
#
# rds.describe_reserved_db_instances
# rds.describe_reserved_db_instances(:aws_id => "myreservedinstance")
# rds.describe_reserved_db_instances(:offering_aws_id => "248e7b75-49a7-4cd7-9a9b-354f4906a9b1")
# rds.describe_reserved_db_instances(:instance_class => "db.m1.small")
# rds.describe_reserved_db_instances(:duration => 31536000)
# rds.describe_reserved_db_instances(:product_description => 'mysql')
# rds.describe_reserved_db_instances_offerings(:multi_az => true)
#
def describe_reserved_db_instances(params={}, &block)
params = params.dup
params['ReservedDBInstancesId'] = params.delete(:aws_id) unless params[:aws_id].right_blank?
params['ReservedDBInstancesOfferingId'] = params.delete(:offering_aws_id) unless params[:offering_aws_id].right_blank?
params['DBInstanceClass'] = params.delete(:instance_class) unless params[:instance_class].right_blank?
params['Duration'] = params.delete(:duration) unless params[:duration].right_blank?
params['ProductDescription'] = params.delete(:product_description) unless params[:product_description].right_blank?
params['MultiAZ'] = params.delete(:multi_az).to_s unless params[:multi_az].nil?
result = []
incrementally_list_items('DescribeReservedDBInstances', DescribeReservedDBInstancesParser, params) do |response|
result += response[:reserved_db_instances]
block ? block.call(response) : true
end
result
end
# Purchases a reserved DB Instance offering.
# Options: :aws_id, :count
def purchase_reserved_db_instances_offering(offering_aws_id, params={})
request_hash = { 'ReservedDBInstancesOfferingId' => offering_aws_id }
request_hash['ReservedDBInstanceId'] = params[:aws_id] unless params[:aws_id].right_blank?
request_hash['DBInstanceCount'] = params[:count] unless params[:count].right_blank?
link = generate_request('PurchaseReservedDBInstancesOffering', request_hash)
request_info(link, DescribeReservedDBInstancesParser.new(:logger => @logger))[:reserved_db_instances].first
end
# --------------------------------------------
# Parsers
# --------------------------------------------
# --------------------------------------------
# DB Instances
# --------------------------------------------
class DescribeDbInstancesParser < RightAWSParser # :nodoc:
def reset
@result = { :db_instances => [] }
end
def tagstart(name, attributes)
case name
when 'DBInstance' then @item = { :db_security_groups => [], :pending_modified_values => {}, :read_replica_db_instance_identifiers => [] }
when 'DBSecurityGroup' then @db_security_group = {}
when 'DBParameterGroup',
'DBParameterGroupStatus' then @db_parameter_group = {}
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i
when 'DBInstanceIdentifier' then @item[:aws_id] = @text
when 'InstanceCreateTime' then @item[:create_time] = @text
when 'Engine' then @item[:engine] = @text
when 'DBInstanceStatus' then @item[:status] = @text
when 'Address' then @item[:endpoint_address] = @text
when 'Port' then @item[:endpoint_port] = @text.to_i
when 'MasterUsername' then @item[:master_username] = @text
when 'AvailabilityZone' then @item[:availability_zone] = @text
when 'LatestRestorableTime' then @item[:latest_restorable_time] = @text
when 'ReadReplicaSourceDBInstanceIdentifier' then @item[:read_replica_source_db_instance_identifier] = @text
when 'ReadReplicaDBInstanceIdentifier' then @item[:read_replica_db_instance_identifiers] << @text
when 'DBSecurityGroupName' then @db_security_group[:name] = @text
when 'Status' then @db_security_group[:status] = @text
when 'DBParameterGroupName' then @db_parameter_group[:name] = @text
when 'ParameterApplyStatus' then @db_parameter_group[:status] = @text
when 'DBSecurityGroup' then @item[:db_security_groups] << @db_security_group
when 'DBParameterGroup',
'DBParameterGroupStatus' then @item[:db_parameter_group] = @db_parameter_group
when 'DBInstance' then @result[:db_instances] << @item
else
case full_tag_name
when %r{DBInstance/DBInstanceClass$} then @item[:instance_class] = @text
when %r{DBInstance/AllocatedStorage$} then @item[:allocated_storage] = @text.to_i
when %r{DBInstance/MultiAZ$} then @item[:multi_az] = (@text == 'true')
when %r{DBInstance/BackupRetentionPeriod$} then @item[:backup_retention_period] = @text.to_i
when %r{DBInstance/PreferredMaintenanceWindow$} then @item[:preferred_maintenance_window] = @text
when %r{DBInstance/PreferredBackupWindow$} then @item[:preferred_backup_window] = @text
when %r{DBInstance/EngineVersion$} then @item[:engine_version] = @text
when %r{DBInstance/AutoMinorVersionUpgrade$} then @item[:auto_minor_version_upgrade] = (@text == 'true')
when %r{DBInstance/AllowMajorVersionUpgrade$} then @item[:allow_major_version_upgrade] = (@text == 'true')
when %r{PendingModifiedValues/DBInstanceClass$} then @item[:pending_modified_values][:instance_class] = @text
when %r{PendingModifiedValues/AllocatedStorage$} then @item[:pending_modified_values][:allocated_storage] = @text.to_i
when %r{PendingModifiedValues/MasterUserPassword$} then @item[:pending_modified_values][:master_user_password] = @text
when %r{PendingModifiedValues/MultiAZ$} then @item[:pending_modified_values][:multi_az] = (@text == 'true')
when %r{PendingModifiedValues/BackupRetentionPeriod$} then @item[:pending_modified_values][:backup_retention_period] = @text.to_i
when %r{PendingModifiedValues/PreferredMaintenanceWindow$} then @item[:pending_modified_values][:preferred_maintenance_window] = @text
when %r{PendingModifiedValues/PreferredBackupWindow$} then @item[:pending_modified_values][:preferred_backup_window] = @text
when %r{PendingModifiedValues/EngineVersion$} then @item[:pending_modified_values][:engine_version] = @text
when %r{PendingModifiedValues/AutoMinorVersionUpgrade$} then @item[:pending_modified_values][:auto_minor_version_upgrade] = (@text == 'true')
when %r{PendingModifiedValues/AllowMajorVersionUpgrade$} then @item[:pending_modified_values][:allow_major_version_upgrade] = (@text == 'true')
end
end
end
end
# --------------------------------------------
# DB Security Groups
# --------------------------------------------
class DescribeDbSecurityGroupsParser < RightAWSParser # :nodoc:
def reset
@result = { :db_security_groups => [] }
end
def tagstart(name, attributes)
case name
when 'DBSecurityGroup' then @item = { :ec2_security_groups => [], :ip_ranges => [] }
when 'IPRange' then @ip_range = {}
when 'EC2SecurityGroup' then @ec2_security_group = {}
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i
when 'DBSecurityGroupDescription' then @item[:description ] = @text
when 'OwnerId' then @item[:owner_id] = @text
when 'DBSecurityGroupName' then @item[:name] = @text
when 'EC2SecurityGroupName' then @ec2_security_group[:name] = @text
when 'EC2SecurityGroupOwnerId' then @ec2_security_group[:owner_id] = @text
when 'CIDRIP' then @ip_range[:cidrip] = @text
when 'IPRange' then @item[:ip_ranges] << @ip_range
when 'EC2SecurityGroup' then @item[:ec2_security_groups] << @ec2_security_group
when 'DBSecurityGroup'
# Sort the ip_ranges and ec2_security_groups
@item[:ip_ranges].sort!{ |i1,i2| "#{i1[:cidrip]}" <=> "#{i2[:cidrip]}" }
@item[:ec2_security_groups].sort!{ |i1,i2| "#{i1[:owner_id]}#{i1[:name]}" <=> "#{i2[:owner_id]}#{i2[:name]}" }
@result[:db_security_groups] << @item
else
case full_tag_name
when %r{IPRange/Status$} then @ip_range[:status] = @text
when %r{EC2SecurityGroup/Status$} then @ec2_security_group[:status] = @text
end
end
end
end
# --------------------------------------------
# DB Security Groups
# --------------------------------------------
class DescribeDbParameterGroupsParser < RightAWSParser # :nodoc:
def reset
@result = { :db_parameter_groups => [] }
end
def tagstart(name, attributes)
case name
when 'DBParameterGroup',
'ModifyDBParameterGroupResult' then @item = { }
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i
when 'DBParameterGroupName' then @item[:name] = @text
when 'Description' then @item[:description] = @text
when 'DBParameterGroupFamily' then @item[:db_parameter_group_family] = @text
when 'DBParameterGroup',
'ModifyDBParameterGroupResult' then @result[:db_parameter_groups] << @item
end
end
end
class DescribeDbParametersParser < RightAWSParser # :nodoc:
def reset
@result = { :parameters => [] }
end
def tagstart(name, attributes)
case name
when 'Parameter' then @item = {}
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i
when 'DBParameterGroupName' then @result[:group_name] = @text # DescribeDbParametersResponse
when 'DBParameterGroupFamily' then @result[:db_parameter_group_family] = @text # DescribeDBEngineDefaultParametersResponse
when 'DataType' then @item[:data_type] = @text
when 'Source' then @item[:source] = @text
when 'Description' then @item[:description] = @text
when 'IsModifiable' then @item[:is_modifiable] = (@text == 'true')
when 'ApplyType' then @item[:apply_type] = @text
when 'AllowedValues' then @item[:allowed_values] = @text
when 'ParameterName' then @item[:name] = @text
when 'ParameterValue' then @item[:value] = @text
when 'Parameter' then @result[:parameters] << @item
end
end
end
# --------------------------------------------
# DB Snapshots
# --------------------------------------------
class DescribeDbSnapshotsParser < RightAWSParser # :nodoc:
def reset
@result = { :db_snapshots => [] }
end
def tagstart(name, attributes)
case name
when 'DBSnapshot' then @item = {}
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i # ?
when 'Engine' then @item[:engine] = @text
when 'EngineVersion' then @item[:engine_version] = @text
when 'InstanceCreateTime' then @item[:instance_create_time] = @text
when 'Port' then @item[:endpoint_port] = @text.to_i
when 'Status' then @item[:status] = @text
when 'AvailabilityZone' then @item[:availability_zone] = @text
when 'MasterUsername' then @item[:master_username] = @text
when 'AllocatedStorage' then @item[:allocated_storage] = @text.to_i
when 'SnapshotCreateTime' then @item[:create_time] = @text
when 'DBInstanceIdentifier' then @item[:instance_aws_id] = @text
when 'DBSnapshotIdentifier' then @item[:aws_id] = @text
when 'DBSnapshot' then @result[:db_snapshots] << @item
end
end
end
# --------------------------------------------
# DB Events
# --------------------------------------------
class DescribeEventsParser < RightAWSParser # :nodoc:
def reset
@result = { :events => [] }
end
def tagstart(name, attributes)
case name
when 'Event' then @item = {}
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i # ?
when 'Date' then @item[:date] = @text
when 'SourceIdentifier' then @item[:aws_id] = @text
when 'SourceType' then @item[:source_type] = @text
when 'Message' then @item[:message] = @text
when 'Event' then @result[:events] << @item
end
end
end
# --------------------------------------------
# DB Events
# --------------------------------------------
class DescribeDBEngineVersionsParser < RightAWSParser # :nodoc:
def reset
@result = { :db_engine_versions => [] }
end
def tagstart(name, attributes)
case name
when 'DBEngineVersion' then @item = {}
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i
when 'DBParameterGroupFamily' then @item[:db_parameter_group_family] = @text
when 'Engine' then @item[:engine] = @text
when 'EngineVersion' then @item[:engine_version] = @text
when 'DBEngineVersion' then @result[:db_engine_versions] << @item
end
end
end
# --------------------------------------------
# DB Reserved Instances
# --------------------------------------------
class DescribeReservedDBInstancesOfferingsParser < RightAWSParser # :nodoc:
def reset
@result = { :reserved_db_instances_offerings => [] }
end
def tagstart(name, attributes)
case name
when 'ReservedDBInstancesOffering' then @item = {}
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i
when 'DBInstanceClass' then @item[:instance_class] = @text
when 'Duration' then @item[:duration] = @text.to_i
when 'FixedPrice' then @item[:fixed_price] = @text.to_f
when 'UsagePrice' then @item[:usage_price] = @text.to_f
when 'MultiAZ' then @item[:multi_az] = (@text == 'true')
when 'ProductDescription' then @item[:product_description] = @text
when 'ReservedDBInstancesOfferingId' then @item[:aws_id] = @text
when 'ReservedDBInstancesOffering' then @result[:reserved_db_instances_offerings] << @item
end
end
end
class DescribeReservedDBInstancesParser < RightAWSParser # :nodoc:
def reset
@result = { :reserved_db_instances => [] }
end
def tagstart(name, attributes)
case name
when 'ReservedDBInstance' then @item = {}
end
end
def tagend(name)
case name
when 'Marker' then @result[:marker] = @text
when 'MaxRecords' then @result[:max_records] = @text.to_i
when 'DBInstanceClass' then @item[:instance_class] = @text
when 'Duration' then @item[:duration] = @text.to_i
when 'FixedPrice' then @item[:fixed_price] = @text.to_f
when 'UsagePrice' then @item[:usage_price] = @text.to_f
when 'MultiAZ' then @item[:multi_az] = (@text == 'true')
when 'ProductDescription' then @item[:product_description] = @text
when 'ReservedDBInstancesOfferingId' then @item[:offering_aws_id] = @text
when 'ReservedDBInstanceId' then @item[:aws_id] = @text
when 'State' then @item[:state] = @text
when 'ReservedDBInstance' then @result[:reserved_db_instances] << @item
end
end
end
end
end