417 lines
17 KiB
Python
417 lines
17 KiB
Python
|
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||
|
#
|
||
|
# 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, dis-
|
||
|
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||
|
# persons to whom the Software is furnished to do so, subject to the fol-
|
||
|
# lowing 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 MERCHANTABIL-
|
||
|
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||
|
# SHALL THE AUTHOR 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.
|
||
|
|
||
|
from boto.rds.dbsecuritygroup import DBSecurityGroup
|
||
|
from boto.rds.parametergroup import ParameterGroup
|
||
|
from boto.rds.statusinfo import StatusInfo
|
||
|
from boto.rds.dbsubnetgroup import DBSubnetGroup
|
||
|
from boto.rds.vpcsecuritygroupmembership import VPCSecurityGroupMembership
|
||
|
from boto.resultset import ResultSet
|
||
|
|
||
|
|
||
|
class DBInstance(object):
|
||
|
"""
|
||
|
Represents a RDS DBInstance
|
||
|
|
||
|
Properties reference available from the AWS documentation at
|
||
|
http://goo.gl/sC2Kn
|
||
|
|
||
|
:ivar connection: connection
|
||
|
:ivar id: The name and identifier of the DBInstance
|
||
|
:ivar create_time: The date and time of creation
|
||
|
:ivar engine: The database engine being used
|
||
|
:ivar status: The status of the database in a string. e.g. "available"
|
||
|
:ivar allocated_storage: The size of the disk in gigabytes (int).
|
||
|
:ivar auto_minor_version_upgrade: Indicates that minor version patches
|
||
|
are applied automatically.
|
||
|
:ivar endpoint: A tuple that describes the hostname and port of
|
||
|
the instance. This is only available when the database is
|
||
|
in status "available".
|
||
|
:ivar instance_class: Contains the name of the compute and memory
|
||
|
capacity class of the DB Instance.
|
||
|
:ivar master_username: The username that is set as master username
|
||
|
at creation time.
|
||
|
:ivar parameter_groups: Provides the list of DB Parameter Groups
|
||
|
applied to this DB Instance.
|
||
|
:ivar security_groups: Provides List of DB Security Group elements
|
||
|
containing only DBSecurityGroup.Name and DBSecurityGroup.Status
|
||
|
subelements.
|
||
|
:ivar availability_zone: Specifies the name of the Availability Zone
|
||
|
the DB Instance is located in.
|
||
|
:ivar backup_retention_period: Specifies the number of days for
|
||
|
which automatic DB Snapshots are retained.
|
||
|
:ivar preferred_backup_window: Specifies the daily time range during
|
||
|
which automated backups are created if automated backups are
|
||
|
enabled, as determined by the backup_retention_period.
|
||
|
:ivar preferred_maintenance_window: Specifies the weekly time
|
||
|
range (in UTC) during which system maintenance can occur. (string)
|
||
|
:ivar latest_restorable_time: Specifies the latest time to which
|
||
|
a database can be restored with point-in-time restore. (string)
|
||
|
:ivar multi_az: Boolean that specifies if the DB Instance is a
|
||
|
Multi-AZ deployment.
|
||
|
:ivar iops: The current number of provisioned IOPS for the DB Instance.
|
||
|
Can be None if this is a standard instance.
|
||
|
:ivar vpc_security_groups: List of VPC Security Group Membership elements
|
||
|
containing only VpcSecurityGroupMembership.VpcSecurityGroupId and
|
||
|
VpcSecurityGroupMembership.Status subelements.
|
||
|
:ivar pending_modified_values: Specifies that changes to the
|
||
|
DB Instance are pending. This element is only included when changes
|
||
|
are pending. Specific changes are identified by subelements.
|
||
|
:ivar read_replica_dbinstance_identifiers: List of read replicas
|
||
|
associated with this DB instance.
|
||
|
:ivar status_infos: The status of a Read Replica. If the instance is not a
|
||
|
for a read replica, this will be blank.
|
||
|
:ivar character_set_name: If present, specifies the name of the character
|
||
|
set that this instance is associated with.
|
||
|
:ivar subnet_group: Specifies information on the subnet group associated
|
||
|
with the DB instance, including the name, description, and subnets
|
||
|
in the subnet group.
|
||
|
:ivar engine_version: Indicates the database engine version.
|
||
|
:ivar license_model: License model information for this DB instance.
|
||
|
"""
|
||
|
|
||
|
def __init__(self, connection=None, id=None):
|
||
|
self.connection = connection
|
||
|
self.id = id
|
||
|
self.create_time = None
|
||
|
self.engine = None
|
||
|
self.status = None
|
||
|
self.allocated_storage = None
|
||
|
self.auto_minor_version_upgrade = None
|
||
|
self.endpoint = None
|
||
|
self.instance_class = None
|
||
|
self.master_username = None
|
||
|
self.parameter_groups = []
|
||
|
self.security_groups = []
|
||
|
self.read_replica_dbinstance_identifiers = []
|
||
|
self.availability_zone = None
|
||
|
self.backup_retention_period = None
|
||
|
self.preferred_backup_window = None
|
||
|
self.preferred_maintenance_window = None
|
||
|
self.latest_restorable_time = None
|
||
|
self.multi_az = False
|
||
|
self.iops = None
|
||
|
self.vpc_security_groups = None
|
||
|
self.pending_modified_values = None
|
||
|
self._in_endpoint = False
|
||
|
self._port = None
|
||
|
self._address = None
|
||
|
self.status_infos = None
|
||
|
self.character_set_name = None
|
||
|
self.subnet_group = None
|
||
|
self.engine_version = None
|
||
|
self.license_model = None
|
||
|
|
||
|
def __repr__(self):
|
||
|
return 'DBInstance:%s' % self.id
|
||
|
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'Endpoint':
|
||
|
self._in_endpoint = True
|
||
|
elif name == 'DBParameterGroups':
|
||
|
self.parameter_groups = ResultSet([('DBParameterGroup',
|
||
|
ParameterGroup)])
|
||
|
return self.parameter_groups
|
||
|
elif name == 'DBSecurityGroups':
|
||
|
self.security_groups = ResultSet([('DBSecurityGroup',
|
||
|
DBSecurityGroup)])
|
||
|
return self.security_groups
|
||
|
elif name == 'VpcSecurityGroups':
|
||
|
self.vpc_security_groups = ResultSet([('VpcSecurityGroupMembership',
|
||
|
VPCSecurityGroupMembership)])
|
||
|
return self.vpc_security_groups
|
||
|
elif name == 'PendingModifiedValues':
|
||
|
self.pending_modified_values = PendingModifiedValues()
|
||
|
return self.pending_modified_values
|
||
|
elif name == 'ReadReplicaDBInstanceIdentifiers':
|
||
|
self.read_replica_dbinstance_identifiers = \
|
||
|
ReadReplicaDBInstanceIdentifiers()
|
||
|
return self.read_replica_dbinstance_identifiers
|
||
|
elif name == 'StatusInfos':
|
||
|
self.status_infos = ResultSet([
|
||
|
('DBInstanceStatusInfo', StatusInfo)
|
||
|
])
|
||
|
return self.status_infos
|
||
|
elif name == 'DBSubnetGroup':
|
||
|
self.subnet_group = DBSubnetGroup()
|
||
|
return self.subnet_group
|
||
|
return None
|
||
|
|
||
|
def endElement(self, name, value, connection):
|
||
|
if name == 'DBInstanceIdentifier':
|
||
|
self.id = value
|
||
|
elif name == 'DBInstanceStatus':
|
||
|
self.status = value
|
||
|
elif name == 'InstanceCreateTime':
|
||
|
self.create_time = value
|
||
|
elif name == 'Engine':
|
||
|
self.engine = value
|
||
|
elif name == 'DBInstanceStatus':
|
||
|
self.status = value
|
||
|
elif name == 'AllocatedStorage':
|
||
|
self.allocated_storage = int(value)
|
||
|
elif name == 'AutoMinorVersionUpgrade':
|
||
|
self.auto_minor_version_upgrade = value.lower() == 'true'
|
||
|
elif name == 'DBInstanceClass':
|
||
|
self.instance_class = value
|
||
|
elif name == 'MasterUsername':
|
||
|
self.master_username = value
|
||
|
elif name == 'Port':
|
||
|
if self._in_endpoint:
|
||
|
self._port = int(value)
|
||
|
elif name == 'Address':
|
||
|
if self._in_endpoint:
|
||
|
self._address = value
|
||
|
elif name == 'Endpoint':
|
||
|
self.endpoint = (self._address, self._port)
|
||
|
self._in_endpoint = False
|
||
|
elif name == 'AvailabilityZone':
|
||
|
self.availability_zone = value
|
||
|
elif name == 'BackupRetentionPeriod':
|
||
|
self.backup_retention_period = int(value)
|
||
|
elif name == 'LatestRestorableTime':
|
||
|
self.latest_restorable_time = value
|
||
|
elif name == 'PreferredMaintenanceWindow':
|
||
|
self.preferred_maintenance_window = value
|
||
|
elif name == 'PreferredBackupWindow':
|
||
|
self.preferred_backup_window = value
|
||
|
elif name == 'MultiAZ':
|
||
|
if value.lower() == 'true':
|
||
|
self.multi_az = True
|
||
|
elif name == 'Iops':
|
||
|
self.iops = int(value)
|
||
|
elif name == 'CharacterSetName':
|
||
|
self.character_set_name = value
|
||
|
elif name == 'EngineVersion':
|
||
|
self.engine_version = value
|
||
|
elif name == 'LicenseModel':
|
||
|
self.license_model = value
|
||
|
else:
|
||
|
setattr(self, name, value)
|
||
|
|
||
|
@property
|
||
|
def security_group(self):
|
||
|
"""
|
||
|
Provide backward compatibility for previous security_group
|
||
|
attribute.
|
||
|
"""
|
||
|
if len(self.security_groups) > 0:
|
||
|
return self.security_groups[-1]
|
||
|
else:
|
||
|
return None
|
||
|
|
||
|
@property
|
||
|
def parameter_group(self):
|
||
|
"""
|
||
|
Provide backward compatibility for previous parameter_group
|
||
|
attribute.
|
||
|
"""
|
||
|
if len(self.parameter_groups) > 0:
|
||
|
return self.parameter_groups[-1]
|
||
|
else:
|
||
|
return None
|
||
|
|
||
|
def snapshot(self, snapshot_id):
|
||
|
"""
|
||
|
Create a new DB snapshot of this DBInstance.
|
||
|
|
||
|
:type identifier: string
|
||
|
:param identifier: The identifier for the DBSnapshot
|
||
|
|
||
|
:rtype: :class:`boto.rds.dbsnapshot.DBSnapshot`
|
||
|
:return: The newly created DBSnapshot
|
||
|
"""
|
||
|
return self.connection.create_dbsnapshot(snapshot_id, self.id)
|
||
|
|
||
|
def reboot(self):
|
||
|
"""
|
||
|
Reboot this DBInstance
|
||
|
|
||
|
:rtype: :class:`boto.rds.dbsnapshot.DBSnapshot`
|
||
|
:return: The newly created DBSnapshot
|
||
|
"""
|
||
|
return self.connection.reboot_dbinstance(self.id)
|
||
|
|
||
|
def update(self, validate=False):
|
||
|
"""
|
||
|
Update the DB instance's status information by making a call to fetch
|
||
|
the current instance attributes from the service.
|
||
|
|
||
|
:type validate: bool
|
||
|
:param validate: By default, if EC2 returns no data about the
|
||
|
instance the update method returns quietly. If the
|
||
|
validate param is True, however, it will raise a
|
||
|
ValueError exception if no data is returned from EC2.
|
||
|
"""
|
||
|
rs = self.connection.get_all_dbinstances(self.id)
|
||
|
if len(rs) > 0:
|
||
|
for i in rs:
|
||
|
if i.id == self.id:
|
||
|
self.__dict__.update(i.__dict__)
|
||
|
elif validate:
|
||
|
raise ValueError('%s is not a valid Instance ID' % self.id)
|
||
|
return self.status
|
||
|
|
||
|
def stop(self, skip_final_snapshot=False, final_snapshot_id=''):
|
||
|
"""
|
||
|
Delete this DBInstance.
|
||
|
|
||
|
:type skip_final_snapshot: bool
|
||
|
:param skip_final_snapshot: This parameter determines whether
|
||
|
a final db snapshot is created before the instance is
|
||
|
deleted. If True, no snapshot is created. If False, a
|
||
|
snapshot is created before deleting the instance.
|
||
|
|
||
|
:type final_snapshot_id: str
|
||
|
:param final_snapshot_id: If a final snapshot is requested, this
|
||
|
is the identifier used for that snapshot.
|
||
|
|
||
|
:rtype: :class:`boto.rds.dbinstance.DBInstance`
|
||
|
:return: The deleted db instance.
|
||
|
"""
|
||
|
return self.connection.delete_dbinstance(self.id,
|
||
|
skip_final_snapshot,
|
||
|
final_snapshot_id)
|
||
|
|
||
|
def modify(self, param_group=None, security_groups=None,
|
||
|
preferred_maintenance_window=None,
|
||
|
master_password=None, allocated_storage=None,
|
||
|
instance_class=None,
|
||
|
backup_retention_period=None,
|
||
|
preferred_backup_window=None,
|
||
|
multi_az=False,
|
||
|
iops=None,
|
||
|
vpc_security_groups=None,
|
||
|
apply_immediately=False,
|
||
|
new_instance_id=None):
|
||
|
"""
|
||
|
Modify this DBInstance.
|
||
|
|
||
|
:type param_group: str
|
||
|
:param param_group: Name of DBParameterGroup to associate with
|
||
|
this DBInstance.
|
||
|
|
||
|
:type security_groups: list of str or list of DBSecurityGroup objects
|
||
|
:param security_groups: List of names of DBSecurityGroup to
|
||
|
authorize on this DBInstance.
|
||
|
|
||
|
:type preferred_maintenance_window: str
|
||
|
:param preferred_maintenance_window: The weekly time range (in
|
||
|
UTC) during which maintenance can occur. Default is
|
||
|
Sun:05:00-Sun:09:00
|
||
|
|
||
|
:type master_password: str
|
||
|
:param master_password: Password of master user for the DBInstance.
|
||
|
Must be 4-15 alphanumeric characters.
|
||
|
|
||
|
:type allocated_storage: int
|
||
|
:param allocated_storage: The new allocated storage size, in GBs.
|
||
|
Valid values are [5-1024]
|
||
|
|
||
|
:type instance_class: str
|
||
|
:param instance_class: The compute and memory capacity of the
|
||
|
DBInstance. Changes will be applied at next maintenance
|
||
|
window unless apply_immediately is True.
|
||
|
|
||
|
Valid values are:
|
||
|
|
||
|
* db.m1.small
|
||
|
* db.m1.large
|
||
|
* db.m1.xlarge
|
||
|
* db.m2.xlarge
|
||
|
* db.m2.2xlarge
|
||
|
* db.m2.4xlarge
|
||
|
|
||
|
:type apply_immediately: bool
|
||
|
:param apply_immediately: If true, the modifications will be
|
||
|
applied as soon as possible rather than waiting for the
|
||
|
next preferred maintenance window.
|
||
|
|
||
|
:type new_instance_id: str
|
||
|
:param new_instance_id: The new DB instance identifier.
|
||
|
|
||
|
:type backup_retention_period: int
|
||
|
:param backup_retention_period: The number of days for which
|
||
|
automated backups are retained. Setting this to zero
|
||
|
disables automated backups.
|
||
|
|
||
|
:type preferred_backup_window: str
|
||
|
:param preferred_backup_window: The daily time range during
|
||
|
which automated backups are created (if enabled). Must be
|
||
|
in h24:mi-hh24:mi format (UTC).
|
||
|
|
||
|
:type multi_az: bool
|
||
|
:param multi_az: If True, specifies the DB Instance will be
|
||
|
deployed in multiple availability zones.
|
||
|
|
||
|
:type iops: int
|
||
|
:param iops: The amount of IOPS (input/output operations per
|
||
|
second) to Provisioned for the DB Instance. Can be
|
||
|
modified at a later date.
|
||
|
|
||
|
Must scale linearly. For every 1000 IOPS provision, you
|
||
|
must allocated 100 GB of storage space. This scales up to
|
||
|
1 TB / 10 000 IOPS for MySQL and Oracle. MSSQL is limited
|
||
|
to 700 GB / 7 000 IOPS.
|
||
|
|
||
|
If you specify a value, it must be at least 1000 IOPS and
|
||
|
you must allocate 100 GB of storage.
|
||
|
|
||
|
:type vpc_security_groups: list
|
||
|
:param vpc_security_groups: List of VPCSecurityGroupMembership
|
||
|
that this DBInstance is a memberof.
|
||
|
|
||
|
:rtype: :class:`boto.rds.dbinstance.DBInstance`
|
||
|
:return: The modified db instance.
|
||
|
"""
|
||
|
return self.connection.modify_dbinstance(self.id,
|
||
|
param_group,
|
||
|
security_groups,
|
||
|
preferred_maintenance_window,
|
||
|
master_password,
|
||
|
allocated_storage,
|
||
|
instance_class,
|
||
|
backup_retention_period,
|
||
|
preferred_backup_window,
|
||
|
multi_az,
|
||
|
apply_immediately,
|
||
|
iops,
|
||
|
vpc_security_groups,
|
||
|
new_instance_id)
|
||
|
|
||
|
|
||
|
class PendingModifiedValues(dict):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
return None
|
||
|
|
||
|
def endElement(self, name, value, connection):
|
||
|
if name != 'PendingModifiedValues':
|
||
|
self[name] = value
|
||
|
|
||
|
|
||
|
class ReadReplicaDBInstanceIdentifiers(list):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
return None
|
||
|
|
||
|
def endElement(self, name, value, connection):
|
||
|
if name == 'ReadReplicaDBInstanceIdentifier':
|
||
|
self.append(value)
|