orange-cloudfoundry/cf-ops-automation

View on GitHub
concourse/tasks/generate_single_concourse_pipeline_config/concourse_pipeline_resource_config_generator.rb

Summary

Maintainability
A
45 mins
Test Coverage
require 'yaml'

class ConcoursePipelineResourceConfigGenerator
  def initialize(base_dir = ".", config_dir = '', output_dir = '')
    @pipelines = { 'pipelines' => [] }
    @pipelines_base_dir = base_dir
    @config_dir = config_dir
    @output_dir = output_dir
    @team_name = ENV.fetch('PIPELINE_TEAM', 'main')
    @pipeline_name = ENV.fetch('PIPELINE_NAME', '')
    @pipeline_name_prefix = ENV.fetch('PIPELINE_NAME_PREFIX', '')
    @output_config_path = ENV.fetch('OUTPUT_CONFIG_PATH', '')
    @output_pipeline_path = ENV.fetch('OUTPUT_PIPELINE_PATH', '')
  end

  def execute
    validate_dir
    puts "execute"
    # exit 1
    pipelines = list_pipelines
    puts pipelines
    pipelines.each do |pipeline_config_filename|
      puts "processing #{pipeline_config_filename}"
      vars_files = generate_vars_files(@pipeline_name)
      output_pipeline_config_filename = File.join(@output_pipeline_path, File.basename(pipeline_config_filename))
      add_pipeline("#{@pipeline_name_prefix}#{@pipeline_name}", @team_name, output_pipeline_config_filename, vars_files)
    end
    @pipelines['pipelines'] = @pipelines['pipelines'].sort_by { |pipeline| pipeline['name'] }
    write_yaml
  end

  private

  def write_yaml
    puts "pipelines:"
    puts @pipelines.to_yaml
    pipeline_config_file = File.join(@output_dir, 'pipelines-definitions.yml')
    File.open(pipeline_config_file, 'w') { |file| file.write(@pipelines.to_yaml) }
  end

  def list_pipelines
    Dir[File.join(@pipelines_base_dir, "*#{@pipeline_name}*")].select { |item| File.file?(item) }
  end

  def add_pipeline(name, team, config, vars_files)
    pipeline = {}
    pipeline['name'] = name
    pipeline['team'] = team || 'main'
    pipeline['config_file'] = config
    pipeline['vars_files'] = vars_files || []
    pipeline['unpaused'] = true

    @pipelines['pipelines']. << pipeline
  end

  def generate_vars_files(pipeline_name)
    credential_filenames = Dir[File.join(@config_dir, 'credentials-*.yml')].reject { |file_path| filter_credentials_file(file_path) }
      .map { |file_path| File.basename(file_path) }
    vars_files = credential_filenames.map { |filename| File.join(@output_config_path, filename) }
    config_file_suffix = pipeline_name.gsub('-generated', '')
    config_file_suffix += '-pipeline' unless config_file_suffix.end_with?('-pipeline')
    current_pipeline_config_file = File.join(@config_dir, "credentials-#{config_file_suffix}.yml")
    puts "INFO - checking existence of #{current_pipeline_config_file}"
    vars_files << File.join(@output_config_path, "credentials-#{config_file_suffix}.yml") if File.exist?(current_pipeline_config_file)
    vars_files
  end

  def validate_dir
    error_message = ''
    error_message << "\nPipelines directory does not exist: #{@pipelines_base_dir}" unless File.exist?(@pipelines_base_dir)
    error_message << "\nConfig directory does not exist: #{@config_dir}" unless File.exist?(@config_dir)
    error_message << "\nOutput directory does not exist: #{@output_dir}" unless File.exist?(@output_dir)
    raise error_message unless error_message.empty?
  end

  def filter_credentials_file(file_path)
    File.basename(file_path).include?('pipeline') || File.basename(file_path).include?('generated')
  end
end