class Bosh::Cli::Resources::Job

Constants

BUILD_HOOK_FILES

Attributes

job_base[R]
package_dependencies[R]
release_base[R]

Public Class Methods

discover(release_base, packages) click to toggle source

@param [String] directory base Release directory

# File lib/cli/resources/job.rb, line 6
def self.discover(release_base, packages)
  jobs_folder_contents = Dir[File.join(release_base, 'jobs', '*')]
  job_folders = jobs_folder_contents.select { |f| File.directory?(f) }
  job_folders.map { |job_base| new(job_base, release_base, packages) }
end
new(job_base, release_base, packages) click to toggle source
# File lib/cli/resources/job.rb, line 14
def initialize(job_base, release_base, packages)
  @release_base = Pathname.new(release_base)
  @job_base = Pathname.new(job_base)
  @package_dependencies = packages
end

Public Instance Methods

additional_fingerprints() click to toggle source
# File lib/cli/resources/job.rb, line 30
def additional_fingerprints
  []
end
dependencies() click to toggle source
# File lib/cli/resources/job.rb, line 34
def dependencies
  package_dependencies #TODO: should this be packages or package_dependencies?
end
files() click to toggle source
# File lib/cli/resources/job.rb, line 46
def files
  files = (templates_files + monit_files).map { |absolute_path| [absolute_path, relative_path(absolute_path)] }
  files << [File.join(job_base, 'spec'), 'job.MF']
  files
end
format_fingerprint(digest, filename, name, file_mode) click to toggle source
# File lib/cli/resources/job.rb, line 89
def format_fingerprint(digest, filename, name, file_mode)
  "%s%s%s" % [File.basename(filename), digest, file_mode]
end
name() click to toggle source
# File lib/cli/resources/job.rb, line 26
def name
  spec['name']
end
plural_type() click to toggle source
# File lib/cli/resources/job.rb, line 42
def plural_type
  'jobs'
end
properties() click to toggle source
# File lib/cli/resources/job.rb, line 99
def properties
  spec['properties'] || {}
end
run_script(script_name, *args) click to toggle source
# File lib/cli/resources/job.rb, line 93
def run_script(script_name, *args)
  if BUILD_HOOK_FILES.include?(script_name.to_s)
    send(:"run_script_#{script_name}", *args)
  end
end
singular_type() click to toggle source
# File lib/cli/resources/job.rb, line 38
def singular_type
  'job'
end
spec() click to toggle source
# File lib/cli/resources/job.rb, line 20
def spec
  @spec ||= load_yaml_file(job_base.join('spec'))
rescue Exception => e
  raise Bosh::Cli::InvalidJob, "Job spec is missing or invalid: #{e.message}"
end
validate!() click to toggle source

TODO: check dependency packages

# File lib/cli/resources/job.rb, line 53
def validate!
  if name.blank?
    raise Bosh::Cli::InvalidJob, 'Job name is missing'
  end

  unless name.bosh_valid_id?
    raise Bosh::Cli::InvalidJob, "'#{name}' is not a valid BOSH identifier"
  end

  unless  spec['templates'].nil? or spec['templates'].is_a?(Hash)
    raise Bosh::Cli::InvalidJob, "Incorrect templates section in '#{name}' job spec (Hash expected, #{spec['templates'].class} given)"
  end

  if extra_templates.size > 0
    raise Bosh::Cli::InvalidJob, "There are unused template files for job '#{name}': #{extra_templates.join(", ")}"
  end

  if missing_templates.size > 0
    raise Bosh::Cli::InvalidJob, "Some template files required by '#{name}' job are missing: #{missing_templates.join(", ")}"
  end

  if missing_packages.size > 0
    raise Bosh::Cli::InvalidJob, "Some packages required by '#{name}' job are missing: #{missing_packages.join(", ")}"
  end

  if spec.has_key?('properties')
    unless spec['properties'].is_a?(Hash)
      raise Bosh::Cli::InvalidJob, "Incorrect properties section in '#{name}' job spec (Hash expected, #{spec['properties'].class} given)"
    end
  end

  unless monit_files.size > 0
    raise Bosh::Cli::InvalidJob, "Cannot find monit file for '#{name}'"
  end
end

Private Instance Methods

extra_templates() click to toggle source
# File lib/cli/resources/job.rb, line 105
def extra_templates
  return [] if !File.directory?(templates_dir)

  Dir.chdir(templates_dir) do
    Dir["**/*"].reject do |file|
      File.directory?(file) || templates.include?(file)
    end
  end
end
missing_packages() click to toggle source
# File lib/cli/resources/job.rb, line 115
def missing_packages
  @missing_packages ||= (packages - package_dependencies)
end
missing_templates() click to toggle source
# File lib/cli/resources/job.rb, line 119
def missing_templates
  templates.select do |template|
    !File.exists?(File.join(templates_dir, template))
  end
end
monit_files() click to toggle source
# File lib/cli/resources/job.rb, line 125
def monit_files
  monit = File.join(job_base, 'monit')
  files = Dir.glob(File.join(job_base, '*.monit'))
  files << monit if File.exist?(monit)
  files
end
packages() click to toggle source
# File lib/cli/resources/job.rb, line 132
def packages
  spec['packages'] || []
end
relative_path(path) click to toggle source
# File lib/cli/resources/job.rb, line 136
def relative_path(path)
  Pathname.new(path).relative_path_from(job_base).to_s
end
run_script_prepare() click to toggle source
# File lib/cli/resources/job.rb, line 152
def run_script_prepare
  script_path = File.join(job_base, 'prepare')

  return nil unless File.exists?(script_path)

  unless File.executable?(script_path)
    raise Bosh::Cli::InvalidJob, "Prepare script at '#{script_path}' is not executable"
  end

  old_env = ENV
  script_dir = File.dirname(script_path)
  script_name = File.basename(script_path)

  begin
    # We need to temporarily delete some rubygems related artefacts
    # because preparation scripts shouldn't share any assumptions
    # with CLI itself
    %w{ BUNDLE_GEMFILE RUBYOPT }.each { |key| ENV.delete(key) }

    output = nil
    Dir.chdir(script_dir) do
      cmd = "./#{script_name} 2>&1"
      output = `#{cmd}`
    end

    unless $?.exitstatus == 0
      raise Bosh::Cli::InvalidJob, "'#{script_path}' script failed: #{output}"
    end

    output
  ensure
    ENV.each_pair { |k, v| ENV[k] = old_env[k] }
  end
end
templates() click to toggle source
# File lib/cli/resources/job.rb, line 140
def templates
  spec['templates'] ? spec['templates'].keys : []
end
templates_dir() click to toggle source
# File lib/cli/resources/job.rb, line 144
def templates_dir
  @templates_dir ||= job_base.join('templates')
end
templates_files() click to toggle source
# File lib/cli/resources/job.rb, line 148
def templates_files
  templates.map { |file| File.join(templates_dir, file) }
end