Class: Aws::RDS::DBSnapshot
- Inherits:
-
Object
- Object
- Aws::RDS::DBSnapshot
- Extended by:
- Deprecations
- Defined in:
- lib/aws-sdk-rds/db_snapshot.rb
Defined Under Namespace
Classes: Collection
Read-Only Attributes collapse
-
#allocated_storage ⇒ Integer
Specifies the allocated storage size in gibibytes (GiB).
-
#availability_zone ⇒ String
Specifies the name of the Availability Zone the DB instance was located in at the time of the DB snapshot.
-
#db_snapshot_arn ⇒ String
The Amazon Resource Name (ARN) for the DB snapshot.
-
#db_system_id ⇒ String
The Oracle system identifier (SID), which is the name of the Oracle database instance that manages your database files.
-
#dbi_resource_id ⇒ String
The identifier for the source DB instance, which can’t be changed and which is unique to an Amazon Web Services Region.
-
#dedicated_log_volume ⇒ Boolean
Indicates whether the DB instance has a dedicated log volume (DLV) enabled.
-
#encrypted ⇒ Boolean
Indicates whether the DB snapshot is encrypted.
-
#engine ⇒ String
Specifies the name of the database engine.
-
#engine_version ⇒ String
Specifies the version of the database engine.
-
#iam_database_authentication_enabled ⇒ Boolean
Indicates whether mapping of Amazon Web Services Identity and Access Management (IAM) accounts to database accounts is enabled.
-
#instance_create_time ⇒ Time
Specifies the time in Coordinated Universal Time (UTC) when the DB instance, from which the snapshot was taken, was created.
- #instance_id ⇒ String (also: #db_instance_identifier)
-
#iops ⇒ Integer
Specifies the Provisioned IOPS (I/O operations per second) value of the DB instance at the time of the snapshot.
-
#kms_key_id ⇒ String
If ‘Encrypted` is true, the Amazon Web Services KMS key identifier for the encrypted DB snapshot.
-
#license_model ⇒ String
License model information for the restored DB instance.
-
#master_username ⇒ String
Provides the master username for the DB snapshot.
-
#multi_tenant ⇒ Boolean
Indicates whether the snapshot is of a DB instance using the multi-tenant configuration (TRUE) or the single-tenant configuration (FALSE).
-
#option_group_name ⇒ String
Provides the option group name for the DB snapshot.
-
#original_snapshot_create_time ⇒ Time
Specifies the time of the CreateDBSnapshot operation in Coordinated Universal Time (UTC).
-
#percent_progress ⇒ Integer
The percentage of the estimated data that has been transferred.
-
#port ⇒ Integer
Specifies the port that the database engine was listening on at the time of the snapshot.
-
#processor_features ⇒ Array<Types::ProcessorFeature>
The number of CPU cores and the number of threads per core for the DB instance class of the DB instance when the DB snapshot was created.
-
#snapshot_create_time ⇒ Time
Specifies when the snapshot was taken in Coordinated Universal Time (UTC).
-
#snapshot_database_time ⇒ Time
The timestamp of the most recent transaction applied to the database that you’re backing up.
- #snapshot_id ⇒ String (also: #db_snapshot_identifier)
-
#snapshot_target ⇒ String
Specifies where manual snapshots are stored: Amazon Web Services Outposts or the Amazon Web Services Region.
-
#snapshot_type ⇒ String
Provides the type of the DB snapshot.
-
#source_db_snapshot_identifier ⇒ String
The DB snapshot Amazon Resource Name (ARN) that the DB snapshot was copied from.
-
#source_region ⇒ String
The Amazon Web Services Region that the DB snapshot was created in or copied from.
-
#status ⇒ String
Specifies the status of this DB snapshot.
-
#storage_throughput ⇒ Integer
Specifies the storage throughput for the DB snapshot.
-
#storage_type ⇒ String
Specifies the storage type associated with DB snapshot.
-
#tag_list ⇒ Array<Types::Tag>
A list of tags.
-
#tde_credential_arn ⇒ String
The ARN from the key store with which to associate the instance for TDE encryption.
-
#timezone ⇒ String
The time zone of the DB snapshot.
-
#vpc_id ⇒ String
Provides the VPC ID associated with the DB snapshot.
Actions collapse
- #copy(options = {}) ⇒ DBSnapshot
- #create(options = {}) ⇒ DBSnapshot
- #delete(options = {}) ⇒ DBSnapshot
- #restore(options = {}) ⇒ DBInstance
- #subscribe_to(options = {}) ⇒ EventSubscription
- #unsubscribe_from(options = {}) ⇒ EventSubscription
Associations collapse
- #attributes(options = {}) ⇒ DBSnapshotAttribute::Collection
- #events(options = {}) ⇒ Event::Collection
- #identifiers ⇒ Object deprecated private Deprecated.
- #instance ⇒ DBInstance
- #option_group ⇒ OptionGroup?
Instance Method Summary collapse
- #client ⇒ Client
-
#data ⇒ Types::DBSnapshot
Returns the data for this DBSnapshot.
-
#data_loaded? ⇒ Boolean
Returns ‘true` if this resource is loaded.
-
#initialize(*args) ⇒ DBSnapshot
constructor
A new instance of DBSnapshot.
-
#load ⇒ self
(also: #reload)
Loads, or reloads #data for the current DBSnapshot.
-
#wait_until(options = {}) {|resource| ... } ⇒ Resource
deprecated
Deprecated.
Use [Aws::RDS::Client] #wait_until instead
Constructor Details
#initialize(instance_id, snapshot_id, options = {}) ⇒ DBSnapshot #initialize(options = {}) ⇒ DBSnapshot
Returns a new instance of DBSnapshot.
24 25 26 27 28 29 30 31 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 24 def initialize(*args) = Hash === args.last ? args.pop.dup : {} @instance_id = extract_instance_id(args, ) @snapshot_id = extract_snapshot_id(args, ) @data = .delete(:data) @client = .delete(:client) || Client.new() @waiter_block_warned = false end |
Instance Method Details
#allocated_storage ⇒ Integer
Specifies the allocated storage size in gibibytes (GiB).
62 63 64 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 62 def allocated_storage data[:allocated_storage] end |
#attributes(options = {}) ⇒ DBSnapshotAttribute::Collection
1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 1294 def attributes( = {}) batches = Enumerator.new do |y| batch = [] = .merge(db_snapshot_identifier: @snapshot_id) resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.describe_db_snapshot_attributes() end resp.data.db_snapshot_attributes_result.db_snapshot_attributes.each do |d| batch << DBSnapshotAttribute.new( snapshot_id: @snapshot_id, name: d.attribute_name, data: d, client: @client ) end y.yield(batch) end DBSnapshotAttribute::Collection.new(batches) end |
#availability_zone ⇒ String
Specifies the name of the Availability Zone the DB instance was located in at the time of the DB snapshot.
82 83 84 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 82 def availability_zone data[:availability_zone] end |
#client ⇒ Client
294 295 296 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 294 def client @client end |
#copy(options = {}) ⇒ DBSnapshot
626 627 628 629 630 631 632 633 634 635 636 637 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 626 def copy( = {}) = .merge(source_db_snapshot_identifier: @snapshot_id) resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.copy_db_snapshot() end DBSnapshot.new( instance_id: resp.data.db_snapshot.db_instance_identifier, snapshot_id: resp.data.db_snapshot.db_snapshot_identifier, data: resp.data.db_snapshot, client: @client ) end |
#create(options = {}) ⇒ DBSnapshot
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 448 def create( = {}) = .merge( db_instance_identifier: @instance_id, db_snapshot_identifier: @snapshot_id ) resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.create_db_snapshot() end DBSnapshot.new( instance_id: resp.data.db_snapshot.db_instance_identifier, snapshot_id: resp.data.db_snapshot.db_snapshot_identifier, data: resp.data.db_snapshot, client: @client ) end |
#data ⇒ Types::DBSnapshot
Returns the data for this Aws::RDS::DBSnapshot. Calls Client#describe_db_snapshots if #data_loaded? is ‘false`.
316 317 318 319 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 316 def data load unless @data @data end |
#data_loaded? ⇒ Boolean
324 325 326 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 324 def data_loaded? !!@data end |
#db_snapshot_arn ⇒ String
The Amazon Resource Name (ARN) for the DB snapshot.
188 189 190 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 188 def db_snapshot_arn data[:db_snapshot_arn] end |
#db_system_id ⇒ String
The Oracle system identifier (SID), which is the name of the Oracle database instance that manages your database files. The Oracle SID is also the name of your CDB.
272 273 274 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 272 def db_system_id data[:db_system_id] end |
#dbi_resource_id ⇒ String
The identifier for the source DB instance, which can’t be changed and which is unique to an Amazon Web Services Region.
218 219 220 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 218 def dbi_resource_id data[:dbi_resource_id] end |
#dedicated_log_volume ⇒ Boolean
Indicates whether the DB instance has a dedicated log volume (DLV) enabled.
279 280 281 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 279 def dedicated_log_volume data[:dedicated_log_volume] end |
#delete(options = {}) ⇒ DBSnapshot
644 645 646 647 648 649 650 651 652 653 654 655 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 644 def delete( = {}) = .merge(db_snapshot_identifier: @snapshot_id) resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.delete_db_snapshot() end DBSnapshot.new( instance_id: resp.data.db_snapshot.db_instance_identifier, snapshot_id: resp.data.db_snapshot.db_snapshot_identifier, data: resp.data.db_snapshot, client: @client ) end |
#encrypted ⇒ Boolean
Indicates whether the DB snapshot is encrypted.
172 173 174 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 172 def encrypted data[:encrypted] end |
#engine ⇒ String
Specifies the name of the database engine.
56 57 58 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 56 def engine data[:engine] end |
#engine_version ⇒ String
Specifies the version of the database engine.
107 108 109 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 107 def engine_version data[:engine_version] end |
#events(options = {}) ⇒ Event::Collection
1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 1359 def events( = {}) batches = Enumerator.new do |y| = .merge( source_type: "db-snapshot", source_identifier: @snapshot_id ) resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.describe_events() end resp.each_page do |page| batch = [] page.data.events.each do |e| batch << Event.new( source_id: e.source_identifier, date: e.date, data: e, client: @client ) end y.yield(batch) end end Event::Collection.new(batches) end |
#iam_database_authentication_enabled ⇒ Boolean
Indicates whether mapping of Amazon Web Services Identity and Access Management (IAM) accounts to database accounts is enabled.
204 205 206 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 204 def iam_database_authentication_enabled data[:iam_database_authentication_enabled] end |
#identifiers ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
1406 1407 1408 1409 1410 1411 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 1406 def identifiers { instance_id: @instance_id, snapshot_id: @snapshot_id } end |
#instance ⇒ DBInstance
1385 1386 1387 1388 1389 1390 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 1385 def instance DBInstance.new( id: @instance_id, client: @client ) end |
#instance_create_time ⇒ Time
Specifies the time in Coordinated Universal Time (UTC) when the DB instance, from which the snapshot was taken, was created.
95 96 97 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 95 def instance_create_time data[:instance_create_time] end |
#instance_id ⇒ String Also known as: db_instance_identifier
36 37 38 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 36 def instance_id @instance_id end |
#iops ⇒ Integer
Specifies the Provisioned IOPS (I/O operations per second) value of the DB instance at the time of the snapshot.
126 127 128 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 126 def iops data[:iops] end |
#kms_key_id ⇒ String
If ‘Encrypted` is true, the Amazon Web Services KMS key identifier for the encrypted DB snapshot.
The Amazon Web Services KMS key identifier is the key ARN, key ID, alias ARN, or alias name for the KMS key.
182 183 184 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 182 def kms_key_id data[:kms_key_id] end |
#license_model ⇒ String
License model information for the restored DB instance.
113 114 115 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 113 def license_model data[:license_model] end |
#load ⇒ self Also known as: reload
Loads, or reloads #data for the current Aws::RDS::DBSnapshot. Returns ‘self` making it possible to chain methods.
db_snapshot.reload.data
304 305 306 307 308 309 310 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 304 def load resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.describe_db_snapshots(db_snapshot_identifier: @snapshot_id) end @data = resp.db_snapshots[0] self end |
#master_username ⇒ String
Provides the master username for the DB snapshot.
101 102 103 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 101 def master_username data[:master_username] end |
#multi_tenant ⇒ Boolean
Indicates whether the snapshot is of a DB instance using the multi-tenant configuration (TRUE) or the single-tenant configuration (FALSE).
287 288 289 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 287 def multi_tenant data[:multi_tenant] end |
#option_group ⇒ OptionGroup?
1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 1393 def option_group if data[:db_snapshot][:option_group_name] OptionGroup.new( name: data[:db_snapshot][:option_group_name], client: @client ) else nil end end |
#option_group_name ⇒ String
Provides the option group name for the DB snapshot.
132 133 134 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 132 def option_group_name data[:option_group_name] end |
#original_snapshot_create_time ⇒ Time
Specifies the time of the CreateDBSnapshot operation in Coordinated Universal Time (UTC). Doesn’t change when the snapshot is copied.
236 237 238 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 236 def original_snapshot_create_time data[:original_snapshot_create_time] end |
#percent_progress ⇒ Integer
The percentage of the estimated data that has been transferred.
138 139 140 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 138 def percent_progress data[:percent_progress] end |
#port ⇒ Integer
Specifies the port that the database engine was listening on at the time of the snapshot.
75 76 77 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 75 def port data[:port] end |
#processor_features ⇒ Array<Types::ProcessorFeature>
The number of CPU cores and the number of threads per core for the DB instance class of the DB instance when the DB snapshot was created.
211 212 213 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 211 def processor_features data[:processor_features] end |
#restore(options = {}) ⇒ DBInstance
1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 1231 def restore( = {}) = .merge(db_snapshot_identifier: @snapshot_id) resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.restore_db_instance_from_db_snapshot() end DBInstance.new( id: resp.data.db_instance.db_instance_identifier, data: resp.data.db_instance, client: @client ) end |
#snapshot_create_time ⇒ Time
Specifies when the snapshot was taken in Coordinated Universal Time (UTC). Changes for the copy when the snapshot is copied.
50 51 52 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 50 def snapshot_create_time data[:snapshot_create_time] end |
#snapshot_database_time ⇒ Time
The timestamp of the most recent transaction applied to the database that you’re backing up. Thus, if you restore a snapshot, SnapshotDatabaseTime is the most recent transaction in the restored DB instance. In contrast, originalSnapshotCreateTime specifies the system time that the snapshot completed.
If you back up a read replica, you can determine the replica lag by comparing SnapshotDatabaseTime with originalSnapshotCreateTime. For example, if originalSnapshotCreateTime is two hours later than SnapshotDatabaseTime, then the replica lag is two hours.
251 252 253 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 251 def snapshot_database_time data[:snapshot_database_time] end |
#snapshot_id ⇒ String Also known as: db_snapshot_identifier
42 43 44 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 42 def snapshot_id @snapshot_id end |
#snapshot_target ⇒ String
Specifies where manual snapshots are stored: Amazon Web Services Outposts or the Amazon Web Services Region.
258 259 260 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 258 def snapshot_target data[:snapshot_target] end |
#snapshot_type ⇒ String
Provides the type of the DB snapshot.
119 120 121 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 119 def snapshot_type data[:snapshot_type] end |
#source_db_snapshot_identifier ⇒ String
The DB snapshot Amazon Resource Name (ARN) that the DB snapshot was copied from. It only has a value in the case of a cross-account or cross-Region copy.
153 154 155 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 153 def source_db_snapshot_identifier data[:source_db_snapshot_identifier] end |
#source_region ⇒ String
The Amazon Web Services Region that the DB snapshot was created in or copied from.
145 146 147 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 145 def source_region data[:source_region] end |
#status ⇒ String
Specifies the status of this DB snapshot.
68 69 70 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 68 def status data[:status] end |
#storage_throughput ⇒ Integer
Specifies the storage throughput for the DB snapshot.
264 265 266 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 264 def storage_throughput data[:storage_throughput] end |
#storage_type ⇒ String
Specifies the storage type associated with DB snapshot.
159 160 161 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 159 def storage_type data[:storage_type] end |
#subscribe_to(options = {}) ⇒ EventSubscription
1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 1253 def subscribe_to( = {}) = .merge(source_identifier: @snapshot_id) resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.add_source_identifier_to_subscription() end EventSubscription.new( name: resp.data.event_subscription.cust_subscription_id, data: resp.data.event_subscription, client: @client ) end |
#tag_list ⇒ Array<Types::Tag>
A list of tags. For more information, see [Tagging Amazon RDS Resources] in the *Amazon RDS User Guide.*
[1]: docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html
229 230 231 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 229 def tag_list data[:tag_list] end |
#tde_credential_arn ⇒ String
The ARN from the key store with which to associate the instance for TDE encryption.
166 167 168 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 166 def tde_credential_arn data[:tde_credential_arn] end |
#timezone ⇒ String
The time zone of the DB snapshot. In most cases, the ‘Timezone` element is empty. `Timezone` content appears only for snapshots taken from Microsoft SQL Server DB instances that were created with a time zone specified.
197 198 199 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 197 def timezone data[:timezone] end |
#unsubscribe_from(options = {}) ⇒ EventSubscription
1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 1275 def unsubscribe_from( = {}) = .merge(source_identifier: @snapshot_id) resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do @client.remove_source_identifier_from_subscription() end EventSubscription.new( name: resp.data.event_subscription.cust_subscription_id, data: resp.data.event_subscription, client: @client ) end |
#vpc_id ⇒ String
Provides the VPC ID associated with the DB snapshot.
88 89 90 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 88 def vpc_id data[:vpc_id] end |
#wait_until(options = {}) {|resource| ... } ⇒ Resource
Use [Aws::RDS::Client] #wait_until instead
The waiting operation is performed on a copy. The original resource remains unchanged.
Waiter polls an API operation until a resource enters a desired state.
## Basic Usage
Waiter will polls until it is successful, it fails by entering a terminal state, or until a maximum number of attempts are made.
# polls in a loop until condition is true
resource.wait_until() {|resource| condition}
## Example
instance.wait_until(max_attempts:10, delay:5) do |instance|
instance.state.name == 'running'
end
## Configuration
You can configure the maximum number of polling attempts, and the delay (in seconds) between each polling attempt. The waiting condition is set by passing a block to #wait_until:
# poll for ~25 seconds
resource.wait_until(max_attempts:5,delay:5) {|resource|...}
## Callbacks
You can be notified before each polling attempt and before each delay. If you throw ‘:success` or `:failure` from these callbacks, it will terminate the waiter.
started_at = Time.now
# poll for 1 hour, instead of a number of attempts
proc = Proc.new do |attempts, response|
throw :failure if Time.now - started_at > 3600
end
# disable max attempts
instance.wait_until(before_wait:proc, max_attempts:nil) {...}
## Handling Errors
When a waiter is successful, it returns the Resource. When a waiter fails, it raises an error.
begin
resource.wait_until(...)
rescue Aws::Waiters::Errors::WaiterFailed
# resource did not enter the desired state in time
end
attempts attempt in seconds invoked before each attempt invoked before each wait
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 |
# File 'lib/aws-sdk-rds/db_snapshot.rb', line 408 def wait_until( = {}, &block) self_copy = self.dup attempts = 0 [:max_attempts] = 10 unless .key?(:max_attempts) [:delay] ||= 10 [:poller] = Proc.new do attempts += 1 if block.call(self_copy) [:success, self_copy] else self_copy.reload unless attempts == [:max_attempts] :retry end end Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do Aws::Waiters::Waiter.new().wait({}) end end |