#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#

"""Generated message classes for dataflow version v1b3.

Manages Google Cloud Dataflow projects on Google Cloud Platform.
"""
# NOTE: This file is autogenerated and should not be edited by hand.

from __future__ import absolute_import

from apitools.base.protorpclite import messages as _messages
from apitools.base.py import encoding
from apitools.base.py import extra_types


package = 'dataflow'


class ApproximateProgress(_messages.Message):
  r"""Obsolete in favor of ApproximateReportedProgress and
  ApproximateSplitRequest.

  Fields:
    percentComplete: Obsolete.
    position: Obsolete.
    remainingTime: Obsolete.
  """

  percentComplete = _messages.FloatField(1, variant=_messages.Variant.FLOAT)
  position = _messages.MessageField('Position', 2)
  remainingTime = _messages.StringField(3)


class ApproximateReportedProgress(_messages.Message):
  r"""A progress measurement of a WorkItem by a worker.

  Fields:
    consumedParallelism: Total amount of parallelism in the portion of input
      of this task that has already been consumed and is no longer active. In
      the first two examples above (see remaining_parallelism), the value
      should be 29 or 2 respectively.  The sum of remaining_parallelism and
      consumed_parallelism should equal the total amount of parallelism in
      this work item.  If specified, must be finite.
    fractionConsumed: Completion as fraction of the input consumed, from 0.0
      (beginning, nothing consumed), to 1.0 (end of the input, entire input
      consumed).
    position: A Position within the work to represent a progress.
    remainingParallelism: Total amount of parallelism in the input of this
      task that remains, (i.e. can be delegated to this task and any new tasks
      via dynamic splitting). Always at least 1 for non-finished work items
      and 0 for finished.  "Amount of parallelism" refers to how many non-
      empty parts of the input can be read in parallel. This does not
      necessarily equal number of records. An input that can be read in
      parallel down to the individual records is called "perfectly
      splittable". An example of non-perfectly parallelizable input is a
      block-compressed file format where a block of records has to be read as
      a whole, but different blocks can be read in parallel.  Examples: * If
      we are processing record #30 (starting at 1) out of 50 in a perfectly
      splittable 50-record input, this value should be 21 (20 remaining + 1
      current). * If we are reading through block 3 in a block-compressed file
      consisting   of 5 blocks, this value should be 3 (since blocks 4 and 5
      can be   processed in parallel by new tasks via dynamic splitting and
      the current   task remains processing block 3). * If we are reading
      through the last block in a block-compressed file,   or reading or
      processing the last record in a perfectly splittable   input, this value
      should be 1, because apart from the current task, no   additional
      remainder can be split off.
  """

  consumedParallelism = _messages.MessageField('ReportedParallelism', 1)
  fractionConsumed = _messages.FloatField(2)
  position = _messages.MessageField('Position', 3)
  remainingParallelism = _messages.MessageField('ReportedParallelism', 4)


class ApproximateSplitRequest(_messages.Message):
  r"""A suggestion by the service to the worker to dynamically split the
  WorkItem.

  Fields:
    fractionConsumed: A fraction at which to split the work item, from 0.0
      (beginning of the input) to 1.0 (end of the input).
    fractionOfRemainder: The fraction of the remainder of work to split the
      work item at, from 0.0 (split at the current position) to 1.0 (end of
      the input).
    position: A Position at which to split the work item.
  """

  fractionConsumed = _messages.FloatField(1)
  fractionOfRemainder = _messages.FloatField(2)
  position = _messages.MessageField('Position', 3)


class AutoscalingEvent(_messages.Message):
  r"""A structured message reporting an autoscaling decision made by the
  Dataflow service.

  Enums:
    EventTypeValueValuesEnum: The type of autoscaling event to report.

  Fields:
    currentNumWorkers: The current number of workers the job has.
    description: A message describing why the system decided to adjust the
      current number of workers, why it failed, or why the system decided to
      not make any changes to the number of workers.
    eventType: The type of autoscaling event to report.
    targetNumWorkers: The target number of workers the worker pool wants to
      resize to use.
    time: The time this event was emitted to indicate a new target or current
      num_workers value.
    workerPool: A short and friendly name for the worker pool this event
      refers to, populated from the value of
      PoolStageRelation::user_pool_name.
  """

  class EventTypeValueValuesEnum(_messages.Enum):
    r"""The type of autoscaling event to report.

    Values:
      TYPE_UNKNOWN: Default type for the enum.  Value should never be
        returned.
      TARGET_NUM_WORKERS_CHANGED: The TARGET_NUM_WORKERS_CHANGED type should
        be used when the target worker pool size has changed at the start of
        an actuation. An event should always be specified as
        TARGET_NUM_WORKERS_CHANGED if it reflects a change in the
        target_num_workers.
      CURRENT_NUM_WORKERS_CHANGED: The CURRENT_NUM_WORKERS_CHANGED type should
        be used when actual worker pool size has been changed, but the
        target_num_workers has not changed.
      ACTUATION_FAILURE: The ACTUATION_FAILURE type should be used when we
        want to report an error to the user indicating why the current number
        of workers in the pool could not be changed. Displayed in the current
        status and history widgets.
      NO_CHANGE: Used when we want to report to the user a reason why we are
        not currently adjusting the number of workers. Should specify both
        target_num_workers, current_num_workers and a decision_message.
    """
    TYPE_UNKNOWN = 0
    TARGET_NUM_WORKERS_CHANGED = 1
    CURRENT_NUM_WORKERS_CHANGED = 2
    ACTUATION_FAILURE = 3
    NO_CHANGE = 4

  currentNumWorkers = _messages.IntegerField(1)
  description = _messages.MessageField('StructuredMessage', 2)
  eventType = _messages.EnumField('EventTypeValueValuesEnum', 3)
  targetNumWorkers = _messages.IntegerField(4)
  time = _messages.StringField(5)
  workerPool = _messages.StringField(6)


class AutoscalingSettings(_messages.Message):
  r"""Settings for WorkerPool autoscaling.

  Enums:
    AlgorithmValueValuesEnum: The algorithm to use for autoscaling.

  Fields:
    algorithm: The algorithm to use for autoscaling.
    maxNumWorkers: The maximum number of workers to cap scaling at.
  """

  class AlgorithmValueValuesEnum(_messages.Enum):
    r"""The algorithm to use for autoscaling.

    Values:
      AUTOSCALING_ALGORITHM_UNKNOWN: The algorithm is unknown, or unspecified.
      AUTOSCALING_ALGORITHM_NONE: Disable autoscaling.
      AUTOSCALING_ALGORITHM_BASIC: Increase worker count over time to reduce
        job execution time.
    """
    AUTOSCALING_ALGORITHM_UNKNOWN = 0
    AUTOSCALING_ALGORITHM_NONE = 1
    AUTOSCALING_ALGORITHM_BASIC = 2

  algorithm = _messages.EnumField('AlgorithmValueValuesEnum', 1)
  maxNumWorkers = _messages.IntegerField(2, variant=_messages.Variant.INT32)


class BigQueryIODetails(_messages.Message):
  r"""Metadata for a BigQuery connector used by the job.

  Fields:
    dataset: Dataset accessed in the connection.
    projectId: Project accessed in the connection.
    query: Query used to access data in the connection.
    table: Table accessed in the connection.
  """

  dataset = _messages.StringField(1)
  projectId = _messages.StringField(2)
  query = _messages.StringField(3)
  table = _messages.StringField(4)


class BigTableIODetails(_messages.Message):
  r"""Metadata for a BigTable connector used by the job.

  Fields:
    instanceId: InstanceId accessed in the connection.
    projectId: ProjectId accessed in the connection.
    tableId: TableId accessed in the connection.
  """

  instanceId = _messages.StringField(1)
  projectId = _messages.StringField(2)
  tableId = _messages.StringField(3)


class CPUTime(_messages.Message):
  r"""Modeled after information exposed by /proc/stat.

  Fields:
    rate: Average CPU utilization rate (% non-idle cpu / second) since
      previous sample.
    timestamp: Timestamp of the measurement.
    totalMs: Total active CPU time across all cores (ie., non-idle) in
      milliseconds since start-up.
  """

  rate = _messages.FloatField(1)
  timestamp = _messages.StringField(2)
  totalMs = _messages.IntegerField(3, variant=_messages.Variant.UINT64)


class ComponentSource(_messages.Message):
  r"""Description of an interstitial value between transforms in an execution
  stage.

  Fields:
    name: Dataflow service generated name for this source.
    originalTransformOrCollection: User name for the original user transform
      or collection with which this source is most closely associated.
    userName: Human-readable name for this transform; may be user or system
      generated.
  """

  name = _messages.StringField(1)
  originalTransformOrCollection = _messages.StringField(2)
  userName = _messages.StringField(3)


class ComponentTransform(_messages.Message):
  r"""Description of a transform executed as part of an execution stage.

  Fields:
    name: Dataflow service generated name for this source.
    originalTransform: User name for the original user transform with which
      this transform is most closely associated.
    userName: Human-readable name for this transform; may be user or system
      generated.
  """

  name = _messages.StringField(1)
  originalTransform = _messages.StringField(2)
  userName = _messages.StringField(3)


class ComputationTopology(_messages.Message):
  r"""All configuration data for a particular Computation.

  Fields:
    computationId: The ID of the computation.
    inputs: The inputs to the computation.
    keyRanges: The key ranges processed by the computation.
    outputs: The outputs from the computation.
    stateFamilies: The state family values.
    systemStageName: The system stage name.
  """

  computationId = _messages.StringField(1)
  inputs = _messages.MessageField('StreamLocation', 2, repeated=True)
  keyRanges = _messages.MessageField('KeyRangeLocation', 3, repeated=True)
  outputs = _messages.MessageField('StreamLocation', 4, repeated=True)
  stateFamilies = _messages.MessageField('StateFamilyConfig', 5, repeated=True)
  systemStageName = _messages.StringField(6)


class ConcatPosition(_messages.Message):
  r"""A position that encapsulates an inner position and an index for the
  inner position. A ConcatPosition can be used by a reader of a source that
  encapsulates a set of other sources.

  Fields:
    index: Index of the inner source.
    position: Position within the inner source.
  """

  index = _messages.IntegerField(1, variant=_messages.Variant.INT32)
  position = _messages.MessageField('Position', 2)


class CounterMetadata(_messages.Message):
  r"""CounterMetadata includes all static non-name non-value counter
  attributes.

  Enums:
    KindValueValuesEnum: Counter aggregation kind.
    StandardUnitsValueValuesEnum: System defined Units, see above enum.

  Fields:
    description: Human-readable description of the counter semantics.
    kind: Counter aggregation kind.
    otherUnits: A string referring to the unit type.
    standardUnits: System defined Units, see above enum.
  """

  class KindValueValuesEnum(_messages.Enum):
    r"""Counter aggregation kind.

    Values:
      INVALID: Counter aggregation kind was not set.
      SUM: Aggregated value is the sum of all contributed values.
      MAX: Aggregated value is the max of all contributed values.
      MIN: Aggregated value is the min of all contributed values.
      MEAN: Aggregated value is the mean of all contributed values.
      OR: Aggregated value represents the logical 'or' of all contributed
        values.
      AND: Aggregated value represents the logical 'and' of all contributed
        values.
      SET: Aggregated value is a set of unique contributed values.
      DISTRIBUTION: Aggregated value captures statistics about a distribution.
      LATEST_VALUE: Aggregated value tracks the latest value of a variable.
    """
    INVALID = 0
    SUM = 1
    MAX = 2
    MIN = 3
    MEAN = 4
    OR = 5
    AND = 6
    SET = 7
    DISTRIBUTION = 8
    LATEST_VALUE = 9

  class StandardUnitsValueValuesEnum(_messages.Enum):
    r"""System defined Units, see above enum.

    Values:
      BYTES: Counter returns a value in bytes.
      BYTES_PER_SEC: Counter returns a value in bytes per second.
      MILLISECONDS: Counter returns a value in milliseconds.
      MICROSECONDS: Counter returns a value in microseconds.
      NANOSECONDS: Counter returns a value in nanoseconds.
      TIMESTAMP_MSEC: Counter returns a timestamp in milliseconds.
      TIMESTAMP_USEC: Counter returns a timestamp in microseconds.
      TIMESTAMP_NSEC: Counter returns a timestamp in nanoseconds.
    """
    BYTES = 0
    BYTES_PER_SEC = 1
    MILLISECONDS = 2
    MICROSECONDS = 3
    NANOSECONDS = 4
    TIMESTAMP_MSEC = 5
    TIMESTAMP_USEC = 6
    TIMESTAMP_NSEC = 7

  description = _messages.StringField(1)
  kind = _messages.EnumField('KindValueValuesEnum', 2)
  otherUnits = _messages.StringField(3)
  standardUnits = _messages.EnumField('StandardUnitsValueValuesEnum', 4)


class CounterStructuredName(_messages.Message):
  r"""Identifies a counter within a per-job namespace. Counters whose
  structured names are the same get merged into a single value for the job.

  Enums:
    OriginValueValuesEnum: One of the standard Origins defined above.
    PortionValueValuesEnum: Portion of this counter, either key or value.

  Fields:
    componentStepName: Name of the optimized step being executed by the
      workers.
    executionStepName: Name of the stage. An execution step contains multiple
      component steps.
    inputIndex: Index of an input collection that's being read from/written to
      as a side input. The index identifies a step's side inputs starting by 1
      (e.g. the first side input has input_index 1, the third has input_index
      3). Side inputs are identified by a pair of (original_step_name,
      input_index). This field helps uniquely identify them.
    name: Counter name. Not necessarily globally-unique, but unique within the
      context of the other fields. Required.
    origin: One of the standard Origins defined above.
    originNamespace: A string containing a more specific namespace of the
      counter's origin.
    originalRequestingStepName: The step name requesting an operation, such as
      GBK. I.e. the ParDo causing a read/write from shuffle to occur, or a
      read from side inputs.
    originalStepName: System generated name of the original step in the user's
      graph, before optimization.
    portion: Portion of this counter, either key or value.
    workerId: ID of a particular worker.
  """

  class OriginValueValuesEnum(_messages.Enum):
    r"""One of the standard Origins defined above.

    Values:
      SYSTEM: Counter was created by the Dataflow system.
      USER: Counter was created by the user.
    """
    SYSTEM = 0
    USER = 1

  class PortionValueValuesEnum(_messages.Enum):
    r"""Portion of this counter, either key or value.

    Values:
      ALL: Counter portion has not been set.
      KEY: Counter reports a key.
      VALUE: Counter reports a value.
    """
    ALL = 0
    KEY = 1
    VALUE = 2

  componentStepName = _messages.StringField(1)
  executionStepName = _messages.StringField(2)
  inputIndex = _messages.IntegerField(3, variant=_messages.Variant.INT32)
  name = _messages.StringField(4)
  origin = _messages.EnumField('OriginValueValuesEnum', 5)
  originNamespace = _messages.StringField(6)
  originalRequestingStepName = _messages.StringField(7)
  originalStepName = _messages.StringField(8)
  portion = _messages.EnumField('PortionValueValuesEnum', 9)
  workerId = _messages.StringField(10)


class CounterStructuredNameAndMetadata(_messages.Message):
  r"""A single message which encapsulates structured name and metadata for a
  given counter.

  Fields:
    metadata: Metadata associated with a counter
    name: Structured name of the counter.
  """

  metadata = _messages.MessageField('CounterMetadata', 1)
  name = _messages.MessageField('CounterStructuredName', 2)


class CounterUpdate(_messages.Message):
  r"""An update to a Counter sent from a worker.

  Fields:
    boolean: Boolean value for And, Or.
    cumulative: True if this counter is reported as the total cumulative
      aggregate value accumulated since the worker started working on this
      WorkItem. By default this is false, indicating that this counter is
      reported as a delta.
    distribution: Distribution data
    floatingPoint: Floating point value for Sum, Max, Min.
    floatingPointList: List of floating point numbers, for Set.
    floatingPointMean: Floating point mean aggregation value for Mean.
    integer: Integer value for Sum, Max, Min.
    integerGauge: Gauge data
    integerList: List of integers, for Set.
    integerMean: Integer mean aggregation value for Mean.
    internal: Value for internally-defined counters used by the Dataflow
      service.
    nameAndKind: Counter name and aggregation type.
    shortId: The service-generated short identifier for this counter. The
      short_id -> (name, metadata) mapping is constant for the lifetime of a
      job.
    stringList: List of strings, for Set.
    structuredNameAndMetadata: Counter structured name and metadata.
  """

  boolean = _messages.BooleanField(1)
  cumulative = _messages.BooleanField(2)
  distribution = _messages.MessageField('DistributionUpdate', 3)
  floatingPoint = _messages.FloatField(4)
  floatingPointList = _messages.MessageField('FloatingPointList', 5)
  floatingPointMean = _messages.MessageField('FloatingPointMean', 6)
  integer = _messages.MessageField('SplitInt64', 7)
  integerGauge = _messages.MessageField('IntegerGauge', 8)
  integerList = _messages.MessageField('IntegerList', 9)
  integerMean = _messages.MessageField('IntegerMean', 10)
  internal = _messages.MessageField('extra_types.JsonValue', 11)
  nameAndKind = _messages.MessageField('NameAndKind', 12)
  shortId = _messages.IntegerField(13)
  stringList = _messages.MessageField('StringList', 14)
  structuredNameAndMetadata = _messages.MessageField('CounterStructuredNameAndMetadata', 15)


class CreateJobFromTemplateRequest(_messages.Message):
  r"""A request to create a Cloud Dataflow job from a template.

  Messages:
    ParametersValue: The runtime parameters to pass to the job.

  Fields:
    environment: The runtime environment for the job.
    gcsPath: Required. A Cloud Storage path to the template from which to
      create the job. Must be a valid Cloud Storage URL, beginning with
      `gs://`.
    jobName: Required. The job name to use for the created job.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints) to
      which to direct the request.
    parameters: The runtime parameters to pass to the job.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class ParametersValue(_messages.Message):
    r"""The runtime parameters to pass to the job.

    Messages:
      AdditionalProperty: An additional property for a ParametersValue object.

    Fields:
      additionalProperties: Additional properties of type ParametersValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a ParametersValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  environment = _messages.MessageField('RuntimeEnvironment', 1)
  gcsPath = _messages.StringField(2)
  jobName = _messages.StringField(3)
  location = _messages.StringField(4)
  parameters = _messages.MessageField('ParametersValue', 5)


class CustomSourceLocation(_messages.Message):
  r"""Identifies the location of a custom souce.

  Fields:
    stateful: Whether this source is stateful.
  """

  stateful = _messages.BooleanField(1)


class DataDiskAssignment(_messages.Message):
  r"""Data disk assignment for a given VM instance.

  Fields:
    dataDisks: Mounted data disks. The order is important a data disk's
      0-based index in this list defines which persistent directory the disk
      is mounted to, for example the list of {
      "myproject-1014-104817-4c2-harness-0-disk-0" }, {
      "myproject-1014-104817-4c2-harness-0-disk-1" }.
    vmInstance: VM instance name the data disks mounted to, for example
      "myproject-1014-104817-4c2-harness-0".
  """

  dataDisks = _messages.StringField(1, repeated=True)
  vmInstance = _messages.StringField(2)


class DataflowProjectsJobsAggregatedRequest(_messages.Message):
  r"""A DataflowProjectsJobsAggregatedRequest object.

  Enums:
    FilterValueValuesEnum: The kind of filter to use.
    ViewValueValuesEnum: Level of information requested in response. Default
      is `JOB_VIEW_SUMMARY`.

  Fields:
    filter: The kind of filter to use.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    pageSize: If there are many jobs, limit response to at most this many. The
      actual number of jobs returned will be the lesser of max_responses and
      an unspecified server-defined limit.
    pageToken: Set this to the 'next_page_token' field of a previous response
      to request additional results in a long list.
    projectId: The project which owns the jobs.
    view: Level of information requested in response. Default is
      `JOB_VIEW_SUMMARY`.
  """

  class FilterValueValuesEnum(_messages.Enum):
    r"""The kind of filter to use.

    Values:
      UNKNOWN: <no description>
      ALL: <no description>
      TERMINATED: <no description>
      ACTIVE: <no description>
    """
    UNKNOWN = 0
    ALL = 1
    TERMINATED = 2
    ACTIVE = 3

  class ViewValueValuesEnum(_messages.Enum):
    r"""Level of information requested in response. Default is
    `JOB_VIEW_SUMMARY`.

    Values:
      JOB_VIEW_UNKNOWN: <no description>
      JOB_VIEW_SUMMARY: <no description>
      JOB_VIEW_ALL: <no description>
      JOB_VIEW_DESCRIPTION: <no description>
    """
    JOB_VIEW_UNKNOWN = 0
    JOB_VIEW_SUMMARY = 1
    JOB_VIEW_ALL = 2
    JOB_VIEW_DESCRIPTION = 3

  filter = _messages.EnumField('FilterValueValuesEnum', 1)
  location = _messages.StringField(2)
  pageSize = _messages.IntegerField(3, variant=_messages.Variant.INT32)
  pageToken = _messages.StringField(4)
  projectId = _messages.StringField(5, required=True)
  view = _messages.EnumField('ViewValueValuesEnum', 6)


class DataflowProjectsJobsCreateRequest(_messages.Message):
  r"""A DataflowProjectsJobsCreateRequest object.

  Enums:
    ViewValueValuesEnum: The level of information requested in response.

  Fields:
    job: A Job resource to be passed as the request body.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    projectId: The ID of the Cloud Platform project that the job belongs to.
    replaceJobId: Deprecated. This field is now in the Job message.
    view: The level of information requested in response.
  """

  class ViewValueValuesEnum(_messages.Enum):
    r"""The level of information requested in response.

    Values:
      JOB_VIEW_UNKNOWN: <no description>
      JOB_VIEW_SUMMARY: <no description>
      JOB_VIEW_ALL: <no description>
      JOB_VIEW_DESCRIPTION: <no description>
    """
    JOB_VIEW_UNKNOWN = 0
    JOB_VIEW_SUMMARY = 1
    JOB_VIEW_ALL = 2
    JOB_VIEW_DESCRIPTION = 3

  job = _messages.MessageField('Job', 1)
  location = _messages.StringField(2)
  projectId = _messages.StringField(3, required=True)
  replaceJobId = _messages.StringField(4)
  view = _messages.EnumField('ViewValueValuesEnum', 5)


class DataflowProjectsJobsDebugGetConfigRequest(_messages.Message):
  r"""A DataflowProjectsJobsDebugGetConfigRequest object.

  Fields:
    getDebugConfigRequest: A GetDebugConfigRequest resource to be passed as
      the request body.
    jobId: The job id.
    projectId: The project id.
  """

  getDebugConfigRequest = _messages.MessageField('GetDebugConfigRequest', 1)
  jobId = _messages.StringField(2, required=True)
  projectId = _messages.StringField(3, required=True)


class DataflowProjectsJobsDebugSendCaptureRequest(_messages.Message):
  r"""A DataflowProjectsJobsDebugSendCaptureRequest object.

  Fields:
    jobId: The job id.
    projectId: The project id.
    sendDebugCaptureRequest: A SendDebugCaptureRequest resource to be passed
      as the request body.
  """

  jobId = _messages.StringField(1, required=True)
  projectId = _messages.StringField(2, required=True)
  sendDebugCaptureRequest = _messages.MessageField('SendDebugCaptureRequest', 3)


class DataflowProjectsJobsGetMetricsRequest(_messages.Message):
  r"""A DataflowProjectsJobsGetMetricsRequest object.

  Fields:
    jobId: The job to get messages for.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job specified by job_id.
    projectId: A project id.
    startTime: Return only metric data that has changed since this time.
      Default is to return all information about all metrics for the job.
  """

  jobId = _messages.StringField(1, required=True)
  location = _messages.StringField(2)
  projectId = _messages.StringField(3, required=True)
  startTime = _messages.StringField(4)


