Class: Bosh::Director::Jobs::ExportRelease
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(deployment_name, release_name, release_version, stemcell_os, stemcell_version, options = {}) ⇒ ExportRelease
Returns a new instance of ExportRelease.
17
18
19
20
21
22
23
|
# File 'lib/bosh/director/jobs/export_release.rb', line 17
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
13
14
15
|
# File 'lib/bosh/director/jobs/export_release.rb', line 13
def self.job_type
:export_release
end
|
Instance Method Details
#create_fake_job(planner, fake_resource_pool_manifest, network_name) ⇒ Object
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
# File 'lib/bosh/director/jobs/export_release.rb', line 136
def create_fake_job(planner, fake_resource_pool_manifest, network_name)
fake_job_spec_for_compiling = {
"name" => "dummy-job-for-compilation",
"release" => @release_name,
"instances" => 1,
"resource_pool" => fake_resource_pool_manifest['name'],
"templates" => @release_version_model.templates.map do |template|
{ "name" => template.name, "release" => @release_name }
end,
"networks" => [ "name" => network_name ],
}
fake_job = DeploymentPlan::Job.parse(planner, fake_job_spec_for_compiling, Config.event_log, Config.logger)
@release_version_model.packages.each { |package| fake_job.packages[package.name] = package }
fake_job.resource_pool.stemcell.bind_model
fake_job.release.bind_model
fake_job.templates.each { |template| template.bind_models }
fake_job
end
|
#create_planner ⇒ Object
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'lib/bosh/director/jobs/export_release.rb', line 80
def create_planner
cloud_config_model = @targeted_deployment.cloud_config
planner_factory = DeploymentPlan::PlannerFactory.create(Config.event_log, Config.logger)
planner = planner_factory.planner_without_vm_binding(
@deployment_manifest,
cloud_config_model,
{}
)
network_name = planner.networks.first.name
fake_resource_pool_manifest = {
"name" => "just_for_compiling",
"network" => network_name,
"stemcell" => { "name" => @stemcell.name, "version" => @stemcell.version }
}
resource_pool = DeploymentPlan::ResourcePool.new(planner, fake_resource_pool_manifest, Config.logger)
planner.add_resource_pool(resource_pool)
planner.reset_jobs
fake_job = create_fake_job(planner, fake_resource_pool_manifest, network_name)
planner.add_job(fake_job)
planner
end
|
#create_tarball ⇒ Object
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# File 'lib/bosh/director/jobs/export_release.rb', line 107
def create_tarball
blobstore_client = Bosh::Director::App.instance.blobstores.blobstore
compiled_packages_group = CompiledPackageGroup.new(@release_version_model, @stemcell)
templates = @release_version_model.templates.map
compiled_release_downloader = CompiledReleaseDownloader.new(compiled_packages_group, templates, blobstore_client)
download_dir = compiled_release_downloader.download
manifest = CompiledReleaseManifest.new(compiled_packages_group, templates, @stemcell)
manifest.write(File.join(download_dir, 'release.MF'))
output_path = File.join(download_dir, "compiled_release_#{Time.now.to_f}.tar.gz")
archiver = Core::TarGzipper.new
archiver.compress(download_dir, ['compiled_packages', 'jobs', 'release.MF'], output_path)
tarball_file = File.open(output_path, 'r')
oid = blobstore_client.create(tarball_file)
{
:blobstore_id => oid,
:sha1 => Digest::SHA1.file(output_path).hexdigest,
}
ensure
compiled_release_downloader.cleanup unless compiled_release_downloader.nil?
end
|
#deployment_manifest_has_release? ⇒ Boolean
71
72
73
74
75
76
77
78
|
# File 'lib/bosh/director/jobs/export_release.rb', line 71
def deployment_manifest_has_release?
@deployment_manifest["releases"].each do |release|
if (release["name"] == @release_name) && (release["version"] == @release_version)
return true
end
end
false
end
|
This method returns an undefined value.
26
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
|
# File 'lib/bosh/director/jobs/export_release.rb', line 26
def perform
logger.info("Exporting release: #{@release_name}/#{@release_version} for #{@stemcell_os}/#{@stemcell_version}")
stemcell_manager = Bosh::Director::Api::StemcellManager.new
@stemcell = stemcell_manager.find_by_os_and_version(@stemcell_os, @stemcell_version)
logger.info "Will compile with stemcell: #{@stemcell.desc}"
deployment_manager = Bosh::Director::Api::DeploymentManager.new
@targeted_deployment = deployment_manager.find_by_name(@deployment_name)
@deployment_manifest = Psych.load(@targeted_deployment.manifest)
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?
raise ReleaseNotMatchingManifest, "Release #{@release_name}/#{@release_version} not found in deployment #{@deployment_name} manifest"
end
lock_timeout = 15 * 60
with_deployment_lock(@deployment_name, :timeout => lock_timeout) do
with_release_lock(@release_name, :timeout => lock_timeout) do
with_stemcell_lock(@stemcell.name, @stemcell.version, :timeout => lock_timeout) do
planner = create_planner
package_compile_step = DeploymentPlan::Steps::PackageCompileStep.new(
planner,
Config.cloud, Config.logger,
Config.event_log,
self
)
package_compile_step.perform
tarball_state = create_tarball
result_file.write(tarball_state.to_json + "\n")
end
end
end
"Exported release: #{@release_name}/#{@release_version} for #{@stemcell_os}/#{@stemcell_version}"
end
|