Class: Bosh::Director::DeploymentPlan::Planner

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Bosh::Director::DnsHelper, LockHelper, ValidationHelper
Defined in:
lib/bosh/director/deployment_plan/planner.rb

Constant Summary

Constants included from Bosh::Director::DnsHelper

Bosh::Director::DnsHelper::SOA, Bosh::Director::DnsHelper::TTL_4H, Bosh::Director::DnsHelper::TTL_5M

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ValidationHelper

#invalid_type, #safe_property

Methods included from Bosh::Director::DnsHelper

#add_default_dns_server, #canonical, #default_dns_server, #delete_dns_records, #delete_empty_domain, #dns_domain_name, #dns_ns_record, #dns_servers, #flush_dns_cache, #invalid_dns, #reverse_domain, #reverse_host, #update_dns_a_record, #update_dns_ptr_record

Methods included from LockHelper

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

Constructor Details

#initialize(attrs, manifest_text, cloud_config, deployment_model, options = {}) ⇒ Planner

Returns a new instance of Planner.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/bosh/director/deployment_plan/planner.rb', line 52

def initialize(attrs, manifest_text, cloud_config, deployment_model, options = {})
  @name = attrs.fetch(:name)
  @properties = attrs.fetch(:properties)
  @releases = {}

  @manifest_text = Bosh::Common::DeepCopy.copy(manifest_text)
  @cloud_config = cloud_config
  @cloud_planner = CloudPlanner.new(cloud_config)
  @model = deployment_model

  @jobs = []
  @jobs_name_index = {}
  @jobs_canonical_name_index = Set.new

  @unneeded_vms = []
  @unneeded_instances = []
  @dns_domain = nil

  @job_rename = safe_property(options, 'job_rename',
    :class => Hash, :default => {})

  @recreate = !!options['recreate']
  @skip_drain = SkipDrain.new(options['skip_drain'])
end

Instance Attribute Details

#canonical_nameString (readonly)

Returns Deployment canonical name (for DNS).

Returns:

  • (String)

    Deployment canonical name (for DNS)



21
22
23
# File 'lib/bosh/director/deployment_plan/planner.rb', line 21

def canonical_name
  @canonical_name
end

#dns_domainObject

Returns the value of attribute dns_domain.



42
43
44
# File 'lib/bosh/director/deployment_plan/planner.rb', line 42

def dns_domain
  @dns_domain
end

#job_renameObject (readonly)

Returns the value of attribute job_rename.



44
45
46
# File 'lib/bosh/director/deployment_plan/planner.rb', line 44

def job_rename
  @job_rename
end

#jobsArray<Bosh::Director::DeploymentPlan::Job> (readonly)

Returns All jobs in the deployment.

Returns:



34
35
36
# File 'lib/bosh/director/deployment_plan/planner.rb', line 34

def jobs
  @jobs
end

#modelModels::Deployment (readonly)

Returns Deployment DB model.

Returns:



24
25
26
# File 'lib/bosh/director/deployment_plan/planner.rb', line 24

def model
  @model
end

#nameString (readonly)

Returns Deployment name.

Returns:

  • (String)

    Deployment name



18
19
20
# File 'lib/bosh/director/deployment_plan/planner.rb', line 18

def name
  @name
end

#propertiesObject

Returns the value of attribute properties.



26
27
28
# File 'lib/bosh/director/deployment_plan/planner.rb', line 26

def properties
  @properties
end

#recreateBoolean (readonly)

Returns Indicates whether VMs should be recreated.

Returns:

  • (Boolean)

    Indicates whether VMs should be recreated



47
48
49
# File 'lib/bosh/director/deployment_plan/planner.rb', line 47

def recreate
  @recreate
end

#skip_drainBoolean (readonly)

Returns Indicates whether VMs should be drained.

Returns:

  • (Boolean)

    Indicates whether VMs should be drained



50
51
52
# File 'lib/bosh/director/deployment_plan/planner.rb', line 50

def skip_drain
  @skip_drain
end

#unneeded_instancesObject

Job instances from the old manifest that are not in the new manifest



37
38
39
# File 'lib/bosh/director/deployment_plan/planner.rb', line 37

def unneeded_instances
  @unneeded_instances
end

#unneeded_vmsObject

VMs from the old manifest that are not in the new manifest



40
41
42
# File 'lib/bosh/director/deployment_plan/planner.rb', line 40

def unneeded_vms
  @unneeded_vms
end

#updateBosh::Director::DeploymentPlan::UpdateConfig

Returns Default job update configuration.

Returns:



30
31
32
# File 'lib/bosh/director/deployment_plan/planner.rb', line 30