class DataflowProjectsJobsGetRequest(_messages.Message):
  r"""A DataflowProjectsJobsGetRequest object.

  Enums:
    ViewValueValuesEnum: The level of information requested in response.

  Fields:
    jobId: The job ID.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    projectId: The ID of the Cloud Platform project that the job belongs to.
    view: The level of information requested in response.
  """

  class ViewValueValuesEnum(_messages.Enum):
    r"""The level of information requested in response.

    Values:
      JOB_VIEW_UNKNOWN: <no description>
      JOB_VIEW_SUMMARY: <no description>
      JOB_VIEW_ALL: <no description>
      JOB_VIEW_DESCRIPTION: <no description>
    """
    JOB_VIEW_UNKNOWN = 0
    JOB_VIEW_SUMMARY = 1
    JOB_VIEW_ALL = 2
    JOB_VIEW_DESCRIPTION = 3

  jobId = _messages.StringField(1, required=True)
  location = _messages.StringField(2)
  projectId = _messages.StringField(3, required=True)
  view = _messages.EnumField('ViewValueValuesEnum', 4)


class DataflowProjectsJobsListRequest(_messages.Message):
  r"""A DataflowProjectsJobsListRequest object.

  Enums:
    FilterValueValuesEnum: The kind of filter to use.
    ViewValueValuesEnum: Level of information requested in response. Default
      is `JOB_VIEW_SUMMARY`.

  Fields:
    filter: The kind of filter to use.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    pageSize: If there are many jobs, limit response to at most this many. The
      actual number of jobs returned will be the lesser of max_responses and
      an unspecified server-defined limit.
    pageToken: Set this to the 'next_page_token' field of a previous response
      to request additional results in a long list.
    projectId: The project which owns the jobs.
    view: Level of information requested in response. Default is
      `JOB_VIEW_SUMMARY`.
  """

  class FilterValueValuesEnum(_messages.Enum):
    r"""The kind of filter to use.

    Values:
      UNKNOWN: <no description>
      ALL: <no description>
      TERMINATED: <no description>
      ACTIVE: <no description>
    """
    UNKNOWN = 0
    ALL = 1
    TERMINATED = 2
    ACTIVE = 3

  class ViewValueValuesEnum(_messages.Enum):
    r"""Level of information requested in response. Default is
    `JOB_VIEW_SUMMARY`.

    Values:
      JOB_VIEW_UNKNOWN: <no description>
      JOB_VIEW_SUMMARY: <no description>
      JOB_VIEW_ALL: <no description>
      JOB_VIEW_DESCRIPTION: <no description>
    """
    JOB_VIEW_UNKNOWN = 0
    JOB_VIEW_SUMMARY = 1
    JOB_VIEW_ALL = 2
    JOB_VIEW_DESCRIPTION = 3

  filter = _messages.EnumField('FilterValueValuesEnum', 1)
  location = _messages.StringField(2)
  pageSize = _messages.IntegerField(3, variant=_messages.Variant.INT32)
  pageToken = _messages.StringField(4)
  projectId = _messages.StringField(5, required=True)
  view = _messages.EnumField('ViewValueValuesEnum', 6)


class DataflowProjectsJobsMessagesListRequest(_messages.Message):
  r"""A DataflowProjectsJobsMessagesListRequest object.

  Enums:
    MinimumImportanceValueValuesEnum: Filter to only get messages with
      importance >= level

  Fields:
    endTime: Return only messages with timestamps < end_time. The default is
      now (i.e. return up to the latest messages available).
    jobId: The job to get messages about.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job specified by job_id.
    minimumImportance: Filter to only get messages with importance >= level
    pageSize: If specified, determines the maximum number of messages to
      return.  If unspecified, the service may choose an appropriate default,
      or may return an arbitrarily large number of results.
    pageToken: If supplied, this should be the value of next_page_token
      returned by an earlier call. This will cause the next page of results to
      be returned.
    projectId: A project id.
    startTime: If specified, return only messages with timestamps >=
      start_time. The default is the job creation time (i.e. beginning of
      messages).
  """

  class MinimumImportanceValueValuesEnum(_messages.Enum):
    r"""Filter to only get messages with importance >= level

    Values:
      JOB_MESSAGE_IMPORTANCE_UNKNOWN: <no description>
      JOB_MESSAGE_DEBUG: <no description>
      JOB_MESSAGE_DETAILED: <no description>
      JOB_MESSAGE_BASIC: <no description>
      JOB_MESSAGE_WARNING: <no description>
      JOB_MESSAGE_ERROR: <no description>
    """
    JOB_MESSAGE_IMPORTANCE_UNKNOWN = 0
    JOB_MESSAGE_DEBUG = 1
    JOB_MESSAGE_DETAILED = 2
    JOB_MESSAGE_BASIC = 3
    JOB_MESSAGE_WARNING = 4
    JOB_MESSAGE_ERROR = 5

  endTime = _messages.StringField(1)
  jobId = _messages.StringField(2, required=True)
  location = _messages.StringField(3)
  minimumImportance = _messages.EnumField('MinimumImportanceValueValuesEnum', 4)
  pageSize = _messages.IntegerField(5, variant=_messages.Variant.INT32)
  pageToken = _messages.StringField(6)
  projectId = _messages.StringField(7, required=True)
  startTime = _messages.StringField(8)


class DataflowProjectsJobsUpdateRequest(_messages.Message):
  r"""A DataflowProjectsJobsUpdateRequest object.

  Fields:
    job: A Job resource to be passed as the request body.
    jobId: The job ID.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    projectId: The ID of the Cloud Platform project that the job belongs to.
  """

  job = _messages.MessageField('Job', 1)
  jobId = _messages.StringField(2, required=True)
  location = _messages.StringField(3)
  projectId = _messages.StringField(4, required=True)


class DataflowProjectsJobsWorkItemsLeaseRequest(_messages.Message):
  r"""A DataflowProjectsJobsWorkItemsLeaseRequest object.

  Fields:
    jobId: Identifies the workflow job this worker belongs to.
    leaseWorkItemRequest: A LeaseWorkItemRequest resource to be passed as the
      request body.
    projectId: Identifies the project this worker belongs to.
  """

  jobId = _messages.StringField(1, required=True)
  leaseWorkItemRequest = _messages.MessageField('LeaseWorkItemRequest', 2)
  projectId = _messages.StringField(3, required=True)


class DataflowProjectsJobsWorkItemsReportStatusRequest(_messages.Message):
  r"""A DataflowProjectsJobsWorkItemsReportStatusRequest object.

  Fields:
    jobId: The job which the WorkItem is part of.
    projectId: The project which owns the WorkItem's job.
    reportWorkItemStatusRequest: A ReportWorkItemStatusRequest resource to be
      passed as the request body.
  """

  jobId = _messages.StringField(1, required=True)
  projectId = _messages.StringField(2, required=True)
  reportWorkItemStatusRequest = _messages.MessageField('ReportWorkItemStatusRequest', 3)


class DataflowProjectsLocationsJobsCreateRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsCreateRequest object.

  Enums:
    ViewValueValuesEnum: The level of information requested in response.

  Fields:
    job: A Job resource to be passed as the request body.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    projectId: The ID of the Cloud Platform project that the job belongs to.
    replaceJobId: Deprecated. This field is now in the Job message.
    view: The level of information requested in response.
  """

  class ViewValueValuesEnum(_messages.Enum):
    r"""The level of information requested in response.

    Values:
      JOB_VIEW_UNKNOWN: <no description>
      JOB_VIEW_SUMMARY: <no description>
      JOB_VIEW_ALL: <no description>
      JOB_VIEW_DESCRIPTION: <no description>
    """
    JOB_VIEW_UNKNOWN = 0
    JOB_VIEW_SUMMARY = 1
    JOB_VIEW_ALL = 2
    JOB_VIEW_DESCRIPTION = 3

  job = _messages.MessageField('Job', 1)
  location = _messages.StringField(2, required=True)
  projectId = _messages.StringField(3, required=True)
  replaceJobId = _messages.StringField(4)
  view = _messages.EnumField('ViewValueValuesEnum', 5)


class DataflowProjectsLocationsJobsDebugGetConfigRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsDebugGetConfigRequest object.

  Fields:
    getDebugConfigRequest: A GetDebugConfigRequest resource to be passed as
      the request body.
    jobId: The job id.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job specified by job_id.
    projectId: The project id.
  """

  getDebugConfigRequest = _messages.MessageField('GetDebugConfigRequest', 1)
  jobId = _messages.StringField(2, required=True)
  location = _messages.StringField(3, required=True)
  projectId = _messages.StringField(4, required=True)


class DataflowProjectsLocationsJobsDebugSendCaptureRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsDebugSendCaptureRequest object.

  Fields:
    jobId: The job id.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job specified by job_id.
    projectId: The project id.
    sendDebugCaptureRequest: A SendDebugCaptureRequest resource to be passed
      as the request body.
  """

  jobId = _messages.StringField(1, required=True)
  location = _messages.StringField(2, required=True)
  projectId = _messages.StringField(3, required=True)
  sendDebugCaptureRequest = _messages.MessageField('SendDebugCaptureRequest', 4)


class DataflowProjectsLocationsJobsGetMetricsRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsGetMetricsRequest object.

  Fields:
    jobId: The job to get messages for.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job specified by job_id.
    projectId: A project id.
    startTime: Return only metric data that has changed since this time.
      Default is to return all information about all metrics for the job.
  """

  jobId = _messages.StringField(1, required=True)
  location = _messages.StringField(2, required=True)
  projectId = _messages.StringField(3, required=True)
  startTime = _messages.StringField(4)


class DataflowProjectsLocationsJobsGetRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsGetRequest object.

  Enums:
    ViewValueValuesEnum: The level of information requested in response.

  Fields:
    jobId: The job ID.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    projectId: The ID of the Cloud Platform project that the job belongs to.
    view: The level of information requested in response.
  """

  class ViewValueValuesEnum(_messages.Enum):
    r"""The level of information requested in response.

    Values:
      JOB_VIEW_UNKNOWN: <no description>
      JOB_VIEW_SUMMARY: <no description>
      JOB_VIEW_ALL: <no description>
      JOB_VIEW_DESCRIPTION: <no description>
    """
    JOB_VIEW_UNKNOWN = 0
    JOB_VIEW_SUMMARY = 1
    JOB_VIEW_ALL = 2
    JOB_VIEW_DESCRIPTION = 3

  jobId = _messages.StringField(1, required=True)
  location = _messages.StringField(2, required=True)
  projectId = _messages.StringField(3, required=True)
  view = _messages.EnumField('ViewValueValuesEnum', 4)


class DataflowProjectsLocationsJobsListRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsListRequest object.

  Enums:
    FilterValueValuesEnum: The kind of filter to use.
    ViewValueValuesEnum: Level of information requested in response. Default
      is `JOB_VIEW_SUMMARY`.

  Fields:
    filter: The kind of filter to use.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    pageSize: If there are many jobs, limit response to at most this many. The
      actual number of jobs returned will be the lesser of max_responses and
      an unspecified server-defined limit.
    pageToken: Set this to the 'next_page_token' field of a previous response
      to request additional results in a long list.
    projectId: The project which owns the jobs.
    view: Level of information requested in response. Default is
      `JOB_VIEW_SUMMARY`.
  """

  class FilterValueValuesEnum(_messages.Enum):
    r"""The kind of filter to use.

    Values:
      UNKNOWN: <no description>
      ALL: <no description>
      TERMINATED: <no description>
      ACTIVE: <no description>
    """
    UNKNOWN = 0
    ALL = 1
    TERMINATED = 2
    ACTIVE = 3

  class ViewValueValuesEnum(_messages.Enum):
    r"""Level of information requested in response. Default is
    `JOB_VIEW_SUMMARY`.

    Values:
      JOB_VIEW_UNKNOWN: <no description>
      JOB_VIEW_SUMMARY: <no description>
      JOB_VIEW_ALL: <no description>
      JOB_VIEW_DESCRIPTION: <no description>
    """
    JOB_VIEW_UNKNOWN = 0
    JOB_VIEW_SUMMARY = 1
    JOB_VIEW_ALL = 2
    JOB_VIEW_DESCRIPTION = 3

  filter = _messages.EnumField('FilterValueValuesEnum', 1)
  location = _messages.StringField(2, required=True)
  pageSize = _messages.IntegerField(3, variant=_messages.Variant.INT32)
  pageToken = _messages.StringField(4)
  projectId = _messages.StringField(5, required=True)
  view = _messages.EnumField('ViewValueValuesEnum', 6)


class DataflowProjectsLocationsJobsMessagesListRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsMessagesListRequest object.

  Enums:
    MinimumImportanceValueValuesEnum: Filter to only get messages with
      importance >= level

  Fields:
    endTime: Return only messages with timestamps < end_time. The default is
      now (i.e. return up to the latest messages available).
    jobId: The job to get messages about.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job specified by job_id.
    minimumImportance: Filter to only get messages with importance >= level
    pageSize: If specified, determines the maximum number of messages to
      return.  If unspecified, the service may choose an appropriate default,
      or may return an arbitrarily large number of results.
    pageToken: If supplied, this should be the value of next_page_token
      returned by an earlier call. This will cause the next page of results to
      be returned.
    projectId: A project id.
    startTime: If specified, return only messages with timestamps >=
      start_time. The default is the job creation time (i.e. beginning of
      messages).
  """

  class MinimumImportanceValueValuesEnum(_messages.Enum):
    r"""Filter to only get messages with importance >= level

    Values:
      JOB_MESSAGE_IMPORTANCE_UNKNOWN: <no description>
      JOB_MESSAGE_DEBUG: <no description>
      JOB_MESSAGE_DETAILED: <no description>
      JOB_MESSAGE_BASIC: <no description>
      JOB_MESSAGE_WARNING: <no description>
      JOB_MESSAGE_ERROR: <no description>
    """
    JOB_MESSAGE_IMPORTANCE_UNKNOWN = 0
    JOB_MESSAGE_DEBUG = 1
    JOB_MESSAGE_DETAILED = 2
    JOB_MESSAGE_BASIC = 3
    JOB_MESSAGE_WARNING = 4
    JOB_MESSAGE_ERROR = 5

  endTime = _messages.StringField(1)
  jobId = _messages.StringField(2, required=True)
  location = _messages.StringField(3, required=True)
  minimumImportance = _messages.EnumField('MinimumImportanceValueValuesEnum', 4)
  pageSize = _messages.IntegerField(5, variant=_messages.Variant.INT32)
  pageToken = _messages.StringField(6)
  projectId = _messages.StringField(7, required=True)
  startTime = _messages.StringField(8)


class DataflowProjectsLocationsJobsUpdateRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsUpdateRequest object.

  Fields:
    job: A Job resource to be passed as the request body.
    jobId: The job ID.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    projectId: The ID of the Cloud Platform project that the job belongs to.
  """

  job = _messages.MessageField('Job', 1)
  jobId = _messages.StringField(2, required=True)
  location = _messages.StringField(3, required=True)
  projectId = _messages.StringField(4, required=True)


