def _ScrubFanOut(self, input_stage, output_stages, sink_generator):
    logging.info('scrubbing stages Fan Out:\n%s\n->\n%s\n',
                 json.dumps(input_stage, indent=2, separators=(',', ': ')),
                 json.dumps(output_stages, indent=2, separators=(',', ': ')))
    if 'sinks' not in input_stage:
      input_stage['sinks'] = []

    # Write any output stage's source as a sink on the input stage,
    # if none exist, generate a temporary link and bind together.
    for stage in output_stages:
      if 'sources' in stage and stage['sources']:
        for source in stage['sources']:
          if source not in input_stage['sinks']:
            input_stage['sinks'].append(source)
      else:
        link = sink_generator()
        stage['sources'] = [link]
        input_stage['sinks'].append(link)
Detach a disk from an instance and remove it from the config.
dataset/ETHPy150Open GoogleCloudPlatform/Data-Pipeline/app/src/pipelines/runner.py/PipelineRunner._ScrubFanOut--crossover with--dataset/ETHPy150Open ganeti/ganeti/lib/config/__init__.py/ConfigWriter.RemoveInstanceDisk