# 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/master/CONTRIBUTING.md # # WARNING ABOUT GENERATED CODE module Aws::EC2 class Volume extend Aws::Deprecations # @overload def initialize(id, options = {}) # @param [String] id # @option options [Client] :client # @overload def initialize(options = {}) # @option options [required, String] :id # @option options [Client] :client def initialize(*args) options = Hash === args.last ? args.pop.dup : {} @id = extract_id(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 id @id end alias :volume_id :id # Information about the volume attachments. # @return [Array] def attachments data[:attachments] end # The Availability Zone for the volume. # @return [String] def availability_zone data[:availability_zone] end # The time stamp when volume creation was initiated. # @return [Time] def create_time data[:create_time] end # Indicates whether the volume is encrypted. # @return [Boolean] def encrypted data[:encrypted] end # The Amazon Resource Name (ARN) of the AWS Key Management Service (AWS # KMS) customer master key (CMK) that was used to protect the volume # encryption key for the volume. # @return [String] def kms_key_id data[:kms_key_id] end # The Amazon Resource Name (ARN) of the Outpost. # @return [String] def outpost_arn data[:outpost_arn] end # The size of the volume, in GiBs. # @return [Integer] def size data[:size] end # The snapshot from which the volume was created, if applicable. # @return [String] def snapshot_id data[:snapshot_id] end # The volume state. # @return [String] def state data[:state] end # The number of I/O operations per second (IOPS). For `gp3`, `io1`, and # `io2` volumes, this represents the number of IOPS that are provisioned # for the volume. For `gp2` volumes, this represents the baseline # performance of the volume and the rate at which the volume accumulates # I/O credits for bursting. # @return [Integer] def iops data[:iops] end # Any tags assigned to the volume. # @return [Array] def tags data[:tags] end # The volume type. # @return [String] def volume_type data[:volume_type] end # Indicates whether the volume was created using fast snapshot restore. # @return [Boolean] def fast_restored data[:fast_restored] end # Indicates whether Amazon EBS Multi-Attach is enabled. # @return [Boolean] def multi_attach_enabled data[:multi_attach_enabled] end # The throughput that the volume supports, in MiB/s. # @return [Integer] def throughput data[:throughput] end # @!endgroup # @return [Client] def client @client end # Loads, or reloads {#data} for the current {Volume}. # Returns `self` making it possible to chain methods. # # volume.reload.data # # @return [self] def load resp = @client.describe_volumes(volume_ids: [@id]) @data = resp.volumes[0] self end alias :reload :load # @return [Types::Volume] # Returns the data for this {Volume}. Calls # {Client#describe_volumes} if {#data_loaded?} is `false`. 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::EC2::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::Waiters::Waiter.new(options).wait({}) end # @!group Actions # @example Request syntax with placeholder values # # volume.attach_to_instance({ # device: "String", # required # instance_id: "InstanceId", # required # dry_run: false, # }) # @param [Hash] options ({}) # @option options [required, String] :device # The device name (for example, `/dev/sdh` or `xvdh`). # @option options [required, String] :instance_id # The ID of the instance. # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [Types::VolumeAttachment] def attach_to_instance(options = {}) options = options.merge(volume_id: @id) resp = @client.attach_volume(options) resp.data end # @example Request syntax with placeholder values # # snapshot = volume.create_snapshot({ # description: "String", # tag_specifications: [ # { # resource_type: "client-vpn-endpoint", # accepts client-vpn-endpoint, customer-gateway, dedicated-host, dhcp-options, egress-only-internet-gateway, elastic-ip, elastic-gpu, export-image-task, export-instance-task, fleet, fpga-image, host-reservation, image, import-image-task, import-snapshot-task, instance, internet-gateway, key-pair, launch-template, local-gateway-route-table-vpc-association, natgateway, network-acl, network-interface, placement-group, reserved-instances, route-table, security-group, snapshot, spot-fleet-request, spot-instances-request, subnet, traffic-mirror-filter, traffic-mirror-session, traffic-mirror-target, transit-gateway, transit-gateway-attachment, transit-gateway-multicast-domain, transit-gateway-route-table, volume, vpc, vpc-peering-connection, vpn-connection, vpn-gateway, vpc-flow-log # tags: [ # { # key: "String", # value: "String", # }, # ], # }, # ], # dry_run: false, # }) # @param [Hash] options ({}) # @option options [String] :description # A description for the snapshot. # @option options [Array] :tag_specifications # The tags to apply to the snapshot during creation. # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [Snapshot] def create_snapshot(options = {}) options = options.merge(volume_id: @id) resp = @client.create_snapshot(options) Snapshot.new( id: resp.data.snapshot_id, data: resp.data, client: @client ) end # @example Request syntax with placeholder values # # tag = volume.create_tags({ # dry_run: false, # tags: [ # required # { # key: "String", # value: "String", # }, # ], # }) # @param [Hash] options ({}) # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @option options [required, Array] :tags # The tags. The `value` parameter is required, but if you don't want # the tag to have a value, specify the parameter with no value, and we # set the value to an empty string. # @return [Tag::Collection] def create_tags(options = {}) batch = [] options = Aws::Util.deep_merge(options, resources: [@id]) resp = @client.create_tags(options) options[:tags].each do |t| batch << Tag.new( resource_id: @id, key: t[:key], value: t[:value], client: @client ) end Tag::Collection.new([batch], size: batch.size) end # @example Request syntax with placeholder values # # tag = volume.delete_tags({ # dry_run: false, # tags: [ # { # key: "String", # value: "String", # }, # ], # }) # @param [Hash] options ({}) # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @option options [Array] :tags # The tags to delete. Specify a tag key and an optional tag value to # delete specific tags. If you specify a tag key without a tag value, we # delete any tag with this key regardless of its value. If you specify a # tag key with an empty string as the tag value, we delete the tag only # if its value is an empty string. # # If you omit this parameter, we delete all user-defined tags for the # specified resources. We do not delete AWS-generated tags (tags that # have the `aws:` prefix). # @return [Tag::Collection] def delete_tags(options = {}) batch = [] options = Aws::Util.deep_merge(options, resources: [@id]) resp = @client.delete_tags(options) options[:tags].each do |t| batch << Tag.new( resource_id: @id, key: t[:key], value: t[:value], client: @client ) end Tag::Collection.new([batch], size: batch.size) end # @example Request syntax with placeholder values # # volume.delete({ # dry_run: false, # }) # @param [Hash] options ({}) # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [EmptyStructure] def delete(options = {}) options = options.merge(volume_id: @id) resp = @client.delete_volume(options) resp.data end # @example Request syntax with placeholder values # # volume.describe_attribute({ # attribute: "autoEnableIO", # required, accepts autoEnableIO, productCodes # dry_run: false, # }) # @param [Hash] options ({}) # @option options [required, String] :attribute # The attribute of the volume. This parameter is required. # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [Types::DescribeVolumeAttributeResult] def describe_attribute(options = {}) options = options.merge(volume_id: @id) resp = @client.describe_volume_attribute(options) resp.data end # @example Request syntax with placeholder values # # volume.describe_status({ # filters: [ # { # name: "String", # values: ["String"], # }, # ], # max_results: 1, # next_token: "String", # dry_run: false, # }) # @param [Hash] options ({}) # @option options [Array] :filters # The filters. # # * `action.code` - The action code for the event (for example, # `enable-volume-io`). # # * `action.description` - A description of the action. # # * `action.event-id` - The event ID associated with the action. # # * `availability-zone` - The Availability Zone of the instance. # # * `event.description` - A description of the event. # # * `event.event-id` - The event ID. # # * `event.event-type` - The event type (for `io-enabled`\: `passed` \| # `failed`; for `io-performance`\: `io-performance:degraded` \| # `io-performance:severely-degraded` \| `io-performance:stalled`). # # * `event.not-after` - The latest end time for the event. # # * `event.not-before` - The earliest start time for the event. # # * `volume-status.details-name` - The cause for `volume-status.status` # (`io-enabled` \| `io-performance`). # # * `volume-status.details-status` - The status of # `volume-status.details-name` (for `io-enabled`\: `passed` \| # `failed`; for `io-performance`\: `normal` \| `degraded` \| # `severely-degraded` \| `stalled`). # # * `volume-status.status` - The status of the volume (`ok` \| # `impaired` \| `warning` \| `insufficient-data`). # @option options [Integer] :max_results # The maximum number of volume results returned by # `DescribeVolumeStatus` in paginated output. When this parameter is # used, the request only returns `MaxResults` results in a single page # along with a `NextToken` response element. The remaining results of # the initial request can be seen by sending another request with the # returned `NextToken` value. This value can be between 5 and 1,000; if # `MaxResults` is given a value larger than 1,000, only 1,000 results # are returned. If this parameter is not used, then # `DescribeVolumeStatus` returns all results. You cannot specify this # parameter and the volume IDs parameter in the same request. # @option options [String] :next_token # The `NextToken` value to include in a future `DescribeVolumeStatus` # request. When the results of the request exceed `MaxResults`, this # value can be used to retrieve the next page of results. This value is # `null` when there are no more results to return. # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [Types::DescribeVolumeStatusResult] def describe_status(options = {}) options = Aws::Util.deep_merge(options, volume_ids: [@id]) resp = @client.describe_volume_status(options) resp.data end # @example Request syntax with placeholder values # # volume.detach_from_instance({ # device: "String", # force: false, # instance_id: "InstanceId", # dry_run: false, # }) # @param [Hash] options ({}) # @option options [String] :device # The device name. # @option options [Boolean] :force # Forces detachment if the previous detachment attempt did not occur # cleanly (for example, logging into an instance, unmounting the volume, # and detaching normally). This option can lead to data loss or a # corrupted file system. Use this option only as a last resort to detach # a volume from a failed instance. The instance won't have an # opportunity to flush file system caches or file system metadata. If # you use this option, you must perform file system check and repair # procedures. # @option options [String] :instance_id # The ID of the instance. If you are detaching a Multi-Attach enabled # volume, you must specify an instance ID. # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [Types::VolumeAttachment] def detach_from_instance(options = {}) options = options.merge(volume_id: @id) resp = @client.detach_volume(options) resp.data end # @example Request syntax with placeholder values # # volume.enable_io({ # dry_run: false, # }) # @param [Hash] options ({}) # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [EmptyStructure] def enable_io(options = {}) options = options.merge(volume_id: @id) resp = @client.enable_volume_io(options) resp.data end # @example Request syntax with placeholder values # # volume.modify_attribute({ # auto_enable_io: { # value: false, # }, # dry_run: false, # }) # @param [Hash] options ({}) # @option options [Types::AttributeBooleanValue] :auto_enable_io # Indicates whether the volume should be auto-enabled for I/O # operations. # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [EmptyStructure] def modify_attribute(options = {}) options = options.merge(volume_id: @id) resp = @client.modify_volume_attribute(options) resp.data end # @!group Associations # @example Request syntax with placeholder values # # snapshots = volume.snapshots({ # filters: [ # { # name: "String", # values: ["String"], # }, # ], # owner_ids: ["String"], # restorable_by_user_ids: ["String"], # snapshot_ids: ["SnapshotId"], # dry_run: false, # }) # @param [Hash] options ({}) # @option options [Array] :filters # The filters. # # * `description` - A description of the snapshot. # # * `encrypted` - Indicates whether the snapshot is encrypted (`true` \| # `false`) # # * `owner-alias` - The owner alias, from an Amazon-maintained list # (`amazon`). This is not the user-configured AWS account alias set # using the IAM console. We recommend that you use the related # parameter instead of this filter. # # * `owner-id` - The AWS account ID of the owner. We recommend that you # use the related parameter instead of this filter. # # * `progress` - The progress of the snapshot, as a percentage (for # example, 80%). # # * `snapshot-id` - The snapshot ID. # # * `start-time` - The time stamp when the snapshot was initiated. # # * `status` - The status of the snapshot (`pending` \| `completed` \| # `error`). # # * `tag`\:<key> - The key/value combination of a tag assigned to # the resource. Use the tag key in the filter name and the tag value # as the filter value. For example, to find all resources that have a # tag with the key `Owner` and the value `TeamA`, specify `tag:Owner` # for the filter name and `TeamA` for the filter value. # # * `tag-key` - The key of a tag assigned to the resource. Use this # filter to find all resources assigned a tag with a specific key, # regardless of the tag value. # # * `volume-id` - The ID of the volume the snapshot is for. # # * `volume-size` - The size of the volume, in GiB. # @option options [Array] :owner_ids # Scopes the results to snapshots with the specified owners. You can # specify a combination of AWS account IDs, `self`, and `amazon`. # @option options [Array] :restorable_by_user_ids # The IDs of the AWS accounts that can create volumes from the snapshot. # @option options [Array] :snapshot_ids # The snapshot IDs. # # Default: Describes the snapshots for which you have create volume # permissions. # @option options [Boolean] :dry_run # Checks whether you have the required permissions for the action, # without actually making the request, and provides an error response. # If you have the required permissions, the error response is # `DryRunOperation`. Otherwise, it is `UnauthorizedOperation`. # @return [Snapshot::Collection] def snapshots(options = {}) batches = Enumerator.new do |y| options = Aws::Util.deep_merge(options, filters: [{ name: "volume-id", values: [@id] }]) resp = @client.describe_snapshots(options) resp.each_page do |page| batch = [] page.data.snapshots.each do |s| batch << Snapshot.new( id: s.snapshot_id, data: s, client: @client ) end y.yield(batch) end end Snapshot::Collection.new(batches) end # @deprecated # @api private def identifiers { id: @id } end deprecated(:identifiers) private def extract_id(args, options) value = args[0] || options.delete(:id) case value when String then value when nil then raise ArgumentError, "missing required option :id" else msg = "expected :id to be a String, got #{value.class}" raise ArgumentError, msg end end class Collection < Aws::Resources::Collection; end end end