class DataflowProjectsLocationsJobsWorkItemsLeaseRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsWorkItemsLeaseRequest object.

  Fields:
    jobId: Identifies the workflow job this worker belongs to.
    leaseWorkItemRequest: A LeaseWorkItemRequest resource to be passed as the
      request body.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the WorkItem's job.
    projectId: Identifies the project this worker belongs to.
  """

  jobId = _messages.StringField(1, required=True)
  leaseWorkItemRequest = _messages.MessageField('LeaseWorkItemRequest', 2)
  location = _messages.StringField(3, required=True)
  projectId = _messages.StringField(4, required=True)


class DataflowProjectsLocationsJobsWorkItemsReportStatusRequest(_messages.Message):
  r"""A DataflowProjectsLocationsJobsWorkItemsReportStatusRequest object.

  Fields:
    jobId: The job which the WorkItem is part of.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the WorkItem's job.
    projectId: The project which owns the WorkItem's job.
    reportWorkItemStatusRequest: A ReportWorkItemStatusRequest resource to be
      passed as the request body.
  """

  jobId = _messages.StringField(1, required=True)
  location = _messages.StringField(2, required=True)
  projectId = _messages.StringField(3, required=True)
  reportWorkItemStatusRequest = _messages.MessageField('ReportWorkItemStatusRequest', 4)


class DataflowProjectsLocationsSqlValidateRequest(_messages.Message):
  r"""A DataflowProjectsLocationsSqlValidateRequest object.

  Fields:
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints) to
      which to direct the request.
    projectId: Required. The ID of the Cloud Platform project that the job
      belongs to.
    query: The sql query to validate.
  """

  location = _messages.StringField(1, required=True)
  projectId = _messages.StringField(2, required=True)
  query = _messages.StringField(3)


class DataflowProjectsLocationsTemplatesCreateRequest(_messages.Message):
  r"""A DataflowProjectsLocationsTemplatesCreateRequest object.

  Fields:
    createJobFromTemplateRequest: A CreateJobFromTemplateRequest resource to
      be passed as the request body.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints) to
      which to direct the request.
    projectId: Required. The ID of the Cloud Platform project that the job
      belongs to.
  """

  createJobFromTemplateRequest = _messages.MessageField('CreateJobFromTemplateRequest', 1)
  location = _messages.StringField(2, required=True)
  projectId = _messages.StringField(3, required=True)


class DataflowProjectsLocationsTemplatesGetRequest(_messages.Message):
  r"""A DataflowProjectsLocationsTemplatesGetRequest object.

  Enums:
    ViewValueValuesEnum: The view to retrieve. Defaults to METADATA_ONLY.

  Fields:
    gcsPath: Required. A Cloud Storage path to the template from which to
      create the job. Must be valid Cloud Storage URL, beginning with 'gs://'.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints) to
      which to direct the request.
    projectId: Required. The ID of the Cloud Platform project that the job
      belongs to.
    view: The view to retrieve. Defaults to METADATA_ONLY.
  """

  class ViewValueValuesEnum(_messages.Enum):
    r"""The view to retrieve. Defaults to METADATA_ONLY.

    Values:
      METADATA_ONLY: <no description>
    """
    METADATA_ONLY = 0

  gcsPath = _messages.StringField(1)
  location = _messages.StringField(2, required=True)
  projectId = _messages.StringField(3, required=True)
  view = _messages.EnumField('ViewValueValuesEnum', 4)


class DataflowProjectsLocationsTemplatesLaunchRequest(_messages.Message):
  r"""A DataflowProjectsLocationsTemplatesLaunchRequest object.

  Fields:
    dynamicTemplate_gcsPath: Path to dynamic template spec file on GCS. The
      file must be a Json serialized DynamicTemplateFieSpec object.
    dynamicTemplate_stagingLocation: Cloud Storage path for staging
      dependencies. Must be a valid Cloud Storage URL, beginning with `gs://`.
    gcsPath: A Cloud Storage path to the template from which to create the
      job. Must be valid Cloud Storage URL, beginning with 'gs://'.
    launchTemplateParameters: A LaunchTemplateParameters resource to be passed
      as the request body.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints) to
      which to direct the request.
    projectId: Required. The ID of the Cloud Platform project that the job
      belongs to.
    validateOnly: If true, the request is validated but not actually executed.
      Defaults to false.
  """

  dynamicTemplate_gcsPath = _messages.StringField(1)
  dynamicTemplate_stagingLocation = _messages.StringField(2)
  gcsPath = _messages.StringField(3)
  launchTemplateParameters = _messages.MessageField('LaunchTemplateParameters', 4)
  location = _messages.StringField(5, required=True)
  projectId = _messages.StringField(6, required=True)
  validateOnly = _messages.BooleanField(7)


class DataflowProjectsLocationsWorkerMessagesRequest(_messages.Message):
  r"""A DataflowProjectsLocationsWorkerMessagesRequest object.

  Fields:
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job.
    projectId: The project to send the WorkerMessages to.
    sendWorkerMessagesRequest: A SendWorkerMessagesRequest resource to be
      passed as the request body.
  """

  location = _messages.StringField(1, required=True)
  projectId = _messages.StringField(2, required=True)
  sendWorkerMessagesRequest = _messages.MessageField('SendWorkerMessagesRequest', 3)


class DataflowProjectsTemplatesCreateRequest(_messages.Message):
  r"""A DataflowProjectsTemplatesCreateRequest object.

  Fields:
    createJobFromTemplateRequest: A CreateJobFromTemplateRequest resource to
      be passed as the request body.
    projectId: Required. The ID of the Cloud Platform project that the job
      belongs to.
  """

  createJobFromTemplateRequest = _messages.MessageField('CreateJobFromTemplateRequest', 1)
  projectId = _messages.StringField(2, required=True)


class DataflowProjectsTemplatesGetRequest(_messages.Message):
  r"""A DataflowProjectsTemplatesGetRequest object.

  Enums:
    ViewValueValuesEnum: The view to retrieve. Defaults to METADATA_ONLY.

  Fields:
    gcsPath: Required. A Cloud Storage path to the template from which to
      create the job. Must be valid Cloud Storage URL, beginning with 'gs://'.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints) to
      which to direct the request.
    projectId: Required. The ID of the Cloud Platform project that the job
      belongs to.
    view: The view to retrieve. Defaults to METADATA_ONLY.
  """

  class ViewValueValuesEnum(_messages.Enum):
    r"""The view to retrieve. Defaults to METADATA_ONLY.

    Values:
      METADATA_ONLY: <no description>
    """
    METADATA_ONLY = 0

  gcsPath = _messages.StringField(1)
  location = _messages.StringField(2)
  projectId = _messages.StringField(3, required=True)
  view = _messages.EnumField('ViewValueValuesEnum', 4)


class DataflowProjectsTemplatesLaunchRequest(_messages.Message):
  r"""A DataflowProjectsTemplatesLaunchRequest object.

  Fields:
    dynamicTemplate_gcsPath: Path to dynamic template spec file on GCS. The
      file must be a Json serialized DynamicTemplateFieSpec object.
    dynamicTemplate_stagingLocation: Cloud Storage path for staging
      dependencies. Must be a valid Cloud Storage URL, beginning with `gs://`.
    gcsPath: A Cloud Storage path to the template from which to create the
      job. Must be valid Cloud Storage URL, beginning with 'gs://'.
    launchTemplateParameters: A LaunchTemplateParameters resource to be passed
      as the request body.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints) to
      which to direct the request.
    projectId: Required. The ID of the Cloud Platform project that the job
      belongs to.
    validateOnly: If true, the request is validated but not actually executed.
      Defaults to false.
  """

  dynamicTemplate_gcsPath = _messages.StringField(1)
  dynamicTemplate_stagingLocation = _messages.StringField(2)
  gcsPath = _messages.StringField(3)
  launchTemplateParameters = _messages.MessageField('LaunchTemplateParameters', 4)
  location = _messages.StringField(5)
  projectId = _messages.StringField(6, required=True)
  validateOnly = _messages.BooleanField(7)


class DataflowProjectsWorkerMessagesRequest(_messages.Message):
  r"""A DataflowProjectsWorkerMessagesRequest object.

  Fields:
    projectId: The project to send the WorkerMessages to.
    sendWorkerMessagesRequest: A SendWorkerMessagesRequest resource to be
      passed as the request body.
  """

  projectId = _messages.StringField(1, required=True)
  sendWorkerMessagesRequest = _messages.MessageField('SendWorkerMessagesRequest', 2)


class DatastoreIODetails(_messages.Message):
  r"""Metadata for a Datastore connector used by the job.

  Fields:
    namespace: Namespace used in the connection.
    projectId: ProjectId accessed in the connection.
  """

  namespace = _messages.StringField(1)
  projectId = _messages.StringField(2)


class DerivedSource(_messages.Message):
  r"""Specification of one of the bundles produced as a result of splitting a
  Source (e.g. when executing a SourceSplitRequest, or when splitting an
  active task using WorkItemStatus.dynamic_source_split), relative to the
  source being split.

  Enums:
    DerivationModeValueValuesEnum: What source to base the produced source on
      (if any).

  Fields:
    derivationMode: What source to base the produced source on (if any).
    source: Specification of the source.
  """

  class DerivationModeValueValuesEnum(_messages.Enum):
    r"""What source to base the produced source on (if any).

    Values:
      SOURCE_DERIVATION_MODE_UNKNOWN: The source derivation is unknown, or
        unspecified.
      SOURCE_DERIVATION_MODE_INDEPENDENT: Produce a completely independent
        Source with no base.
      SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT: Produce a Source based on the
        Source being split.
      SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT: Produce a Source based on the
        base of the Source being split.
    """
    SOURCE_DERIVATION_MODE_UNKNOWN = 0
    SOURCE_DERIVATION_MODE_INDEPENDENT = 1
    SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT = 2
    SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT = 3

  derivationMode = _messages.EnumField('DerivationModeValueValuesEnum', 1)
  source = _messages.MessageField('Source', 2)


class Disk(_messages.Message):
  r"""Describes the data disk used by a workflow job.

  Fields:
    diskType: Disk storage type, as defined by Google Compute Engine.  This
      must be a disk type appropriate to the project and zone in which the
      workers will run.  If unknown or unspecified, the service will attempt
      to choose a reasonable default.  For example, the standard persistent
      disk type is a resource name typically ending in "pd-standard".  If SSD
      persistent disks are available, the resource name typically ends with
      "pd-ssd".  The actual valid values are defined the Google Compute Engine
      API, not by the Cloud Dataflow API; consult the Google Compute Engine
      documentation for more information about determining the set of
      available disk types for a particular project and zone.  Google Compute
      Engine Disk types are local to a particular project in a particular
      zone, and so the resource name will typically look something like this:
      compute.googleapis.com/projects/project-id/zones/zone/diskTypes/pd-
      standard
    mountPoint: Directory in a VM where disk is mounted.
    sizeGb: Size of disk in GB.  If zero or unspecified, the service will
      attempt to choose a reasonable default.
  """

  diskType = _messages.StringField(1)
  mountPoint = _messages.StringField(2)
  sizeGb = _messages.IntegerField(3, variant=_messages.Variant.INT32)


class DisplayData(_messages.Message):
  r"""Data provided with a pipeline or transform to provide descriptive info.

  Fields:
    boolValue: Contains value if the data is of a boolean type.
    durationValue: Contains value if the data is of duration type.
    floatValue: Contains value if the data is of float type.
    int64Value: Contains value if the data is of int64 type.
    javaClassValue: Contains value if the data is of java class type.
    key: The key identifying the display data. This is intended to be used as
      a label for the display data when viewed in a dax monitoring system.
    label: An optional label to display in a dax UI for the element.
    namespace: The namespace for the key. This is usually a class name or
      programming language namespace (i.e. python module) which defines the
      display data. This allows a dax monitoring system to specially handle
      the data and perform custom rendering.
    shortStrValue: A possible additional shorter value to display. For example
      a java_class_name_value of com.mypackage.MyDoFn will be stored with
      MyDoFn as the short_str_value and com.mypackage.MyDoFn as the
      java_class_name value. short_str_value can be displayed and
      java_class_name_value will be displayed as a tooltip.
    strValue: Contains value if the data is of string type.
    timestampValue: Contains value if the data is of timestamp type.
    url: An optional full URL.
  """

  boolValue = _messages.BooleanField(1)
  durationValue = _messages.StringField(2)
  floatValue = _messages.FloatField(3, variant=_messages.Variant.FLOAT)
  int64Value = _messages.IntegerField(4)
  javaClassValue = _messages.StringField(5)
  key = _messages.StringField(6)
  label = _messages.StringField(7)
  namespace = _messages.StringField(8)
  shortStrValue = _messages.StringField(9)
  strValue = _messages.StringField(10)
  timestampValue = _messages.StringField(11)
  url = _messages.StringField(12)


class DistributionUpdate(_messages.Message):
  r"""A metric value representing a distribution.

  Fields:
    count: The count of the number of elements present in the distribution.
    histogram: (Optional) Histogram of value counts for the distribution.
    max: The maximum value present in the distribution.
    min: The minimum value present in the distribution.
    sum: Use an int64 since we'd prefer the added precision. If overflow is a
      common problem we can detect it and use an additional int64 or a double.
    sumOfSquares: Use a double since the sum of squares is likely to overflow
      int64.
  """

  count = _messages.MessageField('SplitInt64', 1)
  histogram = _messages.MessageField('Histogram', 2)
  max = _messages.MessageField('SplitInt64', 3)
  min = _messages.MessageField('SplitInt64', 4)
  sum = _messages.MessageField('SplitInt64', 5)
  sumOfSquares = _messages.FloatField(6)


class DynamicSourceSplit(_messages.Message):
  r"""When a task splits using WorkItemStatus.dynamic_source_split, this
  message describes the two parts of the split relative to the description of
  the current task's input.

  Fields:
    primary: Primary part (continued to be processed by worker). Specified
      relative to the previously-current source. Becomes current.
    residual: Residual part (returned to the pool of work). Specified relative
      to the previously-current source.
  """

  primary = _messages.MessageField('DerivedSource', 1)
  residual = _messages.MessageField('DerivedSource', 2)


class Environment(_messages.Message):
  r"""Describes the environment in which a Dataflow Job runs.

  Enums:
    FlexResourceSchedulingGoalValueValuesEnum: Which Flexible Resource
      Scheduling mode to run in.

  Messages:
    InternalExperimentsValue: Experimental settings.
    SdkPipelineOptionsValue: The Cloud Dataflow SDK pipeline options specified
      by the user. These options are passed through the service and are used
      to recreate the SDK pipeline options on the worker in a language
      agnostic and platform independent way.
    UserAgentValue: A description of the process that generated the request.
    VersionValue: A structure describing which components and their versions
      of the service are required in order to run the job.

  Fields:
    clusterManagerApiService: The type of cluster manager API to use.  If
      unknown or unspecified, the service will attempt to choose a reasonable
      default.  This should be in the form of the API service name, e.g.
      "compute.googleapis.com".
    dataset: The dataset for the current project where various workflow
      related tables are stored.  The supported resource type is:  Google
      BigQuery:   bigquery.googleapis.com/{dataset}
    experiments: The list of experiments to enable.
    flexResourceSchedulingGoal: Which Flexible Resource Scheduling mode to run
      in.
    internalExperiments: Experimental settings.
    sdkPipelineOptions: The Cloud Dataflow SDK pipeline options specified by
      the user. These options are passed through the service and are used to
      recreate the SDK pipeline options on the worker in a language agnostic
      and platform independent way.
    serviceAccountEmail: Identity to run virtual machines as. Defaults to the
      default account.
    serviceKmsKeyName: If set, contains the Cloud KMS key identifier used to
      encrypt data at rest, AKA a Customer Managed Encryption Key (CMEK).
      Format:
      projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY
    tempStoragePrefix: The prefix of the resources the system should use for
      temporary storage.  The system will append the suffix "/temp-{JOBNAME}
      to this resource prefix, where {JOBNAME} is the value of the job_name
      field.  The resulting bucket and object prefix is used as the prefix of
      the resources used to store temporary data needed during the job
      execution.  NOTE: This will override the value in taskrunner_settings.
      The supported resource type is:  Google Cloud Storage:
      storage.googleapis.com/{bucket}/{object}
      bucket.storage.googleapis.com/{object}
    userAgent: A description of the process that generated the request.
    version: A structure describing which components and their versions of the
      service are required in order to run the job.
    workerPools: The worker pools. At least one "harness" worker pool must be
      specified in order for the job to have workers.
    workerRegion: The Compute Engine region
      (https://cloud.google.com/compute/docs/regions-zones/regions-zones) in
      which worker processing should occur, e.g. "us-west1". Mutually
      exclusive with worker_zone. If neither worker_region nor worker_zone is
      specified, default to the control plane's region.
    workerZone: The Compute Engine zone (https://cloud.google.com/compute/docs
      /regions-zones/regions-zones) in which worker processing should occur,
      e.g. "us-west1-a". Mutually exclusive with worker_region. If neither
      worker_region nor worker_zone is specified, a zone in the control
      plane's region is chosen based on available capacity.
  """

  class FlexResourceSchedulingGoalValueValuesEnum(_messages.Enum):
    r"""Which Flexible Resource Scheduling mode to run in.

    Values:
      FLEXRS_UNSPECIFIED: Run in the default mode.
      FLEXRS_SPEED_OPTIMIZED: Optimize for lower execution time.
      FLEXRS_COST_OPTIMIZED: Optimize for lower cost.
    """
    FLEXRS_UNSPECIFIED = 0
    FLEXRS_SPEED_OPTIMIZED = 1
    FLEXRS_COST_OPTIMIZED = 2

  @encoding.MapUnrecognizedFields('additionalProperties')
  class InternalExperimentsValue(_messages.Message):
    r"""Experimental settings.

    Messages:
      AdditionalProperty: An additional property for a
        InternalExperimentsValue object.

    Fields:
      additionalProperties: Properties of the object. Contains field @type
        with type URL.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a InternalExperimentsValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class SdkPipelineOptionsValue(_messages.Message):
    r"""The Cloud Dataflow SDK pipeline options specified by the user. These
    options are passed through the service and are used to recreate the SDK
    pipeline options on the worker in a language agnostic and platform
    independent way.

    Messages:
      AdditionalProperty: An additional property for a SdkPipelineOptionsValue
        object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a SdkPipelineOptionsValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UserAgentValue(_messages.Message):
    r"""A description of the process that generated the request.

    Messages:
      AdditionalProperty: An additional property for a UserAgentValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UserAgentValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class VersionValue(_messages.Message):
    r"""A structure describing which components and their versions of the
    service are required in order to run the job.

    Messages:
      AdditionalProperty: An additional property for a VersionValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a VersionValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  clusterManagerApiService = _messages.StringField(1)
  dataset = _messages.StringField(2)
  experiments = _messages.StringField(3, repeated=True)
  flexResourceSchedulingGoal = _messages.EnumField('FlexResourceSchedulingGoalValueValuesEnum', 4)
  internalExperiments = _messages.MessageField('InternalExperimentsValue', 5)
  sdkPipelineOptions = _messages.MessageField('SdkPipelineOptionsValue', 6)
  serviceAccountEmail = _messages.StringField(7)
  serviceKmsKeyName = _messages.StringField(8)
  tempStoragePrefix = _messages.StringField(9)
  userAgent = _messages.MessageField('UserAgentValue', 10)
  version = _messages.MessageField('VersionValue', 11)
  workerPools = _messages.MessageField('WorkerPool', 12, repeated=True)
  workerRegion = _messages.StringField(13)
  workerZone = _messages.StringField(14)


class ExecutionStageState(_messages.Message):
  r"""A message describing the state of a particular execution stage.

  Enums:
    ExecutionStageStateValueValuesEnum: Executions stage states allow the same
      set of values as JobState.

  Fields:
    currentStateTime: The time at which the stage transitioned to this state.
    executionStageName: The name of the execution stage.
    executionStageState: Executions stage states allow the same set of values
      as JobState.
  """

  class ExecutionStageStateValueValuesEnum(_messages.Enum):
    r"""Executions stage states allow the same set of values as JobState.

    Values:
      JOB_STATE_UNKNOWN: The job's run state isn't specified.
      JOB_STATE_STOPPED: `JOB_STATE_STOPPED` indicates that the job has not
        yet started to run.
      JOB_STATE_RUNNING: `JOB_STATE_RUNNING` indicates that the job is
        currently running.
      JOB_STATE_DONE: `JOB_STATE_DONE` indicates that the job has successfully
        completed. This is a terminal job state.  This state may be set by the
        Cloud Dataflow service, as a transition from `JOB_STATE_RUNNING`. It
        may also be set via a Cloud Dataflow `UpdateJob` call, if the job has
        not yet reached a terminal state.
      JOB_STATE_FAILED: `JOB_STATE_FAILED` indicates that the job has failed.
        This is a terminal job state.  This state may only be set by the Cloud
        Dataflow service, and only as a transition from `JOB_STATE_RUNNING`.
      JOB_STATE_CANCELLED: `JOB_STATE_CANCELLED` indicates that the job has
        been explicitly cancelled. This is a terminal job state. This state
        may only be set via a Cloud Dataflow `UpdateJob` call, and only if the
        job has not yet reached another terminal state.
      JOB_STATE_UPDATED: `JOB_STATE_UPDATED` indicates that the job was
        successfully updated, meaning that this job was stopped and another
        job was started, inheriting state from this one. This is a terminal
        job state. This state may only be set by the Cloud Dataflow service,
        and only as a transition from `JOB_STATE_RUNNING`.
      JOB_STATE_DRAINING: `JOB_STATE_DRAINING` indicates that the job is in
        the process of draining. A draining job has stopped pulling from its
        input sources and is processing any data that remains in-flight. This
        state may be set via a Cloud Dataflow `UpdateJob` call, but only as a
        transition from `JOB_STATE_RUNNING`. Jobs that are draining may only
        transition to `JOB_STATE_DRAINED`, `JOB_STATE_CANCELLED`, or
        `JOB_STATE_FAILED`.
      JOB_STATE_DRAINED: `JOB_STATE_DRAINED` indicates that the job has been
        drained. A drained job terminated by stopping pulling from its input
        sources and processing any data that remained in-flight when draining
        was requested. This state is a terminal state, may only be set by the
        Cloud Dataflow service, and only as a transition from
        `JOB_STATE_DRAINING`.
      JOB_STATE_PENDING: `JOB_STATE_PENDING` indicates that the job has been
        created but is not yet running.  Jobs that are pending may only
        transition to `JOB_STATE_RUNNING`, or `JOB_STATE_FAILED`.
      JOB_STATE_CANCELLING: `JOB_STATE_CANCELLING` indicates that the job has
        been explicitly cancelled and is in the process of stopping.  Jobs
        that are cancelling may only transition to `JOB_STATE_CANCELLED` or
        `JOB_STATE_FAILED`.
      JOB_STATE_QUEUED: `JOB_STATE_QUEUED` indicates that the job has been
        created but is being delayed until launch. Jobs that are queued may
        only transition to `JOB_STATE_PENDING` or `JOB_STATE_CANCELLED`.
    """
    JOB_STATE_UNKNOWN = 0
    JOB_STATE_STOPPED = 1
    JOB_STATE_RUNNING = 2
    JOB_STATE_DONE = 3
    JOB_STATE_FAILED = 4
    JOB_STATE_CANCELLED = 5
    JOB_STATE_UPDATED = 6
    JOB_STATE_DRAINING = 7
    JOB_STATE_DRAINED = 8
    JOB_STATE_PENDING = 9
    JOB_STATE_CANCELLING = 10
    JOB_STATE_QUEUED = 11

  currentStateTime = _messages.StringField(1)
  executionStageName = _messages.StringField(2)
  executionStageState = _messages.EnumField('ExecutionStageStateValueValuesEnum', 3)


class ExecutionStageSummary(_messages.Message):
  r"""Description of the composing transforms, names/ids, and input/outputs of
  a stage of execution.  Some composing transforms and sources may have been
  generated by the Dataflow service during execution planning.

  Enums:
    KindValueValuesEnum: Type of tranform this stage is executing.

  Fields:
    componentSource: Collections produced and consumed by component transforms
      of this stage.
    componentTransform: Transforms that comprise this execution stage.
    id: Dataflow service generated id for this stage.
    inputSource: Input sources for this stage.
    kind: Type of tranform this stage is executing.
    name: Dataflow service generated name for this stage.
    outputSource: Output sources for this stage.
  """

  class KindValueValuesEnum(_messages.Enum):
    r"""Type of tranform this stage is executing.

    Values:
      UNKNOWN_KIND: Unrecognized transform type.
      PAR_DO_KIND: ParDo transform.
      GROUP_BY_KEY_KIND: Group By Key transform.
      FLATTEN_KIND: Flatten transform.
      READ_KIND: Read transform.
      WRITE_KIND: Write transform.
      CONSTANT_KIND: Constructs from a constant value, such as with Create.of.
      SINGLETON_KIND: Creates a Singleton view of a collection.
      SHUFFLE_KIND: Opening or closing a shuffle session, often as part of a
        GroupByKey.
    """
    UNKNOWN_KIND = 0
    PAR_DO_KIND = 1
    GROUP_BY_KEY_KIND = 2
    FLATTEN_KIND = 3
    READ_KIND = 4
    WRITE_KIND = 5
    CONSTANT_KIND = 6
    SINGLETON_KIND = 7
    SHUFFLE_KIND = 8

  componentSource = _messages.MessageField('ComponentSource', 1, repeated=True)
  componentTransform = _messages.MessageField('ComponentTransform', 2, repeated=True)
  id = _messages.StringField(3)
  inputSource = _messages.MessageField('StageSource', 4, repeated=True)
  kind = _messages.EnumField('KindValueValuesEnum', 5)
  name = _messages.StringField(6)
  outputSource = _messages.MessageField('StageSource', 7, repeated=True)


class FailedLocation(_messages.Message):
  r"""Indicates which [regional endpoint]
  (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints) failed
  to respond to a request for data.

  Fields:
    name: The name of the [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that failed to respond.
  """

  name = _messages.StringField(1)


class FileIODetails(_messages.Message):
  r"""Metadata for a File connector used by the job.

  Fields:
    filePattern: File Pattern used to access files by the connector.
  """

  filePattern = _messages.StringField(1)


class FlattenInstruction(_messages.Message):
  r"""An instruction that copies its inputs (zero or more) to its (single)
  output.

  Fields:
    inputs: Describes the inputs to the flatten instruction.
  """

  inputs = _messages.MessageField('InstructionInput', 1, repeated=True)


class FloatingPointList(_messages.Message):
  r"""A metric value representing a list of floating point numbers.

  Fields:
    elements: Elements of the list.
  """

  elements = _messages.FloatField(1, repeated=True)


class FloatingPointMean(_messages.Message):
  r"""A representation of a floating point mean metric contribution.

  Fields:
    count: The number of values being aggregated.
    sum: The sum of all values being aggregated.
  """

  count = _messages.MessageField('SplitInt64', 1)
  sum = _messages.FloatField(2)


class GetDebugConfigRequest(_messages.Message):
  r"""Request to get updated debug configuration for component.

  Fields:
    componentId: The internal component id for which debug configuration is
      requested.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job specified by job_id.
    workerId: The worker id, i.e., VM hostname.
  """

  componentId = _messages.StringField(1)
  location = _messages.StringField(2)
  workerId = _messages.StringField(3)


class GetDebugConfigResponse(_messages.Message):
  r"""Response to a get debug configuration request.

  Fields:
    config: The encoded debug configuration for the requested component.
  """

  config = _messages.StringField(1)


class GetTemplateResponse(_messages.Message):
  r"""The response to a GetTemplate request.

  Fields:
    metadata: The template metadata describing the template name, available
      parameters, etc.
    status: The status of the get template request. Any problems with the
      request will be indicated in the error_details.
  """

  metadata = _messages.MessageField('TemplateMetadata', 1)
  status = _messages.MessageField('Status', 2)


class Histogram(_messages.Message):
  r"""Histogram of value counts for a distribution.  Buckets have an inclusive
  lower bound and exclusive upper bound and use "1,2,5 bucketing": The first
  bucket range is from [0,1) and all subsequent bucket boundaries are powers
  of ten multiplied by 1, 2, or 5. Thus, bucket boundaries are 0, 1, 2, 5, 10,
  20, 50, 100, 200, 500, 1000, ... Negative values are not supported.

  Fields:
    bucketCounts: Counts of values in each bucket. For efficiency, prefix and
      trailing buckets with count = 0 are elided. Buckets can store the full
      range of values of an unsigned long, with ULLONG_MAX falling into the
      59th bucket with range [1e19, 2e19).
    firstBucketOffset: Starting index of first stored bucket. The non-
      inclusive upper-bound of the ith bucket is given by:
      pow(10,(i-first_bucket_offset)/3) * (1,2,5)[(i-first_bucket_offset)%3]
  """

  bucketCounts = _messages.IntegerField(1, repeated=True)
  firstBucketOffset = _messages.IntegerField(2, variant=_messages.Variant.INT32)


class HotKeyDetection(_messages.Message):
  r"""Proto describing a hot key detected on a given WorkItem.

  Fields:
    hotKeyAge: The age of the hot key measured from when it was first
      detected.
    systemName: System-defined name of the step containing this hot key.
      Unique across the workflow.
    userStepName: User-provided name of the step that contains this hot key.
  """

  hotKeyAge = _messages.StringField(1)
  systemName = _messages.StringField(2)
  userStepName = _messages.StringField(3)


class InstructionInput(_messages.Message):
  r"""An input of an instruction, as a reference to an output of a producer
  instruction.

  Fields:
    outputNum: The output index (origin zero) within the producer.
    producerInstructionIndex: The index (origin zero) of the parallel
      instruction that produces the output to be consumed by this input.  This
      index is relative to the list of instructions in this input's
      instruction's containing MapTask.
  """

  outputNum = _messages.IntegerField(1, variant=_messages.Variant.INT32)
  producerInstructionIndex = _messages.IntegerField(2, variant=_messages.Variant.INT32)


class InstructionOutput(_messages.Message):
  r"""An output of an instruction.

  Messages:
    CodecValue: The codec to use to encode data being written via this output.

  Fields:
    codec: The codec to use to encode data being written via this output.
    name: The user-provided name of this output.
    onlyCountKeyBytes: For system-generated byte and mean byte metrics,
      certain instructions should only report the key size.
    onlyCountValueBytes: For system-generated byte and mean byte metrics,
      certain instructions should only report the value size.
    originalName: System-defined name for this output in the original workflow
      graph. Outputs that do not contribute to an original instruction do not
      set this.
    systemName: System-defined name of this output. Unique across the
      workflow.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class CodecValue(_messages.Message):
    r"""The codec to use to encode data being written via this output.

    Messages:
      AdditionalProperty: An additional property for a CodecValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a CodecValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  codec = _messages.MessageField('CodecValue', 1)
  name = _messages.StringField(2)
  onlyCountKeyBytes = _messages.BooleanField(3)
  onlyCountValueBytes = _messages.BooleanField(4)
  originalName = _messages.StringField(5)
  systemName = _messages.StringField(6)


class IntegerGauge(_messages.Message):
  r"""A metric value representing temporal values of a variable.

  Fields:
    timestamp: The time at which this value was measured. Measured as msecs
      from epoch.
    value: The value of the variable represented by this gauge.
  """

  timestamp = _messages.StringField(1)
  value = _messages.MessageField('SplitInt64', 2)


class IntegerList(_messages.Message):
  r"""A metric value representing a list of integers.

  Fields:
    elements: Elements of the list.
  """

  elements = _messages.MessageField('SplitInt64', 1, repeated=True)


class IntegerMean(_messages.Message):
  r"""A representation of an integer mean metric contribution.

  Fields:
    count: The number of values being aggregated.
    sum: The sum of all values being aggregated.
  """

  count = _messages.MessageField('SplitInt64', 1)
  sum = _messages.MessageField('SplitInt64', 2)


class Job(_messages.Message):
  r"""Defines a job to be run by the Cloud Dataflow service.

  Enums:
    CurrentStateValueValuesEnum: The current state of the job.  Jobs are
      created in the `JOB_STATE_STOPPED` state unless otherwise specified.  A
      job in the `JOB_STATE_RUNNING` state may asynchronously enter a terminal
      state. After a job has reached a terminal state, no further state
      updates may be made.  This field may be mutated by the Cloud Dataflow
      service; callers cannot mutate it.
    RequestedStateValueValuesEnum: The job's requested state.  `UpdateJob` may
      be used to switch between the `JOB_STATE_STOPPED` and
      `JOB_STATE_RUNNING` states, by setting requested_state.  `UpdateJob` may
      also be used to directly set a job's requested state to
      `JOB_STATE_CANCELLED` or `JOB_STATE_DONE`, irrevocably terminating the
      job if it has not already reached a terminal state.
    TypeValueValuesEnum: The type of Cloud Dataflow job.

  Messages:
    LabelsValue: User-defined labels for this job.  The labels map can contain
      no more than 64 entries.  Entries of the labels map are UTF8 strings
      that comply with the following restrictions:  * Keys must conform to
      regexp:  \p{Ll}\p{Lo}{0,62} * Values must conform to regexp:
      [\p{Ll}\p{Lo}\p{N}_-]{0,63} * Both keys and values are additionally
      constrained to be <= 128 bytes in size.
    TransformNameMappingValue: The map of transform name prefixes of the job
      to be replaced to the corresponding name prefixes of the new job.

  Fields:
    clientRequestId: The client's unique identifier of the job, re-used across
      retried attempts. If this field is set, the service will ensure its
      uniqueness. The request to create a job will fail if the service has
      knowledge of a previously submitted job with the same client's ID and
      job name. The caller may use this field to ensure idempotence of job
      creation across retried attempts to create a job. By default, the field
      is empty and, in that case, the service ignores it.
    createTime: The timestamp when the job was initially created. Immutable
      and set by the Cloud Dataflow service.
    createdFromSnapshotId: If this is specified, the job's initial state is
      populated from the given snapshot.
    currentState: The current state of the job.  Jobs are created in the
      `JOB_STATE_STOPPED` state unless otherwise specified.  A job in the
      `JOB_STATE_RUNNING` state may asynchronously enter a terminal state.
      After a job has reached a terminal state, no further state updates may
      be made.  This field may be mutated by the Cloud Dataflow service;
      callers cannot mutate it.
    currentStateTime: The timestamp associated with the current state.
    environment: The environment for the job.
    executionInfo: Deprecated.
    id: The unique ID of this job.  This field is set by the Cloud Dataflow
      service when the Job is created, and is immutable for the life of the
      job.
    jobMetadata: This field is populated by the Dataflow service to support
      filtering jobs by the metadata values provided here. Populated for
      ListJobs and all GetJob views SUMMARY and higher.
    labels: User-defined labels for this job.  The labels map can contain no
      more than 64 entries.  Entries of the labels map are UTF8 strings that
      comply with the following restrictions:  * Keys must conform to regexp:
      \p{Ll}\p{Lo}{0,62} * Values must conform to regexp:
      [\p{Ll}\p{Lo}\p{N}_-]{0,63} * Both keys and values are additionally
      constrained to be <= 128 bytes in size.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains this job.
    name: The user-specified Cloud Dataflow job name.  Only one Job with a
      given name may exist in a project at any given time. If a caller
      attempts to create a Job with the same name as an already-existing Job,
      the attempt returns the existing Job.  The name must match the regular
      expression `[a-z]([-a-z0-9]{0,38}[a-z0-9])?`
    pipelineDescription: Preliminary field: The format of this data may change
      at any time. A description of the user pipeline and stages through which
      it is executed. Created by Cloud Dataflow service.  Only retrieved with
      JOB_VIEW_DESCRIPTION or JOB_VIEW_ALL.
    projectId: The ID of the Cloud Platform project that the job belongs to.
    replaceJobId: If this job is an update of an existing job, this field is
      the job ID of the job it replaced.  When sending a `CreateJobRequest`,
      you can update a job by specifying it here. The job named here is
      stopped, and its intermediate state is transferred to this job.
    replacedByJobId: If another job is an update of this job (and thus, this
      job is in `JOB_STATE_UPDATED`), this field contains the ID of that job.
    requestedState: The job's requested state.  `UpdateJob` may be used to
      switch between the `JOB_STATE_STOPPED` and `JOB_STATE_RUNNING` states,
      by setting requested_state.  `UpdateJob` may also be used to directly
      set a job's requested state to `JOB_STATE_CANCELLED` or
      `JOB_STATE_DONE`, irrevocably terminating the job if it has not already
      reached a terminal state.
    stageStates: This field may be mutated by the Cloud Dataflow service;
      callers cannot mutate it.
    startTime: The timestamp when the job was started (transitioned to
      JOB_STATE_PENDING). Flexible resource scheduling jobs are started with
      some delay after job creation, so start_time is unset before start and
      is updated when the job is started by the Cloud Dataflow service. For
      other jobs, start_time always equals to create_time and is immutable and
      set by the Cloud Dataflow service.
    steps: Exactly one of step or steps_location should be specified.  The
      top-level steps that constitute the entire job.
    stepsLocation: The GCS location where the steps are stored.
    tempFiles: A set of files the system should be aware of that are used for
      temporary storage. These temporary files will be removed on job
      completion. No duplicates are allowed. No file patterns are supported.
      The supported files are:  Google Cloud Storage:
      storage.googleapis.com/{bucket}/{object}
      bucket.storage.googleapis.com/{object}
    transformNameMapping: The map of transform name prefixes of the job to be
      replaced to the corresponding name prefixes of the new job.
    type: The type of Cloud Dataflow job.
  """

  class CurrentStateValueValuesEnum(_messages.Enum):
    r"""The current state of the job.  Jobs are created in the
    `JOB_STATE_STOPPED` state unless otherwise specified.  A job in the
    `JOB_STATE_RUNNING` state may asynchronously enter a terminal state. After
    a job has reached a terminal state, no further state updates may be made.
    This field may be mutated by the Cloud Dataflow service; callers cannot
    mutate it.

    Values:
      JOB_STATE_UNKNOWN: The job's run state isn't specified.
      JOB_STATE_STOPPED: `JOB_STATE_STOPPED` indicates that the job has not
        yet started to run.
      JOB_STATE_RUNNING: `JOB_STATE_RUNNING` indicates that the job is
        currently running.
      JOB_STATE_DONE: `JOB_STATE_DONE` indicates that the job has successfully
        completed. This is a terminal job state.  This state may be set by the
        Cloud Dataflow service, as a transition from `JOB_STATE_RUNNING`. It
        may also be set via a Cloud Dataflow `UpdateJob` call, if the job has
        not yet reached a terminal state.
      JOB_STATE_FAILED: `JOB_STATE_FAILED` indicates that the job has failed.
        This is a terminal job state.  This state may only be set by the Cloud
        Dataflow service, and only as a transition from `JOB_STATE_RUNNING`.
      JOB_STATE_CANCELLED: `JOB_STATE_CANCELLED` indicates that the job has
        been explicitly cancelled. This is a terminal job state. This state
        may only be set via a Cloud Dataflow `UpdateJob` call, and only if the
        job has not yet reached another terminal state.
      JOB_STATE_UPDATED: `JOB_STATE_UPDATED` indicates that the job was
        successfully updated, meaning that this job was stopped and another
        job was started, inheriting state from this one. This is a terminal
        job state. This state may only be set by the Cloud Dataflow service,
        and only as a transition from `JOB_STATE_RUNNING`.
      JOB_STATE_DRAINING: `JOB_STATE_DRAINING` indicates that the job is in
        the process of draining. A draining job has stopped pulling from its
        input sources and is processing any data that remains in-flight. This
        state may be set via a Cloud Dataflow `UpdateJob` call, but only as a
        transition from `JOB_STATE_RUNNING`. Jobs that are draining may only
        transition to `JOB_STATE_DRAINED`, `JOB_STATE_CANCELLED`, or
        `JOB_STATE_FAILED`.
      JOB_STATE_DRAINED: `JOB_STATE_DRAINED` indicates that the job has been
        drained. A drained job terminated by stopping pulling from its input
        sources and processing any data that remained in-flight when draining
        was requested. This state is a terminal state, may only be set by the
        Cloud Dataflow service, and only as a transition from
        `JOB_STATE_DRAINING`.
      JOB_STATE_PENDING: `JOB_STATE_PENDING` indicates that the job has been
        created but is not yet running.  Jobs that are pending may only
        transition to `JOB_STATE_RUNNING`, or `JOB_STATE_FAILED`.
      JOB_STATE_CANCELLING: `JOB_STATE_CANCELLING` indicates that the job has
        been explicitly cancelled and is in the process of stopping.  Jobs
        that are cancelling may only transition to `JOB_STATE_CANCELLED` or
        `JOB_STATE_FAILED`.
      JOB_STATE_QUEUED: `JOB_STATE_QUEUED` indicates that the job has been
        created but is being delayed until launch. Jobs that are queued may
        only transition to `JOB_STATE_PENDING` or `JOB_STATE_CANCELLED`.
    """
    JOB_STATE_UNKNOWN = 0
    JOB_STATE_STOPPED = 1
    JOB_STATE_RUNNING = 2
    JOB_STATE_DONE = 3
    JOB_STATE_FAILED = 4
    JOB_STATE_CANCELLED = 5
    JOB_STATE_UPDATED = 6
    JOB_STATE_DRAINING = 7
    JOB_STATE_DRAINED = 8
    JOB_STATE_PENDING = 9
    JOB_STATE_CANCELLING = 10
    JOB_STATE_QUEUED = 11

  class RequestedStateValueValuesEnum(_messages.Enum):
    r"""The job's requested state.  `UpdateJob` may be used to switch between
    the `JOB_STATE_STOPPED` and `JOB_STATE_RUNNING` states, by setting
    requested_state.  `UpdateJob` may also be used to directly set a job's
    requested state to `JOB_STATE_CANCELLED` or `JOB_STATE_DONE`, irrevocably
    terminating the job if it has not already reached a terminal state.

    Values:
      JOB_STATE_UNKNOWN: The job's run state isn't specified.
      JOB_STATE_STOPPED: `JOB_STATE_STOPPED` indicates that the job has not
        yet started to run.
      JOB_STATE_RUNNING: `JOB_STATE_RUNNING` indicates that the job is
        currently running.
      JOB_STATE_DONE: `JOB_STATE_DONE` indicates that the job has successfully
        completed. This is a terminal job state.  This state may be set by the
        Cloud Dataflow service, as a transition from `JOB_STATE_RUNNING`. It
        may also be set via a Cloud Dataflow `UpdateJob` call, if the job has
        not yet reached a terminal state.
      JOB_STATE_FAILED: `JOB_STATE_FAILED` indicates that the job has failed.
        This is a terminal job state.  This state may only be set by the Cloud
        Dataflow service, and only as a transition from `JOB_STATE_RUNNING`.
      JOB_STATE_CANCELLED: `JOB_STATE_CANCELLED` indicates that the job has
        been explicitly cancelled. This is a terminal job state. This state
        may only be set via a Cloud Dataflow `UpdateJob` call, and only if the
        job has not yet reached another terminal state.
      JOB_STATE_UPDATED: `JOB_STATE_UPDATED` indicates that the job was
        successfully updated, meaning that this job was stopped and another
        job was started, inheriting state from this one. This is a terminal
        job state. This state may only be set by the Cloud Dataflow service,
        and only as a transition from `JOB_STATE_RUNNING`.
      JOB_STATE_DRAINING: `JOB_STATE_DRAINING` indicates that the job is in
        the process of draining. A draining job has stopped pulling from its
        input sources and is processing any data that remains in-flight. This
        state may be set via a Cloud Dataflow `UpdateJob` call, but only as a
        transition from `JOB_STATE_RUNNING`. Jobs that are draining may only
        transition to `JOB_STATE_DRAINED`, `JOB_STATE_CANCELLED`, or
        `JOB_STATE_FAILED`.
      JOB_STATE_DRAINED: `JOB_STATE_DRAINED` indicates that the job has been
        drained. A drained job terminated by stopping pulling from its input
        sources and processing any data that remained in-flight when draining
        was requested. This state is a terminal state, may only be set by the
        Cloud Dataflow service, and only as a transition from
        `JOB_STATE_DRAINING`.
      JOB_STATE_PENDING: `JOB_STATE_PENDING` indicates that the job has been
        created but is not yet running.  Jobs that are pending may only
        transition to `JOB_STATE_RUNNING`, or `JOB_STATE_FAILED`.
      JOB_STATE_CANCELLING: `JOB_STATE_CANCELLING` indicates that the job has
        been explicitly cancelled and is in the process of stopping.  Jobs
        that are cancelling may only transition to `JOB_STATE_CANCELLED` or
        `JOB_STATE_FAILED`.
      JOB_STATE_QUEUED: `JOB_STATE_QUEUED` indicates that the job has been
        created but is being delayed until launch. Jobs that are queued may
        only transition to `JOB_STATE_PENDING` or `JOB_STATE_CANCELLED`.
    """
    JOB_STATE_UNKNOWN = 0
    JOB_STATE_STOPPED = 1
    JOB_STATE_RUNNING = 2
    JOB_STATE_DONE = 3
    JOB_STATE_FAILED = 4
    JOB_STATE_CANCELLED = 5
    JOB_STATE_UPDATED = 6
    JOB_STATE_DRAINING = 7
    JOB_STATE_DRAINED = 8
    JOB_STATE_PENDING = 9
    JOB_STATE_CANCELLING = 10
    JOB_STATE_QUEUED = 11

  class TypeValueValuesEnum(_messages.Enum):
    r"""The type of Cloud Dataflow job.

    Values:
      JOB_TYPE_UNKNOWN: The type of the job is unspecified, or unknown.
      JOB_TYPE_BATCH: A batch job with a well-defined end point: data is read,
        data is processed, data is written, and the job is done.
      JOB_TYPE_STREAMING: A continuously streaming job with no end: data is
        read, processed, and written continuously.
    """
    JOB_TYPE_UNKNOWN = 0
    JOB_TYPE_BATCH = 1
    JOB_TYPE_STREAMING = 2

  @encoding.MapUnrecognizedFields('additionalProperties')
  class LabelsValue(_messages.Message):
    r"""User-defined labels for this job.  The labels map can contain no more
    than 64 entries.  Entries of the labels map are UTF8 strings that comply
    with the following restrictions:  * Keys must conform to regexp:
    \p{Ll}\p{Lo}{0,62} * Values must conform to regexp:
    [\p{Ll}\p{Lo}\p{N}_-]{0,63} * Both keys and values are additionally
    constrained to be <= 128 bytes in size.

    Messages:
      AdditionalProperty: An additional property for a LabelsValue object.

    Fields:
      additionalProperties: Additional properties of type LabelsValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a LabelsValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class TransformNameMappingValue(_messages.Message):
    r"""The map of transform name prefixes of the job to be replaced to the
    corresponding name prefixes of the new job.

    Messages:
      AdditionalProperty: An additional property for a
        TransformNameMappingValue object.

    Fields:
      additionalProperties: Additional properties of type
        TransformNameMappingValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a TransformNameMappingValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  clientRequestId = _messages.StringField(1)
  createTime = _messages.StringField(2)
  createdFromSnapshotId = _messages.StringField(3)
  currentState = _messages.EnumField('CurrentStateValueValuesEnum', 4)
  currentStateTime = _messages.StringField(5)
  environment = _messages.MessageField('Environment', 6)
  executionInfo = _messages.MessageField('JobExecutionInfo', 7)
  id = _messages.StringField(8)
  jobMetadata = _messages.MessageField('JobMetadata', 9)
  labels = _messages.MessageField('LabelsValue', 10)
  location = _messages.StringField(11)
  name = _messages.StringField(12)
  pipelineDescription = _messages.MessageField('PipelineDescription', 13)
  projectId = _messages.StringField(14)
  replaceJobId = _messages.StringField(15)
  replacedByJobId = _messages.StringField(16)
  requestedState = _messages.EnumField('RequestedStateValueValuesEnum', 17)
  stageStates = _messages.MessageField('ExecutionStageState', 18, repeated=True)
  startTime = _messages.StringField(19)
  steps = _messages.MessageField('Step', 20, repeated=True)
  stepsLocation = _messages.StringField(21)
  tempFiles = _messages.StringField(22, repeated=True)
  transformNameMapping = _messages.MessageField('TransformNameMappingValue', 23)
  type = _messages.EnumField('TypeValueValuesEnum', 24)


class JobExecutionInfo(_messages.Message):
  r"""Additional information about how a Cloud Dataflow job will be executed
  that isn't contained in the submitted job.

  Messages:
    StagesValue: A mapping from each stage to the information about that
      stage.

  Fields:
    stages: A mapping from each stage to the information about that stage.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class StagesValue(_messages.Message):
    r"""A mapping from each stage to the information about that stage.

    Messages:
      AdditionalProperty: An additional property for a StagesValue object.

    Fields:
      additionalProperties: Additional properties of type StagesValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a StagesValue object.

      Fields:
        key: Name of the additional property.
        value: A JobExecutionStageInfo attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('JobExecutionStageInfo', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  stages = _messages.MessageField('StagesValue', 1)


class JobExecutionStageInfo(_messages.Message):
  r"""Contains information about how a particular google.dataflow.v1beta3.Step
  will be executed.

  Fields:
    stepName: The steps associated with the execution stage. Note that stages
      may have several steps, and that a given step might be run by more than
      one stage.
  """

  stepName = _messages.StringField(1, repeated=True)


class JobMessage(_messages.Message):
  r"""A particular message pertaining to a Dataflow job.

  Enums:
    MessageImportanceValueValuesEnum: Importance level of the message.

  Fields:
    id: Deprecated.
    messageImportance: Importance level of the message.
    messageText: The text of the message.
    time: The timestamp of the message.
  """

  class MessageImportanceValueValuesEnum(_messages.Enum):
    r"""Importance level of the message.

    Values:
      JOB_MESSAGE_IMPORTANCE_UNKNOWN: The message importance isn't specified,
        or is unknown.
      JOB_MESSAGE_DEBUG: The message is at the 'debug' level: typically only
        useful for software engineers working on the code the job is running.
        Typically, Dataflow pipeline runners do not display log messages at
        this level by default.
      JOB_MESSAGE_DETAILED: The message is at the 'detailed' level: somewhat
        verbose, but potentially useful to users.  Typically, Dataflow
        pipeline runners do not display log messages at this level by default.
        These messages are displayed by default in the Dataflow monitoring UI.
      JOB_MESSAGE_BASIC: The message is at the 'basic' level: useful for
        keeping track of the execution of a Dataflow pipeline.  Typically,
        Dataflow pipeline runners display log messages at this level by
        default, and these messages are displayed by default in the Dataflow
        monitoring UI.
      JOB_MESSAGE_WARNING: The message is at the 'warning' level: indicating a
        condition pertaining to a job which may require human intervention.
        Typically, Dataflow pipeline runners display log messages at this
        level by default, and these messages are displayed by default in the
        Dataflow monitoring UI.
      JOB_MESSAGE_ERROR: The message is at the 'error' level: indicating a
        condition preventing a job from succeeding.  Typically, Dataflow
        pipeline runners display log messages at this level by default, and
        these messages are displayed by default in the Dataflow monitoring UI.
    """
    JOB_MESSAGE_IMPORTANCE_UNKNOWN = 0
    JOB_MESSAGE_DEBUG = 1
    JOB_MESSAGE_DETAILED = 2
    JOB_MESSAGE_BASIC = 3
    JOB_MESSAGE_WARNING = 4
    JOB_MESSAGE_ERROR = 5

  id = _messages.StringField(1)
  messageImportance = _messages.EnumField('MessageImportanceValueValuesEnum', 2)
  messageText = _messages.StringField(3)
  time = _messages.StringField(4)


class JobMetadata(_messages.Message):
  r"""Metadata available primarily for filtering jobs. Will be included in the
  ListJob response and Job SUMMARY view.

  Fields:
    bigTableDetails: Identification of a BigTable source used in the Dataflow
      job.
    bigqueryDetails: Identification of a BigQuery source used in the Dataflow
      job.
    datastoreDetails: Identification of a Datastore source used in the
      Dataflow job.
    fileDetails: Identification of a File source used in the Dataflow job.
    pubsubDetails: Identification of a PubSub source used in the Dataflow job.
    sdkVersion: The SDK version used to run the job.
    spannerDetails: Identification of a Spanner source used in the Dataflow
      job.
  """

  bigTableDetails = _messages.MessageField('BigTableIODetails', 1, repeated=True)
  bigqueryDetails = _messages.MessageField('BigQueryIODetails', 2, repeated=True)
  datastoreDetails = _messages.MessageField('DatastoreIODetails', 3, repeated=True)
  fileDetails = _messages.MessageField('FileIODetails', 4, repeated=True)
  pubsubDetails = _messages.MessageField('PubSubIODetails', 5, repeated=True)
  sdkVersion = _messages.MessageField('SdkVersion', 6)
  spannerDetails = _messages.MessageField('SpannerIODetails', 7, repeated=True)


class JobMetrics(_messages.Message):
  r"""JobMetrics contains a collection of metrics describing the detailed
  progress of a Dataflow job. Metrics correspond to user-defined and system-
  defined metrics in the job.  This resource captures only the most recent
  values of each metric; time-series data can be queried for them (under the
  same metric names) from Cloud Monitoring.

  Fields:
    metricTime: Timestamp as of which metric values are current.
    metrics: All metrics for this job.
  """

  metricTime = _messages.StringField(1)
  metrics = _messages.MessageField('MetricUpdate', 2, repeated=True)


class KeyRangeDataDiskAssignment(_messages.Message):
  r"""Data disk assignment information for a specific key-range of a sharded
  computation. Currently we only support UTF-8 character splits to simplify
  encoding into JSON.

  Fields:
    dataDisk: The name of the data disk where data for this range is stored.
      This name is local to the Google Cloud Platform project and uniquely
      identifies the disk within that project, for example
      "myproject-1014-104817-4c2-harness-0-disk-1".
    end: The end (exclusive) of the key range.
    start: The start (inclusive) of the key range.
  """

  dataDisk = _messages.StringField(1)
  end = _messages.StringField(2)
  start = _messages.StringField(3)


class KeyRangeLocation(_messages.Message):
  r"""Location information for a specific key-range of a sharded computation.
  Currently we only support UTF-8 character splits to simplify encoding into
  JSON.

  Fields:
    dataDisk: The name of the data disk where data for this range is stored.
      This name is local to the Google Cloud Platform project and uniquely
      identifies the disk within that project, for example
      "myproject-1014-104817-4c2-harness-0-disk-1".
    deliveryEndpoint: The physical location of this range assignment to be
      used for streaming computation cross-worker message delivery.
    deprecatedPersistentDirectory: DEPRECATED. The location of the persistent
      state for this range, as a persistent directory in the worker local
      filesystem.
    end: The end (exclusive) of the key range.
    start: The start (inclusive) of the key range.
  """

  dataDisk = _messages.StringField(1)
  deliveryEndpoint = _messages.StringField(2)
  deprecatedPersistentDirectory = _messages.StringField(3)
  end = _messages.StringField(4)
  start = _messages.StringField(5)


class LaunchTemplateParameters(_messages.Message):
  r"""Parameters to provide to the template being launched.

  Messages:
    ParametersValue: The runtime parameters to pass to the job.
    TransformNameMappingValue: Only applicable when updating a pipeline. Map
      of transform name prefixes of the job to be replaced to the
      corresponding name prefixes of the new job.

  Fields:
    environment: The runtime environment for the job.
    jobName: Required. The job name to use for the created job.
    parameters: The runtime parameters to pass to the job.
    transformNameMapping: Only applicable when updating a pipeline. Map of
      transform name prefixes of the job to be replaced to the corresponding
      name prefixes of the new job.
    update: If set, replace the existing pipeline with the name specified by
      jobName with this pipeline, preserving state.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class ParametersValue(_messages.Message):
    r"""The runtime parameters to pass to the job.

    Messages:
      AdditionalProperty: An additional property for a ParametersValue object.

    Fields:
      additionalProperties: Additional properties of type ParametersValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a ParametersValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class TransformNameMappingValue(_messages.Message):
    r"""Only applicable when updating a pipeline. Map of transform name
    prefixes of the job to be replaced to the corresponding name prefixes of
    the new job.

    Messages:
      AdditionalProperty: An additional property for a
        TransformNameMappingValue object.

    Fields:
      additionalProperties: Additional properties of type
        TransformNameMappingValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a TransformNameMappingValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  environment = _messages.MessageField('RuntimeEnvironment', 1)
  jobName = _messages.StringField(2)
  parameters = _messages.MessageField('ParametersValue', 3)
  transformNameMapping = _messages.MessageField('TransformNameMappingValue', 4)
  update = _messages.BooleanField(5)


class LaunchTemplateResponse(_messages.Message):
  r"""Response to the request to launch a template.

  Fields:
    job: The job that was launched, if the request was not a dry run and the
      job was successfully launched.
  """

  job = _messages.MessageField('Job', 1)


class LeaseWorkItemRequest(_messages.Message):
  r"""Request to lease WorkItems.

  Messages:
    UnifiedWorkerRequestValue: Untranslated bag-of-bytes WorkRequest from
      UnifiedWorker.

  Fields:
    currentWorkerTime: The current timestamp at the worker.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the WorkItem's job.
    requestedLeaseDuration: The initial lease period.
    unifiedWorkerRequest: Untranslated bag-of-bytes WorkRequest from
      UnifiedWorker.
    workItemTypes: Filter for WorkItem type.
    workerCapabilities: Worker capabilities. WorkItems might be limited to
      workers with specific capabilities.
    workerId: Identifies the worker leasing work -- typically the ID of the
      virtual machine running the worker.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UnifiedWorkerRequestValue(_messages.Message):
    r"""Untranslated bag-of-bytes WorkRequest from UnifiedWorker.

    Messages:
      AdditionalProperty: An additional property for a
        UnifiedWorkerRequestValue object.

    Fields:
      additionalProperties: Properties of the object. Contains field @type
        with type URL.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UnifiedWorkerRequestValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  currentWorkerTime = _messages.StringField(1)
  location = _messages.StringField(2)
  requestedLeaseDuration = _messages.StringField(3)
  unifiedWorkerRequest = _messages.MessageField('UnifiedWorkerRequestValue', 4)
  workItemTypes = _messages.StringField(5, repeated=True)
  workerCapabilities = _messages.StringField(6, repeated=True)
  workerId = _messages.StringField(7)


class LeaseWorkItemResponse(_messages.Message):
  r"""Response to a request to lease WorkItems.

  Messages:
    UnifiedWorkerResponseValue: Untranslated bag-of-bytes WorkResponse for
      UnifiedWorker.

  Fields:
    unifiedWorkerResponse: Untranslated bag-of-bytes WorkResponse for
      UnifiedWorker.
    workItems: A list of the leased WorkItems.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UnifiedWorkerResponseValue(_messages.Message):
    r"""Untranslated bag-of-bytes WorkResponse for UnifiedWorker.

    Messages:
      AdditionalProperty: An additional property for a
        UnifiedWorkerResponseValue object.

    Fields:
      additionalProperties: Properties of the object. Contains field @type
        with type URL.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UnifiedWorkerResponseValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  unifiedWorkerResponse = _messages.MessageField('UnifiedWorkerResponseValue', 1)
  workItems = _messages.MessageField('WorkItem', 2, repeated=True)


class ListJobMessagesResponse(_messages.Message):
  r"""Response to a request to list job messages.

  Fields:
    autoscalingEvents: Autoscaling events in ascending timestamp order.
    jobMessages: Messages in ascending timestamp order.
    nextPageToken: The token to obtain the next page of results if there are
      more.
  """

  autoscalingEvents = _messages.MessageField('AutoscalingEvent', 1, repeated=True)
  jobMessages = _messages.MessageField('JobMessage', 2, repeated=True)
  nextPageToken = _messages.StringField(3)


class ListJobsResponse(_messages.Message):
  r"""Response to a request to list Cloud Dataflow jobs.  This may be a
  partial response, depending on the page size in the ListJobsRequest.

  Fields:
    failedLocation: Zero or more messages describing the [regional endpoints]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that failed to respond.
    jobs: A subset of the requested job information.
    nextPageToken: Set if there may be more results than fit in this response.
  """

  failedLocation = _messages.MessageField('FailedLocation', 1, repeated=True)
  jobs = _messages.MessageField('Job', 2, repeated=True)
  nextPageToken = _messages.StringField(3)


class MapTask(_messages.Message):
  r"""MapTask consists of an ordered set of instructions, each of which
  describes one particular low-level operation for the worker to perform in
  order to accomplish the MapTask's WorkItem.  Each instruction must appear in
  the list before any instructions which depends on its output.

  Fields:
    counterPrefix: Counter prefix that can be used to prefix counters. Not
      currently used in Dataflow.
    instructions: The instructions in the MapTask.
    stageName: System-defined name of the stage containing this MapTask.
      Unique across the workflow.
    systemName: System-defined name of this MapTask. Unique across the
      workflow.
  """

  counterPrefix = _messages.StringField(1)
  instructions = _messages.MessageField('ParallelInstruction', 2, repeated=True)
  stageName = _messages.StringField(3)
  systemName = _messages.StringField(4)


class MetricShortId(_messages.Message):
  r"""The metric short id is returned to the user alongside an offset into
  ReportWorkItemStatusRequest

  Fields:
    metricIndex: The index of the corresponding metric in the
      ReportWorkItemStatusRequest. Required.
    shortId: The service-generated short identifier for the metric.
  """

  metricIndex = _messages.IntegerField(1, variant=_messages.Variant.INT32)
  shortId = _messages.IntegerField(2)


class MetricStructuredName(_messages.Message):
  r"""Identifies a metric, by describing the source which generated the
  metric.

  Messages:
    ContextValue: Zero or more labeled fields which identify the part of the
      job this metric is associated with, such as the name of a step or
      collection.  For example, built-in counters associated with steps will
      have context['step'] = <step-name>. Counters associated with
      PCollections in the SDK will have context['pcollection'] = <pcollection-
      name>.

  Fields:
    context: Zero or more labeled fields which identify the part of the job
      this metric is associated with, such as the name of a step or
      collection.  For example, built-in counters associated with steps will
      have context['step'] = <step-name>. Counters associated with
      PCollections in the SDK will have context['pcollection'] = <pcollection-
      name>.
    name: Worker-defined metric name.
    origin: Origin (namespace) of metric name. May be blank for user-define
      metrics; will be "dataflow" for metrics defined by the Dataflow service
      or SDK.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class ContextValue(_messages.Message):
    r"""Zero or more labeled fields which identify the part of the job this
    metric is associated with, such as the name of a step or collection.  For
    example, built-in counters associated with steps will have context['step']
    = <step-name>. Counters associated with PCollections in the SDK will have
    context['pcollection'] = <pcollection-name>.

    Messages:
      AdditionalProperty: An additional property for a ContextValue object.

    Fields:
      additionalProperties: Additional properties of type ContextValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a ContextValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  context = _messages.MessageField('ContextValue', 1)
  name = _messages.StringField(2)
  origin = _messages.StringField(3)


class MetricUpdate(_messages.Message):
  r"""Describes the state of a metric.

  Fields:
    cumulative: True if this metric is reported as the total cumulative
      aggregate value accumulated since the worker started working on this
      WorkItem. By default this is false, indicating that this metric is
      reported as a delta that is not associated with any WorkItem.
    distribution: A struct value describing properties of a distribution of
      numeric values.
    gauge: A struct value describing properties of a Gauge. Metrics of gauge
      type show the value of a metric across time, and is aggregated based on
      the newest value.
    internal: Worker-computed aggregate value for internal use by the Dataflow
      service.
    kind: Metric aggregation kind.  The possible metric aggregation kinds are
      "Sum", "Max", "Min", "Mean", "Set", "And", "Or", and "Distribution". The
      specified aggregation kind is case-insensitive.  If omitted, this is not
      an aggregated value but instead a single metric sample value.
    meanCount: Worker-computed aggregate value for the "Mean" aggregation
      kind. This holds the count of the aggregated values and is used in
      combination with mean_sum above to obtain the actual mean aggregate
      value. The only possible value type is Long.
    meanSum: Worker-computed aggregate value for the "Mean" aggregation kind.
      This holds the sum of the aggregated values and is used in combination
      with mean_count below to obtain the actual mean aggregate value. The
      only possible value types are Long and Double.
    name: Name of the metric.
    scalar: Worker-computed aggregate value for aggregation kinds "Sum",
      "Max", "Min", "And", and "Or".  The possible value types are Long,
      Double, and Boolean.
    set: Worker-computed aggregate value for the "Set" aggregation kind.  The
      only possible value type is a list of Values whose type can be Long,
      Double, or String, according to the metric's type.  All Values in the
      list must be of the same type.
    updateTime: Timestamp associated with the metric value. Optional when
      workers are reporting work progress; it will be filled in responses from
      the metrics API.
  """

  cumulative = _messages.BooleanField(1)
  distribution = _messages.MessageField('extra_types.JsonValue', 2)
  gauge = _messages.MessageField('extra_types.JsonValue', 3)
  internal = _messages.MessageField('extra_types.JsonValue', 4)
  kind = _messages.StringField(5)
  meanCount = _messages.MessageField('extra_types.JsonValue', 6)
  meanSum = _messages.MessageField('extra_types.JsonValue', 7)
  name = _messages.MessageField('MetricStructuredName', 8)
  scalar = _messages.MessageField('extra_types.JsonValue', 9)
  set = _messages.MessageField('extra_types.JsonValue', 10)
  updateTime = _messages.StringField(11)


class MountedDataDisk(_messages.Message):
  r"""Describes mounted data disk.

  Fields:
    dataDisk: The name of the data disk. This name is local to the Google
      Cloud Platform project and uniquely identifies the disk within that
      project, for example "myproject-1014-104817-4c2-harness-0-disk-1".
  """

  dataDisk = _messages.StringField(1)


class MultiOutputInfo(_messages.Message):
  r"""Information about an output of a multi-output DoFn.

  Fields:
    tag: The id of the tag the user code will emit to this output by; this
      should correspond to the tag of some SideInputInfo.
  """

  tag = _messages.StringField(1)


class NameAndKind(_messages.Message):
  r"""Basic metadata about a counter.

  Enums:
    KindValueValuesEnum: Counter aggregation kind.

  Fields:
    kind: Counter aggregation kind.
    name: Name of the counter.
  """

  class KindValueValuesEnum(_messages.Enum):
    r"""Counter aggregation kind.

    Values:
      INVALID: Counter aggregation kind was not set.
      SUM: Aggregated value is the sum of all contributed values.
      MAX: Aggregated value is the max of all contributed values.
      MIN: Aggregated value is the min of all contributed values.
      MEAN: Aggregated value is the mean of all contributed values.
      OR: Aggregated value represents the logical 'or' of all contributed
        values.
      AND: Aggregated value represents the logical 'and' of all contributed
        values.
      SET: Aggregated value is a set of unique contributed values.
      DISTRIBUTION: Aggregated value captures statistics about a distribution.
      LATEST_VALUE: Aggregated value tracks the latest value of a variable.
    """
    INVALID = 0
    SUM = 1
    MAX = 2
    MIN = 3
    MEAN = 4
    OR = 5
    AND = 6
    SET = 7
    DISTRIBUTION = 8
    LATEST_VALUE = 9

  kind = _messages.EnumField('KindValueValuesEnum', 1)
  name = _messages.StringField(2)


class Package(_messages.Message):
  r"""The packages that must be installed in order for a worker to run the
  steps of the Cloud Dataflow job that will be assigned to its worker pool.
  This is the mechanism by which the Cloud Dataflow SDK causes code to be
  loaded onto the workers. For example, the Cloud Dataflow Java SDK might use
  this to install jars containing the user's code and all of the various
  dependencies (libraries, data files, etc.) required in order for that code
  to run.

  Fields:
    location: The resource to read the package from. The supported resource
      type is:  Google Cloud Storage:    storage.googleapis.com/{bucket}
      bucket.storage.googleapis.com/
    name: The name of the package.
  """

  location = _messages.StringField(1)
  name = _messages.StringField(2)


class ParDoInstruction(_messages.Message):
  r"""An instruction that does a ParDo operation. Takes one main input and
  zero or more side inputs, and produces zero or more outputs. Runs user code.

  Messages:
    UserFnValue: The user function to invoke.

  Fields:
    input: The input.
    multiOutputInfos: Information about each of the outputs, if user_fn is a
      MultiDoFn.
    numOutputs: The number of outputs.
    sideInputs: Zero or more side inputs.
    userFn: The user function to invoke.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UserFnValue(_messages.Message):
    r"""The user function to invoke.

    Messages:
      AdditionalProperty: An additional property for a UserFnValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UserFnValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  input = _messages.MessageField('InstructionInput', 1)
  multiOutputInfos = _messages.MessageField('MultiOutputInfo', 2, repeated=True)
  numOutputs = _messages.IntegerField(3, variant=_messages.Variant.INT32)
  sideInputs = _messages.MessageField('SideInputInfo', 4, repeated=True)
  userFn = _messages.MessageField('UserFnValue', 5)


class ParallelInstruction(_messages.Message):
  r"""Describes a particular operation comprising a MapTask.

  Fields:
    flatten: Additional information for Flatten instructions.
    name: User-provided name of this operation.
    originalName: System-defined name for the operation in the original
      workflow graph.
    outputs: Describes the outputs of the instruction.
    parDo: Additional information for ParDo instructions.
    partialGroupByKey: Additional information for PartialGroupByKey
      instructions.
    read: Additional information for Read instructions.
    systemName: System-defined name of this operation. Unique across the
      workflow.
    write: Additional information for Write instructions.
  """

  flatten = _messages.MessageField('FlattenInstruction', 1)
  name = _messages.StringField(2)
  originalName = _messages.StringField(3)
  outputs = _messages.MessageField('InstructionOutput', 4, repeated=True)
  parDo = _messages.MessageField('ParDoInstruction', 5)
  partialGroupByKey = _messages.MessageField('PartialGroupByKeyInstruction', 6)
  read = _messages.MessageField('ReadInstruction', 7)
  systemName = _messages.StringField(8)
  write = _messages.MessageField('WriteInstruction', 9)


class Parameter(_messages.Message):
  r"""Structured data associated with this message.

  Fields:
    key: Key or name for this parameter.
    value: Value for this parameter.
  """

  key = _messages.StringField(1)
  value = _messages.MessageField('extra_types.JsonValue', 2)


class ParameterMetadata(_messages.Message):
  r"""Metadata for a specific parameter.

  Fields:
    helpText: Required. The help text to display for the parameter.
    isOptional: Optional. Whether the parameter is optional. Defaults to
      false.
    label: Required. The label to display for the parameter.
    name: Required. The name of the parameter.
    regexes: Optional. Regexes that the parameter must match.
  """

  helpText = _messages.StringField(1)
  isOptional = _messages.BooleanField(2)
  label = _messages.StringField(3)
  name = _messages.StringField(4)
  regexes = _messages.StringField(5, repeated=True)


class PartialGroupByKeyInstruction(_messages.Message):
  r"""An instruction that does a partial group-by-key. One input and one
  output.

  Messages:
    InputElementCodecValue: The codec to use for interpreting an element in
      the input PTable.
    ValueCombiningFnValue: The value combining function to invoke.

  Fields:
    input: Describes the input to the partial group-by-key instruction.
    inputElementCodec: The codec to use for interpreting an element in the
      input PTable.
    originalCombineValuesInputStoreName: If this instruction includes a
      combining function this is the name of the intermediate store between
      the GBK and the CombineValues.
    originalCombineValuesStepName: If this instruction includes a combining
      function, this is the name of the CombineValues instruction lifted into
      this instruction.
    sideInputs: Zero or more side inputs.
    valueCombiningFn: The value combining function to invoke.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class InputElementCodecValue(_messages.Message):
    r"""The codec to use for interpreting an element in the input PTable.

    Messages:
      AdditionalProperty: An additional property for a InputElementCodecValue
        object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a InputElementCodecValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class ValueCombiningFnValue(_messages.Message):
    r"""The value combining function to invoke.

    Messages:
      AdditionalProperty: An additional property for a ValueCombiningFnValue
        object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a ValueCombiningFnValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  input = _messages.MessageField('InstructionInput', 1)
  inputElementCodec = _messages.MessageField('InputElementCodecValue', 2)
  originalCombineValuesInputStoreName = _messages.StringField(3)
  originalCombineValuesStepName = _messages.StringField(4)
  sideInputs = _messages.MessageField('SideInputInfo', 5, repeated=True)
  valueCombiningFn = _messages.MessageField('ValueCombiningFnValue', 6)


class PipelineDescription(_messages.Message):
  r"""A descriptive representation of submitted pipeline as well as the
  executed form.  This data is provided by the Dataflow service for ease of
  visualizing the pipeline and interpreting Dataflow provided metrics.

  Fields:
    displayData: Pipeline level display data.
    executionPipelineStage: Description of each stage of execution of the
      pipeline.
    originalPipelineTransform: Description of each transform in the pipeline
      and collections between them.
  """

  displayData = _messages.MessageField('DisplayData', 1, repeated=True)
  executionPipelineStage = _messages.MessageField('ExecutionStageSummary', 2, repeated=True)
  originalPipelineTransform = _messages.MessageField('TransformSummary', 3, repeated=True)


class Position(_messages.Message):
  r"""Position defines a position within a collection of data.  The value can
  be either the end position, a key (used with ordered collections), a byte
  offset, or a record index.

  Fields:
    byteOffset: Position is a byte offset.
    concatPosition: CloudPosition is a concat position.
    end: Position is past all other positions. Also useful for the end
      position of an unbounded range.
    key: Position is a string key, ordered lexicographically.
    recordIndex: Position is a record index.
    shufflePosition: CloudPosition is a base64 encoded BatchShufflePosition
      (with FIXED sharding).
  """

  byteOffset = _messages.IntegerField(1)
  concatPosition = _messages.MessageField('ConcatPosition', 2)
  end = _messages.BooleanField(3)
  key = _messages.StringField(4)
  recordIndex = _messages.IntegerField(5)
  shufflePosition = _messages.StringField(6)


class PubSubIODetails(_messages.Message):
  r"""Metadata for a PubSub connector used by the job.

  Fields:
    subscription: Subscription used in the connection.
    topic: Topic accessed in the connection.
  """

  subscription = _messages.StringField(1)
  topic = _messages.StringField(2)


class PubsubLocation(_messages.Message):
  r"""Identifies a pubsub location to use for transferring data into or out of
  a streaming Dataflow job.

  Fields:
    dropLateData: Indicates whether the pipeline allows late-arriving data.
    idLabel: If set, contains a pubsub label from which to extract record ids.
      If left empty, record deduplication will be strictly best effort.
    subscription: A pubsub subscription, in the form of
      "pubsub.googleapis.com/subscriptions/<project-id>/<subscription-name>"
    timestampLabel: If set, contains a pubsub label from which to extract
      record timestamps. If left empty, record timestamps will be generated
      upon arrival.
    topic: A pubsub topic, in the form of "pubsub.googleapis.com/topics
      /<project-id>/<topic-name>"
    trackingSubscription: If set, specifies the pubsub subscription that will
      be used for tracking custom time timestamps for watermark estimation.
    withAttributes: If true, then the client has requested to get pubsub
      attributes.
  """

  dropLateData = _messages.BooleanField(1)
  idLabel = _messages.StringField(2)
  subscription = _messages.StringField(3)
  timestampLabel = _messages.StringField(4)
  topic = _messages.StringField(5)
  trackingSubscription = _messages.StringField(6)
  withAttributes = _messages.BooleanField(7)


class ReadInstruction(_messages.Message):
  r"""An instruction that reads records. Takes no inputs, produces one output.

  Fields:
    source: The source to read from.
  """

  source = _messages.MessageField('Source', 1)


class ReportWorkItemStatusRequest(_messages.Message):
  r"""Request to report the status of WorkItems.

  Messages:
    UnifiedWorkerRequestValue: Untranslated bag-of-bytes
      WorkProgressUpdateRequest from UnifiedWorker.

  Fields:
    currentWorkerTime: The current timestamp at the worker.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the WorkItem's job.
    unifiedWorkerRequest: Untranslated bag-of-bytes WorkProgressUpdateRequest
      from UnifiedWorker.
    workItemStatuses: The order is unimportant, except that the order of the
      WorkItemServiceState messages in the ReportWorkItemStatusResponse
      corresponds to the order of WorkItemStatus messages here.
    workerId: The ID of the worker reporting the WorkItem status.  If this
      does not match the ID of the worker which the Dataflow service believes
      currently has the lease on the WorkItem, the report will be dropped
      (with an error response).
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UnifiedWorkerRequestValue(_messages.Message):
    r"""Untranslated bag-of-bytes WorkProgressUpdateRequest from
    UnifiedWorker.

    Messages:
      AdditionalProperty: An additional property for a
        UnifiedWorkerRequestValue object.

    Fields:
      additionalProperties: Properties of the object. Contains field @type
        with type URL.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UnifiedWorkerRequestValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  currentWorkerTime = _messages.StringField(1)
  location = _messages.StringField(2)
  unifiedWorkerRequest = _messages.MessageField('UnifiedWorkerRequestValue', 3)
  workItemStatuses = _messages.MessageField('WorkItemStatus', 4, repeated=True)
  workerId = _messages.StringField(5)


class ReportWorkItemStatusResponse(_messages.Message):
  r"""Response from a request to report the status of WorkItems.

  Messages:
    UnifiedWorkerResponseValue: Untranslated bag-of-bytes
      WorkProgressUpdateResponse for UnifiedWorker.

  Fields:
    unifiedWorkerResponse: Untranslated bag-of-bytes
      WorkProgressUpdateResponse for UnifiedWorker.
    workItemServiceStates: A set of messages indicating the service-side state
      for each WorkItem whose status was reported, in the same order as the
      WorkItemStatus messages in the ReportWorkItemStatusRequest which
      resulting in this response.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UnifiedWorkerResponseValue(_messages.Message):
    r"""Untranslated bag-of-bytes WorkProgressUpdateResponse for
    UnifiedWorker.

    Messages:
      AdditionalProperty: An additional property for a
        UnifiedWorkerResponseValue object.

    Fields:
      additionalProperties: Properties of the object. Contains field @type
        with type URL.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UnifiedWorkerResponseValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  unifiedWorkerResponse = _messages.MessageField('UnifiedWorkerResponseValue', 1)
  workItemServiceStates = _messages.MessageField('WorkItemServiceState', 2, repeated=True)


class ReportedParallelism(_messages.Message):
  r"""Represents the level of parallelism in a WorkItem's input, reported by
  the worker.

  Fields:
    isInfinite: Specifies whether the parallelism is infinite. If true,
      "value" is ignored. Infinite parallelism means the service will assume
      that the work item can always be split into more non-empty work items by
      dynamic splitting. This is a work-around for lack of support for
      infinity by the current JSON-based Java RPC stack.
    value: Specifies the level of parallelism in case it is finite.
  """

  isInfinite = _messages.BooleanField(1)
  value = _messages.FloatField(2)


class ResourceUtilizationReport(_messages.Message):
  r"""Worker metrics exported from workers. This contains resource utilization
  metrics accumulated from a variety of sources. For more information, see go
  /df-resource-signals.

  Fields:
    cpuTime: CPU utilization samples.
  """

  cpuTime = _messages.MessageField('CPUTime', 1, repeated=True)


class ResourceUtilizationReportResponse(_messages.Message):
  r"""Service-side response to WorkerMessage reporting resource utilization.
  """



class RuntimeEnvironment(_messages.Message):
  r"""The environment values to set at runtime.

  Enums:
    IpConfigurationValueValuesEnum: Configuration for VM IPs.

  Messages:
    AdditionalUserLabelsValue: Additional user labels to be specified for the
      job. Keys and values should follow the restrictions specified in the
      [labeling restrictions](https://cloud.google.com/compute/docs/labeling-
      resources#restrictions) page.

  Fields:
    additionalExperiments: Additional experiment flags for the job.
    additionalUserLabels: Additional user labels to be specified for the job.
      Keys and values should follow the restrictions specified in the
      [labeling restrictions](https://cloud.google.com/compute/docs/labeling-
      resources#restrictions) page.
    bypassTempDirValidation: Whether to bypass the safety checks for the job's
      temporary directory. Use with caution.
    ipConfiguration: Configuration for VM IPs.
    kmsKeyName: Optional. Name for the Cloud KMS key for the job. Key format
      is: projects/<project>/locations/<location>/keyRings/<keyring>/cryptoKey
      s/<key>
    machineType: The machine type to use for the job. Defaults to the value
      from the template if not specified.
    maxWorkers: The maximum number of Google Compute Engine instances to be
      made available to your pipeline during execution, from 1 to 1000.
    network: Network to which VMs will be assigned.  If empty or unspecified,
      the service will use the network "default".
    numWorkers: The initial number of Google Compute Engine instnaces for the
      job.
    serviceAccountEmail: The email address of the service account to run the
      job as.
    subnetwork: Subnetwork to which VMs will be assigned, if desired.
      Expected to be of the form "regions/REGION/subnetworks/SUBNETWORK".
    tempLocation: The Cloud Storage path to use for temporary files. Must be a
      valid Cloud Storage URL, beginning with `gs://`.
    workerRegion: The Compute Engine region
      (https://cloud.google.com/compute/docs/regions-zones/regions-zones) in
      which worker processing should occur, e.g. "us-west1". Mutually
      exclusive with worker_zone. If neither worker_region nor worker_zone is
      specified, default to the control plane's region.
    workerZone: The Compute Engine zone (https://cloud.google.com/compute/docs
      /regions-zones/regions-zones) in which worker processing should occur,
      e.g. "us-west1-a". Mutually exclusive with worker_region. If neither
      worker_region nor worker_zone is specified, a zone in the control
      plane's region is chosen based on available capacity. If both
      `worker_zone` and `zone` are set, `worker_zone` takes precedence.
    zone: The Compute Engine [availability
      zone](https://cloud.google.com/compute/docs/regions-zones/regions-zones)
      for launching worker instances to run your pipeline. In the future,
      worker_zone will take precedence.
  """

  class IpConfigurationValueValuesEnum(_messages.Enum):
    r"""Configuration for VM IPs.

    Values:
      WORKER_IP_UNSPECIFIED: The configuration is unknown, or unspecified.
      WORKER_IP_PUBLIC: Workers should have public IP addresses.
      WORKER_IP_PRIVATE: Workers should have private IP addresses.
    """
    WORKER_IP_UNSPECIFIED = 0
    WORKER_IP_PUBLIC = 1
    WORKER_IP_PRIVATE = 2

  @encoding.MapUnrecognizedFields('additionalProperties')
  class AdditionalUserLabelsValue(_messages.Message):
    r"""Additional user labels to be specified for the job. Keys and values
    should follow the restrictions specified in the [labeling
    restrictions](https://cloud.google.com/compute/docs/labeling-
    resources#restrictions) page.

    Messages:
      AdditionalProperty: An additional property for a
        AdditionalUserLabelsValue object.

    Fields:
      additionalProperties: Additional properties of type
        AdditionalUserLabelsValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a AdditionalUserLabelsValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  additionalExperiments = _messages.StringField(1, repeated=True)
  additionalUserLabels = _messages.MessageField('AdditionalUserLabelsValue', 2)
  bypassTempDirValidation = _messages.BooleanField(3)
  ipConfiguration = _messages.EnumField('IpConfigurationValueValuesEnum', 4)
  kmsKeyName = _messages.StringField(5)
  machineType = _messages.StringField(6)
  maxWorkers = _messages.IntegerField(7, variant=_messages.Variant.INT32)
  network = _messages.StringField(8)
  numWorkers = _messages.IntegerField(9, variant=_messages.Variant.INT32)
  serviceAccountEmail = _messages.StringField(10)
  subnetwork = _messages.StringField(11)
  tempLocation = _messages.StringField(12)
  workerRegion = _messages.StringField(13)
  workerZone = _messages.StringField(14)
  zone = _messages.StringField(15)


class SdkVersion(_messages.Message):
  r"""The version of the SDK used to run the job.

  Enums:
    SdkSupportStatusValueValuesEnum: The support status for this SDK version.

  Fields:
    sdkSupportStatus: The support status for this SDK version.
    version: The version of the SDK used to run the job.
    versionDisplayName: A readable string describing the version of the SDK.
  """

  class SdkSupportStatusValueValuesEnum(_messages.Enum):
    r"""The support status for this SDK version.

    Values:
      UNKNOWN: Cloud Dataflow is unaware of this version.
      SUPPORTED: This is a known version of an SDK, and is supported.
      STALE: A newer version of the SDK family exists, and an update is
        recommended.
      DEPRECATED: This version of the SDK is deprecated and will eventually be
        no longer supported.
      UNSUPPORTED: Support for this SDK version has ended and it should no
        longer be used.
    """
    UNKNOWN = 0
    SUPPORTED = 1
    STALE = 2
    DEPRECATED = 3
    UNSUPPORTED = 4

  sdkSupportStatus = _messages.EnumField('SdkSupportStatusValueValuesEnum', 1)
  version = _messages.StringField(2)
  versionDisplayName = _messages.StringField(3)


class SendDebugCaptureRequest(_messages.Message):
  r"""Request to send encoded debug information.

  Fields:
    componentId: The internal component id for which debug information is
      sent.
    data: The encoded debug information.
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job specified by job_id.
    workerId: The worker id, i.e., VM hostname.
  """

  componentId = _messages.StringField(1)
  data = _messages.StringField(2)
  location = _messages.StringField(3)
  workerId = _messages.StringField(4)


class SendDebugCaptureResponse(_messages.Message):
  r"""Response to a send capture request.
nothing"""


class SendWorkerMessagesRequest(_messages.Message):
  r"""A request for sending worker messages to the service.

  Fields:
    location: The [regional endpoint]
      (https://cloud.google.com/dataflow/docs/concepts/regional-endpoints)
      that contains the job.
    workerMessages: The WorkerMessages to send.
  """

  location = _messages.StringField(1)
  workerMessages = _messages.MessageField('WorkerMessage', 2, repeated=True)


class SendWorkerMessagesResponse(_messages.Message):
  r"""The response to the worker messages.

  Fields:
    workerMessageResponses: The servers response to the worker messages.
  """

  workerMessageResponses = _messages.MessageField('WorkerMessageResponse', 1, repeated=True)


class SeqMapTask(_messages.Message):
  r"""Describes a particular function to invoke.

  Messages:
    UserFnValue: The user function to invoke.

  Fields:
    inputs: Information about each of the inputs.
    name: The user-provided name of the SeqDo operation.
    outputInfos: Information about each of the outputs.
    stageName: System-defined name of the stage containing the SeqDo
      operation. Unique across the workflow.
    systemName: System-defined name of the SeqDo operation. Unique across the
      workflow.
    userFn: The user function to invoke.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UserFnValue(_messages.Message):
    r"""The user function to invoke.

    Messages:
      AdditionalProperty: An additional property for a UserFnValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UserFnValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  inputs = _messages.MessageField('SideInputInfo', 1, repeated=True)
  name = _messages.StringField(2)
  outputInfos = _messages.MessageField('SeqMapTaskOutputInfo', 3, repeated=True)
  stageName = _messages.StringField(4)
  systemName = _messages.StringField(5)
  userFn = _messages.MessageField('UserFnValue', 6)


class SeqMapTaskOutputInfo(_messages.Message):
  r"""Information about an output of a SeqMapTask.

  Fields:
    sink: The sink to write the output value to.
    tag: The id of the TupleTag the user code will tag the output value by.
  """

  sink = _messages.MessageField('Sink', 1)
  tag = _messages.StringField(2)


class ShellTask(_messages.Message):
  r"""A task which consists of a shell command for the worker to execute.

  Fields:
    command: The shell command to run.
    exitCode: Exit code for the task.
  """

  command = _messages.StringField(1)
  exitCode = _messages.IntegerField(2, variant=_messages.Variant.INT32)


class SideInputInfo(_messages.Message):
  r"""Information about a side input of a DoFn or an input of a SeqDoFn.

  Messages:
    KindValue: How to interpret the source element(s) as a side input value.

  Fields:
    kind: How to interpret the source element(s) as a side input value.
    sources: The source(s) to read element(s) from to get the value of this
      side input. If more than one source, then the elements are taken from
      the sources, in the specified order if order matters. At least one
      source is required.
    tag: The id of the tag the user code will access this side input by; this
      should correspond to the tag of some MultiOutputInfo.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class KindValue(_messages.Message):
    r"""How to interpret the source element(s) as a side input value.

    Messages:
      AdditionalProperty: An additional property for a KindValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a KindValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  kind = _messages.MessageField('KindValue', 1)
  sources = _messages.MessageField('Source', 2, repeated=True)
  tag = _messages.StringField(3)


class Sink(_messages.Message):
  r"""A sink that records can be encoded and written to.

  Messages:
    CodecValue: The codec to use to encode data written to the sink.
    SpecValue: The sink to write to, plus its parameters.

  Fields:
    codec: The codec to use to encode data written to the sink.
    spec: The sink to write to, plus its parameters.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class CodecValue(_messages.Message):
    r"""The codec to use to encode data written to the sink.

    Messages:
      AdditionalProperty: An additional property for a CodecValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a CodecValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class SpecValue(_messages.Message):
    r"""The sink to write to, plus its parameters.

    Messages:
      AdditionalProperty: An additional property for a SpecValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a SpecValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  codec = _messages.MessageField('CodecValue', 1)
  spec = _messages.MessageField('SpecValue', 2)


class Source(_messages.Message):
  r"""A source that records can be read and decoded from.

  Messages:
    BaseSpecsValueListEntry: A BaseSpecsValueListEntry object.
    CodecValue: The codec to use to decode data read from the source.
    SpecValue: The source to read from, plus its parameters.

  Fields:
    baseSpecs: While splitting, sources may specify the produced bundles as
      differences against another source, in order to save backend-side memory
      and allow bigger jobs. For details, see SourceSplitRequest. To support
      this use case, the full set of parameters of the source is logically
      obtained by taking the latest explicitly specified value of each
      parameter in the order: base_specs (later items win), spec (overrides
      anything in base_specs).
    codec: The codec to use to decode data read from the source.
    doesNotNeedSplitting: Setting this value to true hints to the framework
      that the source doesn't need splitting, and using SourceSplitRequest on
      it would yield SOURCE_SPLIT_OUTCOME_USE_CURRENT.  E.g. a file splitter
      may set this to true when splitting a single file into a set of byte
      ranges of appropriate size, and set this to false when splitting a
      filepattern into individual files. However, for efficiency, a file
      splitter may decide to produce file subranges directly from the
      filepattern to avoid a splitting round-trip.  See SourceSplitRequest for
      an overview of the splitting process.  This field is meaningful only in
      the Source objects populated by the user (e.g. when filling in a
      DerivedSource). Source objects supplied by the framework to the user
      don't have this field populated.
    metadata: Optionally, metadata for this source can be supplied right away,
      avoiding a SourceGetMetadataOperation roundtrip (see
      SourceOperationRequest).  This field is meaningful only in the Source
      objects populated by the user (e.g. when filling in a DerivedSource).
      Source objects supplied by the framework to the user don't have this
      field populated.
    spec: The source to read from, plus its parameters.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class BaseSpecsValueListEntry(_messages.Message):
    r"""A BaseSpecsValueListEntry object.

    Messages:
      AdditionalProperty: An additional property for a BaseSpecsValueListEntry
        object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a BaseSpecsValueListEntry object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class CodecValue(_messages.Message):
    r"""The codec to use to decode data read from the source.

    Messages:
      AdditionalProperty: An additional property for a CodecValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a CodecValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class SpecValue(_messages.Message):
    r"""The source to read from, plus its parameters.

    Messages:
      AdditionalProperty: An additional property for a SpecValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a SpecValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  baseSpecs = _messages.MessageField('BaseSpecsValueListEntry', 1, repeated=True)
  codec = _messages.MessageField('CodecValue', 2)
  doesNotNeedSplitting = _messages.BooleanField(3)
  metadata = _messages.MessageField('SourceMetadata', 4)
  spec = _messages.MessageField('SpecValue', 5)


class SourceFork(_messages.Message):
  r"""DEPRECATED in favor of DynamicSourceSplit.

  Fields:
    primary: DEPRECATED
    primarySource: DEPRECATED
    residual: DEPRECATED
    residualSource: DEPRECATED
  """

  primary = _messages.MessageField('SourceSplitShard', 1)
  primarySource = _messages.MessageField('DerivedSource', 2)
  residual = _messages.MessageField('SourceSplitShard', 3)
  residualSource = _messages.MessageField('DerivedSource', 4)


class SourceGetMetadataRequest(_messages.Message):
  r"""A request to compute the SourceMetadata of a Source.

  Fields:
    source: Specification of the source whose metadata should be computed.
  """

  source = _messages.MessageField('Source', 1)


class SourceGetMetadataResponse(_messages.Message):
  r"""The result of a SourceGetMetadataOperation.

  Fields:
    metadata: The computed metadata.
  """

  metadata = _messages.MessageField('SourceMetadata', 1)


class SourceMetadata(_messages.Message):
  r"""Metadata about a Source useful for automatically optimizing and tuning
  the pipeline, etc.

  Fields:
    estimatedSizeBytes: An estimate of the total size (in bytes) of the data
      that would be read from this source.  This estimate is in terms of
      external storage size, before any decompression or other processing done
      by the reader.
    infinite: Specifies that the size of this source is known to be infinite
      (this is a streaming source).
    producesSortedKeys: Whether this source is known to produce key/value
      pairs with the (encoded) keys in lexicographically sorted order.
  """

  estimatedSizeBytes = _messages.IntegerField(1)
  infinite = _messages.BooleanField(2)
  producesSortedKeys = _messages.BooleanField(3)


class SourceOperationRequest(_messages.Message):
  r"""A work item that represents the different operations that can be
  performed on a user-defined Source specification.

  Fields:
    getMetadata: Information about a request to get metadata about a source.
    name: User-provided name of the Read instruction for this source.
    originalName: System-defined name for the Read instruction for this source
      in the original workflow graph.
    split: Information about a request to split a source.
    stageName: System-defined name of the stage containing the source
      operation. Unique across the workflow.
    systemName: System-defined name of the Read instruction for this source.
      Unique across the workflow.
  """

  getMetadata = _messages.MessageField('SourceGetMetadataRequest', 1)
  name = _messages.StringField(2)
  originalName = _messages.StringField(3)
  split = _messages.MessageField('SourceSplitRequest', 4)
  stageName = _messages.StringField(5)
  systemName = _messages.StringField(6)


class SourceOperationResponse(_messages.Message):
  r"""The result of a SourceOperationRequest, specified in
  ReportWorkItemStatusRequest.source_operation when the work item is
  completed.

  Fields:
    getMetadata: A response to a request to get metadata about a source.
    split: A response to a request to split a source.
  """

  getMetadata = _messages.MessageField('SourceGetMetadataResponse', 1)
  split = _messages.MessageField('SourceSplitResponse', 2)


class SourceSplitOptions(_messages.Message):
  r"""Hints for splitting a Source into bundles (parts for parallel
  processing) using SourceSplitRequest.

  Fields:
    desiredBundleSizeBytes: The source should be split into a set of bundles
      where the estimated size of each is approximately this many bytes.
    desiredShardSizeBytes: DEPRECATED in favor of desired_bundle_size_bytes.
  """

  desiredBundleSizeBytes = _messages.IntegerField(1)
  desiredShardSizeBytes = _messages.IntegerField(2)


class SourceSplitRequest(_messages.Message):
  r"""Represents the operation to split a high-level Source specification into
  bundles (parts for parallel processing).  At a high level, splitting of a
  source into bundles happens as follows: SourceSplitRequest is applied to the
  source. If it returns SOURCE_SPLIT_OUTCOME_USE_CURRENT, no further splitting
  happens and the source is used "as is". Otherwise, splitting is applied
  recursively to each produced DerivedSource.  As an optimization, for any
  Source, if its does_not_need_splitting is true, the framework assumes that
  splitting this source would return SOURCE_SPLIT_OUTCOME_USE_CURRENT, and
  doesn't initiate a SourceSplitRequest. This applies both to the initial
  source being split and to bundles produced from it.

  Fields:
    options: Hints for tuning the splitting process.
    source: Specification of the source to be split.
  """

  options = _messages.MessageField('SourceSplitOptions', 1)
  source = _messages.MessageField('Source', 2)


class SourceSplitResponse(_messages.Message):
  r"""The response to a SourceSplitRequest.

  Enums:
    OutcomeValueValuesEnum: Indicates whether splitting happened and produced
      a list of bundles. If this is USE_CURRENT_SOURCE_AS_IS, the current
      source should be processed "as is" without splitting. "bundles" is
      ignored in this case. If this is SPLITTING_HAPPENED, then "bundles"
      contains a list of bundles into which the source was split.

  Fields:
    bundles: If outcome is SPLITTING_HAPPENED, then this is a list of bundles
      into which the source was split. Otherwise this field is ignored. This
      list can be empty, which means the source represents an empty input.
    outcome: Indicates whether splitting happened and produced a list of
      bundles. If this is USE_CURRENT_SOURCE_AS_IS, the current source should
      be processed "as is" without splitting. "bundles" is ignored in this
      case. If this is SPLITTING_HAPPENED, then "bundles" contains a list of
      bundles into which the source was split.
    shards: DEPRECATED in favor of bundles.
  """

  class OutcomeValueValuesEnum(_messages.Enum):
    r"""Indicates whether splitting happened and produced a list of bundles.
    If this is USE_CURRENT_SOURCE_AS_IS, the current source should be
    processed "as is" without splitting. "bundles" is ignored in this case. If
    this is SPLITTING_HAPPENED, then "bundles" contains a list of bundles into
    which the source was split.

    Values:
      SOURCE_SPLIT_OUTCOME_UNKNOWN: The source split outcome is unknown, or
        unspecified.
      SOURCE_SPLIT_OUTCOME_USE_CURRENT: The current source should be processed
        "as is" without splitting.
      SOURCE_SPLIT_OUTCOME_SPLITTING_HAPPENED: Splitting produced a list of
        bundles.
    """
    SOURCE_SPLIT_OUTCOME_UNKNOWN = 0
    SOURCE_SPLIT_OUTCOME_USE_CURRENT = 1
    SOURCE_SPLIT_OUTCOME_SPLITTING_HAPPENED = 2

  bundles = _messages.MessageField('DerivedSource', 1, repeated=True)
  outcome = _messages.EnumField('OutcomeValueValuesEnum', 2)
  shards = _messages.MessageField('SourceSplitShard', 3, repeated=True)


class SourceSplitShard(_messages.Message):
  r"""DEPRECATED in favor of DerivedSource.

  Enums:
    DerivationModeValueValuesEnum: DEPRECATED

  Fields:
    derivationMode: DEPRECATED
    source: DEPRECATED
  """

  class DerivationModeValueValuesEnum(_messages.Enum):
    r"""DEPRECATED

    Values:
      SOURCE_DERIVATION_MODE_UNKNOWN: The source derivation is unknown, or
        unspecified.
      SOURCE_DERIVATION_MODE_INDEPENDENT: Produce a completely independent
        Source with no base.
      SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT: Produce a Source based on the
        Source being split.
      SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT: Produce a Source based on the
        base of the Source being split.
    """
    SOURCE_DERIVATION_MODE_UNKNOWN = 0
    SOURCE_DERIVATION_MODE_INDEPENDENT = 1
    SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT = 2
    SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT = 3

  derivationMode = _messages.EnumField('DerivationModeValueValuesEnum', 1)
  source = _messages.MessageField('Source', 2)


class SpannerIODetails(_messages.Message):
  r"""Metadata for a Spanner connector used by the job.

  Fields:
    databaseId: DatabaseId accessed in the connection.
    instanceId: InstanceId accessed in the connection.
    projectId: ProjectId accessed in the connection.
  """

  databaseId = _messages.StringField(1)
  instanceId = _messages.StringField(2)
  projectId = _messages.StringField(3)


class SplitInt64(_messages.Message):
  r"""A representation of an int64, n, that is immune to precision loss when
  encoded in JSON.

  Fields:
    highBits: The high order bits, including the sign: n >> 32.
    lowBits: The low order bits: n & 0xffffffff.
  """

  highBits = _messages.IntegerField(1, variant=_messages.Variant.INT32)
  lowBits = _messages.IntegerField(2, variant=_messages.Variant.UINT32)


class StageSource(_messages.Message):
  r"""Description of an input or output of an execution stage.

  Fields:
    name: Dataflow service generated name for this source.
    originalTransformOrCollection: User name for the original user transform
      or collection with which this source is most closely associated.
    sizeBytes: Size of the source, if measurable.
    userName: Human-readable name for this source; may be user or system
      generated.
  """

  name = _messages.StringField(1)
  originalTransformOrCollection = _messages.StringField(2)
  sizeBytes = _messages.IntegerField(3)
  userName = _messages.StringField(4)


class StandardQueryParameters(_messages.Message):
  r"""Query parameters accepted by all methods.

  Enums:
    FXgafvValueValuesEnum: V1 error format.
    AltValueValuesEnum: Data format for response.

  Fields:
    f__xgafv: V1 error format.
    access_token: OAuth access token.
    alt: Data format for response.
    callback: JSONP
    fields: Selector specifying which fields to include in a partial response.
    key: API key. Your API key identifies your project and provides you with
      API access, quota, and reports. Required unless you provide an OAuth 2.0
      token.
    oauth_token: OAuth 2.0 token for the current user.
    prettyPrint: Returns response with indentations and line breaks.
    quotaUser: Available to use for quota purposes for server-side
      applications. Can be any arbitrary string assigned to a user, but should
      not exceed 40 characters.
    trace: A tracing token of the form "token:<tokenid>" to include in api
      requests.
    uploadType: Legacy upload protocol for media (e.g. "media", "multipart").
    upload_protocol: Upload protocol for media (e.g. "raw", "multipart").
  """

  class AltValueValuesEnum(_messages.Enum):
    r"""Data format for response.

    Values:
      json: Responses with Content-Type of application/json
      media: Media download with context-dependent Content-Type
      proto: Responses with Content-Type of application/x-protobuf
    """
    json = 0
    media = 1
    proto = 2

  class FXgafvValueValuesEnum(_messages.Enum):
    r"""V1 error format.

    Values:
      _1: v1 error format
      _2: v2 error format
    """
    _1 = 0
    _2 = 1

  f__xgafv = _messages.EnumField('FXgafvValueValuesEnum', 1)
  access_token = _messages.StringField(2)
  alt = _messages.EnumField('AltValueValuesEnum', 3, default=u'json')
  callback = _messages.StringField(4)
  fields = _messages.StringField(5)
  key = _messages.StringField(6)
  oauth_token = _messages.StringField(7)
  prettyPrint = _messages.BooleanField(8, default=True)
  quotaUser = _messages.StringField(9)
  trace = _messages.StringField(10)
  uploadType = _messages.StringField(11)
  upload_protocol = _messages.StringField(12)


class StateFamilyConfig(_messages.Message):
  r"""State family configuration.

  Fields:
    isRead: If true, this family corresponds to a read operation.
    stateFamily: The state family value.
  """

  isRead = _messages.BooleanField(1)
  stateFamily = _messages.StringField(2)


class Status(_messages.Message):
  r"""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).

  Messages:
    DetailsValueListEntry: A DetailsValueListEntry object.

  Fields:
    code: The status code, which should be an enum value of google.rpc.Code.
    details: A list of messages that carry the error details.  There is a
      common set of message types for APIs to use.
    message: 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.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class DetailsValueListEntry(_messages.Message):
    r"""A DetailsValueListEntry object.

    Messages:
      AdditionalProperty: An additional property for a DetailsValueListEntry
        object.

    Fields:
      additionalProperties: Properties of the object. Contains field @type
        with type URL.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a DetailsValueListEntry object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  code = _messages.IntegerField(1, variant=_messages.Variant.INT32)
  details = _messages.MessageField('DetailsValueListEntry', 2, repeated=True)
  message = _messages.StringField(3)


class Step(_messages.Message):
  r"""Defines a particular step within a Cloud Dataflow job.  A job consists
  of multiple steps, each of which performs some specific operation as part of
  the overall job.  Data is typically passed from one step to another as part
  of the job.  Here's an example of a sequence of steps which together
  implement a Map-Reduce job:    * Read a collection of data from some source,
  parsing the     collection's elements.    * Validate the elements.    *
  Apply a user-defined function to map each element to some value     and
  extract an element-specific key value.    * Group elements with the same key
  into a single element with     that key, transforming a multiply-keyed
  collection into a     uniquely-keyed collection.    * Write the elements out
  to some data sink.  Note that the Cloud Dataflow service may be used to run
  many different types of jobs, not just Map-Reduce.

  Messages:
    PropertiesValue: Named properties associated with the step. Each kind of
      predefined step has its own required set of properties. Must be provided
      on Create.  Only retrieved with JOB_VIEW_ALL.

  Fields:
    kind: The kind of step in the Cloud Dataflow job.
    name: The name that identifies the step. This must be unique for each step
      with respect to all other steps in the Cloud Dataflow job.
    properties: Named properties associated with the step. Each kind of
      predefined step has its own required set of properties. Must be provided
      on Create.  Only retrieved with JOB_VIEW_ALL.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class PropertiesValue(_messages.Message):
    r"""Named properties associated with the step. Each kind of predefined
    step has its own required set of properties. Must be provided on Create.
    Only retrieved with JOB_VIEW_ALL.

    Messages:
      AdditionalProperty: An additional property for a PropertiesValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a PropertiesValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  kind = _messages.StringField(1)
  name = _messages.StringField(2)
  properties = _messages.MessageField('PropertiesValue', 3)


class StreamLocation(_messages.Message):
  r"""Describes a stream of data, either as input to be processed or as output
  of a streaming Dataflow job.

  Fields:
    customSourceLocation: The stream is a custom source.
    pubsubLocation: The stream is a pubsub stream.
    sideInputLocation: The stream is a streaming side input.
    streamingStageLocation: The stream is part of another computation within
      the current streaming Dataflow job.
  """

  customSourceLocation = _messages.MessageField('CustomSourceLocation', 1)
  pubsubLocation = _messages.MessageField('PubsubLocation', 2)
  sideInputLocation = _messages.MessageField('StreamingSideInputLocation', 3)
  streamingStageLocation = _messages.MessageField('StreamingStageLocation', 4)


class StreamingApplianceSnapshotConfig(_messages.Message):
  r"""Streaming appliance snapshot configuration.

  Fields:
    importStateEndpoint: Indicates which endpoint is used to import appliance
      state.
    snapshotId: If set, indicates the snapshot id for the snapshot being
      performed.
  """

  importStateEndpoint = _messages.StringField(1)
  snapshotId = _messages.StringField(2)


class StreamingComputationConfig(_messages.Message):
  r"""Configuration information for a single streaming computation.

  Messages:
    TransformUserNameToStateFamilyValue: Map from user name of stateful
      transforms in this stage to their state family.

  Fields:
    computationId: Unique identifier for this computation.
    instructions: Instructions that comprise the computation.
    stageName: Stage name of this computation.
    systemName: System defined name for this computation.
    transformUserNameToStateFamily: Map from user name of stateful transforms
      in this stage to their state family.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class TransformUserNameToStateFamilyValue(_messages.Message):
    r"""Map from user name of stateful transforms in this stage to their state
    family.

    Messages:
      AdditionalProperty: An additional property for a
        TransformUserNameToStateFamilyValue object.

    Fields:
      additionalProperties: Additional properties of type
        TransformUserNameToStateFamilyValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a TransformUserNameToStateFamilyValue
      object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  computationId = _messages.StringField(1)
  instructions = _messages.MessageField('ParallelInstruction', 2, repeated=True)
  stageName = _messages.StringField(3)
  systemName = _messages.StringField(4)
  transformUserNameToStateFamily = _messages.MessageField('TransformUserNameToStateFamilyValue', 5)


class StreamingComputationRanges(_messages.Message):
  r"""Describes full or partial data disk assignment information of the
  computation ranges.

  Fields:
    computationId: The ID of the computation.
    rangeAssignments: Data disk assignments for ranges from this computation.
  """

  computationId = _messages.StringField(1)
  rangeAssignments = _messages.MessageField('KeyRangeDataDiskAssignment', 2, repeated=True)


class StreamingComputationTask(_messages.Message):
  r"""A task which describes what action should be performed for the specified
  streaming computation ranges.

  Enums:
    TaskTypeValueValuesEnum: A type of streaming computation task.

  Fields:
    computationRanges: Contains ranges of a streaming computation this task
      should apply to.
    dataDisks: Describes the set of data disks this task should apply to.
    taskType: A type of streaming computation task.
  """

  class TaskTypeValueValuesEnum(_messages.Enum):
    r"""A type of streaming computation task.

    Values:
      STREAMING_COMPUTATION_TASK_UNKNOWN: The streaming computation task is
        unknown, or unspecified.
      STREAMING_COMPUTATION_TASK_STOP: Stop processing specified streaming
        computation range(s).
      STREAMING_COMPUTATION_TASK_START: Start processing specified streaming
        computation range(s).
    """
    STREAMING_COMPUTATION_TASK_UNKNOWN = 0
    STREAMING_COMPUTATION_TASK_STOP = 1
    STREAMING_COMPUTATION_TASK_START = 2

  computationRanges = _messages.MessageField('StreamingComputationRanges', 1, repeated=True)
  dataDisks = _messages.MessageField('MountedDataDisk', 2, repeated=True)
  taskType = _messages.EnumField('TaskTypeValueValuesEnum', 3)


class StreamingConfigTask(_messages.Message):
  r"""A task that carries configuration information for streaming
  computations.

  Messages:
    UserStepToStateFamilyNameMapValue: Map from user step names to state
      families.

  Fields:
    commitStreamChunkSizeBytes: Chunk size for commit streams from the harness
      to windmill.
    getDataStreamChunkSizeBytes: Chunk size for get data streams from the
      harness to windmill.
    maxWorkItemCommitBytes: Maximum size for work item commit supported
      windmill storage layer.
    streamingComputationConfigs: Set of computation configuration information.
    userStepToStateFamilyNameMap: Map from user step names to state families.
    windmillServiceEndpoint: If present, the worker must use this endpoint to
      communicate with Windmill Service dispatchers, otherwise the worker must
      continue to use whatever endpoint it had been using.
    windmillServicePort: If present, the worker must use this port to
      communicate with Windmill Service dispatchers. Only applicable when
      windmill_service_endpoint is specified.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UserStepToStateFamilyNameMapValue(_messages.Message):
    r"""Map from user step names to state families.

    Messages:
      AdditionalProperty: An additional property for a
        UserStepToStateFamilyNameMapValue object.

    Fields:
      additionalProperties: Additional properties of type
        UserStepToStateFamilyNameMapValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UserStepToStateFamilyNameMapValue
      object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  commitStreamChunkSizeBytes = _messages.IntegerField(1)
  getDataStreamChunkSizeBytes = _messages.IntegerField(2)
  maxWorkItemCommitBytes = _messages.IntegerField(3)
  streamingComputationConfigs = _messages.MessageField('StreamingComputationConfig', 4, repeated=True)
  userStepToStateFamilyNameMap = _messages.MessageField('UserStepToStateFamilyNameMapValue', 5)
  windmillServiceEndpoint = _messages.StringField(6)
  windmillServicePort = _messages.IntegerField(7)


class StreamingSetupTask(_messages.Message):
  r"""A task which initializes part of a streaming Dataflow job.

  Fields:
    drain: The user has requested drain.
    receiveWorkPort: The TCP port on which the worker should listen for
      messages from other streaming computation workers.
    snapshotConfig: Configures streaming appliance snapshot.
    streamingComputationTopology: The global topology of the streaming
      Dataflow job.
    workerHarnessPort: The TCP port used by the worker to communicate with the
      Dataflow worker harness.
  """

  drain = _messages.BooleanField(1)
  receiveWorkPort = _messages.IntegerField(2, variant=_messages.Variant.INT32)
  snapshotConfig = _messages.MessageField('StreamingApplianceSnapshotConfig', 3)
  streamingComputationTopology = _messages.MessageField('TopologyConfig', 4)
  workerHarnessPort = _messages.IntegerField(5, variant=_messages.Variant.INT32)


class StreamingSideInputLocation(_messages.Message):
  r"""Identifies the location of a streaming side input.

  Fields:
    stateFamily: Identifies the state family where this side input is stored.
    tag: Identifies the particular side input within the streaming Dataflow
      job.
  """

  stateFamily = _messages.StringField(1)
  tag = _messages.StringField(2)


class StreamingStageLocation(_messages.Message):
  r"""Identifies the location of a streaming computation stage, for stage-to-
  stage communication.

  Fields:
    streamId: Identifies the particular stream within the streaming Dataflow
      job.
  """

  streamId = _messages.StringField(1)


class StringList(_messages.Message):
  r"""A metric value representing a list of strings.

  Fields:
    elements: Elements of the list.
  """

  elements = _messages.StringField(1, repeated=True)


class StructuredMessage(_messages.Message):
  r"""A rich message format, including a human readable string, a key for
  identifying the message, and structured data associated with the message for
  programmatic consumption.

  Fields:
    messageKey: Identifier for this message type.  Used by external systems to
      internationalize or personalize message.
    messageText: Human-readable version of message.
    parameters: The structured data associated with this message.
  """

  messageKey = _messages.StringField(1)
  messageText = _messages.StringField(2)
  parameters = _messages.MessageField('Parameter', 3, repeated=True)


class TaskRunnerSettings(_messages.Message):
  r"""Taskrunner configuration settings.

  Fields:
    alsologtostderr: Whether to also send taskrunner log info to stderr.
    baseTaskDir: The location on the worker for task-specific subdirectories.
    baseUrl: The base URL for the taskrunner to use when accessing Google
      Cloud APIs.  When workers access Google Cloud APIs, they logically do so
      via relative URLs.  If this field is specified, it supplies the base URL
      to use for resolving these relative URLs.  The normative algorithm used
      is defined by RFC 1808, "Relative Uniform Resource Locators".  If not
      specified, the default value is "http://www.googleapis.com/"
    commandlinesFileName: The file to store preprocessing commands in.
    continueOnException: Whether to continue taskrunner if an exception is
      hit.
    dataflowApiVersion: The API version of endpoint, e.g. "v1b3"
    harnessCommand: The command to launch the worker harness.
    languageHint: The suggested backend language.
    logDir: The directory on the VM to store logs.
    logToSerialconsole: Whether to send taskrunner log info to Google Compute
      Engine VM serial console.
    logUploadLocation: Indicates where to put logs.  If this is not specified,
      the logs will not be uploaded.  The supported resource type is:  Google
      Cloud Storage:   storage.googleapis.com/{bucket}/{object}
      bucket.storage.googleapis.com/{object}
    oauthScopes: The OAuth2 scopes to be requested by the taskrunner in order
      to access the Cloud Dataflow API.
    parallelWorkerSettings: The settings to pass to the parallel worker
      harness.
    streamingWorkerMainClass: The streaming worker main class name.
    taskGroup: The UNIX group ID on the worker VM to use for tasks launched by
      taskrunner; e.g. "wheel".
    taskUser: The UNIX user ID on the worker VM to use for tasks launched by
      taskrunner; e.g. "root".
    tempStoragePrefix: The prefix of the resources the taskrunner should use
      for temporary storage.  The supported resource type is:  Google Cloud
      Storage:   storage.googleapis.com/{bucket}/{object}
      bucket.storage.googleapis.com/{object}
    vmId: The ID string of the VM.
    workflowFileName: The file to store the workflow in.
  """

  alsologtostderr = _messages.BooleanField(1)
  baseTaskDir = _messages.StringField(2)
  baseUrl = _messages.StringField(3)
  commandlinesFileName = _messages.StringField(4)
  continueOnException = _messages.BooleanField(5)
  dataflowApiVersion = _messages.StringField(6)
  harnessCommand = _messages.StringField(7)
  languageHint = _messages.StringField(8)
  logDir = _messages.StringField(9)
  logToSerialconsole = _messages.BooleanField(10)
  logUploadLocation = _messages.StringField(11)
  oauthScopes = _messages.StringField(12, repeated=True)
  parallelWorkerSettings = _messages.MessageField('WorkerSettings', 13)
  streamingWorkerMainClass = _messages.StringField(14)
  taskGroup = _messages.StringField(15)
  taskUser = _messages.StringField(16)
  tempStoragePrefix = _messages.StringField(17)
  vmId = _messages.StringField(18)
  workflowFileName = _messages.StringField(19)


class TemplateMetadata(_messages.Message):
  r"""Metadata describing a template.

  Fields:
    description: Optional. A description of the template.
    name: Required. The name of the template.
    parameters: The parameters for the template.
  """

  description = _messages.StringField(1)
  name = _messages.StringField(2)
  parameters = _messages.MessageField('ParameterMetadata', 3, repeated=True)


class TopologyConfig(_messages.Message):
  r"""Global topology of the streaming Dataflow job, including all
  computations and their sharded locations.

  Messages:
    UserStageToComputationNameMapValue: Maps user stage names to stable
      computation names.

  Fields:
    computations: The computations associated with a streaming Dataflow job.
    dataDiskAssignments: The disks assigned to a streaming Dataflow job.
    forwardingKeyBits: The size (in bits) of keys that will be assigned to
      source messages.
    persistentStateVersion: Version number for persistent state.
    userStageToComputationNameMap: Maps user stage names to stable computation
      names.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class UserStageToComputationNameMapValue(_messages.Message):
    r"""Maps user stage names to stable computation names.

    Messages:
      AdditionalProperty: An additional property for a
        UserStageToComputationNameMapValue object.

    Fields:
      additionalProperties: Additional properties of type
        UserStageToComputationNameMapValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a UserStageToComputationNameMapValue
      object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  computations = _messages.MessageField('ComputationTopology', 1, repeated=True)
  dataDiskAssignments = _messages.MessageField('DataDiskAssignment', 2, repeated=True)
  forwardingKeyBits = _messages.IntegerField(3, variant=_messages.Variant.INT32)
  persistentStateVersion = _messages.IntegerField(4, variant=_messages.Variant.INT32)
  userStageToComputationNameMap = _messages.MessageField('UserStageToComputationNameMapValue', 5)


class TransformSummary(_messages.Message):
  r"""Description of the type, names/ids, and input/outputs for a transform.

  Enums:
    KindValueValuesEnum: Type of transform.

  Fields:
    displayData: Transform-specific display data.
    id: SDK generated id of this transform instance.
    inputCollectionName: User names for all collection inputs to this
      transform.
    kind: Type of transform.
    name: User provided name for this transform instance.
    outputCollectionName: User  names for all collection outputs to this
      transform.
  """

  class KindValueValuesEnum(_messages.Enum):
    r"""Type of transform.

    Values:
      UNKNOWN_KIND: Unrecognized transform type.
      PAR_DO_KIND: ParDo transform.
      GROUP_BY_KEY_KIND: Group By Key transform.
      FLATTEN_KIND: Flatten transform.
      READ_KIND: Read transform.
      WRITE_KIND: Write transform.
      CONSTANT_KIND: Constructs from a constant value, such as with Create.of.
      SINGLETON_KIND: Creates a Singleton view of a collection.
      SHUFFLE_KIND: Opening or closing a shuffle session, often as part of a
        GroupByKey.
    """
    UNKNOWN_KIND = 0
    PAR_DO_KIND = 1
    GROUP_BY_KEY_KIND = 2
    FLATTEN_KIND = 3
    READ_KIND = 4
    WRITE_KIND = 5
    CONSTANT_KIND = 6
    SINGLETON_KIND = 7
    SHUFFLE_KIND = 8

  displayData = _messages.MessageField('DisplayData', 1, repeated=True)
  id = _messages.StringField(2)
  inputCollectionName = _messages.StringField(3, repeated=True)
  kind = _messages.EnumField('KindValueValuesEnum', 4)
  name = _messages.StringField(5)
  outputCollectionName = _messages.StringField(6, repeated=True)


class ValidateResponse(_messages.Message):
  r"""Response to the validation request.

  Fields:
    errorMessage: Will be empty if validation succeeds.
  """

  errorMessage = _messages.StringField(1)


class WorkItem(_messages.Message):
  r"""WorkItem represents basic information about a WorkItem to be executed in
  the cloud.

  Fields:
    configuration: Work item-specific configuration as an opaque blob.
    id: Identifies this WorkItem.
    initialReportIndex: The initial index to use when reporting the status of
      the WorkItem.
    jobId: Identifies the workflow job this WorkItem belongs to.
    leaseExpireTime: Time when the lease on this Work will expire.
    mapTask: Additional information for MapTask WorkItems.
    packages: Any required packages that need to be fetched in order to
      execute this WorkItem.
    projectId: Identifies the cloud project this WorkItem belongs to.
    reportStatusInterval: Recommended reporting interval.
    seqMapTask: Additional information for SeqMapTask WorkItems.
    shellTask: Additional information for ShellTask WorkItems.
    sourceOperationTask: Additional information for source operation
      WorkItems.
    streamingComputationTask: Additional information for
      StreamingComputationTask WorkItems.
    streamingConfigTask: Additional information for StreamingConfigTask
      WorkItems.
    streamingSetupTask: Additional information for StreamingSetupTask
      WorkItems.
  """

  configuration = _messages.StringField(1)
  id = _messages.IntegerField(2)
  initialReportIndex = _messages.IntegerField(3)
  jobId = _messages.StringField(4)
  leaseExpireTime = _messages.StringField(5)
  mapTask = _messages.MessageField('MapTask', 6)
  packages = _messages.MessageField('Package', 7, repeated=True)
  projectId = _messages.StringField(8)
  reportStatusInterval = _messages.StringField(9)
  seqMapTask = _messages.MessageField('SeqMapTask', 10)
  shellTask = _messages.MessageField('ShellTask', 11)
  sourceOperationTask = _messages.MessageField('SourceOperationRequest', 12)
  streamingComputationTask = _messages.MessageField('StreamingComputationTask', 13)
  streamingConfigTask = _messages.MessageField('StreamingConfigTask', 14)
  streamingSetupTask = _messages.MessageField('StreamingSetupTask', 15)


class WorkItemServiceState(_messages.Message):
  r"""The Dataflow service's idea of the current state of a WorkItem being
  processed by a worker.

  Messages:
    HarnessDataValue: Other data returned by the service, specific to the
      particular worker harness.

  Fields:
    harnessData: Other data returned by the service, specific to the
      particular worker harness.
    hotKeyDetection: A hot key is a symptom of poor data distribution in which
      there are enough elements mapped to a single key to impact pipeline
      performance. When present, this field includes metadata associated with
      any hot key.
    leaseExpireTime: Time at which the current lease will expire.
    metricShortId: The short ids that workers should use in subsequent metric
      updates. Workers should strive to use short ids whenever possible, but
      it is ok to request the short_id again if a worker lost track of it
      (e.g. if the worker is recovering from a crash). NOTE: it is possible
      that the response may have short ids for a subset of the metrics.
    nextReportIndex: The index value to use for the next report sent by the
      worker. Note: If the report call fails for whatever reason, the worker
      should reuse this index for subsequent report attempts.
    reportStatusInterval: New recommended reporting interval.
    splitRequest: The progress point in the WorkItem where the Dataflow
      service suggests that the worker truncate the task.
    suggestedStopPoint: DEPRECATED in favor of split_request.
    suggestedStopPosition: Obsolete, always empty.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class HarnessDataValue(_messages.Message):
    r"""Other data returned by the service, specific to the particular worker
    harness.

    Messages:
      AdditionalProperty: An additional property for a HarnessDataValue
        object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a HarnessDataValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  harnessData = _messages.MessageField('HarnessDataValue', 1)
  hotKeyDetection = _messages.MessageField('HotKeyDetection', 2)
  leaseExpireTime = _messages.StringField(3)
  metricShortId = _messages.MessageField('MetricShortId', 4, repeated=True)
  nextReportIndex = _messages.IntegerField(5)
  reportStatusInterval = _messages.StringField(6)
  splitRequest = _messages.MessageField('ApproximateSplitRequest', 7)
  suggestedStopPoint = _messages.MessageField('ApproximateProgress', 8)
  suggestedStopPosition = _messages.MessageField('Position', 9)


class WorkItemStatus(_messages.Message):
  r"""Conveys a worker's progress through the work described by a WorkItem.

  Fields:
    completed: True if the WorkItem was completed (successfully or
      unsuccessfully).
    counterUpdates: Worker output counters for this WorkItem.
    dynamicSourceSplit: See documentation of stop_position.
    errors: Specifies errors which occurred during processing.  If errors are
      provided, and completed = true, then the WorkItem is considered to have
      failed.
    metricUpdates: DEPRECATED in favor of counter_updates.
    progress: DEPRECATED in favor of reported_progress.
    reportIndex: The report index.  When a WorkItem is leased, the lease will
      contain an initial report index.  When a WorkItem's status is reported
      to the system, the report should be sent with that report index, and the
      response will contain the index the worker should use for the next
      report.  Reports received with unexpected index values will be rejected
      by the service.  In order to preserve idempotency, the worker should not
      alter the contents of a report, even if the worker must submit the same
      report multiple times before getting back a response.  The worker should
      not submit a subsequent report until the response for the previous
      report had been received from the service.
    reportedProgress: The worker's progress through this WorkItem.
    requestedLeaseDuration: Amount of time the worker requests for its lease.
    sourceFork: DEPRECATED in favor of dynamic_source_split.
    sourceOperationResponse: If the work item represented a
      SourceOperationRequest, and the work is completed, contains the result
      of the operation.
    stopPosition: A worker may split an active map task in two parts,
      "primary" and "residual", continuing to process the primary part and
      returning the residual part into the pool of available work. This event
      is called a "dynamic split" and is critical to the dynamic work
      rebalancing feature. The two obtained sub-tasks are called "parts" of
      the split. The parts, if concatenated, must represent the same input as
      would be read by the current task if the split did not happen. The exact
      way in which the original task is decomposed into the two parts is
      specified either as a position demarcating them (stop_position), or
      explicitly as two DerivedSources, if this task consumes a user-defined
      source type (dynamic_source_split).  The "current" task is adjusted as a
      result of the split: after a task with range [A, B) sends a
      stop_position update at C, its range is considered to be [A, C), e.g.: *
      Progress should be interpreted relative to the new range, e.g.   "75%
      completed" means "75% of [A, C) completed" * The worker should interpret
      proposed_stop_position relative to the   new range, e.g. "split at 68%"
      should be interpreted as   "split at 68% of [A, C)". * If the worker
      chooses to split again using stop_position, only   stop_positions in [A,
      C) will be accepted. * Etc. dynamic_source_split has similar semantics:
      e.g., if a task with source S splits using dynamic_source_split into {P,
      R} (where P and R must be together equivalent to S), then subsequent
      progress and proposed_stop_position should be interpreted relative to P,
      and in a potential subsequent dynamic_source_split into {P', R'}, P' and
      R' must be together equivalent to P, etc.
    totalThrottlerWaitTimeSeconds: Total time the worker spent being throttled
      by external systems.
    workItemId: Identifies the WorkItem.
  """

  completed = _messages.BooleanField(1)
  counterUpdates = _messages.MessageField('CounterUpdate', 2, repeated=True)
  dynamicSourceSplit = _messages.MessageField('DynamicSourceSplit', 3)
  errors = _messages.MessageField('Status', 4, repeated=True)
  metricUpdates = _messages.MessageField('MetricUpdate', 5, repeated=True)
  progress = _messages.MessageField('ApproximateProgress', 6)
  reportIndex = _messages.IntegerField(7)
  reportedProgress = _messages.MessageField('ApproximateReportedProgress', 8)
  requestedLeaseDuration = _messages.StringField(9)
  sourceFork = _messages.MessageField('SourceFork', 10)
  sourceOperationResponse = _messages.MessageField('SourceOperationResponse', 11)
  stopPosition = _messages.MessageField('Position', 12)
  totalThrottlerWaitTimeSeconds = _messages.FloatField(13)
  workItemId = _messages.StringField(14)


class WorkerHealthReport(_messages.Message):
  r"""WorkerHealthReport contains information about the health of a worker.
  The VM should be identified by the labels attached to the WorkerMessage that
  this health ping belongs to.

  Messages:
    PodsValueListEntry: A PodsValueListEntry object.

  Fields:
    msg: A message describing any unusual health reports.
    pods: The pods running on the worker. See: http://kubernetes.io/v1.1/docs
      /api-reference/v1/definitions.html#_v1_pod  This field is used by the
      worker to send the status of the indvidual containers running on each
      worker.
    reportInterval: The interval at which the worker is sending health
      reports. The default value of 0 should be interpreted as the field is
      not being explicitly set by the worker.
    vmIsBroken: Whether the VM is in a permanently broken state. Broken VMs
      should be abandoned or deleted ASAP to avoid assigning or completing any
      work.
    vmIsHealthy: Whether the VM is currently healthy.
    vmStartupTime: The time the VM was booted.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class PodsValueListEntry(_messages.Message):
    r"""A PodsValueListEntry object.

    Messages:
      AdditionalProperty: An additional property for a PodsValueListEntry
        object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a PodsValueListEntry object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  msg = _messages.StringField(1)
  pods = _messages.MessageField('PodsValueListEntry', 2, repeated=True)
  reportInterval = _messages.StringField(3)
  vmIsBroken = _messages.BooleanField(4)
  vmIsHealthy = _messages.BooleanField(5)
  vmStartupTime = _messages.StringField(6)


class WorkerHealthReportResponse(_messages.Message):
  r"""WorkerHealthReportResponse contains information returned to the worker
  in response to a health ping.

  Fields:
    reportInterval: A positive value indicates the worker should change its
      reporting interval to the specified value.  The default value of zero
      means no change in report rate is requested by the server.
  """

  reportInterval = _messages.StringField(1)


class WorkerLifecycleEvent(_messages.Message):
  r"""A report of an event in a worker's lifecycle. The proto contains one
  event, because the worker is expected to asynchronously send each message
  immediately after the event. Due to this asynchrony, messages may arrive out
  of order (or missing), and it is up to the consumer to interpret. The
  timestamp of the event is in the enclosing WorkerMessage proto.

  Enums:
    EventValueValuesEnum: The event being reported.

  Messages:
    MetadataValue: Other stats that can accompany an event. E.g. {
      "downloaded_bytes" : "123456" }

  Fields:
    containerStartTime: The start time of this container. All events will
      report this so that events can be grouped together across container/VM
      restarts.
    event: The event being reported.
    metadata: Other stats that can accompany an event. E.g. {
      "downloaded_bytes" : "123456" }
  """

  class EventValueValuesEnum(_messages.Enum):
    r"""The event being reported.

    Values:
      UNKNOWN_EVENT: Invalid event.
      OS_START: The time the VM started.
      CONTAINER_START: Our container code starts running. Multiple containers
        could be distinguished with WorkerMessage.labels if desired.
      NETWORK_UP: The worker has a functional external network connection.
      STAGING_FILES_DOWNLOAD_START: Started downloading staging files.
      STAGING_FILES_DOWNLOAD_FINISH: Finished downloading all staging files.
      SDK_INSTALL_START: For applicable SDKs, started installation of SDK and
        worker packages.
      SDK_INSTALL_FINISH: Finished installing SDK.
    """
    UNKNOWN_EVENT = 0
    OS_START = 1
    CONTAINER_START = 2
    NETWORK_UP = 3
    STAGING_FILES_DOWNLOAD_START = 4
    STAGING_FILES_DOWNLOAD_FINISH = 5
    SDK_INSTALL_START = 6
    SDK_INSTALL_FINISH = 7

  @encoding.MapUnrecognizedFields('additionalProperties')
  class MetadataValue(_messages.Message):
    r"""Other stats that can accompany an event. E.g. { "downloaded_bytes" :
    "123456" }

    Messages:
      AdditionalProperty: An additional property for a MetadataValue object.

    Fields:
      additionalProperties: Additional properties of type MetadataValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a MetadataValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  containerStartTime = _messages.StringField(1)
  event = _messages.EnumField('EventValueValuesEnum', 2)
  metadata = _messages.MessageField('MetadataValue', 3)


class WorkerMessage(_messages.Message):
  r"""WorkerMessage provides information to the backend about a worker.

  Messages:
    LabelsValue: Labels are used to group WorkerMessages. For example, a
      worker_message about a particular container might have the labels: {
      "JOB_ID": "2015-04-22",   "WORKER_ID": "wordcount-vm-2015..."
      "CONTAINER_TYPE": "worker",   "CONTAINER_ID": "ac1234def"} Label tags
      typically correspond to Label enum values. However, for ease of
      development other strings can be used as tags. LABEL_UNSPECIFIED should
      not be used here.

  Fields:
    labels: Labels are used to group WorkerMessages. For example, a
      worker_message about a particular container might have the labels: {
      "JOB_ID": "2015-04-22",   "WORKER_ID": "wordcount-vm-2015..."
      "CONTAINER_TYPE": "worker",   "CONTAINER_ID": "ac1234def"} Label tags
      typically correspond to Label enum values. However, for ease of
      development other strings can be used as tags. LABEL_UNSPECIFIED should
      not be used here.
    time: The timestamp of the worker_message.
    workerHealthReport: The health of a worker.
    workerLifecycleEvent: Record of worker lifecycle events.
    workerMessageCode: A worker message code.
    workerMetrics: Resource metrics reported by workers.
    workerShutdownNotice: Shutdown notice by workers.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class LabelsValue(_messages.Message):
    r"""Labels are used to group WorkerMessages. For example, a worker_message
    about a particular container might have the labels: { "JOB_ID":
    "2015-04-22",   "WORKER_ID": "wordcount-vm-2015..."   "CONTAINER_TYPE":
    "worker",   "CONTAINER_ID": "ac1234def"} Label tags typically correspond
    to Label enum values. However, for ease of development other strings can
    be used as tags. LABEL_UNSPECIFIED should not be used here.

    Messages:
      AdditionalProperty: An additional property for a LabelsValue object.

    Fields:
      additionalProperties: Additional properties of type LabelsValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a LabelsValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  labels = _messages.MessageField('LabelsValue', 1)
  time = _messages.StringField(2)
  workerHealthReport = _messages.MessageField('WorkerHealthReport', 3)
  workerLifecycleEvent = _messages.MessageField('WorkerLifecycleEvent', 4)
  workerMessageCode = _messages.MessageField('WorkerMessageCode', 5)
  workerMetrics = _messages.MessageField('ResourceUtilizationReport', 6)
  workerShutdownNotice = _messages.MessageField('WorkerShutdownNotice', 7)


class WorkerMessageCode(_messages.Message):
  r"""A message code is used to report status and error messages to the
  service. The message codes are intended to be machine readable. The service
  will take care of translating these into user understandable messages if
  necessary.  Example use cases:   1. Worker processes reporting successful
  startup.   2. Worker processes reporting specific errors (e.g. package
  staging      failure).

  Messages:
    ParametersValue: Parameters contains specific information about the code.
      This is a struct to allow parameters of different types.  Examples:  1.
      For a "HARNESS_STARTED" message parameters might provide the name     of
      the worker and additional data like timing information.  2. For a
      "GCS_DOWNLOAD_ERROR" parameters might contain fields listing     the GCS
      objects being downloaded and fields containing errors.  In general
      complex data structures should be avoided. If a worker needs to send a
      specific and complicated data structure then please consider defining a
      new proto and adding it to the data oneof in WorkerMessageResponse.
      Conventions:  Parameters should only be used for information that isn't
      typically passed  as a label.  hostname and other worker identifiers
      should almost always be passed  as labels since they will be included on
      most messages.

  Fields:
    code: The code is a string intended for consumption by a machine that
      identifies the type of message being sent. Examples:  1.
      "HARNESS_STARTED" might be used to indicate the worker harness has
      started.  2. "GCS_DOWNLOAD_ERROR" might be used to indicate an error
      downloading     a GCS file as part of the boot process of one of the
      worker containers.  This is a string and not an enum to make it easy to
      add new codes without waiting for an API change.
    parameters: Parameters contains specific information about the code.  This
      is a struct to allow parameters of different types.  Examples:  1. For a
      "HARNESS_STARTED" message parameters might provide the name     of the
      worker and additional data like timing information.  2. For a
      "GCS_DOWNLOAD_ERROR" parameters might contain fields listing     the GCS
      objects being downloaded and fields containing errors.  In general
      complex data structures should be avoided. If a worker needs to send a
      specific and complicated data structure then please consider defining a
      new proto and adding it to the data oneof in WorkerMessageResponse.
      Conventions:  Parameters should only be used for information that isn't
      typically passed  as a label.  hostname and other worker identifiers
      should almost always be passed  as labels since they will be included on
      most messages.
  """

  @encoding.MapUnrecognizedFields('additionalProperties')
  class ParametersValue(_messages.Message):
    r"""Parameters contains specific information about the code.  This is a
    struct to allow parameters of different types.  Examples:  1. For a
    "HARNESS_STARTED" message parameters might provide the name     of the
    worker and additional data like timing information.  2. For a
    "GCS_DOWNLOAD_ERROR" parameters might contain fields listing     the GCS
    objects being downloaded and fields containing errors.  In general complex
    data structures should be avoided. If a worker needs to send a specific
    and complicated data structure then please consider defining a new proto
    and adding it to the data oneof in WorkerMessageResponse.  Conventions:
    Parameters should only be used for information that isn't typically passed
    as a label.  hostname and other worker identifiers should almost always be
    passed  as labels since they will be included on most messages.

    Messages:
      AdditionalProperty: An additional property for a ParametersValue object.

    Fields:
      additionalProperties: Properties of the object.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a ParametersValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  code = _messages.StringField(1)
  parameters = _messages.MessageField('ParametersValue', 2)


class WorkerMessageResponse(_messages.Message):
  r"""A worker_message response allows the server to pass information to the
  sender.

  Fields:
    workerHealthReportResponse: The service's response to a worker's health
      report.
    workerMetricsResponse: Service's response to reporting worker metrics
      (currently empty).
    workerShutdownNoticeResponse: Service's response to shutdown notice
      (currently empty).
  """

  workerHealthReportResponse = _messages.MessageField('WorkerHealthReportResponse', 1)
  workerMetricsResponse = _messages.MessageField('ResourceUtilizationReportResponse', 2)
  workerShutdownNoticeResponse = _messages.MessageField('WorkerShutdownNoticeResponse', 3)


class WorkerPool(_messages.Message):
  r"""Describes one particular pool of Cloud Dataflow workers to be
  instantiated by the Cloud Dataflow service in order to perform the
  computations required by a job.  Note that a workflow job may use multiple
  pools, in order to match the various computational requirements of the
  various stages of the job.

  Enums:
    DefaultPackageSetValueValuesEnum: The default package set to install.
      This allows the service to select a default set of packages which are
      useful to worker harnesses written in a particular language.
    IpConfigurationValueValuesEnum: Configuration for VM IPs.
    TeardownPolicyValueValuesEnum: Sets the policy for determining when to
      turndown worker pool. Allowed values are: `TEARDOWN_ALWAYS`,
      `TEARDOWN_ON_SUCCESS`, and `TEARDOWN_NEVER`. `TEARDOWN_ALWAYS` means
      workers are always torn down regardless of whether the job succeeds.
      `TEARDOWN_ON_SUCCESS` means workers are torn down if the job succeeds.
      `TEARDOWN_NEVER` means the workers are never torn down.  If the workers
      are not torn down by the service, they will continue to run and use
      Google Compute Engine VM resources in the user's project until they are
      explicitly terminated by the user. Because of this, Google recommends
      using the `TEARDOWN_ALWAYS` policy except for small, manually supervised
      test jobs.  If unknown or unspecified, the service will attempt to
      choose a reasonable default.

  Messages:
    MetadataValue: Metadata to set on the Google Compute Engine VMs.
    PoolArgsValue: Extra arguments for this worker pool.

  Fields:
    autoscalingSettings: Settings for autoscaling of this WorkerPool.
    dataDisks: Data disks that are used by a VM in this workflow.
    defaultPackageSet: The default package set to install.  This allows the
      service to select a default set of packages which are useful to worker
      harnesses written in a particular language.
    diskSizeGb: Size of root disk for VMs, in GB.  If zero or unspecified, the
      service will attempt to choose a reasonable default.
    diskSourceImage: Fully qualified source image for disks.
    diskType: Type of root disk for VMs.  If empty or unspecified, the service
      will attempt to choose a reasonable default.
    ipConfiguration: Configuration for VM IPs.
    kind: The kind of the worker pool; currently only `harness` and `shuffle`
      are supported.
    machineType: Machine type (e.g. "n1-standard-1").  If empty or
      unspecified, the service will attempt to choose a reasonable default.
    metadata: Metadata to set on the Google Compute Engine VMs.
    network: Network to which VMs will be assigned.  If empty or unspecified,
      the service will use the network "default".
    numThreadsPerWorker: The number of threads per worker harness. If empty or
      unspecified, the service will choose a number of threads (according to
      the number of cores on the selected machine type for batch, or 1 by
      convention for streaming).
    numWorkers: Number of Google Compute Engine workers in this pool needed to
      execute the job.  If zero or unspecified, the service will attempt to
      choose a reasonable default.
    onHostMaintenance: The action to take on host maintenance, as defined by
      the Google Compute Engine API.
    packages: Packages to be installed on workers.
    poolArgs: Extra arguments for this worker pool.
    subnetwork: Subnetwork to which VMs will be assigned, if desired.
      Expected to be of the form "regions/REGION/subnetworks/SUBNETWORK".
    taskrunnerSettings: Settings passed through to Google Compute Engine
      workers when using the standard Dataflow task runner.  Users should
      ignore this field.
    teardownPolicy: Sets the policy for determining when to turndown worker
      pool. Allowed values are: `TEARDOWN_ALWAYS`, `TEARDOWN_ON_SUCCESS`, and
      `TEARDOWN_NEVER`. `TEARDOWN_ALWAYS` means workers are always torn down
      regardless of whether the job succeeds. `TEARDOWN_ON_SUCCESS` means
      workers are torn down if the job succeeds. `TEARDOWN_NEVER` means the
      workers are never torn down.  If the workers are not torn down by the
      service, they will continue to run and use Google Compute Engine VM
      resources in the user's project until they are explicitly terminated by
      the user. Because of this, Google recommends using the `TEARDOWN_ALWAYS`
      policy except for small, manually supervised test jobs.  If unknown or
      unspecified, the service will attempt to choose a reasonable default.
    workerHarnessContainerImage: Required. Docker container image that
      executes the Cloud Dataflow worker harness, residing in Google Container
      Registry.
    zone: Zone to run the worker pools in.  If empty or unspecified, the
      service will attempt to choose a reasonable default.
  """

  class DefaultPackageSetValueValuesEnum(_messages.Enum):
    r"""The default package set to install.  This allows the service to select
    a default set of packages which are useful to worker harnesses written in
    a particular language.

    Values:
      DEFAULT_PACKAGE_SET_UNKNOWN: The default set of packages to stage is
        unknown, or unspecified.
      DEFAULT_PACKAGE_SET_NONE: Indicates that no packages should be staged at
        the worker unless explicitly specified by the job.
      DEFAULT_PACKAGE_SET_JAVA: Stage packages typically useful to workers
        written in Java.
      DEFAULT_PACKAGE_SET_PYTHON: Stage pacakges typically useful to workers
        written in Python.
    """
    DEFAULT_PACKAGE_SET_UNKNOWN = 0
    DEFAULT_PACKAGE_SET_NONE = 1
    DEFAULT_PACKAGE_SET_JAVA = 2
    DEFAULT_PACKAGE_SET_PYTHON = 3

  class IpConfigurationValueValuesEnum(_messages.Enum):
    r"""Configuration for VM IPs.

    Values:
      WORKER_IP_UNSPECIFIED: The configuration is unknown, or unspecified.
      WORKER_IP_PUBLIC: Workers should have public IP addresses.
      WORKER_IP_PRIVATE: Workers should have private IP addresses.
    """
    WORKER_IP_UNSPECIFIED = 0
    WORKER_IP_PUBLIC = 1
    WORKER_IP_PRIVATE = 2

  class TeardownPolicyValueValuesEnum(_messages.Enum):
    r"""Sets the policy for determining when to turndown worker pool. Allowed
    values are: `TEARDOWN_ALWAYS`, `TEARDOWN_ON_SUCCESS`, and
    `TEARDOWN_NEVER`. `TEARDOWN_ALWAYS` means workers are always torn down
    regardless of whether the job succeeds. `TEARDOWN_ON_SUCCESS` means
    workers are torn down if the job succeeds. `TEARDOWN_NEVER` means the
    workers are never torn down.  If the workers are not torn down by the
    service, they will continue to run and use Google Compute Engine VM
    resources in the user's project until they are explicitly terminated by
    the user. Because of this, Google recommends using the `TEARDOWN_ALWAYS`
    policy except for small, manually supervised test jobs.  If unknown or
    unspecified, the service will attempt to choose a reasonable default.

    Values:
      TEARDOWN_POLICY_UNKNOWN: The teardown policy isn't specified, or is
        unknown.
      TEARDOWN_ALWAYS: Always teardown the resource.
      TEARDOWN_ON_SUCCESS: Teardown the resource on success. This is useful
        for debugging failures.
      TEARDOWN_NEVER: Never teardown the resource. This is useful for
        debugging and development.
    """
    TEARDOWN_POLICY_UNKNOWN = 0
    TEARDOWN_ALWAYS = 1
    TEARDOWN_ON_SUCCESS = 2
    TEARDOWN_NEVER = 3

  @encoding.MapUnrecognizedFields('additionalProperties')
  class MetadataValue(_messages.Message):
    r"""Metadata to set on the Google Compute Engine VMs.

    Messages:
      AdditionalProperty: An additional property for a MetadataValue object.

    Fields:
      additionalProperties: Additional properties of type MetadataValue
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a MetadataValue object.

      Fields:
        key: Name of the additional property.
        value: A string attribute.
      """

      key = _messages.StringField(1)
      value = _messages.StringField(2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  @encoding.MapUnrecognizedFields('additionalProperties')
  class PoolArgsValue(_messages.Message):
    r"""Extra arguments for this worker pool.

    Messages:
      AdditionalProperty: An additional property for a PoolArgsValue object.

    Fields:
      additionalProperties: Properties of the object. Contains field @type
        with type URL.
    """

    class AdditionalProperty(_messages.Message):
      r"""An additional property for a PoolArgsValue object.

      Fields:
        key: Name of the additional property.
        value: A extra_types.JsonValue attribute.
      """

      key = _messages.StringField(1)
      value = _messages.MessageField('extra_types.JsonValue', 2)

    additionalProperties = _messages.MessageField('AdditionalProperty', 1, repeated=True)

  autoscalingSettings = _messages.MessageField('AutoscalingSettings', 1)
  dataDisks = _messages.MessageField('Disk', 2, repeated=True)
  defaultPackageSet = _messages.EnumField('DefaultPackageSetValueValuesEnum', 3)
  diskSizeGb = _messages.IntegerField(4, variant=_messages.Variant.INT32)
  diskSourceImage = _messages.StringField(5)
  diskType = _messages.StringField(6)
  ipConfiguration = _messages.EnumField('IpConfigurationValueValuesEnum', 7)
  kind = _messages.StringField(8)
  machineType = _messages.StringField(9)
  metadata = _messages.MessageField('MetadataValue', 10)
  network = _messages.StringField(11)
  numThreadsPerWorker = _messages.IntegerField(12, variant=_messages.Variant.INT32)
  numWorkers = _messages.IntegerField(13, variant=_messages.Variant.INT32)
  onHostMaintenance = _messages.StringField(14)
  packages = _messages.MessageField('Package', 15, repeated=True)
  poolArgs = _messages.MessageField('PoolArgsValue', 16)
  subnetwork = _messages.StringField(17)
  taskrunnerSettings = _messages.MessageField('TaskRunnerSettings', 18)
  teardownPolicy = _messages.EnumField('TeardownPolicyValueValuesEnum', 19)
  workerHarnessContainerImage = _messages.StringField(20)
  zone = _messages.StringField(21)


class WorkerSettings(_messages.Message):
  r"""Provides data to pass through to the worker harness.

  Fields:
    baseUrl: The base URL for accessing Google Cloud APIs.  When workers
      access Google Cloud APIs, they logically do so via relative URLs.  If
      this field is specified, it supplies the base URL to use for resolving
      these relative URLs.  The normative algorithm used is defined by RFC
      1808, "Relative Uniform Resource Locators".  If not specified, the
      default value is "http://www.googleapis.com/"
    reportingEnabled: Whether to send work progress updates to the service.
    servicePath: The Cloud Dataflow service path relative to the root URL, for
      example, "dataflow/v1b3/projects".
    shuffleServicePath: The Shuffle service path relative to the root URL, for
      example, "shuffle/v1beta1".
    tempStoragePrefix: The prefix of the resources the system should use for
      temporary storage.  The supported resource type is:  Google Cloud
      Storage:    storage.googleapis.com/{bucket}/{object}
      bucket.storage.googleapis.com/{object}
    workerId: The ID of the worker running this pipeline.
  """

  baseUrl = _messages.StringField(1)
  reportingEnabled = _messages.BooleanField(2)
  servicePath = _messages.StringField(3)
  shuffleServicePath = _messages.StringField(4)
  tempStoragePrefix = _messages.StringField(5)
  workerId = _messages.StringField(6)


class WorkerShutdownNotice(_messages.Message):
  r"""Shutdown notification from workers. This is to be sent by the shutdown
  script of the worker VM so that the backend knows that the VM is being shut
  down.

  Fields:
    reason: The reason for the worker shutdown. Current possible values are:
      "UNKNOWN": shutdown reason is unknown.   "PREEMPTION": shutdown reason
      is preemption. Other possible reasons may be added in the future.
  """

  reason = _messages.StringField(1)


class WorkerShutdownNoticeResponse(_messages.Message):
  r"""Service-side response to WorkerMessage issuing shutdown notice."""


class WriteInstruction(_messages.Message):
  r"""An instruction that writes records. Takes one input, produces no
  outputs.

  Fields:
    input: The input.
    sink: The sink to write to.
  """

  input = _messages.MessageField('InstructionInput', 1)
  sink = _messages.MessageField('Sink', 2)


encoding.AddCustomJsonFieldMapping(
    StandardQueryParameters, 'f__xgafv', '$.xgafv')
encoding.AddCustomJsonEnumMapping(
    StandardQueryParameters.FXgafvValueValuesEnum, '_1', '1')
encoding.AddCustomJsonEnumMapping(
    StandardQueryParameters.FXgafvValueValuesEnum, '_2', '2')