def update
  @update
end

Instance Method Details

#add_job(job) ⇒ Object

Adds a job by name



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/bosh/director/deployment_plan/planner.rb', line 136

def add_job(job)
  if rename_in_progress? && @job_rename['old_name'] == job.name
    raise DeploymentRenamedJobNameStillUsed,
      "Renamed job `#{job.name}' is still referenced in " +
        'deployment manifest'
  end

  if @jobs_canonical_name_index.include?(job.canonical_name)
    raise DeploymentCanonicalJobNameTaken,
      "Invalid job name `#{job.name}', canonical name already taken"
  end

  @jobs << job
  @jobs_name_index[job.name] = job
  @jobs_canonical_name_index << job.canonical_name
end

#add_release(release) ⇒ Object

Adds a release by name



98
99
100
101
102
103
104
# File 'lib/bosh/director/deployment_plan/planner.rb', line 98

def add_release(release)
  if @releases.has_key?(release.name)
    raise DeploymentDuplicateReleaseName,
      "Duplicate release name `#{release.name}'"
  end
  @releases[release.name] = release
end

#delete_instance(instance) ⇒ Object

Adds instance to deletion queue

Parameters:



126
127
128
129
130
131
132
# File 'lib/bosh/director/deployment_plan/planner.rb', line 126

def delete_instance(instance)
  if @jobs_name_index.has_key?(instance.job)
    @jobs_name_index[instance.job].unneeded_instances << instance
  else
    @unneeded_instances << instance
  end
end

#delete_vm(vm) ⇒ Object

Adds a VM to deletion queue

Parameters:



120
121
122
# File 'lib/bosh/director/deployment_plan/planner.rb', line 120

def delete_vm(vm)
  @unneeded_vms << vm
end

#job(name) ⇒ Bosh::Director::DeploymentPlan::Job

Returns a named job

Parameters:

  • name (String)

    Job name

Returns:



156
157
158
# File 'lib/bosh/director/deployment_plan/planner.rb', line 156

def job(name)
  @jobs_name_index[name]
end

#jobs_starting_on_deployObject



164
165
166
# File 'lib/bosh/director/deployment_plan/planner.rb', line 164

def jobs_starting_on_deploy
  @jobs.select(&:starts_on_deploy?)
end

#persist_updates!Object



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/bosh/director/deployment_plan/planner.rb', line 172

def persist_updates!
  #prior updates may have had release versions that we no longer use.
  #remove the references to these stale releases.
  stale_release_versions = (model.release_versions - releases.map(&:model))
  stale_release_names = stale_release_versions.map {|version_model| version_model.release.name}.uniq
  with_release_locks(stale_release_names) do
    stale_release_versions.each do |release_version|
      model.remove_release_version(release_version)
    end
  end

  model.manifest = Psych.dump(@manifest_text)
  model.cloud_config = @cloud_config
  model.save
end

#release(name) ⇒ Bosh::Director::DeploymentPlan::ReleaseVersion

Returns a named release



114
115
116
# File 'lib/bosh/director/deployment_plan/planner.rb', line 114

def release(name)
  @releases[name]
end

#releasesArray<Bosh::Director::DeploymentPlan::ReleaseVersion>

Returns all releases in a deployment plan



108
109
110
# File 'lib/bosh/director/deployment_plan/planner.rb', line 108

def releases
  @releases.values
end

#rename_in_progress?Boolean

Returns:

  • (Boolean)


168
169
170
# File 'lib/bosh/director/deployment_plan/planner.rb', line 168

def rename_in_progress?
  @job_rename['old_name'] && @job_rename['new_name']
end

#reset_jobsObject



160
161
162
# File 'lib/bosh/director/deployment_plan/planner.rb', line 160

def reset_jobs
  @jobs = []
end

#skip_drain_for_job?(name) ⇒ Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/bosh/director/deployment_plan/planner.rb', line 92

def skip_drain_for_job?(name)
  @skip_drain.nil? ? false : @skip_drain.for_job(name)
end

#update_stemcell_references!Object



188
189
190
191
192
193
# File 'lib/bosh/director/deployment_plan/planner.rb', line 188

def update_stemcell_references!
  current_stemcell_models = resource_pools.map { |pool| pool.stemcell.model }
  model.stemcells.each do |deployment_stemcell|
    deployment_stemcell.remove_deployment(model) unless current_stemcell_models.include?(deployment_stemcell)
  end
end

#vmsArray<Models::Vm>

Returns a list of VMs in the deployment (according to DB)

Returns:



88
89
90
# File 'lib/bosh/director/deployment_plan/planner.rb', line 88

def vms
  @model.vms
end