# frozen_string_literal: true
# WARNING ABOUT GENERATED CODE
#
# This file is generated. See the contributing guide for more information:
# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md
#
# WARNING ABOUT GENERATED CODE
module Aws::S3
class MultipartUploadPart
extend Aws::Deprecations
# @overload def initialize(bucket_name, object_key, multipart_upload_id, part_number, options = {})
# @param [String] bucket_name
# @param [String] object_key
# @param [String] multipart_upload_id
# @param [Integer] part_number
# @option options [Client] :client
# @overload def initialize(options = {})
# @option options [required, String] :bucket_name
# @option options [required, String] :object_key
# @option options [required, String] :multipart_upload_id
# @option options [required, Integer] :part_number
# @option options [Client] :client
def initialize(*args)
options = Hash === args.last ? args.pop.dup : {}
@bucket_name = extract_bucket_name(args, options)
@object_key = extract_object_key(args, options)
@multipart_upload_id = extract_multipart_upload_id(args, options)
@part_number = extract_part_number(args, options)
@data = options.delete(:data)
@client = options.delete(:client) || Client.new(options)
@waiter_block_warned = false
end
# @!group Read-Only Attributes
# @return [String]
def bucket_name
@bucket_name
end
# @return [String]
def object_key
@object_key
end
# @return [String]
def multipart_upload_id
@multipart_upload_id
end
# @return [Integer]
def part_number
@part_number
end
# Date and time at which the part was uploaded.
# @return [Time]
def last_modified
data[:last_modified]
end
# Entity tag returned when the part was uploaded.
# @return [String]
def etag
data[:etag]
end
# Size in bytes of the uploaded part data.
# @return [Integer]
def size
data[:size]
end
# The Base64 encoded, 32-bit `CRC32` checksum of the part. This checksum
# is present if the object was uploaded with the `CRC32` checksum
# algorithm. For more information, see [Checking object integrity][1] in
# the *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @return [String]
def checksum_crc32
data[:checksum_crc32]
end
# The Base64 encoded, 32-bit `CRC32C` checksum of the part. This
# checksum is present if the object was uploaded with the `CRC32C`
# checksum algorithm. For more information, see [Checking object
# integrity][1] in the *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @return [String]
def checksum_crc32c
data[:checksum_crc32c]
end
# The Base64 encoded, 64-bit `CRC64NVME` checksum of the part. This
# checksum is present if the multipart upload request was created with
# the `CRC64NVME` checksum algorithm, or if the object was uploaded
# without a checksum (and Amazon S3 added the default checksum,
# `CRC64NVME`, to the uploaded object). For more information, see
# [Checking object integrity][1] in the *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @return [String]
def checksum_crc64nvme
data[:checksum_crc64nvme]
end
# The Base64 encoded, 160-bit `SHA1` checksum of the part. This checksum
# is present if the object was uploaded with the `SHA1` checksum
# algorithm. For more information, see [Checking object integrity][1] in
# the *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @return [String]
def checksum_sha1
data[:checksum_sha1]
end
# The Base64 encoded, 256-bit `SHA256` checksum of the part. This
# checksum is present if the object was uploaded with the `SHA256`
# checksum algorithm. For more information, see [Checking object
# integrity][1] in the *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @return [String]
def checksum_sha256
data[:checksum_sha256]
end
# @!endgroup
# @return [Client]
def client
@client
end
# @raise [NotImplementedError]
# @api private
def load
msg = "#load is not implemented, data only available via enumeration"
raise NotImplementedError, msg
end
alias :reload :load
# @raise [NotImplementedError] Raises when {#data_loaded?} is `false`.
# @return [Types::Part]
# Returns the data for this {MultipartUploadPart}.
def data
load unless @data
@data
end
# @return [Boolean]
# Returns `true` if this resource is loaded. Accessing attributes or
# {#data} on an unloaded resource will trigger a call to {#load}.
def data_loaded?
!!@data
end
# @deprecated Use [Aws::S3::Client] #wait_until instead
#
# Waiter polls an API operation until a resource enters a desired
# state.
#
# @note The waiting operation is performed on a copy. The original resource
# remains unchanged.
#
# ## 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(options) {|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
#
# @yieldparam [Resource] resource to be used in the waiting condition.
#
# @raise [Aws::Waiters::Errors::FailureStateError] Raised when the waiter
# terminates because the waiter has entered a state that it will not
# transition out of, preventing success.
#
# yet successful.
#
# @raise [Aws::Waiters::Errors::UnexpectedError] Raised when an error is
# encountered while polling for a resource that is not expected.
#
# @raise [NotImplementedError] Raised when the resource does not
#
# @option options [Integer] :max_attempts (10) Maximum number of
# attempts
# @option options [Integer] :delay (10) Delay between each
# attempt in seconds
# @option options [Proc] :before_attempt (nil) Callback
# invoked before each attempt
# @option options [Proc] :before_wait (nil) Callback
# invoked before each wait
# @return [Resource] if the waiter was successful
def wait_until(options = {}, &block)
self_copy = self.dup
attempts = 0
options[:max_attempts] = 10 unless options.key?(:max_attempts)
options[:delay] ||= 10
options[:poller] = Proc.new do
attempts += 1
if block.call(self_copy)
[:success, self_copy]
else
self_copy.reload unless attempts == options[:max_attempts]
:retry
end
end
Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
Aws::Waiters::Waiter.new(options).wait({})
end
end
# @!group Actions
# @example Request syntax with placeholder values
#
# multipart_upload_part.copy_from({
# copy_source: "CopySource", # required
# copy_source_if_match: "CopySourceIfMatch",
# copy_source_if_modified_since: Time.now,
# copy_source_if_none_match: "CopySourceIfNoneMatch",
# copy_source_if_unmodified_since: Time.now,
# copy_source_range: "CopySourceRange",
# sse_customer_algorithm: "SSECustomerAlgorithm",
# sse_customer_key: "SSECustomerKey",
# sse_customer_key_md5: "SSECustomerKeyMD5",
# copy_source_sse_customer_algorithm: "CopySourceSSECustomerAlgorithm",
# copy_source_sse_customer_key: "CopySourceSSECustomerKey",
# copy_source_sse_customer_key_md5: "CopySourceSSECustomerKeyMD5",
# request_payer: "requester", # accepts requester
# expected_bucket_owner: "AccountId",
# expected_source_bucket_owner: "AccountId",
# })
# @param [Hash] options ({})
# @option options [required, String] :copy_source
# Specifies the source object for the copy operation. You specify the
# value in one of two formats, depending on whether you want to access
# the source object through an [access point][1]:
#
# * For objects not accessed through an access point, specify the name
# of the source bucket and key of the source object, separated by a
# slash (/). For example, to copy the object `reports/january.pdf`
# from the bucket `awsexamplebucket`, use
# `awsexamplebucket/reports/january.pdf`. The value must be
# URL-encoded.
#
# * For objects accessed through access points, specify the Amazon
# Resource Name (ARN) of the object as accessed through the access
# point, in the format
# `arn:aws:s3:<Region>:<account-id>:accesspoint/<access-point-name>/object/<key>`.
# For example, to copy the object `reports/january.pdf` through access
# point `my-access-point` owned by account `123456789012` in Region
# `us-west-2`, use the URL encoding of
# `arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf`.
# The value must be URL encoded.
#
# <note markdown="1"> * Amazon S3 supports copy operations using Access points only when
# the source and destination buckets are in the same Amazon Web
# Services Region.
#
# * Access points are not supported by directory buckets.
#
# </note>
#
# Alternatively, for objects accessed through Amazon S3 on Outposts,
# specify the ARN of the object as accessed in the format
# `arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/object/<key>`.
# For example, to copy the object `reports/january.pdf` through
# outpost `my-outpost` owned by account `123456789012` in Region
# `us-west-2`, use the URL encoding of
# `arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf`.
# The value must be URL-encoded.
#
# If your bucket has versioning enabled, you could have multiple
# versions of the same object. By default, `x-amz-copy-source`
# identifies the current version of the source object to copy. To copy a
# specific version of the source object to copy, append
# `?versionId=<version-id>` to the `x-amz-copy-source` request header
# (for example, `x-amz-copy-source:
# /awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893`).
#
# If the current version is a delete marker and you don't specify a
# versionId in the `x-amz-copy-source` request header, Amazon S3 returns
# a `404 Not Found` error, because the object does not exist. If you
# specify versionId in the `x-amz-copy-source` and the versionId is a
# delete marker, Amazon S3 returns an HTTP `400 Bad Request` error,
# because you are not allowed to specify a delete marker as a version
# for the `x-amz-copy-source`.
#
# <note markdown="1"> **Directory buckets** - S3 Versioning isn't enabled and supported for
# directory buckets.
#
# </note>
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html
# @option options [String] :copy_source_if_match
# Copies the object if its entity tag (ETag) matches the specified tag.
#
# If both of the `x-amz-copy-source-if-match` and
# `x-amz-copy-source-if-unmodified-since` headers are present in the
# request as follows:
#
# `x-amz-copy-source-if-match` condition evaluates to `true`, and;
#
# `x-amz-copy-source-if-unmodified-since` condition evaluates to
# `false`;
#
# Amazon S3 returns `200 OK` and copies the data.
# @option options [Time,DateTime,Date,Integer,String] :copy_source_if_modified_since
# Copies the object if it has been modified since the specified time.
#
# If both of the `x-amz-copy-source-if-none-match` and
# `x-amz-copy-source-if-modified-since` headers are present in the
# request as follows:
#
# `x-amz-copy-source-if-none-match` condition evaluates to `false`, and;
#
# `x-amz-copy-source-if-modified-since` condition evaluates to `true`;
#
# Amazon S3 returns `412 Precondition Failed` response code.
# @option options [String] :copy_source_if_none_match
# Copies the object if its entity tag (ETag) is different than the
# specified ETag.
#
# If both of the `x-amz-copy-source-if-none-match` and
# `x-amz-copy-source-if-modified-since` headers are present in the
# request as follows:
#
# `x-amz-copy-source-if-none-match` condition evaluates to `false`, and;
#
# `x-amz-copy-source-if-modified-since` condition evaluates to `true`;
#
# Amazon S3 returns `412 Precondition Failed` response code.
# @option options [Time,DateTime,Date,Integer,String] :copy_source_if_unmodified_since
# Copies the object if it hasn't been modified since the specified
# time.
#
# If both of the `x-amz-copy-source-if-match` and
# `x-amz-copy-source-if-unmodified-since` headers are present in the
# request as follows:
#
# `x-amz-copy-source-if-match` condition evaluates to `true`, and;
#
# `x-amz-copy-source-if-unmodified-since` condition evaluates to
# `false`;
#
# Amazon S3 returns `200 OK` and copies the data.
# @option options [String] :copy_source_range
# The range of bytes to copy from the source object. The range value
# must use the form bytes=first-last, where the first and last are the
# zero-based byte offsets to copy. For example, bytes=0-9 indicates that
# you want to copy the first 10 bytes of the source. You can copy a
# range only if the source object is greater than 5 MB.
# @option options [String] :sse_customer_algorithm
# Specifies the algorithm to use when encrypting the object (for
# example, AES256).
#
# <note markdown="1"> This functionality is not supported when the destination bucket is a
# directory bucket.
#
# </note>
# @option options [String] :sse_customer_key
# Specifies the customer-provided encryption key for Amazon S3 to use in
# encrypting data. This value is used to store the object and then it is
# discarded; Amazon S3 does not store the encryption key. The key must
# be appropriate for use with the algorithm specified in the
# `x-amz-server-side-encryption-customer-algorithm` header. This must be
# the same encryption key specified in the initiate multipart upload
# request.
#
# <note markdown="1"> This functionality is not supported when the destination bucket is a
# directory bucket.
#
# </note>
# @option options [String] :sse_customer_key_md5
# Specifies the 128-bit MD5 digest of the encryption key according to
# RFC 1321. Amazon S3 uses this header for a message integrity check to
# ensure that the encryption key was transmitted without error.
#
# <note markdown="1"> This functionality is not supported when the destination bucket is a
# directory bucket.
#
# </note>
# @option options [String] :copy_source_sse_customer_algorithm
# Specifies the algorithm to use when decrypting the source object (for
# example, `AES256`).
#
# <note markdown="1"> This functionality is not supported when the source object is in a
# directory bucket.
#
# </note>
# @option options [String] :copy_source_sse_customer_key
# Specifies the customer-provided encryption key for Amazon S3 to use to
# decrypt the source object. The encryption key provided in this header
# must be one that was used when the source object was created.
#
# <note markdown="1"> This functionality is not supported when the source object is in a
# directory bucket.
#
# </note>
# @option options [String] :copy_source_sse_customer_key_md5
# Specifies the 128-bit MD5 digest of the encryption key according to
# RFC 1321. Amazon S3 uses this header for a message integrity check to
# ensure that the encryption key was transmitted without error.
#
# <note markdown="1"> This functionality is not supported when the source object is in a
# directory bucket.
#
# </note>
# @option options [String] :request_payer
# Confirms that the requester knows that they will be charged for the
# request. Bucket owners need not specify this parameter in their
# requests. If either the source or destination S3 bucket has Requester
# Pays enabled, the requester will pay for corresponding charges to copy
# the object. For information about downloading objects from Requester
# Pays buckets, see [Downloading Objects in Requester Pays Buckets][1]
# in the *Amazon S3 User Guide*.
#
# <note markdown="1"> This functionality is not supported for directory buckets.
#
# </note>
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html
# @option options [String] :expected_bucket_owner
# The account ID of the expected destination bucket owner. If the
# account ID that you provide does not match the actual owner of the
# destination bucket, the request fails with the HTTP status code `403
# Forbidden` (access denied).
# @option options [String] :expected_source_bucket_owner
# The account ID of the expected source bucket owner. If the account ID
# that you provide does not match the actual owner of the source bucket,
# the request fails with the HTTP status code `403 Forbidden` (access
# denied).
# @return [Types::UploadPartCopyOutput]
def copy_from(options = {})
options = options.merge(
bucket: @bucket_name,
key: @object_key,
upload_id: @multipart_upload_id,
part_number: @part_number
)
resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
@client.upload_part_copy(options)
end
resp.data
end
# @example Request syntax with placeholder values
#
# multipart_upload_part.upload({
# body: source_file,
# content_length: 1,
# content_md5: "ContentMD5",
# checksum_algorithm: "CRC32", # accepts CRC32, CRC32C, SHA1, SHA256, CRC64NVME
# checksum_crc32: "ChecksumCRC32",
# checksum_crc32c: "ChecksumCRC32C",
# checksum_crc64nvme: "ChecksumCRC64NVME",
# checksum_sha1: "ChecksumSHA1",
# checksum_sha256: "ChecksumSHA256",
# sse_customer_algorithm: "SSECustomerAlgorithm",
# sse_customer_key: "SSECustomerKey",
# sse_customer_key_md5: "SSECustomerKeyMD5",
# request_payer: "requester", # accepts requester
# expected_bucket_owner: "AccountId",
# })
# @param [Hash] options ({})
# @option options [String, StringIO, File] :body
# Object data.
# @option options [Integer] :content_length
# Size of the body in bytes. This parameter is useful when the size of
# the body cannot be determined automatically.
# @option options [String] :content_md5
# The Base64 encoded 128-bit MD5 digest of the part data. This parameter
# is auto-populated when using the command from the CLI. This parameter
# is required if object lock parameters are specified.
#
# <note markdown="1"> This functionality is not supported for directory buckets.
#
# </note>
# @option options [String] :checksum_algorithm
# Indicates the algorithm used to create the checksum for the object
# when you use the SDK. This header will not provide any additional
# functionality if you don't use the SDK. When you send this header,
# there must be a corresponding `x-amz-checksum` or `x-amz-trailer`
# header sent. Otherwise, Amazon S3 fails the request with the HTTP
# status code `400 Bad Request`. For more information, see [Checking
# object integrity][1] in the *Amazon S3 User Guide*.
#
# If you provide an individual checksum, Amazon S3 ignores any provided
# `ChecksumAlgorithm` parameter.
#
# This checksum algorithm must be the same for all parts and it match
# the checksum value supplied in the `CreateMultipartUpload` request.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @option options [String] :checksum_crc32
# This header can be used as a data integrity check to verify that the
# data received is the same data that was originally sent. This header
# specifies the Base64 encoded, 32-bit `CRC32` checksum of the object.
# For more information, see [Checking object integrity][1] in the
# *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @option options [String] :checksum_crc32c
# This header can be used as a data integrity check to verify that the
# data received is the same data that was originally sent. This header
# specifies the Base64 encoded, 32-bit `CRC32C` checksum of the object.
# For more information, see [Checking object integrity][1] in the
# *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @option options [String] :checksum_crc64nvme
# This header can be used as a data integrity check to verify that the
# data received is the same data that was originally sent. This header
# specifies the Base64 encoded, 64-bit `CRC64NVME` checksum of the part.
# For more information, see [Checking object integrity][1] in the
# *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @option options [String] :checksum_sha1
# This header can be used as a data integrity check to verify that the
# data received is the same data that was originally sent. This header
# specifies the Base64 encoded, 160-bit `SHA1` digest of the object. For
# more information, see [Checking object integrity][1] in the *Amazon S3
# User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @option options [String] :checksum_sha256
# This header can be used as a data integrity check to verify that the
# data received is the same data that was originally sent. This header
# specifies the Base64 encoded, 256-bit `SHA256` digest of the object.
# For more information, see [Checking object integrity][1] in the
# *Amazon S3 User Guide*.
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
# @option options [String] :sse_customer_algorithm
# Specifies the algorithm to use when encrypting the object (for
# example, AES256).
#
# <note markdown="1"> This functionality is not supported for directory buckets.
#
# </note>
# @option options [String] :sse_customer_key
# Specifies the customer-provided encryption key for Amazon S3 to use in
# encrypting data. This value is used to store the object and then it is
# discarded; Amazon S3 does not store the encryption key. The key must
# be appropriate for use with the algorithm specified in the
# `x-amz-server-side-encryption-customer-algorithm header`. This must be
# the same encryption key specified in the initiate multipart upload
# request.
#
# <note markdown="1"> This functionality is not supported for directory buckets.
#
# </note>
# @option options [String] :sse_customer_key_md5
# Specifies the 128-bit MD5 digest of the encryption key according to
# RFC 1321. Amazon S3 uses this header for a message integrity check to
# ensure that the encryption key was transmitted without error.
#
# <note markdown="1"> This functionality is not supported for directory buckets.
#
# </note>
# @option options [String] :request_payer
# Confirms that the requester knows that they will be charged for the
# request. Bucket owners need not specify this parameter in their
# requests. If either the source or destination S3 bucket has Requester
# Pays enabled, the requester will pay for corresponding charges to copy
# the object. For information about downloading objects from Requester
# Pays buckets, see [Downloading Objects in Requester Pays Buckets][1]
# in the *Amazon S3 User Guide*.
#
# <note markdown="1"> This functionality is not supported for directory buckets.
#
# </note>
#
#
#
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html
# @option options [String] :expected_bucket_owner
# The account ID of the expected bucket owner. If the account ID that
# you provide does not match the actual owner of the bucket, the request
# fails with the HTTP status code `403 Forbidden` (access denied).
# @return [Types::UploadPartOutput]
def upload(options = {})
options = options.merge(
bucket: @bucket_name,
key: @object_key,
upload_id: @multipart_upload_id,
part_number: @part_number
)
resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
@client.upload_part(options)
end
resp.data
end
# @!group Associations
# @return [MultipartUpload]
def multipart_upload
MultipartUpload.new(
bucket_name: @bucket_name,
object_key: @object_key,
id: @multipart_upload_id,
client: @client
)
end
# @deprecated
# @api private
def identifiers
{
bucket_name: @bucket_name,
object_key: @object_key,
multipart_upload_id: @multipart_upload_id,
part_number: @part_number
}
end
deprecated(:identifiers)
private
def extract_bucket_name(args, options)
value = args[0] || options.delete(:bucket_name)
case value
when String then value
when nil then raise ArgumentError, "missing required option :bucket_name"
else
msg = "expected :bucket_name to be a String, got #{value.class}"
raise ArgumentError, msg
end
end
def extract_object_key(args, options)
value = args[1] || options.delete(:object_key)
case value
when String then value
when nil then raise ArgumentError, "missing required option :object_key"
else
msg = "expected :object_key to be a String, got #{value.class}"
raise ArgumentError, msg
end
end
def extract_multipart_upload_id(args, options)
value = args[2] || options.delete(:multipart_upload_id)
case value
when String then value
when nil then raise ArgumentError, "missing required option :multipart_upload_id"
else
msg = "expected :multipart_upload_id to be a String, got #{value.class}"
raise ArgumentError, msg
end
end
def extract_part_number(args, options)
value = args[3] || options.delete(:part_number)
case value
when Integer then value
when nil then raise ArgumentError, "missing required option :part_number"
else
msg = "expected :part_number to be a Integer, got #{value.class}"
raise ArgumentError, msg
end
end
class Collection < Aws::Resources::Collection; end
end
end