Class: Bosh::Director::Jobs::ExportRelease

Inherits:
BaseJob show all
Includes:
LockHelper
Defined in:
lib/bosh/director/jobs/export_release.rb

Instance Attribute Summary

Attributes inherited from BaseJob

#task_id

Class Method Summary collapse

Instance Method Summary collapse

Methods included from LockHelper

#with_compile_lock, #with_deployment_lock, #with_release_lock, #with_release_locks, #with_stemcell_lock

Methods inherited from BaseJob

#begin_stage, #dns_manager, #event_log, #logger, perform, #result_file, schedule_message, #single_step_stage, #task_cancelled?, #task_checkpoint, #track_and_log

Constructor Details

#initialize(deployment_name, release_name, release_version, stemcell_os, stemcell_version, options = {}) ⇒ ExportRelease

Returns a new instance of ExportRelease.



18
19
20
21
22
23
24
# File 'lib/bosh/director/jobs/export_release.rb', line 18

def initialize(deployment_name, release_name, release_version, stemcell_os, stemcell_version, options = {})
  @deployment_name = deployment_name
  @release_name = release_name
  @release_version = release_version
  @stemcell_os = stemcell_os
  @stemcell_version = stemcell_version
end

Class Method Details

.job_typeObject



14
15
16
# File 'lib/bosh/director/jobs/export_release.rb', line 14

def self.job_type
  :export_release
end

Instance Method Details

#performvoid

This method returns an undefined value.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/bosh/director/jobs/export_release.rb', line 27

def perform
  logger.info("Exporting release: #{@release_name}/#{@release_version} for #{@stemcell_os}/#{@stemcell_version}")

  deployment_plan_stemcell = Bosh::Director::DeploymentPlan::Stemcell.new({
      "os" => @stemcell_os,
      "version" => @stemcell_version
    })

  deployment_manager = Bosh::Director::Api::DeploymentManager.new
  targeted_deployment = deployment_manager.find_by_name(@deployment_name)

  release_manager = Bosh::Director::Api::ReleaseManager.new
  release = release_manager.find_by_name(@release_name)
  release_version_model = release_manager.find_version(release, @release_version)

  unless deployment_manifest_has_release?(targeted_deployment.manifest)
    raise ReleaseNotMatchingManifest, "Release version `#{@release_name}/#{@release_version}' not found in deployment `#{@deployment_name}' manifest"
  end

  planner_factory = DeploymentPlan::PlannerFactory.create(logger)
  planner = planner_factory.create_from_model(targeted_deployment)
  deployment_plan_stemcell.bind_model(planner)

  stemcell_model = deployment_plan_stemcell.model
  logger.info "Will compile with stemcell: #{stemcell_model.desc}"

  release = planner.release(@release_name)

  export_release_job = create_job_with_all_the_templates_so_everything_compiles(release_version_model, release, planner, deployment_plan_stemcell)
  planner.add_job(export_release_job)
  planner.bind_models

  lock_timeout = 15 * 60 # 15 minutes

  with_deployment_lock(@deployment_name, :timeout => lock_timeout) do
    with_release_lock(@release_name, :timeout => lock_timeout) do
      with_stemcell_lock(stemcell_model.name, stemcell_model.version, :timeout => lock_timeout) do
        planner.compile_packages

        tarball_state = create_tarball(release_version_model, stemcell_model)
        result_file.write(tarball_state.to_json + "\n")
      end
    end
  end
  "Exported release: #{@release_name}/#{@release_version} for #{@stemcell_os}/#{@stemcell_version}"
end