# Copyright 2015 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'date'
require 'google/apis/core/base_service'
require 'google/apis/core/json_representation'
require 'google/apis/core/hashable'
require 'google/apis/errors'

module Google
  module Apis
    module StoragetransferV1
      
      # Google service account
      class GoogleServiceAccount
        include Google::Apis::Core::Hashable
      
        # Required.
        # Corresponds to the JSON property `accountEmail`
        # @return [String]
        attr_accessor :account_email
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @account_email = args[:account_email] if args.key?(:account_email)
        end
      end
      
      # This resource represents the configuration of a transfer job that runs
      # periodically.
      class TransferJob
        include Google::Apis::Core::Hashable
      
        # A globally unique name assigned by Storage Transfer Service when the job is
        # created. This field should be left empty in requests to create a new transfer
        # job; otherwise, the requests result in an `INVALID_ARGUMENT` error.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # A description provided by the user for the job. Its max length is 1024 bytes
        # when Unicode-encoded.
        # Corresponds to the JSON property `description`
        # @return [String]
        attr_accessor :description
      
        # The ID of the Google Developers Console project that owns the job. Required.
        # Corresponds to the JSON property `projectId`
        # @return [String]
        attr_accessor :project_id
      
        # Configuration for running a transfer.
        # Corresponds to the JSON property `transferSpec`
        # @return [Google::Apis::StoragetransferV1::TransferSpec]
        attr_accessor :transfer_spec
      
        # Transfers can be scheduled to recur or to run just once.
        # Corresponds to the JSON property `schedule`
        # @return [Google::Apis::StoragetransferV1::Schedule]
        attr_accessor :schedule
      
        # Status of the job. This value MUST be specified for `CreateTransferJobRequests`
        # . NOTE: The effect of the new job status takes place during a subsequent job
        # run. For example, if you change the job status from `ENABLED` to `DISABLED`,
        # and an operation spawned by the transfer is running, the status change would
        # not affect the current operation.
        # Corresponds to the JSON property `status`
        # @return [String]
        attr_accessor :status
      
        # This field cannot be changed by user requests.
        # Corresponds to the JSON property `creationTime`
        # @return [String]
        attr_accessor :creation_time
      
        # This field cannot be changed by user requests.
        # Corresponds to the JSON property `lastModificationTime`
        # @return [String]
        attr_accessor :last_modification_time
      
        # This field cannot be changed by user requests.
        # Corresponds to the JSON property `deletionTime`
        # @return [String]
        attr_accessor :deletion_time
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @name = args[:name] if args.key?(:name)
          @description = args[:description] if args.key?(:description)
          @project_id = args[:project_id] if args.key?(:project_id)
          @transfer_spec = args[:transfer_spec] if args.key?(:transfer_spec)
          @schedule = args[:schedule] if args.key?(:schedule)
          @status = args[:status] if args.key?(:status)
          @creation_time = args[:creation_time] if args.key?(:creation_time)
          @last_modification_time = args[:last_modification_time] if args.key?(:last_modification_time)
          @deletion_time = args[:deletion_time] if args.key?(:deletion_time)
        end
      end
      
      # Configuration for running a transfer.
      class TransferSpec
        include Google::Apis::Core::Hashable
      
        # In a GcsData, an object's name is the Google Cloud Storage object's name and
        # its `lastModificationTime` refers to the object's updated time, which changes
        # when the content or the metadata of the object is updated.
        # Corresponds to the JSON property `gcsDataSource`
        # @return [Google::Apis::StoragetransferV1::GcsData]
        attr_accessor :gcs_data_source
      
        # An AwsS3Data can be a data source, but not a data sink. In an AwsS3Data, an
        # object's name is the S3 object's key name.
        # Corresponds to the JSON property `awsS3DataSource`
        # @return [Google::Apis::StoragetransferV1::AwsS3Data]
        attr_accessor :aws_s3_data_source
      
        # An HttpData specifies a list of objects on the web to be transferred over HTTP.
        # The information of the objects to be transferred is contained in a file
        # referenced by a URL. The first line in the file must be "TsvHttpData-1.0",
        # which specifies the format of the file. Subsequent lines specify the
        # information of the list of objects, one object per list entry. Each entry has
        # the following tab-delimited fields: * HTTP URL * Length * MD5 - This field is
        # a base64-encoded MD5 hash of the object An HTTP URL that points to the object
        # to be transferred. It must be a valid URL with URL scheme HTTP or HTTPS. When
        # an object with URL `http(s)://hostname:port/` is transferred to the data sink,
        # the name of the object at the data sink is `/`. Length and MD5 provide the
        # size and the base64-encoded MD5 hash of the object. If Length does not match
        # the actual length of the object fetched, the object will not be transferred.
        # If MD5 does not match the MD5 computed from the transferred bytes, the object
        # transfer will fail. `lastModificationTime` is not available in HttpData
        # objects. The objects that the URL list points to must allow public access.
        # Storage Transfer Service obeys `robots.txt` rules and requires the HTTP server
        # to support Range requests and to return a Content-Length header in each
        # response.
        # Corresponds to the JSON property `httpDataSource`
        # @return [Google::Apis::StoragetransferV1::HttpData]
        attr_accessor :http_data_source
      
        # In a GcsData, an object's name is the Google Cloud Storage object's name and
        # its `lastModificationTime` refers to the object's updated time, which changes
        # when the content or the metadata of the object is updated.
        # Corresponds to the JSON property `gcsDataSink`
        # @return [Google::Apis::StoragetransferV1::GcsData]
        attr_accessor :gcs_data_sink
      
        # Conditions that determine which objects will be transferred.
        # Corresponds to the JSON property `objectConditions`
        # @return [Google::Apis::StoragetransferV1::ObjectConditions]
        attr_accessor :object_conditions
      
        # TransferOptions uses three boolean parameters to define the actions to be
        # performed on objects in a transfer.
        # Corresponds to the JSON property `transferOptions`
        # @return [Google::Apis::StoragetransferV1::TransferOptions]
        attr_accessor :transfer_options
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @gcs_data_source = args[:gcs_data_source] if args.key?(:gcs_data_source)
          @aws_s3_data_source = args[:aws_s3_data_source] if args.key?(:aws_s3_data_source)
          @http_data_source = args[:http_data_source] if args.key?(:http_data_source)
          @gcs_data_sink = args[:gcs_data_sink] if args.key?(:gcs_data_sink)
          @object_conditions = args[:object_conditions] if args.key?(:object_conditions)
          @transfer_options = args[:transfer_options] if args.key?(:transfer_options)
        end
      end
      
      # In a GcsData, an object's name is the Google Cloud Storage object's name and
      # its `lastModificationTime` refers to the object's updated time, which changes
      # when the content or the metadata of the object is updated.
      class GcsData
        include Google::Apis::Core::Hashable
      
        # Google Cloud Storage bucket name (see [Bucket Name Requirements](https://cloud.
        # google.com/storage/docs/bucket-naming#requirements)). Required.
        # Corresponds to the JSON property `bucketName`
        # @return [String]
        attr_accessor :bucket_name
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @bucket_name = args[:bucket_name] if args.key?(:bucket_name)
        end
      end
      
      # An AwsS3Data can be a data source, but not a data sink. In an AwsS3Data, an
      # object's name is the S3 object's key name.
      class AwsS3Data
        include Google::Apis::Core::Hashable
      
        # S3 Bucket name (see [Creating a bucket](http://docs.aws.amazon.com/AmazonS3/
        # latest/dev/create-bucket-get-location-example.html)). Required.
        # Corresponds to the JSON property `bucketName`
        # @return [String]
        attr_accessor :bucket_name
      
        # AWS access key (see [AWS Security Credentials](http://docs.aws.amazon.com/
        # general/latest/gr/aws-security-credentials.html)).
        # Corresponds to the JSON property `awsAccessKey`
        # @return [Google::Apis::StoragetransferV1::AwsAccessKey]
        attr_accessor :aws_access_key
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @bucket_name = args[:bucket_name] if args.key?(:bucket_name)
          @aws_access_key = args[:aws_access_key] if args.key?(:aws_access_key)
        end
      end
      
      # AWS access key (see [AWS Security Credentials](http://docs.aws.amazon.com/
      # general/latest/gr/aws-security-credentials.html)).
      class AwsAccessKey
        include Google::Apis::Core::Hashable
      
        # AWS access key ID. Required.
        # Corresponds to the JSON property `accessKeyId`
        # @return [String]
        attr_accessor :access_key_id
      
        # AWS secret access key. This field is not returned in RPC responses. Required.
        # Corresponds to the JSON property `secretAccessKey`
        # @return [String]
        attr_accessor :secret_access_key
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @access_key_id = args[:access_key_id] if args.key?(:access_key_id)
          @secret_access_key = args[:secret_access_key] if args.key?(:secret_access_key)
        end
      end
      
      # An HttpData specifies a list of objects on the web to be transferred over HTTP.
      # The information of the objects to be transferred is contained in a file
      # referenced by a URL. The first line in the file must be "TsvHttpData-1.0",
      # which specifies the format of the file. Subsequent lines specify the
      # information of the list of objects, one object per list entry. Each entry has
      # the following tab-delimited fields: * HTTP URL * Length * MD5 - This field is
      # a base64-encoded MD5 hash of the object An HTTP URL that points to the object
      # to be transferred. It must be a valid URL with URL scheme HTTP or HTTPS. When
      # an object with URL `http(s)://hostname:port/` is transferred to the data sink,
      # the name of the object at the data sink is `/`. Length and MD5 provide the
      # size and the base64-encoded MD5 hash of the object. If Length does not match
      # the actual length of the object fetched, the object will not be transferred.
      # If MD5 does not match the MD5 computed from the transferred bytes, the object
      # transfer will fail. `lastModificationTime` is not available in HttpData
      # objects. The objects that the URL list points to must allow public access.
      # Storage Transfer Service obeys `robots.txt` rules and requires the HTTP server
      # to support Range requests and to return a Content-Length header in each
      # response.
      class HttpData
        include Google::Apis::Core::Hashable
      
        # The URL that points to the file that stores the object list entries. This file
        # must allow public access. Currently, only URLs with HTTP and HTTPS schemes are
        # supported. Required.
        # Corresponds to the JSON property `listUrl`
        # @return [String]
        attr_accessor :list_url
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @list_url = args[:list_url] if args.key?(:list_url)
        end
      end
      
      # Conditions that determine which objects will be transferred.
      class ObjectConditions
        include Google::Apis::Core::Hashable
      
        # If unspecified, `minTimeElapsedSinceLastModification` takes a zero value and `
        # maxTimeElapsedSinceLastModification` takes the maximum possible value of
        # Duration. Objects that satisfy the object conditions must either have a `
        # lastModificationTime` greater or equal to `NOW` - `
        # maxTimeElapsedSinceLastModification` and less than `NOW` - `
        # minTimeElapsedSinceLastModification`, or not have a `lastModificationTime`.
        # Corresponds to the JSON property `minTimeElapsedSinceLastModification`
        # @return [String]
        attr_accessor :min_time_elapsed_since_last_modification
      
        # `maxTimeElapsedSinceLastModification` is the complement to `
        # minTimeElapsedSinceLastModification`.
        # Corresponds to the JSON property `maxTimeElapsedSinceLastModification`
        # @return [String]
        attr_accessor :max_time_elapsed_since_last_modification
      
        # If `includePrefixes` is specified, objects that satisfy the object conditions
        # must have names that start with one of the `includePrefixes` and that do not
        # start with any of the `excludePrefixes`. If `includePrefixes` is not specified,
        # all objects except those that have names starting with one of the `
        # excludePrefixes` must satisfy the object conditions. Requirements: * Each
        # include-prefix and exclude-prefix can contain any sequence of Unicode
        # characters, of max length 1024 bytes when UTF8-encoded, and must not contain
        # Carriage Return or Line Feed characters. Wildcard matching and regular
        # expression matching are not supported. * None of the include-prefix or the
        # exclude-prefix values can be empty, if specified. * Each include-prefix must
        # include a distinct portion of the object namespace, i.e., no include-prefix
        # may be a prefix of another include-prefix. * Each exclude-prefix must exclude
        # a distinct portion of the object namespace, i.e., no exclude-prefix may be a
        # prefix of another exclude-prefix. * If `includePrefixes` is specified, then
        # each exclude-prefix must start with the value of a path explicitly included by
        # `includePrefixes`. The max size of `includePrefixes` is 20.
        # Corresponds to the JSON property `includePrefixes`
        # @return [Array<String>]
        attr_accessor :include_prefixes
      
        # `excludePrefixes` must follow the requirements described for `includePrefixes`.
        # The max size of `excludePrefixes` is 20.
        # Corresponds to the JSON property `excludePrefixes`
        # @return [Array<String>]
        attr_accessor :exclude_prefixes
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @min_time_elapsed_since_last_modification = args[:min_time_elapsed_since_last_modification] if args.key?(:min_time_elapsed_since_last_modification)
          @max_time_elapsed_since_last_modification = args[:max_time_elapsed_since_last_modification] if args.key?(:max_time_elapsed_since_last_modification)
          @include_prefixes = args[:include_prefixes] if args.key?(:include_prefixes)
          @exclude_prefixes = args[:exclude_prefixes] if args.key?(:exclude_prefixes)
        end
      end
      
      # TransferOptions uses three boolean parameters to define the actions to be
      # performed on objects in a transfer.
      class TransferOptions
        include Google::Apis::Core::Hashable
      
        # Whether overwriting objects that already exist in the sink is allowed.
        # Corresponds to the JSON property `overwriteObjectsAlreadyExistingInSink`
        # @return [Boolean]
        attr_accessor :overwrite_objects_already_existing_in_sink
        alias_method :overwrite_objects_already_existing_in_sink?, :overwrite_objects_already_existing_in_sink
      
        # Whether objects that exist only in the sink should be deleted.
        # Corresponds to the JSON property `deleteObjectsUniqueInSink`
        # @return [Boolean]
        attr_accessor :delete_objects_unique_in_sink
        alias_method :delete_objects_unique_in_sink?, :delete_objects_unique_in_sink
      
        # Whether objects should be deleted from the source after they are transferred
        # to the sink.
        # Corresponds to the JSON property `deleteObjectsFromSourceAfterTransfer`
        # @return [Boolean]
        attr_accessor :delete_objects_from_source_after_transfer
        alias_method :delete_objects_from_source_after_transfer?, :delete_objects_from_source_after_transfer
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @overwrite_objects_already_existing_in_sink = args[:overwrite_objects_already_existing_in_sink] if args.key?(:overwrite_objects_already_existing_in_sink)
          @delete_objects_unique_in_sink = args[:delete_objects_unique_in_sink] if args.key?(:delete_objects_unique_in_sink)
          @delete_objects_from_source_after_transfer = args[:delete_objects_from_source_after_transfer] if args.key?(:delete_objects_from_source_after_transfer)
        end
      end
      
      # Transfers can be scheduled to recur or to run just once.
      class Schedule
        include Google::Apis::Core::Hashable
      
        # Represents a whole calendar date, e.g. date of birth. The time of day and time
        # zone are either specified elsewhere or are not significant. The date is
        # relative to the Proleptic Gregorian Calendar. The day may be 0 to represent a
        # year and month where the day is not significant, e.g. credit card expiration
        # date. The year may be 0 to represent a month and day independent of year, e.g.
        # anniversary date. Related types are [google.type.TimeOfDay][google.type.
        # TimeOfDay] and `google.protobuf.Timestamp`.
        # Corresponds to the JSON property `scheduleStartDate`
        # @return [Google::Apis::StoragetransferV1::Date]
        attr_accessor :schedule_start_date
      
        # Represents a whole calendar date, e.g. date of birth. The time of day and time
        # zone are either specified elsewhere or are not significant. The date is
        # relative to the Proleptic Gregorian Calendar. The day may be 0 to represent a
        # year and month where the day is not significant, e.g. credit card expiration
        # date. The year may be 0 to represent a month and day independent of year, e.g.
        # anniversary date. Related types are [google.type.TimeOfDay][google.type.
        # TimeOfDay] and `google.protobuf.Timestamp`.
        # Corresponds to the JSON property `scheduleEndDate`
        # @return [Google::Apis::StoragetransferV1::Date]
        attr_accessor :schedule_end_date
      
        # Represents a time of day. The date and time zone are either not significant or
        # are specified elsewhere. An API may chose to allow leap seconds. Related types
        # are [google.type.Date][google.type.Date] and `google.protobuf.Timestamp`.
        # Corresponds to the JSON property `startTimeOfDay`
        # @return [Google::Apis::StoragetransferV1::TimeOfDay]
        attr_accessor :start_time_of_day
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @schedule_start_date = args[:schedule_start_date] if args.key?(:schedule_start_date)
          @schedule_end_date = args[:schedule_end_date] if args.key?(:schedule_end_date)
          @start_time_of_day = args[:start_time_of_day] if args.key?(:start_time_of_day)
        end
      end
      
      # Represents a whole calendar date, e.g. date of birth. The time of day and time
      # zone are either specified elsewhere or are not significant. The date is
      # relative to the Proleptic Gregorian Calendar. The day may be 0 to represent a
      # year and month where the day is not significant, e.g. credit card expiration
      # date. The year may be 0 to represent a month and day independent of year, e.g.
      # anniversary date. Related types are [google.type.TimeOfDay][google.type.
      # TimeOfDay] and `google.protobuf.Timestamp`.
      class Date
        include Google::Apis::Core::Hashable
      
        # Year of date. Must be from 1 to 9,999, or 0 if specifying a date without a
        # year.
        # Corresponds to the JSON property `year`
        # @return [Fixnum]
        attr_accessor :year
      
        # Month of year of date. Must be from 1 to 12.
        # Corresponds to the JSON property `month`
        # @return [Fixnum]
        attr_accessor :month
      
        # Day of month. Must be from 1 to 31 and valid for the year and month, or 0 if
        # specifying a year/month where the day is not sigificant.
        # Corresponds to the JSON property `day`
        # @return [Fixnum]
        attr_accessor :day
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @year = args[:year] if args.key?(:year)
          @month = args[:month] if args.key?(:month)
          @day = args[:day] if args.key?(:day)
        end
      end
      
      # Represents a time of day. The date and time zone are either not significant or
      # are specified elsewhere. An API may chose to allow leap seconds. Related types
      # are [google.type.Date][google.type.Date] and `google.protobuf.Timestamp`.
      class TimeOfDay
        include Google::Apis::Core::Hashable
      
        # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose to
        # allow the value "24:00:00" for scenarios like business closing time.
        # Corresponds to the JSON property `hours`
        # @return [Fixnum]
        attr_accessor :hours
      
        # Minutes of hour of day. Must be from 0 to 59.
        # Corresponds to the JSON property `minutes`
        # @return [Fixnum]
        attr_accessor :minutes
      
        # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
        # allow the value 60 if it allows leap-seconds.
        # Corresponds to the JSON property `seconds`
        # @return [Fixnum]
        attr_accessor :seconds
      
        # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
        # Corresponds to the JSON property `nanos`
        # @return [Fixnum]
        attr_accessor :nanos
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @hours = args[:hours] if args.key?(:hours)
          @minutes = args[:minutes] if args.key?(:minutes)
          @seconds = args[:seconds] if args.key?(:seconds)
          @nanos = args[:nanos] if args.key?(:nanos)
        end
      end
      
      # Request passed to UpdateTransferJob.
      class UpdateTransferJobRequest
        include Google::Apis::Core::Hashable
      
        # The ID of the Google Developers Console project that owns the job. Required.
        # Corresponds to the JSON property `projectId`
        # @return [String]
        attr_accessor :project_id
      
        # This resource represents the configuration of a transfer job that runs
        # periodically.
        # Corresponds to the JSON property `transferJob`
        # @return [Google::Apis::StoragetransferV1::TransferJob]
        attr_accessor :transfer_job
      
        # The field mask of the fields in `transferJob` that are to be updated in this
        # request. Fields in `transferJob` that can be updated are: `description`, `
        # transferSpec`, and `status`. To update the `transferSpec` of the job, a
        # complete transfer specification has to be provided. An incomplete
        # specification which misses any required fields will be rejected with the error
        # `INVALID_ARGUMENT`.
        # Corresponds to the JSON property `updateTransferJobFieldMask`
        # @return [String]
        attr_accessor :update_transfer_job_field_mask
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @project_id = args[:project_id] if args.key?(:project_id)
          @transfer_job = args[:transfer_job] if args.key?(:transfer_job)
          @update_transfer_job_field_mask = args[:update_transfer_job_field_mask] if args.key?(:update_transfer_job_field_mask)
        end
      end
      
      # Response from ListTransferJobs.
      class ListTransferJobsResponse
        include Google::Apis::Core::Hashable
      
        # A list of transfer jobs.
        # Corresponds to the JSON property `transferJobs`
        # @return [Array<Google::Apis::StoragetransferV1::TransferJob>]
        attr_accessor :transfer_jobs
      
        # The list next page token.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @transfer_jobs = args[:transfer_jobs] if args.key?(:transfer_jobs)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # Request passed to PauseTransferOperation.
      class PauseTransferOperationRequest
        include Google::Apis::Core::Hashable
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
        end
      end
      
      # A generic empty message that you can re-use to avoid defining duplicated empty
      # messages in your APIs. A typical example is to use it as the request or the
      # response type of an API method. For instance: service Foo ` rpc Bar(google.
      # protobuf.Empty) returns (google.protobuf.Empty); ` The JSON representation for
      # `Empty` is empty JSON object ````.
      class Empty
        include Google::Apis::Core::Hashable
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
        end
      end
      
      # Request passed to ResumeTransferOperation.
      class ResumeTransferOperationRequest
        include Google::Apis::Core::Hashable
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
        end
      end
      
      # This resource represents a long-running operation that is the result of a
      # network API call.
      class Operation
        include Google::Apis::Core::Hashable
      
        # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping above, the `name`
        # should have the format of `operations/some/unique/name`.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # Represents the transfer operation object.
        # Corresponds to the JSON property `metadata`
        # @return [Hash<String,Object>]
        attr_accessor :metadata
      
        # If the value is `false`, it means the operation is still in progress. If true,
        # the operation is completed and the `result` is available.
        # Corresponds to the JSON property `done`
        # @return [Boolean]
        attr_accessor :done
        alias_method :done?, :done
      
        # The `Status` type defines a logical error model that is suitable for different
        # programming environments, including REST APIs and RPC APIs. It is used by [
        # gRPC](https://github.com/grpc). The error model is designed to be: - Simple to
        # use and understand for most users - Flexible enough to meet unexpected needs #
        # Overview The `Status` message contains three pieces of data: error code, error
        # message, and error details. The error code should be an enum value of [google.
        # rpc.Code][google.rpc.Code], but it may accept additional error codes if needed.
        # The error message should be a developer-facing English message that helps
        # developers *understand* and *resolve* the error. If a localized user-facing
        # error message is needed, put the localized message in the error details or
        # localize it in the client. The optional error details may contain arbitrary
        # information about the error. There is a predefined set of error detail types
        # in the package `google.rpc` which can be used for common error conditions. #
        # Language mapping The `Status` message is the logical representation of the
        # error model, but it is not necessarily the actual wire format. When the `
        # Status` message is exposed in different client libraries and different wire
        # protocols, it can be mapped differently. For example, it will likely be mapped
        # to some exceptions in Java, but more likely mapped to some error codes in C. #
        # Other uses The error model and the `Status` message can be used in a variety
        # of environments, either with or without APIs, to provide a consistent
        # developer experience across different environments. Example uses of this error
        # model include: - Partial errors. If a service needs to return partial errors
        # to the client, it may embed the `Status` in the normal response to indicate
        # the partial errors. - Workflow errors. A typical workflow has multiple steps.
        # Each step may have a `Status` message for error reporting purpose. - Batch
        # operations. If a client uses batch request and batch response, the `Status`
        # message should be used directly inside batch response, one for each error sub-
        # response. - Asynchronous operations. If an API call embeds asynchronous
        # operation results in its response, the status of those operations should be
        # represented directly using the `Status` message. - Logging. If some API errors
        # are stored in logs, the message `Status` could be used directly after any
        # stripping needed for security/privacy reasons.
        # Corresponds to the JSON property `error`
        # @return [Google::Apis::StoragetransferV1::Status]
        attr_accessor :error
      
        # The normal response of the operation in case of success. If the original
        # method returns no data on success, such as `Delete`, the response is `google.
        # protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`,
        # the response should be the resource. For other methods, the response should
        # have the type `XxxResponse`, where `Xxx` is the original method name. For
        # example, if the original method name is `TakeSnapshot()`, the inferred
        # response type is `TakeSnapshotResponse`.
        # Corresponds to the JSON property `response`
        # @return [Hash<String,Object>]
        attr_accessor :response
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @name = args[:name] if args.key?(:name)
          @metadata = args[:metadata] if args.key?(:metadata)
          @done = args[:done] if args.key?(:done)
          @error = args[:error] if args.key?(:error)
          @response = args[:response] if args.key?(:response)
        end
      end
      
      # The `Status` type defines a logical error model that is suitable for different
      # programming environments, including REST APIs and RPC APIs. It is used by [
      # gRPC](https://github.com/grpc). The error model is designed to be: - Simple to
      # use and understand for most users - Flexible enough to meet unexpected needs #
      # Overview The `Status` message contains three pieces of data: error code, error
      # message, and error details. The error code should be an enum value of [google.
      # rpc.Code][google.rpc.Code], but it may accept additional error codes if needed.
      # The error message should be a developer-facing English message that helps
      # developers *understand* and *resolve* the error. If a localized user-facing
      # error message is needed, put the localized message in the error details or
      # localize it in the client. The optional error details may contain arbitrary
      # information about the error. There is a predefined set of error detail types
      # in the package `google.rpc` which can be used for common error conditions. #
      # Language mapping The `Status` message is the logical representation of the
      # error model, but it is not necessarily the actual wire format. When the `
      # Status` message is exposed in different client libraries and different wire
      # protocols, it can be mapped differently. For example, it will likely be mapped
      # to some exceptions in Java, but more likely mapped to some error codes in C. #
      # Other uses The error model and the `Status` message can be used in a variety
      # of environments, either with or without APIs, to provide a consistent
      # developer experience across different environments. Example uses of this error
      # model include: - Partial errors. If a service needs to return partial errors
      # to the client, it may embed the `Status` in the normal response to indicate
      # the partial errors. - Workflow errors. A typical workflow has multiple steps.
      # Each step may have a `Status` message for error reporting purpose. - Batch
      # operations. If a client uses batch request and batch response, the `Status`
      # message should be used directly inside batch response, one for each error sub-
      # response. - Asynchronous operations. If an API call embeds asynchronous
      # operation results in its response, the status of those operations should be
      # represented directly using the `Status` message. - Logging. If some API errors
      # are stored in logs, the message `Status` could be used directly after any
      # stripping needed for security/privacy reasons.
      class Status
        include Google::Apis::Core::Hashable
      
        # The status code, which should be an enum value of [google.rpc.Code][google.rpc.
        # Code].
        # Corresponds to the JSON property `code`
        # @return [Fixnum]
        attr_accessor :code
      
        # A developer-facing error message, which should be in English. Any user-facing
        # error message should be localized and sent in the [google.rpc.Status.details][
        # google.rpc.Status.details] field, or localized by the client.
        # Corresponds to the JSON property `message`
        # @return [String]
        attr_accessor :message
      
        # A list of messages that carry the error details. There will be a common set of
        # message types for APIs to use.
        # Corresponds to the JSON property `details`
        # @return [Array<Hash<String,Object>>]
        attr_accessor :details
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @code = args[:code] if args.key?(:code)
          @message = args[:message] if args.key?(:message)
          @details = args[:details] if args.key?(:details)
        end
      end
      
      # The response message for [Operations.ListOperations][google.longrunning.
      # Operations.ListOperations].
      class ListOperationsResponse
        include Google::Apis::Core::Hashable
      
        # A list of operations that matches the specified filter in the request.
        # Corresponds to the JSON property `operations`
        # @return [Array<Google::Apis::StoragetransferV1::Operation>]
        attr_accessor :operations
      
        # The standard List next-page token.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @operations = args[:operations] if args.key?(:operations)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # A description of the execution of a transfer.
      class TransferOperation
        include Google::Apis::Core::Hashable
      
        # A globally unique ID assigned by the system.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # The ID of the Google Developers Console project that owns the operation.
        # Required.
        # Corresponds to the JSON property `projectId`
        # @return [String]
        attr_accessor :project_id
      
        # Configuration for running a transfer.
        # Corresponds to the JSON property `transferSpec`
        # @return [Google::Apis::StoragetransferV1::TransferSpec]
        attr_accessor :transfer_spec
      
        # Start time of this transfer execution.
        # Corresponds to the JSON property `startTime`
        # @return [String]
        attr_accessor :start_time
      
        # End time of this transfer execution.
        # Corresponds to the JSON property `endTime`
        # @return [String]
        attr_accessor :end_time
      
        # Status of the transfer operation.
        # Corresponds to the JSON property `status`
        # @return [String]
        attr_accessor :status
      
        # A collection of counters that report the progress of a transfer operation.
        # Corresponds to the JSON property `counters`
        # @return [Google::Apis::StoragetransferV1::TransferCounters]
        attr_accessor :counters
      
        # Summarizes errors encountered with sample error log entries.
        # Corresponds to the JSON property `errorBreakdowns`
        # @return [Array<Google::Apis::StoragetransferV1::ErrorSummary>]
        attr_accessor :error_breakdowns
      
        # The name of the transfer job that triggers this transfer operation.
        # Corresponds to the JSON property `transferJobName`
        # @return [String]
        attr_accessor :transfer_job_name
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @name = args[:name] if args.key?(:name)
          @project_id = args[:project_id] if args.key?(:project_id)
          @transfer_spec = args[:transfer_spec] if args.key?(:transfer_spec)
          @start_time = args[:start_time] if args.key?(:start_time)
          @end_time = args[:end_time] if args.key?(:end_time)
          @status = args[:status] if args.key?(:status)
          @counters = args[:counters] if args.key?(:counters)
          @error_breakdowns = args[:error_breakdowns] if args.key?(:error_breakdowns)
          @transfer_job_name = args[:transfer_job_name] if args.key?(:transfer_job_name)
        end
      end
      
      # A collection of counters that report the progress of a transfer operation.
      class TransferCounters
        include Google::Apis::Core::Hashable
      
        # Objects found in the data source that are scheduled to be transferred, which
        # will be copied, excluded based on conditions, or skipped due to failures.
        # Corresponds to the JSON property `objectsFoundFromSource`
        # @return [String]
        attr_accessor :objects_found_from_source
      
        # Bytes found in the data source that are scheduled to be transferred, which
        # will be copied, excluded based on conditions, or skipped due to failures.
        # Corresponds to the JSON property `bytesFoundFromSource`
        # @return [String]
        attr_accessor :bytes_found_from_source
      
        # Objects found only in the data sink that are scheduled to be deleted.
        # Corresponds to the JSON property `objectsFoundOnlyFromSink`
        # @return [String]
        attr_accessor :objects_found_only_from_sink
      
        # Bytes found only in the data sink that are scheduled to be deleted.
        # Corresponds to the JSON property `bytesFoundOnlyFromSink`
        # @return [String]
        attr_accessor :bytes_found_only_from_sink
      
        # Objects in the data source that are not transferred because they already exist
        # in the data sink.
        # Corresponds to the JSON property `objectsFromSourceSkippedBySync`
        # @return [String]
        attr_accessor :objects_from_source_skipped_by_sync
      
        # Bytes in the data source that are not transferred because they already exist
        # in the data sink.
        # Corresponds to the JSON property `bytesFromSourceSkippedBySync`
        # @return [String]
        attr_accessor :bytes_from_source_skipped_by_sync
      
        # Objects that are copied to the data sink.
        # Corresponds to the JSON property `objectsCopiedToSink`
        # @return [String]
        attr_accessor :objects_copied_to_sink
      
        # Bytes that are copied to the data sink.
        # Corresponds to the JSON property `bytesCopiedToSink`
        # @return [String]
        attr_accessor :bytes_copied_to_sink
      
        # Objects that are deleted from the data source.
        # Corresponds to the JSON property `objectsDeletedFromSource`
        # @return [String]
        attr_accessor :objects_deleted_from_source
      
        # Bytes that are deleted from the data source.
        # Corresponds to the JSON property `bytesDeletedFromSource`
        # @return [String]
        attr_accessor :bytes_deleted_from_source
      
        # Objects that are deleted from the data sink.
        # Corresponds to the JSON property `objectsDeletedFromSink`
        # @return [String]
        attr_accessor :objects_deleted_from_sink
      
        # Bytes that are deleted from the data sink.
        # Corresponds to the JSON property `bytesDeletedFromSink`
        # @return [String]
        attr_accessor :bytes_deleted_from_sink
      
        # Objects in the data source that failed during the transfer.
        # Corresponds to the JSON property `objectsFromSourceFailed`
        # @return [String]
        attr_accessor :objects_from_source_failed
      
        # Bytes in the data source that failed during the transfer.
        # Corresponds to the JSON property `bytesFromSourceFailed`
        # @return [String]
        attr_accessor :bytes_from_source_failed
      
        # Objects that failed to be deleted from the data sink.
        # Corresponds to the JSON property `objectsFailedToDeleteFromSink`
        # @return [String]
        attr_accessor :objects_failed_to_delete_from_sink
      
        # Bytes that failed to be deleted from the data sink.
        # Corresponds to the JSON property `bytesFailedToDeleteFromSink`
        # @return [String]
        attr_accessor :bytes_failed_to_delete_from_sink
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @objects_found_from_source = args[:objects_found_from_source] if args.key?(:objects_found_from_source)
          @bytes_found_from_source = args[:bytes_found_from_source] if args.key?(:bytes_found_from_source)
          @objects_found_only_from_sink = args[:objects_found_only_from_sink] if args.key?(:objects_found_only_from_sink)
          @bytes_found_only_from_sink = args[:bytes_found_only_from_sink] if args.key?(:bytes_found_only_from_sink)
          @objects_from_source_skipped_by_sync = args[:objects_from_source_skipped_by_sync] if args.key?(:objects_from_source_skipped_by_sync)
          @bytes_from_source_skipped_by_sync = args[:bytes_from_source_skipped_by_sync] if args.key?(:bytes_from_source_skipped_by_sync)
          @objects_copied_to_sink = args[:objects_copied_to_sink] if args.key?(:objects_copied_to_sink)
          @bytes_copied_to_sink = args[:bytes_copied_to_sink] if args.key?(:bytes_copied_to_sink)
          @objects_deleted_from_source = args[:objects_deleted_from_source] if args.key?(:objects_deleted_from_source)
          @bytes_deleted_from_source = args[:bytes_deleted_from_source] if args.key?(:bytes_deleted_from_source)
          @objects_deleted_from_sink = args[:objects_deleted_from_sink] if args.key?(:objects_deleted_from_sink)
          @bytes_deleted_from_sink = args[:bytes_deleted_from_sink] if args.key?(:bytes_deleted_from_sink)
          @objects_from_source_failed = args[:objects_from_source_failed] if args.key?(:objects_from_source_failed)
          @bytes_from_source_failed = args[:bytes_from_source_failed] if args.key?(:bytes_from_source_failed)
          @objects_failed_to_delete_from_sink = args[:objects_failed_to_delete_from_sink] if args.key?(:objects_failed_to_delete_from_sink)
          @bytes_failed_to_delete_from_sink = args[:bytes_failed_to_delete_from_sink] if args.key?(:bytes_failed_to_delete_from_sink)
        end
      end
      
      # A summary of errors by error code, plus a count and sample error log entries.
      class ErrorSummary
        include Google::Apis::Core::Hashable
      
        # Required.
        # Corresponds to the JSON property `errorCode`
        # @return [String]
        attr_accessor :error_code
      
        # Count of this type of error. Required.
        # Corresponds to the JSON property `errorCount`
        # @return [String]
        attr_accessor :error_count
      
        # Error samples.
        # Corresponds to the JSON property `errorLogEntries`
        # @return [Array<Google::Apis::StoragetransferV1::ErrorLogEntry>]
        attr_accessor :error_log_entries
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @error_code = args[:error_code] if args.key?(:error_code)
          @error_count = args[:error_count] if args.key?(:error_count)
          @error_log_entries = args[:error_log_entries] if args.key?(:error_log_entries)
        end
      end
      
      # An entry describing an error that has occurred.
      class ErrorLogEntry
        include Google::Apis::Core::Hashable
      
        # A URL that refers to the target (a data source, a data sink, or an object)
        # with which the error is associated. Required.
        # Corresponds to the JSON property `url`
        # @return [String]
        attr_accessor :url
      
        # A list of messages that carry the error details.
        # Corresponds to the JSON property `errorDetails`
        # @return [Array<String>]
        attr_accessor :error_details
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @url = args[:url] if args.key?(:url)
          @error_details = args[:error_details] if args.key?(:error_details)
        end
      end
    end
  end
end
