class_docstr: Uniquely identifies a pipeline among pipelines being actively orchestrated.
  
  Recommended to use `from_pipeline` or `from_pipeline_id_and_run_id` class
  methods to create `PipelineUid` objects as they correctly account for
  concurrent pipeline runs mode.
  
  Attributes:
    pipeline_id: Id of the pipeline containing the node. Corresponds to
      `Pipeline.pipeline_info.id` in the pipeline IR.
    pipeline_run_id: Run identifier for the pipeline if one is provided.
code: def from_pipeline_id_and_run_id(
      cls: Type["PipelineUid"],
      pipeline_id: str,
      pipeline_run_id: Optional[str],
  ) -> "PipelineUid":
      # If concurrent runs are not enabled, pipeline_run_id is not part of the
      # PipelineUid.
      if env.get_env().concurrent_pipeline_runs_enabled():
          return cls(
              pipeline_id=pipeline_id,
              pipeline_run_id=pipeline_run_id or None,
          )
      return cls(pipeline_id=pipeline_id)
  
imports: import abc
  import enum
  from typing import Dict, Hashable, List, Optional, Sequence, Type, TypeVar
  import attr
  from tfx import types
  from tfx.orchestration import node_proto_view
  from tfx.orchestration.experimental.core import env
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.utils import status
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 2 for calling the PipelineUid obj's underlying member method code with example usage: obj.from_pipeline_id_and_run_id(cls, pipeline_id, pipeline_run_id) and returns: cls, cls