class Bosh::Director::CompileTaskGenerator

Public Class Methods

new(logger, event_log_stage) click to toggle source
# File lib/bosh/director/compile_task_generator.rb, line 5
def initialize(logger, event_log_stage)
  @logger = logger
  @event_log_stage = event_log_stage
end

Public Instance Methods

generate!(compile_tasks, job, template, package, stemcell) click to toggle source

The compile_tasks hash passed in by the caller will be populated with CompileTasks objects

# File lib/bosh/director/compile_task_generator.rb, line 11
def generate!(compile_tasks, job, template, package, stemcell)
  # Our assumption here is that package dependency graph
  # has no cycles: this is being enforced on release upload.
  # Other than that it's a vanilla Depth-First Search (DFS).

  @logger.info("Checking whether package '#{package.desc}' needs to be compiled for stemcell '#{stemcell.model.desc}'")
  task_key = [package.id, stemcell.id]
  task = compile_tasks[task_key]

  if task # We already visited this task and its dependencies
    task.add_job(job) # But we still need to register this job with task
    return task
  end

  release_version = template.release.model
  package_dependency_manager = PackageDependenciesManager.new(release_version)
  transitive_dependencies = package_dependency_manager.transitive_dependencies(package)
  package_dependency_key = KeyGenerator.new.dependency_key_from_models(package, release_version)
  package_cache_key = Models::CompiledPackage.create_cache_key(package, transitive_dependencies, stemcell.model.sha1)

  task = CompileTask.new(package, stemcell, job, package_dependency_key, package_cache_key)

  compiled_package = task.find_compiled_package(@logger, @event_log_stage)
  if compiled_package
    task.use_compiled_package(compiled_package)
  end

  @logger.info("Processing package '#{package.desc}' dependencies")
  dependencies = package_dependency_manager.dependencies(package)
  dependencies.each do |dependency|
    @logger.info("Package '#{package.desc}' depends on package '#{dependency.desc}'")
    dependency_task = generate!(compile_tasks, job, template, dependency, stemcell)
    task.add_dependency(dependency_task)
  end

  compile_tasks[task_key] = task
  task
end