orange-cloudfoundry/cf-ops-automation

View on GitHub
lib/cf_apps.rb

Summary

Maintainability
A
35 mins
Test Coverage
A
100%
require 'yaml'
require_relative 'coa_run_logger'

class CfApps
  attr_reader :base_path, :root_deployment_name

  include CoaRunLogger
  def initialize(path, root_deployment_name)
    @base_path = path
    @root_deployment_name = root_deployment_name
  end

  def overview
    cf_apps = {}
    logger.info "Path CF App: #{base_path}"

    Dir[base_path].select { |file| File.directory? file }.each do |base_subdir|
      collect_cf_apps_details(base_subdir, cf_apps)
    end

    logger.debug "cf_apps: \n#{YAML.dump(cf_apps)}"
    cf_apps
  end

  def self.enable_cf_app_files(dir)
    Dir.glob(dir + '/**/enable-cf-app.yml')
  end

  private

  def collect_cf_apps_details(base_subdir, cf_apps)
    subdir_name = File.basename(base_subdir)
    logger.info "Processing CF App: #{subdir_name}"

    self.class.enable_cf_app_files(base_subdir).each do |enable_cf_app_file|
      load_cf_apps_details_from_file(cf_apps, enable_cf_app_file, base_subdir)
    end

    cf_apps
  end

  def load_cf_apps_details_from_file(cf_apps, file, subdir)
    logger.info "Cf App detected: #{subdir} - #{file}"
    dir = File.dirname(file)
    cf_apps_description = YAML.load_file(file, aliases: true)

    cf_apps_description['cf-app'].each do |cf_app_name, cf_app_details|
      cf_apps[cf_app_name] = load_cf_app_details(cf_app_name, cf_app_details, file, dir, cf_apps)
    end
  end

  def load_cf_app_details(cf_app_name, cf_app_details, file, dir, cf_apps)
    logger.debug "processing cf-app: #{cf_app_name} from #{file}"
    raise "cannot process #{file}, an application named #{cf_app_name} already exists" if cf_apps.key?(cf_app_name)

    #   raise "#{dependency_file} - Invalid deployment: expected <#{dirname}> - Found <#{deployment_name}>" if deployment_name != dirname
    cf_app_details['base-dir'] = dir.sub(/^.*#{Regexp.escape(root_deployment_name)}/, root_deployment_name)
    cf_app_details
  end
end