Class: Bosh::Director::Jobs::UpdateDeployment

Inherits:
BaseJob show all
Includes:
LockHelper
Defined in:
lib/bosh/director/jobs/update_deployment.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, #event_log, #logger, perform, #result_file, #single_step_stage, #task_cancelled?, #task_checkpoint, #track_and_log

Constructor Details

#initialize(manifest_file, options = {}) ⇒ UpdateDeployment

Returns a new instance of UpdateDeployment.

Parameters:

  • manifest_file (String)

    Path to deployment manifest

  • options (Hash) (defaults to: {})

    Deployment options



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/bosh/director/jobs/update_deployment.rb', line 14

def initialize(manifest_file, options = {})
  logger.info('Reading deployment manifest')
  @manifest_file = manifest_file
  @manifest = File.read(@manifest_file)
  logger.debug("Manifest:\n#{@manifest}")

  logger.info('Creating deployment plan')
  logger.info("Deployment plan options: #{options.pretty_inspect}")

  plan_options = {
    'recreate' => !!options['recreate'],
    'job_states' => options['job_states'] || {},
    'job_rename' => options['job_rename'] || {}
  }

  manifest_as_hash = Psych.load(@manifest)
  @deployment_plan = DeploymentPlan::Planner.parse(manifest_as_hash, event_log, plan_options)
  logger.info('Created deployment plan')

  resource_pools = @deployment_plan.resource_pools
  @resource_pool_updaters = resource_pools.map do |resource_pool|
    ResourcePoolUpdater.new(resource_pool)
  end
end

Class Method Details

.job_typeObject



8
9
10
# File 'lib/bosh/director/jobs/update_deployment.rb', line 8

def self.job_type
  :update_deployment
end

Instance Method Details

#performObject



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/bosh/director/jobs/update_deployment.rb', line 70

def perform
  with_deployment_lock(@deployment_plan) do
    logger.info('Preparing deployment')
    prepare
    begin
      deployment = @deployment_plan.model
      logger.info('Finished preparing deployment')
      logger.info('Updating deployment')
      update

      with_release_locks(@deployment_plan) do
        deployment.db.transaction do
          deployment.remove_all_release_versions
          # Now we know that deployment has succeeded and can remove
          # previous partial deployments release version references
          # to be able to delete these release versions later.
          @deployment_plan.releases.each do |release|
            deployment.add_release_version(release.model)
          end
        end
      end

      deployment.manifest = @manifest
      deployment.save
      logger.info('Finished updating deployment')
      "/deployments/#{deployment.name}"
    ensure
      update_stemcell_references
    end
  end
ensure
  FileUtils.rm_rf(@manifest_file)
end

#prepareObject



39
40
41
42
43
44
45
46
# File 'lib/bosh/director/jobs/update_deployment.rb', line 39

def prepare
  @assembler = DeploymentPlan::Assembler.new(@deployment_plan)
  preparer = DeploymentPlan::Preparer.new(self, @assembler)
  preparer.prepare

  logger.info('Compiling and binding packages')
  PackageCompiler.new(@deployment_plan).compile
end

#updateObject



48
49
50
51
52
53
# File 'lib/bosh/director/jobs/update_deployment.rb', line 48

def update
  resource_pools = DeploymentPlan::ResourcePools.new(event_log, @resource_pool_updaters)
  multi_job_updater = DeploymentPlan::BatchMultiJobUpdater.new
  updater = DeploymentPlan::Updater.new(self, event_log, resource_pools, @assembler, @deployment_plan, multi_job_updater)
  updater.update
end

#update_stemcell_referencesObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/bosh/director/jobs/update_deployment.rb', line 55

def update_stemcell_references
  current_stemcells = Set.new
  @deployment_plan.resource_pools.each do |resource_pool|
    current_stemcells << resource_pool.stemcell.model
  end

  deployment = @deployment_plan.model
  stemcells = deployment.stemcells
  stemcells.each do |stemcell|
    unless current_stemcells.include?(stemcell)
      stemcell.remove_deployment(deployment)
    end
  end
end