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.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/bosh/director/deployment_plan/planner.rb', line 48

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

  @manifest_text = 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']
end

Instance Attribute Details

#canonical_nameString (readonly)

Returns Deployment canonical name (for DNS).

Returns:

  • (String)

    Deployment canonical name (for DNS)



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

def canonical_name
  @canonical_name
end

#dns_domainObject

Returns the value of attribute dns_domain.



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

def dns_domain
  @dns_domain
end

#job_renameObject (readonly)

Returns the value of attribute job_rename.



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

def job_rename
  @job_rename
end

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

Returns All jobs in the deployment.

Returns:



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

def jobs
  @jobs
end

#modelModels::Deployment (readonly)

Returns Deployment DB model.

Returns:



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

def model
  @model
end

#nameString (readonly)

Returns Deployment name.

Returns:

  • (String)

    Deployment name



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

def name
  @name
end

#propertiesObject

Returns the value of attribute properties.



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

def properties
  @properties
end

#recreateBoolean (readonly)

Returns Indicates whether VMs should be recreated.

Returns:

  • (Boolean)

    Indicates whether VMs should be recreated



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

def recreate
  @recreate
end

#unneeded_instancesObject

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



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

def unneeded_instances
  @unneeded_instances
end

#unneeded_vmsObject

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



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

def unneeded_vms
  @unneeded_vms
end

#updateBosh::Director::DeploymentPlan::UpdateConfig

Returns Default job update configuration.

Returns:



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

def update
  @update
end

Instance Method Details

#add_job(job) ⇒ Object

Adds a job by name



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/bosh/director/deployment_plan/planner.rb', line 127

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



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

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:



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

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:



111
112
113
# File 'lib/bosh/director/deployment_plan/planner.rb', line 111

def delete_vm(vm)
  @unneeded_vms << vm
end

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

Returns a named job

Parameters:

  • name (String)

    Job name

Returns:



147
148
149
# File 'lib/bosh/director/deployment_plan/planner.rb', line 147

def job(name)
  @jobs_name_index[name]
end

#jobs_starting_on_deployObject



151
152
153
# File 'lib/bosh/director/deployment_plan/planner.rb', line 151

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

#persist_updates!Object



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/bosh/director/deployment_plan/planner.rb', line 159

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



105
106
107
# File 'lib/bosh/director/deployment_plan/planner.rb', line 105

def release(name)
  @releases[name]
end

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

Returns all releases in a deployment plan



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

def releases
  @releases.values
end

#rename_in_progress?Boolean

Returns:

  • (Boolean)


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

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

#update_stemcell_references!Object



175
176
177
178
179
180
# File 'lib/bosh/director/deployment_plan/planner.rb', line 175

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:



83
84
85
# File 'lib/bosh/director/deployment_plan/planner.rb', line 83

def vms
  @model.vms
end