# 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 BigquerydatatransferV1
      
      # A request to determine whether the user has valid credentials. This method
      # is used to limit the number of OAuth popups in the user interface. The
      # user id is inferred from the API call context.
      # If the data source has the Google+ authorization type, this method
      # returns false, as it cannot be determined whether the credentials are
      # already valid merely based on the user id.
      class CheckValidCredsRequest
        include Google::Apis::Core::Hashable
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
        end
      end
      
      # A response indicating whether the credentials exist and are valid.
      class CheckValidCredsResponse
        include Google::Apis::Core::Hashable
      
        # If set to `true`, the credentials exist and are valid.
        # Corresponds to the JSON property `hasValidCreds`
        # @return [Boolean]
        attr_accessor :has_valid_creds
        alias_method :has_valid_creds?, :has_valid_creds
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @has_valid_creds = args[:has_valid_creds] if args.key?(:has_valid_creds)
        end
      end
      
      # Represents data source metadata. Metadata is sufficient to
      # render UI and request proper OAuth tokens.
      class DataSource
        include Google::Apis::Core::Hashable
      
        # Indicates the type of authorization.
        # Corresponds to the JSON property `authorizationType`
        # @return [String]
        attr_accessor :authorization_type
      
        # Data source client id which should be used to receive refresh token.
        # Corresponds to the JSON property `clientId`
        # @return [String]
        attr_accessor :client_id
      
        # Specifies whether the data source supports automatic data refresh for the
        # past few days, and how it's supported.
        # For some data sources, data might not be complete until a few days later,
        # so it's useful to refresh data automatically.
        # Corresponds to the JSON property `dataRefreshType`
        # @return [String]
        attr_accessor :data_refresh_type
      
        # Data source id.
        # Corresponds to the JSON property `dataSourceId`
        # @return [String]
        attr_accessor :data_source_id
      
        # Default data refresh window on days.
        # Only meaningful when `data_refresh_type` = `SLIDING_WINDOW`.
        # Corresponds to the JSON property `defaultDataRefreshWindowDays`
        # @return [Fixnum]
        attr_accessor :default_data_refresh_window_days
      
        # Default data transfer schedule.
        # Examples of valid schedules include:
        # `1st,3rd monday of month 15:30`,
        # `every wed,fri of jan,jun 13:15`, and
        # `first sunday of quarter 00:00`.
        # Corresponds to the JSON property `defaultSchedule`
        # @return [String]
        attr_accessor :default_schedule
      
        # User friendly data source description string.
        # Corresponds to the JSON property `description`
        # @return [String]
        attr_accessor :description
      
        # User friendly data source name.
        # Corresponds to the JSON property `displayName`
        # @return [String]
        attr_accessor :display_name
      
        # Url for the help document for this data source.
        # Corresponds to the JSON property `helpUrl`
        # @return [String]
        attr_accessor :help_url
      
        # Disables backfilling and manual run scheduling
        # for the data source.
        # Corresponds to the JSON property `manualRunsDisabled`
        # @return [Boolean]
        attr_accessor :manual_runs_disabled
        alias_method :manual_runs_disabled?, :manual_runs_disabled
      
        # The minimum interval for scheduler to schedule runs.
        # Corresponds to the JSON property `minimumScheduleInterval`
        # @return [String]
        attr_accessor :minimum_schedule_interval
      
        # Output only. Data source resource name.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # Data source parameters.
        # Corresponds to the JSON property `parameters`
        # @return [Array<Google::Apis::BigquerydatatransferV1::DataSourceParameter>]
        attr_accessor :parameters
      
        # Api auth scopes for which refresh token needs to be obtained. These are
        # scopes needed by a data source to prepare data and ingest them into
        # BigQuery, e.g., https://www.googleapis.com/auth/bigquery
        # Corresponds to the JSON property `scopes`
        # @return [Array<String>]
        attr_accessor :scopes
      
        # Specifies whether the data source supports a user defined schedule, or
        # operates on the default schedule.
        # When set to `true`, user can override default schedule.
        # Corresponds to the JSON property `supportsCustomSchedule`
        # @return [Boolean]
        attr_accessor :supports_custom_schedule
        alias_method :supports_custom_schedule?, :supports_custom_schedule
      
        # Deprecated. This field has no effect.
        # Corresponds to the JSON property `supportsMultipleTransfers`
        # @return [Boolean]
        attr_accessor :supports_multiple_transfers
        alias_method :supports_multiple_transfers?, :supports_multiple_transfers
      
        # Deprecated. This field has no effect.
        # Corresponds to the JSON property `transferType`
        # @return [String]
        attr_accessor :transfer_type
      
        # The number of seconds to wait for an update from the data source
        # before the Data Transfer Service marks the transfer as FAILED.
        # Corresponds to the JSON property `updateDeadlineSeconds`
        # @return [Fixnum]
        attr_accessor :update_deadline_seconds
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @authorization_type = args[:authorization_type] if args.key?(:authorization_type)
          @client_id = args[:client_id] if args.key?(:client_id)
          @data_refresh_type = args[:data_refresh_type] if args.key?(:data_refresh_type)
          @data_source_id = args[:data_source_id] if args.key?(:data_source_id)
          @default_data_refresh_window_days = args[:default_data_refresh_window_days] if args.key?(:default_data_refresh_window_days)
          @default_schedule = args[:default_schedule] if args.key?(:default_schedule)
          @description = args[:description] if args.key?(:description)
          @display_name = args[:display_name] if args.key?(:display_name)
          @help_url = args[:help_url] if args.key?(:help_url)
          @manual_runs_disabled = args[:manual_runs_disabled] if args.key?(:manual_runs_disabled)
          @minimum_schedule_interval = args[:minimum_schedule_interval] if args.key?(:minimum_schedule_interval)
          @name = args[:name] if args.key?(:name)
          @parameters = args[:parameters] if args.key?(:parameters)
          @scopes = args[:scopes] if args.key?(:scopes)
          @supports_custom_schedule = args[:supports_custom_schedule] if args.key?(:supports_custom_schedule)
          @supports_multiple_transfers = args[:supports_multiple_transfers] if args.key?(:supports_multiple_transfers)
          @transfer_type = args[:transfer_type] if args.key?(:transfer_type)
          @update_deadline_seconds = args[:update_deadline_seconds] if args.key?(:update_deadline_seconds)
        end
      end
      
      # Represents a data source parameter with validation rules, so that
      # parameters can be rendered in the UI. These parameters are given to us by
      # supported data sources, and include all needed information for rendering
      # and validation.
      # Thus, whoever uses this api can decide to generate either generic ui,
      # or custom data source specific forms.
      class DataSourceParameter
        include Google::Apis::Core::Hashable
      
        # All possible values for the parameter.
        # Corresponds to the JSON property `allowedValues`
        # @return [Array<String>]
        attr_accessor :allowed_values
      
        # If true, it should not be used in new transfers, and it should not be
        # visible to users.
        # Corresponds to the JSON property `deprecated`
        # @return [Boolean]
        attr_accessor :deprecated
        alias_method :deprecated?, :deprecated
      
        # Parameter description.
        # Corresponds to the JSON property `description`
        # @return [String]
        attr_accessor :description
      
        # Parameter display name in the user interface.
        # Corresponds to the JSON property `displayName`
        # @return [String]
        attr_accessor :display_name
      
        # Deprecated. This field has no effect.
        # Corresponds to the JSON property `fields`
        # @return [Array<Google::Apis::BigquerydatatransferV1::DataSourceParameter>]
        attr_accessor :fields
      
        # Cannot be changed after initial creation.
        # Corresponds to the JSON property `immutable`
        # @return [Boolean]
        attr_accessor :immutable
        alias_method :immutable?, :immutable
      
        # For integer and double values specifies maxminum allowed value.
        # Corresponds to the JSON property `maxValue`
        # @return [Float]
        attr_accessor :max_value
      
        # For integer and double values specifies minimum allowed value.
        # Corresponds to the JSON property `minValue`
        # @return [Float]
        attr_accessor :min_value
      
        # Parameter identifier.
        # Corresponds to the JSON property `paramId`
        # @return [String]
        attr_accessor :param_id
      
        # Deprecated. This field has no effect.
        # Corresponds to the JSON property `recurse`
        # @return [Boolean]
        attr_accessor :recurse
        alias_method :recurse?, :recurse
      
        # Deprecated. This field has no effect.
        # Corresponds to the JSON property `repeated`
        # @return [Boolean]
        attr_accessor :repeated
        alias_method :repeated?, :repeated
      
        # Is parameter required.
        # Corresponds to the JSON property `required`
        # @return [Boolean]
        attr_accessor :required
        alias_method :required?, :required
      
        # Parameter type.
        # Corresponds to the JSON property `type`
        # @return [String]
        attr_accessor :type
      
        # Description of the requirements for this field, in case the user input does
        # not fulfill the regex pattern or min/max values.
        # Corresponds to the JSON property `validationDescription`
        # @return [String]
        attr_accessor :validation_description
      
        # URL to a help document to further explain the naming requirements.
        # Corresponds to the JSON property `validationHelpUrl`
        # @return [String]
        attr_accessor :validation_help_url
      
        # Regular expression which can be used for parameter validation.
        # Corresponds to the JSON property `validationRegex`
        # @return [String]
        attr_accessor :validation_regex
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @allowed_values = args[:allowed_values] if args.key?(:allowed_values)
          @deprecated = args[:deprecated] if args.key?(:deprecated)
          @description = args[:description] if args.key?(:description)
          @display_name = args[:display_name] if args.key?(:display_name)
          @fields = args[:fields] if args.key?(:fields)
          @immutable = args[:immutable] if args.key?(:immutable)
          @max_value = args[:max_value] if args.key?(:max_value)
          @min_value = args[:min_value] if args.key?(:min_value)
          @param_id = args[:param_id] if args.key?(:param_id)
          @recurse = args[:recurse] if args.key?(:recurse)
          @repeated = args[:repeated] if args.key?(:repeated)
          @required = args[:required] if args.key?(:required)
          @type = args[:type] if args.key?(:type)
          @validation_description = args[:validation_description] if args.key?(:validation_description)
          @validation_help_url = args[:validation_help_url] if args.key?(:validation_help_url)
          @validation_regex = args[:validation_regex] if args.key?(:validation_regex)
        end
      end
      
      # Represents preferences for sending email notifications for transfer run
      # events.
      class EmailPreferences
        include Google::Apis::Core::Hashable
      
        # If true, email notifications will be sent on transfer run failures.
        # Corresponds to the JSON property `enableFailureEmail`
        # @return [Boolean]
        attr_accessor :enable_failure_email
        alias_method :enable_failure_email?, :enable_failure_email
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @enable_failure_email = args[:enable_failure_email] if args.key?(:enable_failure_email)
        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
      
      # Returns list of supported data sources and their metadata.
      class ListDataSourcesResponse
        include Google::Apis::Core::Hashable
      
        # List of supported data sources and their transfer settings.
        # Corresponds to the JSON property `dataSources`
        # @return [Array<Google::Apis::BigquerydatatransferV1::DataSource>]
        attr_accessor :data_sources
      
        # Output only. The next-pagination token. For multiple-page list results,
        # this token can be used as the
        # `ListDataSourcesRequest.page_token`
        # to request the next page of list results.
        # 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)
          @data_sources = args[:data_sources] if args.key?(:data_sources)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # The response message for Locations.ListLocations.
      class ListLocationsResponse
        include Google::Apis::Core::Hashable
      
        # A list of locations that matches the specified filter in the request.
        # Corresponds to the JSON property `locations`
        # @return [Array<Google::Apis::BigquerydatatransferV1::Location>]
        attr_accessor :locations
      
        # 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)
          @locations = args[:locations] if args.key?(:locations)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # The returned list of pipelines in the project.
      class ListTransferConfigsResponse
        include Google::Apis::Core::Hashable
      
        # Output only. The next-pagination token. For multiple-page list results,
        # this token can be used as the
        # `ListTransferConfigsRequest.page_token`
        # to request the next page of list results.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        # Output only. The stored pipeline transfer configurations.
        # Corresponds to the JSON property `transferConfigs`
        # @return [Array<Google::Apis::BigquerydatatransferV1::TransferConfig>]
        attr_accessor :transfer_configs
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
          @transfer_configs = args[:transfer_configs] if args.key?(:transfer_configs)
        end
      end
      
      # The returned list transfer run messages.
      class ListTransferLogsResponse
        include Google::Apis::Core::Hashable
      
        # Output only. The next-pagination token. For multiple-page list results,
        # this token can be used as the
        # `GetTransferRunLogRequest.page_token`
        # to request the next page of list results.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        # Output only. The stored pipeline transfer messages.
        # Corresponds to the JSON property `transferMessages`
        # @return [Array<Google::Apis::BigquerydatatransferV1::TransferMessage>]
        attr_accessor :transfer_messages
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
          @transfer_messages = args[:transfer_messages] if args.key?(:transfer_messages)
        end
      end
      
      # The returned list of pipelines in the project.
      class ListTransferRunsResponse
        include Google::Apis::Core::Hashable
      
        # Output only. The next-pagination token. For multiple-page list results,
        # this token can be used as the
        # `ListTransferRunsRequest.page_token`
        # to request the next page of list results.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        # Output only. The stored pipeline transfer runs.
        # Corresponds to the JSON property `transferRuns`
        # @return [Array<Google::Apis::BigquerydatatransferV1::TransferRun>]
        attr_accessor :transfer_runs
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
          @transfer_runs = args[:transfer_runs] if args.key?(:transfer_runs)
        end
      end
      
      # A resource that represents Google Cloud Platform location.
      class Location
        include Google::Apis::Core::Hashable
      
        # The friendly name for this location, typically a nearby city name.
        # For example, "Tokyo".
        # Corresponds to the JSON property `displayName`
        # @return [String]
        attr_accessor :display_name
      
        # Cross-service attributes for the location. For example
        # `"cloud.googleapis.com/region": "us-east1"`
        # Corresponds to the JSON property `labels`
        # @return [Hash<String,String>]
        attr_accessor :labels
      
        # The canonical id for this location. For example: `"us-east1"`.
        # Corresponds to the JSON property `locationId`
        # @return [String]
        attr_accessor :location_id
      
        # Service-specific metadata. For example the available capacity at the given
        # location.
        # Corresponds to the JSON property `metadata`
        # @return [Hash<String,Object>]
        attr_accessor :metadata
      
        # Resource name for the location, which may vary between implementations.
        # For example: `"projects/example-project/locations/us-east1"`
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @display_name = args[:display_name] if args.key?(:display_name)
          @labels = args[:labels] if args.key?(:labels)
          @location_id = args[:location_id] if args.key?(:location_id)
          @metadata = args[:metadata] if args.key?(:metadata)
          @name = args[:name] if args.key?(:name)
        end
      end
      
      # Options customizing the data transfer schedule.
      class ScheduleOptions
        include Google::Apis::Core::Hashable
      
        # If true, automatic scheduling of data transfer runs for this configuration
        # will be disabled. The runs can be started on ad-hoc basis using
        # StartManualTransferRuns API. When automatic scheduling is disabled, the
        # TransferConfig.schedule field will be ignored.
        # Corresponds to the JSON property `disableAutoScheduling`
        # @return [Boolean]
        attr_accessor :disable_auto_scheduling
        alias_method :disable_auto_scheduling?, :disable_auto_scheduling
      
        # Defines time to stop scheduling transfer runs. A transfer run cannot be
        # scheduled at or after the end time. The end time can be changed at any
        # moment. The time when a data transfer can be trigerred manually is not
        # limited by this option.
        # Corresponds to the JSON property `endTime`
        # @return [String]
        attr_accessor :end_time
      
        # Specifies time to start scheduling transfer runs. The first run will be
        # scheduled at or after the start time according to a recurrence pattern
        # defined in the schedule string. The start time can be changed at any
        # moment. The time when a data transfer can be trigerred manually is not
        # limited by this option.
        # Corresponds to the JSON property `startTime`
        # @return [String]
        attr_accessor :start_time
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @disable_auto_scheduling = args[:disable_auto_scheduling] if args.key?(:disable_auto_scheduling)
          @end_time = args[:end_time] if args.key?(:end_time)
          @start_time = args[:start_time] if args.key?(:start_time)
        end
      end
      
      # A request to schedule transfer runs for a time range.
      class ScheduleTransferRunsRequest
        include Google::Apis::Core::Hashable
      
        # Required. End time of the range of transfer runs. For example,
        # `"2017-05-30T00:00:00+00:00"`.
        # Corresponds to the JSON property `endTime`
        # @return [String]
        attr_accessor :end_time
      
        # Required. Start time of the range of transfer runs. For example,
        # `"2017-05-25T00:00:00+00:00"`.
        # Corresponds to the JSON property `startTime`
        # @return [String]
        attr_accessor :start_time
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @end_time = args[:end_time] if args.key?(:end_time)
          @start_time = args[:start_time] if args.key?(:start_time)
        end
      end
      
      # A response to schedule transfer runs for a time range.
      class ScheduleTransferRunsResponse
        include Google::Apis::Core::Hashable
      
        # The transfer runs that were scheduled.
        # Corresponds to the JSON property `runs`
        # @return [Array<Google::Apis::BigquerydatatransferV1::TransferRun>]
        attr_accessor :runs
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @runs = args[:runs] if args.key?(:runs)
        end
      end
      
      # A request to start manual transfer runs.
      class StartManualTransferRunsRequest
        include Google::Apis::Core::Hashable
      
        # Specific run_time for a transfer run to be started. The
        # requested_run_time must not be in the future.
        # Corresponds to the JSON property `requestedRunTime`
        # @return [String]
        attr_accessor :requested_run_time
      
        # A specification for a time range, this will request transfer runs with
        # run_time between start_time (inclusive) and end_time (exclusive).
        # Corresponds to the JSON property `requestedTimeRange`
        # @return [Google::Apis::BigquerydatatransferV1::TimeRange]
        attr_accessor :requested_time_range
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @requested_run_time = args[:requested_run_time] if args.key?(:requested_run_time)
          @requested_time_range = args[:requested_time_range] if args.key?(:requested_time_range)
        end
      end
      
      # A response to start manual transfer runs.
      class StartManualTransferRunsResponse
        include Google::Apis::Core::Hashable
      
        # The transfer runs that were created.
        # Corresponds to the JSON property `runs`
        # @return [Array<Google::Apis::BigquerydatatransferV1::TransferRun>]
        attr_accessor :runs
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @runs = args[:runs] if args.key?(:runs)
        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). Each `Status` message contains
      # three pieces of data: error code, error message, and error details.
      # You can find out more about this error model and how to work with it in the
      # [API Design Guide](https://cloud.google.com/apis/design/errors).
      class Status
        include Google::Apis::Core::Hashable
      
        # The status code, which should be an enum value of google.rpc.Code.
        # Corresponds to the JSON property `code`
        # @return [Fixnum]
        attr_accessor :code
      
        # A list of messages that carry the error details.  There is a common set of
        # message types for APIs to use.
        # Corresponds to the JSON property `details`
        # @return [Array<Hash<String,Object>>]
        attr_accessor :details
      
        # 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 field, or localized by the client.
        # Corresponds to the JSON property `message`
        # @return [String]
        attr_accessor :message
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @code = args[:code] if args.key?(:code)
          @details = args[:details] if args.key?(:details)
          @message = args[:message] if args.key?(:message)
        end
      end
      
      # A specification for a time range, this will request transfer runs with
      # run_time between start_time (inclusive) and end_time (exclusive).
      class TimeRange
        include Google::Apis::Core::Hashable
      
        # End time of the range of transfer runs. For example,
        # `"2017-05-30T00:00:00+00:00"`. The end_time must not be in the future.
        # Creates transfer runs where run_time is in the range betwen start_time
        # (inclusive) and end_time (exlusive).
        # Corresponds to the JSON property `endTime`
        # @return [String]
        attr_accessor :end_time
      
        # Start time of the range of transfer runs. For example,
        # `"2017-05-25T00:00:00+00:00"`. The start_time must be strictly less than
        # the end_time. Creates transfer runs where run_time is in the range betwen
        # start_time (inclusive) and end_time (exlusive).
        # Corresponds to the JSON property `startTime`
        # @return [String]
        attr_accessor :start_time
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @end_time = args[:end_time] if args.key?(:end_time)
          @start_time = args[:start_time] if args.key?(:start_time)
        end
      end
      
      # Represents a data transfer configuration. A transfer configuration
      # contains all metadata needed to perform a data transfer. For example,
      # `destination_dataset_id` specifies where data should be stored.
      # When a new transfer configuration is created, the specified
      # `destination_dataset_id` is created when needed and shared with the
      # appropriate data source service account.
      class TransferConfig
        include Google::Apis::Core::Hashable
      
        # The number of days to look back to automatically refresh the data.
        # For example, if `data_refresh_window_days = 10`, then every day
        # BigQuery reingests data for [today-10, today-1], rather than ingesting data
        # for just [today-1].
        # Only valid if the data source supports the feature. Set the value to  0
        # to use the default value.
        # Corresponds to the JSON property `dataRefreshWindowDays`
        # @return [Fixnum]
        attr_accessor :data_refresh_window_days
      
        # Data source id. Cannot be changed once data transfer is created.
        # Corresponds to the JSON property `dataSourceId`
        # @return [String]
        attr_accessor :data_source_id
      
        # Output only. Region in which BigQuery dataset is located.
        # Corresponds to the JSON property `datasetRegion`
        # @return [String]
        attr_accessor :dataset_region
      
        # The BigQuery target dataset id.
        # Corresponds to the JSON property `destinationDatasetId`
        # @return [String]
        attr_accessor :destination_dataset_id
      
        # Is this config disabled. When set to true, no runs are scheduled
        # for a given transfer.
        # Corresponds to the JSON property `disabled`
        # @return [Boolean]
        attr_accessor :disabled
        alias_method :disabled?, :disabled
      
        # User specified display name for the data transfer.
        # Corresponds to the JSON property `displayName`
        # @return [String]
        attr_accessor :display_name
      
        # Represents preferences for sending email notifications for transfer run
        # events.
        # Corresponds to the JSON property `emailPreferences`
        # @return [Google::Apis::BigquerydatatransferV1::EmailPreferences]
        attr_accessor :email_preferences
      
        # The resource name of the transfer config.
        # Transfer config names have the form of
        # `projects/`project_id`/locations/`region`/transferConfigs/`config_id``.
        # The name is automatically generated based on the config_id specified in
        # CreateTransferConfigRequest along with project_id and region. If config_id
        # is not provided, usually a uuid, even though it is not guaranteed or
        # required, will be generated for config_id.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # Output only. Next time when data transfer will run.
        # Corresponds to the JSON property `nextRunTime`
        # @return [String]
        attr_accessor :next_run_time
      
        # Pub/Sub topic where notifications will be sent after transfer runs
        # associated with this transfer config finish.
        # Corresponds to the JSON property `notificationPubsubTopic`
        # @return [String]
        attr_accessor :notification_pubsub_topic
      
        # Data transfer specific parameters.
        # Corresponds to the JSON property `params`
        # @return [Hash<String,Object>]
        attr_accessor :params
      
        # Data transfer schedule.
        # If the data source does not support a custom schedule, this should be
        # empty. If it is empty, the default value for the data source will be
        # used.
        # The specified times are in UTC.
        # Examples of valid format:
        # `1st,3rd monday of month 15:30`,
        # `every wed,fri of jan,jun 13:15`, and
        # `first sunday of quarter 00:00`.
        # See more explanation about the format here:
        # https://cloud.google.com/appengine/docs/flexible/python/scheduling-jobs-with-
        # cron-yaml#the_schedule_format
        # NOTE: the granularity should be at least 8 hours, or less frequent.
        # Corresponds to the JSON property `schedule`
        # @return [String]
        attr_accessor :schedule
      
        # Options customizing the data transfer schedule.
        # Corresponds to the JSON property `scheduleOptions`
        # @return [Google::Apis::BigquerydatatransferV1::ScheduleOptions]
        attr_accessor :schedule_options
      
        # Output only. State of the most recently updated transfer run.
        # Corresponds to the JSON property `state`
        # @return [String]
        attr_accessor :state
      
        # Output only. Data transfer modification time. Ignored by server on input.
        # Corresponds to the JSON property `updateTime`
        # @return [String]
        attr_accessor :update_time
      
        # Deprecated. Unique ID of the user on whose behalf transfer is done.
        # Corresponds to the JSON property `userId`
        # @return [Fixnum]
        attr_accessor :user_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @data_refresh_window_days = args[:data_refresh_window_days] if args.key?(:data_refresh_window_days)
          @data_source_id = args[:data_source_id] if args.key?(:data_source_id)
          @dataset_region = args[:dataset_region] if args.key?(:dataset_region)
          @destination_dataset_id = args[:destination_dataset_id] if args.key?(:destination_dataset_id)
          @disabled = args[:disabled] if args.key?(:disabled)
          @display_name = args[:display_name] if args.key?(:display_name)
          @email_preferences = args[:email_preferences] if args.key?(:email_preferences)
          @name = args[:name] if args.key?(:name)
          @next_run_time = args[:next_run_time] if args.key?(:next_run_time)
          @notification_pubsub_topic = args[:notification_pubsub_topic] if args.key?(:notification_pubsub_topic)
          @params = args[:params] if args.key?(:params)
          @schedule = args[:schedule] if args.key?(:schedule)
          @schedule_options = args[:schedule_options] if args.key?(:schedule_options)
          @state = args[:state] if args.key?(:state)
          @update_time = args[:update_time] if args.key?(:update_time)
          @user_id = args[:user_id] if args.key?(:user_id)
        end
      end
      
      # Represents a user facing message for a particular data transfer run.
      class TransferMessage
        include Google::Apis::Core::Hashable
      
        # Message text.
        # Corresponds to the JSON property `messageText`
        # @return [String]
        attr_accessor :message_text
      
        # Time when message was logged.
        # Corresponds to the JSON property `messageTime`
        # @return [String]
        attr_accessor :message_time
      
        # Message severity.
        # Corresponds to the JSON property `severity`
        # @return [String]
        attr_accessor :severity
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @message_text = args[:message_text] if args.key?(:message_text)
          @message_time = args[:message_time] if args.key?(:message_time)
          @severity = args[:severity] if args.key?(:severity)
        end
      end
      
      # Represents a data transfer run.
      class TransferRun
        include Google::Apis::Core::Hashable
      
        # Output only. Data source id.
        # Corresponds to the JSON property `dataSourceId`
        # @return [String]
        attr_accessor :data_source_id
      
        # Output only. The BigQuery target dataset id.
        # Corresponds to the JSON property `destinationDatasetId`
        # @return [String]
        attr_accessor :destination_dataset_id
      
        # Represents preferences for sending email notifications for transfer run
        # events.
        # Corresponds to the JSON property `emailPreferences`
        # @return [Google::Apis::BigquerydatatransferV1::EmailPreferences]
        attr_accessor :email_preferences
      
        # Output only. Time when transfer run ended.
        # Parameter ignored by server for input requests.
        # Corresponds to the JSON property `endTime`
        # @return [String]
        attr_accessor :end_time
      
        # 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). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
        # Corresponds to the JSON property `errorStatus`
        # @return [Google::Apis::BigquerydatatransferV1::Status]
        attr_accessor :error_status
      
        # The resource name of the transfer run.
        # Transfer run names have the form
        # `projects/`project_id`/locations/`location`/transferConfigs/`config_id`/runs/`
        # run_id``.
        # The name is ignored when creating a transfer run.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # Output only. Pub/Sub topic where a notification will be sent after this
        # transfer run finishes
        # Corresponds to the JSON property `notificationPubsubTopic`
        # @return [String]
        attr_accessor :notification_pubsub_topic
      
        # Output only. Data transfer specific parameters.
        # Corresponds to the JSON property `params`
        # @return [Hash<String,Object>]
        attr_accessor :params
      
        # For batch transfer runs, specifies the date and time of the data should be
        # ingested.
        # Corresponds to the JSON property `runTime`
        # @return [String]
        attr_accessor :run_time
      
        # Output only. Describes the schedule of this transfer run if it was
        # created as part of a regular schedule. For batch transfer runs that are
        # scheduled manually, this is empty.
        # NOTE: the system might choose to delay the schedule depending on the
        # current load, so `schedule_time` doesn't always match this.
        # Corresponds to the JSON property `schedule`
        # @return [String]
        attr_accessor :schedule
      
        # Minimum time after which a transfer run can be started.
        # Corresponds to the JSON property `scheduleTime`
        # @return [String]
        attr_accessor :schedule_time
      
        # Output only. Time when transfer run was started.
        # Parameter ignored by server for input requests.
        # Corresponds to the JSON property `startTime`
        # @return [String]
        attr_accessor :start_time
      
        # Data transfer run state. Ignored for input requests.
        # Corresponds to the JSON property `state`
        # @return [String]
        attr_accessor :state
      
        # Output only. Last time the data transfer run state was updated.
        # Corresponds to the JSON property `updateTime`
        # @return [String]
        attr_accessor :update_time
      
        # Deprecated. Unique ID of the user on whose behalf transfer is done.
        # Corresponds to the JSON property `userId`
        # @return [Fixnum]
        attr_accessor :user_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @data_source_id = args[:data_source_id] if args.key?(:data_source_id)
          @destination_dataset_id = args[:destination_dataset_id] if args.key?(:destination_dataset_id)
          @email_preferences = args[:email_preferences] if args.key?(:email_preferences)
          @end_time = args[:end_time] if args.key?(:end_time)
          @error_status = args[:error_status] if args.key?(:error_status)
          @name = args[:name] if args.key?(:name)
          @notification_pubsub_topic = args[:notification_pubsub_topic] if args.key?(:notification_pubsub_topic)
          @params = args[:params] if args.key?(:params)
          @run_time = args[:run_time] if args.key?(:run_time)
          @schedule = args[:schedule] if args.key?(:schedule)
          @schedule_time = args[:schedule_time] if args.key?(:schedule_time)
          @start_time = args[:start_time] if args.key?(:start_time)
          @state = args[:state] if args.key?(:state)
          @update_time = args[:update_time] if args.key?(:update_time)
          @user_id = args[:user_id] if args.key?(:user_id)
        end
      end
    end
  end
end
