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

Inherits:
Object
  • Object
show all
Includes:
Bosh::Director::DnsHelper, 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

Class Method 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, #invalid_dns, #reverse_domain, #reverse_host, #update_dns_a_record, #update_dns_ptr_record

Constructor Details

#initialize(name, options = {}) ⇒ Planner

Returns a new instance of Planner.

Raises:

  • (ArgumentError)


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/bosh/director/deployment_plan/planner.rb', line 61

def initialize(name, options = {})
  raise ArgumentError, 'name must not be nil' unless name
  @name = name
  @model = nil

  @properties = {}
  @releases = {}
  @networks = {}
  @networks_canonical_name_index = Set.new

  @resource_pools = {}
  @disk_pools = {}

  @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)



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

def canonical_name
  @canonical_name
end

#compilationBosh::Director::DeploymentPlan::CompilationConfig

Returns Resource pool and other configuration for compilation workers.

Returns:



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

def compilation
  @compilation
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:



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

def model
  @model
end

#nameString (readonly)

Returns Deployment name.

Returns:

  • (String)

    Deployment name



13
14
15
# File 'lib/bosh/director/deployment_plan/planner.rb', line 13

def name
  @name
end

#propertiesObject

Returns the value of attribute properties.



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

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

Class Method Details

.parse(manifest, options, event_log, logger) ⇒ Bosh::Director::DeploymentPlan::Planner

Parameters:

  • manifest (Hash)

    Raw deployment manifest

  • options (Hash)

    Additional options for deployment (e.g. job_states, job_rename)

  • event_log (Bosh::Director::EventLog::Log)

    Event log for recording deprecations

  • logger (Logger)

    Log for director logging

Returns:



56
57
58
59
# File 'lib/bosh/director/deployment_plan/planner.rb', line 56

def self.parse(manifest, options, event_log, logger)
  parser = DeploymentSpecParser.new(event_log, logger)
  parser.parse(manifest, options)
end

Instance Method Details

#add_disk_pool(disk_pool) ⇒ Object

Adds a disk pool by name



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

def add_disk_pool(disk_pool)
  if @disk_pools[disk_pool.name]
    raise DeploymentDuplicateDiskPoolName,
      "Duplicate disk pool name `#{disk_pool.name}'"
  end
  @disk_pools[disk_pool.name] = disk_pool
end

#add_job(job) ⇒ Object

Adds a job by name



232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
# File 'lib/bosh/director/deployment_plan/planner.rb', line 232

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_network(network) ⇒ Object

Adds a network by name



127
128
129
130
131
132
133
134
135
136
# File 'lib/bosh/director/deployment_plan/planner.rb', line 127

def add_network(network)
  if @networks_canonical_name_index.include?(network.canonical_name)
    raise DeploymentCanonicalNetworkNameTaken,
      "Invalid network name `#{network.name}', " +
        'canonical name already taken'
  end

  @networks[network.name] = network
  @networks_canonical_name_index << network.canonical_name
end

#add_release(release) ⇒ Object

Adds a release by name



194
195
196
197
198
199
200
# File 'lib/bosh/director/deployment_plan/planner.rb', line 194

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

#add_resource_pool(resource_pool) ⇒ Object

Adds a resource pool by name

Parameters:



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

def add_resource_pool(resource_pool)
  if @resource_pools[resource_pool.name]
    raise DeploymentDuplicateResourcePoolName,
      "Duplicate resource pool name `#{resource_pool.name}'"
  end
  @resource_pools[resource_pool.name] = resource_pool
end

#bind_modelvoid

This method returns an undefined value.

Looks up deployment model in DB or creates one if needed



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/bosh/director/deployment_plan/planner.rb', line 94

def bind_model
  attrs = {:name => @name}

  Models::Deployment.db.transaction do
    deployment = Models::Deployment.find(attrs)

    # Canonical uniqueness is not enforced in the DB
    if deployment.nil?
      Models::Deployment.each do |other|
        if canonical(other.name) == canonical_name
          raise DeploymentCanonicalNameTaken,
                "Invalid deployment name `#{@name}', " +
                  'canonical name already taken'
        end
      end
      deployment = Models::Deployment.create(attrs)
    end

    @model = deployment
  end
end

#delete_instance(instance) ⇒ Object

Adds instance to deletion queue

Parameters:



222
223
224
225
226
227
228
# File 'lib/bosh/director/deployment_plan/planner.rb', line 222

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:



216
217
218
# File 'lib/bosh/director/deployment_plan/planner.rb', line 216

def delete_vm(vm)
  @unneeded_vms << vm
end

#disk_pool(name) ⇒ Object



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

def disk_pool(name)
  @disk_pools[name]
end

#disk_poolsObject



184
185
186
# File 'lib/bosh/director/deployment_plan/planner.rb', line 184

def disk_pools
  @disk_pools.values
end

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

Returns a named job

Parameters:

  • name (String)

    Job name

Returns:



252
253
254
# File 'lib/bosh/director/deployment_plan/planner.rb', line 252

def job(name)
  @jobs_name_index[name]
end

#jobs_starting_on_deployObject



256
257
258
# File 'lib/bosh/director/deployment_plan/planner.rb', line 256

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

#network(name) ⇒ Bosh::Director::DeploymentPlan::Network

Returns a named network

Parameters:

  • name (String)

Returns:



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

def network(name)
  @networks[name]
end

#networksArray<Bosh::Director::DeploymentPlan::Network>

Returns all networks in a deployment plan



140
141
142
# File 'lib/bosh/director/deployment_plan/planner.rb', line 140

def networks
  @networks.values
end

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

Returns a named release



210
211
212
# File 'lib/bosh/director/deployment_plan/planner.rb', line 210

def release(name)
  @releases[name]
end

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

Returns all releases in a deployment plan



204
205
206
# File 'lib/bosh/director/deployment_plan/planner.rb', line 204

def releases
  @releases.values
end

#rename_in_progress?Boolean

Returns:

  • (Boolean)


260
261
262
# File 'lib/bosh/director/deployment_plan/planner.rb', line 260

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

#resource_pool(name) ⇒ Bosh::Director::DeploymentPlan::ResourcePool

Returns a named resource pool spec

Parameters:

  • name (String)

    Resource pool name

Returns:



170
171
172
# File 'lib/bosh/director/deployment_plan/planner.rb', line 170

def resource_pool(name)
  @resource_pools[name]
end

#resource_poolsArray<Bosh::Director::DeploymentPlan::ResourcePool>

Returns all resource pools in a deployment plan



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

def resource_pools
  @resource_pools.values
end

#vmsArray<Models::Vm>

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

Returns:



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

def vms
  if @model.nil?
    raise DirectorError, "Can't get VMs list, deployment model is unbound"
  end
  @model.vms
end